autocad - 在 Lisp 退出时执行代码

标签 autocad autocad-plugin autolisp

我写了一个 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 只是退出并且没有完成执行。

提前致谢。

最佳答案

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

另外,我想提几点建议:

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

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

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

    (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)
    )
    

关于autocad - 在 Lisp 退出时执行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46774302/

相关文章:

python - 如何BlockReference对象属性

programming-languages - 任何人都可以向我解释 Autolisp/visual lisp 背后的设计决策吗?

c# - 是否可以使用 Autodesk.AutoCAD.Interop 在 AutoCAD 中编辑 block 属性?

c#, Autocad, 显示填充的属性

c# - 正确使用 AutoCAD API 的 Document.SendStringToExecute 方法

c++ - 视觉口齿不清 : how to call functions in external C++ DLL

来自 AutoLISP/AutoCAD 宏的 SOAP 请求

c# - 导入多个 DXF 文件时实体错误

c# - 创建布局和逻辑 AutoCAD 插件对话框

c# - 提示用户选择一个组并获取该组 ID 的方法