Подтвердить что ты не робот

Анализатор Python SVG

Я хочу проанализировать SVG файл, используя python, для извлечения координат/путей (я считаю, что это указано под идентификатором пути, в частности, d = "..." /" > ). Эти данные в конечном итоге будут использованы для управления 2-осевым ЧПУ.

Я искал SO и Google для библиотек, которые могут возвращать строку таких путей, поэтому я могу ее проанализировать, но безрезультатно. Существует ли такая библиотека?

4b9b3361

Ответ 1

Игнорируя преобразования, вы можете извлечь строки пути из SVG следующим образом:

from xml.dom import minidom

doc = minidom.parse(svg_file)  # parseString also exists
path_strings = [path.getAttribute('d') for path
                in doc.getElementsByTagName('path')]
doc.unlink()

Ответ 2

Получение d-строки может выполняться в строке или двух с помощью svgpathtools.

from svgpathtools import svg2paths
paths, attributes = svg2paths('some_svg_file.svg')

paths - это список объектов пути svgpathtools Path (содержащих только информацию о кривой, без цветов, стилей и т.д.). атрибуты - это список соответствующих объектов словаря, сохраняющих атрибуты каждого пути.

Чтобы, скажем, распечатать d-строки, тогда...

for k, v in enumerate(attributes):
    print v['d']  # print d-string of k-th path in SVG

Ответ 3

Речь шла о извлечении строк пути, но в конце концов были нужны команды рисования линий. Основываясь на ответе с помощью minidom, я добавил синтаксический анализ пути с помощью svg.path, чтобы сгенерировать координаты рисования линий:

#!/usr/bin/python3
# requires svg.path, install it like this: pip3 install svg.path

# converts a list of path elements of a SVG file to simple line drawing commands
from svg.path import parse_path
from xml.dom import minidom

# read the SVG file
doc = minidom.parse('test.svg')
path_strings = [path.getAttribute('d') for path
                in doc.getElementsByTagName('path')]
doc.unlink()

# print the line draw commands
for path_string in path_strings:
    path = parse_path(path_string)
    for e in path:
        if type(e).__name__ == 'Line':
            x0 = e.start.real
            y0 = e.start.imag
            x1 = e.end.real
            y1 = e.end.imag
            print("(%.2f, %.2f) - (%.2f, %.2f)" % (x0, y0, x1, y1))