LinuxCNC Features Draw subroutine

Материал из cnc-club
Перейти к навигации Перейти к поиску

Обработка 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>.