マウスクリックで図形を描く(3)
普段なにげなく使っている直線ツールや四角形ツールをマイツール化してみましょう。クリックインタフェースを学び、ツール化までしてみます。
第3章 二点クリック(四角形ラバー)
二点クリックの操作は本体機能の四角形ツールと同じです。
手続きGetRect(VAR p1X, p1Y, p2X, p2Y : REAL);
を使います。
この手続きを実行すると、マウスカーソルが十字カーソルになりクリックをするまで待ち続けます。図面の任意の場所でクリック(始点)すると、ラバーバンドが出て、次のクリック(終点)をするまで待ち続けます。その位置座標を引数 p1X, p1Y, p2X, p2Y に実数の値で返します。
クリックされた場所をメッセージウインドウに表示するプログラムをかいて見ましょう。
メッセージウインドウに表示するには、
手続きMessage( z1, z2, ..., zN : ANY );
を使います。
PROCEDURE sample; VAR p1X, p1Y, p2X, p2Y : REAL; BEGIN GetRect( p1X, p1Y, p2X, p2Y ); Message( p1X, ',', p1Y, ',', p2X, ',', p2Y ); END; Run( sample );
残念ながら、このままではラバーバンドは消えてしまいます。
何故なら 手続きGetRectは2点の座標を返すだけの命令だからです。
では次に、四角形ツールのように四角形を描かせてみましょう。
四角形は、
手続き Rect(p1X, p1Y, p2X, p2Y : REAL);
を使います。
PROCEDURE sample; VAR p1X, p1Y, p2X, p2Y : REAL; BEGIN GetRect( p1X, p1Y, p2X, p2Y ); Rect( p1X, p1Y, p2X, p2Y ); END; Run( sample );
手続き GetRectはクリックした座標位置を返しますが、その数値を使って四角形しか描けないわけではありませんたとえば、下の図のような図形はどうでしょう?
Vectorworksで四角錐を描くには多段柱状体の機能を使うと簡単に描けます。
多段柱状体を描くにあたって必要な情報は、 四角形とピラミッド(四角錐)の頂点の座標位置を求める必要があります。
四角形は、GetRectから得た始点終点の座標を引数とすることで描けます。
頂点は多段柱状体を使うので、2D基準点を四角形の中心に描けばよいわけですが、四角形の中心を求めるのに
手続きLineLineIntersection(l1start, l1end, l2start, l2end : POINT; VAR parallel, intOnLines : BOOLEAN; VAR sectpt : POINT);
を使うと便利です。
四角形の四隅の座標を与えることで、2線の交わる座標を求めることができます。
あとは、多段柱状体にするために、
手続きBeginMXtrd(startDistance, endDistance : REAL);
手続きEndMXtrd;
で囲めばできあがりです。
多段柱状体の立ち上がりの高さと、多段柱状体の高さは0.0、50.0とし定数としておきます。
PROCEDURE sample; CONST kstartDistance = 0.0; kendDistance = 50.0; VAR p1X, p1Y, p2X, p2Y : REAL; l1start, l1end, l2start, l2end, sectpt : POINT; parallel, intOnLines : BOOLEAN; BEGIN GetRect( p1X, p1Y, p2X, p2Y ); l1start.x := p1X;l1start.y := p1Y;l1end.x := p2X;l1end.y := p2Y; l2start.x := p2X;l2start.y := p1Y;l2end.x := p1X;l2end.y := p2Y; LineLineIntersection( l1start, l1end, l2start, l2end, parallel, intOnLines, sectpt ); BeginMXtrd( kstartDistance, kendDistance ); Rect( p1X, p1Y, p2X, p2Y ); Locus( sectpt.x, sectpt.y ); EndMXtrd; END; Run( sample );