Skip to content

Instantly share code, notes, and snippets.

@mieki256
Last active September 12, 2022 11:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mieki256/b6425ba4e03de27a53387d2eb6d1a4f1 to your computer and use it in GitHub Desktop.
Save mieki256/b6425ba4e03de27a53387d2eb6d1a4f1 to your computer and use it in GitHub Desktop.
GIMPの全レイヤーを連番リネーム、または連番テキストを描画するScript-Fu。Windows7 x64 + GIMP 2.8.0 Portable、GIMP 2.6.11 で動作確認した。
;;
;; 全レイヤーに対し、以下のどちらかを行う Script-fu スクリプト
;; ・レイヤー名を連番でリネーム
;; ・連番テキストを描画
;;
;; * レイヤーメニューに追加される
;; * 連番文字列を描画する際に使用するフォント種類は、
;; 事前にフォントタブ内などで選択しておく。
;; また、現在の前景色で描画される。
;;
;; 余談:
;; * レイヤー名の最後に「(100ms)」等を書くと、
;; GIFアニメ作成・再生の際、ウェイト調整ができる。
;;
;; 2015/02/14 レイヤー名の頭に連番をつける機能を追加。
;; 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,2015-02-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-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 ; 逆順フラグ
leavename ; レイヤー名保持
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)
;; レイヤー名変更
(if (= leavename FALSE)
(gimp-layer-set-name layer str) ;; 連番で置き換え
(let* ((layername (car (gimp-layer-get-name layer)))
(nstr (string-append str "_" layername)))
(gimp-layer-set-name layer nstr) ;; レイヤー名を保持しながら連番追加
))
;; 文字描画
(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) ; 再描画
))
@mieki256
Copy link
Author

Screenshots.

ss_all-layers-process-serial-number_m256 scm

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment