将包括宏B的Fanuc g代码转换为基本语法

时间:2019-04-08 09:37:25

标签: python regex string g-code

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

#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中执行此操作以及上面的正则表达式正确,我将不胜感激。感谢您的提前支持。

P.S.1。不幸的是,我找不到g代码的受防护代码块的语法突出显示

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

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

1 个答案:

答案 0 :(得分: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专家。