2018年2月24日土曜日

GIMP Script-Fu (11) レイヤー情報を取得 2

前回の GIMP Script-Fu (11) レイヤー情報を取得 1 で、何とか、目途が着いたのですが、
実際これでは使い物にはなりません。
関数を定義して、その戻り値が 目的のものになっていないからです。
レイヤーの階層をも考慮して、直したものを ご紹介します。


前回 のものは、大きく ふたつ の問題点があります。
戻り値 と レイヤー名の階層反映 と です。


関数を書いた以上、何らかの値が戻されます。
Script-Fu で画像処理を経験された方は、余り、意識されないかも知れません。
例えば、レイヤーを新規作成すると、レイヤー番号が返されますが、
それを使う事は分かっていても、
自分で書いた関数の 戻り値 を意識する事は少ない筈です。
今回もそうです。
文字列が欲しい訳ですから、  戻り値もそうなっていないと使えませんね。
前回の例では ループした結果の 空リスト が返されてしまっています。
おまじない を!。
 (set! valuable value)
処理の一番最後(最後の行と言う意味ではありません)に 代入宣言を 書き加えましょう。
はい。  これで、戻り値が変わります。


次の難問は、 変数のスコープです。
前回は、広域変数と局所変数を使い分ける事で、目的を果たしていましたが、
Script-Fu 実行時には、 概ね、 皆 局所変数になる様です。
抜けてしまえば、代入した結果は 水の泡 です。
そう、
局所ですから、再帰時に、その値をバトンタッチしてやる必要があります。
引数に目的の変数を加え、代入結果を引き継いで行きます。


結果を見ていて、
レイヤー名が階層状態を反映していないのは、引っ掛かっていました。
主目的からすれば、対応させなく共、良い気はしましたが、
この例題からすれば、段下げは、望ましい と判断し、加える事にしました。
この方法も、先程の 変数スコープ への対応と同じ考え方で対処します。


では、 結果と コードと を。


   GIMP Script-Fu Console
.
> (script-fu-shiro-text-all-layers-loop 1 0 TRUE "" "")
"Layer Group #1\nLayer Group\n␣Layer #3\n␣Layer #2\n␣Layer Group #2\n␣␣Layer #4\nLayer #1\nLayer\nBack Ground\n"

> (define str (script-fu-shiro-text-all-layers-loop 1 0 TRUE "" ""))
str
> (display str)
Layer Group #1
Layer Group
␣Layer #3
␣Layer #2
␣Layer Group #2
␣␣Layer #4
Layer #1
Layer
Back Ground
#t

(define (script-fu-shiro-text-all-layers-loop
  ;引数
 img              ;image
 layer0           ;layer Not Use
 isTop            ;for Recursion (Default:TRUE")
 each-hierarchy   ;for Recursion (Default:"")
 str              ;;for Recursion (Default:"")
            )

  ;処理
  
   (let* (
           (topCounter 0)
           (topLayers '())
           (each-str "")
           (str_sum "")
           (hierarchy-str "␣") ; U+2423 OpenBox
         )

         ; Get All Layers or Children
         (set! str_sum str)
         (if (= isTop TRUE)
            ; Top (First)
            (begin
               (set! topCounter (car (gimp-image-get-layers img)))
               (set! topLayers (cadr (gimp-image-get-layers img)))
               (set! isTop FALSE)
               (set! each-hierarchy "")
            )      ; End begin
            ; Group
            (begin
               (set! topCounter (car (gimp-item-get-children layer0)))
               (set! topLayers (cadr (gimp-item-get-children layer0)))
               (set! each-hierarchy (string-append hierarchy-str each-hierarchy))
            )      ; End begin

        )       ; End if


         ;Top Loop
         (while (>= topCounter 1)

            ; Is Group ?  First Get Children
            (set! layer0 (vector-ref topLayers (- topCounter 1)))
            (if (= (car (gimp-item-is-group layer0)) 1)
               (begin
                  ; Recursion Call
                  (set! str_sum (script-fu-shiro-text-all-layers-loop
                       img layer0 FALSE each-hierarchy str_sum))
                
               )
            )

            ; Get Each Layer Inf.
            (set! each-str (car (gimp-drawable-get-name layer0)))
            (set! str_sum (string-append
                              each-hierarchy
                              each-str
                              "\n"
                              str_sum
                      ))
     
            ; for Next
            (set! topCounter (- topCounter 1))

         )            ; End while Sub

   ; Function Return   
   (set! str str_sum)
   )
)
注: 日本語環境下では "␣" U+2423 OpenBox の ␣ は表示されますが、別環境では? です。.


最後に、

Script-Fu を調べていると、
文字の追加変更処理は 文字列操作 ではなく、リストを使うべき! と言う解説に当たります。

本来は、 string-append ではなく、
リストへの追加 (cons "element" list) でリスト冒頭に加えるべき なのでしょう。
そして、最後に、リストを文字列に変換する処理で対応すべきかと。
今回のコードは、その意味からも、良い例ではありません。  悪しからず。.
.
また、変数の命名が 単語連結に - を使ったり _ を使ったり 大文字を使ったり とバラバラです。
如何に混乱しながら書いているかがバレてしまいそうです ... 。  直さずにそのままにしました。
やはり、これも、良い例ではありません。  統一すべきです。  悪しからず。.
                               どうも、この癖が抜けません。.



0 件のコメント:

コメントを投稿