Координаты групп в Inkscape

Я использую 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?

Ответы (2)

Не решение, а его часть, идея

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()его, чтобы получить его абсолютные координаты.