複数の AutoLISP 文を 1 つの UNDO グループ下にまとめることによって、AutoCAD の U[一回元に戻す]または UNDO[元に戻す]コマンドを使用して実行されたすべてのアクションをロールバックすることができます。
command および command-s 関数を使用して実行された各コマンドは、それぞれの UNDO グループを明示的に作成します。AutoLISP のルーチンを実行した後でユーザが AutoCAD のコマンド プロンプトに対して U (または UNDO)と入力すると、最後のコマンドだけが取り消されます。UNDO を繰り返し使用すると、そのルーチンによって実行されたコマンドが順に取り消されていきます。ルーチンのユーザは、複数の操作を元に戻すのではなく、1 回の操作を元に戻すだけで、ルーチンによって実行されるすべての操作を取り消して、図面を前の状態に戻したいと思うことでしょう。
そこで、AutoLISP のルーチンによって実行されるコマンドと操作を 1 つの UNDO グループにまとめることをお勧めします。ユーザが操作を繰り返すことを許すルーチンの場合は、ユーザの応答が図面に影響を及ぼすたびに UNDO グループを作成することもできます。UNDO グループは、AutoCAD のUNDO コマンドの[開始(BE)]と[終了(E)]オプションを使用して定義することができます。
次のコード例は、command 関数で実行された各コマンドがどのようにそれぞれの UNDO グループを持つかを示しています。
(defun c:NoUndo ( / old_osmode el pt) (setq old_osmode (getvar "OSMODE")) (setvar "OSMODE" 0) (command "._circle" "5,5" "2") ;Draws a circle (command "._line" "3,5" "7,5" "") ;Draws a line (setq el (entlast)) ;Gets the last entity added ; to the drawing (setq pt '(5 7)) ;Sets the trim point (command "._trim" el "" pt "") ;Performs the trim (setvar "OSMODE" old_osmode) )
c:NoUndo ルーチンを実行すると、半円形が表示されます。c:NoUndo ルーチンの実行後に、U コマンドまたは UNDO コマンドを実行すると、AutoCAD の TRIM[トリム]コマンドが取り消されます。この結果、中心を通る線分がある完全な円となります。U コマンドまたは UNDO コマンドをもう一度実行すると、AutoCAD の LINE[線分]コマンドで作成された線分が取り消されます。3 回目に U コマンドまたは UNDO コマンドを実行すると、AutoCAD の CIRCLE[円]コマンドが取り消されます。
次のコード例は、単一の U コマンド(または UNDO コマンド)ですべての変更をロールバックすることができる UNDO グループを作成するために、AutoCAD の UNDO コマンドを使用する方法を示します。
(defun c:YesUndo ( / old_osmode el pt) (command "._UNDO" "_Begin") (setq old_osmode (getvar "OSMODE")) (setvar "OSMODE" 0) (command "._circle" "5,5" "2") ;Draws a circle (command "._line" "3,5" "7,5" "") ;Draws a line (setq el (entlast)) ;Gets the last entity added ; to the drawing (setq pt '(5 7)) ;Sets the trim point (command "._trim" el "" pt "") ;Performs the trim (setvar "OSMODE" old_osmode) (command "._UNDO" "_End") )
c:YesUndo ルーチンを実行すると、c:NoUndo ルーチンを実行した場合と同じような半円となります。c:YesUndo ルーチンの実行後に、U コマンドまたは UNDO コマンドを実行すると、AutoCAD の TRIM、LINE、CIRCLE コマンドが取り消されます。