【问题标题】:Get absolute coordinates for rotation of Inkscape SVG elements获取 Inkscape SVG 元素旋转的绝对坐标
【发布时间】:2013-07-07 02:28:49
【问题描述】:

我正在使用 wxPython 为最终将成为嵌入式设计的项目制作一些显示界面的原型。由于我们正在与图形设计师进行迭代,因此让他们在 Inkscape 这样的所见即所得编辑器中工作比不断重写 2D 图形绘图调用要容易得多。对于需要动画或动态文本的元素,SVG 元素可以通过 ID 轻松识别,以便在渲染之前以编程方式更新它们。渲染流程如下所示:

Inkscape SVG as XML --> Python modification of XML --> Drawing onto wxPython buffered canvas using Cairo and pyRSVG

我想为一个围绕固定轴的旋转指针制作动画,以用于量规。为了定义针,图形设计师绘制图形“needle”和一个“needle_axis”元素,它是一个小圆圈。然后,我想我可以使用所需的角度和“needle_axis”的中心坐标来设置变换属性。但是,由于其他变换可能会影响相对位置,因此确定旋转轴的绝对位置并非易事。

我似乎找不到用于确定元素绝对坐标的 Python 库,感觉就像重新发明轮子来尝试实现 SVG 规范的一部分。有必要计算它。 rsvg API 提到了 rsvg_handle_get_dimensions_subarsvg_handle_get_position_sub 函数来获取元素的尺寸和位置,但我找不到 pyRSVG 的 API。

有没有比手动计算更好的方法来找到旋转轴?一个示例Inkscape SVG file and test snippet 可作为要点提供。

【问题讨论】:

  • 尝试做类似的事情,找到了一个 Python 扩展库函数simpletransform.py - 但它在我安装的 InkScape 的 Deprecated 文件夹中,并且无法导入(没有大量工作)。

标签: python svg inkscape


【解决方案1】:

如果我理解正确,您有针的坐标和旋转轴坐标,并且您想以编程方式更改针的“角度”,然后相应地更改 SVG 文件中针的形状?

我认为这是一个非常糟糕的主意:对 SVG 进行更改、保存然后渲染“新 SVG”将占用太多资源,这正是如此简单的任务看起来复杂的原因。

相反,解析您的 SVG 一次(例如,使用 lxml,只需执行一些 XPATH 查询就可以轻松提取坐标)并将您的形状构建到模型中(例如 Needle 类,与路径和中心),然后使用Cairo 变换简单地旋转该针。他们已经提供了一个rotate 函数,可以满足您的需求!

【讨论】:

  • 您能否提供更多关于如何提取坐标的详细信息?我实际上开始按照这些思路做一些事情,但意识到我必须重新实现所有关于转换和绝对/相对坐标的 SVG 规范。实际上,我只是通过修改帧之间的 SVG XML 来获得“足够好”的帧速率。这避免了这个文件 I/O,它有帮助但仍然看起来很脏,因为它涉及 pyRSVG 每帧重新解析整个树。
  • 确实,如果您的 SVG 软件没有在坐标上“应用”转换并将它们保留为 SVG 转换,那么您可能会遇到一些问题。但我认为您可以在 Inkscape 上强制执行相反的行为。然后,您将“只需”从 SVG 路径构建开罗路径 (cairographics.org/manual/cairo-Paths.html)。不是那么很难,但您仍然需要阅读有关路径的 SVG 规范:w3schools.com/svg/svg_path.asp
  • 你可以强制 Inkscape 在不使用相对坐标的情况下导出,但我还没有找到一个选项来阻止在所有情况下使用转换。我同意将 SVG 数据放入开罗路径或负责生成开罗路径的某个对象会更好,但会留下问题,因为我认为不必有“自己动手”翻译需要此功能的每个人的代码。
猜你喜欢
  • 1970-01-01
  • 2013-09-04
  • 1970-01-01
  • 2013-10-09
  • 2019-01-29
  • 1970-01-01
  • 1970-01-01
  • 2021-11-21
  • 2015-05-05
相关资源
最近更新 更多