|
前章でのマウス操作については、第3例パターンを利用する事にします。キーボードとの同時押しは「今風」ではありませんからパスするとして、本来は、マウス両ボタン押し操作というのは、マウスに不慣れな方には少し難しいのではないか?とも思えますが、当面、自由点指示とスナップ指示を別々にしたいため、このようにします。
スナップ指示をするには、既に作図されている要素点を検索する必要があり、どうしても時間が掛かってしまいます。自由点指示では余り時間を掛けたくない為の処置、とします。
前章での[2点指示画面移動][2点指示画面拡大][2点指示画面縮小]ボタンは削除しておきます。マウスで指定出来るから、マウス操作の混乱を避けるため、です。
次に、画面描画を速く表示させるため、Imageコンポーネントではなく、[System]内にある「PaintBox」コンポーネントを使う事にします。このPaintBoxは、Imageよりも機能は少ない代わりに、Imageよりも高速に描画します。Imageコンポーネントを削除し、PaintBoxを貼り付け、イベントの定義(OnMouseDown,OnMouseMove、OnMouseUp)を行っておき、これまでImage1として記述していたのをPaintBox1に置き換えます。
なお、PaintBoxコンポーネントの注意点は、フォームが他の画面で隠されたり、リサイズ等をした際に、Imageコンポーネントは自動的に再描画してくれていましたが、PaintBoxの場合には、自動的に再描画してくれませんので、自分で再描画のプログラムを書かないといけません。
PaintBoxが再描画を必要とする際には、OnPaintイベントが起きますので、OnPaintイベントの処理を記述します。
取りあえずはここまでのプログラムです。
【サンプルプログラムのソース】
プログラムを消す作業は、後で使えそうな部分はコメント(注釈文)にしておくと良いです。
それでは、線分を描く事を考えましょう。
線分を描くには、既に以前の章で述べましたが、
MoveTo(Px1,Py1);
LineTo(Px2,Py2); |
で描けます。しかしこれは、整数値の画面dot座標です。CADで扱うのはmm座標ですので、mmをdotに変換させなければなりません。また、マウスで座標を指示する場合には、マウスで得られる座標値は画面dot座標ですので、これをmmに変換させる必要があります。つまりは以下の手順になります。
マウス指示 (dot座標値)
↓
dot→mmに変換
↓
データを登録(mm値)
↓
mm→dot変換
↓
画面表示
※dot値で入力して dot値で表示させるのなら、mmに変換する必要は無いのではないか? と疑問を持たれる方もいるかもしれません。しかしdot値だと、CAD画面上で画面移動や画面拡大・縮小によって状況が変わってしまいますので、これに対応出来ません。
変換については、既に記した通り、下記のようになります。
画面dot座標値をmm座標値に変換
X'=X1+X/mm_dot;
Y'=Y2−Y/mm_dot; |
|
(X,Y):画面dot座標値
(X',Y'):得られるmm座標値 |
mm座標値を画面dot座標値に変換
X= (X'−X1)×mm_dot
Y=−(Y'−Y2)×mm_dot |
|
(X',Y'):mm座標値
(X,Y):得られる画面dot座標値 |
整数変数を実数計算する際には、式でそのまま使えますが、実数計算結果の実数値を整数変数に入れる場合には、整数化(丸め処理)を行う必要があります。それには、
・Round関数
「実数を丸めてもっとも近い整数にした値を返す」
・Trunc関数
「実数型の値を切り捨てて整数型の値にする」
・自前で四捨五入を行うRoundOff関数を作る(Delphiヘルプより)
function Roundoff(X: Extended): Longint;
begin
if x >= 0 then Result := Trunc(x + 0.5)
else Result := Trunc(x - 0.5);
end; |
このサンプルでは、Round関数をそのまま使っています。
さて、データ登録ですが、このサンプルでは、配列変数(静的配列)に入れるようにしています(最大100要素)。開始点X座標、開始点Y座標、終了点X座標、終了点Y座標、を保持するとして、これを、
DataX1[1]〜DataX1[100]
DataY1[1]〜DataY1[100]
DataX2[1]〜DataX2[100]
DataY2[1]〜DataY2[100]
として扱えるように
var
DataX1 : array[1..100] of Double;
DataY1 : array[1..100] of Double;
DataX2 : array[1..100] of Double;
DataY2 : array[1..100] of Double;
と宣言する事も可能ですが、バラバラだと扱いに困るかもしれませんし、後々のプログラミングで混乱の元になるかもしれません。そのため、record型を利用し、
type
TDataLine = record
x1,y1 : Double;
x2,y2 : Double;
end;
とrecord定義をしておき、
var
Dat : array[1..100] of TDataLine;
のように配列宣言しておけば、
Dat[1].x1 〜 Dat[100].x1
Dat[1].y1 〜 Dat[100].y1
Dat[1].x2 〜 Dat[100].x2
Dat[1].y2 〜 Dat[100].y2
が使えるようになります。また、データ登録数を管理する変数 Dat_N も宣言しておきます。
マウスでの線分作図指定、データ登録、そして、再描画の箇所に、既に登録した図形の再描画を入れておきます。
【サンプルプログラムのソース】
|
|
CAD装置(1)
CAD装置(2)
メディア
AutoCADの
DIESELマクロ
CSV
DXF
PCES
IGES
STEP
数学とCAD
CAD作ろ!
▲PREV
▼NEXT
|