рисование svg в python с путями, а не фигурами или их преобразование

Я делаю генератор фильтра микроскопа, сначала он рисует изображение svg, затем они преобразуются в 3D для 3d-печати.

я использовал 'svgwrite'

однако эта librayry генерирует svg с фигурами (линия, круг и т. д.), В то время я не знал, но каждое 3D-преобразование librayry/softwares нуждается в svg, чтобы содержать путь.

есть ли librayry, который генерирует svg-файлы с path (но позвольте мне в скрипте легко рисовать круги, линии и т. д.)?)

или есть способ преобразовать эти SVG-фигуры в svg-путь?

пример моего текущего svg с формой:

<?xml version="1.0" encoding="utf-8" ?>
<svg baseProfile="tiny" height="100%" version="1.2" width="100%" xmlns="http://www.w3.org/2000/svg" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs />
<circle cx="270" cy="270" fill="white" r="135.0" stroke="black" stroke-width="10" />
<circle cx="270" cy="270" r="25.0" />
<line stroke="black" stroke-width="10" x1="270" x2="270" y1="270" y2="135.0" />
<line stroke="black" stroke-width="10" x1="270" x2="405.0" y1="270" y2="347.9423" />
<line stroke="black" stroke-width="10" x1="270" x2="135.0" y1="270" y2="347.9423" />
</svg>

спасибо.

PS: обратите внимание, что я должен сделать это programaticaly, потому что я намерен генерировать много фильтров.

2 ответов


Я уже написал некоторые вещи для моих собственных нужд для обработки некоторых подобных задач с элементами SVG, таких как оценка ограничивающих ящиков, преобразований и так далее. Таким образом, эта задача кажется мне относительно простой для реализации такого преобразования. Все, что вам нужно для этого, это только знание того, из чего состоит атрибут путей "d" - на самом деле есть список линий, элиптических дуг и кривых Безье (вам даже не нужны самые сложные латтеры). Увидеть этот полезный учебник, если вы заинтересованы в настройке этого -http://tutorials.jenkov.com/svg/path-element.html

но когда я начал отвечать вам, я нашел недавнюю готовую к использованию библиотеку, которая, кажется, идеально подходит для вас.

он доступен с помощью "pip install svgpathtools" (см. руководство там) -https://pypi.python.org/pypi/svgpathtools/

таким образом, вы можете изначально создавать объекты высокого уровня, как

Line(start, end)
Arc(start, radius, rotation, large_arc, sweep, end) 
# See docstring for a detailed explanation of these parameters, 
# but you're definetely able to create cirlces that way

и затем просто сделайте из них объект пути высокого уровня

path = Path(*segemnts)  # segments are decribed above - Line(), Arc(), etc

Теперь вы можете получить путь.D () строкой и просто постройте XML-представление, используя нужные атрибуты (штрих, ширину Штриха и т. д.), Так как основные данные svg-пути хранятся именно в атрибуте "d", значение которого у вас уже есть.

кроме того, привлеченный svgwrite lib также уже предоставляет Способ построения XML-представления

svgwrite.path.Path(d=path.d(), stroke='black', **extra)  
# **extra is every other common SVG attribute as keyword arguments

наверное, даже svgpathtools сам имеет его (я еще не понял всех его преимуществ)

спросите меня в комментарии, пожалуйста, если что-то все еще без ответа.


линия и круг имеют простой перевод на объект пути, используя MoveTo/LineTo/EllipticalArc.

не должно быть много, чтобы просто заменить эти строки в источнике Xml и сохранить все остальное, с помощью домашнего скрипта.