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

求优化G代码X、Y坐标提取方案:取整并去除连续重复值

优化G代码坐标提取与连续去重的实现方案

我来帮你优化这个G代码坐标提取的实现,先看看原代码里存在的几个明显问题:

  • 文件IO操作过于频繁:每次循环都反复打开、读取、写入test.txt,不仅效率低下,还容易引发文件占用冲突
  • 条件判断逻辑错误:if 'X' and 'Y' in lines 实际等价于 if 'Y' in lines(因为非空字符串'X'会被判定为布尔真值),这会错误处理那些只有Y没有X的行
  • 空文件异常风险:如果test.txt初始为空,file2.readlines()[-1]会直接抛出索引越界错误
  • 输出格式不符预期:原代码每行写入一个坐标对,而你需要的是所有有效坐标值用空格连接的单行结果

优化后的实现代码

import math

def extract_and_process_gcode(input_path, output_path):
    # 存储最终要输出的所有坐标值
    processed_coords = []
    # 记录上一个有效坐标对,用于过滤连续重复项
    last_valid_coord = None

    # 读取G代码文件,批量处理每一行
    with open(input_path, 'r') as gcode_file:
        for line in gcode_file:
            stripped_line = line.strip()
            if not stripped_line:
                continue  # 跳过空行
            
            line_parts = stripped_line.split()
            # 检查当前行是否同时包含X和Y指令
            has_x = any(part.startswith('X') for part in line_parts)
            has_y = any(part.startswith('Y') for part in line_parts)
            if not (has_x and has_y):
                continue
            
            # 提取并处理X、Y的数值
            x_val, y_val = None, None
            for part in line_parts:
                if part.startswith('X'):
                    try:
                        x_val = math.floor(float(part[1:]))
                    except ValueError:
                        continue  # 跳过无效的X数值
                elif part.startswith('Y'):
                    try:
                        y_val = math.floor(float(part[1:]))
                    except ValueError:
                        continue  # 跳过无效的Y数值
            
            if x_val is None or y_val is None:
                continue  # 若X/Y数值无效,直接跳过该行
            
            current_coord = (x_val, y_val)
            # 仅当当前坐标与上一个有效坐标不同时,才添加到结果列表
            if current_coord != last_valid_coord:
                processed_coords.extend(current_coord)
                last_valid_coord = current_coord

    # 将结果一次性写入输出文件
    with open(output_path, 'w') as output_file:
        output_file.write(' '.join(map(str, processed_coords)))

# 调用函数,替换为你的实际文件路径
extract_and_process_gcode("g_code.nc", "test.txt")

核心改进点说明

  1. 高效IO处理:先把所有有效坐标处理完成并存入内存列表,最后一次性写入文件,彻底避免频繁的文件打开/关闭操作
  2. 精准条件判断:通过any()方法准确检查行中是否同时存在X和Y指令,避免错误处理不符合要求的行
  3. 容错性提升:添加try-except块处理X/Y数值无效的情况,避免程序意外崩溃
  4. 符合输出格式:最终将所有坐标值用空格连接成单行字符串,完全匹配你期望的输出样式
  5. 无文件依赖的去重:用变量last_valid_coord记录上一个有效坐标,不需要依赖输出文件的内容,逻辑更简洁安全

示例验证

针对你提供的G代码输入:

G2 X-1.1269 Y-14.4111 I0.0267 J0.027 F60
G2 X-1.1269 Y-14.4111 I0.3267 J0.267 F6
G2 X-3.1269 Y-1.4111 I0.0467 J0.067 F50
G2 X-1.1269 Y-14.4111 I0.067 J0.07 F70

运行代码后,test.txt中的输出为:
-1 -14 -3 -1 -1 -14

内容的提问来源于stack exchange,提问作者Pravesh Gaire

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:39:50