0

例如,我有一个以 Fanuc g 代码格式编写的 g 代码,包括 Macro-B(更多信息在这里

#101 = 2.0 (first variable)
#102 = 0.1 (second variable)
#103 = [#101 + #102 * 3] (third variable using simple arithmetic)
G01 X#101 Y#103 F0.1

应转换为:

G01 X1.0 Y2.3 F0.1

更详细的例子herehere

要改变的事情:

  1. 变量槽的所有实例都应替换为其值:

(#\d+)\s*=\s*(-?\d*\.\d+|\d+\.\d*)

  1. 算术+, -,*里面/需要[...]计算:

(#\d+)\s*=\s*\[(#\d+|(-?\d*\.\d+|\d+\.\d*))(\s*[+\-*/]\s*(#\d+|(-?\d*\.\d+|\d+\.\d*|\d+)))*\]

  1. 评论(...)可以被忽略或删除。

如果您能帮助我了解如何在 Python 中执行此操作以及我上面的正则表达式是否正确,我将不胜感激。提前感谢您的支持。

PS1。不幸的是,我找不到 g 代码的围栏代码块的语法突出显示

PS2。将浮点数更改为字符串时,应考虑 Python 浮点处理的问题。我做了这个功能来解决这个问题:

def f32str(inputFloat):
    """
    This function converts a Python float to a string with 3 decimals
    """
    return str(f"{inputFloat:.3f}")
4

1 回答 1

0

好的,我找到了一段代码可以完成这项工作。假设gcode是从 Fanuc G 代码读取的多行字符串:

import re
import os

def f32str(inputFloat):
    return str(f"{inputFloat:.3f}")

gcode = re.sub(r"\(.*?\)", "", gcode)

flag = len(re.findall(r"#\d+", gcode))

while 0 < flag:
    cases = re.findall(r"((#\d+)\s*=\s*([-+]?\s*(\d*\.\d+|\d+\.?\d*)))", gcode)
    for case in cases:
        gcode = gcode.replace(case[0], "")
        gcode = gcode.replace(case[0], case[1])
    cases = re.findall(r"(\[(\s*[+-]?\s*(\d+(\.\d*)?|\d*\.\d+)(\s*[-+*\/]\s*[+-]?\s*(\d+(\.\d*)?|\d*\.\d+)\s*)*)\])", gcode)
    for case in cases:
        gcode = gcode.replace(case[0], f32str(eval(case[1])))
    flag = len(re.findall(r"#\d+", gcode))

gcode = os.linesep.join([s for s in gcode.splitlines() if s.strip()])

这可能是最糟糕的方法,应该有更有效的实现。我将把剩下的交给 Python 专家。

于 2019-04-08T15:52:24.460 回答