明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 574|回复: 5

[【Gu_xl】] Lisp程序设计错误处理的技巧@Gu_xl

  [复制链接]
发表于 2024-4-6 12:01 | 显示全部楼层 |阅读模式
本帖最后由 kucha007 于 2024-4-6 12:12 编辑

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

该文章的函数有三种用法:
  1.   Gxl-ErrStaSys  -> Gxl-ErrEnd ;只针对系统变量的恢复
  2.   Gxl-ErrSta     -> Gxl-ErrEnd ;系统变量+函数+编组
  3.   Gxl-ErrStaNrm  -> Gxl-ErrEndNrm ;只针对自定义常量的恢复



这是我根据文章得到的自用函数:
  1. (if (null vlax-dump-object) (vl-load-com));将Visual LISP扩展功能加载到 AutoLISP
  2. (defun C:TT (/ *error* CurDoc *Old_SysVar*)
  3.   (setq CurDoc (vla-get-activedocument (vlax-get-acad-object)))
  4.   (defun *error* (x)  ;出错函数
  5.     ;其它需要恢复的内容
  6.     (if *Old_SysVar* (foreach xx *Old_SysVar* (apply 'setvar xx)));参数恢复
  7.     (vla-endundomark CurDoc) ;错误时结束编组
  8.   )

  9.   (while (eq 8 (logand 8 (getvar 'undoctl)))
  10.     (vla-endundomark CurDoc)
  11.   ) ;关闭以前的编组
  12.   (vla-startundomark CurDoc) ;记录编组
  13.     (progn ;记录系统变量
  14.       (setq *Old_SysVar* '());清空变量,避免出错
  15.       (setq *Old_SysVar*
  16.           (mapcar
  17.             '(lambda (a / b)
  18.               (if (setq b (getvar (car a)))
  19.                   (progn
  20.                     (vl-catch-all-apply 'setvar a)
  21.                     (list (car a) b)
  22.                   )
  23.               )
  24.             )
  25.             (list
  26.               (list "DIMZIN" 0);保留前导和后续的零
  27.               (list "CMDECHO" 0) ;关闭回显
  28.             )
  29.           )
  30.       );记录参数
  31.     )
  32.    
  33.     ;你的程序
  34.    
  35.     (command "redraw");清空一行
  36.     (if *Old_SysVar* (foreach xx *Old_SysVar* (apply 'setvar xx)));参数恢复
  37.   (vla-endundomark CurDoc) ;结束编组
  38.   (princ)
  39. )


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 3明经币 +3 收起 理由
a1130496025 + 1 很给力!
moshouhot + 1 很给力!
hubeiwdlue + 1 赞一个!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2024-4-6 22:24 | 显示全部楼层
本帖最后由 moshouhot 于 2024-4-7 15:04 编辑

我今天刚在这里看到这篇文章https://www.cnblogs.com/slowstep/p/16375260.html
被里面的gxl-error-init1和gxl-error-init2的作用绕晕了,还是你点醒了我。
  1. ;记录系统变量,并初始化系统变量,重定义*error*函数
  2. (defun ErrSta ()
  3.         (if (null vlax-dump-object) (vl-load-com))  
  4.         (setq *CurDoc* (vla-get-activedocument (vlax-get-acad-object)))
  5.         ;; 定义错误处理函数
  6.   (defun *error* (x)  ;出错函数
  7.     (vla-endundomark *CurDoc*) ;错误时结束编组
  8.     (if *Old_SysVar* (foreach xx *Old_SysVar* (apply 'setvar xx)));参数恢复
  9.     (princ)
  10.   )
  11.         ;; 关闭可能已经活动的先前undo标记
  12.         (while (eq 8 (logand 8 (getvar 'undoctl)))
  13.                 (vla-endundomark *CurDoc*)
  14.         )
  15.         ;; 开始一个新的undo标记
  16.         (vla-startundomark *CurDoc*)
  17.         
  18.         (progn ;记录系统变量
  19.                 (setq *Old_SysVar* '());清空变量,避免出错
  20.                 (setq *Old_SysVar*
  21.                         (mapcar
  22.                                 '(lambda (a / b)
  23.                                          (if (setq b (getvar (car a)))
  24.                                                  (progn
  25.                                                          (vl-catch-all-apply 'setvar a)
  26.                                                          (list (car a) b)
  27.                                                  )
  28.                                          )
  29.                                  )
  30.                                 (list
  31.                                         (list "DIMZIN" 0) ; 固定尺寸零的显示
  32.                                         (list "CMDECHO" 0) ; 关闭命令行回显
  33.                                         (list "ATTDIA" 0) ; 控制属性对话框的使用
  34.                                         (list "ATTREQ" 0) ; 控制属性请求的使用
  35.                                         (list "BLIPMODE" 0) ; 控制点标记的可见性
  36.                                         (list "OSMODE" 0) ; 控制对象捕捉的可用性
  37.                                         (list "ORTHOMODE" 0) ; 控制正交模式
  38.                                         (list "MIRRTEXT" 0) ; 控制文本的镜像行为
  39.                                 )
  40.                         )
  41.                 );记录参数
  42.         )
  43.         (princ)
  44. )
  45. ;;;例4:自定义通用错误处理恢复函数
  46. (defun ErrEnd ();恢复参数
  47.         (vla-endundomark *CurDoc*)
  48.         (if *Old_SysVar* (foreach xx *Old_SysVar* (apply 'setvar xx)));参数恢复
  49.         (princ)
  50. )

  51. ;;;实际运用示例:
  52. (defun C:TT ()
  53.         (ErrSta);记录参数
  54.         ;; 用户的程序逻辑在下面这里...
  55.         
  56.         ;; 用户的程序逻辑在上面这里...
  57.         (ErrEnd);恢复参数
  58.         (princ)
  59. )

点评

可以可以,自己习惯的最好~  发表于 2024-4-6 22:43
回复 支持 1 反对 0

使用道具 举报

发表于 2024-4-6 13:19 | 显示全部楼层
牛,正常要求定制插件收费高么
 楼主| 发表于 2024-4-6 13:20 | 显示全部楼层
muai2010 发表于 2024-4-6 13:19
牛,正常要求定制插件收费高么

联系方式私你了
发表于 2024-4-12 10:07 | 显示全部楼层
很好,这个论题又有新研究了,确实之前的东西云山雾罩,很难理解。(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. "))
  )
)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-1 19:29 , Processed in 0.370411 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表