5

与えられたsvg-graphicのすべての変換行列を適用するためのおそらく速い方法を探しています。言い換えると、アルゴリズムはすべての「変換」属性を削除し、グラフィックのすべての座標を絶対座標に変換する必要があります。

これを実行できるライブラリはありますか、それともそれを実行できるSVGDomInterfaceメソッドはありますか?

編集::

このようにconsolidateメソッドを呼び出すと:

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

私がこのように呼んだ場合、何も起こりません:

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

このエラーが発生します:

エラー

では、「統合」メソッドをどのように使用すればよいのでしょうか。どの要素で呼び出すのでしょうか。

あいさつフィリップ

4

5 に答える 5

8

これは、変換をすべてのパスのデータに焼き付けるための JavaScript ライブラリ コード (一部は Raphael.js に基づく) を含む jsFiddle です。

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

(ただし、ここで Opera がどうなっているのかはわかりません。通常は、SVG でクラス最高です。他のブラウザがより寛容な方法でつまずいている可能性があります。)

于 2012-07-09T07:24:28.047 に答える
7

consolidate メソッドは、行列のリストを 1 つの行列に減らすだけです。animVal の例で発生するエラーは、アニメーション化された値を変更することが許可されていないためです (consolidate は変換リストを破壊的に変更します)。

あなたの質問に答えるには、SVG DOM には、パスなどの値を変更して変換を適用する既存の方法はありません。Inkscape (および Illustrator も IIRC) には、そのような変換を適用するためのオプションがあります。

これを行うライブラリまたはユーティリティを探している場合は、SVG Cleanerを試すことができます。

于 2012-04-13T09:17:47.050 に答える
6

SVG Cleaner はすべての変換を適用するようには見えませんでしたが、Inkscape は適用します。適用する必要があるときに使用するコマンドラインは次のとおりです。

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

inkscapeの設定で「変換->変換の保存」が「最適化」に設定されていると仮定すると(デフォルトでオンになっていると思います)、これが適用され、必要な結果が生成されます。操作によって元のファイルが置き換えられるため、必ず入力ファイルのコピーを操作してください。

これを Mac で実行している場合は、最初にシェルでこれを実行することをお勧めします。

alias inkscape=/Applications/Inkscape.app/Contents/Resources/bin/inkscape
于 2012-06-08T00:44:02.373 に答える
0

他の親 DOM ノード (SVG ルート コンテナなど) に関連するパスを取得するには、ここでこの手法を使用できます。

親と SVG ツリー上のノード間の変換を計算する SVG.getTransformToElement を使用します。返されたオブジェクトには、変換の逆を返すメソッドなどが含まれており、それを使って実用的なことを行います。

Raphael オブジェクトのスケーリングと回転後にサイズを決定する方法は?

あなたが何を達成しようとしているのか正確にはわかりませんが、これにはそれを行う力があります。

于 2016-05-07T08:06:05.330 に答える
0

EditPasteの代わりにEditPasteInPlaceを使用することをお勧めします。EditPasteは、ノードの場所ではないマウスの場所に貼り付けます。

于 2013-02-17T01:07:52.350 に答える