お絵描きソフトInkscape(インクスケープ)の使い方を初級レベルから上級レベルまで広く紹介しています。
情報追加のリクエストや分かりにくい点があれば下のCONTACTフォームからどうぞ。

Inkscapeの自作エクステンション(任意の属性を設定)

 Inkscapeでエクステンションを自作する方法を試してみました。

 このエクステンションでは、ダイアログを表示して、そこで好きな属性名と属性値が指定されると、選択状態のオブジェクトに対してその属性を追加します。さらにオプションとして「追加」ではなく「削除」をダイアログ上で選択して実行すると、その属性名の属性を削除します。

 このエクステンションはあくまでもサンプルですが、一連のオブジェクトに共通の属性をセットしておくことで、あとで検索機能を使ってまとめて選択することが可能になるなど、実用的な面もあると思います。

 属性を追加したり削除したりするコードは単純です。SvgDocumentElementクラスのset()とpop()という2つのメソッドを呼び出すだけです。

 また、オプション指定するためのラジオボタンをダイアログ上に表示するには<optiongroup>という要素を使いますが、ここに細かいコツがあって、その<optiongroup>要素のgui-textという属性に何かしらの文字列を指定して、ラジオボタンのグループの横にラベルを表示するようにしないと、ラジオボタン自体がダイアログに表示されない(理由はわかっていません)ので、必ずgui-text属性を指定するようにします。

 まず「Extension Definition ファイル」では次のように書きます。

<?xml version="1.0" encoding="UTF-8"?>
<inkscape-extension xmlns="http://www.inkscape.org/namespace/inkscape/extension">
  <name>属性セット</name>
  <id>com.blogspot.inkscape-memorandum.属性セット</id>
  <param name="attribute_name" type="string"
    gui-text="属性名">aaa</param>
  <param name="attribute_value" type="string"
    gui-text="属性値">bbb</param>
<param name="method" type="optiongroup" appearance="radio" gui-text="どうする?">
<option value="add">追加</option>
<option value="del">削除</option>
</param>  
  <effect needs-live-preview="false">
    <effects-menu>
      <submenu name="◆◆ 自作 ◆◆"/>
    </effects-menu>
  </effect>
  <script>
    <command location="inx" interpreter="python">属性セット(コード).py</command>
  </script>
</inkscape-extension>

 これで実行時に次のようなダイアログが表示されます。

 ちなみにこのダイアログには「ライブプレビュー」のチェックボックスが表示されていませんが、これは「<effect needs-live-preview="false">」と書くことで実現しています。

 Pythonコードは次のようになります。

import inkex

class SetAttrExtension(inkex.extensions.EffectExtension):    
    def add_arguments(self, pars):
        pars.add_argument('--attribute_name', type=str, default='')
        pars.add_argument('--attribute_value', type=str, default='')
        pars.add_argument('--method', type=str, default='add')

    def effect(self):
        for elem in self.svg.selection:
            if self.options.method == 'add':
                elem.set(self.options.attribute_name, self.options.attribute_value)
            else:
                elem.pop(self.options.attribute_name)

if __name__ == '__main__':
    SetAttrExtension().run()

 実行後にXMLエディタ(Inkscapeのダイアログの1つです)を使ってSVG形式データの中身を確認すると、次のように指定した属性がセットされています。