ベジエに沿って回転させつつ複写-ちょっと別のバージョンのテスト [花子]
昨日のピンポイント予報では6:00頃には弱雨なれど3:00では曇りのようだったうえ風も穏やかのようだったから、ぎりぎりを狙って今日も4:00に起きてみたが、既にだくだくと雨は降っていた。この条件の悪さにはさすがに辟易する…。
と、いうわけで別の作業。その合間に、再びちょろっとマクロをいじってみる。
前回のものは、指定したベジエ曲線を「何等分するか」というやり方だったが、今回のものは、指定したベジエ曲線上に「何ミリ間隔で配置するか」、というやり方。どんな長さのベジエに対しても、常に同じ間隔で図形を配置したいのである。
マクロ自体は前回の時点で基本的な部分がほとんどできあがっていることもあり、数行いじっただけで概ねOK。ここまでは思いがけず比較的するりするりと完成。相変わらず微分は必要ないし積分も「中の人」に丸投げなのでそこは楽ちんポンである。
もうちょっとちゃんとした形にするのであれば、前回のやつと今回のやつを一つにまとめて、もうちょっとちゃんとしたインターフェイスを作ればとりあえずは良さそうである。…まあ、余裕があれば。
肝心のコードは以下。
と、いうわけで別の作業。その合間に、再びちょろっとマクロをいじってみる。
前回のものは、指定したベジエ曲線を「何等分するか」というやり方だったが、今回のものは、指定したベジエ曲線上に「何ミリ間隔で配置するか」、というやり方。どんな長さのベジエに対しても、常に同じ間隔で図形を配置したいのである。
マクロ自体は前回の時点で基本的な部分がほとんどできあがっていることもあり、数行いじっただけで概ねOK。ここまでは思いがけず比較的するりするりと完成。相変わらず微分は必要ないし積分も「中の人」に丸投げなのでそこは楽ちんポンである。
もうちょっとちゃんとした形にするのであれば、前回のやつと今回のやつを一つにまとめて、もうちょっとちゃんとしたインターフェイスを作ればとりあえずは良さそうである。…まあ、余裕があれば。
肝心のコードは以下。
ErrorBreakMode(0, 0, 0) %pn = GetPage() %fnAll = CountFigsPage(%pn) !!複写する図形を指定 Message("複写する図形を指定して下さい", 1) do if %fnCopy = nil then SelectFig?() %err = ErrorCode() if %err then stop end if %fnCopy = GetSelectFig() else exit do end if loop !!図形の中心を指定 Message("複写する図形の中心を指定して下さい", 1) Dot?() %err = ErrorCode() if %err then stop end if %dot = GetFigDocument(%pn, %fnAll + 1) %dotdata = GetDotData(%dot) %dotX = GetX(%dotdata) %dotY = GetY(%dotdata) Delete(, ) %fd = GetFigDocument(%pn, %fnCopy(1)) %sp = CalcFigRegion(%fd) %spx = GetX(%sp("座標1")) %spy = GetY(%sp("座標1")) %objectX = %spx - %dotX %objectY = %spy - %dotY !!基準になるベジエ曲線を指定 Message("ベジエ曲線を指定して下さい", 1) do SelectFig?() %err = ErrorCode() if %err then stop end if %fnBezier = GetSelectFig() %fd = GetFigDocument(%pn, %fnBezier(1)) %ft = GetFigType(%fd) if %ft = "ベジエ曲線" then %bl = MeasureLength() exit do else Message("扱えない図形です-ベジエ曲線を指定し直して下さい", 1) end if loop !!間隔を指定 %interval = InputNumber("間隔を指定して下さい(mm)", 3, 1, 100, 50) %divide = Ip(%bl / %interval) + 1 %remainder = (1 - Fp(%bl / %interval)) * %interval EditDisplayMode(0) DisplayMode(0) !!座標を計算 Copy(, , , , , , ) %fd = GetFigDocument(%pn, %fnAll + 1) %coord = GetBezierData(%fd) %sc = %coord(Size(%coord), 1) %ec = #[GetX(%sc) + %remainder, GetY(%sc)] Line(%sc, %ec) PutSelectFig(%pn, {%fnAll + 1, %fnAll + 2}) Join(3,,,,) PutSelectFig(%pn, {%fnAll + 1}) Divide(2, , %divide, , , , , , ) for %i = 1 to %divide step 1 %fd = GetFigDocument(%pn, %fnAll + %i) %coord = GetBezierData(%fd) %coordArray(%i, 1) = %coord(1, 1) %coordArray(%i, 2) = -Angle(GetX(%coord(1, 3)), GetY(%coord(1, 3))) * 180 / Pi() %coordArray(%i, 3) = #[GetX(%coord(1, 1)) + %objectX, GetY(%coord(1, 1)) + %objectY] %gradient(%i) = %fnAll + %i next !!コピーと回転 for %i = 1 to %divide step 1 PutSelectFig(%pn, %fnCopy) Copy(, %coordArray(%i, 3), , , , , ) Rotate(%coordArray(%i, 2), %coordArray(%i, 1), , , ) next !!余計な図形を消す PutSelectFig(%pn, %gradient) Delete(,) EditDisplayMode(1) DisplayMode(1) RedrawAll()
タグ:マクロ
2008-04-10 00:00
nice!(0)
コメント(2)
トラックバック(1)
これはまたすばらしいマクロとコンセプトですね。ちょうどこういう機能を欲しがっていました。
こういうのをジャストシステムに売れば、金になりそう名話だと思いますが、やってみましたか?まあマクロの実行速度は、花子の標準搭載機能と比べてどうしても遅くなりがちですが、ロジックとコードを提供すれば、買ってくれるかもしれませんよ。
by jchap (2008-04-15 22:09)
> ロジックとコードを提供すれば
これがですねぇ、もともと花子に搭載されている機能をアクロバティックに組み合わせて作っているものなので、「マクロ」としては成立しているのですが、花子にネイティブで組み込むにはちょっと難のあるコードなんです。非効率と言うか不正確と言うか…。
あるいは、ジャストシステムのHPにマクロのコーナーを作ってもらう、というのも、手としてはアリかなぁ、という気もします。花子に限らず、というよりむしろ、一太郎や三四郎のマクロを作っている方は大勢いらっしゃいますし、そういったマクロを簡単な解説とともにダウンロードできるような。フリーのものから数百円程度で手軽に販売できるようなシステムができたら、作る方も使う方も悪くはない話なのではないかなぁ、と思います。
by t-usuda (2008-04-18 21:29)