You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按最高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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 13:38:15