提取SVG值并将它们除以1000

时间:2013-01-16 04:20:10

标签: ruby svg

我在像209499.728041这样的XML文件中有SVG值:

 <path id="dwg-object-136" d="M 209499.728041,19994.245007 209499.728041,27254.245007" style="fill:none;stroke:blue;strok    e-width:4px" />
 <path id="dwg-object-137" d="M 220719.728041,27254.245007 220719.728041,18564.245007" style="fill:none;stroke:blue;strok    e-width:4px" />
 <path id="dwg-object-138" d="M 220719.728041,19994.245007 209499.728041,19994.245007" style="fill:none;stroke:blue;strok    e-width:4px" />
 <path id="dwg-object-209" d="M 214304.728041,35614.245007 A 2000.000000,2000.000000 0 0 0 212304.728041,37614.245007" fi    ll="none" stroke="blue" stroke-width="0.100000" />
 <path id="dwg-object-210" d="M 230819.728041,37614.245007 A 2000.000000,2000.000000 0 0 0 228819.728041,35614.245007" fi    ll="none" stroke="blue" stroke-width="0.100000" />
 <path id="dwg-object-211" d="M 216007.728041,39574.245007 216007.728041,35614.245007" style="fill:none;stroke:blue;strok    e-width:4px" />

有没有办法将所有这些值除以1000,以便209.499728041

1 个答案:

答案 0 :(得分:2)

如果您只想让SVG内容以1/100比例显示在文件中,最简单的方法是将它们包装在一个公共转换中:

<g transform="scale(0.01)">
  <!-- all your paths here -->
</g>

但是,如果你真的想修改路径数据,你可以使用SVG DOM来实现:

// Untested code
function scalePath( path, scaleFactor ){
  var scalable = ['x','y','x1','y1','x2','y2','r1','r2'];
  for (var i=0,segs=path.pathSegList,len=segs.numberOfItems;i<len;++i){
    var seg = segs.getItem(i);
    for (var j=scalable.length;j--;){
      var prop = scalable[j];
      if (prop in seg) seg[prop] *= scaleFactor;
    }
  }
}

请注意,这(理想情况下)不会触及arc-to命令的anglelargeArcFlagsweepFlag属性。

你可以通过打开段的pathSegTypeAsLetter属性并扩展每个段类型的正确属性来使上面的代码稍微提高性能,但是我太懒了,计算机很快。 / p>

如果你这样做是为了在序列化中保存字节,你可能想要舍入值:

if (prop in seg) seg[prop] = Math.round(seg[prop]*scaleFactor);