我有一些代表机器人右侧手臂和腿的切片模型。我对它们的打印方式非常满意,所以现在我想打印左侧的手臂和腿。
我认为使用 Python 解析 G 代码文件并将所有Xn命令的值从n更改为2*h - n,其中h位于床的中间,例如 Ender 3 的 110 或 120 毫米,这将是非常简单的。
在我启动我最喜欢的 IDE 之前,我是否会遇到任何主要的问题,因为我可能会从这种像这样镜像 G 代码的幼稚方法中遇到什么问题?我最初是在 Cura 4.9.1 中切片的。
我有一些代表机器人右侧手臂和腿的切片模型。我对它们的打印方式非常满意,所以现在我想打印左侧的手臂和腿。
我认为使用 Python 解析 G 代码文件并将所有Xn命令的值从n更改为2*h - n,其中h位于床的中间,例如 Ender 3 的 110 或 120 毫米,这将是非常简单的。
在我启动我最喜欢的 IDE 之前,我是否会遇到任何主要的问题,因为我可能会从这种像这样镜像 G 代码的幼稚方法中遇到什么问题?我最初是在 Cura 4.9.1 中切片的。
如果您的切片器没有镜像操作或允许负值的比例,那么在 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?