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

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

プログラミングについて
ホームページについて
キャドについて
電子カタログについて
書籍・雑誌
イベント
リンク集
CAD作ろ! 要素の削除
CAD利用者は、要素選択を行った後、それらの編集を行います。編集のまず最初として、削除について説明します。
 
要素の削除は、登録したデータを消す事、つまり、別のデータで上書きするとか、メモリを解放する、等の処理を行います。また、データを残していても、要素を画面上に見せないようにする、という場合もあります。
 
要素データは、動的配列でそのまま直接要素を扱っていますので、各データは連続していますから、途中のデータを解放するという事は出来ません。ではどうするか?というと、データを詰める作業を行います。
要素1要素2要素3要素4要素5

要素5を消したい場合には、単純に、データ数を5個から4個に減らすだけで終わりです。
要素1要素2要素3要素4要素5

要素1要素2要素3要素4

問題は、途中の要素、例えば、要素3を消したいとします。詰める作業をする訳ですが、後ろのものを持ってくる、というパターンがあります。(要素3の箇所へ一番最後の要素5をコピーし、一番最後の要素5は不要なので要素数を5から4にして要素1つ分のメモリを解放する)
要素1要素2要素3要素4要素5

要素1要素2要素5要素4要素5

要素1要素2要素5要素4

もう1つは、順番に詰めていく、というパターンがあります。(要素3の箇所へ要素4をコピーし、元の要素4の箇所に要素5をコピーし、一番最後の要素5は不要なので要素数を5から4にして要素1つ分のメモリを解放する)
要素1要素2要素3要素4要素5

要素1要素2要素4要素4要素5

要素1要素2要素4要素5要素5

要素1要素2要素4要素5

前者のパターンは、1要素削除に対して、1回のコピーで終わりますから速度は速いですが、要素の順序が変わってしまいます。要素の順序が変わると、検索の順序が変わったり、画面への見え方も変わります。後者のパターンは、1要素削除に対して、複数回のコピーを行う必要があり、要素数が多ければ多い程、速度が遅くなります。しかし、要素の順序は変わりません。
 
さて、第3のパターンとして、要素を削除した、といいつつ、実は削除をせずそのまま残しておき、画面上には見せないようにする、という手法があります。
要素1要素2要素3要素4要素5

要素1要素2要素3要素4要素5

これだと、要素をコピーする必要はないので作業に要する時間はさほど掛からず、要素の順番も変わる事もなく、将来、アンドゥ機能を作った時に、要素を容易に復活させる事が出来ます。但し、各要素に、通常の要素か削除した要素かを表すフラグ変数が必要になりますのでその分、メモリを消費します。
データ形式
TDataEntities = record // データ定義
 typ : Integer ;  // 要素の種類(1〜5)
 lay : Integer ;  // レイヤ番号
 col : Integer ;  // 色番号
 lin : Integer ;  // 線種番号
 wid : double ;   // 線幅
 p1,p2,p3,p4,p5,p6:double; // 第1〜第6データ
 font,moji : String ; // フォント名、文字内容
end;

TDataEntities = record // データ定義
 exf : Boolean ;  // 存在フラグ(True:有 False:無)
 typ : Integer ;  // 要素の種類(1〜5)
 lay : Integer ;  // レイヤ番号
 col : Integer ;  // 色番号
 lin : Integer ;  // 線種番号
 wid : double ;   // 線幅
 p1,p2,p3,p4,p5,p6:double; // 第1〜第6データ
 font,moji : String ; // フォント名、文字内容
end;

これにより、各データのフラグ変数「exf」を「False」にしたら「削除をしたのでもう存在しない」という事として、画面には表示しないようにします。また、要素数=データ登録数 ではなく、このフラグ変数をチェックして要素数を数える必要があります。将来、データをファイルに保存する際に、このフラグ変数が「False」のものを保存しないようにしておけば、次回、その図面データを読み込んだ場合には、完全に削除されている、という事になります。
 
以前のMS-DOSアプリケーションでは、使えるメモリに制限があって、なかなかメモリを贅沢に使えませんでした。古いNEC PC-9801シリーズには外部メモリ 1MB、2MB、4MB、等を増設したりしていました。当時はメモリも少なく高額でした。最初はI/Oバンク切替方式でしたが、EMS方式が登場し、EMSメモリが徐々に普及していきました。また、386CPUの登場と共にプロテクトメモリ方式も普及し出して、プロテクトメモリで仮想的にEMS方式を利用するというパターンが一般的になっていきました。その後、Windows3.1が普及し、Windows95〜へ繋がり、PCやメモリも高性能で大容量化・安価になっていきます。
今や、メモリは標準256MBを搭載するのは当たり前のようになり、以前よりも自由にメモリが使えるようになっています。しかしこれは、メモリを無駄使いしても良い、という事ではありません。Windows自体がメモリを使用し、他のアプリケーションもメモリを使用し、メモリはいつでもどこでも使用されています。未使用メモリ領域がなくなると、Windowsは、ハードディスクをメモリの代わりに使います(仮想メモリ)。容量の壁は無いとしても、ハードディスクの速度はメモリに比べかなり遅いです。アプリケーションの実行速度が遅くなると、使う側は、ストレスが溜まったりします。やはり、無駄なメモリの使い方はなるべく控える必要がありますが、かといって、プログラミングの妨げになるというのも良くはありません。プログラマは、その境界線を意識してアプリケーションを作る必要があるでしょう。

 
 
ちょっと修正
・データ定義を上記のように変更します。
・データ登録時は必ず、フラグ変数 exf をTrueにする必要があります。
・図形範囲再計算、スナップ処理、要素検索、全要素作図、では、フラグ変数 exf がFalseのものをパスさせます。
・編集メニューを追加するので、[要素選択]、[選択解除]のボタンは削除します。
今回の追加
・編集メニューを追加します。
 [要素選択(S)]
 [すべてを選択(L) CTRL+A]
 [選択解除(R)]
 [削除(D) Del]
の項目を作ります。
(ショートカットキー(ShortCutプロパティ)やアクセスキーはメニュー編集で自由に出来ますので好きなように指定して下さい。)
・「すべてを選択」は、それまで選択していた要素は一旦解除をし、Activeレイヤの要素のみ全て選択します。
・「削除」は、選択した要素を削除します(フラグ変数 exf をFalseにします)。
 
 
それではここまでのプログラムです。
サンプルプログラムのソース
 
 
CAD装置(1)
CAD装置(2)
メディア
AutoCADの
DIESELマクロ
CSV
DXF
PCES
IGES
STEP
数学とCAD
CAD作ろ!
 ▲PREV
 ▼NEXT
 
お問い合わせ 
本サイトはリンクフリーです
リンクバナー
(C)Copyright 1999-2015 By AFsoft All Rights Reserved.