Страница 32 из 39

Разработка Gcodetools - плагин Inkscape для экспорта в Gкод

Добавлено: 07 дек 2009, 11:39
Nick

Разработка Gcodetools

Screenshot-output.ngc - AXIS-4.png (182431 просмотр) <a class='original' href='./download/file.php?id=348&mode=view' target=_blank>Загрузить оригинал (31.64 КБ)</a>
Эта ветка посвящена разработке Gcodetools, плагина для векторного редактора Inkscape, позволяющего конвертировать кривые из Inkscape в Gкод, используя круговую и линейную интерполяцию.

Описание работы, установка, помошь и уроки по плагину можно найти в теме: Gcodetools - plug-in Inkscape для экспорта в Gcode

На данный момент ведется работа над Gcodetools 1.7

Что мы хотим увидеть в новой версии:
  • Улучшение расширения для плазменной резки
  • Добавление дополнительных опций экспорта:
  • Улучшение функции обработки площади
  • Угол заглубления
  • Расширение для сверловки

Требуются

  • Тестеры
  • Разработчики
  • Помощь в технических аспектах по работе станков и обработке материалов
  • Новые идеи

Последняя версия

Исходный код находится на launchpad.net. Получить последнюю версию при помощи bazaar можно так:

Код: Выделить всё

bzr branch lp:gcodetools
Последнюю версию можно загрузить через web-интерфейс: http://bazaar.launchpad.net/~gcodetools ... lope/files

Установка

1. Загрузите последнюю ревизию, из указанных выше мест.
2. Выполните "python create_inx.py" в директории с загруженными файлами.
3. Скопируйте все созданные файлы с расширением *.inx и файл gcodetools-dev.py в каталог:
Linux: /usr/share/inkscape/extensions/ и перезапустите inkscape
Windows: Program Files\Inkscape\share\extensions\
4. Перезапустите Inkscape

Последняя версия может быть не рабочей! Для получения стабильной рабочей версии зайдите сюда Gcodetools - plug-in Inkscape для экспорта в Gcode или загрузите предыдущие ревизии.

Re: Разработка Gcodetools - плагин Inkscape для экспорта в G

Добавлено: 28 янв 2012, 22:29
Nick
0001 - просто номер. Если добавишь второй инструмент выйдет 0002 :).
penetration feed скорость заглубления. Т.е. есть скорость обработки, есть скорость опускания, работает только для заглубдения до уровня реза, для гравировки не учитывается.
depth step для многозаходной обработки шаг по глубине, точнее заглубление на проход.
tool change gcode добавляется в gкод перед использованием инструмента, сюда можно написать T2M6, а можно все, что угодно, все эт овставится перед применением инструмента
scale и offset, это масштаб и отступ. по wrapped rotary, наверное это не совсем правильно для твоего случая... хотя может я и не прав... А как в твоем случае запрограммировать два оборота вправо?

Re: Разработка Gcodetools - плагин Inkscape для экспорта в G

Добавлено: 28 янв 2012, 22:56
NightV
Nick писал(а):А как в твоем случае запрограммировать два оборота вправо?
поэксперементировал с "wrapped_rotary"
при значении 1 дать команду два оборота вправо "G0 A-720" не дает, неверное значение. и даже просто сделать полный оборот 360 (чтоб просто два раза обернуться вокруг себя) не дает, только "G0 A-359.999"
при значении 0 на команду "G0 A-720" ругаться перестал и прокрутил мне 2 оборота вправо При шкале 360, тоесть пришел в ноль, НО если говорю "G0 A0" откручивает эти два оборота назад :D хотя недолжен был сдвинутся с места
вот за такие лишние "отматывания" и отвечает "wrapped_rotary"

Re: Разработка Gcodetools - плагин Inkscape для экспорта в G

Добавлено: 29 янв 2012, 00:02
Nick
да, но после выполнения программы ты всегда можешь сбросить положения оси. G92 A0 и все.

Re: Разработка Gcodetools - плагин Inkscape для экспорта в G

Добавлено: 29 янв 2012, 00:25
NightV
а что с "axis scale"? как шкала высчитывается? я пробовал 360, получил чтото странное :)

Re: Разработка Gcodetools - плагин Inkscape для экспорта в G

Добавлено: 29 янв 2012, 00:58
Nick
там по моему по умолчанию в градусах, так что 1 наверное правильный коэффициент...
т.е. A = scale*x+offset, где х - значение поворота в градусах. Попробуй нарисуй квадрат, сразу станет понятно. будут либо 90 180 270 360 либо пи/2, пи, 3пи/2 и 2пи.

Re: Разработка Gcodetools - плагин Inkscape для экспорта в G

Добавлено: 29 янв 2012, 01:34
NightV
у Вас программеров всегда так? со сложностями? вы по простому не умеете :hehehe:
а насчет GUI.... "хотел бы я мосмотреть в глаза.... этому коструктору.... © " :hehehe: :hehehe: :hehehe:
как пример... попросите какого нибуть программера написать мануал к его программе :hehehe: прочтет разве что другой программер.
а потом удивляются "странно... наша прога круче, а люди на винде и Мач сидят, вроде ничего сложного"

на эту теме был ШЕДЕВР (я аж прослезился, году так в 2001) в фильме кажется "улицы разбитых фонарей", когда два мента чето спросили у программера... тот им ответил, но их не видел, а смотрел в монитор. что-то там про прокси, РОР3 и логи.... а за спиной фраза "мальчик.... ты щас с кем разговаривал..... ? " :mrgreen: :mrgreen: :mrgreen: :mrgreen: а он посмотел на них... "а... ну да...." и ответил "человеческим" языком.... мы с подругой вместе катались по полу :mrgreen: :mrgreen:

Re: Разработка Gcodetools - плагин Inkscape для экспорта в G

Добавлено: 29 янв 2012, 02:10
Nick
Смотрел фильм Хотттабыч?
По гуи - я не виноват, возможности расширений ооочень ограничены.

- Че смотришь, давай перекачивай!
- Чего перекачивать-то?
- Ты че тупой, первый раз за компьютером, давай не придуривайся, деньги из банков качай. Быстро!
- А сколько качать-то?
- Че ты тупые вопросы задаешь? Миллион качай!
- Готово! Деньги отправленны вам по . email-у :).
- Опа, молодец.

Re: Разработка Gcodetools - плагин Inkscape для экспорта в G

Добавлено: 29 янв 2012, 10:33
NightV
точно... PI... а как его перевести в человеческие градусы, сложно у меня с математикой :hehehe:

Код: Выделить всё

G00 X 0.5718 Y 28.1207
G01 A -1.5708
G01 Z -1.0000 F 100.0000(Penetrate)
G01 X 0.5718 Y 0.2890 Z -1.0000 F 400.0000
G01 A 0.0000
G01 X 27.7485 Y 0.2890 Z -1.0000
G01 A 1.5708
G01 X 27.7485 Y 28.1207 Z -1.0000
G01 A 3.1416
G01 X 0.5718 Y 28.1207 Z -1.0000
G01 A 1.5708
G01 X 0.5718 Y 28.1207 Z -1.0000
G00 Z 5.0000

Re: Разработка Gcodetools - плагин Inkscape для экспорта в G

Добавлено: 29 янв 2012, 10:34
DSP1
Nick писал(а):Есть у нас такой инструмент - тангенциальный нож. Вот он очень похоже работает...
А привязку оси вращения он учитывает ? У NightV что-то типа (100,0,0) .

Re: Разработка Gcodetools - плагин Inkscape для экспорта в G

Добавлено: 29 янв 2012, 10:42
dormouse
Правильный loft на мой взгляд это когда профили нарисованы отдельно перпендикулярно, т.е. если inkscape - это "вид сверху вдоль оси Z", то контур режется в плоскости XY на обычном станке.
При этом отдельное окошко с набором кривыч из сечений XZ (или YZ) по номерам и опорная кривая в плоскости XY на обычном чертеже.

Я уже сформулировал более чётко свою стратегию: если в текущем слое есть 1 битмап и заполнены параметры слоя :
"use Z-depth bitmap галочка"
"Z-depth bitmap offset=10mm"
"Z-depth bitmap scale 1px=NNNmm"
то при всех операциях в данном слое при вычислении конечной и начальной точки любой линии в g-code'е делать подстановку:
Zитоговый=min(Zпо текущему алгоритму; Z=координата_цвета_из_текстуры*Z-depth_bitmap_scale+Z-depth_bitmap_offset)

Таким образом словами получится: для любой точки в результирующем g-коде координата Z заменится на координату из текстуры если попытаемся резать глубже.

Поэтому если сделать змейку или offset на глубину более глубины текстуры, то фактически только она и отрисуется в режиме Image-to-gcode.

Re: Разработка Gcodetools - плагин Inkscape для экспорта в G

Добавлено: 29 янв 2012, 13:15
Nick
Grad = Rad/pi*180 (pi = 3.14159265 :) )

Привязки пока нет, тогда такой задачи не стояло... надо сделать

Лофт так и задумывался, он даже таким и был, была опорная кривая и были сечения. Не помню, почему я его не доделал....
По битмапу, для его реализации придется:
1. делать битмап, если он будет просто уже готовым растром, то проще.
2. бежать по всей площади для поиска различных глубин.
3. делать разрывы в контуре на участки меньшей и большей глубиной.

Re: Разработка Gcodetools - плагин Inkscape для экспорта в G

Добавлено: 29 янв 2012, 13:45
Гость
всё проще.
1. bitmap уже готовый (сделан где-то ещё, вставлен на нужный слой и отмасштабирован, т.е. растянут)
2. по всей площади бежать не надо. Только в конце очередного сегмента biarc и в начале взять среднее значение цвета растра на квадрате с ребром n пикселей в качестве глубины Z
3. не понял, но кажется, что это _пока_ неважно - детали уже после отлаживать.

Только нашёл самый удачный как казалось внешний плагин "Raster-Negate", а оказалось, что это не внешний, а http://fossies.org/windows/misc/inkscap ... egate.html
т.е. он не берёт никаких координат привязки к листу, а тупо весь bitmap через фильтр imagemagic прогоняет....

надо найти конкретный плагин на питоне из которого можно извлечь простейшую процедуру: getColor(X,Y), где XY - это координаты _НА_ЛИСТЕ_INKSCAPE_

Re: Разработка Gcodetools - плагин Inkscape для экспорта в G

Добавлено: 29 янв 2012, 13:51
dormouse
Кажется, подходящие вещи есть в pixelsnap.py и render_alphabetsoup.py

Re: Разработка Gcodetools - плагин Inkscape для экспорта в G

Добавлено: 29 янв 2012, 15:19
Nick
Проще всего выдрать из inkscape скомпилированный растр - консольный вариант inkscape.
Но если нам нужно только растр одного определенного битмапа - тогда проще, тогда нужно выдирать пиксели из него.

Re: Разработка Gcodetools - плагин Inkscape для экспорта в G

Добавлено: 29 янв 2012, 18:16
dormouse
Теперь почти на одном языке говорим! Нужна именно единственная точка растра (значение Z-depth map серого цвета) и нужна она только в момент генерации g-кода по уже построенному сегменту biarc. Браться она должна из текущего слоя во время работы gcodetools.py в самом простейшем варианте.

Фактически, надо доработать только строчку вывода в G-code добавив вызов getColor(x,y). Поэтому ни C-код, ни консольный вывод не подойдут. Подойдёт только python-код, который вероятно есть в растровых экстеншнах. Я предположил

Код: Выделить всё

pixelsnap.py
и

Код: Выделить всё

render_alphabetsoup.py
[добалено позже: результат отрицательный. ошибочная идея.]

Завтра раскопаю поглубже и доложусь о результатах.

P.S. Посмотрел уже сегодня - совсем глухо! Совершенно все внешние скрипты похоже векторные. Только в extractimage.py хоть что-то подходящее есть! брр.... всё прочее реализовано в C-коде.

Код: Выделить всё

node in self.selected.iteritems()
Если

Код: Выделить всё

node.tag == inkex.addNS('image','svg')
, то

Код: Выделить всё

xlink = node.get(inkex.addNS('href','xlink'))
и из него брать типа изображения:

Код: Выделить всё

xlink[5:semicolon].lower()
принимает значения "png, bmp, jpeg, jpg, icon, gif"
и далее тупо в файл вываливать содержимое внедрённого изображения

Код: Выделить всё

 data = base64.decodestring(xlink[comma:])
Конкретно: просмотр svg даёт, что атрибуты height, width, x, y неизменны, лишь

Код: Выделить всё

xlink:href="/home/dormouse/filename.jpg"
заменяется на

Код: Выделить всё

xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJ...."
Я рассчитывал на высокоуровневую реализацию getColor(x,y) уже написанную добрыми дяденьками и тётеньками из основной команды Inkscape, а вовсе не на бинарный массив исходного файла. Как-то это очень грустно. При таком подходе надо будет самостоятельно звать imagemagic, делать .bmp восьмибитный, правильно отмасштабированный и уже в нём начинать что-то вытаскивать делая getColor(x,y)=getColor(x+y*width) да ещё и с коэффициентами.... жуть.

Если кто знает такую функцию (значение цвета растрового изображения от координат), ткните, пожалуйста, меня в раздел документации или файл/строчку исходников Inkscape.

Re: Разработка Gcodetools - плагин Inkscape для экспорта в G

Добавлено: 29 янв 2012, 22:23
Nick
Да там просто все. (только в пятницу с этим возился :) )

Берем пакет Image и numpy.

Код: Выделить всё

import Image, numpy
# потом надо две функции: 
#переводим картинку в массив
def image2array(im):
	newArr = numpy.fromstring(im.tostring(),numpy.uint8)
	newArr = numpy.reshape(newArr,im.size)
	return newArr
# и функция getcolor
def getcolor(x,y):
	# в ней делаем билинейную или бикубическую фильтрацию?

Re: Разработка Gcodetools - плагин Inkscape для экспорта в G

Добавлено: 29 янв 2012, 22:49
dormouse
Надо попробовать. Как раз сходу отличная катринка для теста нашлась в яндексе: http://kalyaev.com/2012/20120129/z-depth-01.jpg
Вообщем выражаю итоговую мысль:
на финальном проходе P-t-G прям перед записью g-кода
1. взять из текущего слоя первую картинку, т.е. "svg:image"
2. взять от картинки атрибуты x,y,width,height (их как раз пользователь вручную растягивал мышкой чтобы стало хорошо)
3. смотрим xlink:href и в зависимости от того путь это или base-64 данные делаем массив нужного нам размера
3а. Внедряем если ещё не внедрено или экстрагируем, если не экстрагировано в зависимости от принятого решения - работать во внешних файлах или в памяти Inkscape
3b. Конвертируем картинку в каком-то исходном формате в 8-ми битный серый "выбранный формат" с учётом масштабирования Kx=image.X/width, Ky=imageY/height
3c. Возможно растрируем дополнительно с некоторой абстрактной точностью Px=точность=штукX/mm из свойств слоя?) width[mm]*Px[штукX/mm] * height*Py в обычный массив из восьмибитных байтов=глубине=цвету
4. сравниваем на каждом шаге вывода ptgZ-координату с рассчитанной по формуле imZ=imZscale*imZ8bit+Zimoffset. Если ptgZ предлагает резать глубже чем рассчитанная imZ, то заменить в P-t-G ptgZ=imZ

В принципе такого тупого метода будет вполне достаточно для решения практических задач. и не надо будет пытаться скрещивать ежа с ужиком. все алгоритмы смогут работать автоматически и прозрачно с Z-depth mask наложенной на слой!

Re: Разработка Gcodetools - плагин Inkscape для экспорта в G

Добавлено: 29 янв 2012, 23:20
Nick
А не маловато ли дискретность глубины в 256 цветов?

2. Там не только x,y,w,h, должна быть полноценная матрица трансформации, поворот и искривление.
3. весь третий пункт - это просто взять картинку, зачем ее внедрять?

Re: Разработка Gcodetools - плагин Inkscape для экспорта в G

Добавлено: 29 янв 2012, 23:51
dormouse
8-бит (пока) является стандартом. Разумеется, мало. Тогда лучше сразу заложимся на 16бит. Больше обычный софт в любом случае не делает. Пусть будут двухбайтными, в обычном случае старший нулевой байт не помешает.

В svg при обычном внедрении только xywh. После поворота добавляется transform матрица. Её, конечно, надо учитывать.

Пункт 3 говорит о том, что картинка может быть уже внедрена, тогда надо её извлечь.
Либо если принимаем решение работать внутри inkscape, то наоборот, не внедрённые надо самостоятельно прочитать из файла.

З.Ы. Надо проверить код webslicer_export.py. В нём, похоже, есть обращения к ImageMagic через повторный вызов Inkscape из самого себя... странно, конечно.

Код: Выделить всё

def test_if_has_imagemagick(self):
        (status, output) = self.get_cmd_output('convert --version')
        self.has_magick = ( status == 0 and 'ImageMagick' in output )
....
(status, output) = self.get_cmd_output(
            'inkscape %s -i "%s" -e "%s" "%s"' % (
                opts, el.attrib['id'], img_name_png, self.tmp_svg
            )
)

Re: Разработка Gcodetools - плагин Inkscape для экспорта в G

Добавлено: 30 янв 2012, 10:04
NightV
Nick писал(а):Grad = Rad/pi*180 (pi = 3.14159265 )
предлагаеш самому под себя править?

Код: Выделить всё

if tool['4th axis meaning'] == "tangent knife" : 
	a = atan2(si[0][0]-s[0][0],si[0][1]-s[0][1])
	a = calculate_angle(a, current_a)
	g+="G01 C%s\n" % (a*tool['4th axis scale']+tool['4th axis offset'])
	current_a = a
	if lg=="G00": g += "G01" + c([None,None,s[5][0]+depth]) + penetration_feed +"(Penetrate)\n"	
	g += "G01" +c(si[0]+[s[5][1]+depth]) + feed + "\n"
	lg = 'G01'
	elif s[1] == 'arc':
	r = [(s[2][0]-s[0][0]), (s[2][1]-s[0][1])]
	if tool['4th axis meaning'] == "tangent knife" : 
	if s[3]<0 : # CW
	a1 = atan2(s[2][1]-s[0][1],-s[2][0]+s[0][0]) + math.pi 
	else: #CCW
	a1 = atan2(-s[2][1]+s[0][1],s[2][0]-s[0][0]) + math.pi
	a = calculate_angle(a1, current_a)
	g+="G01 A%s\n" % (a*tool['4th axis scale']+tool['4th axis offset'])
	current_a = a
	axis4 = " A%s"%((current_a+s[3])*tool['4th axis scale']+tool['4th axis offset'])
	current_a = current_a+s[3]
else : axis4 = ""