今天的这个例子是lisp计算机语言编程,说到这门计算机语言还是大学的时候接触的,不过那时候都是停留在了解的层面上,后面编写AutoCAD二次开发程序几乎是用的是C#。所以对lisp不熟,就别提关于lisp在AutoCAD方面的接口。而今天所以又捡起这么计算机语言,是出于两方面原因,首先在AutoCAD明经测绘GIS板块中有相当一部分代码是lisp编写的,这部分代码非常实用于测绘GIS日常生产。另外一个方面是,在AutoCAD论坛中,autoLisp版块非常活跃,这里常常汇聚着一些业界的大牛,在这里开源了相当一部分代码。可以说,是一部分相当不错的资料。
使用lisp开发AutoCAD程序开发环境为AutoCAD自带的编辑器。具体界面如下图所示。
代码只要写在空白处,保存为.lsp后缀文件即可。下面来说一下,常用的调试键,F8为单步调试,为嵌套的方式,会层层的深入。而如果想一个一个表达式调试,只要shift+F8即可。而下面截图中按钮是对代码的执行,代码的检查,由于lisp以非常繁琐的链表方式,即括号的方式编写,所以使用这几个功能对代码的检查是十分有必要的。
类似于C#,JAVA计算机语言,我们在调试的时候需要对我们的变量值进行查看,在AutoCAD中可以使用如下图的监视窗口。在窗口中输入变量的值,可以查看程序运行中,变量值的变化。
而我们在开发中,往往需要对代码进行类似C#一样,将AutoCAD添加到进程中调试,在AutoCAD自带的编辑器中,我们只要使用激活AutoCAD即可。具体如下图所示。
好了,关于编写AutoCAD开发的lisp程序方面的环境,以及常用的快捷键就说明完,当然了,更多的相关的知识,大家可以查看网络的相关资料,这里就不做详细的说明。
今天的这个例子是利用AutoCAD对象,利用反射调用函数打开文件窗口,读取文件。然后读文件该目录下的dwg后缀的文件。再由AutoCAD里面创建表格,将文件名填写到表格里面,整个程序就作完工作。在这里例子,我们将会学到AutoCAD对象的链接,模型空间中添加表格,表格单元格的填写。就lisp语法而言,有对象的反射调用,循环的使用。可以说是学习AutoCAD在lisp开发不错的例子。具体的实现代码如下图所示。
(defun c:GET_FILES ( / sh folder folderobject result)
(vl-load-com)
(command "cmdecho" 0)
(setq sh (vla-getInterfaceObject (vlax-get-acad-object) "Shell.Application" ))
(setq folder (vlax-invoke-method sh 'BrowseForFolder 0 "" 0 ))
(vlax-release-object sh)
(setq folderobject (vlax-get-property folder 'Self))
(setq result (vlax-get-property FolderObject 'Path))
(setq Files_Folder (vl-directory-files result "*.dwg"))
(setq acadObj (vlax-get-acad-object))
(setq doc (vla-get-ActiveDocument acadObj))
(setq pt (vlax-3d-point 0 0 0))
(setq modelSpace (vla-get-ModelSpace doc))
(setq MyTable (vla-Addtable modelSpace pt (+ (length Files_Folder) 2) 2 10 100))
(vla-ZoomExtents acadObj)
(vla-setText MyTable 0 0 "图形文件列表")
(vla-setText MyTable 1 0 "序号")
(vla-setText MyTable 1 1 "文件名")
(if (/= (length Files_Folder) 0)
(repeat (setq N (length Files_Folder))
(setq e (nth (setq N (- N 1)) Files_Folder))
(setq fsl (strlen e))
(Setq Fsl (- fsl 4))
(setq Fname (substr e 1 fsl))
(vla-setText MyTable (+ N 2) 0 (+ N 1))
(vla-setText MyTable (+ N 2) 1 Fname)
)
(princ "\n无 *.DWG 后缀的文件")
)
(command "cmdecho" 1)
(princ)
)
下面来看一下录制的gif效果。
更多内容,请关注公众号