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

Обсуждение установки, настройки и использования LinuxCNC. Вопросы по Gкоду.

Следующее направление разработки

Можно выбрать до 5 вариантов ответа

 
 
Результаты голосования

Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

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

Сообщение Nick »

Разработка Gcodetools

Screenshot-output.ngc - AXIS-4.png (181769 просмотров) <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 или загрузите предыдущие ревизии.
Аватара пользователя
dormouse
Мастер
Сообщения: 334
Зарегистрирован: 27 фев 2010, 09:55
Репутация: 15
Заслуга: Developer
Контактная информация:

Re: Inkscape plug-in для экспорта в Gcode

Сообщение dormouse »

>Карту высот можно задать битмапом. Т.е. просто вставить битмап в инкскейп и все.
Для этого кто-то где-то как-то должен перед этим его нарисовать. Хочется "унификации".

>Я вот тут подумал, а не логичнее ли будет делать такой уголок шариком? Тогда и борозды посередине не >останется и края будут плавно закругляться...
Оптимально на 3 фрезы раскладывать: a)4..10мм цилиндр, b)3..4мм шарик (можно небольшой гарельеф сделать) или цилинд с шаровым окончанием(Dшара=Dцилиндра, можно дорезать контур где надо), c)2..5мм конус
Так получается, что a) проходит всю чернуху и утопленные плашки, b) все "синие озерца", плавные "U"-стыки исходного контура и серые карты глубин (если такие вставки нужны) c) все "V"-стыки (без радиуса скругления) + фаски + мелкие детали

Уйти от этой технологии мне видится невозможным, т.к. : a) не даст никакой картинки с достаточным качеством, b) универсальная, но долго надо работать ( чтоб контура внизу шарика сошлись надо выставить шаг ~0.3мм), c) вообще плоскости невозможно выбрать

Можно сразу полноценную 3-х фрезную версию делать. Это самый адекватный и нужный подход =)

P.S. Обратите внимание! Я отредактировал предыдущее сообщение -- там сбивающая с толку картинка приведена была. Она просто некорректная. Добавлен рис 5а.

P.P.S. Полагаю, можно сделать картинку на Python скрипте и "обновлять её содержимое" ? Если да, то напишем очень важную вещь - сразу же и встроенный Preview/back-plotter/g-code emulator, т.е. что именно вырежется из сгенерированного g-code этими фрезами.
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Inkscape plug-in для экспорта в Gcode

Сообщение Nick »

А чем плох такой вариант:
Сначала проходим контур с оффсетом -2D цилиндром:
0001.png (7074 просмотра) <a class='original' href='./download/file.php?id=251&mode=view' target=_blank>Загрузить оригинал (21.94 КБ)</a>
Потом уточняем границу конусом:
0002.png (7074 просмотра) <a class='original' href='./download/file.php?id=252&mode=view' target=_blank>Загрузить оригинал (24.92 КБ)</a>
Потом рисуем угол - конусом по центру угла постепенно поднимаясь:
0003.png (7074 просмотра) <a class='original' href='./download/file.php?id=253&mode=view' target=_blank>Загрузить оригинал (32.03 КБ)</a>
На картинке видна грань при обработке угла, но ее быть не должно (это дефект рендера)

Нужно: Диаметр конуса >=d, глубина >= d*tg(угла наклона конуса).

Плюсы: не будет дефектов, плавные переходы граней.
Аватара пользователя
dormouse
Мастер
Сообщения: 334
Зарегистрирован: 27 фев 2010, 09:55
Репутация: 15
Заслуга: Developer
Контактная информация:

Re: Inkscape plug-in для экспорта в Gcode

Сообщение dormouse »

Основная проблема в том, что НЕ ВСЕГДА(!) нужна фаска на основной рабочей длине контура детали!! Если возможно - надо перейти в ICQ/skype. Читайте Л.С.
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Inkscape plug-in для экспорта в Gcode

Сообщение Nick »

У нас есть две задачи: найти те места где не прошел цилиндр, вычислить траекторию для этих мест.

В общем случае задачи не тривиальны. Для поиска узких мест нужно вычислять расстояния от каждой точки кривой до каждой точки кривой. Аналитически такая задача не решается методы вычей будут требовать большого времени. По идее для вычисления минимального расстояния с приличной точностью придется 10-100 промежуточных точек каждого сегмента итого сложность получится n^2*m^2 где n количество сегментов, а m количество промежуточных точек. Как-то много. :(

Построение траектории по проще. Предположим мы нашли угол, знаем его вершину. Тогда нам нужно построить две кривых между правой и левой частью угла. Каждая кривая должна выходить из вершины угла и расстояние от кривой до стороны угла в каждой точке должно быть равно половине диаметра фрезы если толщина контура в этой точке больше диаметра фрезы и половине толщины контура в этой точке, если она меньше диаметра фрезы.

Для случая ломанной нужно просто разбить обе стороны угла таким образом, чтобы длины сегментов у правой и левой сторон были одинаковыми и интерполировать контрольные точки.
Для кривых безье все сложнее, не уверен, что такую кривую можно описать кривой безье того же класса как и стороны угла. Но можно строить приближения таким же образом как с ломанной и если надо уменьшать длину сегментов.

PS в icq так и не смог до тебя вчера достучаться.

Pss писал с телефона, прошу прощения за очепятки :).
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Inkscape plug-in для экспорта в Gcode

Сообщение Nick »

Подправил один баг и вот что на данный момент получилось :) :
Вложения
gcode_engraving.png (7004 просмотра) <a class='original' href='./download/file.php?id=255&mode=view' target=_blank>Загрузить оригинал (29.89 КБ)</a>
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Inkscape plug-in для экспорта в Gcode

Сообщение Nick »

Пока никак не получается сделать нормальный оффсет с переменным радиусом :(.
gcode_engraving_0001.png (7002 просмотра) <a class='original' href='./download/file.php?id=256&mode=view' target=_blank>Загрузить оригинал (135.29 КБ)</a>
Предположим мы хотим найти отступ в точке А. Т.е. нам нужно найти точку О.
Ясно, что она лежит на перпендикуляре к кривой.

Как найти расстояние от А до О??? :?

Я нарисовал несколько возможных случаев.
Красная линия - перпендикуляр в точке А
Точка B - точка на противоположной стороне контура, которая учитывается при поиске радиуса.
Зеленая линия - ближайшая точка на противоположном контуре.
Синяя нормаль в точке В.
Аватара пользователя
dormouse
Мастер
Сообщения: 334
Зарегистрирован: 27 фев 2010, 09:55
Репутация: 15
Заслуга: Developer
Контактная информация:

Re: Inkscape plug-in для экспорта в Gcode

Сообщение dormouse »

Bugs:
1. (inkscape 0.47-3/windows) после работы Area curves нельзя выделить контур (только наводишь мышку, становится красным, потом сразу обратно чёрным) - лечится "экспорт в .ps" и импорт обратно.
2. плагин вообще не работает из-за жёстко прописанного пути к логам - надо как-то исправить путь "/home/nick/", ручная правка спасает положение =)
3. очень много артефактов (в посторонних местах непонятные штрихи) при отступе Area distance больше 1/2 ширины вырезаемых карманов

Написал мысли в сегодняшнем числе (красная надпись 20100301), раздел Inkscape. http://www.kalyaev.com/2010/pub.html
Отдельно привожу фото.
* Синий цвет - оригинальный контур исходного файла
* Серая заливка - желаемая деталь.
* Чёрный цвет - траектория цилиндра 1
* зеленоватый - реальная выборка им
* сиреневый - траектория малой скруглённой фрезы 2
* красный - траектория треугольной фрезы 3

Нас интересуют "треугольники" AOB. Путь GO от красной конической фрезы 3. В точке G заглубление максимально (визуально красная линия повторяет контур BO примерно от точки D). Отступ |BO,G|=d конической фрезы 3. На отрезке DO заглубление спадает до нуля (в т. O).

Сиреневая траектория CD - примерный путь цилиндрической фрезы 2 с шариком на конце (скруглённой).
Вложения
contours-1-all.png (6999 просмотров) <a class='original' href='./download/file.php?id=258&mode=view' target=_blank>Загрузить оригинал (41.49 КБ)</a>
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Inkscape plug-in для экспорта в Gcode

Сообщение Nick »

dormouse писал(а):Bugs:
1. (inkscape 0.47-3/windows) после работы Area curves нельзя выделить контур (только наводишь мышку, становится красным, потом сразу обратно чёрным) - лечится "экспорт в .ps" и импорт обратно.
2. плагин вообще не работает из-за жёстко прописанного пути к логам - надо как-то исправить путь "/home/nick/", ручная правка спасает положение =)
3. очень много артефактов (в посторонних местах непонятные штрихи) при отступе Area distance больше 1/2 ширины вырезаемых карманов
1. Какая версия? Из шапки или нет? Как вариант, перед применением Area curves выделить контур + Контур -> Динамическая втяжка (Ctrl + J). Inkscape перед задачей offset каким-то образом преобразует контур, я попытался это повторить, но не всегда работает как надо :).
2. Упс... Закомментировал функцию логов. Исправил шапку.
3. Функция вычисления кривых площади использует инкскейповский dynamic offset. Он дает артефакты. Вобще, задача оффсета далеко не тривиальная и обычно требует очень большого количества вычислений. Я честно пытался написать собственный оффсет, но из этого мало что получилось. Точнее получилось, но он все равно глючил и работал очень медленно. Самое сложное сделать клиппинг, для него считается оффсет в две стороны (внутрь и наружу) и рассчитываются их взаимопересечения. Сложность O(n^2) при размере контура 500 контрольных узлов дождаться конца обработки практически нереально. :(
dormouse писал(а):Bugs:
Нас интересуют "треугольники" AOB. Путь GO от красной конической фрезы 3. В точке G заглубление максимально (визуально красная линия повторяет контур BO примерно от точки D). Отступ |BO,G|=d конической фрезы 3. На отрезке DO заглубление спадает до нуля (в т. O).
Главный вопрос, как рассчитать положение точки D? Как рассчитать расстояние от контура до траектории за точкой D, т.е. ближе к углу?

Как быть в таких случаях:
rect45490.png (6998 просмотров) <a class='original' href='./download/file.php?id=260&mode=view' target=_blank>Загрузить оригинал (42.21 КБ)</a>
Как найти угол?

По идее нужно обрабатывать не две стороны, а просто идти по контуру с отступом. Но как этот отступ рассчитать?
Аватара пользователя
dormouse
Мастер
Сообщения: 334
Зарегистрирован: 27 фев 2010, 09:55
Репутация: 15
Заслуга: Developer
Контактная информация:

Re: Inkscape plug-in для экспорта в Gcode

Сообщение dormouse »

1. Всё было последним. Ctrl+j (динамическую втяжку) попробовал. Сам путь после этого вроде перестал по узлам выделяться, но результат стал похож на желаемый. Надо побольше времени на тестирование.
2. Логи не надо выключать. Надо добавить поле "путь для лог файла" в .inx интерфейс!!
3. Вместо Dynamic offset -- посмотрите мой путь: утолщаем контур (ширина линии, в растровом варианте -- вокруг каждого
пиксела границы нарисовать круг диаметром нужной ширины линии),
преобразуем в путь, break apart, удаляем внешний контур. Получаем ЖЕЛАЕМЫЙ(!)
результат (проверяется утолщением на ту же величину в режиме "скругления"
на изломах)
----
Решение I: простое и очевидное -- идти от точки B в сторону точки O и далее до точки A по правилу максимальный отступ от желаемой синей линии вплоть до ½d, но не касаясь ни одной синей линии. При этом отступ по нормали от синей линии равен ширине фрезерования и по формуле равен глубине (предполагаем, что ширина=функция(глубины), взаимнооднозначная, в простейшем случае ширина=глубина для 45° конуса).

Решение II. Нарисовать ГРАДИЕНТНОЕ уширение линии (градиент(l)=функция(глубины фрезы на этом диаметре)) вместо обычного (чёрный цвет-линия, белый при l>½d, фактически это получится Z-depth map дл). После этого все места, где синие контура ближе чем ½d друг к другу будут нарисованы как не-белые куски, отстоящие от белых лужиц в середине.

Решение III.
1. заливаем снаружи от синего контура 50% серым.
2. делаем границу салатового скруглённого контура (от фрезы 1) зелёным.
3. вычитаем из синего контура зелёный и закрываем полученные синие U- и V- образные "оглобли" (для более сложного варианта замыкать можно другим цветом, если Inkscape это поддерживает)
4. полученные замкнутые кривые (синяя граница, серое содержимое) обрабатываем отдельно -- как без скрипта сделать (пока) не придумал.


Для генерации G-code таким образом имеем карту глубин, которую переводим в простейший набор линий.

P.S. В самом крайнем случае если нарисовать градиент, то уже готова обычная Z-depth map для конической фрезы (учитывая небольшой % от общей площади это может быть достойным решением.... но, конечно одну "правильную" линию это с художественной точки зрения не заменит).
Вложения
contour--ccurve-large.png (6993 просмотра) <a class='original' href='./download/file.php?id=261&mode=view' target=_blank>Загрузить оригинал (22.79 КБ)</a>
contour-ccurve.png
contour-ccurve.png (10.64 КБ) 6993 просмотра
Последний раз редактировалось dormouse 02 мар 2010, 11:53, всего редактировалось 1 раз.
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Inkscape plug-in для экспорта в Gcode

Сообщение Nick »

dormouse писал(а):1. Всё было последним. Ctrl+j (динамическую втяжку) попробовал. Сам путь после этого вроде перестал по узлам выделяться, но результат стал похож на желаемый. Надо побольше времени на тестирование.
2. Логи не надо выключать. Надо добавить поле "путь для лог файла" в .inx интерфейс!!
3. Вместо Dynamic offset -- посмотрите мой путь: утолщаем контур (ширина линии, в растровом варианте -- вокруг каждого
пиксела границы нарисовать круг диаметром нужной ширины линии),
преобразуем в путь, break apart, удаляем внешний контур. Получаем ЖЕЛАЕМЫЙ(!)
результат (проверяется утолщением на ту же величину в режиме "скругления"
на изломах)
1. По узлам не выделяется потому, что это теперь dynamic offset а не path. У него только одна контрольная точка которая отвечает за радиус оффсета. Кстати похоже в прошлый раз у тебя была такая же проблема, если выделять такой объект припомощи F2, то он при наведении становится синий, а при выделении становится черный, при этом вокруг него появляется обводка и одна контрольная точка. Т.к. объект у тебя составной, то обводки при увеличении ты мог не увидеть.
Почему при экспорте в эпс все работало нормально работать:
Внутренняя структура svg такова: если объект контур у него есть параметр "d" в нем описывается геометрия контура. Когда инкскейп создает оффсет, объект преобразуется, у него появляются поля: "sodipodi:offset" - говорит, что объект это оффсет, "inkscape:original" - содержит параметр "d" контура исходника, "inkscape:radius" - радиус оффсета, при этом для совместимости с обычным svg добавляется поле "d" в котором описывается результат оффсета. Когда ты сохранил в эпс inkscape просто перевел все оффсеты в path. Этого же можно добиться путем Контур - Оконтурить объект (Ctrl+Shift+C).

2. Это не совсем логи, это функция для отладки программы. Просто обычный print не подхоит, т.к. он пишет в стандартный поток из которого inkscape берет преобразованный svg, и если туда писать что-либо inkscape с большой вероятностью вылетит.

3. Эффект будет тот же. Я думаю, процедура оффсета и отрисовки контура одна и та же. См аттач.
gcode_engraving_0002.png (7026 просмотров) <a class='original' href='./download/file.php?id=263&mode=view' target=_blank>Загрузить оригинал (50.03 КБ)</a>


По поводу решений: я все бьюсь над проблемой как вычислить положение точки центра фрезы.
rect3894.png (7026 просмотров) <a class='original' href='./download/file.php?id=264&mode=view' target=_blank>Загрузить оригинал (180.04 КБ)</a>
Предположим мы идем от точки В к точке О. Для точки В1 нужно найти точку F1. Она лежит на нормали к кривой в точке В1, но как рассчитать расстояние от В1 до F1? Меня интересует геометрическое решение, для которого можно написать алгоритм построения.
Аватара пользователя
dormouse
Мастер
Сообщения: 334
Зарегистрирован: 27 фев 2010, 09:55
Репутация: 15
Заслуга: Developer
Контактная информация:

Re: Inkscape plug-in для экспорта в Gcode

Сообщение dormouse »

Я не очень понял смысл вопроса про поиск точки. Фактически требуется найти траекторию G5,G4,G3,G2,G1,G0 или 0 (зависит от того, есть ли минимальный диаметр у конуса, или он "бесконечно острый").
Работающий (идейно) метод: начинаем в точке B5 (это касание исходной фрезой 1 желаемого синего контура). Начинаем обходить контур от т. B5 в сторону O (всё время касаясь окружностью траектории кривой {B5,O}). В какой-то момент в точке (G4) происходит касание другого синего контура => начинаем уменьшать диаметр и приближать точку G3 к B3 (отрезок |B4G3| это шаг алгоритма, если растровый/сеточный метод) до тех пор, пока касание T3 не пропадёт (или не станет точечным, а не двух+ точечным). и т.п. вплоть до т. G0 или 0 (если контур V-образный конец, для U-образного остановка(поворот) произойдёт в фокусе закругления, если оно меньше диаметра конуса d3(max).

Написано не очень внятно, но для растровый алгоритм готов.
Вложения
contour-4.png (7025 просмотров) <a class='original' href='./download/file.php?id=266&mode=view' target=_blank>Загрузить оригинал (12.4 КБ)</a>
123th
Новичок
Сообщения: 5
Зарегистрирован: 28 фев 2010, 01:13
Репутация: 0
Контактная информация:

Re: Inkscape plug-in для экспорта в Gcode

Сообщение 123th »

мой взгляд на построение.
1) в программе задаём количество фрез и их диаметры. т.е. нужна кнопка "добавить фрезу" которая будет добавлять фрезу с указанием типа и параметров для типа.
фрезы задаются по порядку прохождения. т.е. сначала самая большая, потом доводочные в порядке их смены (например сначала меньший цилиндр а потом конус, но не наоборот).
2) исходя из заданного набора фрез, программа строит пути:
2.1) сначала для первой фрезы. потом построенный путь обходится контуром равным диаметру первой фрезы.
2.2) далее начальный контур проходится диаметром инструмента 2 (строится путь для меньшей фрезы).
2.3) ищутся точки пересечения второго пути с результатом обхода пути 1 диаметром инструмента 1, вся часть пути 2 оказавшаяся внутри контура обхода диаметром 1 пути 1 удаляется.
3) повторять алгоритм для остальных инструментов если они есть.

****

для построения пути подъёма конусной фрезы в концах углов и в узких "перешейках":
пока что алгоритм для "не извивающихся" углов, т.е. имеющих средний путь в виде одной прямой или одной дуги.

для прямых линий всё просто: строим среднюю линию (начало в углу пути предыдущего пути обхода) и вычисляем перепады высот в точках излома, после чего можно скорректировать карту высоты для пути учитывая любые 2 из следующих параметров конусной фрезы: угол, высоту, макс. диаметр. (если конус не усечённый).

для углов образованных прямой и дугой, или двумя дугами:
строим окружность в любом месте между двумя линиями образующими угол, далее по трём точкам (вершина угла, центр окружности и угол предыдущего пути) строим кривую. это будет путь, как минимум очень близкий к нужному. карту высот строим градиентом, т.е. с указанным пользователем шагом считаем диаметр окружности вписанной между двумя стенками контура с центром на средней линии в точке шага.

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

на картинке:

синий: начальный контур.
толстый зелёный: пути инструментов.
красный штрих-пунктир: контур того что получится при проходе инструмента 1 по пути 1.
синий штрих: путь инструмента для выборки угла.

Изображение
Последний раз редактировалось 123th 02 мар 2010, 13:52, всего редактировалось 1 раз.
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Inkscape plug-in для экспорта в Gcode

Сообщение Nick »

dormouse писал(а):В какой-то момент в точке (G4) происходит касание другого синего контура.
Как найти точку G4?

Смотрите что у нас заданно:
Две части угла - параметрическими кривыми, точка B1. Диаметр фрезы.
Можем вычислить нормаль в точке В1.
Если бы можно было построить точку G геометрически (при помощи циркуля и линейки) все было бы просто.
В противном случае имеем:
gcode_engraving_0004.png (7017 просмотров) <a class='original' href='./download/file.php?id=268&mode=view' target=_blank>Загрузить оригинал (69.38 КБ)</a>
Две части кривой ОТ и ОВ, каждая задана несколькими сегментами.
Сегмент задается параметрически следующей формулой:
345cb15e836677e949b72ace996ac052.png
345cb15e836677e949b72ace996ac052.png (1.69 КБ) 7017 просмотров
300px-Bezier_curve.svg.png
300px-Bezier_curve.svg.png (4.2 КБ) 7017 просмотров
Пусть мы находимся в точке B1.
1. Мы знаем, что точка G1 лежит на нормали к кривой ВО в точке В1.
2. Мы знаем, что точка G1 лежит на нормали к кривой ТО, но не знаем где находится точка Т1
3. Мы не знаем расстояние от точки B1 до G1.

Для вычисления точки G1 нужно составить систему и решить ее.
Итак, первые два уравнения задают нормаль к ВО в точке В1:

x = x1+t1*dx
y = y1+t1*dy
dx,dy это значения производных в точке В1, их знаем

Еще два уравнения задают нормаль в производной точке TO
x = x2+t2*dx2
y = y2+t2*dy2
dx2 = 3*ax* t3^2 + 2*bx*t3 +cx
dy2 = 3*ay* t3^2 + 2*by*t3 +cy
ax,bx,cx,ay,by,cy - параметры задающие кривую, их знаем
и еще одно уравнение, задает равное расстояние |G1B1| и |G2B2|:
(B1.x - x)**2 + (B1.y - y)**2 = (ax*t3**3 + bx*t3**2 + cx*t3 + ex - x)**2 + (ay*t3**3 + by*t3**2 + cy*t3 + ey - y)**2
ax,bx,cx,ex,ay,by,cy,ey - параметры задающие кривую, их знаем.

Если решить эту систему относительно t1,t2,t3 найдем точку G1.
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Inkscape plug-in для экспорта в Gcode

Сообщение Nick »

Все это счастье дает систему из трех нелинейных уравнений. Причем последнее аж 6-ой степени :shock: .
И как это решать?

x1+t1*dx = x2+t2*(3*ax* t3^2 + 2*bx*t3 +cx)
y1+t1*dy = y2+t2*(3*ay* t3^2 + 2*by*t3 +cy)
(B1.x - x1+t1*dx)**2 + (B1.y - x1+t1*dx)**2 = (ax*t3**3 + bx*t3**2 + cx*t3 + ex - x)**2 + (ay*t3**3 + by*t3**2 + cy*t3 + ey - y)**2

Хотя, численными методами решить можно... Нужно только найти начальное приближение...
Да и решать такую систему нужно для каждого сегмента кривой ОТ, и потом выбрать решение с минимальным G1.
Аватара пользователя
dormouse
Мастер
Сообщения: 334
Зарегистрирован: 27 фев 2010, 09:55
Репутация: 15
Заслуга: Developer
Контактная информация:

Re: Inkscape plug-in для экспорта в Gcode

Сообщение dormouse »

Надо будет немного освежить параметрические задания кривой. Формулы лучше через OpenOffice или OpenOffice/latex вставлять - так сложновато понимать их, а только картинка не позволяет легко редактировать =).
Для примера через синтаксис OpenOffice Math:
рис 1. left lbrace alignl stack{x = x_1+t_1 dx#y = y_1+t_1 dy} right none
рис 2. left lbrace alignl stack{x = x_2+t_2 dx_2#y = y_2+t_2 dy_2#dx_2 = 3axt_{3}^2 + 2bxt_3 +cx#dy_2 = 3ayt_{3}^2 + 2byt_3 +cy} right none
рис 3. (B_1x - x)^2 + (B_1y - y)^2 = (axt_{3}^3 + bxt_{3}^2 + cxt_{3} + ex - x)^2+{}newline{}+(ayt_{3}^3 + byt_{3}^2 + cyt_3 + ey - y)^2
Синтаксис других программ лучше не использовать, т.к. преимущественно они все платные, либо "фиг установишь с квалификацией пользователя" =)

Учитывая третью степень, если решение легко не выйдет, то можно итеративно до появления корней наращивать координаты точек G *rofl*. Собственно предлагается вместо поиска корней (если будет сложно) подставлять константы конкретного фрагмента и конкретной окружности и искать пересечение. Для ускорения можно BBOX'ы для начала проверить - может они разнесены в пространстве...

Что-то мне кажется странным - это решение системы надо прогнать для всех сегментов исходной "синей" кривой, т.е. фрагментами между каждыми точками из режима редактирования? Мне надо теорию линий почитать. Я забыл - во всех ли точках можно такую кривую разбить на отдельные сегменты, или они как-то связаны математически (вроде влияния "через один узел" на форму кривой)
------------
Алгоритм я видел просто: "повторяем форму кривой с отступом d/2 по нормали пока нет касания другой части траектории. Как появляется -- уменьшаем вплоть до dmin/2 или 0". "другая часть - это массив из безье-фрагментов, несвязанных, насколько я понимаю, друг с другом".
С контуром, который обходим мы строим offset, т.е. нормаль+d/2 в каждой точке, а со всеми остальными фрагментами достаточно только факт пересечения проверять =>итеративно диаметр до нуля снижать.


P.S. Я немного замучился с запуском gcode_tools.py. Он умеет ругаться что не находит self.header и self.footer. Хотя они, вроде, явно прописаны. Может такое быть что они когда-нибудь (при каких-нибудь условиях) не инициализируются? в тех строках где они используются, я потёр обращения к ним и всё заработало.
Вложения
oomath.rar
(13.9 КБ) 721 скачивание
oomath.png
oomath.png (11.43 КБ) 7013 просмотров
Аватара пользователя
dormouse
Мастер
Сообщения: 334
Зарегистрирован: 27 фев 2010, 09:55
Репутация: 15
Заслуга: Developer
Контактная информация:

Re: Inkscape plug-in для экспорта в Gcode

Сообщение dormouse »

Чем дольше смотрю, тем больше начинает казаться, что стоит отрастрировать синюю траекторию и вместо решения полноценной системы уравнений идти по векторной линии OB, строить от неё нормали, на ней для каждой точки в пределах до dmax/2 ищу "попал ли хоть один синий пиксель в этот диаметр" =)
Этакий комбинированный подход. В любом случае - для чисто растровой программы обязательно понадобится восстанавливать часть контура OB для построения нормали и т.п.
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Inkscape plug-in для экспорта в Gcode

Сообщение Nick »

Прошу прощения, что не написал формулы в math. :oops:
dormouse писал(а):Надо будет немного освежить параметрические задания кривой.
В инкскейпе все кривые задаются сегментами (между каждых двух контрольных точек), а сегменты кубическими кривыми безье:
задается двумя точками и касательными (с длинной) в них.
Картинка из википедии хорошо иллюстрирует построение кривой:
Bezier_cubic_anim.gif
Bezier_cubic_anim.gif (110.44 КБ) 7011 просмотров
http://ru.wikipedia.org/wiki/Кривая_Безье
Учитывая третью степень, если решение легко не выйдет

cubic solver я уже написал, когда вычислял пересечение прямой и кубической кривой безье. Но там 6-я степень :).
Собственно предлагается вместо поиска корней (если будет сложно) подставлять константы конкретного фрагмента и конкретной окружности и искать пересечение. Для ускорения можно BBOX'ы для начала проверить - может они разнесены в пространстве...
Я думаю нужно написать численной решение системы...
Что-то мне кажется странным - это решение системы надо прогнать для всех сегментов исходной "синей" кривой, т.е. фрагментами между каждыми точками из режима редактирования?
Да, придется, каждый сегмент - отдельная кривая безье.
Я забыл - во всех ли точках можно такую кривую разбить на отдельные сегменты, или они как-то связаны математически (вроде влияния "через один узел" на форму кривой)
Каждый сегмент просто бьется на два сегмента. А когда редактируешь узлы, если узел гладкий, то редактируются два сегмента.

Кстати пересечение окружности и кривой тоже решается только численно:
Окружность задается: x = r * cos(t), y = t * sin(t), либо квадратным уравнением, что в итоге дает уравнение 6-й степени => может быть до 6 точек пересечения :shock: .
(прошу прощения, что не написал в math - эти формулы простые)
P.S. Я немного замучился с запуском gcode_tools.py. Он умеет ругаться что не находит self.header и self.footer. Хотя они, вроде, явно прописаны. Может такое быть что они когда-нибудь (при каких-нибудь условиях) не инициализируются? в тех строках где они используются, я потёр обращения к ним и всё заработало.
Эээээ... А что конкретно писал? На какую строчку ругался?
header и footer можно прописать в отдельных файлах и тогда скрипт их возьмет. Но у меня оба способа работают как надо...
Аватара пользователя
dormouse
Мастер
Сообщения: 334
Зарегистрирован: 27 фев 2010, 09:55
Репутация: 15
Заслуга: Developer
Контактная информация:

Re: Inkscape plug-in для экспорта в Gcode

Сообщение dormouse »

спасибо за разъяснения по Inkscape.
попробуйте на чистой winxp попробовать распаковать свой скрипт и натравить его на что-нибудь. Он умеет ругаться что self.footer/header не определён вообще. Насчёт подкладывания внешнего файла не пробовал, а вырезание самого обращения точно помогает. После попробую более детальные изыски.

Что порешим насчёт "не касания безье и окружности" ? (надо, кстати, очень строго подходить к вопросу - вдруг окружность пройдёт точно по точке начала и конца сегмента безье? тогда она может дать ложный диаметр! =) )
Можно ли в Inkscape скриптами сделать растрирование и комбинированную работу? Так же можно просто накидать равномерно N точек на кривую и про саму кривую вовсе забыть ? Получится обычная задача R^2 < x^2 + y^2 + z^2 для каждой такой точки {x,y,z}
Точнее R^2 < (x_i - x_r)^2 + (y_i - y_r)^2 + (z_i - z_r)^2
Вложения
math_circle.png
math_circle.png (1.95 КБ) 7011 просмотров
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Inkscape plug-in для экспорта в Gcode

Сообщение Nick »

dormouse писал(а):Чем дольше смотрю, тем больше начинает казаться, что стоит отрастрировать синюю траекторию и вместо решения полноценной системы уравнений идти по векторной линии OB, строить от неё нормали, на ней для каждой точки в пределах до dmax/2 ищу "попал ли хоть один синий пиксель в этот диаметр" =)
Этакий комбинированный подход. В любом случае - для чисто растровой программы обязательно понадобится восстанавливать часть контура OB для построения нормали и т.п.
Не сцать! :) Сейчас все решим, я уже нашел статейку в википедии!
http://en.wikipedia.org/wiki/Numerical_ ... _equations
и
http://en.wikipedia.org/wiki/Root-finding_algorithm

Еще условие добавилось: t3 от 0 до 1
equation.png (7011 просмотров) <a class='original' href='./download/file.php?id=276&mode=view' target=_blank>Загрузить оригинал (18.33 КБ)</a>

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

alignl {
	left lbrace alignl stack{
		x = x_1+t_1 dx#y = y_1+t_1 dy
	} right none
} newline newline 

alignl {
	left lbrace alignl stack{
		x = x_2+t_2 dx_2#	
		y = y_2+t_2 dy_2#
		dx_2 = 3ax t_{3}^2 + 2bx t_3 +cx#
		dy_2 = 3ay t_{3}^2 + 2by t_3 +cy
	} right none
}newline newline 

alignl {
	(B1_x - x)^2 + (B1_y - y)^2 = (ax t_{3}^3 + bx t_{3}^2 + cx t_{3} + ex - x)^2+(ay t_{3}^3 + by t_{3}^2 + cy t_3 + ey - y)^2
} newline  newline 

alignl {
	t_3 in [0;1] 
}
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Inkscape plug-in для экспорта в Gcode

Сообщение Nick »

dormouse писал(а): (надо, кстати, очень строго подходить к вопросу - вдруг окружность пройдёт точно по точке начала и конца сегмента безье? тогда она может дать ложный диаметр! =) )
Точно, нужно будет не забыть замерить расстояния до концов сегментов.
Можно ли в Inkscape скриптами сделать растрирование и комбинированную работу? Так же можно просто накидать равномерно N точек на кривую и про саму кривую вовсе забыть ? Получится обычная задача R^2 < x^2 + y^2 + z^2 для каждой такой точки {x,y,z}
Точнее R^2 < (x_i - x_r)^2 + (y_i - y_r)^2 + (z_i - z_r)^2
Можно но проще Alt+b - это внутренний алгоритм инкскейпа. Иначе придется описывать всю отрисовку вручную. Из скриптов нет доступа ко внутренним функциям, они просто берут svg целиком, перерабатывают его как надо и отдают обратно inkscapе'у


Вот еще русская статейка как решить систему:
http://www.nsu.ru/matlab/Exponenta_RU/e ... oc.asp.htm
Сейчас домой приеду буду производные искать :).
Ответить

Вернуться в «LinuxCNC»