Render.ru

Помогите написать скрипт экспорта в текст. Не безвозмездно.

-Ozzy-

Пользователь сайта
Рейтинг
2
#1
Не нашел тут форума по поиску писателей скриптов.
Мне надо экспортировать координаты точек на кривой (spline) в текстовый файл. в виде такой текстовой таблицы, примерно:
X100 Y100 W200
X101 Y102 W170
X102 Y104 W210
Где
x, y - координаты
w - ширина (width tool)

Такое возможно?
НЕ безвозмездно, готов обсудить.
 

-Ozzy-

Пользователь сайта
Рейтинг
2
#3
Алгоритм примерно такой:
1. Находим сплайн номер 1
2. Находим его начальную точку.
3. Считываем ее координаты XY, считываем параметр Width
4. Сохраняем эти три числа через пробел (плюс перевод строки) в строку файла out.txt
5. Находим точку удаленную на расстояние 2 мм вдоль этого сплайна
6. Если сплан не закончился, то переходим к п. 3
7. Если есть еще сплайны, то находим следующий сплайн и переходим к п. 2

И еще раз хочу сказать, я в скриптах не понимаю, поэтому алгоритм число теоретический и поэтому запросто готов компенсировать потраченное время.
Никаких изменений в текущий файл вносить не надо, визуализировать ничего не надо.
 

Вложения

M.O.Z.G

Знаток
Рейтинг
50
#4
А, всё, понял. Нет, с этим как раз затык. Дело в том, что Width Points - это самостоятельные точки, образующие в итоге так называемый профиль, никак не связанные с точками кривой, и могут быть, соответственно, в любом месте отрезка. Это раз.
Скрипты никак эти данные не получают, во всяком случае официальный скрипт референс Люстры никак их не описывает, ни в новых, ни в старых редакциях. Так что мы не можем передавать/получать их с помощью скриптов.

Однако, любопытство заставило провести меня небольшой эксперимент, в результате которого я пришёл к такому полу-извращенческому лайфхаку. Я расскажу, а ты уже смотри сам, на сколько это "совместимо в жизнью" в твоём случае:
  1. Люстра позволяет сохранять Width Points данные как профили. Все эти профили последовательно записываются в файл VariableWidthProfiles, с данными в шестандцатиричном формате.
  2. Из этих данных, декодировав, можно получить название профиля, и относительные координаты Width Points на кривой (0-1), и относительные размеры ширины к величине толщины кривой.
  3. Затем можно последовательно резать кривую на сегменты и замерять длину между точками, 0-1, 1-2, 2-3, т .д., из этих данных и общей длинны кривой высчитать относительные координаты каждой точки на кривой.
  4. Затем округилить эти данные, и данные из декодированного VariableWidthProfiles, так можно будет сопоставить точки кривой и Width Point, при условии, конечно, что Width Point был там расположен с небольшой погрешностью, и их количество в принципе совпадает с количеством точек кривой, что, к сожалению, может быть и не так, ибо человеческий фактор + возможные глюки. Во всяком случае, по своему опыту работы с Width Point, нет-нет, да какая-нибудь хрен и приключится.
  5. И уже в итоге расчитать толщину исходя из толщины кривой, например:
    мы знаем, что толщина кривой 18.993 пункта, из шестнадцатиричных данных мы извлекли значение второй Width Point 0.345538432982929. 18.993*0.345538432982929=6.56281145764477 пунктов ширина второй Width Point.
Естественно, я ещё ничего не писал под этом, просто проверил сохраняемость и зависимость этих данных, чтобы понять как они взаимодействуют.

И тут прикол в том, что автоматизировать можно только вычисления, так как если мы даже напишем парсер файла VariableWidthProfiles, и будем выгружать из него список, мы не сможем прочитать какой профиль к какой кривой сопоставлен, скрипты эту мету не видят. Тут можно, конечно, назначать каждому PathItem имя, сопоставимое с именем профиля.
Тогда сценарий будет таким:
  1. Именуем все PathItem, можно заскриптовать, например будет: CustomProfile_1, CustomProfile_2, ...
  2. Потом, уже вручную, сохраняем профиль каждой с тем же именем.
  3. Пишем парсер файла VariableWidthProfiles, который на выходе даст нам файла вида:
    profileName, widthPointsArray, widthPointsWidthArray
  4. Пишем парсер для документа, который на выходе даст:
    pathName, relativePointsPositionAlongCurveArray, strokeWidth, xPointsPositionArray, yPointsPositionArray
  5. И в него же, сразу, чтобы два раза не вставать (хотя по идее, можно и парсер файла VariableWidthProfiles записать туда же, в начало, просто выполняться будет дольше), дописываем функцию, которая берёт распарcенные данные из VariableWidthProfiles и для каждой точки в массиве, соответсвующему имени профиля, ищет и вычисляет значение ширины.
Так что, по сути, три скрипта получается, ибо один сбор данных невозможен технически + ручная подготовительная работа с документом, которая, в зависимости от объёма может быть внушительной, и нет никакой страховки от ошибок в данном случае.

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

З.Ы. Извиняюсь за словоблудие, просто закрепил придуманное описанием. Да и идея не тривиальная, возможно кого-нибудь из форумчан вдохновит на что-то) Ну, и в целом, даёт понимание, что такое Width Points, потому что, вот как Вы, например, ошибочно полагали, что там прямая связь с точками кривой.
З.Ы.Ы. Чего-то я тупанул, и шаг с высчитыванием относительных координат можно опустить, т.к. они идут последовательно, и при условии, что количество точек совпадает, этого делать не нужно. Ну оставлю всё-равно в тексте, потому что это уже такая брутальность, когда нам нужно было бы не просто найти точку, но и удостоверится, что она именно в той части отрезка, где мы ожидаем, что она должна быть. Как дополнительный уровень валидации - норм.
 
Последнее редактирование:

-Ozzy-

Пользователь сайта
Рейтинг
2
#5
Спасибо за подробное пояснение. Теперь я более конкретно представляю, что мне надо и в каком направлении смотреть.
Хоть прямого соответствия между точкой сплайна и width профиля нет. Но это (как я понял) легко вычисляется математически. Честно говоря устал и не совсем вник в нахождение соответствий кривых и профилей, завтра прочту еще раз.

А нет ли формата, в который может экспортить AI, и который содержит информацию о stroke-width?
 

-Ozzy-

Пользователь сайта
Рейтинг
2
#6
Да и идея не тривиальная, возможно кого-нибудь из форумчан вдохновит на что-то) Ну, и в целом, даёт понимание, что такое Width Points, потому что, вот как Вы, например, ошибочно полагали, что там прямая связь с точками кривой.
Ситуация действительно редкая. Я во-первых не нашел редакторов, которые предоставляют удобную работу со сплайном и его толщиной в определенных точках. Удобно это позволяет только AI, начиная с какой-то версии. А кое-как это можно делать в CorelDraw и IncScape.
А уж экспорт в табличную форму вообще ни один плагин не делает. Толь если в несколько шагов с помощью "костылей".

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

ps: а то я уж смотрю на сплайны с дисплейсом в 3ds max и варианты параметрического построения в houdini :)
 

M.O.Z.G

Знаток
Рейтинг
50
#7
А нет ли формата, в который может экспортить AI, и который содержит информацию о stroke-width?
Теоретически, может быть из EPSа что-то подобное можно выгрузить. Но надо вникать в особенности сохраняемого люстрой EPS. Там хранятся, как матрицы вектороного рисунка, в виде векторов, так и какая-то 16-ричная дата, и бинарные данные. И что-то подсказываем мне, что интересующие данные как раз в бинарной части, потому что Width Points - это не поддерживаемая нативно фича PostScript'а, и было бы странно, если бы она записывалась явно. Тем более, зная, что Люстра хранит эти данные в виде относительных чисел, и даже в собсвенных настройках почему-то кодирует в шеснадцатиричный формат, поэтому матрицы можно смело игнорировать.

Честно говоря устал и не совсем вник в нахождение соответствий кривых и профилей, завтра прочту еще раз.
Ну, может быть ещё я хаотично изложил, просто записывал по мотивам, проверял и тут же писал, так что повевстовательная часть хромая) Суть там была скорее не в том, сложно или легко это высчитать математически, математический-то высчитать можно всё) А в том, что не так просто эти данные собрать и сопоставить. Для этого надо городить огород, и ещё не слабо поработать руками. Что сводит на нет всю суть автоматизации подобного подхода. Плюс для каждого случая это надо делать сизнова.

ps: а то я уж смотрю на сплайны с дисплейсом в 3ds max и варианты параметрического построения в houdini :)
За написание такой программы или скрипта моя благодарность не будет знать границ в разумных пределах.
Хм, параметрическое построение в Худини... Вы ещё не забудьте про Sverchock для Блендера;) Было бы хорошо узнать, что в итоге должно вообще получиться из этого. Я просто пытаюсь понять как эти данные и именно в таком виде могут быть полезны. Ведь толщина нарастает не линейно от точки к точке. И казалось бы, какая тогда разница сколько и где у нас точек в самой кривой. Собственно, на практике оно так и работает, что в Inkscape, что в люстре. В Инке просто послабее.
Может быть Вы вообще не с той стороны подходите фундаментально.
Хм, чего-то Вы мне напомнили, а в Бледнере же тоже есть фунционал переменной толщины линии, причём там он как раз привязан к физическим вертексам. Это немножко не то, но раз уж Вы во все тяжкие пускаетесь)
 
Последнее редактирование:

-Ozzy-

Пользователь сайта
Рейтинг
2
#8
не так просто эти данные собрать и сопоставить. Для этого надо городить огород, и ещё не слабо поработать руками. Что сводит на нет всю суть автоматизации подобного подхода
Вот этого я и опасаюсь, Из этого я понимаю, что возможно будет проблема в сопоставлении. Поскольку в математике в большинстве случаев проблем нет.

как эти данные и именно в таком виде могут быть полезны. Ведь толщина нарастает не линейно от точки к точке. И казалось бы, какая тогда разница сколько и где у нас точек в самой кривой
Как они могут быть полезны - это секрет.
Но мне недостаточно знать координаты точек А и Б и ширину в точках А и Б. Мне надо знать все промежуточные значения с определенным, постоянным (или немного адаптивным) шагом. ДАЖЕ ЕСЛИ это линейная зависимость. Вот такие пироги.

ps: вернее знать я их знаю, но мне надо получить их в табличной форме. в итоге просто проблема конвертации в другой формат.

pss:
Хм, параметрическое построение в Худини
ну параметрическое оно сейчас почти везде, по крайней мере в половине случаем. Просто в houdini оно как-то супер-удобно-понятно-параметрическое, причем по-настоящему, с нормальными формулами, почти без ограничений :) Сразу скажу, всерьез Houdini не занимался.
 
Последнее редактирование:
Сверху