見開き [花子]
Just MyShopでもCreative Suite 3が取り扱われるようになった。
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が扱えるエディタでないとうまくいかないので注意が必要である。
花子2Illustrator [花子]
今までもちょこちょこいじってはいたが、改めて花子とIllustratorを併せて。
花子のSVG出力はかなり出来が良く、他ソフトへデータを持って行きたいときにも結構使える。花子からIllustratorにデータを持って行くときには、SVGを経由させるのが、おそらくベストだと思う。
花子でSVG保存したデータを実際にIllustrator(cs2)で開いた様子が(↓)である。
なお、これは、あらかじめ新規ドキュメントを開いておき、そこに「ファイル」→「配置」でSVGを読み込んでいる。
一方、「ファイル」→「開く」でSVGファイルを新規のドキュメントとして開いた場合、読み込んだSVGは画面の一番端っこに配置された状態になっている。一見するとちゃんと読み込まれていないように見えるが、表示倍率をグーッと小さくすると、左端(スクラッチエリア(花子で言うところのワークスペース)の左上端)に読み込まれたデータが見えてくる。
相変わらずかなり適当なイメージが(↑)である。細かい説明はザックリ省いているが、ようはこんな感じである。
だもんで、必要に応じて、読み込んだデータを選択しアートボードの中までズズズイと動かしてくる必要がある。
さて、読み込んだは良いが、表示が何やらおかしいことになっている。
これでは使い物にならない…と思うのは早計で、実は線幅が10倍になって読み込まれているだけというのが実態である。線幅を1/10にすれば、
(↑)のようにきれいになる。
線幅を1/10にする、というのもいろいろなやり方があるだろう。
たとえば、全体を選択し、「オブジェクト」→「変形」→「拡大・縮小」と操作し、縦横比を固定、線幅/効果も拡大・縮小はOffで拡大率1000%という設定で拡大。
その後、同様の操作をくり返し、縦横比を固定、線幅/効果も拡大・縮小はOnで拡大率10%という設定で縮小する。
すると、全体はもとのサイズのまま線幅だけを1/10にすることができる。
袋文字 [花子]
基本的なテクニックとして、こんな(↑)白抜きの線を作る方法がある。
やや太めの線を引いた後(↑)、それをコピーする。「編集」→「重ねて貼り付け」→「前面に貼り付け」と操作する。と、始めに引いた線の上に、全く同じ線が重なった状態になる。上に乗っかっている方の線が選択された状態になっているので、そのまま線種を細くし、線色を変えることにより、冒頭のような白抜きの線にすることができる。
ようは、上のように(↑)太い黒い線の上に白い細い線がぴったり乗っかった状態になっている、ということである。
上のように(↑)、線色、線の太さの他に線種も変えると、
こんな鉄道線(↑)にすることができる。
現在の花子には「鉄道線化」機能があるためボタン一発でこのような線にすることができるが、それまではこのように手作業でやっていたわけである。
言うまでもなく、これと同じようなことを文字に対しても行うことができる。
適当な文字列(↑)を、
アウトライン化する(↑)。この後、線を太めにし、適当な線色を適応しておく。
先ほどと同様、全体を選択し、「編集」→「重ねて貼り付け」→「全面に貼り付け」と操作する。
そうすると、アウトライン化された文字が2つぴったり重なった状態になり、かつ、上に乗っかった方の文字が選択された状態になっている。そのまま線種を「なし」にし、適当な塗り(たとえば白)を適応する。と、
こんな具合に白抜きになった、いわゆる袋文字にすることができる(↑)。
さらに、同じ操作を何回かくり返すことによって、
こんな具合の(↑)文字(多重の袋文字)にすることもできる。
ちなみにこの文字、1文字ずつグループ化しておくとその後の操作が楽だが、場合によってはあえてグループ化しない方が良いこともある。
グループ化しないでおくと、文字を重ねたときに、線が解け合ったような感じになる。
グループ化せずに文字を重ねたもの(左)と、1文字ずつグループ化して文字を重ねたもの(右)
花子でプロット [花子]
わけあって花子上で波形のプロットをしている。
棒グラフや円グラフのような一般的なグラフを描くときは、花子よりExcelや三四郎などの表計算でサクッと作った方が楽である。当たり前だが。
それらのソフトでは描ききれない微妙な調整をしたいときなどに、花子上でそれらのグラフを編集する、というのが、実用的な、というか無難なやり方だろう。
しかし、そういう一般的でないグラフも世の中にはたくさんある。大学院に在学中、Excelに入力されたデータを(CSVでエクスポートして)読み込み、花子上で樹幹投影図を自動で作成するマクロを組んだことがあった(いずれ整理して公開するかもしれない)。そういう、手作業でやるには非現実的だし、かといって1からソフトを作るのも非現実、というような作図作業をするとき、花子のマクロを使うというのは1つの手である。
で、わけあって、音声の波形をプロットさせているのである。
できるにはできるのだが、数秒ですいーっとプロットが終わるときもあれば、異様に重く数十分かかるときもある。この不可解な不安定さの原因が分からず、苦心中。時間がかかるだけでプロット自体はできるから良いといえば良いのだけれど、できれば常にスムーズに動いてほしいし…。