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-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
牛,正常要求定制插件收费高么
联系方式私你了 很好,这个论题又有新研究了,确实之前的东西云山雾罩,很难理解。(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. "))
)
)
感谢作者的分享! 好帖子,顶一个 感谢作者的分享!
页:
[1]