FireAlpaca用ブラシスクリプト「定規ブラシ」を作成しました

あったら便利だろうなー、となんとなく思って「定規ブラシ」というものを作ってみました。曲線に目盛りを打つことも可能です。

ブラシのDownloadは記事下部のリンク先より行ってください。

仕様

F-Ruler_10i.bs のほうは大きい目盛りが 10 inch 、100 mm、100 pixel、

F-Ruler_ni.bs のほうは大きい目盛りが 1 inch、10mm、100 pixel

ごとに描画されるようになっています。0.5単位ごとに半分の幅の、0.1単位ごとにその半分の目盛りが描画されます。

最大描画幅はブラシ幅と同じです。

f:id:Inari777:20150408193703p:plain

パラメータ

「太さ」についてはそのままです。

チェックボックスについては一つ目のチェックボックスの設定が優先されます。

f:id:Inari777:20150408192234p:plain

 

スクリプト

function default_size()
 return 120 , 1
end

 

function param1()
 return "太さ" , 0 , 100 , 35
end
function param2()
 return "10 mm" , 0 , 1 , 0
end
function param3()
 return "100 pixel" , 0 , 1 , 0
end

 

function main ( x , y , p )
 ww = bs_param1() * 0.1
 local w = bs_width()
 if w < 5 then
  w = 5
 end


 local k = 1

 

 if bs_param2() == 1 then
   k = 1 / 2.54
  elseif bs_param3() == 1 then
   k = 100 / bs_canvas_dpi()
 end

 if not firstDraw then
   local distance = bs_distance( lastDrawX - x , lastDrawY - y )
  if distance < n_Inch * k then
   return 0
  end
 end

 if j % 10 == 0 then
   w = 0.5 * w
  elseif j % 5 == 0 then
   w = 0.25 * w
  else
   w = 0.125 * w
 end

 local dx , dy = bs_dir()
 local nx , ny = bs_normal()

 bs_polygon( x + dx * ww * 0.5 - nx * w , y + dy * ww * 0.5 - ny * w )
 bs_polygon( x + dx * ww * 0.5 + nx * w , y + dy * ww * 0.5 + ny * w )
 bs_polygon( x - dx * ww * 0.5 + nx * w , y - dy * ww * 0.5 + ny * w )
 bs_polygon( x - dx * ww * 0.5 - nx * w , y - dy * ww * 0.5 - ny * w )

 local r , g , b = bs_fore()
 bs_fill( r ,g , b , 255 )

 lastDrawX = x
 lastDrawY = y
 firstDraw = false
 j = j + 1
end

 

n_Inch = bs_canvas_dpi() / 10
j = 0
lastDrawX = 0
lastDrawY = 0
firstDraw = true

 ※ F-Ruler_ni.bs

 

スクリプト解説

定規の特性

定規は目盛りによって長さ(ブラシ幅)が異なる。この長さを決定しているのが

if j % 10 == 0 then
   w = 0.5 * w
  elseif j % 5 == 0 then
   w = 0.25 * w
  else
   w = 0.125 * w
 end

 という部分で、j によって制御されている。j は最初、クローバル変数としてmain関数の外で宣言され、main関数の中で目盛りをひとつ描画するたびに値が1 増えるようになっている。

dip から inch への変換

画像にはそれぞれデータ精度としてdpiが指定されている。dpiは「dots per inch」の略で、1 inch あたり(1平方inchではない)にどれだけの dot があるかを示す値であるので、例えば 350 dpi の画像で1 inch を測りたいときは dpi の数だけ数えればいいことになる。ただし、F-Ruler_ni.bs では 1 inch を大きな目盛りとして扱いたいので、

n_Inch = bs_canvas_dpi() / 10

 として1 inch の 1 / 10 の目盛りを描画するためにグローバル宣言を行っている。(実際にコードの中では pixel 値として扱われている)

inch から mm、pixcel への変換と描画間隔

25.4 mm = 1 inchで、dot (pixel)の関係は上で示した 通りなので、最後の描画中心座標からの現在のペンの座標に距離(恐らく n_Inch というグローバル変数を main 関数内部から変更できないから) k を媒介して比較し、次の描画中心座標を決定している。

 local k = 1

 

 if bs_param2() == 1 then
   k = 1 / 2.54
  elseif bs_param3() == 1 then
   k = 100 / bs_canvas_dpi()
 end

 if not firstDraw then
   local distance = bs_distance( lastDrawX - x , lastDrawY - y )
  if distance < n_Inch * k then
   return 0
  end
 end

そのため、n_Inch * k に対してペン軌道の曲率が大きすぎなければ、直線でなくでもほぼ正確な目盛りを描画することができる。

粒子(目盛り)の描画

下図の通り。

f:id:Inari777:20150408205150p:plain

 

Download

ブラシのDownloadは以下のリンク先から行ってください。

F-Ruler_10i.bs - Google ドライブ

F-Ruler_ni.bs - Google ドライブ