実際これでは使い物にはなりません。
関数を定義して、その戻り値が 目的のものになっていないからです。
レイヤーの階層をも考慮して、直したものを ご紹介します。
前回 のものは、大きく ふたつ の問題点があります。
戻り値 と レイヤー名の階層反映 と です。
関数を書いた以上、何らかの値が戻されます。
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注: 日本語環境下では "␣" U+2423 OpenBox の ␣ は表示されますが、別環境では? です。.
;引数
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)
)
)
最後に、
.
Script-Fu を調べていると、
文字の追加変更処理は 文字列操作 ではなく、リストを使うべき! と言う解説に当たります。
本来は、 string-append ではなく、
リストへの追加 (cons "element" list) でリスト冒頭に加えるべき なのでしょう。
そして、最後に、リストを文字列に変換する処理で対応すべきかと。
今回のコードは、その意味からも、良い例ではありません。 悪しからず。.
.
また、変数の命名が 単語連結に - を使ったり _ を使ったり 大文字を使ったり とバラバラです。
如何に混乱しながら書いているかがバレてしまいそうです ... 。 直さずにそのままにしました。
やはり、これも、良い例ではありません。 統一すべきです。 悪しからず。.
どうも、この癖が抜けません。.
0 件のコメント:
コメントを投稿