Разработка 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 (174898 просмотров) <a class='original' href='./download/file.php?id=348&sid=4dcaf46d69eea397bf6115cd38e6dc06&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 »

1. Я бы сделал иначе. Исходная кривая C:
a) делаем уширение контура до D1 и берём внутренний (запоминаем траекторию C1) контур
b) обходим траекторию C1 диаметром D1 (в режиме скругления) и получаем внешнюю траекторию C1out (совпадает с C1 за исключением скруглений) и внутренюю C1in
c) задаём функцию глубина(от ширины) для конической фрезы D3, D3_{max}, D3_{min} и строим G-контур. Предположительно вместо "запоминания безье или точек" сразу делаем биарковый, но только СНАРУЖИ от C1out (чтоб не резать дважды вдоль всего C1∩C) -- получаем биарковый C3 (только внутри C\C1out) (недостаток - он не захватывает точки пересечения скруглений C1out с контуром C). Если требуется пользователем редактировать эту линию, то даём ей ширины = расстоянию по нормали до C или откладываем "на потом" вычисляя длину, написав функцию Расстояние(точка, безье). Альтернатива: сразу делаем G-код.
d) внутри C1in режем "улиткой" либо змейкой внутренние "озерца" фрезой D1

ДОПОЛНИТЕЛЬНЫЕ действия (на потом, но надо держать в голове): 1. заглублять надо не вертикально, а под некоторым углом и после "дорезать" срезанную под углом часть контура. (туда-сюда с амплитудой, чуть большей центральной глухой части фрезы заглубляться не всегда можно, т.к. это смена направления реза) (у многих фрез нет центральной части), 2. Серпантины и все линии вообще надо резать только в 1 сторону в связи с направлением вращения фрезера

2. Изначальная идея была иметь (3-номер фрезы-конуса) D3_{min} и D3_{max}. D3_{min} как раз не позволит "в бесконечные касания" залезать... но и не сможет пролезть через очень сближенные части контура чтоб распасться на две независимые замкнутые траектории.
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

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

Сообщение Nick »

Вот какой алгоритм поиска траектории у меня в итоге вызрел:
1. Считаем нормальки для каждого сегмента в точках 0, .25, .75 и 1.
2. Сравниваем нормаль последней точки предыдущего сегмента и первой точки следующего.
а. Они равны - все хорошо.
б. Они неравны и образуют острый угол (внутренний угол) значит в этом угле растояние от кривой до траектории равно 0.
в. Они не равны и образуют тупой угол. Добавляем еще один сегмент с нормалями в точке 0 равной предыдущей нормале, в точке 1 нормале другого сегмента, а средних точках их интерполяция. ( таким образом добавляется дуга )
3. Находим величину отступать по все найденным нормалям, при этом отступ по первой нормале равен отступу по последней нормале предыдущего сегмента.
4. По полученным точкам (нормаль*отступ и отступ) рисуем новую кривую с переменной толщиной штриха.

Это процедура создания траектории для вырезания углов/тонких мест, которые уже заранее найдены и выделенны.
Все функции необходимые функции уже написанны, осталось их грамотно скомпановать.

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



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

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

Сообщение Nick »

Хммм получается, что те места в которых оффсет меньше диаметра фрезы мы проходим дважды.
Имеет ли смысл это оптимизировать? Как это оптимизируется в других программах?

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

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

Сообщение dormouse »

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

Такой режим может оказаться хуже, т.е. для него надо сделать галочку "использовать/не использовать", т.к. может давать уширения в местах захода фрезы после G0.

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

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

Сообщение Nick »

Ура!!! Я вернулся! И уже отошел от отравления, которое успел схватить на банкете в самый разгар командировки :mrgreen: !
Итак, на чем мы остановились? О переделываем процедурку отступа... Попробую сегодня доделать.
dormouse писал(а):Такой режим может оказаться хуже, т.е. для него надо сделать галочку "использовать/не использовать", т.к. может давать уширения в местах захода фрезы после G0.
Да я как раз об этом и думал, но раз оно может быть хуже подумаем об этом потом, может в процессе реализации придет гениальная идея ;).

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

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

Сообщение Nick »

Совсем не рабочая версия в процессе переделки.
Не качать и даже не пробовать запускать :)!
Вложения
inkscape-extensions.tar.gz
(13.02 КБ) 1254 скачивания
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

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

Сообщение Nick »

Ура! Заработало! (с) Кот Матроскин

Точнее, не совсем заработало, но появились первые признаки, что работать собирается :)!
На верхнем рисунке исходный контур состоит из 5-ти контрольных точек, на нижнем тот же контур из 9-ти точек.
engraving_0007.png (6120 просмотров) <a class='original' href='./download/file.php?id=312&sid=4dcaf46d69eea397bf6115cd38e6dc06&mode=view' target=_blank>Загрузить оригинал (113.7 КБ)</a>
Несмотря на все усилия присутствует небольшой голяк: на рисунках, в тех местах, где траектория расходится, будут появляться утолщения... Это к вопросу о двойном проходе ;). Эти расхождения появляются из-за того, что траектория с разных сторон строится по разным кривым, и аппроксимируется с похожими на них кривизнами => кривизна траекторий на разных участках разная, отсюда и расхождения. Эти расхождения будут уменьшаться, если добавить контрольных точек в исходную кривую.

Вот еще картинка со внутренними углами:
engraving_0008.png (6120 просмотров) <a class='original' href='./download/file.php?id=313&sid=4dcaf46d69eea397bf6115cd38e6dc06&mode=view' target=_blank>Загрузить оригинал (82.98 КБ)</a>
Как видно - глючит :).
Блин, ненавижу углы! В смысле расчеты с углами! Это сравнение по модулю 2пи меня добьет! Как вычислить угол от одного вектора до другого по часовой стрелке???

ЗЫ версия все еще не рабочая!
Вложения
inkscape-extensions.tar.gz
(22.2 КБ) 1287 скачиваний
Аватара пользователя
dormouse
Мастер
Сообщения: 334
Зарегистрирован: 27 фев 2010, 09:55
Репутация: 15
Заслуга: Developer
Контактная информация:

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

Сообщение dormouse »

уже поздно и голова не очень бодра. предложу такой путь:

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

vec a * vec b = sum from{i}{ a_i b_i}=lline a rline lline b rline cos %phi newline
%phi = arccos {sum from{i}{ a_i b_i}} over {sqrt{sum from{i}{ a_i}^2}sqrt{sum from{i}{ b_i}^2} }
Вложения
cos_phi.png
cos_phi.png (3.69 КБ) 6119 просмотров
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

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

Сообщение Nick »

Мне нужен угол по часовой стрелке. А скалярное умножение дает просто угол (скаляроне умножениесимметричрое преобразование).
В питоне в модуле math есть функция atan2 она по заданному вектору вычисляет угол его наклона с учетом направления, т.е. берутся все четыре квадранта, а не два как при обычном atan.

А вот теперь вопрос есть два вектора, a1, a2 их углы наклона. -пи<а1,а2<пи. Как найти угол от а1 до а2 в направлении часовой стрелки?
Когда я писал оффсет я эту задачу решал но коряво и очень долго, задача очень простая но у меня на ней почему-то тупняк сразу включается :), меня теперь аж потрясывает когда думаю об углах :).
Аватара пользователя
dormouse
Мастер
Сообщения: 334
Зарегистрирован: 27 фев 2010, 09:55
Репутация: 15
Заслуга: Developer
Контактная информация:

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

Сообщение dormouse »

я уже 20 часов работаю в интенсивном режиме, поэтому что-то существенное могу упускать, но:

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

vec a times vec b = [vec a, vec b ] = a_y b_z - a_z b_y, a_z b_x - a_x b_z,a_x b_y-a_y b_x
третья компонента (a_x b_y - a_y b_x) явно показывает в какую сторону от вектора a находится вектор b, т.е. это и есть ответ на поставленный вопрос, если я правильно его понял =)
Вложения
vec.png
vec.png (2.17 КБ) 6118 просмотров
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

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

Сообщение Nick »

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

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

Сообщение dormouse »

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

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

Сообщение Nick »

Так ты спрашивай, не стесняйся :).
Заодно код откомментишь :).

Да, у нас появилась ветка на ланчпаде https://code.launchpad.net/gcodetools.
Чтобы получить последний код:

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

bzr branch lp:gcodetools
Также можно зайти сюда:
http://bazaar.launchpad.net/~xepecine/g ... -1.4/files
и посмотреть код и все изменения.

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

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

Сообщение Nick »

Забавно:
Для отрисовки траектории нужно вычислять длину сегмента кубического безье, в bezmisc.py есть такая функция, но она использует методы ВыЧей, я подумал, может есть аналитический метод, поискал и нашел, что для вычисления длинны сегмента нужно вычислить интеграл:
gcode_engraving_0012.png
gcode_engraving_0012.png (6.9 КБ) 6100 просмотров

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

L = int from 0 to 1 {sqrt(x'(t)^2+y'(t)^2)} dt = int from 0 to 1 {sqrt(ax^4+bx^3+cx^2+dx+e)}dt
Наткнулся на online integral solver от Matematica и вот какой он выдал ответ :D:

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

Integrate[Sqrt[a*x^4 + b*x^3 + c*x^2 + d*x + E], x] ==
(b/(12*a) + x/3)*Sqrt[E + d*x + c*x^2 + b*x^3 + a*x^4] - ((4*b*c*(x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])^2* (-(EllipticF[ArcSin[Sqrt[ ((x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1])*(Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))/ ((x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])*(Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))]], -(((Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 3])* (Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))/ ((-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] + Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 3])* (Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4])))]* Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2]) + EllipticPi[ (-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] + Root[ E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4])/(-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] + Root[ E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]), ArcSin[Sqrt[ ((x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1])*(Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))/ ((x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])*(Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))]], -(((Root[E + d*#1 + c*#1^2 + b*#1^3 + a* #1^4 & , 2] - Root[E + d*#1 + c* #1^2 + b*#1^3 + a*#1^4 & , 3])* (Root[E + d*#1 + c*#1^2 + b*#1^3 + a* #1^4 & , 1] - Root[E + d*#1 + c* #1^2 + b*#1^3 + a*#1^4 & , 4]))/ ((-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] + Root[ E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 3])*(Root[E + d*#1 + c*#1^2 + b*#1^3 + a* #1^4 & , 2] - Root[E + d*#1 + c* #1^2 + b*#1^3 + a*#1^4 & , 4])))]* (-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] + Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2]))* Sqrt[((-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] + Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])* (x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 3]))/ ((x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])* (-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] + Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 3]))]* (Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4])* Sqrt[((x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1])* (Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))/ ((x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])* (Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))]* Sqrt[((-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] + Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])* (x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))/ ((x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])* (-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] + Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))])/ (Sqrt[E + d*x + c*x^2 + b*x^3 + a*x^4]* (-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] + Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])* (Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4])) - (24*a*d*(x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])^2* (-(EllipticF[ArcSin[Sqrt[ ((x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1])*(Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))/ ((x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])*(Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))]], -(((Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 3])* (Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))/ ((-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] + Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 3])* (Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4])))]* Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2]) + EllipticPi[ (-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] + Root[ E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4])/(-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] + Root[ E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]), ArcSin[Sqrt[ ((x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1])*(Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))/ ((x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])*(Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))]], -(((Root[E + d*#1 + c*#1^2 + b*#1^3 + a* #1^4 & , 2] - Root[E + d*#1 + c* #1^2 + b*#1^3 + a*#1^4 & , 3])* (Root[E + d*#1 + c*#1^2 + b*#1^3 + a* #1^4 & , 1] - Root[E + d*#1 + c* #1^2 + b*#1^3 + a*#1^4 & , 4]))/ ((-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] + Root[ E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 3])*(Root[E + d*#1 + c*#1^2 + b*#1^3 + a* #1^4 & , 2] - Root[E + d*#1 + c* #1^2 + b*#1^3 + a*#1^4 & , 4])))]* (-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] + Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2]))* Sqrt[((-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] + Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])* (x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 3]))/ ((x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])* (-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] + Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 3]))]* (Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4])* Sqrt[((x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1])* (Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))/ ((x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])* (Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))]* Sqrt[((-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] + Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])* (x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))/ ((x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])* (-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] + Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))])/ (Sqrt[E + d*x + c*x^2 + b*x^3 + a*x^4]* (-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] + Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])* (Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4])) + (2*b*d*EllipticF[ArcSin[ Sqrt[((x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1])* (-Root[E + d*#1 + c*#1^2 + b*#1^3 + a* #1^4 & , 2] + Root[ E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))/((x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])* (-Root[E + d*#1 + c*#1^2 + b*#1^3 + a* #1^4 & , 1] + Root[ E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))]], ((Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 3])* (Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))/ ((Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 3])* (Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))]* (x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])^2* Sqrt[((-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] + Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])* (x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 3]))/ ((x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])* (-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] + Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 3]))]* (Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4])* Sqrt[((-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] + Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])* (x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))/ ((x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])* (-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] + Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))]* Sqrt[((x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1])* (-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] + Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))/ ((x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])* (-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] + Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))])/ (Sqrt[E + d*x + c*x^2 + b*x^3 + a*x^4]* (-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] + Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])* (-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] + Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4])) - (32*a*E*EllipticF[ArcSin[ Sqrt[((x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1])* (-Root[E + d*#1 + c*#1^2 + b*#1^3 + a* #1^4 & , 2] + Root[ E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))/((x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])* (-Root[E + d*#1 + c*#1^2 + b*#1^3 + a* #1^4 & , 1] + Root[ E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))]], ((Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 3])* (Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))/ ((Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 3])* (Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))]* (x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])^2* Sqrt[((-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] + Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])* (x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 3]))/ ((x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])* (-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] + Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 3]))]* (Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4])* Sqrt[((-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] + Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])* (x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))/ ((x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])* (-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] + Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))]* Sqrt[((x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1])* (-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] + Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))/ ((x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])* (-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] + Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))])/ (Sqrt[E + d*x + c*x^2 + b*x^3 + a*x^4]* (-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] + Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])* (-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] + Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4])) + (3*b^2*((x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1])* (x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 3])* (x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]) + (x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])^2* Sqrt[((-Root[E + d*#1 + c*#1^2 + b*#1^3 + a* #1^4 & , 1] + Root[ E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])*(x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 3]))/ ((x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])* (-Root[E + d*#1 + c*#1^2 + b*#1^3 + a* #1^4 & , 1] + Root[ E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 3]))]*Sqrt[ ((x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1])* (Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] - Root[ E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))/((x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])* (Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] - Root[ E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))]*Sqrt[ ((-Root[E + d*#1 + c*#1^2 + b*#1^3 + a* #1^4 & , 1] + Root[ E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])*(x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))/ ((x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])* (-Root[E + d*#1 + c*#1^2 + b*#1^3 + a* #1^4 & , 1] + Root[ E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))]*(-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] + Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4])*((EllipticE[ArcSin[Sqrt[ ((x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1])*(Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))/((x - Root[ E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])*(Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))]], -(((Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 3])* (Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))/ ((-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] + Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 3])* (Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4])))]* (-Root[E + d*#1 + c*#1^2 + b*#1^3 + a* #1^4 & , 1] + Root[ E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 3]))/(-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] + Root[ E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2]) + (EllipticF[ArcSin[ Sqrt[((x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1])*(Root[ E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))/ ((x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])*(Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))]], -(((Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 3])* (Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))/ ((-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] + Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 3])* (Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4])))]* (Root[E + d*#1 + c*#1^2 + b*#1^3 + a* #1^4 & , 2]*(-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]) - Root[E + d*#1 + c*#1^2 + b*#1^3 + a* #1^4 & , 1]*(Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4])))/ ((-Root[E + d*#1 + c*#1^2 + b*#1^3 + a* #1^4 & , 1] + Root[ E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])*(-Root[E + d*#1 + c*#1^2 + b*#1^3 + a* #1^4 & , 2] + Root[ E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4])) - (EllipticPi[ (-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] + Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4])/ (-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] + Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]), ArcSin[Sqrt[((x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1])*(Root[ E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))/ ((x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])*(Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))]], -(((Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 3])* (Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))/ ((-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] + Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 3])* (Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4])))]* (-Root[E + d*#1 + c*#1^2 + b*#1^3 + a* #1^4 & , 1] - Root[ E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 3] - Root[ E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))/(-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] + Root[ E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))))/Sqrt[E + d*x + c*x^2 + b*x^3 + a*x^4] - (8*a*c*((x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1])* (x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 3])* (x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]) + (x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])^2* Sqrt[((-Root[E + d*#1 + c*#1^2 + b*#1^3 + a* #1^4 & , 1] + Root[ E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])*(x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 3]))/ ((x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])* (-Root[E + d*#1 + c*#1^2 + b*#1^3 + a* #1^4 & , 1] + Root[ E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 3]))]*Sqrt[ ((x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1])* (Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] - Root[ E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))/((x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])* (Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] - Root[ E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))]*Sqrt[ ((-Root[E + d*#1 + c*#1^2 + b*#1^3 + a* #1^4 & , 1] + Root[ E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])*(x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))/ ((x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])* (-Root[E + d*#1 + c*#1^2 + b*#1^3 + a* #1^4 & , 1] + Root[ E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))]*(-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] + Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4])*((EllipticE[ArcSin[Sqrt[ ((x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1])*(Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))/((x - Root[ E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])*(Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))]], -(((Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 3])* (Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))/ ((-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] + Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 3])* (Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4])))]* (-Root[E + d*#1 + c*#1^2 + b*#1^3 + a* #1^4 & , 1] + Root[ E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 3]))/(-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] + Root[ E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2]) + (EllipticF[ArcSin[ Sqrt[((x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1])*(Root[ E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))/ ((x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])*(Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))]], -(((Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 3])* (Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))/ ((-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] + Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 3])* (Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4])))]* (Root[E + d*#1 + c*#1^2 + b*#1^3 + a* #1^4 & , 2]*(-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]) - Root[E + d*#1 + c*#1^2 + b*#1^3 + a* #1^4 & , 1]*(Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4])))/ ((-Root[E + d*#1 + c*#1^2 + b*#1^3 + a* #1^4 & , 1] + Root[ E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])*(-Root[E + d*#1 + c*#1^2 + b*#1^3 + a* #1^4 & , 2] + Root[ E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4])) - (EllipticPi[ (-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] + Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4])/ (-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] + Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]), ArcSin[Sqrt[((x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1])*(Root[ E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))/ ((x - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2])*(Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))]], -(((Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 3])* (Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))/ ((-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 1] + Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 3])* (Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4])))]* (-Root[E + d*#1 + c*#1^2 + b*#1^3 + a* #1^4 & , 1] - Root[ E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] - Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 3] - Root[ E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))/(-Root[E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 2] + Root[ E + d*#1 + c*#1^2 + b*#1^3 + a*#1^4 & , 4]))))/Sqrt[E + d*x + c*x^2 + b*x^3 + a*x^4])/(24*a)
Наверное проще всетаки приближенно вычислять :).
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

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

Сообщение Nick »

Вот последние результаты:
Небольшие неточности в углах - это дефект отрисовки, там линия ложна быть толще.
Вложения
gcode_engraving_0014.png (6094 просмотра) <a class='original' href='./download/file.php?id=318&sid=4dcaf46d69eea397bf6115cd38e6dc06&mode=view' target=_blank>Загрузить оригинал (241.29 КБ)</a>
Аватара пользователя
dormouse
Мастер
Сообщения: 334
Зарегистрирован: 27 фев 2010, 09:55
Репутация: 15
Заслуга: Developer
Контактная информация:

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

Сообщение dormouse »

Отлично! Поздравляю с успехом!

Остаётся давний вопрос в силе. Если эта операция нужна только в "носиках", то желательно убрать все холостые проходы фрезой 3 по уже пройденным фрезой 1 (цилиндрической) частям.. Конкретно: только путь G1-G2...O...G2'-G1' резать.
Если бы была линия "переменной ширины" (красная на рисунке), то проблем нет - вычетаем из красной линии толстую салатовую и получаем только изображённый КРАСНЫЙ носик G...O...G1. Если делать "сходу", то надо как-то ещё одним параметром в процедуру передавать обводку салатового контура.
Вложения
rect3894.png (6094 просмотра) <a class='original' href='./download/file.php?id=319&sid=4dcaf46d69eea397bf6115cd38e6dc06&mode=view' target=_blank>Загрузить оригинал (180.04 КБ)</a>
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

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

Сообщение Nick »

Как раз хотел написать появившийся вопрос по поводу линии переменной ширины:
Эта линия, как я уже говорил, это фактически path along path. При отрисовке острых углов (внутренних углов) возникает проблема клиппинга.
А конкретнее: в остром угле когда мы делаем отступ контура по нормали, полученный контур будет хитро сам себя пересекать. Правильно отрезать такую штуку очень не просто. Так не просто, что даже inkscape с этим не очень хорошо справляется.
Вот увеличенный фрагмент:
gcode_engraving_0015.png (6093 просмотра) <a class='original' href='./download/file.php?id=320&sid=4dcaf46d69eea397bf6115cd38e6dc06&mode=view' target=_blank>Загрузить оригинал (65.88 КБ)</a>
Контур который задает форму нормальный, вот он:
path10651.png
path10651.png (2.39 КБ) 6093 просмотра
Так собственно вопрос: Как с ним быть? И имеет ли смысл его вообще отрисовывать, или сразу генерить Gкод?

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

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

Сообщение Nick »

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

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

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

Сообщение dormouse »

1. неправильное мнение, имхо. Мне кажется, что два диаметра фрезы 3 могут быть меньше диаметра первой!!
2. Если G-код делать сразу, то очень желательно передавать наружный контур от салатового. и делать G-код только снаружи от него.

Отдельное предложение. Делаем процедуру "внутрь-наружу" [из синего контура получить внешнюю сторону салатового] каким-то диаметром ~1мм. После этого фактически происходит сглаживание исходной синей кривой и пропадают ВСЕ сингулярности и изломы, если я правильно понимаю суть. С этим контуром задача уже решена.

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

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

Сообщение Nick »

dormouse писал(а):1. неправильное мнение, имхо. Мне кажется, что два диаметра фрезы 3 могут быть меньше диаметра первой!!
2. Если G-код делать сразу, то очень желательно передавать наружный контур от салатового. и делать G-код только снаружи от него.

Отдельное предложение. Делаем процедуру "внутрь-наружу" [из синего контура получить внешнюю сторону салатового] каким-то диаметром ~1мм. После этого фактически происходит сглаживание исходной синей кривой и пропадают ВСЕ сингулярности и изломы, если я правильно понимаю суть. С этим контуром задача уже решена.

P.S. Глядя на запятую видно что это не все проблемы решает.
1. Ну можно взять не диаметр 3 а диаметр 2. Или добавить к каждому концу еще какой-то отрезок. Нужно эту идею по подробнее обсусолить, ибо если она выгорит, то задача практически решена.
2. Наружный контур от салатового это опять клиппинг, т.е. обрезка. А я ее очень боюсь. Клиппинг даже в инкскецпе страдает. Кстати не только в нем. Напимер, rhinoceros мощная кад программа, в ней конечно по-меньше проблем с клиппингом, но они всеравно есть.

Не совсем понял суть отдельного предложения. Делаем два оффсета, и что потом? Если делать оффсет-, оффсет+ (причем + нужно чуть боьше) затем вычетаем из исходного контура, то получим уголки которые нужно обработать, но! т.к. оффсет+ больше то уголки получался немного меньше, чем надо, и оффсеты придется делать два раза вручную.

Еще раз повторюсь, если получится перый вариант то фактически задача будет решена, причем полностью автоматически!

ЗЫ а что с запятой еще не так?
Ответить

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