ククログ

株式会社クリアコード > ククログ > Inkscape: 拡張機能の開発に入門するよ!

Inkscape: 拡張機能の開発に入門するよ!

2年に1回くらいInkscapeを使って図を描いている阿部です。

みなさんはInkscapeをご存知でしょうか。 すこぶるざっくりいうとお絵かきソフトです。

Inkscape: https://inkscape.org/

そのInkscapeには拡張機能というのがあって、便利な機能を開発して組み込めることを最近知ったので入門してみました。

公式ドキュメントの通りに進めていくと入門できるので、そこには公式ドキュメントにおまかせして、ドキュメントに書いていない補足情報とかを共有します。

想定読者

入門前の私が以下の知識レベルだったので、どれかに当てはまりつつ、Inkscapeの拡張機能を開発したい方にはこの記事が参考になると思います。

  • Inkscapeとは
    • お絵かきソフトで、ベクターな画像が書けて、JPEGとかPNGとかよりきれいなのが描けるらしい
    • SVGというフォーマットのファイルができる
  • SVGフォーマット
    • JPEGとかPNGとかよりきれいに表示できる(拡大してもガタガタしたりしない)
    • 中身を見るとバイナリじゃなくてテキストらしい
  • XMLをXPathがどうとかで処理したことがある
    • HTMLをJavaScriptのgetElementById()とかで処理したことがある

拡張機能の開発に入門

基本的に公式ドキュメントの通りにやると拡張機能の開発に入門できます。

https://inkscape.gitlab.io/extensions/documentation/tutorial/my-first-effect-extension.html

コード例も記載されてあるので書いてある通りに編集すれば(もしくは完成形を所定の場所にコピーすれば)、Inkscapeの拡張機能を体感しつつ入門できます。

掲載したURLのページ以外にもいくつか入門するためのドキュメントが実装例とともに用意されているので、その通りにやれば最初の一歩は踏み出せると思います。

以降では最初の一歩を踏み出した私がドキュメントには書いてなかったけど、知っていると役に立つかもしれない情報を3つ紹介していきます。 それぞれ独立した話でセクションごとの繋がりは何もないのでそのつもりでご覧ください。

Inkscapeの拡張機能の開発に役立つかもしれない情報

Inkscapeの拡張機能はPythonスクリプトを実行するだけ

ドキュメントの実装例を見ると次のようなPythonのコードが確認できます。

# 一部抜粋
if __name__ == '__main__':
    MakeRedExtension().run()

Pythonに馴染みがあれば、これを見ればコマンドラインで実行する可能性のあるPythonスクリプトであることがわかります。

もう少し具体的に書くとコンソール上で

$ python ./script.py
# 何か出力

みたいに実行するということです。

つまり、Inkscapeの拡張機能を実行したときの動きをざっくり説明すると、

  1. 拡張機能を実行するとPythonスクリプトが実行される
    • 入力はInkscapeのGUI上で編集しているSVG
  2. Pythonスクリプトの出力をGUIで編集中のSVGに反映

という感じになります。

この仕組みからわかる通り最初から最後まで一気に処理が実行されるため、途中でユーザに確認を求めてその返答に応じて処理を変える、といったことはできません。

SVGはXML

Inkscapeの拡張機能の話というよりは、SVGの一般的な話です。

「SVGはバイナリじゃなくてテキストらしい」という知識レベルだったのですが、今回Inkscapeの拡張機能開発に入門してSVGはXMLであることがわかりました。

これがわかって何が嬉しいのかというと、XMLの操作の経験があった私にはSVGの操作がこれまでの知識でわかることが多いことです。

例えば「操作対象のオブジェクトの特定して取得する」について考えると、これまで見たことがあるようなコードで実現できます。

今回はIDにhogeが設定されているオブジェクトを特定して取得する例を考えます。

Inkscapeで矩形にIDを設定するときは↓のようにして設定できます。

スクリーンショット:矩形にIDを設定

ちなみにこれをSVGファイルとして保存すると次のようなファイルになります。長いので一部省略して掲載します。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->

<svg
   ...略
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:svg="http://www.w3.org/2000/svg">
   ...略
  <g
     inkscape:label="Layer 1"
     inkscape:groupmode="layer"
     id="layer1">
    <rect
       style="fill:none;stroke:#000000;stroke-width:0.264999"
       id="hoge"
       width="63.352318"
       height="58.045185"
       x="65.815895"
       y="71.303673" />
  </g>
</svg>

<rect>id="hoge"が設定されていることが確認できます。

このオブジェクトは拡張機能のPythonスクリプトでは次のようなコードで取得できます。

elem = self.svg.getElementById("hoge")

SVGがXMLであることがわかると、XML(かHTML)を操作したことがあれば、納得感のあるコードです。

「エクステンションを管理」

Inkscapeの「エクステンション」メニューの一番下に「エクステンションを管理」があります。

その名の通りエクステンションを管理するための機能で、クリックするとメニューが起動します。

ただし、公式ドキュメントにある通りの*.py*.inxを配置しただけだと、自作の拡張機能の名前などが期待通りに表示されません。

「エクステンションを管理」にいい感じに情報を表示したい場合は、「エクステンションを管理」用にJSONファイルを追加する必要があります。 追加するJSONのファイル名は*.inxに設定したIDに拡張子.jsonを付けます。

JSONの例は「編集 > 環境設定 > ユーザーエクステンション」のディレクトリにある org.inkscape.inkman/org.inkscape.extension.inkman.json で確認できます。

私の環境では次のようなJSONがありました。全文を載せると長いので抜粋して掲載します。

{
  "author": "doctormo",
  "dates": {
    "created": "2021-04-22T15:08:20",
    "edited": "2021-05-25 02:49:57.913225"
  },
  "files": [
  (略)
  ],
  "icon": "inkman/data/pixmaps/icon.svg",
  "id": "org.inkscape.extension.inkman",
  "license": "GPLv3",
  "links": {
    "file": "https://media.inkscape.org/static/extensions-manager-fallback.zip"
  },
  "name": "Inkscape Extensions Manager",
  "summary": "Manage extensions from inside another extension",
  "tags": [
    "infrastructure"
  ],
  "verified": true,
  "version": "0.9.7",
  "Inkscape Version": [
    "1.1",
    "1.2"
  ]
}

自作の拡張機能でもこのJSONファイルを配置すると「エクステンションを管理」でいい感じに情報が表示されます。

まとめ

Inkscapeの拡張機能開発を通して、得た知識などを共有しました。

当社では、オープンソース製品の業務利用にあたって必要な拡張機能の開発や改良なども承っています。 オープンソース製品の利活用をお考えの企業ご担当者さまは、お問い合わせフォームよりご連絡ください。