反转 G 代码文件的 X 轴

3D打印 g代码 Python
2021-05-02 04:36:36

我有一些代表机器人右侧手臂和腿的切片模型我对它们的打印方式非常满意,所以现在我想打印左侧的手臂和腿。

我认为使用 Python 解析 G 代码文件并将所有Xn命令的值n更改为2*h - n,其中h位于床的中间,例如 Ender 3 的 110 或 120 毫米,这将是非常简单的

在我启动我最喜欢的 IDE 之前,我是否会遇到任何主要的问题,因为我可能会从这种像这样镜像 G 代码的幼稚方法中遇到什么问题?我最初是在 Cura 4.9.1 中切片的。

2个回答

如果您的切片器没有镜像操作或允许负值的比例,那么在 G 代码中镜像应该很简单。

只要您的打印机没有在 G 代码中完成的某些特定的工具更换或归位或清除位置,您就可以对其进行转换,否则您可能想跳过这些部分而只执行模型数据(它应该是明显查看模型数据开始的代码)。

为了镜像它,您只需要换出 G 代码中的 X 坐标,如果 (0,0) 是您的床的中心,就像您通常(但并非总是)想要的 delta 打印机一样否定 X,所以G1 X30 Y-3 Z2变成G1 X-30 Y-3 Z2如果您的坐标在角上有 (0,0)(通常是正交打印机的情况),那么您希望从最大 X 值中减去 X。例如,如果您的床宽 250 毫米,则 inG1 X30 Y10 Z3 X30变为X(250-30)G1 X220 Y10 Z3

只有一个警告,一些切片器会切换到使用G91某些操作的相对移动,然后使用 返回绝对移动G90,因此您需要注意这些。在 aG91和 a之间G90,无论您的打印机的来源在哪里,您都需要否定 X。

在编写脚本时,我会跟踪遇到的最小值和最大值以及新的最小值和最大值,并在最后打印它们作为完整性检查,以便您查看是否有任何问题。

根据@John Mecham 的综合回答,我快速提出了一个概念证明。在下图中,向左箭头(顶部)是原始的,向右箭头(底部)是反向克隆。Cura 确实在最后生成了一些相对偏移代码,我想我处理得正确。

左右箭头

import re

data_start = re.compile('^;LAYER_COUNT:[0-9]+')

ifilename = 'c:/Users/jentron128/Downloads/ThingVerse/Tools/arrow.gcode'
ofilename = 'c:/Users/jentron128/Downloads/ThingVerse/Tools/rev_arrow.gcode'

new_data =[]
BEDX = float(235)
h = BEDX # Absolute Positioning is default

mode='Skip'

with open(ifilename, 'r') as ifp:
    for d in ifp:
        new_d = ''
        tokens = d.split()
        if len(tokens) == 0:
            pass
        elif mode == 'Skip':
            new_d = d[0:-1]
            if data_start .match(d):
                mode = 'Go'
        else:
            if tokens[0] == 'G91': # Relative Positioning
                h = 0 
            elif tokens[0] == 'G90':# Absolute Positioning
                h = BEDX
                
            for t in tokens:
                if t.startswith('X'):
                    if len(t) > 1:
                        x = h - float(t[1:])
                        t = 'X'+f'{x:.3f}'
                new_d += t+' '
        
        new_data.append(new_d)

with open(ofilename, 'w') as ofp:
    for d in new_data:
        ofp.write(d+'\n') # how does writelines not support a line separator?