1. 解析单个G代码行

解析单个G代码行 学习卡片

任务目标

实现一个最小可用的G代码行解析器:输入一行形如 G01 X10.5 Y-3.25 F1500 的文本,输出该行包含的命令字(如 G01)以及各坐标/参数键值对(如 X: 10.5)。解析器需正确处理正负小数、整数、大小写字母,并忽略多余空格。

实现方案

采用Python标准库实现,不依赖第三方模块。核心逻辑分为两步:先用正则表达式提取命令字(以 G/M 开头后跟数字的部分),再对剩余部分按字母+数值的模式逐一匹配参数。参数值统一转为浮点数,便于后续数值计算。

完整代码

import re

def parse_gcode_line(line: str) -> dict:
    """
    解析单个G代码行。
    返回格式: {"command": "G01", "params": {"X": 10.5, "Y": -3.25, "F": 1500.0}}
    若行内无命令字,command 置为 None。
    """
    line = line.strip()
    if not line:
        return {"command": None, "params": {}}

    # 提取命令字(G/M + 数字,不区分大小写)
    cmd_match = re.match(r'^([GM]\d+)', line, re.IGNORECASE)
    command = cmd_match.group(1).upper() if cmd_match else None

    # 提取所有参数(字母 + 数值)
    params = {}
    # 先移除已匹配的命令字部分,避免误匹配
    rest = line[cmd_match.end():] if cmd_match else line
    for match in re.finditer(r'([A-Za-z])\s*([-+]?\d*\.?\d+)', rest):
        key = match.group(1).upper()
        value = float(match.group(2))
        params[key] = value

    return {"command": command, "params": params}

# 最小验证入口
if __name__ == "__main__":
    test_line = "G01 X10.5 Y-3.25 F1500"
    result = parse_gcode_line(test_line)
    print(result)
    # 预期输出(由代码逻辑直接推出):
    # {'command': 'G01', 'params': {'X': 10.5, 'Y': -3.25, 'F': 1500.0}}

运行与验证

  1. 将上述代码保存为 gcode_parser.py。
  2. 在终端执行 python gcode_parser.py。
  3. 观察输出是否与注释中的预期输出一致:{'command': 'G01', 'params': {'X': 10.5, 'Y': -3.25, 'F': 1500.0}}。

若输出一致,说明解析器已正确处理命令字提取、大小写归一化、正负小数转换及空格忽略。可自行修改 test_line 中的内容(如改为 g28 x0 y0)验证大小写兼容性,预期得到 {'command': 'G28', 'params': {'X': 0.0, 'Y': 0.0}}。

边界说明

本实现仅覆盖单行G代码的解析,不处理注释(如分号后内容)、多行合并或坐标轴重复出现的情况。对于实际数控加工中常见的注释剥离,可在调用本函数前用 line.split(';')[0] 预处理。