преобразование g-кода Fanuc, включая Macro-B, в основной синтаксис - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть g-код, написанный в формате g-кода Fanuc, включая 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

более сложные примеры здесь и здесь .

что нужно изменить:

  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 голосов
/ 08 апреля 2019

ОК. Я удалил кусок кода, который делает эту работу. Предполагая, что gcode является многострочной строкой, считанной из G-кода Fanuc:

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.

...