1. Разные соображения
1.1
>P-t-G: ...у нового быстрее делается заглубление. Если все равно в каком направлении резать.
Я что-то не так описал, вероятно. Время горизонтального реза алмазом по мрамору на глубину 2 мм равно времени бокового реза на глубину 12мм. "заход по слоям" (как в приведённом ранее алгоритме) осуществляется на 20мм для D=10мм фрезы шагом depth step=2мм: общая длина=4*20мм+100мм (средняя длина контура)=180мм. Для послойного метода это 5*100=500мм, т.е. в 3 раза больше времени работа займёт!
1.2
>penetration(curve, tool) и реализовать заглубление на половину глубины по ходу движения, затем на половину против хода, причем если доходим до конца кривой разворачиваемся в обратную сторону.
Не для всех материалов возможно идти "по ходу реза". Часто НЕОБХОДИМО резать строго в определённом направлении. Единственная оптимизация, которую я адекватно вижу: вместо подъёма на Zsafe/G00 в начало кривой обходить в обратном направлении с максимальной скоростью в режиме G01, поднявшись на 0.5 мм от высоты реза.
1.3
Задача сортировки уже неплохо решена в пакете networx
http://networkx.lanl.gov/reference/algo ... paths.html , но я решил простейший вариант самостоятельно сделать, особенно учитывая его линейность O(n) вместо O(n³) для всех "честных переборов" и возможность раздельных точек входа и выхода. Так же - у меня будет добавлена "точка входа" и неравномерный масштаб по XY (т.е. "предпочтительность" какой-то из осей.).
1.4
Кривые в корень рисунка: надо понять по возможности срочно. Это не даёт реально пользоваться конечному потребителю. Т.е. файл .svg "ломается".
1.5
Оффсет по биарку на мой взгляд весьма привлекателен, т.к. все проверки становятся элементарными: дуга-дуга и дуга-отрезок, т.е. обычные квадратные уравнения вместо интегральных сходимостей. n^2 берётся из фразы "для каждого из n фрагментов проверить пересечения с оставшимися n другими фрагментами кривой" ? Если да, то для 1000 биарк-фрагментов получим всего миллион вычислений, что может оказаться быстрее 50 безье.
Так же мы работаем с реальными материалами => имеем "реальную точность" а не математическую до 15-ого знака. Вполне можно остановиться на delta=0.001 мм и с такой точностью биарк заменит исходную безье.
1.6
Ребята из команды Inkscape предлагают все атрибуты заменить на Inkscape-определённые, чтобы не плодить "новые тэги не по svg-стандарту". Похоже, подобную процедуру надо будет провести для всех наших дополнительных полей
Код: Выделить всё
dxfpoint="1"
заменить на
inkscape:dxfpoint="1"
1.8
Я экспериментировал с тем, какие тэги остаются неизменными после разгруппировывания и Shift+Ctrl+C: только id. В него можно вписать без проблем содержимое тэга "inkscape:original". Проблема в том, что тэг id уникальный сквозь весь SVG, поэтому надо делать не просто содержимое 'd', a id+d. Так можно получить уникальность. [всё это нужно для безусловного удаления артефактов]
2. В чём конкретно требуется помощь
2.1
Сделать честную функцию, возвращающую "начальный фрагмент биарк-кривой длиной L" вместо заглушки
Код: Выделить всё
def curve_deepen(curve,length):
out_curve=[]
if len(curve) > 2: out_curve=[curve[0]]+[curve[1]]+[[curve[1][4],'end',0,0]]
else: out_curve=curve
return out_curve
2.2
разобраться в сути проблем пункта 1.4. Придумать трактовку этого факта и способ борьбы. Моё предложение: переносить на нижний слой все пути "d" безусловно, с выдачей соответствующего Warning'a. Если вообще нижнего слоя нет - создавать.
Для этого функцию check_paths(paths) сделать:
1. Если вообще слоёв нет - создать хотя бы один (для добавления OR,tool_setup)
2. выделить из массива paths только полноценные "d" пути без групп и т.п., без inkscape:dxfpoint, без стрелок, OR, tool и т.п.
3. для всех paths проверить что они в слоях, если кто-то "не в слое вообще", то а)перенести его на нижний (с уведомлением) либо б)применять к нему правила будто он на нижнем слое.