浅谈基于Auto LISP的Auto CAD二次开发技术_软件技术论文发表
浅谈基于Auto LISP的Auto CAD二次开发技术
敖广春
[摘要] 在以AutoCAD制图的工程应用中,经常需要开发一些符合工程需求的AutoCAD工具。AutoLISP语言是一种对AutoCAD进行二次开发的灵活手段。本文通过一个从上到下逐行写文本的简单程序,探讨了基于AutoLISP的AutoCAD二次开发程序设计的基本步骤和具体实现过程。
[关键词] AutoCAD AutoLISP 二次开发
一、引言
Auto CAD是由美国Autodesk公司开发的通用计算机辅助设计软件。由于其使用方便、灵活,尤其是其良好的开放性,使AutoCAD已成为全世界微机CAD系统的主流产品。目前广泛应用于测绘、机械、建筑等行业。由于其是通用软件,所以对于一些专业性功能受到限制,因此在实际的应用中通常要根据专业的需要进行二次开发。Visual LISP给用户提供了一个集成的开发环境,使用户可在易于使用的完全可视化的开发环境下编写、调试代码;经过编译的LISP程序不但提高了运行性能,并可防止他人试图获得用户程序代码;通过Windows的ActiveX与AutoCAD的对象模型接口可与其它软件集成。
二、 Auto LISP语言的特点与结构
AutoLISP 基于简单易学而又功能强大的LISP 编程语言。它语法简单,编写程序便捷、灵活、数据类型丰富。也可以在应用程序中使用对话框语言DCL(Dialog Control Language)、控制菜单,还能够提示用户输入、直接访问内置 AutoCAD命令,以及修改或创建图形数据库中的对象,向 AutoCAD 添加专用命令等。实际上,某些标准AutoCAD命令就是AutoLISP应用程序。
AutoLISP通过VLISP (Visual LISP)进一步得到增强,VLISP提供了一个集成开发环境 (IDE),其中包含编译器、调试器和其他提高生产效率的开发工具。通过IDE用户可以进行试验:在命令提示下输入代码后可立即看到结果。因此在IDE下用户可以便捷、高效地开发AutoLISP程序,经过编译得到运行效率高、代码紧凑、源代码受到保护的应用程序,且程序的兼容性很强。
AutoLISP的数据类型丰富,除了具有一般程序设计语言的整型、实型、字符串等数据类型之外,还有表、函数、文件描述符、AutoCAD选择集、AutoCAD图元、VLA(Visual LISP ActiveX)对象、函数分页表和外部函数等数据类型。AutoLISP处理的对象是符号表达式(简称表达式),相当于其他编程语言中的语句。利用AUTOLISP(VLISP)表处理语言进行二次开发可以将许多繁琐、易出错的工作简单化、程序化.。这样不但可减少航测制图的出错机率,而且大大提高了其作业效率。
三、使用AutoLISP进行二次开发的实例及过程剖析
(一)题目。
下面通过编写一个从上到下逐行写文本的小程序段来简要分析AutoLISP的开发过程。题目要求如下:
1. 用户只需点击一个自定义工具按钮,系统即会提示用户输入首行文本所在位置、相邻两行文本偏移量、文本高度这三个参数。其中,首行文本所在位置由鼠标在屏幕上点击获得,文本高度默认值为4。
2. 用户依次输入文本,回车表示结束当行输入。
3. 当所有文本输入结束后,按“Esc”键结束退出。AutoCAD回到等待命令输入状态下。
(二)题目编制依据。
设计人员经常会遇到一些“填表”的工作,譬如在电力系统设计中,工作人员现场测得各电力杆的间距,需要在AutoCAD中将其制成电子表格,在表格中从上到下依次填制数据。使用这种方法填制数据需要频繁地交叉使用鼠标和键盘输入,如果要填制的电力杆多达上千根,那么设计人员的工作量将非常大。
如果编制出该控件,那么用户除输入三个必要参数外,只需依次输入各行数据即可,并且如果能够保证输入数据的准确性,设计人员甚至可以不看屏幕,只需看着记录文本即可实现快速录入,从而大大简化工作、压缩工作量、提高工作效率。
需要说明的是,在从AutoCAD2005始,软件中已增加了表格的功能,因此上述所提的困难主要是针对老版本AutoCAD的。但是考虑到本文仅仅是浅要剖析AutoLISP二次开发的过程,采取该程序例题作探讨仍然是合适的。
(三)程序流程及代码。
本例流程图如下所示:
在AutoCAD的环境变量中,cmdecho是控制命令回显的参数,将cmdecho设置为“0”后,可以屏蔽命令回显。由于程序执行时,其实是在后台频繁调用各种CAD命令进行制图,如果不屏蔽,则调用的各种命令都将在CAD主窗台下面的命令栏里滚动显示,造成命令行频繁刷屏,虽然没有影响,但却属于无用信息,因此需给予屏蔽。
环境变量osmode是控制捕捉的参数,将osmode置“0”后,捕捉状态即被屏蔽。如果没有屏蔽捕捉状态,当用户用鼠标点取文本起始位置时,往往会误捕捉到附近的交点、端点等等地方,造成不便。
另外,这两个变量只能在该程序段中置零,程序执行完必需予以还原,否则程序执行完之后,将存在没有命令回显和捕捉开关必须重设的麻烦。
在初始化环境变量后,就必需依次输入三个重要参数:起始位置、行距、文字高度。其中起始位置由用户在CAD主窗口用鼠标点取,而行距和文字高度,由用户键盘输入,在这文字高度问题上,当程序从键盘上可以获得一有效数字时,即将其设为文字高度,如果用户在该部分直接回车跳过,那么系统将默认文字高度为4。同理,该方法对行距调整也可适用。
在初始化及提供参数结束的情况下,用户可以逐行输入文本,回车表示结束一行文本录入,而当程序分析所获文本内容为空,则结束循环,将AutoCAD的环境变量还原并退出程序。
以下即为本例程序代码:
(defun c:textt()
(setq oldcmdecho (getvar "cmdecho"));环境变量,用于屏蔽命令回显
(setvar "cmdecho" 0);将系统参数cmdecho置0
(setq oldosmode (getvar "osmode"));环境变量,用于关闭捕捉状态
(setvar "osmode" 0) ;将系统参数osmode置0
(setq p1 (getpoint "请输入起始点\n"))(setq d (getreal "\n请输入相 邻两行文本之间距离 :"))
(setq h (getreal "\n请输入文本高度 <4>"))
(setq s (getstring "\n请输入文本内容:(回车结束输入)"))
(if (= h nil) (setq h 4)) (while (/= s "")
(progn (command "text" "j" "bc" p1 h "0" s "") ;在指定坐标处输出文本
(setq p1 (list (car p1) (+ (cadr p1) d))) ;获取下一点平面坐标
(setq s (getstring "\n请输入文本内容:(回车结束输入)"))
)
)
(setvar "cmdecho" oldcmdecho);还原系统环境变量
(setvar "osmode" oldosmode) (princ)
)
(四)调试。
程序编辑完保存后,点击Visual LISP主窗口上的“工具”菜单,在其下拉菜单中选“加载编辑器中的文字”,然后在Visual LISP控制台中输入用户所编程序的程序名,如果有错误,控制台中会有错误提示,如果程序没有错误,则在控制台中显示程序运行结果。
(五)定制工具按钮。
在CAD工具栏处右键,选“自定义”,在弹出的对话框中,选“用户定义”,将出现的“用户定义的按钮”,拖放到工具栏上,则会出现一个没有任何定义的空白工具按钮。在“宏”定义中,填入“(load "d:/lsp/filename.lsp”) programname”(仅供示例,需对照修改)即可。其中“d:/lsp/filename.lsp”为被编辑原代码文件的带地址文件名,而programname则为用户自定义的程序名。修改好之后,即可按下“应用”按钮并退出。
该工具按钮定制结束后,在AutoCAD的 “工具”菜单的下拉菜单“AutoLISP”中选 “加载…”命令,将所开发的二AutoLISP程序文件进行加载,即完成本次全部开发。
三、结论及说明
上述程序代码段,经调试、检验,是确实可用的。其检验环境是AutoCAD2006。
在该二次开发实现中,用户需对相应的CAD命令和LISP函数都能熟练掌握。
不同版本的CAD可能在某些CAD命令的使用上会有所区别,这会导致某些二次开发移植到不同版本的CAD中无法正常使用。
参考文献:
[1] 赵景亮,李志刚.AutoCAD 2004与AutoLISP二次开发技术[M]. 北京:清 华大学出版社.
[2] 张跃峰,陈通.AutoCAD 2002入门与提高[M].北京:清华大学出版社.