Portál AbcLinuxu, 12. listopadu 2025 20:37
-mill
Ručně jsem vytvořil nějaký příklad jak by měl vypadat výstup z programu. Soubory TAP.
Ve zdrojovém frézovacím excellon souboru *.rou jsou kódy M15, M16 které reprezentují pohyb vřetene v ose Z dolu a nahoru.
M15 pro pohyb dolu, by mohlo by mohlo být analogicky jako -zdrill pro vrtání určováno volbou -zmill. V příkladu je -2. Toto musí být v rámci normálního frézování G01 s určenou pojezdovou rychlostí.
M16 vřeteno nahoru zase nastavitelné nějakou volbou -zup. V příkladu je 5. Toto může být už v rámci rychloposuvu.
Nevím nakolik je to proveditelné v tom programu vzhledem k tomu jak je postavený (já to bohužel neumím ani přečíst, špatně jsem se učil).
Pokud by se tu našel někdo kdo umí a zároveň se aspoň trochu vyzná v G kódech, je to uplně nejlepší možná varianta. Já jsem rád za to, že jsem vůbec sesmolil tenhle dotaz.
Odkaz na zdroják programu https://sourceforge.net/p/ncdr2cnc/code/HEAD/tree/
je tam i zkompilovaný exáč.
Přikládám příklady vstupů a výstupů v zipu.
Řešení dotazu:
with open(args.drlfile[0]) as fp:
line = fp.readline()
while line:
....
Nasypou se nastroje(tnum):
if line.startswith("T") and "C" in line:
....
Vybere se nastroj(tsel):
....
elif line.startswith("T"):
....
Prevod vrtani:
elif line.startswith("X") and tsel != "0":
Zapis:
for t in tools: ....
You can open Gerber, Excellon or G-code, edit it or create from scatch, and output G-Code.Tohle bude pro tebe idealni a bez programovani. Bezi to na Linuxu, ale to asi chapes. Na widlich WSL.
* Routing commands are similar to Gerber polygons
elif line.startswith("X") and tsel != "0":
newl1 = "".join(["G1 F", str(args.z_move_speed), " Z", str(args.safe_height)])
newl2 = "".join(["G1 F", str(args.xy_move_speed), " ", line.split("Y")[0], " Y", line.split("Y")[1].strip("\r\n")])
Jak mám Pythonu říct, aby bral na vstupu i řádky začínající nejen X, ale i G01?
Prostě potřebuji aby je opsal, v tomto stavu jen vypíše chybu
Traceback (most recent call last):
File "C:\Users\cerny\Documents\Elektro Modus\frezovani\CAMOutputs\vylezlo z fabu\drl2gcode.py", line 61, in module
newl2 = "".join(["G1 F", str(args.xy_move_speed), " ", line.split("Y")[0], " Y", line.split("Y")[1].strip("\r\n")])
~~~~~~~~~~~~~~~^^^
IndexError: list index out of range
G00X-1Y11.9007 <- Prepnuti na routing a vychozi pozice. G40 M15 G01Y0 <- linearni pohyb M16 G40 G00X19.3493Y-1 <- Routing koncova pozice.Pseudoodem:
if 'G00' in line:# ROUTING ZACATEK
while line:
line = f.readline()
..... <- zpracovani pohybu
if 'G00' in line: ROUTING KONEC
....
break
Snad jsem to pochopil dobre.
with open("Layer_5.rou") as f:
line = f.readline()
while line:
line = f.readline()
if 'G00' in line:# ROUTING ZACATEK
print(line)
if 'G00' in line: #ROUTING KONEC
break
f.close()
ovšem to vypíše jen první řádku kde se vyskytuje G00 a tam to taky skončí. Potřebuji aby jel do dalšího G00. Může tam být další ROUTING ZACATEK po rychloposuvu a další práce vřetene. Učit se toto v 39 je tedy brutus :D
#!/usr/bin/python3
with open('frezovani.rou') as f:
for line in f:
if 'G00' in line:
print("[*] Routing start")
print(line.strip())
for line in f:
print(line.strip())
if 'G00' in line:
print("[*] Routing end\n")
break
# definice promennych
otacky = 25000
feedrate = "F300"
#milldepth = "Z-2"
safeZ = "40"
moveZ = "Z5"
hlavicka = """; Generovano v routexc2gcode.py
; Absolutni koordinaty
G90
; Metricke
G21
; Spust vreteno
M3 S"""+str(otacky)+"""
"""
paticka = """
; zastav vreteno
M5
; vyjeti vretene a konec frezovani
G00 Z"""+str(safeZ)+"""
; konec programu
M2
"""
# zapis hlavicky
print(hlavicka)
# pohyb vretene
with open('Layer_5.rou') as f:
line = f.readline()
while line:
line = f.readline()
if line.startswith("G00"):
print(line.strip())
if line.startswith("G01"):
print(line.strip(), milldepth, feedrate)
if line.startswith(("X","Y")):
print(line.strip())
if line.startswith("M15"):
#print(milldepth, "; Vreteno dolu")
milldepth = "Z-2"
if line.startswith("M16"):
print(moveZ, "; Vreteno nahoru")
#if line.startswith("G40"):
# print(line.strip())
if line.startswith("M30"):
break
# zapis paticky
print(paticka)
Potřebuji aby řádky začínající G00 vypsal a současně zkopíroval s těmi stejnými souřadnicemi na nový řádek jako G01 následujíc proměnné milldepth a feedrate. Řádky začínající G01 normálně vypsat, ale už bez těch milldepth a feedrate. Vpodstatě na těch kopiích by to G01 už ani nemuselo být, protože už je definovaná.
Příklad vstupu: G00X10Y10 M15 G01X20Y20 Příklad výstupu: G00X10Y10 G01X10Y10 Z-2 F300 X20Y20
with open('frezovani.rou') as f:
line = f.readline()
while line:
line = f.readline().strip()
if line.startswith("G00"):
print(line)
print(line.replace('G00','G01'), milldepth, feedrate)
if line.startswith("G01"): print(line)
if line.startswith(("X","Y")): print(line)
#if line.startswith("M15"): print(milldepth)
if line.startswith("M16"): print(moveZ)
if line.startswith("G40"): print(line)
if line.startswith("M30"):
break
ifů
Co kdybych chtěl místo printování zapisovat do souboru? Zkoušel jsem třeba v tom prvním ifu pro G00 udělat proměnnou
rychloposuvy = line.strip()
...
with open("soubor.nc", "w") as uloz:
uloz.write(rychloposuvy)
ale samozřemně to tu proměnnou mění řádek po řádku a v soubor.nc je pak jenom poslední řádek s G00.
Jdu na to blbě, to je jasný, ale já nevím co mám dělat :D
Jinak vyprintovaný výstup do konsole je teď uplně OK.
out = open('vystup.gcode','w')
v prubehu smycky do nej budes postupne zapisovat:
while
...
if ...
out.write(line)
a nakonec ho korektne uzavres.
out.close()Druha moznost, je vystpu nekam docasne odkladat(treba do slovniku, jako v puvodnim kodu) a pak to slepit a ulozit.
Sám se divím, že ses v tom vyznal.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.