Lisp程序结构
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Lisp程序结构
;;在明经混了许多年,又在晓东混了几年了,渐发现原来写的程序不是太合理,全改又没有那么多精力了.
;;对于lisp程序结构,我自己有了自己的看法,自己总结一下,今后套用这种格式。自贡黄明儒 2014.10.15
;;1 建立通用和自定义函数库,分别保存为Public.lsp和MyLsp.lsp,今后加载和修改就方便了
;;今后只需要加载两个文件,这就方便了;通用函数的建立,给自己修改来方便。
;;2 自定函数
(defun C:w1 (/ CMD1 OSM1 SS)
;;2.1 错误处理
;;定义在函数内部,作用范围也只限于此函数。
;;写在开头,以保证后面的代码发生错误,均会执行错误处理。
(defun *error* (msg)
;;2.1.1 写在开头,错误处理反跟踪,找出调试错误所在。调试完毕后,可注释掉
(vl-bt)
;;2.1.2 如果命令还在执行,中断它
(while (not (equal (getvar "cmdnames") "")) (command nil))
;;2.1.3 在错误发生之前改变的变量,发生错误时后面的代码不再执行,必须恢复
(setvar "nomutt" 0);容量忘了它,没恢复成0后面使用起来怪怪的
(cond (cmd1 (setvar 'cmdecho cmd1)))
(cond (osm1 (setvar 'osmode osm1)))
(princ "\n 出错啦!")
;;2.1.4 静默退出
(princ)
)
;;2.2 其它临时函数,非通用的
()
;;2.3 一般说来,执行一个程序,总是要选择对象。如果希望先择后执行,就要有这句,而且写在开头
(cond ((cadr (ssgetfirst)) (setq ss (ssget "_P" '((0 . "*TEXT"))))))
;;2.4 检查加载vl扩展,有这句没有坏处,也不会造成程序多大的额外负担,因为如果已经加载扩展,不做任何事情
(VL-LOAD-COM)
;;2.5 *acad* 是常用的,不必释放。前面加*号,编辑器检查形参时会把它们排在前面,便于我们去除
(or *acad* (setq *acad* (vlax-get-acad-object)))
(setq *DOC* (vla-get-ActiveDocument *acad*))
;;2.6 获取并修改变量
(setq cmd1 (getvar "cmdecho"));如果后面用到command,不希望显示一些信息
(setvar "cmdecho" 0)
(setq osm1 (getvar "osmode"));如果后面用到command画图,不关闭捕捉,就可能不是我们需要的点
(setvar "osmode" 0)
;;2.7 编组开始
;;便于按后悔键Ctrl+Z时,一步退到位
(_StartUndo *DOC*)
;;2.8 程序语句
()
;;2.9 编组结束
(_EndUndo *DOC*)
;;2.10 恢复修改过的变量
(cond (osm1 (setvar 'osmode osm1)))
(cond (cmd1 (setvar 'cmdecho cmd1)))
;;2.11 释放
(cond(*DOC* (vlax-release-object *DOC*)))
;;2.12 内存释放。写上这一句没什么坏处。
(gc)
;;2.13 自己写的程序,时间长了未必记得住快捷命令,不断洗脑
(princ "\n本程序功能:命令w1")
;;2.14 lisp程序执行完后总显示最后执行结果,有了下面一句,就什么也不显示。
(princ)
)
;;3 在编辑器按Ctrl+Alt+C 提取局部变量,如(*ACAD* *DOC* CMD1 OSM1),去除前面带*号的(常用不释放)
;;注意:编辑器会把pause当成局部变量的,这个问题让我花了几天时间找原因
;;4 如果编译成vlx,下面的语句加载时就会显示。自己写来自己用的,就没有必要了。(princ "\n本程序功能:命令w1")
(princ)
;;5 通常函数
;;5.1 功能
;;[功能] 编组开始
;;5.2 说明:相当于(command "_.undo" "be")
;;5.3应用示例(应该输入什么,返回什么,这个很重要。许多高手的函数因没有这个,要研究半天,使人失去耐心)
;;(_StartUndo (vla-get-ActiveDocument (vlax-get-acad-object)))=>
(defun _StartUndo (*DOC*)
(_EndUndo *DOC*)
(vla-StartUndoMark *DOC*)
)
;;[功能] 结束编组
;;(cond((= 8 (logand (getvar "undoctl") 8)) (command "_.undo" "_e"))) (defun _EndUndo (*DOC*)
(cond ((= 8 (logand 8 (getvar 'UNDOCTL))) (vla-EndUndoMark *DOC*))) )