将包含宏B的Fanuc gcode转换为基本语法

2024-09-27 21:25:55 发布

您现在位置:Python中文网/ 问答频道 /正文

例如,我有一个用Fanuc g-code格式编写的g代码,包括Macro-B(more infohere

#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

应转换为:

^{pr2}$

更详细的例子here和{a3}。在

需要改变的事情:

  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中实现这一点,以及上面的regex是否正确,我将不胜感激。提前感谢您的支持。在

p.S.1.很遗憾,我找不到g代码的fenced代码块的语法高亮显示

p.S.2.将浮点改为字符串时,应考虑Python浮点处理的问题。我用这个函数来解决这个问题:

^{3}$

Tags: 代码more格式codearithmeticsimplevariablefirst
1条回答
网友
1楼 · 发布于 2024-09-27 21:25:55

好吧,我废弃了一段代码,它能起作用。假设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专家了。在

相关问题 更多 >

    热门问题