Script-Fuでgimp-pathを使ったことはありましたが、gimp-vectorsはまだ使ったことがないので、ちょっと使用法を調べてみました。
■ 作成例
GIMPでpathやvector関連の作業を担当していらっしゃる、Simon氏が作ったサンプルスクリプトが分かりやすいです。
基本的にはgimp-pathと同じようです。
(define (script-fu-draw-circle image layer)
(let* (
(w (car (gimp-image-width image)))
(vectors 0)
)
(set! vectors (car (gimp-vectors-new image "circle")))
(gimp-image-add-vectors image vectors -1)
(gimp-vectors-bezier-stroke-new-ellipse vectors
(/ w 2) (/ w 2) (/ w 3) (/ w 3) 0)
(gimp-edit-stroke-vectors layer vectors)
)
)
(script-fu-register "script-fu-draw-circle"
"Draw Circle"
"Sample script to draw a circle"
"Simon Budig"
"(c) 2007 Simon Budig"
"4. 09. 2007"
"*"
SF-IMAGE "input image" -1
SF-DRAWABLE "active drawable" -1
)
(script-fu-menu-register "script-fu-draw-circle"
"/Filters/Render")
■ gimp-vectors-stroke-new-from-points
この関数はGimpでのパス操作のようにベクトルオブジェクトを描画する関数のようです。
(gimp-vectors-stroke-new-from-points
vectors
type
num-points
#( ix1 iy1 ax1 ay1 oy1 oy1
ix2 iy2 ax2 ay2 oy2 oy2
ix3 iy3 ax3 ay3 oy3 oy3 )
closed)
ix,iy は進入方向のコントロールハンドルの座標
ax,ay はアンカーの座標
ox,oy は出口方向のコントロールハンドルの座標
その部分を曲線ではなく直線したい場合は、コントロールハンドルとアンカーの座標を同じにします。
☆浮動小数点配列の用意・セットメモ
(let* ((points (cons-array (* num 6) 'double))
〜中略〜
(aset points (+ (* 6 count) i) x)
■ gimp-vectors-bezier-stroke-new-moveto
上のstroke-from-new-pointsはすべての座標を全部一度に指定して描画してしまう方法ですが、こちらは一ヶ所づつ指定するやり方です。イメージ的には通常のパスツールの使い方と同じでしょうか。
具体的には、bezier-stroke-new-movetoでベクトル描画の開始座標を指定して、gimp-vectors-bezier-stroke-linetoを繰り返せば次々に一筆書きの「直線」を描きます。
gimp-vectors-bezier-stroke-linetoではなくて、gimp-vectors-bezier-stroke-conictoやgimp-vectors-bezier-stroke-cubictoであれば「スプライン曲線」を描きます。
一筆書きをやって最終的に始点と終点を連結させてストロークを閉じるには(close)、gimp-vectors-stroke-closeを使います。
ちょっと思ったのは、先に計算して出した座標をどうやってベクトル配列に入れるのか?という問題です。個人的にはScript-Fuではリストのほうが何かと相性がいいので、一旦リスト配列に入れてからlist->vectorの方法かなぁ。
■ リンク
今回のvectorsの情報を探していたら凄いサイトを見つけました。
Script-Fuを書くときに非常に重宝しそうです。
アルゴ算法堂 / グラフィック
こちらの記事のお陰で Script-Fu で『座標データからパスを作る』ことができました。感謝します。
勝手ながら、当方のブログで引用させていただきました。http://d.hatena.ne.jp/foussin/20130530/1369846436
ところで、パスから実線を作る
『パスに沿って描画』コマンド
(パスでストローク描画)
がありますが、これを Script-Fu で再現する方法をご存知でしょうか。もしご存知でしたら教えてください。宜しくお願いします。
そのコマンドは、PDBには入っていないようですね。(app/pdb/vectors-cmd.c)
GimpStrokeOptionsつきのgimp-item-stroke()を呼び出す必要があるのかな。
すると残りは、普通にgimp-edit-stroke-vectorsかgimp-vectors-bezier-stroke-*でしょうかね。
あとご存知かもしれませんが、スクリプトのエラー原因究明はこちらもどうぞ。
http://twist.jpn.org/gimpwiki/index.php?ScriptFuClass%2FStaying
そうなると、自分のスキルを超えた話になるので、その実装は諦めます。
アドバイスありがとうございました。