Выполнение кода при выходе из Lisp

У меня есть lisp, который включает в себя установку переменной, а затем выбор точек внутри цикла. Как только я решу, что закончил выбор точек, я хотел бы иметь возможность вернуть эту переменную к тому состоянию, в котором она была изначально, когда я нажимаю клавишу выхода. например.

(defun c:df ()
(setq oom (getvar "osmode")) ;store current state


(setq type(getint "\nEnter Type: 1 For Horizontal, 2 For Vertical : "))

(setq startpt (getpoint "\nChoose Start Point : ")) 
(setq ptx (+ (nth 0 startpt)10))
(setq pty (+ (nth 1 startpt)10))

(setvar "osmode" 2); change state state

(while 

     (setq nextpt (getpoint "'Pick Mid: ")) ;make selection



     (if (null nextpt) ((princ "\nNull Value Error.") return))

     (if (= type 1) (command "dimlinear" startpt nextpt "H" (list 0 pty) )) 
     (if (= type 2) (command "dimlinear" startpt nextpt "V" ptx ))

     (setq ptx (+ 5 ptx))   
     (setq pty (+ 5 pty))
)

;do after escape key is pressed.

(setvar "osmode" oom) ;revert state back to original.
)

Я нашел возможные зацепки, связанные с «Ошибками пользовательского ввода», но ничего не смог заставить работать. К моему преуменьшению, при нажатии escape lisp просто завершает работу и не заканчивает выполнение.

Заранее спасибо.


person Bigbob556677    schedule 16.10.2017    source источник


Ответы (1)


AutoLISP считает отмену ошибкой. Таким образом, вы можете управлять отменами с помощью обработки ошибок. AutoLISP предоставляет *error* функцию, которую можно локально переопределить.

Кроме того, хотелось бы дать несколько рекомендаций:

person gileCAD    schedule 16.10.2017
comment
Спасибо большое. Код работает идеально. Я не очень хорошо знаком с LISP и лучшими практиками для него. Я просто пытался собрать что-то очень быстро, поэтому я ценю совет. - person Bigbob556677; 16.10.2017