AutoCADでプログラムしてて便利だなと思った機能の一つにUndo機能があります。
デバッグ中に色々動かして、エラーが出るとUndo→再度実行なんてことができたり。
で、内部的にどうなってるかと言うのを『動きから考察』してみました。
AutoCADは、内部的にOODB(オブジェクト指向DB)で管理されている。
この中に、ArcやPolylineといった図形情報や、色、幅、厚さなどの付加情報が入っている。
AutoCADでコマンドを実行した場合、自動的にOODBのセーブポイントを作ってくれるらしく、Undo機能は前回のセーブポイントまで戻ることによって行われます。
つまり、OODBに管理されているデータにのみUndoは機能します。
Managerなどで管理されているCacheなどには対応せず、Undoによる不整合が発生することも多々あります。
また、セーブポイントが作られるのは、あくまでコマンドです。
各種Eventで行われる変更にはセーブポイントが作られず、Undoはできません。
(Ctrl+zでは、_u [Command]というコマンドが実行されています。これに対応させる為には、やはり、単純にOODBへのCommitだけではなく、コマンド実行にしなければダメそうです。)
このあたりを踏まえていくと、良いAutoCADのライブラリができて行きそうですね。
2件のコメント
squld · 2007-05-25 11:36
セーブポイントを作る方法があれば、Eventでも対応できそうな気がするね。
そして、cacheをクリアするタイミングが取れれば安全にUndoできそう。
koreyasu · 2007-05-25 13:37
たとえセーブポイントを作ることができても、Ctrl+zの対応ができないと思う。
なにかコマンドを実行してUndoさせてしまうと、Ctrl+zでUndoコマンドをUndoするような感じの動作もできてしまい、ちょっと制御が大変そう。
Cacheをクリアするタイミングはモノによるんだよね。。
例えば、EntityのID管理をしてるManagerは、現実装だと読み直すのに物凄く時間がかかる。UndoのたびにCacheクリアすると、寂しい結果に。。
現在コメントは受け付けていません。