Преобразование файлов g-кода в легко читаемый файл X,Y,Z для lego mindstorms ev3
Я пытаюсь найти способ конвертировать любой файл g-кода в файл значений только для строки, используя Python!
Я новичок, использующий любой тип языка программирования!
ВВЕДЕНИЕ
Я собрал свой собственный 3d-принтер с набором lego mindstorms ev3, но его язык программирования имеет очень плохие параметры обработки файлов:
- Он читает всю строку целиком, поэтому файл должен иметь только числовое значение за строкой.
- У него нет опций манипулирования файлами, таких как разделение или замена.
- Нет нескольких строк одновременно, только одна строка за раз.
Таким образом, чтобы прочитать его с помощью программного обеспечения ev3, файл должен быть адаптирован к его возможностям.
ФАЙЛ
Как мне нужен новый файл, чтобы выглядеть?
- Он должен иметь только значения X,Y и Z без букв в начале каждого значения. Все остальные цифры, текст и информация должны быть удалены.
- Это должно быть написано в определенном порядке. Как только значение X было красным, оно должно записать его в новый файл в новой строке. Затем перейдите к чтению и записи следующего значения Y в следующей строке, прочитайте следующий Z и запишите его в другой строке, прочитайте следующее значение X... и так далее.
- Если значение не появляется в первый раз, оно должно написать "0".
- Если значение не отображается, следует записать предыдущее значение X,Y или Z, пока не появится новое.
Пример файла g-кода: https://hastebin.com/raw/tocamabevo
КОД
with open('original.gcode', 'r') as original:
with open('ev3.rtf', 'w') as ev3:
for line in original:
if 'X' in line or 'Y' in line or 'Z' in line:
line = line.replace('G1 ', '')
# if ';' in line:
# line = line.replace(';'[0:], '') (Replace from ';' to end of line)
ev3.write(line)
Я уже начал кодировать эту программу, используя Python, и мне удалось открыть файл для чтения построчно, проверяя любые X,Y,Z, а затем заменяя некоторый текст и записывая эти строки некоторым замененным текстом в новом файле.
ДЕЛА, КОТОРЫЕ НЕОБХОДИМО СДЕЛАТЬ
Но есть некоторые комментарии, которые начинаются с ';' и другие значения в той же строке значений X,Y и Z, которые я не знаю, как не скопировать в новый файл.
Приложение для Windows с некоторыми кнопками для импорта исходного g-кода, для указания места сохранения нового файла и кнопкой для запуска преобразования.
Я здесь новенький. Если это не то место, где просить об этом, где мне это делать?
Спасибо! Я надеюсь, что кто-то может мне помочь:)
РЕДАКТИРОВАТЬ
Я немного кодировал, и мне удалось записать в новый файл только значения после символов X,Y или Z, а затем пробел, поэтому новый файл выглядит намного лучше!
Я определяю, стоит ли писать X,Y или Z, и это хорошо работает. Проблема возникает, когда значение не установлено и должно быть установлено на "0". Есть 3 основных условия, чтобы проверить X,Y или Z поворот. Каждый из них имеет еще 2 условия, чтобы проверить, совпадает ли 'match.group(1)', то есть X,Y или Z перед значениями, с 'x_y_z', ходом.
Если это условие выполняется, оно записывает это значение в файл. Если он не выполняется (иначе), он должен записать '0' в X,Y или Z, в зависимости от переменной 'x_y_z', и проблема возникает сейчас:
Мне нужно, чтобы продолжить со следующего if, сделать то же самое, и если он вернется в другой раз, перейти к последнему if.
import re
pattern = re.compile(r'([X])(\d+\.?[\d+]?)')
# I need to display the full decimals after the '.' and it only shows the firs one.
last_x = 0
last_y = 0
last_z = 0
x_y_z = 'X'
with open('original.gcode', 'r') as original:
with open('ev3.rtf', 'w') as ev3:
continguts = original.read()
coincidencies = pattern.finditer(continguts)
for match in coincidencies:
if x_y_z == 'X':
if match.group(1) == x_y_z:
ev3.write(x_y_z + ': ' + match.group(1) + match.group(2) + '\n')
last_x = match.group(2)
else:
ev3.write('Invented value ' + x_y_z + ': ' + match.group(1) + str(last_x) + '\n')
# GO TO NEXT IF to check if 'match.group(1)' equals to 'Y'
x_y_z = 'Y'
if x_y_z == 'Y':
if match.group(1) == x_y_z:
ev3.write(x_y_z + ': ' + match.group(1) + match.group(2) + '\n')
last_y = match.group(2)
else:
ev3.write('Invented value ' + x_y_z + ': ' + match.group(1) + str(last_y) + '\n')
# GO TO NEXT IF to check if 'match.group(1)' equals to 'Z'
x_y_z = 'Z'
if x_y_z == 'Z':
if match.group(1) == x_y_z:
ev3.write(x_y_z + ': ' + match.group(1) + match.group(2) + '\n')
last_z = match.group(2)
else:
ev3.write('Invented value ' + x_y_z + ': ' + match.group(1) + str(last_z) + '\n')
x_y_z = 'X'