


 
 
 
 
 
 
 |
さて、要素(線分、円、円弧、点、文字)の作図は出来ました。いろいろな作図方法がありますので「CAD」と呼ぶにはまだまだですが、それについては後の節で述べるとして、作図が出来ましたら、次には、編集関連の機能が必要です。つまり、要素の削除機能、及び、変更機能です。これが無いとお話になりません。そして、要素を削除・変更するためには、どの要素を削除・変更するのかを選択する必要があります。要素を選択する手法としては、1要素選択と枠内範囲要素選択があります。CADによっては、多角形範囲要素選択(輪投げ選択なども、短い線分の集まりの多角形範囲要素選択と言えます)というのもあります。ここでは、まず、1要素選択について記述します。
1要素検索は、指定点と要素との距離を計測し、その値が、選択領域内であれば、それを取得、という具合にします。選択領域は、通常は、マウスでスナップする際の認識範囲と同じ、で構いません。
(※その他、マウス周辺の認識範囲という小さなエリアでクリッピング対象となる要素を選択する、という手法もありますが、ここでは用いません)
@線分
 |  |
指定点と線分までの距離を算出し、それが認識範囲 AREA 以下であり、垂直に下ろした点が線上にあれば、その線分を指定した事となる。また、線端部分は線端スナップと同様のチェックを行えばOKでしょう。
(先端部分の認識範囲を円のように扱いたい場合には、指定点と線端の距離を計測すればOKです) |
A円
 |  | 指定点と円までの距離を算出し、それが認識範囲 AREA 以下であれば、その円を指定した事となる。 |
指示点から円中心点までの距離を算出し、それが、
(円の半径−AREA)〜(円の半径+AREA)
内であればOK、と判定出来ます。 |
|
B円弧
 |  | 指定点と円弧までの距離を算出し、それが認識範囲 AREA 以下であり、垂直に下ろした点が円弧上にあれば、その円弧を指定した事となる。また、線端部分は線端スナップと同様のチェックを行えばOKでしょう。 |
C点
 |  | 線端スナップと同様のチェックを行えばOKでしょう。 |
D文字
 |  | 文字の場合には元々領域を持っていますし、文字の内部レディング(空白部)もありますから認識範囲分を加えて検索する必要があるのかどうか、という判断はあるかもしれませんが、基本的には、文字を囲む長方形+認識範囲分の領域内にマウス指定点があるかどうかで判定出来ます。 |
文字の左下点を基準に、文字枠とマウス指示点を文字傾き角度分、逆に回転したと想定すれば、指示点が四角枠内にあるかどうかの判定をすれば良いのでプログラミングも楽になると思われます。 |
|
ちょっと修正
・オフセット値を保持したい時がたまにありますので、マウス指示の後にクリアするのはそのまま置いておき、右横に[▼]ボタンを配置し、それを押したら前回値に戻せるようにします。そのため、前回値を保持せねばなりませんが、FmMainのPrivateの変数として、OBx,OByを用意し、これを利用するようにします。
・作図は、レイヤ設定で、一覧の上にあるものから順番に表示させています。という事は、一覧の一番下のものが最前面に表示される事になります。マウス・スナップする際、レイヤ設定の上のものから検索させていましたが、最前面に表示されている要素から検索して行くという方が素直かもしれません。という訳で、検索を逆にして、レイヤ設定一覧の下のものから順番に検索させて行く事にします。
・type TFmMain = class(TForm)〜 の宣言部を少し整理します。
・文字のパラメータは、縮尺に依存しない用紙寸法で入力しますが、尺度変更時、尺度によって文字も実寸法表示するようにしました。これに従い、端点検索も変更しました。 |
今回の追加
・[1要素選択]のボタンを付けて、COM_PICK1手続きを追加し、Fmode=50 として実行します。Fmodeが100未満の場合、オフセット値を考慮しないようにしていますので、取りあえず、50 という数値にしています。
・1要素検索を行う関数 EntSelect1() を追加(FmMain)
・1要素検索を行ったら、その要素情報を表示する(FmRMemo) |
それではここまでのプログラムです。
【サンプルプログラムのソース】
|
|
CAD装置(1)
CAD装置(2)
メディア
AutoCADの
DIESELマクロ
CSV
DXF
PCES
IGES
STEP
数学とCAD
CAD作ろ!
▲PREV
▼NEXT
|