1. 解析单个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}}
运行与验证
- 将上述代码保存为
gcode_parser.py。 - 在终端执行
python gcode_parser.py。 - 观察输出是否与注释中的预期输出一致:
{'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] 预处理。