2012-04-12 186 views
4

我正在寻找一种可能的快速方法来应用给定svg图形的所有变换矩阵。换句话说:该算法应删除所有“变换”属性并将图形的所有坐标转换为绝对坐标。应用所有变换矩阵

是他们的任何库可以做到这一点,或者是他们的SVGDomInterface方法吗?

编辑::

如果我叫了巩固的方法是这样的:

$.each(svg.find('path'), function(i){ 
     this.transform.baseVal.consolidate(); 
}); 

什么也不会发生,如果我这样称呼它:

$.each(svg.find('path'), function(i){ 
     this.transform.animVal.consolidate(); 
}); 

我得到这个错误:

error

那么,我应该如何使用“巩固”的方法,我应该在哪些元素上调用它?

问候 菲利普

+0

删除坐标的目的是什么? 如果你在“浏览器中”这样做,我假设你试图移动SVG容器的viewBox,或者发现SVG两部分的相对位置/大小 – 2016-05-07 08:02:54

回答

6

的巩固方法仅降低了矩阵的列表,以一个单一的矩阵。并且您在animVal示例中遇到的错误是因为您不允许修改动画值(合并破坏性地修改变换列表)。

为了回答你的问题,没有SVG DOM中的现有方法通过修改路径值等来应用变换.Inkscape(和Illustrator IIRC)中提供了用于应用这种变换的选项。

如果您正在寻找一个图书馆或工具来做到这一点,您可以尝试SVG Cleaner

6

SVG Cleaner似乎并不适用于我所有的转换,但Inkscape确实如此。下面是当我需要申请一个我用命令行:

inkscape copy-of-file.svg --select=id-of-node \ 
     --verb=EditCut --verb=EditPaste \ 
     --verb=FileSave --verb=FileClose 

假设你有“变换 - >店铺转型”设置在Inkscape中的首选项为“优化”(我相信这是在默认情况下),这将应用它并产生想要的结果。确保您在输入文件的副本上进行操作,因为该操作取代了原始文件!

如果您在Mac上运行此,您可能需要先做到这一点在你的shell:

alias inkscape=/Applications/Inkscape.app/Contents/Resources/bin/inkscape 
6

这里有一个的jsfiddle一些JavaScript库的代码(基于在Raphael.js一部分)烤在转换成所有路径的数据:

http://jsfiddle.net/ecmanaut/2Wez8/

(不知道有什么用Opera的在这里,虽然,它通常是在SVG类最好的,我可以以某种方式被绊了其他浏览器更宽容有关)

0

更好地使用EditPasteInPlace而不是EditPasteEditPaste粘贴在鼠标位置,这不是节点的位置。

0

为了检索相对于其他父DOM节点(例如SVG根容器)的路径,您可以在此处使用该技术。

它使用SVG.getTransformToElement来计算SVG树上的父节点和某个节点之间的变换。返回的对象包含返回变换的逆等的方法,以便用它做实际的事情。

How to determine size of Raphael object after scaling & rotating it?

我不知道你想实现什么,但是这必须做它的力量。