0

次のようなXMLファイルにSVG値があります209499.728041

 <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か?

4

1 に答える 1

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 コマンドのanglelargeArcFlag、またはsweepFlagプロパティに影響を与えないことに注意してください。

セグメントのプロパティをオンにして、セグメントの種類ごとに適切なプロパティをスケーリングすることで、上記のコードのパフォーマンスをわずかに向上させることができますがpathSegTypeAsLetter、私は怠け者であり、コンピューターは高速です。

シリアル化でバイトを節約するためにこれを行っている場合は、おそらく値を丸めたいと思うでしょう:

if (prop in seg) seg[prop] = Math.round(seg[prop]*scaleFactor);
于 2013-01-16T17:56:16.573 に答える