3

我写了一个 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.
)

我发现可能与“用户输入错误”有关,但实际上无法正常工作。据我所知,当按下转义时,lisp 只是退出并且没有完成执行。

提前致谢。

4

1 回答 1

5

AutoLISP 将取消视为错误。因此,您可以通过错误处理来管理取消。AutoLISP 提供了*error*可以在本地重新定义的功能。

另外,我想提几点建议:

  • 不要将type符号用于变量,它是内置 AutoLISP 函数的名称

  • 在本地声明变量(必须是*error*函数)

  • 使用getkwordandinitget让用户选择一个选项。

    (defun c:df (/ *error* oom option startpt ptx pty nextpt) ; local variables
    
      ;; *error* local redefinition
      (defun *error* (msg)
        (if (/= msg "Function cancelled")
          (princ (strcat "\nError: " msg))
        )
        (if oom
          (setvar "osmode" oom)
        )
        (princ)
      )
    
      (setq oom (getvar "osmode"))          ;store current state
    
      (initget 1 "Horizontal Vertical")
      (setq option (getkword "\nChoose an option [Horizontal/Vertical]: "))
    
      (if (setq startpt (getpoint "\nChoose Start Point : "))
        (progn
          (setq ptx (+ (car startpt) 10))
          (setq pty (+ (cadr startpt) 10))
    
          (setvar "osmode" 2)               ; change state state
    
          (while (setq nextpt (getpoint "'Pick Mid: ")) ;make selection
             (if (= option "Horizontal")
               (command "_dimlinear" startpt nextpt "H" (list 0 pty))
               (command "_dimlinear" startpt nextpt "V" (list ptx 0))
             )
    
             (setq ptx (+ 5 ptx))
             (setq pty (+ 5 pty))
          )
    
          (setvar "osmode" oom)             ;revert state back to original.
        )
      )
      (princ)
    )
    
于 2017-10-16T17:54:25.677 回答