在python中绘制svg,路径不是形状或转换它们

时间:2016-08-26 11:29:25

标签: python svg

我正在制作显微镜滤镜生成器,首先绘制svg图像,然后将它们转换为3D以进行3D打印。

我使用了' svgwrite'

然而,这个librayry生成带有形状(线,圆等)的svg,当时我还不知道,但是每个3D转换图书馆/软件都需要svg来包含路径。

是否存在使用路径生成svg文件的librayry(但允许我在脚本中轻松绘制圆圈,线等?)

或者有没有办法将这些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:请注意我必须这样做,因为我打算生成很多过滤器。

2 个答案:

答案 0 :(得分:3)

我已经为自己的需要编写了一些东西,用SVG元素处理一些类似的任务,比如评估边界框,转换等等。因此,对于我来说,实现这样的转换似乎相对简单。你所需要的只是知道什么路径&#34; d&#34;属性包括 - 实际上有一个行列,eliptical arcs和bezier曲线(你甚至不需要最复杂的latter)。如果您对自定义此问题感兴趣,请参阅此有用的教程 - http://tutorials.jenkov.com/svg/path-element.html

但是当我开始回答你时,我发现了一个最近可以使用的库,它看起来非常适合你的需要。

可以使用&#34; pip install svgpathtools&#34; (见那里的手册) - 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 = Path(*segemnts)  # segments are decribed above - Line(), Arc(), etc

现在你可以获得path.d()字符串并使用你想要的属性(笔画,笔画宽度等)构建一个XML表示,因为主要的svg-path数据完全存储在&#34; d&#34;属性,你已经拥有的值。

此外,您推荐的 svgwrite lib也提供了构建XML表示的方法

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

甚至 svgpathtools 本身也有它(我还没有想到它的所有优点)

如果仍然没有答案,请在评论中询问我。

答案 1 :(得分:0)

使用MoveTo / LineTo / EllipticalArc,Line和Circle可以直接转换为Path实体。

在Xml源代码中替换这些行并使用自制脚本保留所有其余内容应该不是很重要。