如何从Slic3r生成的gcode中提取XYZEF坐标并实现各坐标同列对齐输出
解决方法
你当前代码的核心问题是仅按正则匹配到的顺序取值,没有按X/Y/Z/E/F的固定轴类型归类,不同行包含的轴种类不同自然无法按固定列对齐,按如下方式修改代码即可:
import re # 预定义需要输出的轴顺序,固定列顺序 AXIS_ORDER = ['X', 'Y', 'Z', 'E', 'F'] # 每列固定输出宽度,可根据实际值长度调整 COL_WIDTH = 12 with open('novoteste.gcode') as gcode: # 先打印表头(可选) header = ''.join([axis.ljust(COL_WIDTH) for axis in AXIS_ORDER]) print(header) print('-' * len(header)) for line in gcode: line = line.strip() # 初始化当前行各轴值为空 axis_val = {axis: '' for axis in AXIS_ORDER} # 正则匹配轴标签和对应数值,兼容负号、整数/小数格式 matches = re.findall(r'([XYZEF])(-?\d+\.?\d*)', line) for axis, val in matches: axis_val[axis] = val # 按固定顺序、固定宽度输出 output_line = ''.join([axis_val[axis].ljust(COL_WIDTH) for axis in AXIS_ORDER]) if any(axis_val.values()): # 跳过没有坐标的空行 print(output_line)
输出效果示例
X Y Z E F ---------------------------------------------------------------- 0.400 7800.000 0 89.202 89.018 7800.000 2.00000 2400.000 90.699 87.561 2.24810 1800.000 92.235 86.138 2.49678 93.757 84.793 2.73796 95.322 83.475 2.98105 96.931 82.184 3.22599 98.583 80.924 3.47273
如果需要保留你原来的分隔符样式,只需要把输出部分的拼接逻辑替换为带分隔符的固定宽度格式即可:
# 带分隔符的输出写法 output_line = ' - '.join([axis_val[axis].ljust(10) for axis in AXIS_ORDER])
内容的提问来源于stack exchange,提问作者Antonio
相关产品推荐
相关产品推荐

