概要 - ルーチンによって実行さた変更を元に戻す(AutoLISP)

複数の 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 コマンドが取り消されます。