Я использую Inkscape в качестве дизайнера пользовательского интерфейса. Я хочу экспортировать каждую группу как один SVG, используя парсер python и визуализатор командной строки Inkscape, но у меня проблемы с координатами каждого объекта.
Например, у меня есть группа , которая представляет собой полное окно. Внутри этой группы у нас есть еще одна группа (например, кнопка закрытия ), которая включает контур, прямоугольник и эллипс.
И парсер создает дерево папок в зависимости от <g></g>
. Когда синтаксический анализатор «видит», <g></g>
он создает папку с именем <group ID>
и углубляется, пока не встретит <g root_img="true"></g>
. Все, что находится между <g....></g>
ними, обрабатывается как отдельный SVG и вызывает командную строку Inkscape для рендеринга и сохранения в формате *<group ID>*.png
.
Это то, что у меня есть.
[folder]Window
[image]close_btn.png
[image]title_bar.png
[folder]Products_list
[image]product_belt1.png
[image]product_belt3.png
[image]product_belt2.png
[folder]Advanced_options_window
[image]hide_btn.png
[image]title_aow_bar.png
[folder]Options
[image]opt1.png
[image]opt2.png
[image]opt3.png
Мне нужны значения координат, например:
close_btn 1250, 10
title_bar 0, 0
product_belt1.png 150, 150
Но как мне получить абсолютные координаты каждой группы?
РЕДАКТИРОВАТЬ: Можно ли сделать плагин, в котором я добавляю дополнительные аргументы [x=150, y=120] ко всем группам в XML?
Не решение, а его часть, идея
1 способ «полуавтоматический» Поместите прозрачный прямоугольник 1px с цветом метки #f1f2f300 в левый верхний угол группы и получите парсером координаты объекта метки .
2 способ «автоматический» Как я понимаю нужны абсолютные координаты из левого верхнего угла, например размер документа 1000х1000 пикселей документ, корневая группа (высота=100px) в левом нижнем углу, тогда у нее координаты х = 0 и y = 900. Корневая группа имеет подгруппу и у нее такие же координаты. Или нужны относительные координаты подгруппы? Пример корневой группы (0,900) подгруппы (0x0)?
Если вам нужны только абсолютные координаты, тут проще — парсить группу. Сравнивает координаты объектов внутри группы, нам нужен объект с наименьшими (x,y) координатами. Это позиция группы.
Но немного сложнее, когда inkscape добавляет параметр, например, transform="translate(0,-100)" . Появляется, когда группа сделала дубликат и изменила положение группы. Здесь необходимо сделать дополнения и усложнить логику.
Я делал что-то очень похожее несколько лет назад. Изучив множество различных вариантов анализа файлов SVG, я остановился на использовании html/javascript. В то время я просматривал файл SVG с помощью jQuery, но я уверен, что сегодня есть лучшие библиотеки (и было бы неплохо использовать безголовый браузер ).
Как только вы узнаете, какой элемент вам нужен, вы можете вызвать Element.getBoundingClientRect()
его, чтобы получить его абсолютные координаты.