Страницы

Поиск по вопросам

понедельник, 22 октября 2018 г.

Получение списка ограничивающих прямоугольников для объектов SVG

Есть нарисованный рисунок в SVG. Для моей задачи нужно получить список ограничивающих прямоугольников объектов (например, идентификатор, координаты угла прямоугольника, ширина, высота, задающие параметры прямоугольника). Есть ли возможность сделать это автоматизированно, чтобы вручную не выписывать эти параметры?
На рисунке нужные прямоугольники показаны прерывистой линией:
image/svg+xml


Ответ

Нашёл ответ, который меня устроил - я смог получить те координаты ограничивающих прямоугольников, которые я вижу в редакторе Inkscape. Как ни странно в этом помогла сама программа Inkscape, а точнее - возможности программы в режиме командной строки. У этого режима много параметров, но для решения моего вопроса пригодился единственный - это "--query-all".
Например, имя файла с рисунком - example.svg.
Порядок действий такой:
Запускаем режим командной строки операционной системы; Переходим в папку, где лежит рисунок; Выполняем команду для Windows(путь к файлу inkscape.com уточняйте для своей системы):
"C:\Program Files\Inkscape\inkscape.com" example.svg --query-all>example.txt
для Ubuntu:
inkscape example.svg --query-all>example.txt
В результате нужная информация будет выведена в файл example.txt. Вот содержимое файла, который я получил в результате этой операции (кажая строчка в формате id,X,Y,ширина,высота):
Windows:
svg8,28.521432,73.716034,263.00711,270.66968 layer1,28.521432,73.716034,263.00711,270.66968 rect816,161.42855,232.85714,130.1,111.52857 path818,28.521432,252.90715,61.528569,67.242858 path820,82.402299,73.716034,177.81245,132.3059
Ubuntu:
svg8,26.738842,69.108782,246.56917,253.75282 layer1,26.738842,69.108782,246.56917,253.75282 rect816,151.33927,218.30357,121.96874,104.55804 path818,26.738842,237.10046,57.683033,63.040179 path820,77.252155,69.108782,166.69917,124.03678
Размеры объектов на первый взгляд получились различными и в непонятных единицах, но для вывода использовались разные версии Inkscape, а Inkscape недавно перевели с разрешения 90 dpi на разрешение 96 dpi. Я понял, что это цифры в пикселях с соответствующим разрешением.
Пересчитаем координаты и размеры в мм для windows и ubuntu, взяв разрешения 96 и 90 соответственно. Считаем по формуле Xmm=Xpix/dpi*25.4.
Windows:
svg8,7.54629555,19.504034,69.58729785,71.61468617 layer1,7.54629555,19.504034,69.58729785,71.61468617 rect816,42.71130385,61.61011829,34.42229167,29.50860081 path818,7.54629555,66.91501677,16.27943388,17.79133951 path820,21.80227494,19.504034,47.04621073,35.00593604
Ubuntu:
svg8,7.546295409,19.50403403,69.58729909,71.61468476 layer1,7.546295409,19.50403403,69.58729909,71.61468476 rect816,42.71130509,61.61011864,34.42228884,29.5086024 path818,7.546295409,66.91501871,16.27943376,17.79133941 path820,21.80227486,19.50403403,47.0462102,35.00593569
Получились практически идентичные значения, различающиеся только с 6-го знака после плавающей точки. Но здесь координаты - с началом отсчёта от верхнего левого угла листа и осью Y направленной вниз.
Чтобы получить координаты объектов, как их показывает InkScape (ось Y направлена вверх, отсчёт от нижнего левого угла листа), нужно Y заменить результатом вычитания Y и высоты объекта из высоты листа (высоту листа можно посмотреть в редакторе, в самом файле SVG, либо добавить прямоугольник, ограничивающий лист. В последнем случае высоту листа можно будет найти в первой строчке вывода).
Я взял высоту листа из диалогового окна. И в результате получил значения, которые показывает InkScape, учитывая что он округляет до 3-го знака после запятой.
svg8,7.54629555,6.047619838,69.58729785,71.61468617 layer1,7.54629555,6.047619838,69.58729785,71.61468617 rect816,42.71130385,6.047620896,34.42229167,29.50860081 path818,7.54629555,12.45998372,16.27943388,17.79133951 path820,21.80227494,42.65636996,47.04621073,35.00593604

Комментариев нет:

Отправить комментарий