tryhi
发表于 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)));判断是否启用了捕捉,关闭捕捉
hhh454
发表于 2020-8-7 16:56:17
tryhi 发表于 2020-8-7 16:53
(setvar "osmode" 0);
捕捉设置为0是误人子弟
参数绘图,不可以带捕捉,代码中我已经说明,如果程序中需要开启捕捉就增加一个设置参数就可以
tryhi
发表于 2020-8-7 16:59:07
本帖最后由 tryhi 于 2020-8-7 17:02 编辑
hhh454 发表于 2020-8-7 16:56
参数绘图,不可以带捕捉,代码中我已经说明,如果程序中需要开启捕捉就增加一个设置参数就可以
随便改变原有设置是非常不负责任的做法,如果要改变捕捉,应采用保留原有设置的方式修改,而不是靠*error*或者等待程序结束才恢复
另外正常情况下用command点击应灵活使用"non",而不是改变捕捉,实际大多数程序几乎都不需要去改变捕捉
hhh454
发表于 2020-8-7 17:10:12
tryhi 发表于 2020-8-7 16:59
随便改变原有设置是非常不负责任的做法,如果要改变捕捉,应采用保留原有设置的方式修改,而不是靠*error ...
1楼已经改好了,感谢点出代码的不足,麻烦看看,方便的话请完善后发在论坛里面,这样以后写程序就方便了
tryhi
发表于 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)
)
urings
发表于 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);程序结束,没有错误信息,但要从错误函数中退出
)
rocking2008
发表于 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);;;调用自定义函数
)
个人函数库的建立,为以后写程序节省了时间。
能否把楼主那开头、结尾多个设备备份都写到这个自定义函数里面?
rocking2008
发表于 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);关闭捕捉
tryhi
发表于 2020-8-8 17:20:05
rocking2008 发表于 2020-8-8 15:14
请大海老师指点下面你的这个ERROR和我的这个ERROR的区别,谢谢。
大海老师的:
(defun os*error* (MSG) ...
我那个属于阉割版,没有报错,不太建议用,或者我得改一下
rocking2008
发表于 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);加载自定义函数
)