Эта ветка посвящена разработке Gcodetools, плагина для векторного редактора Inkscape, позволяющего конвертировать кривые из Inkscape в Gкод, используя круговую и линейную интерполяцию.
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
Loft создание объекта с определенными сечениями.
Параметры: расстояния между сечениями, степень интерполяции, упрощенное превью/полное превью
Реализация: сначала в исходные кривые добавляются контрольные точки таким образом, чтобы кривые делились ими на равные (относительно длинны кривой) отрезки. Затем эти на основе этих контрольных точек создаются новые кривые которые будут описывать лофт (нужно найти нормальное Русское название).
Проблемы: нет возможности удобно задать поворот сечений.
Создание узоров переменной глубины.
Для быстрой обработки узоров с переменной глубиной необходимо задать величину координаты z. Первое, что приходит на ум использовать контуры с переменной шириной обводки. Также необходим механизм перевода обычных фигур к такому виду.
Проблемы: нельзя использовать круговую интерполяцию для третьей координаты, придется дополнительно разбивать исходный контур. Сложно составлять необходимые контуры. Необходимо задать функцию толщины фрезы в зависимости от заглубления.
На данный момент в процессе реализации находится лофт, т.к. его реализация вызывает меньше вопросов, и его реализация проще.
Обработка узоров переменной глубины пока находится на стадии обсуждения реализации.
При создании loft-а возникает вопрос: что делать с составными кривыми?
Варианты:
Заменять дырки (между концом одной кривой и началом следующей) прямыми отрезками.
Этот вариант прост в реализации и результатбудет выглядеть достаточно логично - не будет не понятных промежутков в готовом лофте.
Считать дырку дыркой и при переразбивке кривых учитывать ее как кривую. Тогда появятся дырки в цельных кривых, в тех же местах.
Считать дырку дыркой и не учитывать ее при переразбивке кривых. Тогда дырки будут плавно исчезать. По идее это самый правильный вариант. Нужно подумать над его реализацией.
Появился перый скриншот лофта. Примерно определилась поцедура его создания:
задать сечения детали в осях.
задать расстояния между осями.
выделить сечения в правильном порядке.
выбрать степень интерполяции (от степени интерполяции зависит гладкость лофта при переходе от сечения к сечению)
нажать ок .
Несколько советов: для получения правильного лофта необходио, чтобы контуры были правльно ориентированы. Ориентацию контуров можно просто проверить задав в стиле обводки стрелки, указывающие направление (маркер начала, середины или конца).
Возникает вопрос нужна ли переменная степень интероляции? Т.е. Задавать одну степень для всего лофта или сделать возможным задание степени для каждой пары контуров?
По поводу гравировки узоров, примерно сформировалсч алгоритм действий:
Выбираем кривую.
Смотрим есть ли у нее эффект переменной ширины штриха
Если есть переразбиваем кривую таким образом, чтобы ширина штриха хорошо интерполировалась прямыми отрезками.
Здесь нужно также постараться учесть различные формы фрезы: если фреза в виде простого конуса, то все просто - масштабируем глубину в зависимости от угла острия фрезы, а вот если фреза имеет более сложную форму, наприер, шар или какая-нибудь выпуклая/вогнутая фреза, то нужно будет вводить замену переменной. Хотя, это случай можно оставить на потом и предоставить возможность людям самим устанавливать разбиение кривой.
Затем переводим кривую в Жкод уже готовой функцией.
Теперь не решенные вопросы:
При задании кривой с переменной шириной штриха кривая будет отображаться не овсем так как она будет вырезана. На концах кривая будет обрублена хотя при обработке останется закругленный конец. По идее это одно отрисовать при создании превьюшки но на стадии отрисовки этого всеравно не будет видно.
Уже оговоренный вопрос интерполяции кривой по оси Z при сложных формах фрезы.
Как оптимизировать отрисовку узоров? Пока это процесс отработан не слишком хорошо.
Очередная версия пока не рабочая.
В процедуре лофта произошли изменения.
Дистанции между сечениями теперь задаються дополнительной кривой. Также с этой кривой берется способ интерполяции. Каждая точка кривой соответствует одному сечению. Разница между координатами х этих точек - расстояние между сечениями. Сегодня повешу пример, по нему проще объяснить.
Разработка... Гравировка.
1. Необходимо облегчить отрисовку узоров с произвольной глубиной.
Как я это вижу : удобнее всего нарисовать внешние границы узора, а потом привести его к нужному виду. Под нужным видом подразумевается контур с эффектом переменной толщины, что по сути является эффектом Path along path.
Итак входные данные замкнутый контур. Хотим получить траекторию посередине этого контура и вычислить переменную толщину. Первая проблема - как найти траекторию?
Сначала нужно найти направление траектории можно построить множество контуров выбрать тот у которого будет самым маленьким самое толстое место. Но это достаточно трудозатратно. Второй вариант заставить человека указывать начало и конец траектории. Для этого придется заставлять рисовать человека еще одну кривую. Имхо это не так сложно и стоит пойти по этому пути.
Если у нас есть начало и конец траектории, то мы можем разделить контур на две части - условно правая и левая. После этого мы можем очень просто рассчитать точки посередине. Интересно если равномерно разбить правую и левую част и взять усредненные их контрольные точки, то получившаяся кривая будет проходить ровно посередине или нет? Сами-то контрольные точки будут точно посередине.
Нужно расписать векторную форму кривой Безье и все станет понятно.
Продолжение...
Написана разбивка кривой вблизи указанных точек на две кривые.
По первому пункту, нужно дописать построение серединной кривой и вычисление толщины.
Есть два варианта:
1. Все узоры имееют толщину меньше диаметра фрезы, тогда все просто:
2. Контур толще диаметра фрезы:
Вот тут возникают проблемы см рисунок:
Проблемы обработки цилиндром - это проблема обработки площади, нужно доделать выход фрезы во всех углах. Или можно просто уменьшить диаметр фрезы в настройках (но это сильно увеличит время обработки вплоть до двух раз!).
Проблему обработки конусом можно избежать вручную отрисовав контур угла. Это плохое решение и нужно придумать что-то еще.
По идее, вместо конуса можно использовать любую фигурную фрезу. Для этого нужно будет реализовать замену переменной в функции вычисления заглубления:
Пусть ширина контура = w, нужно найти глубину d, также задана функция f(w) которая описывает форму фрезы.
Тогда глубина будет ровна f(w). Единственная проблема: нужно учитывать f(w) во время аппроксимации ширины контура.
Для конусной фрезы f(w) = tg(a/2)*w/2 где а - угол конуса, для сферы f(w) = sqtr(r^2-w^2)/2, где r - радиус сферы.
Просто найти среднюю линию контура = траекторию инструмента не удалось .
Простое усреднение всех контрольных точек дает неправильный результат.
Если мы усредняем контрольные точки, то получившаяся линия будет равноудалена от исходных контуров хитрым образом: если nl - новая линия, rl и ll - правая и левая линия, то для каждого сегмента этих линий:
расстояние от nls(t) до rls(t) равно расстоянию от nls(t) до lls(t). Но, к сожалению t у нас нелинейно по отношению к длине сегмента , поэтому результат не правильный.
Если ввести линейную интерполяцию обоих контуров, то по идее этот способ будет работать, но тогда траектория будет ломанной линией, потеряются все преимущества биарок.
Вот иллюстрации:
Хотя на некоторых контурах все выглядит хорошо:
Особо рисовать не умею, поэтому прошу после изменить мои почеркушки на адекватные...
Вложения
обходим контур "из бесконечности" (из абрисового прямоугольника-заготовки в вашем смысле) торцевой пальчиковой цилиндрической фрезой D. Получаем красную траекторию. Синим цветом обозначено ЧИСТОВОЕ КАСАНИЕ желаемого контура детали.
Штриховка + контур = путь фрезы диаметра D. Уберёт содержимое контура.
самый сложный и важный этап. Берём коническую фрезу (треугольник в сечении). Максимальный диаметр d (в точке C на рисунке). Из точки A (угловая точка) строим касательную (красная линия) и после этого среднюю линию (зелёная) из точки A в место максимального диаметра (или дальше, если очень длинная область была)
После построения обоих "средних линий" (зелёный цвет) останется "артефактное место" (синее озерцо) -- коническая фреза оставит бугорок, а цилиндрическая вовсе не дойдёт сюда.
"Не совсем" правильно. Есть уточнения:
1. треугольной фрезой надо проходить ТОЛЬКО там, где на первой картинке НЕТ синего цвета
2. проходить надо не по прямой, а по контуру детали с ПЕРЕМЕННЫМ отступом. Для расчёта средней линии (рис 3.зелёная) вместо касательной лучше брать синюю, повёрнутую на угол{зелёная, красная} - так будет красивее на больших длинах
3. Таким образом кроме редких случаев в каждом "носике" должно сходиться 2 средние линии (два прохода конусом - вдоль одной стороны и вдоль другой). Артефакт (рис 4.синее) появится там, где две средние линии широко разведены, а основная фреза (рис 1,2.красное) не дошла.
---
На тему задания глубины. Поясните, пожалуйста, какие есть варианты в Inkscape? В растровой программе всё понятно - пиксельная линия с переменным цветом (как одна из линий из серой карты глубины, Z-depth map). В векторной - либо переменный цвет линии (если это вообще возможно), либо линию нарезать на короткие кусочки разной ширины, либо точек разным цветом наставить, либо рис 3.синее и рис 3.красное нарезать на N сегментов (при большом числе можно отрезки прямых).
Пример - на этой картинке. Среднюю линию брать как линию, соединяющую все середины отрезков ([G1,G2][G2,G3][G3,G4]), каждый из которых имеет концами соответственные узлы Ri красной и Bi синей линии (сама желаемая траектория, она с отступом от чёрной линии объекта для наглядности сделана) и ГЛУБИНОЙ = половине длины такого отрезка (жёлтая). |RiGi|=|GiBi|.
Сказал сложно, но, надеюсь, разобраться можно. Насчёт целесообразности линии [G1,0] - не знаю, но, возможно, она необходима. "маленький штрих для красоты".
"рис 4.синее озеро" будет расположено примерно на месте точки R4. Таких зелёных линий будет две - одна от нижней чёрной части исходной картинки, другая от верхней. Причина существования чёрной синего озера - в т.R4 ни одна ни другая коническая фреза почти ничего не вырежут, а исходная рис 1.красная уже не достаёт сюда.
P.S. Только что заметил, что увлёкся и сделал ошибочную иллюстрацию! На самом деле: диаметр конической фрезы в самой толстой части = |R4,B4|=|R3,B3|=|R2,B2|. "нехватать" диаметра (необходимость вынимать фрезу из максимального заглубления) возникает только на отрезке [G2,G1], т.к. окружность {G1,|G4,B4|} уже пересекает верхнюю чёрную кривую, поэтому |B1,R1|<|B4,R4|, т.е. фреза поднимается вверх!
Вложения
рис.5
cone.jpg (20.71 КБ) 5756 просмотров
рис.5а
cone-new.jpg (41.46 КБ) 5752 просмотра
Последний раз редактировалось dormouse 27 фев 2010, 19:57, всего редактировалось 1 раз.
Приблизительно понятно...
В голове только с трудом все это представляется, как оно в итоге будет выглядеть... Правда у меня сейчас будет 3 часа в пробке на то чтобы это обдумать .
Карту высот можно задать битмапом. Т.е. просто вставить битмап в инкскейп и все.
Я вот тут подумал, а не логичнее ли будет делать такой уголок шариком? Тогда и борозды посередине не останется и края будут плавно закругляться...
Вот что пока наклепал: поиск траектории внутри контура. Это первая версия поэтому все очень коряво . Будем улучшать!