LinuxCNC Features Draw subroutine
Обработка Draw позволит нам сделать обработку "контуров" из дуг и прямых в LinuxCNC Features с применением заглубления по спирали. Скорее всего в будущем будем использовать созданные шаблоны Draw для организации простых Features - например прямоугольная выборка или круг.
Примитивы
- Line relative
- Line absolute
- Close drawing - замыкает drawing
- Arc - дуги надо еще доделать
Описание общего принципа работы
В Draw используется inline python и сторонние скрипты для создания контуров.
Начальные определения
( Draw definitions ) ;py,import os ;py,import sys
Подгружаем доп модуль:
;py,sys.path.append("<eval>os.path.dirname(__file__)</eval>/subroutines/mill/draw/") ;py,from milldraw import * ;py,milldraw = MillDraw() (Parse commands from external python script)
Функция которая будет парсить возвращаемый от внешнего скрипта код:
O<milldraw-exec> SUB
Получаем значения параметров и хитрым способом преобразуем их в Gкод:
- сначала сохраняем в переменные питона:
;py,g,x,y,z,i,j,k = milldraw.get_line()
- потом поочереди переводим их в параметры Gкода
;py,interpreter.this.params['draw_param_g']=g ;py,interpreter.this.params['draw_param_x']=x
- и наконец преобразуем в Gкод через условия
O<milldraw-exec-if> IF [ #<draw_param_g> EQ 1 ] G01 X#<draw_param_x> Y#<draw_param_y> Z#<draw_param_z> O<milldraw-exec-if> ELSEIF [ #<draw_param_g> EQ 0 ]
Описание примитивов Items
Все примитивы просто выдают во внешний скрипт свои параметры. При этом параметры сначала прогоняются через парсер Gкода, это нужно для того, чтобы потом в features можно было пользоваться парамметрами.
Пример обработки из line_to:
#<draw_tmp_x> = [[#param_x]+#<_draw_x>] #<draw_tmp_y> = [[#param_y]+#<_draw_y>] ;py,milldraw.line_to(interpreter.this.params['draw_tmp_x'],interpreter.this.params['draw_tmp_y']) #<_draw_x> = [#<_draw_x>+[#param_x]] #<_draw_y> = [#<_draw_y>+[#param_y]]
Есть и небольшой негативный момент, мы не можем пользоваться встроенными переменными linuxcnc #<_x>, #<_y> и т.д. Т.к. при задании примитива фактического перемещения не происходит, то во внешний скрипт будет отдаваться #<_x> который был на начало Draw. Но надеюсь это не так страшно, для организации относительных перемещений есть спец Примитивы. Ну и собственно говоря постоянно храним и меняем текущие координаты #<_draw_x>, #<_draw_y>.