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クリアすると、寂しい結果に。。

現在コメントは受け付けていません。