SSブログ

見開き [花子]

Just MyShopでもCreative Suite 3が取り扱われるようになった。

Just MyShop(ジャストシステム)

FreeHandの開発が終わり、折り図描きのスタンダードはIllustratorに移行するのだろうか?その前に誰かが専用ツールを開発するか?前者だとしたらまたかなりコストのかかる時代に突入することになる…。


デスクトップとモニターを新調しつつあるのだが、ワイド画面はさすがに快適である。

花子の画面は「通常表示」の他に「レイアウト表示」というモードがあり、これに設定すると常に見開きで表示される。これはこれで便利なのだが、補助線やワークスペースが表示されないし表示倍率も変えられない。あくまでレイアウト表示なのである。

見開きのように表示させつつ、倍率を変えたり補助線を表示させたりしたいとき、ウインドウの「左右分割」をし、一方を次のページに切り替えればよい。手作業でちょちょいと簡単にできる操作ではあるのだが、頻繁に切り替えたいときにはちょっと鬱陶しい。

そこで、やっつけでこれを自動化させるマクロを組んだ。というか、組んだのはちょっと前なのだが、ワイド画面になって見開きが快適に表示できるようになったのに伴い、あらためて引っぱり出してみた。

!!見開き(やっつけ版)
ErrorBreakMode(0, 0, 0)
SplitScreen(1, 1, )
		%err = ErrorCode()
		if %err then
			stop
		end if
ActiveScreen(2)
NextPage()
ActiveScreen(1)

あくまで「やっつけ」なので常に動作するわけではありません。


タグ:マクロ

放射-ver.1.0 [花子]

がらがらがらがらがら…

「ゆらぎ」と「重力」の両方をかけると、がらがら崩れ落ちたりなんかする。
伸びに伸びた「放射」、あれこれ内在していたエラーをあれこれ取り除きつつ一応完成。と言っても、もともとノープランで適当に作っているため、それはそれはテキトーなコードである。無駄に270行も費やしているあたり、いかにも頭が悪い。

ErrorBreakMode(0, 0, 0)
%pn = GetPage()
%fp1 = CountFigsPage(%pn)
%lpatern = GetLinePattern()

!!図形を指定
%fnp = GetSelectFig()
do
	if %fnp = nil
		SelectFig?()
		%err = ErrorCode()
		if %err then
			stop
		end if
		%fnp = GetSelectFig()
	else
		exit do
	end if
loop
LinePattern(1, 1, , "R25G25B25", , , , , , )
EditDisplayMode(0)
%fn = Size(%fnp)
for %i = 1 to %fn
	%fd = GetFigDocument(%pn, %fnp(%i))
	%fr = CalcFigRegion(%fd)
	%figCenter(%i, 1) = GetX(%fr("座標1")) + GetX(%fr("座標2"))
	%figCenter(%i, 2) = GetY(%fr("座標1")) + GetY(%fr("座標2"))
	%figRegion(%i) = %fr
next

!!放射の中心をドラッグして指定
TemporaryMode()
DrawMode(3)
WaitMouseButton?(1, 1)
do
	if IsMouseButton(1) then
		WaitMouseButton?(1, 1)
		%mpa = GetMousePoint()
		%mpax = GetX(%mpa)
		%mpay = GetY(%mpa)
		if %mpa <> %mpa2 then
			for %i = 1 to %fn step 1
				%fc2(%i, 1) = %figCenter(%i, 1) - %mpax
				%fc2(%i, 2) = %figCenter(%i, 2) - %mpay
			next
			Redraw
			for %i = 1 to %fn step 1
				Line(%mpa, #[%fc2(%i, 1), %fc2(%i, 2)])
			next
		end if
	else
		exit do
	end if
		%mpa2 = %mpa
loop

!!放射の範囲をドラッグして指定
for %i = 1 to %fn step 1
	%lengths(%i) = ((%mpax - %fc2(%i, 1)) ^ 2 + (%mpay - %fc2(%i, 2)) ^ 2)
next
SortArray(%lengths, 2, )
%maxLength = %lengths(1) ^ 0.5
Circle(%mpa, %maxLength, , , 0, 0)
WaitMouseButton?(1, 1)
do
	if IsMouseButton(1) then
		WaitMouseButton?(1, 1)
		%mpb = GetMousePoint()
		%mpbx = GetX(%mpb)
		%mpby = GetY(%mpb)
		if %mpb <> %mpb2 then
			%length = ((%mpax - %mpbx) ^ 2 + (%mpay - %mpby) ^ 2) ^ 0.5
			%rate = %length / %maxLength
			for %i = 1 to %fn step 1
				%fc3(%i, 1) = (%fc2(%i, 1) - %mpax) * %rate + %mpax
				%fc3(%i, 2) = (%fc2(%i, 2) - %mpay) * %rate + %mpay
			next
			Redraw
			if %rate < 0.5 then
				LinePattern(1, 1, , "R255G25B35", , , , , , )
			else
				LinePattern(1, 1, , "R25G25B25", , , , , , )
			end if
			Circle(%mpa, %length, , , 0, 0)
			for %i = 1 to %fn step 1
				Line(%mpa, #[%fc3(%i, 1), %fc3(%i, 2)])
			next
		end if
	else
		exit do
	end if
		%mpb2 = %mpb
loop

!!設定
%ret = OpenMacroDialog ("radiate", )
%rep = %ret("repetition")
if %ret("cancel") then
	Redraw
	stop
end if
if %ret("repType") = "division" then
	%reptype = 1
else if %ret("repType") = "interval" then
	%reptype = 2
end if

!!複写
for %i = 1 to %fn step 1
	%fl(%i, 1) = %fc3(%i, 1) - ((GetX(%figRegion(%i, "座標2")) - GetX(%figRegion(%i, "座標1"))) / 2)
	%fl(%i, 2) = %fc3(%i, 2) - ((GetY(%figRegion(%i, "座標2")) - GetY(%figRegion(%i, "座標1"))) / 2)
next
DisplayMode(0)
for %i = 1 to %fn step 1
	PutSelectFig(, {%fnp(%i)})
	Copy(, #[%fl(%i, 1), %fl(%i, 2)], , , %reptype, %rep, )
	%err = ErrorCode()
	if %err then
		%copyerr = 1
	end if
	Progress("複写処理中...", %i, %fn)
next

!!ゆらぎ処理
%fp2 = CountFigsPage(%pn)
%fFigRegion = GetFigRegion(%pn, %fp1, %fp2)

!!移動
if %ret("move") > 0 then
	for %i = 1 to %fn step 1
		%maxMove = ((%fc3(%i, 1) - %mpax) ^ 2 + (%fc3(%i, 2) - %mpay) ^ 2) ^ 0.5 * %ret("move") / 20
		for %j = 1 to %rep step 1
			%err = Exist(%fFigRegion((%i - 1) * %rep + %j))
			if not %err then
				continue for
			end if
			%move((%i - 1) * %rep + %j, 1) = %fFigRegion((%i - 1) * %rep + %j, 1, 1) + Int(Rand() * %maxMove) - %maxMove / 2
			%move((%i - 1) * %rep + %j, 2) = %fFigRegion((%i - 1) * %rep + %j, 1, 2) + Int(Rand() * %maxMove) - %maxMove / 2
		next
	next
	for %i = %fp1 + 1 to %fp2 step 1
		PutSelectFig(, {%i})
		Move(, #[%move(%i - %fp1, 1), %move(%i - %fp1, 2)], , , )
		%err = ErrorCode()
		if %err then
			%moveerr = 2
		end if
		Progress("移動処理中...", %i, %fp2)
	next
end if

!!重力
if %ret("gravity") <> 0 then
	%accel = %ret("gravity") / 5
	if %ret("move") <> 0 then
		%gravity = %move
	else
		for %i = 1 to %fp2 - %fp1 step 1
			%gravity(%i, 1) = %fFigRegion(%i, 1, 1)
			%gravity(%i, 2) = %fFigRegion(%i, 1, 2)
		next
	end if
	for %i = 1 to %fn step 1
		for %j = 1 to %rep step 1
			%err = Exist(%fFigRegion((%i - 1) * %rep + %j))
			if not %err then
				continue for
			end if
			%gravity((%i - 1) * %rep + %j, 3) = %gravity((%i - 1) * %rep + %j, 2) + (%j ^ 2) * %accel
		next
	next
	for %i = %fp1 + 1 to %fp2 step 1
		PutSelectFig(, {%i})
		Move(, #[%gravity(%i - %fp1, 1), %gravity(%i - %fp1, 3)], , , )
		%err = ErrorCode()
		if %err then
			%gravityerr = 4
		end if
		Progress("重力処理中...", %i, %fp2)
	next
end if

!!回転
%fFigRegion = GetFigRegion(%pn, %fp1, %fp2)
if %ret("rotate") > 0 then
	for %i = 1 to %fp2 - %fp1 step 1
		%fFigCenter(%i) = #[(%fFigRegion(%i, 1, 1) + %fFigRegion(%i, 2, 1)) / 2, \\
		(%fFigRegion(%i, 1, 2) + %fFigRegion(%i, 2, 2)) / 2]
	next
	for %i = %fp1 + 1 to %fp2 step 1
		%angle = Int(Rand() * 36 * %ret("rotate")) - 18 * %ret("rotate")
		PutSelectFig(, {%i})
		Rotate(%angle, %fFigCenter(%i - %fp1), 0, , 0)
		Progress("回転処理中...", %i, %fp2)
	next
end if

!!終了処理
%fp3 = CountFigsPage(%pn)
for %i = 1 to %fp3 - %fp1 step 1
	%select(%i) = %fp1 + %i
next
PutSelectFig(, %select)
DisplayMode(1)
Redraw
Guidance("")
%error = %copyerr + %moveerr + %gravityerr
if %error <> nil then
	select case %error
	case 1
		%msg = "複写処理中"
	case 2
		%msg = "移動処理中"
	case 3
		%msg = "複写処理、移動処理中"
	case 4
		%msg = "重力処理中"
	case 5
		%msg = "複写処理、重力処理中"
	case 6
		%msg = "移動処理、重力処理中"
	case 7
		%msg = "複写処理、移動処理、重力処理中"
	end select
	%para = {.Title = "正常に処理できない図形がありました", .Icon = 4, .Button = 5, .Default = 2}
	%continue = MsgBox(%msg & "に一部の図形が領域外に出ました。処理を続行しますか?", %para)
	if %continue = 7 then
		Delete(, )
		PutSelectFig(, %fnp)
	end if
end if

function Progress(%message, %numerator, %denominator)
	%p = nil
	%r = nil
	%pn = Round(%numerator / %denominator, 1) * 10
	%rn = 10 - %pn
	for %i = 1 to %pn step 1
		%p = %p & "■"
	next
	for %i = 1 to %rn step 1
		%r = %r & "□"
	next
	Guidance(%message & " " & %p & %r)
end function

function GetFigRegion(%pn, %fp1, %fp2)
	for %i = 1 to %fp2 - %fp1 step 1
		%fd = GetFigDocument(%pn, %i + %fp1)
		%ffr = CalcFigRegion(%fd)
		%fFigRegion(%i, 1, 1) = GetX(%ffr("座標1"))
		%fFigRegion(%i, 1, 2) = GetY(%ffr("座標1"))
		%fFigRegion(%i, 2, 1) = GetX(%ffr("座標2"))
		%fFigRegion(%i, 2, 2) = GetY(%ffr("座標2"))
	next
	GetFigRegion = %fFigRegion
end function

ちなみに、いちいちマクロ本体とフォームをそれぞれ手作業でセットアップするのは面倒だなぁ、ということで、通常の花子のファイルに図面マクロの形で保存してみた。 http://members.jcom.home.ne.jp/t-usuda2/cg/macro/housha-ver.1.0.jhdc ↑のファイルをダウンロード、花子で開く。図面そのものは空っぽなものの、図面マクロの形で「放射」が保存されている。 そこで、「ツール」→「マクロ」→「変更」と操作。ここから先は感覚的に分かると思うが、表示されたダイアログ上で、図面マクロとして登録されている「放射」をシステムマクロにコピーするだけ。
タグ:マクロ

放射-なんちゃってベータ2 [花子]

例の、とりあえず「ゆらぎ」とか「重力」とかいった効果を付け加えたバージョンの「放射」。その「ゆらぎ」効果を適応したサンプル。ようはランダムに散らしているだけ。
でもって、不完全だがとりあえずそのコード。…こうしてどんどん長くなってゆく…。

ErrorBreakMode(0, 0, 0)
%pn = GetPage()
%fp1 = CountFigsPage(%pn)
%fnp = GetSelectFig()
do
	if %fnp = nil
		SelectFig?()
		%err = ErrorCode()
		if %err then
			stop
		end if
		%fnp = GetSelectFig()
	else
		exit do
	end if
loop
LinePattern(1, 1, , "R25G25B25", , , , , , )
EditDisplayMode(0)
%fn = Size(%fnp)
for %i = 1 to %fn
	%fd = GetFigDocument(%pn, %fnp(%i))
	%fr = CalcFigRegion(%fd)
	%figCenter(%i, 1) = GetX(%fr("座標1")) + GetX(%fr("座標2"))
	%figCenter(%i, 2) = GetY(%fr("座標1")) + GetY(%fr("座標2"))
	%figRegion(%i) = %fr
next
TemporaryMode()
DrawMode(3)
WaitMouseButton?(1, 1)
do
	if IsMouseButton(1) then
		WaitMouseButton?(1, 1)
		%mpa = GetMousePoint()
		%mpax = GetX(%mpa)
		%mpay = GetY(%mpa)
		if %mpa <> %mpa2 then
			for %i = 1 to %fn step 1
				%fc2(%i, 1) = %figCenter(%i, 1) - %mpax
				%fc2(%i, 2) = %figCenter(%i, 2) - %mpay
			next
			Redraw
			for %i = 1 to %fn step 1
				Line(%mpa, #[%fc2(%i, 1), %fc2(%i, 2)])
			next
		end if
	else
		exit do
	end if
		%mpa2 = %mpa
loop
for %i = 1 to %fn step 1
	%lengths(%i) = ((%mpax - %fc2(%i, 1)) ^ 2 + (%mpay - %fc2(%i, 2)) ^ 2)
next
SortArray(%lengths, 2, )
%maxLength = %lengths(1) ^ 0.5
Circle(%mpa, %maxLength, , , 0, 0)
WaitMouseButton?(1, 1)
do
	if IsMouseButton(1) then
		WaitMouseButton?(1, 1)
		%mpb = GetMousePoint()
		%mpbx = GetX(%mpb)
		%mpby = GetY(%mpb)
		if %mpb <> %mpb2 then
			%length = ((%mpax - %mpbx) ^ 2 + (%mpay - %mpby) ^ 2) ^ 0.5
			%rate = %length / %maxLength
			for %i = 1 to %fn step 1
				%fc3(%i, 1) = (%fc2(%i, 1) - %mpax) * %rate + %mpax
				%fc3(%i, 2) = (%fc2(%i, 2) - %mpay) * %rate + %mpay
			next
			Redraw
			if %rate < 0.5 then
				LinePattern(1, 1, , "R255G25B35", , , , , , )
			else
				LinePattern(1, 1, , "R25G25B25", , , , , , )
			end if
			Circle(%mpa, %length, , , 0, 0)
			for %i = 1 to %fn step 1
				Line(%mpa, #[%fc3(%i, 1), %fc3(%i, 2)])
			next
		end if
	else
		exit do
	end if
	%mpb2 = %mpb
loop
%ret = OpenMacroDialog ("radiate", )
%rep = %ret("repetition")
if %ret("cancel") then
	stop
end if
if %ret("repType") = "division" then
	%reptype = 1
else if %ret("repType") = "interval" then
	%reptype = 2
end if
for %i = 1 to %fn step 1
	%fl(%i, 1) = %fc3(%i, 1) - ((GetX(%figRegion(%i, "座標2")) - GetX(%figRegion(%i, "座標1"))) / 2)
	%fl(%i, 2) = %fc3(%i, 2) - ((GetY(%figRegion(%i, "座標2")) - GetY(%figRegion(%i, "座標1"))) / 2)
next
DisplayMode(0)
for %i = 1 to %fn step 1
	PutSelectFig(, {%fnp(%i)})
Copy(, #[%fl(%i, 1), %fl(%i, 2)], , , %reptype, %rep, )
Progress("複写処理中...", %i, %fn)
next
%fp2 = CountFigsPage(%pn)
%fFigRegion = GetFigRegion(%pn, %fp1, %fp2)
if %ret("move") > 0 then
	for %i = 1 to %fn step 1
		%maxMove = ((%fc3(%i, 1) - %mpax) ^ 2 + (%fc3(%i, 2) - %mpay) ^ 2) ^ 0.5 * %ret("move") / 20
		for %j = 1 to %rep step 1
			%move((%i - 1) * %rep + %j, 1) = %fFigRegion((%i - 1) * %rep + %j, 1, 1) + Int(Rand() * %maxMove) - 

%maxMove / 2
			%move((%i - 1) * %rep + %j, 2) = %fFigRegion((%i - 1) * %rep + %j, 1, 2) + Int(Rand() * %maxMove) - 

%maxMove / 2
		next
	next
	for %i = %fp1 + 1 to %fp2 step 1
		PutSelectFig(, {%i})
		Move(, #[%move(%i - %fp1, 1), %move(%i - %fp1, 2)], , , )
		Progress("移動処理中...", %i, %fp2)
	next
end if
if %ret("gravity") <> 0 then
	%accel = %ret("gravity") / 5
	if %ret("move") <> 0 then
		%gravity = %move
	else
		for %i = 1 to %fp2 - %fp1 step 1
			%gravity(%i, 1) = %fFigRegion(%i, 1, 1)
			%gravity(%i, 2) = %fFigRegion(%i, 1, 2)
		next
	end if
	for %i = 1 to %fn step 1
		for %j = 1 to %rep step 1
			%gravity((%i - 1) * %rep + %j, 3) = %gravity((%i - 1) * %rep + %j, 2) + (%j ^ 2) * %accel
		next
	next
	for %i = %fp1 + 1 to %fp2 step 1
		PutSelectFig(,{%i})
		Move(, #[%gravity(%i - %fp1, 1), %gravity(%i - %fp1, 3)], , , )
		Progress("重力処理中...", %i, %fp2)
	next
end if
%fFigRegion = GetFigRegion(%pn, %fp1, %fp2)
if %ret("rotate") > 0 then
	for %i = 1 to %fp2 - %fp1 step 1
		%fFigCenter(%i) = #[(%fFigRegion(%i, 1, 1) + %fFigRegion(%i, 2, 1)) / 2, \\
		(%fFigRegion(%i, 1, 2) + %fFigRegion(%i, 2, 2)) / 2]
	next
	for %i = %fp1 + 1 to %fp2 step 1
		%angle = Int(Rand() * 36 * %ret("rotate")) - 18 * %ret("rotate")
		PutSelectFig(, {%i})
		Rotate(%angle, %fFigCenter(%i - %fp1), 0, , 0)
		Progress("回転処理中...", %i, %fp2)
	next
end if
DisplayMode(1)
Redraw
Guidance("")

function Progress(%message, %numerator, %denominator)
	%p = nil
	%r = nil
	%pn = Round(%numerator / %denominator, 1) * 10
	%rn = 10 - %pn
	for %i = 1 to %pn step 1
		%p = %p & "■"
	next
	for %i = 1 to %rn step 1
		%r = %r & "□"
	next
	Guidance(%message & " " & %p & %r)
end function

function GetFigRegion(%pn, %fp1, %fp2)
	for %i = 1 to %fp2 - %fp1 step 1
		%fd = GetFigDocument(%pn, %i + %fp1)
		%ffr = CalcFigRegion(%fd)
		%fFigRegion(%i, 1, 1) = GetX(%ffr("座標1"))
		%fFigRegion(%i, 1, 2) = GetY(%ffr("座標1"))
		%fFigRegion(%i, 2, 1) = GetX(%ffr("座標2"))
		%fFigRegion(%i, 2, 2) = GetY(%ffr("座標2"))
	next
	GetFigRegion = %fFigRegion
end function

なお、この「なんちゃってベータ2」は、フォームを使っているため、このコードだけでは動かない。フォームのスクリプトは以下(長いんで「続きを読む」の先)。全文コピーしてテキストに保存(ファイル名はとりあえずradiate.txtとでも)して、あとはhttp://members.jcom.home.ne.jp/t-usuda2/cg/macro/form-info.htmを参考に。

続きを読む


タグ:マクロ

放射-まだ非公開版 [花子]

やらねばならぬ仕事の1つがなんとなく片付いたような気がしないでもないので、再びちょっと現実逃避気味に。

まだ公開できる状態にはないが、とりあえず「ゆらぎ」とか「重力」とかいった効果を付け加えたバージョンの「放射」。その「重力」効果を適応したサンプル。重力に引きずられて下に落ちていく放射である。当然、重力の設定をマイナスにすれば、上にふわふわ浮いていく感じになったりする。

何に使えるか、とかいうのはあまり考えていないのだが、とりあえず色々実験してみると何かと面白い。

・・・でもって、明日も仕事が早いのでそろそろ寝ますです。


タグ:マクロ

放射-なんちゃってベータ版 [花子]

現実逃避-その2

とりあえず、放射も収束も反復回数も好きなように設定できるように。

複数(1個でもいいのだが)の図形を選択して、マウスのドラッグで中心を指定する…というところまではテストタイプと同じ。
その後、放射する範囲をマウスのドラッグで指定する。外に向かってぐい~っとドラッグすると広い範囲に放射するし、中心に向かってぐい~っとドラッグすると(このときガイド線が赤くなる)中心に向かって収束する。
さらにその後、反復回数を指定するダイアログが表示されるので、適当な数字を入力する。と、その設定で連続コピーされる。

ErrorBreakMode(0, 0, 0)
%lpatern = GetLinePattern()
%pn = GetPage()
%fnp = GetSelectFig()
do
	if %fnp = nil
		SelectFig?()
		%err = ErrorCode()
		if %err then
			stop
		end if
		%fnp = GetSelectFig()
	else
		exit do
	end if
loop
LinePattern(1, 1, , "R25G25B25", , , , , , )
EditDisplayMode(0)
%fn = Size(%fnp)
for %i = 1 to %fn
	%fd = GetFigDocument(%pn, %fnp(%i))
	%fr = CalcFigRegion(%fd)
	%figCenter(%i, 1) = GetX(%fr("座標1")) + GetX(%fr("座標2"))
	%figCenter(%i, 2) = GetY(%fr("座標1")) + GetY(%fr("座標2"))
	%figRegion(%i) = %fr
next
TemporaryMode()
DrawMode(3)
WaitMouseButton?(1, 1)
do
	if IsMouseButton(1) then
		WaitMouseButton?(1, 1)
		%mpa = GetMousePoint()
		%mpax = GetX(%mpa)
		%mpay = GetY(%mpa)
		if %mpa <> %mpa2 then
			for %i = 1 to %fn step 1
				%fc2(%i, 1) = %figCenter(%i, 1) - %mpax
				%fc2(%i, 2) = %figCenter(%i, 2) - %mpay
			next
				Redraw
			for %i = 1 to %fn step 1
				Line(%mpa, #[%fc2(%i, 1), %fc2(%i, 2)])
			next
		end if
	else
		exit do
	end if
		%mpa2 = %mpa
loop
for %i = 1 to %fn step 1
	%lengths(%i) = ((%mpax - %fc2(%i, 1)) ^ 2 + (%mpay - %fc2(%i, 2)) ^ 2)
next
SortArray(%lengths, 2, )
%maxLength = %lengths(1) ^ 0.5
Circle(%mpa, %maxLength, , , 0, 0)
WaitMouseButton?(1, 1)
do
	if IsMouseButton(1) then
		WaitMouseButton?(1, 1)
		%mpb = GetMousePoint()
		%mpbx = GetX(%mpb)
		%mpby = GetY(%mpb)
		if %mpb <> %mpb2 then
			%length = ((%mpax - %mpbx) ^ 2 + (%mpay - %mpby) ^ 2) ^ 0.5
			%rate = %length / %maxLength
			for %i = 1 to %fn step 1
				%fc3(%i, 1) = (%fc2(%i, 1) - %mpax) * %rate + %mpax
				%fc3(%i, 2) = (%fc2(%i, 2) - %mpay) * %rate + %mpay
			next
			Redraw
			if %rate < 0.5 then
				LinePattern(1, 1, , "R255G25B35", , , , , , )
			else
				LinePattern(1, 1, , "R25G25B25", , , , , , )
			end if
			Circle(%mpa, %length, , , 0, 0)
			for %i = 1 to %fn step 1
				Line(%mpa, #[%fc3(%i, 1), %fc3(%i, 2)])
			next
		end if
	else
		exit do
	end if
		%mpb2 = %mpb
loop
%rep = InputNumber("繰返回数", 2, 1, 99, 5)
if %rep = nil then
	stop
end if
for %i = 1 to %fn step 1
	%fl(%i, 1) = %fc3(%i, 1) - ((GetX(%figRegion(%i, "座標2")) - GetX(%figRegion(%i, "座標1"))) / 2)
	%fl(%i, 2) = %fc3(%i, 2) - ((GetY(%figRegion(%i, "座標2")) - GetY(%figRegion(%i, "座標1"))) / 2)
next
DisplayMode(0)
for %i = 1 to %fn step 1
	PutSelectFig(, {%fnp(%i)})
Copy(, #[%fl(%i, 1), %fl(%i, 2)], , , 1, %rep, )
next
DisplayMode(1)
Redraw

タグ:マクロ

放射-テストタイプ [花子]

他にやらなきゃならんことがいっぱいあるのだが、気分転換的に。

ジェフさんの「分散・密集」のアイディアhttp://jchap.justblog.jp/exploring_hanako/2007/05/post_e286.htmlをちょいとマクロ化してみた。

複数(1個でもいいのだが)の図形を選択して、マウスのドラッグで中心を指定すると、放射状に図形を連続コピーするというものである。とりあえず試しにやってみたものなので、機能は全く不完全な状態であるが、どうにかなりそうな感じ。

ErrorBreakMode(0, 0, 0)
%pn = GetPage()
%fnp = GetSelectFig()
do
	if %fnp = nil
		SelectFig?()
		%err = ErrorCode()
		if %err then
			stop
		end if
		%fnp = GetSelectFig()
	else
		exit do
	end if
loop
LinePattern(1, 1, , "R0G0B0", , , , , , )
EditDisplayMode(0)
%fn = Size(%fnp)
for %i = 1 to %fn
	%fd = GetFigDocument(%pn, %fnp(%i))
	%fr = CalcFigRegion(%fd)
	%figCenter(%i, 1) = GetX(%fr("座標1")) + GetX(%fr("座標2"))
	%figCenter(%i, 2) = GetY(%fr("座標1")) + GetY(%fr("座標2"))
	%figRegion(%i) = %fr
next
TemporaryMode()
DrawMode(1)
WaitMouseButton?(1, 1)
do
	if IsMouseButton(1) then
		WaitMouseButton?(1, 1)
		%mpa = GetMousePoint()
		%mpax = GetX(%mpa)
		%mpay = GetY(%mpa)
		if %mpa <> %mpa2 then
			for %i = 1 to %fn step 1
				%fc2(%i, 1) = %figCenter(%i, 1) - %mpax
				%fc2(%i, 2) = %figCenter(%i, 2) - %mpay
			next
				Redraw
			for %i = 1 to %fn step 1
				Line(%mpa, #[%fc2(%i, 1), %fc2(%i, 2)])
			next
		end if
	else
		exit do
	end if
		%mpa2 = %mpa
loop
for %i = 1 to %fn step 1
	%fl(%i, 1) = %fc2(%i, 1) - ((GetX(%figRegion(%i, "座標2")) - GetX(%figRegion(%i, "座標1"))) / 2)
	%fl(%i, 2) = %fc2(%i, 2) - ((GetY(%figRegion(%i, "座標2")) - GetY(%figRegion(%i, "座標1"))) / 2)
next
DisplayMode(0)
for %i = 1 to %fn step 1
	PutSelectFig(, {%fnp(%i)})
	Copy(, #[%fl(%i, 1), %fl(%i, 2)], , , 1, 5, )
next
DisplayMode(1)
Redraw
いつのことになるか分からないが、諸々の設定、および、コピーした図形をランダムに散らせたりする機能を搭載させる予定。…いつのことになるか分からないが。
タグ:マクロ

花子2Illustrator-その2 [花子]

花子で出力したSVGをIllustrator用に一発で調整するマクロを作ってみようかな、と思ったのだが、文字コードの都合でうまく動作せず。

もともと、単に線幅を修正するだけでなく、その他の微調整を自動化させたいなぁ、というのがあったため、マクロを組もうと思っていたのである。が、文字コードを変換させる機能を実装して云々というのは、どう考えても無駄に手間がかかるだけっぽい。というわけでサクッとあきらめ、より手軽な方法へとサクッと方針転換。幅が10倍になっていた線を元に戻す操作のアクション(ざっくり言うと記録型のマクロのようなもの)を記録することに。

これで、読み込んだSVGを選択してスイッチぽんするだけで、線幅が修正されるようになる。


で、だ。文字コードの都合でマクロが正常には動かないという話を冒頭でしたわけだが…
以前、SVGをメモ帳でちょちょっと書き換える話をしたが、これ、「メモ帳」のように、UTF-8が扱えるエディタでないとうまくいかないので注意が必要である。

※その後重要な訂正事項あり


タグ:Tips

花子2Illustrator [花子]

今までもちょこちょこいじってはいたが、改めて花子とIllustratorを併せて。

花子のSVG出力はかなり出来が良く、他ソフトへデータを持って行きたいときにも結構使える。花子からIllustratorにデータを持って行くときには、SVGを経由させるのが、おそらくベストだと思う。

花子でSVG保存したデータを実際にIllustrator(cs2)で開いた様子が(↓)である。

なお、これは、あらかじめ新規ドキュメントを開いておき、そこに「ファイル」→「配置」でSVGを読み込んでいる


一方、「ファイル」→「開く」でSVGファイルを新規のドキュメントとして開いた場合、読み込んだSVGは画面の一番端っこに配置された状態になっている。一見するとちゃんと読み込まれていないように見えるが、表示倍率をグーッと小さくすると、左端(スクラッチエリア(花子で言うところのワークスペース)の左上端)に読み込まれたデータが見えてくる。

相変わらずかなり適当なイメージが(↑)である。細かい説明はザックリ省いているが、ようはこんな感じである。
だもんで、必要に応じて、読み込んだデータを選択しアートボードの中までズズズイと動かしてくる必要がある。


さて、読み込んだは良いが、表示が何やらおかしいことになっている。

これでは使い物にならない…と思うのは早計で、実は線幅が10倍になって読み込まれているだけというのが実態である。線幅を1/10にすれば、

(↑)のようにきれいになる。
線幅を1/10にする、というのもいろいろなやり方があるだろう。

たとえば、全体を選択し、「オブジェクト」→「変形」→「拡大・縮小」と操作し、縦横比を固定、線幅/効果も拡大・縮小はOffで拡大率1000%という設定で拡大。
その後、同様の操作をくり返し、縦横比を固定、線幅/効果も拡大・縮小はOnで拡大率10%という設定で縮小する。
すると、全体はもとのサイズのまま線幅だけを1/10にすることができる。

※その後重要な訂正事項あり


タグ:Tips

袋文字 [花子]


基本的なテクニックとして、こんな(↑)白抜きの線を作る方法がある。


やや太めの線を引いた後(↑)、それをコピーする。「編集」→「重ねて貼り付け」→「前面に貼り付け」と操作する。と、始めに引いた線の上に、全く同じ線が重なった状態になる。上に乗っかっている方の線が選択された状態になっているので、そのまま線種を細くし、線色を変えることにより、冒頭のような白抜きの線にすることができる。


ようは、上のように(↑)太い黒い線の上に白い細い線がぴったり乗っかった状態になっている、ということである。


上のように(↑)、線色、線の太さの他に線種も変えると、


こんな鉄道線(↑)にすることができる。
現在の花子には「鉄道線化」機能があるためボタン一発でこのような線にすることができるが、それまではこのように手作業でやっていたわけである。


言うまでもなく、これと同じようなことを文字に対しても行うことができる。


適当な文字列(↑)を、


アウトライン化する(↑)。この後、線を太めにし、適当な線色を適応しておく。

先ほどと同様、全体を選択し、「編集」→「重ねて貼り付け」→「全面に貼り付け」と操作する。
そうすると、アウトライン化された文字が2つぴったり重なった状態になり、かつ、上に乗っかった方の文字が選択された状態になっている。そのまま線種を「なし」にし、適当な塗り(たとえば白)を適応する。と、


こんな具合に白抜きになった、いわゆる袋文字にすることができる(↑)。

さらに、同じ操作を何回かくり返すことによって、

こんな具合の(↑)文字(多重の袋文字)にすることもできる。

ちなみにこの文字、1文字ずつグループ化しておくとその後の操作が楽だが、場合によってはあえてグループ化しない方が良いこともある。

グループ化しないでおくと、文字を重ねたときに、線が解け合ったような感じになる。

グループ化せずに文字を重ねたもの(左)と、1文字ずつグループ化して文字を重ねたもの(右)


タグ:Tips

花子でプロット [花子]

わけあって花子上で波形のプロットをしている。

棒グラフや円グラフのような一般的なグラフを描くときは、花子よりExcelや三四郎などの表計算でサクッと作った方が楽である。当たり前だが。
それらのソフトでは描ききれない微妙な調整をしたいときなどに、花子上でそれらのグラフを編集する、というのが、実用的な、というか無難なやり方だろう。

しかし、そういう一般的でないグラフも世の中にはたくさんある。大学院に在学中、Excelに入力されたデータを(CSVでエクスポートして)読み込み、花子上で樹幹投影図を自動で作成するマクロを組んだことがあった(いずれ整理して公開するかもしれない)。そういう、手作業でやるには非現実的だし、かといって1からソフトを作るのも非現実、というような作図作業をするとき、花子のマクロを使うというのは1つの手である。

で、わけあって、音声の波形をプロットさせているのである。

できるにはできるのだが、数秒ですいーっとプロットが終わるときもあれば、異様に重く数十分かかるときもある。この不可解な不安定さの原因が分からず、苦心中。時間がかかるだけでプロット自体はできるから良いといえば良いのだけれど、できれば常にスムーズに動いてほしいし…。


タグ:マクロ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。