Inkscapeでエクステンションを自作する方法を試してみました。
ここでは、新規のオブジェクトを生成してキャンバス上に追加するエクステンションを作ってみました。
Inkscapeを使って手で描くSVGオブジェクトの種類ごとにPythonのオブジェクトクラスが用意されているので、描きたいSVGオブジェクトに合わせてPythonオブジェクトを生成します。
試しに「矩形」「楕円」「ベジエ曲線」をエクステンションで生成して描いてみました。
import inkex
import sys
import sys
class DrawObjectExtension(inkex.extensions.EffectExtension):
def effect(self):
# 矩形オブジェクト
rect = inkex.elements._polygons.Rectangle(x='10', y='10', width='30', height='20')
rect.style = 'fill:none;stroke:#F00;stroke-width:3.0'
# 楕円オブジェクト
el = inkex.elements._polygons.Ellipse.new(center=(50,40), radius=(30,20))
el.style = 'fill:none;stroke:#00F;stroke-width:1.0'
# パスオブジェクト
path = inkex.elements._polygons.PathElement()
path.set('d','M 42,49 C 57,39 62,27 54,11 78,15 86,27 87,42')
path.style = 'fill:none;stroke:#0F0;stroke-width:2.0'
# レイヤ上にオブジェクトを並べる
self.svg.get_current_layer().add(rect, el, path)
if __name__ == '__main__':
DrawObjectExtension().run()
パラメータは特に指定できるようにしていないので、effect()メソッドだけ書いています。
その中で、Rectangleオブジェクト、Ellipseオブジェクト、PathElementオブジェクトの3つを生成して、最後にレイヤ上にadd()メソッドで追加しています。
スタイルの設定値やパスの座標値は、SVG形式として記述される書式の文字列をそのままセットしています。
わかりにくいなあと思う点もいくつかありました。例えば、オブジェクトを生成するところでは、コンストラクタを呼び出す場合とnew()メソッドを使う場合と空っぽのオブジェクトを生成しておいてset()メソッドで形をセットする場合に分かれていて、統一感がないと感じます。Pythonの言語上の制約があるのかもしれません。
実行すると次のようにキャンバス上に3つのオブジェクトが追加されます。
