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

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

プログラミングについて
ホームページについて
キャドについて
電子カタログについて
書籍・雑誌
イベント
リンク集
CAD作ろ! アンドゥ・リドゥ(2)
バッファを利用したアンドゥ・リドゥでは、沢山戻れるようにすればする程、バッファに入れる内容が多ければ多い程、メモリを使用し、速度も遅くなります。
 
それでは、どのようにしてアンドゥ・リドゥを行うのか、というと、よくあるのは、コマンド・ヒストリー(履歴)を残して、それを利用する、という手法です。何をどのように作図したのかを記録しておき、アンドゥをしたら、現在の作図操作をキャンセルし、1歩手前までの作図を行うようにします。
例えば、
  @ 線1を作図
  A 線2を作図
  B 円1を作図
  C 線3を作図
  D 円2を作図
という場合、ここでアンドゥをしたら、Dは無かった事にして、@〜Cの再作図を行います。Dの生データは削除せずにそのままにします。リドゥをすると、@〜C → @〜D に戻します。
@〜Cの状態で、
  D 線4を作図
とすると、
  @ 線1を作図
  A 線2を作図
  B 円1を作図
  C 線3を作図
  D 線4を作図
となりますので、以前の円2のデータは削除されます。この後、アンドゥをすれば、@〜C、更にアンドゥをすると、@〜B、という具合になります。
 
通常はこういう感じでアンドゥ・リドゥが行われます。勿論、ソフトによっては、もっと複雑な方式で、例えば、ブランチするヒストリーツリーを構築・管理する事によってアンドゥ・リドゥを行うものもあります。それらについては、いろいろ考えてみるのも面白いでしょう。
 
コマンド・ヒストリーは、それ専用のデータ(例えば動的配列変数)にするパターンと、各データの要素データに入れるパターン、どちらにするのか?何回目の作図か?作図or削除?(変更は作図&削除として作成する) 現在何回目の作図か、と、最大何回目まで作図したか(リドゥの最大値) というデータを管理します。
 
・作図を行ったら、アンドゥを有効に・リドゥを無効に
・アンドゥを実行したらリドゥを有効に
・アンドゥは、最初のポイントまで戻せる事
・リドゥは、アンドゥを開始する元の状態まで戻せる事
というようなルールを決めて、編集メニューに、「取り消し」と「やり直し」を追加し、このメニューの有効・無効を、Enabledプロパティを使って指定します。
 
アンドゥを行ったら、
・作図したデータを戻す=削除
・削除したデータを戻す=作図
を行いますので、要素データ用のレコード変数のフラグのON/OFFを入れ替えるようにします。これは、not演算で、ON→OFF、OFF→ON、の切り替えを行います。
通常の作図、複写機能は「作図」、削除は「削除」、それでは、移動機能は「変更」となり、変更の際にはどうするのか?って事になりますが、直接変更作業を行うと、変更する前(元)の状態が消えてしまってどうしようもなくなります。これのためにバッファを使うのも無駄です。「変更」は、「削除」+「作図」と考えます。そうすれば上記ルールをそのまま使えますので、アンドゥ・リドゥもそのまま使えます。
 
但しこのサンプルプログラムでは、移動時のアンドゥ・リドゥの際、移動コマンドをキャンセルしています。これは、範囲選択をして格納する動的変数 Sel[]が要素番号だけを保持するようになっています。移動の際、移動元から移動先へ内容を変更していますが、アンドゥ・リドゥの際に、その移動元の要素番号へ戻す必要がありますが、変更して消えてしまっていますので、戻せない状況にあるからです。これを何とかしたい場合には、
 1.移動元の要素番号を保持するようにする(別変数?)
 2.Sel[]の内容を変更しないようにする
   (移動時、選択要素が元状態のままで構わない、とする)
 3.Sel[]は要素番号だけを保持させるのではなく、通常要素データと同じスペックの移動複写用バッファを確保し、データそのものをコピーして使うようにする
等のような手法があるでしょう。このアンドゥ・リドゥの仕組みも併せて、プログラムの根幹にもなってきますので、いろいろ試行錯誤をして良いものを作ってみてください。
 
 
CAD装置(1)
CAD装置(2)
メディア
AutoCADの
DIESELマクロ
CSV
DXF
PCES
IGES
STEP
数学とCAD
CAD作ろ!
 ▲PREV
 ▼NEXT
 
お問い合わせ 
本サイトはリンクフリーです
リンクバナー
(C)Copyright 1999-2015 By AFsoft All Rights Reserved.