Inkscapeでエクステンションを自作する方法を試してみました。
とにかく動かしてみて、エクステンションを自作する流れを理解したいので、選択したオブジェクトのフィルを全部緑色に変更してしまうシンプルなエクステンションを作ってみました。
ファイルの置き場所
まずエクステンションのファイルを置く場所を調べます。環境設定のシステムという項目に表示されているフォルダがそれです。

例えば「C:\Users\xxxxx\AppData\Roaming\inkscape\extensions」のようなフォルダです。この下に勝手に作ったサブフォルダもInkscapeの起動時に読み込んでもらえるので、エクステンションをたくさん作りたい場合はサブフォルダごとに分けて整理することもできます。
名前を決める
次にエクステンションの名前(と関連する名前)を決めます。いくつかの名前が必要です。
- メニューに表示するラベル
- メニューを表示する上位メニューのラベル
- エクステンションのID
- エクステンションのコードのファイル名
- エクステンションのクラスのクラス名
このあと試しに作るエクステンションは「選択したオブジェクトのフィルの色を自動的に変える」ものにする予定なので、メニューに表示するラベルは「フィルの色を変える」、上位メニューは「◆◆ 自作 ◆◆」にしました(目立つように)。
エクステンションのIDは自分のサイトのドメイン名をひっくり返したものを使えばよいらしいので「com.blogspot.inkscape-memorandum.フィルの色を変える」にしました。
コードのファイル名は「フィルの色を変える(コード).py」に、クラス名は「ChangeFillExtension」にしました。全部同じ名前に揃えてもよさそうですが、ここはわざと違う名前を使ってみます。
Pythonファイルを作る
次のようなコードをテキストエディタを使って「フィルの色を変える(コード).py」というファイルに書き込みます。
class ChangeFillExtension(inkex.extensions.EffectExtension):
# ↑EffectExtensionクラスを継承
def add_arguments(self, pars):
pass # パラメータが渡されるけど無視
def effect(self): # 実行されると必ず呼び出される
for elem in self.svg.selection:
elem.style['fill'] = '#00ff00' # フィルに緑をセット
if __name__ == '__main__': # エクステンションはここから実行される
ChangeFillExtension().run()
このエクステンションで自動的に実行したい手順は、親クラスである「EffectExtension」のほうに定義されている「effect」というメソッドの中をオーバーライドする形で書きます。「effect」というメソッドはエクステンションが起動されると必ず呼ばれるメソッドなのだそうです。この例では選択されているオブジェクトそれぞれの「fill」という名前のスタイルに色をセットしています。
最後の2行はこの「フィルの色を変える(コード).py」というプログラムが直接起動された場合に「run」というメソッドを呼び出すようにしています。エクステンションの「決まり文句」のような位置づけのコードです。直接起動されたときは「__name__」という特殊な変数に「__main__」という値が自動的にセットされているので、その変数を参照して「run」を呼び出すかどうかを切り替えています。もしこのpyファイルが直接起動ではなく他のPythonコードで読み込まれたような場合は不必要な「run」の呼び出しが行われないようにしているそうです。
定義ファイルを作る
次に、定義ファイル(Extension Definition ファイル、拡張子は「.inx」)を作ります。
ファイル名はなんでもよさそうなので「フィルの色を変える(定義).inx」にします。
<inkscape-extension xmlns="http://www.inkscape.org/namespace/inkscape/extension">
<name>フィルの色を変える</name>
<id>com.blogspot.inkscape-memorandum.フィルの色を変える</id>
<effect>
<effects-menu>
<submenu name="◆◆ 自作 ◆◆"/>
</effects-menu>
</effect>
<script>
<command location="inx" interpreter="python">フィルの色を変える(コード).py</command>
</script>
</inkscape-extension>
この中でエクステンションの名前やID、どの上位メニューの下にメニューを表示するか、プログラムが何の言語で書かれているかとそのファイル名を書いておきます。
ファイルを置く
上に書いたフォルダの下に「test」というサブフォルダ(名前はなんでもいい)を作って、その下に「フィルの色を変える(コード).py」と「フィルの色を変える(定義).inx」の2つを置きます。単にファイルを置くだけですが、自作に限らず、どこかから入手したエクステンションを使いたいときも同じことをします。インストールと呼ぶほどの作業ではないです。
Inkscapeを起動する
エクステンションのファイルが増えたり減ったりしたときに、それをエクステンションメニュー以下に反映させるために、Inkscapeが停止している状態から起動させる(例えば一旦終了して起動しなおす)必要があります。起動しなおさなくても読み込んでくれる仕組みがあっても良さそうですが、エクステンションの増減なんてしょっちゅう起こることではないので、そこは省略したのかもしれません。
いちいち起動し直しが必要なのでエクステンションを自作するときは少しだけ面倒ですが、一度自作エクステンションがメニューに表示されるようになったら、そこからあとはInkscapeの再起動を行わずにプログラムを書き換えてもその後エクステンションを実行すると反映されているので、自作エクステンションを何回も書き換えることはそれほど負担ではないです。
メニューに表示される
Inkscapeを起動すると次のようにエクステンションメニューの下に自作のエクステンションが表示されます。

実行する
適当にいくつかオブジェクトを描いて、選択して、この自作エクステンションをメニューから実行すると、ちゃんと選択したオブジェクトのフィルが緑に変わります。

これで、細かいことを除けば、エクステンションを自作する手順はひととおり試すことができました。