Lisp程序结构

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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*))) )

相关文档
最新文档