;;
;; 全レイヤーに対し、以下のどちらかを行う Script-fu スクリプト
;; ・レイヤー名を連番でリネーム
;; ・連番テキストを描画
;;
;; * レイヤーメニューに追加される
;; * 連番文字列を描画する際に使用するフォント種類は、
;;   事前にフォントタブ内などで選択しておく。
;;   また、現在の前景色で描画される。
;;
;; 余談:
;; * レイヤー名の最後に「(100ms)」等を書くと、
;;   GIFアニメ作成・再生の際、ウェイト調整ができる。
;;
;; 2012/08/14 GIMP 2.8に対応。
 
(script-fu-register
 "script-fu-all-layers-process-serial-number"
 "全レイヤーに連番関連処理"
 "全レイヤーを連番リネーム、または、連番テキストを描画"
 "mieki256"
 "Public Domain"
 "2010-06-21,2012-08-14"
 "*"
 SF-IMAGE      "Image"                 0
 SF-DRAWABLE   "Drawable"              0
 SF-OPTION     "処理内容"              '("連番リネーム" "連番を描画")
 SF-ADJUSTMENT "桁数"                  '(4 1 10 1 5 0 1)
 SF-ADJUSTMENT "開始番号"              '(0 0 9999999 1 5 0 1)
 SF-TOGGLE     "逆順"                  FALSE
 SF-STRING     "付加文字列(前)"        ""
 SF-STRING     "付加文字列(後)"        ""
 SF-ADJUSTMENT "描画位置 X"            '(0 0 9999 1 10 0 1)
 SF-ADJUSTMENT "描画位置 Y"            '(0 0 9999 1 10 0 1)
 SF-ADJUSTMENT "フォントサイズ(pixel)" '(24 1 9999 1 10 0 1)
 )
 
(script-fu-menu-register
 "script-fu-all-layers-process-serial-number"
 "<Image>/Layer")
 
(define (script-fu-all-layers-process-serial-number
         image
         drawable
         job      ; 処理種類
         digits   ; 桁数
         start    ; 開始番号
         revfg    ; 逆順フラグ
         prefix   ; 前に付加する文字列
         suffix   ; 後に付加する文字列
         x        ; 描画位置 x
         y        ; 描画位置 y
         size     ; フォントサイズ
         )
 
  ;; ----------------------------------------
  ;; GIMP2.6 か GIMP2.4 なら #t を、そうでなければ #f を返す
  (define (script-fu-check-gimp26)
	(let ((version-head (substring (car (gimp-version)) 0 4)))
	  (or (string=? version-head "2.6.") (string=? version-head "2.4."))))
 
  ;; ----------------------------------------
  ;; 通常レイヤーのみのレイヤーID一覧(list)を取得する
  ;; 引数は、(vector->list VECTOR) で、listにして渡すこと。
  (define (script-fu-get-layers-list ls)
	(if (null? ls)
		;; 空リストだった場合
		'()
		(let* ((layer (car ls)) ;; 今チェックしてるレイヤー
			   (layer-rest (cdr ls))) ;; 残りのレイヤー
		  (if (= (car (gimp-item-is-group layer)) 0)
			  ;; 通常レイヤーだった場合
			  (cons layer (script-fu-get-layers-list layer-rest))
			  ;; レイヤーグループだった場合 
			  (let*
				  (
				   ;; 子レイヤーの一覧を取得
				   (child (cadr (gimp-item-get-children layer)))
				   (child-list (vector->list child)))
				(append
				 (script-fu-get-layers-list child-list)
				 (script-fu-get-layers-list layer-rest)))))))
 
  ;; ----------------------------------------
  ;; 通常レイヤーのみのレイヤーID一覧(vector)を取得する
  (define (script-fu-get-layers-array image)
	(if (script-fu-check-gimp26)
		;; GIMP 2.6用
		(cadr (gimp-image-get-layers image))
		;; GIMP 2.8以降用
		(let* ((layers (gimp-image-get-layers image))
			   (layer-array (cadr layers)) ; レイヤーID一覧(vector)
			   (layer-list (vector->list layer-array)) ; レイヤーIDリスト(list)
			   )
		  (list->vector (script-fu-get-layers-list layer-list)))))
 
  ;; ----------------------------------------
  ;; 桁数分を「0」で埋めた文字列を作成して返す関数
  (define (gen-numstr prefix start count digits suffix)
    (let* ((zeros (make-string 10 #\0)) ; "000..."を作成
           (str (number->string (+ start count)))
           (num (string-append zeros str))
           (pos (- (string-length num) (max digits (string-length str)))))
      (string-append prefix (substring num pos) suffix)))
 
  ;; ----------------------------------------
  ;; メイン処理
  (let* ((layer-array
		  (vector->list
		   (script-fu-get-layers-array image))) ; レイヤーlist取得
         (layers-len (length layer-array))    ;; レイヤー枚数取得
         (font (car (gimp-context-get-font))) ;; フォント種類取得
         (num 0)
         (stepvalue 0))
 
    ;; カウンタ開始番号とステップ値を設定
    (set! num (if (= revfg FALSE) (- layers-len 1) 0))
    (set! stepvalue (if (= revfg FALSE) -1 1))
 
    (gimp-image-undo-group-start image) ; Undo Start
 
    ;; レイヤー枚数分ループ処理
    (let loop ((lis1 layer-array))
      (if (null? lis1)
          #t
		  (let ((layer (car lis1))
				(str (gen-numstr prefix start num digits suffix)))
 
			(if (= job 0)
				;; レイヤー名変更
				(gimp-layer-set-name layer str)
 
				;; 文字描画
				(let ((txt 0))
				  ;; 指定レイヤーをアクティブに
				  (gimp-image-set-active-layer image layer)
 
				  ;; 文字描画
				  (set! txt (car (gimp-text-fontname image layer x y str 0 TRUE size PIXELS font)))
 
				  ;; 選択領域を固定
				  (gimp-floating-sel-anchor txt)))
 
			(set! num (+ num stepvalue)) ; カウンタ増減
 
			;; 再帰でループ
			(loop (cdr lis1)))))
 
    (gimp-image-undo-group-end image) ; Undo End
    (gimp-displays-flush)             ; 再描画
    ))
 
最終更新:2012年08月14日 12:43