|
円の前にまず、微調整を行っておきます。
@画面右に表示している数値が分かりにくいので書き方を変更し、ウィンドウの大きさ確認表示はもう必要無いでしょうから外しておきます。
A用紙中心(原点)、用紙枠隅の4点、をスナップ出来るようにしておきます。TFmMain.MouseSnap()内を書き換えています。
B色設定で、色を表示している四角をダブルクリックしたら色設定画面を閉じて現在色をその色に指定するようにします。(普通に[OK]をクリックするだけならば「レイヤ色」)
C線種設定で、線種一覧からダブルクリックしたら、線種設定画面を閉じて現在線種をその線種に指定するようにします。(普通に閉じるボタン[×]をクリックするだけならば「レイヤ線種」)
D線種表現の微調整。
それでは、円を描く事を考えましょう。
円を描くには、既に述べた通り、
でImageやPaintBoxのCanvas作図出来ます。このx1,y1,x2,y2は、円(楕円)に外接する長方形の座標を指定します。勿論これは整数値の画面dot座標ですので、mm値との変換が必要です。
しかしCADでは通常、外接長方形の座標を扱う事は余り無く、大抵は、中心点(x1,y1)及び半径(r1)を扱います。勿論、こうでなければならない、という決まりはありません。いろいろやってみるのもプログラミングの楽しみの1つです。
データを格納せねばなりませんが、以前は線分だけでしたので、
TDataLine = record // 線分データ定義
lay : Integer ; // レイヤ番号
col : Integer ; // 色番号
lin : Integer ; // 線種番号
wid : double ; // 線幅
x1,y1 : Double; // 開始点座標 X,Y[mm]
x2,y2 : Double; // 終了点座標 X,Y[mm]
end;
・・・
Dat : array of TDataLine; // 線分データ
Dat_N : Integer ; // 線分データ量 |
となっていましたが、これに円が加わる場合、どのように対応させるかがポイントとなってきます。まずは混合タイプ。
TDataEntities = record // データ定義
typ : Integer ; // 要素の種類(1:直線 2:円 ・・・)
lay : Integer ; // レイヤ番号
col : Integer ; // 色番号
lin : Integer ; // 線種番号
wid : double ; // 線幅
p1,p2,p3,p4,p5,p6 : Double; // 第1〜第6データ[mm]
end;
・・・
Dat : array of TDataEntities; // データ
Dat_N : Integer ; // データ量 |
この場合、線分は4つのデータ(x1,y1,x2,y2)までしか必要とせず2つのデータはダミーデータ(意味のないデータ)となります。また、円は3つのデータ(x1,y1,r1)ですのでダミーは3つとなります。ダミーの分だけメモリを無駄に消費する事になります。が、プログラムではこのレコードだけを見れば良いので簡単になるでしょう。
次に、個別タイプ。
TDataAttr = Record // 属性データ定義
lay : Integer ; // レイヤ番号
col : Integer ; // 色番号
lin : Integer ; // 線種番号
wid : double ; // 線幅
end;
TDataLine = record // 線分データ定義
att : TDataAttr; // 属性
x1,y1 : Double; // 開始点座標 X,Y[mm]
x2,y2 : Double; // 終了点座標 X,Y[mm]
end;
TDataCircle = record // 円データ定義
att : TDataAttr; // 属性
x1,y1 : Double; // 中心点座標 X,Y[mm]
r1 : Double; // 半径 r[mm]
end;
・・・
DatL : array of TDataLine; // 線分データ
DatL_N : Integer ; // 線分データ量
DatC : array of TDataLine; // 円データ
DatC_N : Integer ; // 円データ量 |
この場合は、見た目、煩雑な感じがしてしまうかもしれません。が、慣れてしまえばそうでも無いでしょう。但し、
線1→円1→線2→線3→円2→円3→円4→線4
という順に作図していたとしても、再描画の際には、
線1→線2→線3→線4→円1→円2→円3→円4
のようになってしまいますので、特に線幅を指定しているような場合は、重なりの部分で見え方が変わってしまいます。これを防ぐには、作図順序を示す別のデータ列が必要になってきます。例えば、
TDataOrder = Record // データの順序を示す定義
typ : Integer ; // 要素の種類(1:直線 2:円 ・・・)
n : Integer ; // 何個目のデータかを示す番号
end;
・・・
DatO : array of TDataOrder;
DatO_N : Integer ; // 要素データ量 |
も併せて作っておき、データ登録時、再描画時、などでこれを考慮してプログラミングします。
さぁ、混合タイプ、個別タイプ、どちらでプログラミングを行うか?
将来、アンドゥ/リドゥを行いたいのであれば、それをし易くするためのデータ構造にしておく必要もあるかもしれません。
ここでは、プログラムを簡単にするために、前者の混合タイプを利用する事にします。
データ構造を決めたら、実際の円の描画用の関数を作成し、円の作図ロジックを作成(まずは中心点指定→半径点指定→作図・登録、を行う処理部分)、それに応じて、ラバーバンドの処理、図形範囲への対応、端点検索の対応(1/4点に対応させます)、全要素表示への対応、等を行います。
取りあえず、ここまでのサンプルプログラムです。
【サンプルプログラムのソース】
|
|
CAD装置(1)
CAD装置(2)
メディア
AutoCADの
DIESELマクロ
CSV
DXF
PCES
IGES
STEP
数学とCAD
CAD作ろ!
▲PREV
▼NEXT
|