如何按最高Z值对C=1分隔的G-code程序段排序?
G-code程序段按最高Z值排序问题
我需要将两个C=1指令之间的G-code程序段,按照各程序段的最高Z值从小到大排序,但当前的Python实现仅能识别单独的Z值行,无法正确处理目标场景。比如在以下待处理的G-code示例中,需要把包含G1 Y=412.50 Z=17.1的程序段移至所有Z=18.10的程序段上方。
待处理G-code示例
H DX=2440.00 DY=1225.00 DZ=18.00 *MM / "def" -DA T=0 R=1 V=0 C=1 BZ=19.000 XBLOWER E=1# ; *** [This file has been Post-Processed for Stop Number 10 but contains NO changes.|2023-11-10 Fri 02:17:58.30 PM|(CNC_GCode_PostProc v1.8.745.0);(CNC_GCode_Lib v1.0.389.0);(Common_Lib v1.0.632.0)] *** F=1 C=1 G0 X=2291.33 Y=1144.00 Z=-1 E=1 T=105 G1 X=2302.50 Z=17.1 G1 X=2435.00 G1 Y=884.00 G1 X=2170.00 G1 Y=1144.00 G1 X=2302.50 G1 X=2313.67 Z=-1 C=1 G0 X=1625.00 Y=126.33 Z=-1 E=1 T=105 G1 Y=137.50 Z=17.1 G1 Y=270.00 G1 X=1885.00 G1 Y=5.00 G1 X=1625.00 G1 Y=137.50 G1 Y=148.67 Z=-1 C=1 G0 X=2016.33 Y=1144.00 Z=-1 E=1 T=105 G1 X=2027.50 Z=17.1 G1 X=2160.00 G1 Y=884.00 G1 X=1895.00 G1 Y=1144.00 G1 X=2027.50 G1 X=2038.67 Z=-1 C=1 G0 X=2017.00 Y=1144.00 Z=-1 E=1 T=105 G1 X=2027.50 Z=18.10 G1 X=2160.00 G1 Y=884.00 G1 X=1895.00 G1 Y=1144.00 G1 X=2027.50 G1 X=2038.00 Z=-1 C=1 G0 X=1625.00 Y=401.33 Z=-1 E=1 T=105 G1 Y=412.50 Z=17.1 G1 Y=545.00 G1 X=1885.00 G1 Y=280.00 G1 X=1625.00 G1 Y=412.50 G1 Y=423.67 Z=-1 C=1 G0 X=2292.00 Y=1144.00 Z=-1 E=1 T=105 G1 X=2302.50 Z=18.10 G1 X=2435.00 G1 Y=884.00 G1 X=2170.00 G1 Y=1144.00 G1 X=2302.50 G1 X=2313.00 Z=-1
当前实现的Python排序函数
def sort_blocks(file_path): possible_encodings = ['utf-8', 'latin-1'] for encoding in possible_encodings: try: with open(file_path, 'r', encoding=encoding) as f: lines = f.readlines() break except UnicodeDecodeError: continue else: print(f"Unable to decode file {file_path} with any of the specified encodings.") return first_line = lines[0].strip() dz_match = re.search(r'Z=(\d+\.?\d*)', first_line) dz_value = float(dz_match.group(1)) if dz_match else None if dz_value not in {12, 18, 12.00, 18.00}: print("Invalid DZ value. It should be either 12 or 18.") return data = [] in_block = False block_data = [] max_z_value = float('-inf') for line in lines[1:]: line = line.strip() if 'C=1' in line: if in_block: data.append((max_z_value, block_data)) in_block = True block_data = [line] max_z_value = float('-inf') continue if in_block: block_data.append(line) z_match = re.search(r'Z=(-?\d+\.?\d*)', line) if z_match: z_value = float(z_match.group(1)) max_z_value = max(max_z_value, z_value) if '.EOF' in line: in_block = False block_data.append(line) data.append((max_z_value, block_data)) block_data = [] max_z_value = float('-inf') if in_block: data.append((max_z_value, block_data)) data.sort(key=lambda x: x[0]) with open(file_path, 'w') as f: f.write(first_line + '\n') for _, block in data: f.write('\n'.join(block) + '\n')
内容的提问来源于stack exchange,提问作者Shade Green
相关产品推荐
相关产品推荐

