2018年4月19日木曜日

GIMP Python-Fu で苦しむ

GIMP Python-Fu で苦しむ ... 。
書き慣れた Script-Fu に 別れを告げて (?) 、
Python の世界に飛び込もう ... 、
と思ったのですが、 ...  、 これが、なかなか、 ... 。


GIMP の Script と言えば、
私は、これ迄、Script-Fu の お世話になって来ました。
でも、
そろそろ、Python-Fu も書かないと ... 。

() の羅列になって、試行錯誤中はパニックになる事も多かった Script-Fu 。
() が幾つも並んで、何処が何処やら ... 。

別に、 Script-Fu が悪い訳ではありません。
こちらの 優秀な (?) 頭脳 が ... ちと 役立たず なのです。  X(


GIMP のリリースノートやら 更新記事を読んでいると、
Python と言う言葉が良く出て来ます。
そう、 scpipt.py こと、Python-Fu で使わている Python ですね。

Python と言う 開発言語 は 最近 良く目にする様になりました。
Editor として使っている Visual Studio Code もこの言語をサポートしていますし、
Visual Studio 自体 も Python をサポートしています。

個人的に、良く利用する 開発言語 は Visual Basic なのですが、
Script-Fu で書く時は、 完全に、頭を切り替えないと、いけません。
Lisp Scheme の流れを汲む 開発言語 だから ですね。
また、書き方や考え方は、全く、異なります。
モドカシイと思う事も 多々 あります。

そして、何か、自分で書こうとして、Internet を検索すると、
他の開発言語を使っていたので、Python-Fu で書き出しました、 と言う記事を良く目にします。


そろそろ、
ウォームアップを始めるか!、 の気持ちで書き出そうとしています。



スクリプトを書く流れは、基本的には、Script-Fu と同じです。
Procedure Browser で関数を調べ、 書いて行く訳ですね。

でも、 Python ならでは の お決り もあります。
勿論、別言語ですから、 ルールも別です!。

以下に、 Script-Fu を書いた事がある、或いは、読める!方を対象に書いて行きます。


一番大きいと思うのは、 関数名です。

Script-Fu では、
(define (script-fu- ... で書き出す関数名と、
(script-fu-register
  "script-fu-... で書く 登録名とが同一である必要がありましたね。
Python-Fu では、
関数名
 def plugin_main(...):
登録名
 register(
         "python_fu_ ...
          ...
          plugin_main
            )
 main()
となります。

ここでの plugin_main や main() は お決り と考えて置いて良い 様です。
はい。  これらの名称を変更する必要は無い のです。
別に、上の語句に拘る必要も無い様ですが。  別の語句に置換された例もありますし。.


あっ、
名称と言えば、
Script-Fu では 語句の連結は - でしたが、
Python-Fu では _ に置き換わります。
同じ関数なのですが、見た目は違います。
そして、 登録した スクリプトは _ が - に置換されて Procedure Browser に表示されます。


序に。
Image や layer を指定するのに、
Script-Fu では 数字 をいきなり突っ込んでも OK でしたが、
Python-Fu では、 各々のオブジェクトに変換してからでないと認識されません。

 例えば、レイヤーなら、 target_layer = gimp.Item.from_id(target_id) 等。
 更に、突っ込めば、 以下でも OK な 筈。  余り必要な機会は無いと思いますが。.
  画像:   some_img = gimp._id2image(img_id)
  レイヤー: some_lyr = gimp._id2drawable(lyr_id)
 試しに、複数画像を開いて、Python Console から、???_id に 数字を突っ込んで、試して見て下さい。
 数字が合っていれば、各々のオブジェクトが返される筈です。
 因みに、検索しても、数字で各項目を指定する方法は、なかなか、Hit しませんね。.


そして、大きく異なるのが、インデント!。
左の空白 が命令文の構造を表す様で、
ええ加減! に 段落下げ して 書いていると、まともに、動いてはくれません。
2行目に書いた最初の空白の数をなぞう事で、ひと塊のブロックを表します。

基本は1行1命令文。
しかし、値の代入 や 条件分岐 等は 複数行に渡りますね。
値の代入では () や [] があると複数行に分かれても OK です。
条件文 等は 冒頭行の最後に書いた : が継続行をブロックとして扱う事を意味していて、
継続行の最初に入れた 空白の数 が続く行の塊をブロックとして認識します。
これは、先に書いたインデントが重要と言う事です。
そう、同じ意味で、冒頭に書く、def での 関数定義 も同じなのですね。

これを忘れて書いていると、
合っている筈なのに ... と言ったジレンマに襲われます。


Script-Fu の Lisp/Scheme と較べれば、
Python は多くの事例や解説が Internet 上に公開されています。
勿論、ユーザーが自分でライブラリを選択組み込む訳では無い GIMP の Python-Fu の場合、
鵜呑みには出来ない事情もあるのですが、
かなりの例を見付ける事が出来ると思います。

  エディタによっては、GIMP とは個別に Python 環境を用意する事で、
  Coding から Debug 迄 熟すものも有りますが、
  組み込むライブラリが相違していると、 実際の GIMP 上での挙動と異なりますから、
  其処は、要注意! です。
  同じ様に、  Internet 上の Python 絡みのページも、参照するライブラリに気を配る必要があります。


それから、
値の代入が複数行に渡らない限り(各命令行1行記述で書いてあれば)、
GIMP の フィルター(R) > Python-Fu > コンソール(C) で関数を定義する事も可能です。
そう、ファイル化する前に、試行錯誤も可能なのですね。


最後に。
日本語。
少し、癖が有ります。
詳細は別の機会に譲りますが、
最初は、日本語を使わず、 先ずは Python に慣れる事をお勧めします。


はい。
Python が 新しい 開発言語 と言う方は、
「Python 入門」等と言う語句で検索される 記事や投稿 を見付けて、
一度、ざっと、お読みになる事をお勧めします。
でも、鵜呑みはいけません!。  ライブラリの構成が違うかも知れないから、ですね。



0 件のコメント:

コメントを投稿