林编辑G代码行

2024-09-28 21:27:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我想逐行读取一个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循环来完成,但是我不确定如何建立基于这些关键术语的体系结构。在


Tags: 文件to代码layer示例move顺序next
1条回答
网友
1楼 · 发布于 2024-09-28 21:27:50

我不确定您到底要修改什么,所以我选择在表示收回的注释前面添加单词'(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

文件内容现在将是:

^{pr2}$

如果您想改为修改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

我希望这有帮助!在


编辑

要响应您获取XY和{}值的请求,下面是存储这些值的更新脚本:

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)

相关问题 更多 >