GIMP3.x で、現状のPython-fuの仕様が引き継がれそうもないので、GIMP上でプログラムを作る意欲を全く失っていましたが、やはり必要そうなので再開します。
GIMP3.0ではgimpfu ver. 3 プロジェクトが公式プロジェクトに採用されることを期待したいと思います。ただここのところのGIMPの動きを見ると、2.10に、2.99でテストされた最新成果が取り入れられているので、ひょっとすると、調整レイヤーが採用されるまでは3.x の安定版が出ないかもしれない、という気がします。2.99では、Resynthesizerなどのキラープラグインも動かないのですから、ユーザ目線からすると現状のまま3.0に移行されても困るという感じですが... また、Linux上で大きな問題だった Python2.7のサポートが終わったことに関しても、GIMPのインストールがflatpak化されたことにより、ユーザがダイレクトにOSにPythonの旧バージョンをインストールしなくても、しっかりPython-fuが動くようになったことから、ますます 敢えて3.0をリリースする理由がなくなったように思います。もちろんセキュリティを考えれば、長期的にはPython3.x に移行すべきではありますが...
・アクティブな imageオブジェクトの取得
現在 gimp のプロシジャーブラウザを見ても、GIMPで複数の imageオブジェクト(=ファイル)を開いている場合、そのうちどれがアクティブな imageオブジェクトなのかを取得するAPIが見当たりません。アクティブな layerやdrawableを取得するAPIはありますが(gimp-image-get-active-layer および gimp-image-get-active-drawable)...
これに関しては、基本的に Register関数から取得するしかないようです*1。Registerで、
(PF_IMAGE, "img", "Input image", None),
を指定しておき、プラグインの実質的なメイン関数の引数に、
def main(img):
と指定しておくと、imgに現在アクティブなimageオブジェクトが取得されます。このメイン関数の引数は Registerの PF_IMAGE の次にある引数名と一致させる必要があります。なお同様にアクティブなdrawableも取得できます。
・アクティブな drawable もなるべくRegister関数から読み込むべし
アクティブなdrawableはRegister関数に指定しなくてもgimp-image-get-active-drawableで取得することができます。しかし、どうもプログラムの途中でアクティブな image オブジェクトが移動してしまうと、その際に、gimp-image-get-active-drawable API で取得しておいた drawable のポインタが変わってしまうらしく、なぜか今開いている Imageオブジェクトの内 最後に読み込んだ image オブジェクトのアクティブな drawable に変わってしまうようです。
結局これを防止するには、なるべく APIでアクティブな drawableやlayerを取得するのではなく、やはりRegisterから読み込むことが必要なようです。imageオブジェクトと同様に、
(PF_DRAWABLE, "drawable", "Input drawable", None),
で指定しておき、
def main(img, drawable):
というような形で実質的なメイン関数に引数として指定します。
なお、Akkana Peck氏のサイトによりますと
(PF_LAYER, "layer", "Input layer", None)
も使えるようです。
*1:以下のディスカッションを参照。