gpt4 book ai didi

python - 逐行编辑G代码

转载 作者:太空宇宙 更新时间:2023-11-04 05:25:53 24 4
gpt4 key购买 nike

我想逐行读取一个 g 代码文件,并根据末尾的注释对其执行操作。 g 代码来自 Slic3r。一些没有特定顺序的示例行如下所示:

G1 Z0.242 F7800.000 ; move to next layer (0)
G1 E-2.00000 F2400.00000 ; retract
G1 X0.000 Y30.140 F7800.000 ; move to first skirt point
G1 E0.00000 F2400.00000 ; unretract
G1 X-53.493 Y30.140 E2.14998 F1800.000 ; skirt
G1 X57.279 Y-37.776 E22.65617 ; perimeter
G1 X-52.771 Y-38.586 E56.83128 ; infill

注释总是以分号开头,并使用一致的术语,例如周长或填充。理想情况下,脚本会读取该行,搜索特定的评论案例,基于此执行操作,然后更新文件,然后转到下一行。我对 python 有点陌生,所以我知道这将通过带有嵌套 if 语句的 for 循环来完成,但是我不确定如何设置基于这些关键术语的体系结构。

最佳答案

我不确定你到底想修改什么,所以我选择在表示撤回的注释前添加单词'(up)',和'(down) ' 在表示未撤回的注释前。

file_name = "file.gcode"  # put your filename here

with open(file_name, 'r+') as f:

new_code = "" # where the new modified code will be put
content = f.readlines() # gcode as a list where each element is a line

for line in content:
gcode, comment = line.strip('\n').split(";") # seperates the gcode from the comments
if 'unretract' in comment:
comment = ' (down) ' + comment
elif 'retract' in comment:
comment = ' (up)' + comment

new_code += gcode + ';' + comment + '\n' # rebuild the code from the modified pieces

f.seek(0) # set the cursor to the beginning of the file
f.write(new_code) # write the new code over the old one

文件内容现在是:

G1 Z0.242 F7800.000 ; move to next layer (0)
G1 E-2.00000 F2400.00000 ; (up) retract
G1 X0.000 Y30.140 F7800.000 ; move to first skirt point
G1 E0.00000 F2400.00000 ; (down) unretract
G1 X-53.493 Y30.140 E2.14998 F1800.000 ; skirt
G1 X57.279 Y-37.776 E22.65617 ; perimeter
G1 X-52.771 Y-38.586 E56.83128 ; infill

如果您想改为修改 gcode,假设注释表示撤回,则用 'U' 替换第一个字母,如果注释表示撤回,则用 'D' 替换表示不撤回,你只需要替换这个:

if 'unretract' in comment:  
comment = ' (down) ' + comment
elif 'retract' in comment:
comment = ' (up)' + comment

由此:

if 'unretract' in comment:  
gcode = 'D' + gcode[1:]
elif 'retract' in comment:
gcode = 'U' + gcode[1:]

新文件内容:

G1 Z0.242 F7800.000 ; move to next layer (0)
U1 E-2.00000 F2400.00000 ; retract
G1 X0.000 Y30.140 F7800.000 ; move to first skirt point
D1 E0.00000 F2400.00000 ; unretract
G1 X-53.493 Y30.140 E2.14998 F1800.000 ; skirt
G1 X57.279 Y-37.776 E22.65617 ; perimeter
G1 X-52.771 Y-38.586 E56.83128 ; infill

希望对您有所帮助!


编辑

为了响应您获取 XYF 值的请求,这里是用于存储这些值的更新脚本:

file_name = "file.gcode"  # put your filename here

with open(file_name, 'r+') as f:

coordinates = []
content = f.readlines() # gcode as a list where each element is a line

for line in content:
gcode, comment = line.strip('\n').split(";")
coordinate_set = {}
if 'retract' not in comment and 'layer' not in comment:
for num in gcode.split()[1:]:
coordinate_set[num[:1]] = float(num[1:])
coordinates.append(coordinate_set)

如果你print(coordinates)你会得到:

[{'X': 0.0, 'F': 7800.0, 'Y': 30.14}, {'E': 2.14998, 'X': -53.493, 'F': 1800.0, 'Y': 30.14}, {'E': 22.65617, 'X': 57.279, 'Y': -37.776}, {'E': 56.83128, 'X': -52.771, 'Y': -38.586}]

编辑 2

脚本 1:

file_name = "file.gcode"

with open(file_name, 'r+') as f:

new_code = ""
content = f.readlines()

for line in content:
if ';' in line:
try:
gcode, comment = line.strip('\n').split(";")
except:
print('ERROR\n', line)
else: # when there are no comments
gcode = line.strip('\n')
comment = ""

if 'unretract' in comment:
comment = ' (down) ' + comment
elif 'retract' in comment:
comment = ' (up)' + comment

if comment != "":
new_code += gcode + ';' + comment + '\n'
else: # when there are no comments
new_code += gcode + '\n'

f.seek(0)
f.write(new_code)

脚本 2:

file_name = "file.gcode" 

with open(file_name, 'r+') as f:

coordinates = []
content = f.readlines()

for line in content:
if ';' in line:
try:
gcode, comment = line.strip('\n').split(";")
except:
print(' ERROR \n', line, '\n')
else:
gcode = line.strip('\n')
comment = ""

coordinate_set = {}
if 'retract' not in comment and 'layer' not in comment and gcode:
for num in gcode.split()[1:]:
coordinate_set[num[:1]] = float(num[1:])
coordinates.append(coordinate_set)

Slic3r 执行一些奇怪文本的某些行不起作用,这就是 ERROR 打印的内容。另外,我建议您不要尝试 print 所有坐标,因为这会使 Python 崩溃。如果您想查看坐标的整体,可以将它们粘贴到单独的 .txt 文件中,如下所示:

with ('coordinates.txt', 'w') as f2:
f2.write(coordinates)

编辑 3

更新脚本以处理括号中的注释。

脚本 1:

file_name = "file.gcode"

with open(file_name, 'r+') as f:

new_code = ""
content = f.readlines()

for line in content:
if ';' in line:
try:
gcode, comment = line.strip('\n').split(";")
except:
print('ERROR\n', line)
else: # when there are no comments
gcode = line.strip('\n')
comment = ""

if 'unretract' in comment:
comment = ' (down) ' + comment
elif 'retract' in comment:
comment = ' (up)' + comment

if comment != "":
new_code += gcode + ';' + comment + '\n'
else: # when there are no comments
new_code += gcode + '\n'

f.seek(0)
f.write(new_code)

脚本 2:

file_name = "3Samples_0skin_3per.gcode"  # put your filename here

with open(file_name, 'r+') as f:

coordinates = []
content = f.readlines()

for line in content:
if ';' in line:
try:
gcode, comment = line.strip('\n').split(";")
except:
print(' ERROR 1: \n', line, '\n')
elif '(' in line:
try:
gcode, comment = line.strip('\n').strip(')').split("(")
except:
print('ERROR 2: \n', line, '\n')
else:
gcode = line.strip('\n')
comment = ""

coordinate_set = {}
if 'retract' not in comment and 'layer' not in comment and gcode:
for num in gcode.split()[1:]:
if len(num) > 1:
try:
coordinate_set[num[:1]] = float(num[1:])
except:
print('ERROR 3: \n', gcode, '\n')
coordinates.append(coordinate_set)

关于python - 逐行编辑G代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38727438/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com