【问题标题】:parsing gcode file to extract coordinates解析gcode文件以提取坐标
【发布时间】:2019-11-05 09:40:20
【问题描述】:

我有一个充满文本的 gcode 文件,更具体地为机器协调。我正在尝试读取文件,删除无用的信息,以便在将它们发送到机器之前对协调执行操作。

目前为止:

file = open('TestCube.gcode','r')
lines = file.readlines()
file.close

for line in lines:
    line = line.strip() 

现在我有了文件中所有行的列表,我应该如何继续获取相关的 X 和 Y 坐标?

TestCube.gcode 示例:

;TYPE:SKIN
G1 F1200 X-9.914 Y-9.843 E3.36222
G0 F9000 X-9.843 Y-9.914
G1 F1200 X9.914 Y9.843 E3.65844
G0 F9000 X9.914 Y9.702
G1 F1200 X-9.702 Y-9.914 E3.95254
G0 F9000 X-9.560 Y-9.914
G1 F1200 X9.914 Y9.560 E4.24451
G0 F9000 X9.914 Y9.419
G1 F1200 X-9.419 Y-9.914 E4.53437
G0 F9000 X-9.277 Y-9.914
G1 F1200 X9.914 Y9.277 E4.82211
G0 F9000 X9.914 Y9.136
G1 F1200 X-9.136 Y-9.914 E5.10772
G0 F9000 X-8.995 Y-9.914
G1 F1200 X9.914 Y8.995 E5.39123
G0 F9000 X9.914 Y8.853
G1 F1200 X-8.853 Y-9.914 E5.67260

编辑:

import re

file = open('TestCube.gcode','r')
gcode = file.readlines()

for line in gcode:
    coord = re.findall(r'[XY]-\d.\d\d\d', line)
    if coord:
        print("{} - {}".format(coord[0], coord[1]))

【问题讨论】:

    标签: python python-3.x g-code


    【解决方案1】:

    正则表达式似乎可以解决问题:

    import re
    
    gcode = [
        ';TYPE:SKIN',
        'G1 F1200 X-9.914 Y-9.843 E3.36222',
        'G0 F9000 X-9.843 Y-9.914',
        'G1 F1200 X9.914 Y9.843 E3.65844',
        'G0 F9000 X9.914 Y9.702',
        'G1 F1200 X-9.702 Y-9.914 E3.95254',
        'G0 F9000 X-9.560 Y-9.914',
        'G1 F1200 X9.914 Y9.560 E4.24451',
        'G0 F9000 X9.914 Y9.419',
        'G1 F1200 X-9.419 Y-9.914 E4.53437',
        'G0 F9000 X-9.277 Y-9.914',
        'G1 F1200 X9.914 Y9.277 E4.82211',
        'G0 F9000 X9.914 Y9.136',
        'G1 F1200 X-9.136 Y-9.914 E5.10772',
        'G0 F9000 X-8.995 Y-9.914',
        'G1 F1200 X9.914 Y8.995 E5.39123',
        'G0 F9000 X9.914 Y8.853',
        'G1 F1200 X-8.853 Y-9.914 E5.67260'
        ]
    
    for line in gcode:
        coord = re.findall(r'[XY]-\d.\d\d\d', line)
        if coord:
            print("{} - {}".format(coord[0], coord[1]))
    

    结果:

    X-9.914 - Y-9.843
    X-9.843 - Y-9.914
    X-9.702 - Y-9.914
    X-9.560 - Y-9.914
    X-9.419 - Y-9.914
    X-9.277 - Y-9.914
    X-9.136 - Y-9.914
    X-8.995 - Y-9.914
    X-8.853 - Y-9.914
    

    编辑:

    请尝试以下操作。我已将您的代码与我提供的示例集成并进行了一些调整:

    import re
    
    with open('PI_25mm_cube.gcode') as gcode:
        for line in gcode:
            line = line.strip()
            coord = re.findall(r'[XY].?\d+.\d+', line)
            if coord:
                print("{} - {}".format(coord[0], coord[1]))
    

    据我了解,通过将open 替换为with,它可以防止您忘记close() 文件,并降低导致任何内存问题的风险。

    由于不清楚您的代码是否将用于其他 gcode 文件,因此我最初的正则表达式可能不适合。我使用Cura 创建了一个 gcode 文件并查看了提供的坐标。基于此信息,您可能会发现模式'[XY].?\d+.\d+' 更有用。 Regex101 是测试这些的好网站

    【讨论】:

    • 谢谢。有没有办法将一个 x 和 y 集存储在几个变量中,将它们用于某些功能,然后让它读取下一个 xy 值并覆盖旧值?
    • 当然!将 coord[0] 和 coord[1] 分配给变量。例如 x_coord = coord[0] 然后简单地将它们返回以传递给函数。由于上面的代码逐行迭代,之前的 X 和 y 值将被替换。
    猜你喜欢
    • 2022-01-16
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 2018-03-30
    • 2018-02-17
    相关资源
    最近更新 更多