Π£Π½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΡΠΉ ΠΏΠΎΡΡΠΏΡΠΎΡΠ΅ΡΡΠΎΡ Π΄Π»Ρ CAM-ΡΠΈΡΡΠ΅ΠΌ Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ Python-ΠΌΠ°ΠΊΡΠΎΡΠΎΠ²
ΠΠ΅Π½Π΅ΡΠΈΡΡΠ΅Ρ G-ΠΊΠΎΠ΄ ΠΈΠ· APT/CL ΡΠ°ΠΉΠ»ΠΎΠ² Π΄Π»Ρ Π»ΡΠ±ΠΎΠ³ΠΎ ΠΎΠ±ΠΎΡΡΠ΄ΠΎΠ²Π°Π½ΠΈΡ: 3-5 ΠΎΡΠ΅Π²ΡΠ΅ ΡΡΠ΅Π·Π΅ΡΠ½ΡΠ΅ ΡΡΠ°Π½ΠΊΠΈ, ΡΠΎΠΊΠ°ΡΠ½ΡΠ΅, ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°ΡΠ½ΡΠ΅ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΠΈΠ΅ ΡΠ΅Π½ΡΡΡ Ρ Π§ΠΠ£ Siemens, Fanuc, Heidenhain, Haas
- Π§ΡΠΎ ΡΡΠΎ?
- ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ
- ΠΡΡΡΡΡΠΉ ΡΡΠ°ΡΡ
- ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΠΎΠ΅ ΠΎΠ±ΠΎΡΡΠ΄ΠΎΠ²Π°Π½ΠΈΠ΅
- ΠΡΠΈΠΌΠ΅ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ
- Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΌΠ°ΠΊΡΠΎΡΠΎΠ²
- ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ
- Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ°
- Π’ΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ
- Π‘ΡΠ°ΡΡΡ ΠΏΡΠΎΠ΅ΠΊΡΠ°
PostProcessor β ΡΡΠΎ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΡΠΉ ΠΏΠΎΡΡΠΏΡΠΎΡΠ΅ΡΡΠΎΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅Ρ ΡΠΏΡΠ°Π²Π»ΡΡΡΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈΠ· ΡΠΎΡΠΌΠ°ΡΠ° APT/CL (ΠΈΠ· CAM-ΡΠΈΡΡΠ΅ΠΌ CATIA, NX, Mastercam, Fusion 360) Π² G-ΠΊΠΎΠ΄ Π΄Π»Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΡ ΡΡΠ°Π½ΠΊΠΎΠ² Ρ Π§ΠΠ£.
βββββββββββββββββββ ββββββββββββββββββββ βββββββββββββββββββ
β CAM-ΡΠΈΡΡΠ΅ΠΌΠ° β β PostProcessor β β Π‘ΡΠ°Π½ΠΎΠΊ Π§ΠΠ£ β
β (CATIA, NX) βββββΆβ + Python ΠΌΠ°ΠΊΡΠΎΡΡ ββββββΆβ (Siemens, β
β APT/CL ΡΠ°ΠΉΠ» β β β β Fanuc...) β
βββββββββββββββββββ ββββββββββββββββββββ βββββββββββββββββββ
ΠΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° Π½Π° Python-ΠΌΠ°ΠΊΡΠΎΡΠ°Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ Π»ΡΠ±ΠΎΠ³ΠΎ ΠΎΠ±ΠΎΡΡΠ΄ΠΎΠ²Π°Π½ΠΈΡ Π±Π΅Π· ΠΏΠ΅ΡΠ΅ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°. ΠΡΠΎΡΡΠΎ ΡΠΎΠ·Π΄Π°ΠΉΡΠ΅ Python-ΡΠ°ΠΉΠ» Ρ Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ Π΄Π»Ρ Π²Π°ΡΠ΅Π³ΠΎ ΡΡΠ°Π½ΠΊΠ°!
| ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ | ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ |
|---|---|
| π Π£Π½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΠΎΡΡΡ | ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° Π»ΡΠ±ΠΎΠ³ΠΎ ΠΎΠ±ΠΎΡΡΠ΄ΠΎΠ²Π°Π½ΠΈΡ ΡΠ΅ΡΠ΅Π· ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΠΈ ΠΌΠ°ΠΊΡΠΎΡΡ |
| π§© ΠΠΎΠ΄ΡΠ»ΡΠ½ΠΎΡΡΡ | Python ΠΌΠ°ΠΊΡΠΎΡΡ Π±Π΅Π· ΠΏΠ΅ΡΠ΅ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° |
| βοΈ 4 ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ° | Siemens, Fanuc, Heidenhain, Haas β Π³ΠΎΡΠΎΠ²ΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ |
| π 8+ ΠΏΡΠΎΡΠΈΠ»Π΅ΠΉ | DMG Mori, Haas, Romi, Mecof β Π³ΠΎΡΠΎΠ²ΡΠ΅ ΠΏΡΠΎΡΠΈΠ»ΠΈ ΡΡΠ°Π½ΠΊΠΎΠ² |
| π Python 3.8-3.12 | ΠΠΎΠ»Π½ΠΎΡΠ΅Π½Π½ΡΠΉ Python Π΄Π»Ρ Π»ΠΎΠ³ΠΈΠΊΠΈ ΠΏΠΎΡΡΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ° |
| π 3-5 ΠΎΡΠ΅ΠΉ | 3-ΠΎΡΠ΅Π²Π°Ρ ΠΈ 5-ΠΎΡΠ΅Π²Π°Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° (RTCP, CYCLE800) |
| π οΈ Π’ΠΎΠΊΠ°ΡΠ½Π°Ρ | TURRET, CHUCK, TAILSTK β ΡΠΎΠΊΠ°ΡΠ½ΡΠ΅ ΠΌΠ°ΠΊΡΠΎΡΡ |
| π‘οΈ ΠΠ΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ | ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ ΡΡΠ°Π½ΠΊΠ° ΠΏΠ΅ΡΠ΅Π΄ Π²ΡΠ²ΠΎΠ΄ΠΎΠΌ |
| π ΠΠΎΠ΄Π°Π»ΡΠ½ΠΎΡΡΡ | ΠΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ Π²ΡΠ²ΠΎΠ΄ G-ΠΊΠΎΠ΄Π° |
| πΎ StateCache | ΠΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΉ LAST_* (IMSPost-style) Π΄Π»Ρ ΠΌΠΎΠ΄Π°Π»ΡΠ½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ |
| π CycleCache | ΠΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΡΠΈΠΊΠ»ΠΎΠ² β Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π²ΡΠ±ΠΎΡ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΈΠ»ΠΈ Π²ΡΠ·ΠΎΠ²Π° |
| π’ NumericNCWord | Π€ΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΈΡΠ»ΠΎΠ²ΡΡ NC-ΡΠ»ΠΎΠ² ΠΈΠ· ΠΊΠΎΠ½ΡΠΈΠ³Π° ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ° |
| π£ SequenceNCWord | ΠΡΠΌΠ΅ΡΠ°ΡΠΈΡ Π±Π»ΠΎΠΊΠΎΠ² (N10, N20...) ΠΈΠ· ΠΊΠΎΠ½ΡΠΈΠ³Π° |
| π TextNCWord | ΠΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΡΠΎ ΡΡΠΈΠ»Π΅ΠΌ ΠΈΠ· ΠΊΠΎΠ½ΡΠΈΠ³Π° (parentheses/semicolon) |
| β 169 ΡΠ΅ΡΡΠΎΠ² | Unit-ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΠ΄ΡΠ°, ΠΌΠ°ΠΊΡΠΎΡΠΎΠ² ΠΈ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΡΠ΅ ΡΠ΅ΡΡΡ |
| π ~16,000 ΡΡΡΠΎΠΊ | ΠΠΎΠ»Π½Π°Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ΠΈ ΠΊΠΎΠ΄ Π½Π° C# |
ΠΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ LAST_* ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π΄Π»Ρ ΠΌΠΎΠ΄Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ²ΠΎΠ΄Π°:
- LAST_FEED, LAST_TOOL, LAST_CS...
- ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ
- ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π²ΡΠ²ΠΎΠ΄Π° G-ΠΊΠΎΠ΄Π°
ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π²ΡΠ±ΠΎΡ: ΠΏΠΎΠ»Π½ΠΎΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ Π²ΡΠ·ΠΎΠ²:
; ΠΠ΅ΡΠ²ΡΠΉ Π²ΡΠ·ΠΎΠ² (ΠΏΠΎΠ»Π½ΠΎΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅)
CYCLE800(MODE=1, TABLE="TABLE1", X=100.000, ...)
; ΠΡΠΎΡΠΎΠΉ Π²ΡΠ·ΠΎΠ² (ΡΠ΅ ΠΆΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ - ΡΠΎΠ»ΡΠΊΠΎ Π²ΡΠ·ΠΎΠ²)
CYCLE800()ΠΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΡΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π² JSON-ΠΊΠΎΠ½ΡΠΈΠ³Π°Ρ :
- ΠΡΠΌΠ΅ΡΠ°ΡΠΈΡ Π±Π»ΠΎΠΊΠΎΠ² (N10, N20...)
- Π‘ΡΠΈΠ»Ρ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠ΅Π² (parentheses/semicolon)
- Π€ΠΎΡΠΌΠ°ΡΡ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°Ρ (decimals, leadingZeros)
- Π€ΠΎΡΠΌΠ°ΡΡ ΠΏΠΎΠ΄Π°ΡΠΈ ΠΈ ΡΠΏΠΈΠ½Π΄Π΅Π»Ρ
Π§ΠΈΡΠ»ΠΎΠ²ΡΠ΅ NC-ΡΠ»ΠΎΠ²Π° Ρ ΠΏΠ°ΡΡΠ΅ΡΠ½Π°ΠΌΠΈ ΡΠΎΡΠΌΠ°ΡΠ°:
- ΠΠ°ΡΡΠ΅ΡΠ½Ρ:
X{-#####!###} - Π€ΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ· ΠΊΠΎΠ½ΡΠΈΠ³Π° ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ°
- ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΌΠΎΠ΄Π°Π»ΡΠ½ΠΎΡΡΡ
Π’Π΅ΠΊΡΡΠΎΠ²ΡΠ΅ NC-ΡΠ»ΠΎΠ²Π° Π΄Π»Ρ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠ΅Π²:
- Π‘ΡΠΈΠ»ΠΈ: parentheses
(Comment), semicolon; Comment, both - Π’ΡΠ°Π½ΡΠ»ΠΈΡΠ΅ΡΠ°ΡΠΈΡ ΠΊΠΈΡΠΈΠ»Π»ΠΈΡΡ
- ΠΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ Π΄Π»ΠΈΠ½Ρ
ΠΠΎΠ²ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ Π² Python-ΠΌΠ°ΠΊΡΠΎΡΠ°Ρ :
context.cacheGet("LAST_FEED", 0.0)
context.cacheSet("LAST_FEED", 500.0)
context.cycleWriteIfDifferent("CYCLE800", params)
context.setNumericValue('X', 100.5)
context.getFormattedValue('F')
context.comment("ΠΡΠΈΠ²Π΅Ρ") # Π‘ΡΠΈΠ»Ρ ΠΈΠ· ΠΊΠΎΠ½ΡΠΈΠ³Π°# ΠΠ»ΠΎΠ½ΠΈΡΡΠΉΡΠ΅ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ
git clone https://github.com/rybakov25/PostProcessor.git
cd PostProcessor
# Π‘Π±ΠΎΡΠΊΠ°
dotnet build# ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° APT ΡΠ°ΠΉΠ»Π°
dotnet run --project src/PostProcessor.CLI/PostProcessor.CLI.csproj \
-- -i input.apt -o output.nc -c siemens -m mmillΠ‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΡΠ°ΠΉΠ» macros/python/user/hello.py:
# -*- coding: ascii -*-
def execute(context, command):
context.comment("=== ΠΡΠΈΠ²Π΅Ρ ΠΎΡ Python! ===")
context.write("G0 X0 Y0 Z50")Π Π΅Π·ΡΠ»ΡΡΠ°Ρ Π² output.nc:
(=== ΠΡΠΈΠ²Π΅Ρ ΠΎΡ Python! ===)
N1 G0 X0. Y0. Z50.π ΠΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅: QUICKSTART.md β ΠΏΠ΅ΡΠ²ΡΠΉ ΠΌΠ°ΠΊΡΠΎΡ Π·Π° 10 ΠΌΠΈΠ½ΡΡ
| ΠΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ | Π‘Π΅ΠΌΠ΅ΠΉΡΡΠ²Π° | ΠΠ°ΠΊΡΠΎΡΡ | Π‘ΡΠ°ΡΡΡ |
|---|---|---|---|
| Siemens | 840D / 840D sl | 9 Π±Π°Π·ΠΎΠ²ΡΡ + mmill | β ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΠΎΠ² |
| Fanuc | 31i / 32i / 35i | 11 (ΡΡΠ΅Π·Π΅ΡΠ½ΡΠ΅ + ΡΠΎΠΊΠ°ΡΠ½ΡΠ΅) | β ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΠΎΠ² |
| Heidenhain | TNC 640 / TNC 620 | 9 (ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΉ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ) | β ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΠΎΠ² |
| Haas | NGC / Next Gen | 9 (Ρ % ΠΌΠ°ΡΠΊΠ΅ΡΠΎΠΌ) | β ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΠΎΠ² |
| Π’ΠΈΠΏ | ΠΡΠΈΠΌΠ΅ΡΡ | ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° |
|---|---|---|
| 3-ΠΎΡΠ΅Π²ΡΠ΅ ΡΡΠ΅Π·Π΅ΡΠ½ΡΠ΅ | DMG Mori DMU50, Haas VF-2 | β |
| 5-ΠΎΡΠ΅Π²ΡΠ΅ | DMG Mori DMU50 5-axis, Haas UMC | β (RTCP, CYCLE800) |
| Π’ΠΎΠΊΠ°ΡΠ½ΡΠ΅ | Mori Seiki NLX2500, Romi GL250 | β (TURRET, CHUCK, TAILSTK) |
| ΠΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°ΡΠ½ΡΠ΅ | Mazak Integrex | π Π ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅ |
π ΠΠΎΠ»Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ: SUPPORTED_EQUIPMENT.md
dotnet run -- -i part.apt -o part.nc \
-c siemens \
--machine-profile mmilldotnet run -- -i impeller.apt -o impeller.nc \
-c fanuc \
--machine-profile dmg_mori_dmu50_5axisdotnet run -- -i shaft.apt -o shaft.nc \
-c haas \
--machine-profile romi_gl250dotnet run -- -i part.apt -o /dev/null \
-c siemens \
--validate-only# -*- coding: ascii -*-
# MACRO_NAME - ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅
def execute(context, command):
"""
ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° APT ΠΊΠΎΠΌΠ°Π½Π΄Ρ
Args:
context: ΠΠ±ΡΠ΅ΠΊΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° ΠΏΠΎΡΡΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ°
command: ΠΠ±ΡΠ΅ΠΊΡ APT ΠΊΠΎΠΌΠ°Π½Π΄Ρ
"""
# ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ²
if not command.numeric:
return
# ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ
x = command.numeric[0]
# ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠ΅Π³ΠΈΡΡΡΠΎΠ²
context.registers.x = x
# ΠΡΠ²ΠΎΠ΄ G-ΠΊΠΎΠ΄Π°
context.write(f"G01 X{x:.3f}")# -*- coding: ascii -*-
def execute(context, command):
if not command.numeric:
return
x = command.numeric[0] if len(command.numeric) > 0 else 0
y = command.numeric[1] if len(command.numeric) > 1 else 0
z = command.numeric[2] if len(command.numeric) > 2 else 0
context.registers.x = x
context.registers.y = y
context.registers.z = z
# ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° Π±ΡΡΡΡΠΎΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅
if context.system.MOTION == 'RAPID':
context.write(f"G0 X{x:.3f} Y{y:.3f} Z{z:.3f}")
else:
context.write(f"G1 X{x:.3f} Y{y:.3f} Z{z:.3f}")
# ΠΠΎΠ΄Π°Π»ΡΠ½Π°Ρ ΠΏΠΎΠ΄Π°ΡΠ° Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ StateCache
if context.registers.f > 0:
last_feed = context.cacheGet("LAST_FEED", 0.0)
if last_feed != context.registers.f:
context.write(f"F{context.registers.f:.1f}")
context.cacheSet("LAST_FEED", context.registers.f)# -*- coding: ascii -*-
def execute(context, command):
# ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ RPM
if command.numeric:
context.registers.spindle_rpm = command.numeric[0]
# ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΊΠ»ΡΡΠ΅Π²ΡΡ
ΡΠ»ΠΎΠ²
spindle_state = 'OFF'
if command.minorWords:
for word in command.minorWords:
if word.upper() in ['ON', 'CLW']:
spindle_state = 'CW'
elif word.upper() in ['CCLW', 'CCW']:
spindle_state = 'CCW'
elif word.upper() == 'OFF':
spindle_state = 'OFF'
# ΠΡΠ²ΠΎΠ΄ M-ΠΊΠΎΠ΄Π°
if spindle_state == 'CW':
context.write("M3")
if context.registers.spindle_rpm > 0:
context.write(f"S{int(context.registers.spindle_rpm)}")
elif spindle_state == 'CCW':
context.write("M4")
if context.registers.spindle_rpm > 0:
context.write(f"S{int(context.registers.spindle_rpm)}")
else:
context.write("M5")# -*- coding: ascii -*-
def execute(context, command):
# Π‘Π±ΠΎΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΡΠΈΠΊΠ»Π°
params = {
"MODE": command.numeric[0] if len(command.numeric) > 0 else 1,
"TABLE": command.string if command.string else "TABLE1",
"X": context.registers.x,
"Y": context.registers.y,
"Z": context.registers.z
}
# ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π²ΡΠ±ΠΎΡ: ΠΏΠΎΠ»Π½ΠΎΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ Π²ΡΠ·ΠΎΠ²
context.cycleWriteIfDifferent("CYCLE800", params)# -*- coding: ascii -*-
def execute(context, command):
# Π‘ΡΠΈΠ»Ρ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡ Π±Π΅ΡΡΡΡΡ ΠΈΠ· ΠΊΠΎΠ½ΡΠΈΠ³Π° ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ°
# Siemens: (Comment), Haas: ; Comment
context.comment("ΠΠ°ΡΠ°Π»ΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ")
context.comment("ΠΡΠΈΠ²Π΅Ρ ΠΌΠΈΡ") # Π’ΡΠ°Π½ΡΠ»ΠΈΡΠ΅ΡΠ°ΡΠΈΡ ΠΊΠΈΡΠΈΠ»Π»ΠΈΡΡπ ΠΠΎΠ»Π½ΠΎΠ΅ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ: PYTHON_MACROS_GUIDE.md
| ΠΠΎΠΊΡΠΌΠ΅Π½Ρ | ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ |
|---|---|
| π QUICKSTART | ΠΠ΅ΡΠ²ΡΠΉ ΠΌΠ°ΠΊΡΠΎΡ Π·Π° 10 ΠΌΠΈΠ½ΡΡ |
| π PYTHON_MACROS_GUIDE | ΠΠΎΠ»Π½ΠΎΠ΅ API ΠΌΠ°ΠΊΡΠΎΡΠΎΠ² (1400+ ΡΡΡΠΎΠΊ) |
| ποΈ ARCHITECTURE | ΠΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° Π΄Π»Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² |
| βοΈ CUSTOMIZATION | ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠΎΠ² ΠΈ ΡΡΠ°Π½ΠΊΠΎΠ² |
| π SUPPORTED_EQUIPMENT | ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΠΎΠ΅ ΠΎΠ±ΠΎΡΡΠ΄ΠΎΠ²Π°Π½ΠΈΠ΅ |
| π IMSPOST_TO_PYTHON | ΠΠΈΠ³ΡΠ°ΡΠΈΡ Ρ IMSpost |
| π COMPLETION_REPORT | Π‘ΡΠ°ΡΡΡ ΠΈ ΠΏΠ»Π°Π½ ΡΠ°Π·Π²ΠΈΡΠΈΡ |
# ΠΠ»ΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
git clone https://github.com/rybakov25/PostProcessor.git
cd PostProcessor
# Π‘Π±ΠΎΡΠΊΠ°
dotnet build
# ΠΠ°ΠΏΡΡΠΊ
dotnet run --project src/PostProcessor.CLI/PostProcessor.CLI.csproj \
-- -i input.apt -o output.nc -c siemensΠ‘ΠΊΠ°ΡΠ°ΠΉΡΠ΅ Ρ ΡΡΡΠ°Π½ΠΈΡΡ ΡΠ΅Π»ΠΈΠ·ΠΎΠ²:
- Windows:
PostProcessor-1.1.0-win-x64.zip - Linux:
PostProcessor-1.1.0-linux-x64.zip
ΠΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠ΅ Π²Π΅ΡΡΠΈΠΈ:
- v1.0.0:
PostProcessor-v1.0.0-win-x64.zip,PostProcessor-v1.0.0-linux-x64.zip
| ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ | ΠΠΎΡΠΎΡΠΊΠΈΠΉ | ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ | Default |
|---|---|---|---|
--input |
-i |
ΠΡ ΠΎΠ΄Π½ΠΎΠΉ APT ΡΠ°ΠΉΠ» | ΠΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ |
--output |
-o |
ΠΡΡ ΠΎΠ΄Π½ΠΎΠΉ NC ΡΠ°ΠΉΠ» | ΠΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ |
--controller |
-c |
Π’ΠΈΠΏ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ° | siemens |
--machine-profile |
-mp |
ΠΡΠΎΡΠΈΠ»Ρ ΡΡΠ°Π½ΠΊΠ° | ΠΠ΅Ρ |
--debug |
-d |
Π Π΅ΠΆΠΈΠΌ ΠΎΡΠ»Π°Π΄ΠΊΠΈ | false |
ΠΡΠΈΠΌΠ΅Ρ configs/controllers/siemens/840d.json:
{
"name": "Siemens Sinumerik 840D sl",
"machineType": "Milling",
"formatting": {
"coordinates": {
"decimals": 3,
"trailingZeros": false
},
"sequenceNumbers": {
"enabled": true,
"prefix": "N",
"increment": 10
},
"comments": {
"style": "parentheses",
"transliterate": true
}
},
"gcode": {
"rapid": "G0",
"linear": "G1"
},
"mcode": {
"spindleCW": "M3",
"coolantOn": "M8"
},
"fiveAxis": {
"tcpOn": "RTCPON",
"tcpOff": "RTCPOF"
}
}| ΠΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ | ΠΠ΅ΡΡΠΈΡ | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅ |
|---|---|---|
| .NET SDK | 8.0+ | ΠΠ»Ρ ΡΠ±ΠΎΡΠΊΠΈ |
| Python | 3.8-3.12 | ΠΠ»Ρ ΠΌΠ°ΠΊΡΠΎΡΠΎΠ² |
| CAM-ΡΠΈΡΡΠ΅ΠΌΠ° | ΠΡΠ±Π°Ρ | ΠΠ΅Π½Π΅ΡΠΈΡΡΡΡΠ°Ρ APT/CL |
- β CATIA
- β Siemens NX
- β Mastercam
- β Fusion 360
- β SolidCAM
- β HyperMill
- β ΠΡΡΠ³ΠΈΠ΅ (Ρ ΡΠΊΡΠΏΠΎΡΡΠΎΠΌ Π² APT/CL)
| ΠΠ΅ΡΡΠΈΠΊΠ° | ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ |
|---|---|
| Π‘ΡΡΠΎΠΊ ΠΊΠΎΠ΄Π° | ~10,000 (C#) |
| C# ΡΠ°ΠΉΠ»Ρ | 50+ |
| Python ΠΌΠ°ΠΊΡΠΎΡΡ | 65 |
| Unit-ΡΠ΅ΡΡΡ | 169 β |
| ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ | ~8,000 ΡΡΡΠΎΠΊ |
| ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ | 4 ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ° + 7 ΠΏΡΠΎΡΠΈΠ»Π΅ΠΉ |
β ΠΠΎΡΠΎΠ² Π΄Π»Ρ:
- 3-5 ΠΎΡΠ΅Π²ΡΡ ΡΡΠ΅Π·Π΅ΡΠ½ΡΡ ΡΡΠ°Π½ΠΊΠΎΠ²
- Π’ΠΎΠΊΠ°ΡΠ½ΡΡ ΡΡΠ°Π½ΠΊΠΎΠ² (Π±Π°Π·ΠΎΠ²Π°Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ°)
- Π‘ΡΠ°Π½ΠΊΠΎΠ² Ρ Siemens, Fanuc, Heidenhain, Haas
- Π€ΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈΠ· JSON-ΠΊΠΎΠ½ΡΠΈΠ³ΠΎΠ²
- ΠΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΉ ΠΈ ΡΠΈΠΊΠ»ΠΎΠ²
- Π’ΠΎΠΊΠ°ΡΠ½ΡΠ΅ ΡΠΈΠΊΠ»Ρ G71-G76
- Mill-Turn ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° (ΠΏΡΠΈΠ²ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ)
- Π Π°ΡΡΠΈΡΠ΅Π½Π½ΡΠ΅ ΠΏΡΠΎΡΠΈΠ»ΠΈ (Mazak, Okuma)
- ΠΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ (GUI)
π ΠΠ»Π°Π½ ΡΠ°Π·Π²ΠΈΡΠΈΡ: COMPLETION_REPORT.md
- Fork ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ
- Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ Π²Π΅ΡΠΊΡ (
git checkout -b feature/amazing-feature) - ΠΠ°ΠΊΠΎΠΌΠΌΠΈΡΡΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ (
git commit -m 'Add amazing feature') - ΠΡΠΏΡΠ°Π²ΡΡΠ΅ Π² Π²Π΅ΡΠΊΡ (
git push origin feature/amazing-feature) - ΠΡΠΊΡΠΎΠΉΡΠ΅ Pull Request
π ΠΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅: CONTRIBUTING.md (Π² ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅)
MIT License β ΡΠΌ. ΡΠ°ΠΉΠ» LICENSE
- Π Π΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ: https://github.com/rybakov25/PostProcessor
- Issues: https://github.com/rybakov25/PostProcessor/issues
- Releases: https://github.com/rybakov25/PostProcessor/releases
- Actions: https://github.com/rybakov25/PostProcessor/actions
- IMSpost β Π·Π° Π²Π΄ΠΎΡ Π½ΠΎΠ²Π΅Π½ΠΈΠ΅ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠΎΠΉ
- pythonnet β Π·Π° Python ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ
- xUnit β Π·Π° ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ
- ΠΠΠ "ΠΠΎΡΠΏΠΎΡΠ°ΡΠΈΡ ΠΠ‘ΠΠΠ-ΠΠΠΠ‘ΠΠ" ΠΈ Π‘ΠΎΠ»Π΄Π°ΡΠΎΠ²Ρ ΠΡΡΠ΅ΡΠ»Π°Π²Ρ, Π²Π΅Π΄ΡΡΠ΅ΠΌΡ ΠΈΠ½ΠΆΠ΅Π½Π΅ΡΡ-ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΡ ΡΡΠ°Π½ΠΊΠΎΠ² Ρ Π§ΠΠ£ β Π·Π° Π²Π΄ΠΎΡ Π½ΠΎΠ²Π΅Π½ΠΈΠ΅ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΡ
- QWEN AI β Π·Π° ΠΏΠΎΠΌΠΎΡΡ Π² ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠ°
PostProcessor β Π£Π½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΡΠΉ ΠΏΠΎΡΡΠΏΡΠΎΡΠ΅ΡΡΠΎΡ Π΄Π»Ρ CNC
ΠΠ°ΡΠ°ΡΡ ΡΠ°Π±ΠΎΡΡ β’ ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ β’ ΠΡΠΈΠΌΠ΅ΡΡ