kucha007 发表于 2024-4-6 12:01:27

Lisp程序设计错误处理的技巧@Gu_xl

本帖最后由 kucha007 于 2024-4-6 12:12 编辑

该文章由G版编写,本着学习的心态梳理了一遍,函数名变量名尽可能使用通俗易懂的方式
大家可直接下载Lsp文件进行阅读:

该文章的函数有三种用法:

Gxl-ErrStaSys-> Gxl-ErrEnd ;只针对系统变量的恢复
Gxl-ErrSta   -> Gxl-ErrEnd ;系统变量+函数+编组
Gxl-ErrStaNrm-> Gxl-ErrEndNrm ;只针对自定义常量的恢复



这是我根据文章得到的自用函数:

(if (null vlax-dump-object) (vl-load-com));将Visual LISP扩展功能加载到 AutoLISP
(defun C:TT (/ *error* CurDoc *Old_SysVar*)
(setq CurDoc (vla-get-activedocument (vlax-get-acad-object)))
(defun *error* (x);出错函数
    ;其它需要恢复的内容
    (if *Old_SysVar* (foreach xx *Old_SysVar* (apply 'setvar xx)));参数恢复
    (vla-endundomark CurDoc) ;错误时结束编组
)

(while (eq 8 (logand 8 (getvar 'undoctl)))
    (vla-endundomark CurDoc)
) ;关闭以前的编组
(vla-startundomark CurDoc) ;记录编组
    (progn ;记录系统变量
      (setq *Old_SysVar* '());清空变量,避免出错
      (setq *Old_SysVar*
          (mapcar
            '(lambda (a / b)
            (if (setq b (getvar (car a)))
                  (progn
                  (vl-catch-all-apply 'setvar a)
                  (list (car a) b)
                  )
            )
            )
            (list
            (list "DIMZIN" 0);保留前导和后续的零
            (list "CMDECHO" 0) ;关闭回显
            )
          )
      );记录参数
    )
   
    ;你的程序
   
    (command "redraw");清空一行
    (if *Old_SysVar* (foreach xx *Old_SysVar* (apply 'setvar xx)));参数恢复
(vla-endundomark CurDoc) ;结束编组
(princ)
)


moshouhot 发表于 2024-4-6 22:24:50

本帖最后由 moshouhot 于 2024-4-7 15:04 编辑

我今天刚在这里看到这篇文章https://www.cnblogs.com/slowstep/p/16375260.html
被里面的gxl-error-init1和gxl-error-init2的作用绕晕了,还是你点醒了我。

;记录系统变量,并初始化系统变量,重定义*error*函数
(defun ErrSta ()
      (if (null vlax-dump-object) (vl-load-com))
      (setq *CurDoc* (vla-get-activedocument (vlax-get-acad-object)))
      ;; 定义错误处理函数
(defun *error* (x);出错函数
    (vla-endundomark *CurDoc*) ;错误时结束编组
    (if *Old_SysVar* (foreach xx *Old_SysVar* (apply 'setvar xx)));参数恢复
    (princ)
)
      ;; 关闭可能已经活动的先前undo标记
      (while (eq 8 (logand 8 (getvar 'undoctl)))
                (vla-endundomark *CurDoc*)
      )
      ;; 开始一个新的undo标记
      (vla-startundomark *CurDoc*)
      
      (progn ;记录系统变量
                (setq *Old_SysVar* '());清空变量,避免出错
                (setq *Old_SysVar*
                        (mapcar
                              '(lambda (a / b)
                                       (if (setq b (getvar (car a)))
                                                 (progn
                                                         (vl-catch-all-apply 'setvar a)
                                                         (list (car a) b)
                                                 )
                                       )
                                 )
                              (list
                                        (list "DIMZIN" 0) ; 固定尺寸零的显示
                                        (list "CMDECHO" 0) ; 关闭命令行回显
                                        (list "ATTDIA" 0) ; 控制属性对话框的使用
                                        (list "ATTREQ" 0) ; 控制属性请求的使用
                                        (list "BLIPMODE" 0) ; 控制点标记的可见性
                                        (list "OSMODE" 0) ; 控制对象捕捉的可用性
                                        (list "ORTHOMODE" 0) ; 控制正交模式
                                        (list "MIRRTEXT" 0) ; 控制文本的镜像行为
                              )
                        )
                );记录参数
      )
      (princ)
)
;;;例4:自定义通用错误处理恢复函数
(defun ErrEnd ();恢复参数
      (vla-endundomark *CurDoc*)
      (if *Old_SysVar* (foreach xx *Old_SysVar* (apply 'setvar xx)));参数恢复
      (princ)
)

;;;实际运用示例:
(defun C:TT ()
      (ErrSta);记录参数
      ;; 用户的程序逻辑在下面这里...
      
      ;; 用户的程序逻辑在上面这里...
      (ErrEnd);恢复参数
      (princ)
)

muai2010 发表于 2024-4-6 13:19:36

牛,正常要求定制插件收费高么

kucha007 发表于 2024-4-6 13:20:19

muai2010 发表于 2024-4-6 13:19
牛,正常要求定制插件收费高么

联系方式私你了

我爱lisp 发表于 2024-4-12 10:07:17

很好,这个论题又有新研究了,确实之前的东西云山雾罩,很难理解。(vlax-for l (vla-get-layers
              (vla-get-activedocument (vlax-get-acad-object))
          )
(setq        em (vl-catch-all-apply
             'vla-put-linetype
             (list l "My Linetype")
           )
)
(if (vl-catch-all-error-p em)
    (princ (strcat "\nLinetype " "My Linetype" " Not Found. "))
)
)

tensir 发表于 2024-7-13 14:07:20

感谢作者的分享!

13763815647 发表于 2024-9-15 20:53:37

好帖子,顶一个

伍星 发表于 2024-9-19 23:07:15

感谢作者的分享!
页: [1]
查看完整版本: Lisp程序设计错误处理的技巧@Gu_xl