SSブログ

ベジエに沿って回転させつつ複写-ちょっと別のバージョンのテスト [花子]

昨日のピンポイント予報では6:00頃には弱雨なれど3:00では曇りのようだったうえ風も穏やかのようだったから、ぎりぎりを狙って今日も4:00に起きてみたが、既にだくだくと雨は降っていた。この条件の悪さにはさすがに辟易する…。




と、いうわけで別の作業。その合間に、再びちょろっとマクロをいじってみる。

前回のものは、指定したベジエ曲線を「何等分するか」というやり方だったが、今回のものは、指定したベジエ曲線上に「何ミリ間隔で配置するか」、というやり方。どんな長さのベジエに対しても、常に同じ間隔で図形を配置したいのである。

no-title


マクロ自体は前回の時点で基本的な部分がほとんどできあがっていることもあり、数行いじっただけで概ね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()

タグ:マクロ
nice!(0)  コメント(2)  トラックバック(1) 

nice! 0

コメント 2

jchap

これはまたすばらしいマクロとコンセプトですね。ちょうどこういう機能を欲しがっていました。

こういうのをジャストシステムに売れば、金になりそう名話だと思いますが、やってみましたか?まあマクロの実行速度は、花子の標準搭載機能と比べてどうしても遅くなりがちですが、ロジックとコードを提供すれば、買ってくれるかもしれませんよ。



by jchap (2008-04-15 22:09) 

t-usuda

> ロジックとコードを提供すれば

これがですねぇ、もともと花子に搭載されている機能をアクロバティックに組み合わせて作っているものなので、「マクロ」としては成立しているのですが、花子にネイティブで組み込むにはちょっと難のあるコードなんです。非効率と言うか不正確と言うか…。

あるいは、ジャストシステムのHPにマクロのコーナーを作ってもらう、というのも、手としてはアリかなぁ、という気もします。花子に限らず、というよりむしろ、一太郎や三四郎のマクロを作っている方は大勢いらっしゃいますし、そういったマクロを簡単な解説とともにダウンロードできるような。フリーのものから数百円程度で手軽に販売できるようなシステムができたら、作る方も使う方も悪くはない話なのではないかなぁ、と思います。
by t-usuda (2008-04-18 21:29) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 1

トラックバックの受付は締め切りました

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