明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: hhh454

[源码] lisp的开头和结尾写法分享--带错误恢复捕捉

  [复制链接]
发表于 2020-8-7 16:53:34 | 显示全部楼层
本帖最后由 tryhi 于 2020-8-7 16:57 编辑

(setvar "osmode" 0);
捕捉设置为0是误人子弟
正确的做法应该是判断用F3来关闭,随便改变原有设置是非常不负责任的做法
(setq try-osmode (getvar "osmode"));记录捕捉系统变量
(if (< try-osmode 16384)(setvar "osmode" (+ try-osmode 16384)));判断是否启用了捕捉,关闭捕捉

点评

你写的挺好的,大神的级别了,感谢你的批评,不断学习不断进步,通过我的帖子成功引出一个完善的  发表于 2020-8-7 17:07
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-8-7 16:56:17 | 显示全部楼层
tryhi 发表于 2020-8-7 16:53
(setvar "osmode" 0);
捕捉设置为0是误人子弟

参数绘图,不可以带捕捉,代码中我已经说明,如果程序中需要开启捕捉就增加一个设置参数就可以
发表于 2020-8-7 16:59:07 | 显示全部楼层
本帖最后由 tryhi 于 2020-8-7 17:02 编辑
hhh454 发表于 2020-8-7 16:56
参数绘图,不可以带捕捉,代码中我已经说明,如果程序中需要开启捕捉就增加一个设置参数就可以

随便改变原有设置是非常不负责任的做法,如果要改变捕捉,应采用保留原有设置的方式修改,而不是靠*error*或者等待程序结束才恢复
另外正常情况下用command点击应灵活使用"non",而不是改变捕捉,实际大多数程序几乎都不需要去改变捕捉
 楼主| 发表于 2020-8-7 17:10:12 | 显示全部楼层
tryhi 发表于 2020-8-7 16:59
随便改变原有设置是非常不负责任的做法,如果要改变捕捉,应采用保留原有设置的方式修改,而不是靠*error ...

1楼已经改好了,感谢点出代码的不足,麻烦看看,方便的话请完善后发在论坛里面,这样以后写程序就方便了
发表于 2020-8-7 17:18:15 | 显示全部楼层
本帖最后由 tryhi 于 2020-8-7 17:26 编辑
hhh454 发表于 2020-8-7 17:10
1楼已经改好了,感谢点出代码的不足,麻烦看看,方便的话请完善后发在论坛里面,这样以后写程序就方便了

(command "._undo" "_begin")
意外退出时没有恢复undo 的end,会导致无法使用U回退

另外在本程序定义*error*可以采用局部函数形式,没必要做*error*函数备份(备份也行,略显啰嗦),一般做备份的是跨函数调用



;;取消捕捉
(defun try-osmode0(/ os*error*)
        (defun os*error* (MSG)
                (if try-osmode (setvar "osmode" try-osmode))
                (setq try-osmode nil *error* *#error#*)
        )
        (setq *#error#* *error* *error* os*error*)
        (setq try-osmode (getvar "osmode"));记录捕捉系统变量
        (if (< try-osmode 16384)(setvar "osmode" (+ try-osmode 16384)));判断是否启用了捕捉
        ;按F3关闭捕捉
)
;;恢复捕捉
(defun try-osmode1()
        (setvar "osmode" try-osmode)
        (setq try-osmode nil *error* *#error#*)
)



我是这样写的,两个函数分别放在开头和结尾,因为独立函数调用,所以才备份*error*,但是我现在基本不用,因为应用场景极少
(defun c:tt ()
        (try-osmode0)
        你的程序
        (try-osmode1)
)

点评

我也是按照自己的理解来写的,其他学习的朋友可以参考你的函数用法,感谢分享经验  发表于 2020-8-7 22:00

评分

参与人数 1明经币 +1 金钱 +10 收起 理由
hhh454 + 1 + 10 很给力!

查看全部评分

回复 支持 2 反对 0

使用道具 举报

发表于 2020-8-7 22:49:24 | 显示全部楼层
(defun c:tt(/ *error* os_old);重写错误函数为局部变量,只对当前函数出错有效
(setvar "cmdecho" 0);唯一不进入错误函数的代码
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun *error*(msg);错误函数,程序始终从这里结束
(command ".undo" "e")
(and msg(prompt (strcat "*错误信息*" msg)))
(and os_old(setvar "osmode" os_old))
(princ)
)
(command ".undo" "be")
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(setq os_old(getvar "osmode"))
(setvar "osmode" 0)
(prompt "我的程序")
(/ 2 0)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(*error* nil);程序结束,没有错误信息,但要从错误函数中退出
)
发表于 2020-8-8 10:26:45 | 显示全部楼层
tryhi 发表于 2020-8-7 17:18
(command "._undo" "_begin")
意外退出时没有恢复undo 的end,会导致无法使用U回退

大海老师的这个是将error做成了自定义函数
(defun c:tt ()
        (try-osmode0);;;调用自定义函数
        你的程序
        (try-osmode1);;;调用自定义函数
)
个人函数库的建立,为以后写程序节省了时间。

能否把楼主那开头、结尾多个设备备份都写到这个自定义函数里面?
发表于 2020-8-8 15:14:39 | 显示全部楼层
tryhi 发表于 2020-8-7 17:18
(command "._undo" "_begin")
意外退出时没有恢复undo 的end,会导致无法使用U回退

请大海老师指点下面你的这个ERROR和我的这个ERROR的区别,谢谢。
大海老师的:
(defun os*error* (MSG)
                (if try-osmode (setvar "osmode" try-osmode))
                (setq try-osmode nil *error* *#error#*)
        )
        (setq *#error#* *error* *error* os*error*)
        (setq try-osmode (getvar "osmode"));记录捕捉系统变量
        (if (< try-osmode 16384)(setvar "osmode" (+ try-osmode 16384)));判断是否启用了捕捉
        ;按F3关闭捕捉



我的:
(defun *error* ( msg );解决程序中途中止造成的一些问题
  (if (not (wcmatch (strcase msg t) "*break,*cancel*,*exit*"))
      (progn (princ (strcat "\n错误: " msg)) (setvar "OSMODE" os))
  )
  (princ)
)
(setvar "OSMODE" 16384);关闭捕捉
发表于 2020-8-8 17:20:05 | 显示全部楼层
rocking2008 发表于 2020-8-8 15:14
请大海老师指点下面你的这个ERROR和我的这个ERROR的区别,谢谢。
大海老师的:
(defun os*error* (MSG) ...

我那个属于阉割版,没有报错,不太建议用,或者我得改一下
发表于 2020-8-8 22:03:12 | 显示全部楼层
tryhi 发表于 2020-8-7 17:18
(command "._undo" "_begin")
意外退出时没有恢复undo 的end,会导致无法使用U回退

;参照大海老师的方法改成自定义函数的方式,请看看这样对不对,可有需要改进的?
;有一个疑问,单独写2个自定义函数加载的话,这2个自定义函数是不是一直占着内存在,而不会像局部变量; ;一样,可以随着程序执行结束自动释放掉?是不是有这个弊端?

;;自定义函数-取消捕捉
(defun try-osmode0(/ *error*)
        (defun *error* ( msg );解决程序中途中止造成的一些问题
                (if (not (wcmatch (strcase msg t) "*break,*cancel*,*exit*"))
                        (progn (princ (strcat "\n错误: " msg)) (setvar "OSMODE" os))
                )
                (princ)
        )
        (setvar "cmdecho" 0);关闭回显
        (setq os (getvar "OSMODE"));记录当前F3设置
        (setvar "OSMODE" 16384);关闭捕捉
        (setq clayer_bak (getvar "clayer"));_记录当前图层
        (command "._undo" "_begin");这个是用来一键撤销所有操作的
)


;;自定义函数-恢复捕捉
(defun try-osmode1()
        (setvar "OSMODE" os);还原F3捕捉设置
        (setvar "clayer" clayer_bak);还原图层
        (command "._undo" "_end");这个是用来一键撤销所有操作的
        (setvar "cmdecho" 1);还原回显设置
        (princ)
)



我是这样写的,两个函数分别放在开头和结尾,因为独立函数调用,所以才备份*error*,但是我现在基本不用,因为应用场景极少
(defun c:tt (/ )
        (vl-load-com)

        (try-osmode0);加载自定义函数

        (你的程序内容)

        (try-osmode1);加载自定义函数
)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-9-17 04:18 , Processed in 0.198252 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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