2025年1月8日水曜日

GIMP Script-Fu v3 (3) 例 単独 Layer レイヤー移動を座標値で

GIMP 2.6 の頃から、直し直し、使い続けたもの。
レイヤー移動を座標値で の最新版です。
GIMP 3.0.0-RC2 で確認しています。
制限事項は 単独 Layer が対象! 。


もう、手直し も、此れが限界 でしょう。
利用時の 制限 が厳しいので、
根本から弄ら無いといけなくなる様です。
ですから、最後の足掻き になると思っています。

レイヤー移動を座標値で の最新版。

複数 Layers を扱うのは、容易ではありません。
なので、公開するのは、此の 単独レイヤー版 のみにします。
仮に、
複数あっても、左上座標が Group 化 で問題無いなら、
事前に手作業で Group 化( Group 新設し格納の上 Group を選択 )してから、
お使い下さい。

  処理中に、選択を全て Group に収める方法もありますが、
  Group にした後の 左上座標 が、
  必ずしも、想定のものと同じでは無いケースもあって、
  採用を取り止めました。
    (例:文字が際にある場合等)
  なので、必要な場合には、手作業をお願いします。

  或いは、連続利用の場合、設定値は維持されていますから、
  再度呼び出して、其れを利用も可能です。
  つまり、複数分に対して繰り返して実行する事。

  尚、
  相対的な移動のみ なら、
  複数を扱う事も可能な訳ですが、
  絶対位置指定の場合、
  元の相互位置関係を維持出来ないので、
  単独に限定した次第です。


選択されたものが ひとつ が 前提条件 です。


 script name : script-fu-shiro-layer-shift-1l
 file name : Shiro-Layer-Shift-1L.scm 


また、Script-Fu v3 ですから、
格納場所は 個人用の plug-ins Directory です。
同名の Sub-Directory に入れた状態で 配置 します。
例えば、
C:¥Users¥<YourName>¥AppData¥Roaming¥GIMP¥3.0¥plug-ins¥Shiro-Layer-Shift-1L


選択されたものが ひとつ は、
script-fu-register-filter で SF-ONE-DRAWABLE を指定しています。
GUI から操作する場合、
複数が選択されている状態では、グレーアウト して、実行出来ません。

しかし、
Procedure Browser 等を眺めれば、
ONE-DRAWABLE の制限は見当たりません。
書き手が、実行時に、選択数をチェックして、
例外処理する事が勧められていましたね。
此処でも、其の様に、しています。

GUI だけ考えれば、冗長な と思われるかも知れませんが、
他の Script から呼ばれる、若しくは、Console で実行される、
そうしたケースへの配慮です。


さて、全 Code 。

#!/usr/bin/env gimp-script-fu-interpreter-3.0
;!# Close comment started on first line.

; v2>v3
;  TRUE => #t  FALSE => #f
;  Use script-fu-register-filter
;  Now, drawables is a vector #(...)

;Scheme for GIMP 3.0.0-RC1 +

(define (script-fu-shiro-layer-shift-1l
         image
         drawables
         x
         y
         type
        )
  (script-fu-use-v3)
  (if (> (vector-length drawables) 1)
    (begin
      (gimp-message (string-append
                      "レイヤーが複数指定されています : "
                      (number->string (vector-length drawables))
                      "¥n")
      )
      (quit)
    )
  )
  (gimp-image-undo-group-start image)
  (let* (
      (lyr (vector-ref drawables 0))
      (offsetsX 0)
      (offsetsY 0)
      (offsetsX (car (gimp-drawable-get-offsets lyr)))
      (offsetsY (cadr (gimp-drawable-get-offsets lyr)))
        )
    (if (= type 0)
      (gimp-layer-set-offsets lyr (+ offsetsX x) (+ offsetsY y))
      (gimp-layer-set-offsets lyr x y)
    )
  )
  (gimp-displays-flush)
  (gimp-image-undo-group-end image)
)

(script-fu-register-filter
  "script-fu-shiro-layer-shift-1l"             ;func name
  _"レイヤー移動  (Shiro版 1L)  UnDo:Ctrl+Z"   ;menu label
  _"単一レイヤーを指定した座標に移動させます"  ;description
  "ShiroYuki_Mot"   ;Original scm by"Go"       ;author
  "ShiroYuki_Mot"   ;Original scm by"Go"       ;copyright notice
  "2025/01/03"            ;date created
  "*"                     ;image type on the script
  SF-ONE-DRAWABLE         ; v3 >>> additional argument
  ;SF-IMAGE       "Image"    0    ;Commment out for v3
  ;SF-DRAWABLE    "Drawable" 0    ;Commment out for v3
  SF-ADJUSTMENT  "X (横座標) " (list 0 -8000 8000 1 100 0 SF-SPINNER)
  SF-ADJUSTMENT  "Y (縦座標) " (list 0 -8000 8000 1 100 0 SF-SPINNER)
  SF-OPTION      "位置 (相対/絶対) " '("相対値"
                                       "絶対値")
)

(script-fu-menu-register "script-fu-shiro-layer-shift-1l"
                         "<Image>/Layer")



後日、別 Blog にて、ファイル公開 の予定です。
公開後に、リンクを追記しますね。

GIMP Script-Fu v3 Shiro-Layer-Shift for 1 Layer
https://shiroyuki-mot-presents.blogspot.com/2025/01/download-sfu-v3-shiro-layer-shift-1l.html



[2025/01/08] リンク追記

0 件のコメント:

コメントを投稿