【问题标题】:drawing svg in python with paths not shapes or convert them在 python 中使用路径而不是形状绘制 svg 或转换它们
【发布时间】:2017-01-03 01:36:12
【问题描述】:

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

我用过'svgwrite'

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

是否有一个库可以生成带有路径的 svg 文件(但允许我在脚本中轻松绘制圆圈、线条等?)

或者有没有办法将这些 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:请注意,我必须以编程方式执行此操作,因为我打算生成很多过滤器。

【问题讨论】:

    标签: python svg


    【解决方案1】:

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

    用自制的脚本替换 Xml 源代码中的这些行并保留所有其他行应该没什么大不了的。

    【讨论】:

      【解决方案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 = Path(*segemnts)  # segments are decribed above - Line(), Arc(), etc
      

      现在您可以获取 path.d() 字符串并使用所需的属性(笔画、笔画宽度等)构建 XML 表示,因为主要的 svg 路径数据完全存储在“d”属性中,你已经拥有了哪个值。

      此外,您提到的 svgwrite 库也已经提供了一种构建 XML 表示的方法

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

      可能甚至 svgpathtools 本身也有(我还没有弄清楚它的所有优点)

      如果还有什么问题没有得到解答,请在评论中问我。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-16
        • 1970-01-01
        • 2015-04-19
        相关资源
        最近更新 更多