Есть нарисованный рисунок в SVG. Для моей задачи нужно получить список ограничивающих прямоугольников объектов (например, идентификатор, координаты угла прямоугольника, ширина, высота, задающие параметры прямоугольника). Есть ли возможность сделать это автоматизированно, чтобы вручную не выписывать эти параметры?
На рисунке нужные прямоугольники показаны прерывистой линией:
Ответ
Нашёл ответ, который меня устроил - я смог получить те координаты ограничивающих прямоугольников, которые я вижу в редакторе 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
Комментариев нет:
Отправить комментарий