AutoLISP 二次开发基础文档格式.docx
《AutoLISP 二次开发基础文档格式.docx》由会员分享,可在线阅读,更多相关《AutoLISP 二次开发基础文档格式.docx(73页珍藏版)》请在冰豆网上搜索。
能动态对程序进行调试并动态显示代码运行结果。
其次,VLISP生成代码质量高,保密性好,用户可以利用编译器将VLISP源程序编译成为二进制文件,提高程序运行速度,增加安全性,经过编译的VLISP程序可以直接作为AutoCAD内部命令使用。
另外,VLISP还专门新增了处理ActiveX对象的接口函数和对系统文件进行操作的功能函数,能将VLISP与ActiveX对象程序有效地结合在一起,极大地为用户提供了方便,缩短开发时间,提高工作效率。
VLISP还具有比较完善的文件管理功能,可以对硬件进行一定的操作。
可以这样说,VLISP完全克服了AutoLISP的缺点,继承发扬了AutoLISP的优点,已成为AutoCAD二次开发的主流工具之一。
10.1.2高级语言开发系统ADS
ADS(AutoCADDevelopmentSystem)是AutoCAD为用户提供的一个C语言开发系统,是一个函数库,最早出现于AutoCADR11中。
用户可以利用C语言编写程序,调用ADS中的库函数,并通过C语言编译器的编译连接生成ADS应用程序,在AutoCAD环境中直接运行。
ADS应用程序采用结构化的编程体系,运行速度快,比较适合庞大的数据处理。
ADS的优点是:
程序处理数据能力很强,比较适合进行数据计算和数值分析;
ADS源程序需编译后才能运行,保密性好,编译后的程序代码质量高,运行速度快,且移植性好,能直接控制硬件设备,比较适合CAD的专业应用开发。
其缺点是:
ADS程序源代码比较烦琐,程序设计复杂程度大,不易掌握,要求开发人员具有比较完善的计算机编程应用能力,如果编程不当,ADS应用程序中的隐藏错误往往会导致系统的崩溃。
从AutoCADR14起,Autodesk公司用ObjectARX取代了ADS开发系统,事实上,ObjectARX中包含一个子集ADSRX,可以继续用C语言编写AutoCAD二次开发程序,也可以直接将ADS程序移植为ARX程序。
10.1.3对话框控制语言DCL
DCL(DialogControlLanguage)是一种嵌入在AutoCAD内部的对话框控制程序设计语言,最早出现在AutoCADR12中。
DCL的主要功能是在对话框中将AutoCAD的多样化接口与提供程序执行时所需的数据和选项集于一体,实现交互式的程序设计和人机对话操作。
用户可以利用DCL创建应用对话框,通过对话框的操作来执行各种应用程序和几乎所有的AutoCAD命令。
DCL是目前对AutoCAD进行交互式动态二次开发最常用的语言之一,其特点是创建了动态对话窗口,利用窗口操作方式实现程序开发设计。
同时,DCL也是解释式的结构化程序设计语言,语法简单,功能强大,程序设计灵活,运行速度快,兼容性较好。
另外,DCL程序通过AutoLISP相应函数来管理执行,比较适合做终端开发。
10.1.4基于对象的集成编程环境VBA
VBA是MicrosoftVisualBasicforApplications的简称,最早出现在AutoCADR14中,是一个基于对象的集成编程环境,也是对AutoCAD进行二次开发最有效的工具之一。
VBA作为面向对象的高级程序设计语言,语法简单,功能强大,使用方便,其语法结构与VisualBasic很类似,经过编译链接的VBA程序能直接在AutoCAD内部运行,也可以将VBA程序作为外部程序来执行,直接对AutoCAD对象进行操作。
VBA主要通过AutoCADActiveXAutomation接口传递消息,实现其控制编程机制,具备强大的编程开发能力和灵活性。
用户可以利用ActiveXAutomation重新定义AutoCAD,与其他应用程序共享AutoCAD图形数据,能在其它的Windows编程环境下直接访问AutoCAD图形,可以利用DAO或ADO技术连接数据库,能实现产品数据的自动管理(PDM),用户还可以利用VBScript技术实现企业生产综合数据库系统Internet/Intranet应用,达到生产设计信息化、自动化、快速化目的。
如果要以AutoCAD为基础平台开发出多功能集成的CAD系统,VBA无疑是最
佳的开发工具。
10.1.5新一代高级语言开发系统ObjectARX
ObjectARX(AutoCADRuntimeExtension)是专门为AutoCAD进行二次开发而推出的一个以C++语言为基础的、面向对象的开发环境和应用程序接口,ObjectARX最早出现在AutoCADR14中。
ObjectARX应用程序实质上是Windows的一个动态链接库(DLL),它共享AutoCAD的地址空间,可以直接调用AutoCAD的核心函数,并能直接访问AutoCAD的数据库、图形对象系统和几何图像引擎,通过程序的运行来扩展AutoCAD固有的类及其功能,创建AutoCAD的新命令,从而实现其编程机制。
ObjectARX应用程序具有数据可封装性、可继承性及多态性等特点,程序运行速度更快、运行状态更稳定、独立性强,能控制硬件设备,可以与其它Windows应用程序实现交互操作,还可以与VLISP或VBA编程接口混合使用,进行混合编程,实现诸多复杂的功能。
事实上,ObjectARX的功能比VBA更全面,尤其是面向对象的功能更强大,但ARX程序设计难度较大,程序运行风险较高,稍有不慎,容易造成系统毁坏,所以,要求开发人员必须具有较好的软件知识和较强的编程应用能力,比较适合专业人士进行CAD应用开发。
通过对AutoCAD二次开发工具的简单分析对比可知,初级的AutoCAD二次开发学习者适合选用AutoLISP、VLISP、VBA工具,这些工具语言易学、入门快,可以在短期内掌握其语法特点,编制出自己需要的实用工具;
如果要针对AutoCAD进行大型复杂的二次开发最好是选用ObjectARX工具。
本章要介绍的是简单易学的AutoLISP语言,由于VisualLISP是新一代AutoLISP语言,在后绪章节学习中,不再严格区分AutoLISP与VisualLISP。
10.2AutoLISP语言基础
10.2.1AutoLISP语言简介
LISP(ListProcessingLanguage)是被广泛应用的程序设计语言之一,主要用于人工智能、机器人、专家系统、博弈、定理证明等领域。
LISP也被称为符号式语言,因为这种语言的程序和数据都以符号表达式的形式来表示。
LISP语言语法简单,编写程序便捷、灵活,数据类型丰富。
利用LISP语言可以很容易地定义或调用新的函数,因此,Autodesk公司早在1985年的2.1版本就引用了LISP语言的宏操作,在1986年的2.5版本就推出了比较成熟的AutoLISP语言。
AutoLISP是为AutoCAD二次开发而专门设计的编程语言。
它起源于LISP语言,嵌入在AutoCAD的内部,既有LISP语言人工智能的特性,又具有AutoCAD强大的图形编辑功能,可以把AutoLISP程序和AutoCAD的绘图命令透明地结合起来,使程序设计和绘图完全融为一体,还可以实现对AutoCAD图形数据库的直接访问和修改,是LISP语言和AutoCAD有机结合的产物。
VisualLISP的出现使得AutoLISP语言有了巨大的变化。
VisualLISP的用户界面良好,用过Microsoft软件的用户只需很短的时间即可掌握它。
在VisualLISP集成环境下开发AutoLISP程序,不再像以前那样编辑程序时,要用文本编辑程序(文本文档或记事本等程序)编写程序代码;
调试程序时用户可以根据需要自己决定在程序的什么位置插人监视器,以便查看变量的内容。
在VisualLISP集成环境下可以便捷、高效地开发AutoLISP程序,可以经过编译得到运行效率高、代码紧凑、源代码受到保护的应用程序。
VisualLISP是新一代AutoLISP语言。
它对AutoLISP语言的功能进行了扩展,可以通过MicrosoftActiveXAutomation接口与AutoCAD对象进行交互,可以通过反应器函数扩展AutoLISP响应事件的能力。
10.2.2AutoLISP表达式
AutoLISP处理的对象是符号表达式(简称表达式),是LISP程序的基本单元。
表达式相当于其他编程语言中程序的语句。
(1)表达式构成
表达式是包含函数关键字,并按AutoLISP语言规则书写的字符串。
字符串中可以有数、串和符号。
数或串的值是数或串本身,符号的值是赋给该符号的值。
多数情况下,表达式以表的形式存在,其格式如下:
(函数名【参数】…)
表达式由左括号开始,右括号结束,表达式可以嵌套,不伦嵌套几层,其左右括号必须是配对的。
表达式形式的表中,左括号之后的第一个元素必须是函数名。
(2)表达式的表示
大多数程序语言的表达式采用中缀表示法,即运算符在操作数中间,如:
x=y+z。
AutoLISP采用前缀表示法,将函数名或运算符放在所有操作数之前,如:
(setqx(+yz))
(3)表达式返回值
在LISP语言中,函数之间不存在是否优先的关系,求值的先后顺序只能通过表的层次来实现。
最里层的表最先被求值,把求值的结果返回给外层的表,直至求值完毕。
例如,表达式(setqx(*(+ab)c)),先求出最内层a与b之和,然后求出a,b之和与c的积,将求得的积赋给x,最后返回x的值。
(4)错误信息
在表达式运行过程中,如果输入的右括号不配对,则会显示错误提示:
输入的列表有缺陷。
Vlisp环境下支持自动修正缺失的括号功能。
10.2.3AutoLISP数据类型、变量
AutoLISP语言有着丰富的数据类型、灵活的变量定义。
(一)、数据类型
AutoLISP的数据类型丰富,除了具有一般程序设计语言的整型、实型、字符串等数据类型之外,还有表、文件描述符、AutoCAD选择集、AuroCAD图元名、VLA对象等数据类型。
(1)整型(INT)
整型即整数型。
由0~9数字、+、-字符组成,不允许出现其他字符,“十”号可省略,如+110,321,-30均是合法的整型数据。
在目前使用比较多的32位计算机上,AutoLISP的整型数据用32位表示,其取值范围为-2147483648到+2147483648。
如果用户输人的数据超出此范围,AutoLLSP会自动将整型数据转换为实型数据,但对于两个有效整数进行运算所产生的结果超出此范围的情况,最后会得到无效的结果。
(2)实型(REAL)
实型数据又称为浮点数,AutoLISP中为双精度,即保证有14位的有效精度。
实数有小数和科学计数两种表示形式:
·
小数形式
例如:
0.123,-2.345但需要注意的是,与其他语言不同,AutoLLSP中对于绝对值小于1的实数不能直接以小数点开头,必须在小数据点前加上0,否则计算机会误认为是点对而出错。
例如不能将0.123简写为.123
科学计数法形式
即数字后有一个e或E,而后跟数的指数。
如1.23E3表示1.23×
103,同样也可表示为0.123E4或12.3e2。
但要注意e或E之前必须有数字,且指数必须为整数,如E3、1.23E2.5、e均不是合法的指数形式。
(3)字符串(STRING)
字符串又称为字符常数,它是由双引号括起来的字符序列。
字符串中字母的大、小写和空格符都有特定意义。
字符串中字符的个数称为字符串的长度,最大为132,如果超出,则后面的字符无效。
任何字符都可以用“\nnn”的格式表示,其中反斜杠“\”是ASCII码的前导标识字符,nnn是该字符八进制的ASCII码。
例如,字符串ABCD也可表示为\101\102\123\104。
一些常用的控制字符,像反斜杠、双引号,除了可以用“\nnn”的格式表示之外,还可以用转义字符格式表示为“\\”、“\"
”等特殊字符,见表10-1。
表10-1用前导“\”符号表示控制字符的方法
控制字符
用转义字符表示
用ASCII码表示
反斜杠“\”
\\
\134
双引号“"
”
\"
\042
ESC键
\e
\033
换行
\n
\012
回车
\r
\015
Tab键
\t
\011
注意:
其中的字符e,n,r,t必须小写;
在VisualLISP中转义字符\r不能作为回车符使用,文字会紧跟在最后一个打印文字后面显示,需要打印回车符时可用(CHR13)来代替。
(4)表(LIST)
表是放在一对圆括号中的一个元素或用空格分隔的多个元素的组合,表中的元素可以是函数,也可以是上述3种数据类型,甚至是另一个表,因而表提供了在一个符号中存储大量相关数值的有效方法。
表是LISP语言处理的对象,是VisualLISP基本数据结构。
例如,(+123),(sin(*2.3pi)),((AB)C(DE)),(0"
LINE"
),()都是合法的表。
表中元素的个数称为表的长度。
例如,表(+123)的长度为4,表(sin(*2.3pi))的长度为2,表((AB)CD)的长度为3,表()的长度为0。
用表可以很方便地构造出复杂的数据结构。
例如,(2.52.21.6)可以表示为X等于2.5,Y等于2.2,Z等于1.6的三维点。
(5)文件描述符(FILE)
文件描述符是在打开一个文件时VisualLLSP赋予该文件的一个代码,用来作为该文件的标识号。
当AutoLISP函数需要访问一个文件时(读文件或写文件),首先通过该文件描述符去识别并建立联系,然后再进行相应的读写操作。
例如,(setqfile(open"
file.dat"
"
w"
)),用于打开当前目录下的文件“file.dat”,使它可被其他函数所用,同时将该文件描述符的数值赋予file变量。
(6)图元名(ENAME)
图元名又叫实体名,是AutoCAD为图形对象指定的十六进制的数字标识。
AutoLISP通过该标识找到该图形对象在图形数据库中的位置,以便对其进行访问或编辑。
例如,(setqent(entlast))是把图形中最后一个实体的实体名赋予变量ent。
(7)选择集(PICKSET)
选择集是一个或多个实体对象的集合。
可以通过AutoLISP程序建立选择集或向指定的选择集添加或移除图形对象,通过选择集可以对其内部指定的成员进行访问或编辑。
例如,(setqss(ssget"
S"
'
(11)'
(1010)))是选择与对角顶点为(1,1),(10,10)矩形区域相交的图形对象,并赋予变量ss。
(8)VLA对象
VLA对象是ActiveX应用程序的主要组成部分。
不仅直线、圆弧、多义线和圆等称为VLA对象,图层、组、块、视图、视口、图形的模型空间、图纸空间、线型和尺寸标注样式等也称为VLA对象,甚至连AutoCAD应用程序本身也被认为是VLA对象。
(二)、LISP变量
同其他编程语言一样,LLSP也用变量来存储数据,但VisualLISP中的变量同其他高级语言相比,还是有着很大的不同。
(1)变量的命名
VisualLISP把任何数据都看成是被求值的数据,因而函数与变量的标识(即函数名、变量名)也会被当成数据,称为符号,可理解成是一种特殊的数据类型。
它一般由字母、数字及其它除系统保留(表10-2)外的可打印字符组成,但不能仅由数字组成,也不能包含空格。
表10-2系统保留字符
保留字符
用途
左或右括号()
用于表的定义
.
点对标识符
'
quote函数的简写
"
字符串界定符
;
程序注释标识符
?
显示操作符
AutoLLSP中,变量名最长可达100个字符,但为了程序的易读性及节约内存,变量名的长度尽量不要超过6个字符。
如果一个变量名的长度超过6个字符,那么变量名不能用节点来存储,而是在节点中会有一个指向另一个包含实际符号名的内存指针,这样就要占用额外的内存,而且符号名越长,代码的执行速度就越慢。
在AutoLISP中,符号的大小写是等效的。
(2)变量的数据类型
数据类型是变量的重要特征,它关系到存放变量的存储空间大小。
大多数计算机语言在为变量赋初值前,都会对变量的数据类型作一定说明。
而AutoLISP无须对变量做事先的类型说明,变量被赋予值的类型即变量的数据类型。
在程序运行过程中,同一变量在不同的时刻可以被赋予不同类型的值,即在程序运行的过程中可以改变变量的数据类型。
例如:
(setqx1);
给变量x赋值1,变量x为整型
(setqx“text”);
给变量x赋值text,变量x为字符串型
(3)预定义变量
AutoLISP对变量nil、T、PI、PAUSE进行了预定义,供用户在编写程序时直接使用。
没有指定值的变量称为nil变量。
nil与空字符串及0不同,nil既不是字符串,也不是一个整数0,它表示尚无定义。
另外,nil作为逻辑变量的值,表示不成立,相当于false。
每一个变量都占用一小部分内存,如果将某一变量赋值为nil,则相当于是取消该变量的定义,并释放该变量所占用的内存空间。
T、PI及PAUSE均为常量。
T为逻辑变量的值,表示成立,相当于true;
PI表示一个实数型常量;
PAUSE表示一个双反斜杠(\\)字符构成的字符串常量,常与Command函数配合使用,用于暂停,等候用户输入。
(4)变量的值域
AutoLISP所使用的变量也分为局部变量和全局变量。
局部变量是指用户在某一个函数中定义的变量,它在函数执行过程中值被保存,函数执行结束,变量则自动消失。
局部变量由函数defun来定义。
全局变量是用setq函数定义的变量,它的值永久被保存,直到用户退出程序为止。
10.3AutoLISP函数
AutoLISP提供功能齐全的各种函数。
一般计算机语言所说的函数,AutoLISP同样称之为函数,一般计算机语言里的子程序、过程、运算符、程序流程控制的关键字,在AutoLISP里仍然被称之为函数。
AutoLISP将函数分为内部和外部函数。
AutoLISP提供的或用AutoLISP定义的函数为内部函数,用ADS、ADSRX或ARX定义的函数为外部函数。
在此,我们主要介绍常用的几种内部函数,其它函数参考附录。
10.3.1赋值函数
AutoLISP系统提供了以下函数供用户来为变量赋值。
(1)setq函数
(setqsym1expr1sym2expr2sym3expr3…)
返回值为最后一个变量的赋值。
例如:
(setqn"
ABC"
X1y2),此式将使x的值为1,y的值为2,n的值为ABC,并最后返回结果2。
如果该表达式还有外层表达式,则该表达式返回的结果可参与运算。
(+1(setqn"
x1y2)),此式不仅进行上述赋值过程,还将(setqn"
x1y2)返回的结果2参与加法运算,得到结果为3。
(2)Set函数
(setsymexpr)
函数返回值为变量的值。
Set函数与setq函数类似,但set把其参数中sym与expr均当做表达式来看待,分别进行求值运算后再进行赋值操作,而setq则仅对参数expr进行表达式求值操作,将参数sym当做符号来赋值,并且set仅处理两个参数。
例如,对符号“ABC”进行赋值操作:
(set‘abc123);
返回值为123
但不能如调用setq函数一样(setABC123)对abc求值,因为ABC在此仅是还未定义的符号。
利用此性质,可将sym参数用一个表达式来描述,而setq函数这样则不行,如:
(set(read"
)123);
(setq(read"
)123);
显示出错信息
(3)quote函数
作用是禁止对表达式求值,而将表达式本身作为返回值返回,调用的格式为:
(quoteexpr)
此函数使用频率较高,在程序中需要关注表达式本身而非表达式的求值结果时,需用此函数。
AutoLISP提供此函数的简记符为“‘”,上述调用格式等效于’(表达式)。
(quote(*a24));
返回值为“(*a24)”
‘(*a24);
(4)eval函数
(evalexpr)
作用是求表达式的值,与quote函数的作用相反。
此函数运行时