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);加载自定义函数
)
页: 1 [2] 3 4
查看完整版本: lisp的开头和结尾写法分享--带错误恢复捕捉