2013-07-09 6 views
7

InkscapeのSVGの要素の回転のための絶対座標を取得します。グラフィックスデザイナーと繰り返しているので、InkscapeのようなWYSIWYGエディターで2Dグラフィックスの描画呼び出しを常に書き直すよりもはるかに簡単です。アニメーションや動的テキストを必要とする要素の場合、SVG要素はIDで容易に識別できるので、レンダリング前にプログラムで更新することができます。レンダリングの流れは次のようになります。は私が最終的に埋め込まれたデザインになりますプロジェクトのためのいくつかのディスプレイ・インタフェースのプロトタイプを作成するためのwxPythonを使用しています

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

私はゲージのために固定された軸を中心に揺動針をアニメーション化したいと思います。針を定義するために、グラフィックスデザイナは、グラフィカルな「針」と小さな円である「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が要点として利用可能です。

答えて

-1

私が正しく理解している場合は、針の座標と回転軸座標を持っていて、プログラム的に、針の「角度」に変更し、それに応じてSVGファイルに針の形状を変更したいですか?

私はこれは本当に悪いアイデアだと思います。このような単純なタスクが複雑と思われる理由を正確に、SVGに変更を加え保存して、「新しいSVG」をレンダリングすることはあまりressourcesを取ると、あるでしょう。

代わりに、一度あなたのSVGを解析する(例えば lxmlを使用して、それだけでいくつかの XPATHクエリを実行して座標を抽出するためにケーキの一部だ)

とパスと中心としたモデル(例えばNeedleクラスにあなたの形状を構築)その後、単に針をCairoの変換を使用して回転させます。彼らはすでにあなたが探しているものを行うrotate機能を提供しています!

+0

座標を抽出する方法の詳細を教えてください。私は実際にこれらの行に沿って何かをやり始めましたが、変換と絶対/相対座標に関するSVG仕様のすべてを再実装する必要があることに気付きました。私はフレーム間でSVG XMLを変更するだけで、実際には十分に良いフレームレートを得ています。これは、このファイルI/Oを回避しますが、pyRSVGにはツリーごとにツリー全体を再解析する必要があるため、依然として問題はありません。 – superlou

+0

SVGソフトウェアが座標に変換を適用せず、それらをSVG変換として残しておけば、いくつかの問題が発生する可能性があります。しかし、私はあなたがInkscapeで反対の動作を強制することができると思います。次に、SVGパスからカイロパス(http://www.cairographics.org/manual/cairo-Paths.html)を構築する必要があります。ない**その**難しいが、あなたはまだパスについてSVGの仕様を読んでする必要があります:http://www.w3schools.com/svg/svg_path.asp – halflings

+0

あなたは相対座標を使用せずにエクスポートするInkscapeのを強制することができますが、私すべての状況下でトランスフォームを使用できないようにするオプションが見つかりませんでした。私は、カイロのパスやカイロのパスを生成するためのオブジェクトにSVGのデータを取得する方が良いだろうと私は同意するが、私はそこに "ロール - あなた自身の"翻訳する必要があるとは思わないので質問を開いたままになりますこの機能を必要とするすべての人のためのコード。 – superlou

関連する問題