明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5413|回复: 39

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

  [复制链接]
发表于 2020-8-6 20:36:12 | 显示全部楼层 |阅读模式
本帖最后由 hhh454 于 2022-8-18 11:08 编辑

lisp的开头怎么写,相信很多的新手都有这个疑问,当然具体的还是需要学习别人写的代码

;带错误恢复捕捉的程序开头和结尾写法
(defun c:tt( / )
  (vl-load-com)
;错误恢复捕捉
(defun *MYERR* (MSG)
(setvar "CMDECHO" CMD_OLD)
(setvar "OSMODE" OS_OLD)
(setq *ERROR* *OLDERR*)
(if (= MSG "完美退出。谢谢使用。")
(princ (strcat "\\n>>>" MSG))
(princ "\\n>>>虽然中途退出了,对象捕捉已经被恢复。")
)
(princ)
)
(setq *OLDERR* *ERROR*
*ERROR*  *MYERR*
OS_OLD   (getvar "OSMODE")
CMD_OLD  (getvar "CMDECHO")
)
;----开始系统变量备份----
(setvar "cmdecho" 0);_关闭命令提示
(command "._undo" "_begin")
(setq osmode_bak (getvar "osmode"));_记录捕捉
(setvar "osmode" 0);_关闭捕捉,代码需要用捕捉就删除这行,也可以按照下面的增加捕捉的代码,2选一
(setq clayer_bak (getvar "clayer"));_记录当前图层
;----绘制部分开始----

(你的程序)
;----操作中需要开启捕捉,就增加代码----(setvar "osmode" 【一个数值,具体多少,先打钩捕捉点,再看系统变量osmode】)
;----绘制部分结束----
;----结束系统变量还原----
(setvar "osmode" osmode_bak);_还原捕捉
(setvar "clayer" clayer_bak);_还原图层
(command "._undo" "_end")
(setvar "cmdecho" 1);_打开命令提示
(princ);_关闭程序返回值
);_程序结束
(princ "\n**********春婵程序加载完成,启动命令:tt **********")
(princ "\n")
"觉得好,就打赏"
还没有人打赏,支持一下

本帖被以下淘专辑推荐:

发表于 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-11 20:33:51 | 显示全部楼层
其实对CAD很精通的人,即使不懂编程,也能用command写出一些参数化的好程序,也相当于是可视化的简易编程,毕竟编程对于没有系统学过的人,真的很难入门,坐在那里玩3个小时的游戏你能坚持,但是坐那里半小时看学习视频,相信很少有人能够坚持,希望将来人才倍出,涌现出大量的好程序好代码,真正解决工作的好工具。明经通道,教书育人,传承未来。写的有点多了,接着研究我的小程序去了
回复 支持 1 反对 0

使用道具 举报

发表于 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 09:01:21 | 显示全部楼层
不错!
赞一个
回复 支持 0 反对 1

使用道具 举报

发表于 2020-8-6 21:05:16 | 显示全部楼层
真的不错!适合我这种新手学习!
发表于 2020-8-6 22:16:23 来自手机 | 显示全部楼层
一个error函数还是少不了
发表于 2020-8-6 22:40:38 | 显示全部楼层
赞一个,,,优秀优秀
发表于 2020-8-7 09:46:23 | 显示全部楼层
Bao_lai 发表于 2020-8-6 22:16
一个error函数还是少不了

还得请教下,error函数的影响大不大,有什么用途
发表于 2020-8-7 15:05:40 | 显示全部楼层
(defun c:tt()

(这里是主程序)



楼主,你用这个做个例子,把error加进去,这样入门新手会看的懂了。让贴子尽善尽美。点赞。
发表于 2020-8-7 16:14:36 | 显示全部楼层
看个人吧,反正我error重来不写。
发表于 2020-8-7 16:17:05 | 显示全部楼层
新手学习了   
 楼主| 发表于 2020-8-7 16:52:39 | 显示全部楼层
rocking2008 发表于 2020-8-7 15:05
(defun c:tt()

(这里是主程序)

;带错误恢复捕捉的程序开头和结尾写法
(defun c:tt( / )
  (vl-load-com)
;错误恢复捕捉
(defun *MYERR* (MSG)
(setvar "CMDECHO" CMD_OLD)
(setvar "OSMODE" OS_OLD)
(setq *ERROR* *OLDERR*)
(if (= MSG "完美退出。谢谢使用。")
(princ (strcat "\\n>>>" MSG))
(princ "\\n>>>虽然中途退出了,对象捕捉已经被恢复。")
)
(princ)
)
(setq *OLDERR* *ERROR*
*ERROR*  *MYERR*
OS_OLD   (getvar "OSMODE")
CMD_OLD  (getvar "CMDECHO")
)
;----开始系统变量备份----
(setvar "cmdecho" 0);_关闭命令提示
(command "._undo" "_begin")
(setq osmode_bak (getvar "osmode"));_记录捕捉
(setvar "osmode" 0);_关闭捕捉
(setq clayer_bak (getvar "clayer"));_记录当前图层
;----绘制部分开始----

(你的程序)

;----绘制部分结束----
;----结束系统变量还原----
(setvar "osmode" osmode_bak);_还原捕捉
(setvar "clayer" clayer_bak);_还原图层
(command "._undo" "_end")
(setvar "cmdecho" 1);_打开命令提示
(princ);_关闭程序返回值
);_程序结束
(princ "\n**********春婵程序加载完成,启动命令:tt **********")
(princ "\n")

想系统的学习,建议学习一下猫老师的课程,讲的很详细
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-9-8 10:51 , Processed in 0.308811 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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