AFsoft WebSite(エーエフソフト・ウェブサイト)
 

オペレーティング・システムについて

プログラミングについて
ホームページについて
キャドについて
電子カタログについて
書籍・雑誌
イベント
リンク集
CAD作ろ! 線分を描く
前章でのマウス操作については、第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
 
お問い合わせ 
本サイトはリンクフリーです
リンクバナー
(C)Copyright 1999-2015 By AFsoft All Rights Reserved.