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

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

プログラミングについて
ホームページについて
キャドについて
電子カタログについて
書籍・雑誌
イベント
リンク集
CADを考える:削除(消去)
前回まで、各種要素データの各種情報・追加登録について記述してきました。CADでの編集機能は、選択した要素データの削除(消去)・複写・移動・変更があります。複写機能は、選択した要素データの情報の一部(特に座標データ項目)を変更して、新たに別の要素データとして追加登録を行います。移動機能は、複写機能と似ていますが、選択した要素データの削除を行います。つまり移動=追加+削除、となります。変更機能も移動機能と同じく、情報の一部を変更する機能です。座標データ項目だけでなく、レイヤ、色、線種、線幅、等の変更もあります。変更機能も移動機能と同様、変更=追加+削除、となります。
  削除機能=削除
  複写機能=追加
  移動機能=追加+削除
  変更機能=追加+削除
追加機能についてはこれまで記述してきましたので、ここでは削除機能について考えていきます。
 
削除機能は、単純です。
画面上に見えないようにしてやります。
そのため、各要素データに
exf : Boolean ;     // 存在フラグ(True:有り False:無し)
というデータ項目を用意していました。通常これは「True」値としていましたが、これを「False」値にすると、画面上では表示しない、というようにすれば、その要素を削除した、という事になります。
つまり、削除用の関数は、この存在フラグを False にする、という処理をすれば良いことになります。
 
 
勿論、移動機能、変更機能では、選択した要素データのデータ項目内容を直接変更してやることで実現可能です。わざわざ追加+削除を行う必要性を感じないかもしれません。ですが、アンドゥ(元に戻す)+リドゥ(やり直し)を実装する場合には、直接変更をしてしまうと元の値が分からなくなりますので、元に戻せなくなってしまいます。それを何とかするためには、変更直前の内容をバックアップする必要があります。すると、必然的に、メインメモリとは別に、バックアップメモリ(バッファ)を用意しないといけません。メインメモリとバックアップメモリとを切り分ける事で管理・プログラミングはしやすくなるかもしれません。但し、一括変更を行った場合、バックアップ処理に時間が掛かってしまう可能性はあります。また、削除した際に、不要になった要素データをどうするのか?という問題があります。通常はバックアップ&詰め込み作業(ガベージコレクション)を行いますが、これにも時間が掛かってしまう可能性はあります。全要素データを対象とするため、要素データ数が多くなればなるほど時間が掛かります。
 
これに対し、存在フラグを False にした要素データを復活させる場合には、True にすれば良いだけとなります。要素データはそのままメインメモリに残っていますので、バックアップやガベージコレクションをする必要もありません。存在フラグを False に、又は、True にするだけの処理は、バックアップやガベージコレクションと比較して、然程の時間も掛かりません。
 
 
アンドゥ・リドゥの処理は次回に考えるとして、ここではまず、削除処理を行う手続きを実装します。
 
独自要素である補助線要素には、存在フラグを用意していません。補助線要素は、作図する際の手助けをするためのもので、直前削除と全削除が出来ればいい、という事にしているからです。
Unitdata.pas
TDataClass = class
 public
 { Public 宣言 }
 ・・・
 procedure DelHojoPrev(s:string) ; overload ;
 procedure DelHojoPrev(m:integer) ; overload ;
 procedure DelHojoAll ;       overload ;
 procedure DelHojoAll(s:string) ;  overload ;
 procedure DelHojoAll(m:integer) ; overload ;
 
補助線を作図して削除をするテストを追加し確認しておきます。
Unit1.pas
// 直前の補助線を20個 消去
for i:=1 to 20 do begin
 CData.DelHojoPrev('');
 CData.DelHojoPrev('部分図A');
end;
・・・
// 全補助線を消去
CData.DelHojoAll ;
 
次に、通常の各種要素データの削除を行う手続きを追加しておきます。
Unitdata.pas
TDataClass = class
 public
 { Public 宣言 }
 ・・・
 procedure DelDataNo(s:string;o1,o2:integer) ; overload ;
 procedure DelDataNo(m,o1,o2:integer) ;    overload ;
 procedure DelDataPrev(s:string) ;       overload ;
 procedure DelDataPrev(m:integer) ;      overload ;
 procedure DelDataAll ;            overload ;
 procedure DelDataAll(s:string) ;       overload ;
 procedure DelDataAll(m:integer) ;       overload ;
 
なお、現状、直前削除では、作図順を示す変数 dOrd,dOrdN、mOrd,mOrdNの値を-1するようにしています。全データ削除のほうでは、この値はまだ何もしていません。補助線削除はメモリ解放を行っていましたが、通常の各種要素データ削除では、存在フラグ exf を False にするだけにしています。
 
また、要素データ表示のほうで、存在フラグ exf の値が False に場合には、表示を行わない、という風に追加をしておきます。(UnitDataGraph.pas内の DisplaySymbolZukei(),DisplayAllData)
 
 
それでは、ここまでのテストプログラムです。実行ファイル、gdiplus.dll、gdipフォルダは入っていません。ソースのみです。
 
CAD装置(1)
CAD装置(2)
メディア
AutoCADの
DIESELマクロ
CSV
DXF
PCES
IGES
STEP
数学とCAD
CAD作ろ!
CADを考える
 ▲PREV
 ▼NEXT
M7
Jw_cad
 
お問い合わせ 
本サイトはリンクフリーです
リンクバナー
(C)Copyright 1999-2015 By AFsoft All Rights Reserved.