AutoLISPWord格式.docx
《AutoLISPWord格式.docx》由会员分享,可在线阅读,更多相关《AutoLISPWord格式.docx(40页珍藏版)》请在冰豆网上搜索。
例如:
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.1AutoLISP函数
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函数的作用相反。
此函数运行时,先对expr参数进行首次求值,然后再对求值结果进行二次求值,并将这第二次的求值结果作为函数的返回值。
(eval(quote(+1.18)));
返回值为9.1
表达式(quote(+1.18))的值为“(+1.18)"
eval函数再对此进行求值得9.1,然后将此结果返回。
10.3.2数据类型转换函数
AutoLISP中有各种数据类型,但对于程序设计来说,一般是在整数、实数和字符串这3种数据类型之间进行转换。
AutoLISP提供函数来实现这3种数据类型之间的转换。
不同数据类型之间进行转换的功能函数对应关系如表10-3所示。
表10-3数据类型转换函数
整型(int)
实型(float)
字符串(string)
\
float
itoa
fix
angtos
atoi
atof
上述函数的调用格式均为:
(函数名变量)
例如将实型转化为整型的函数fix,该函数的参数可以是整型或实型,返回值为整型,但此函数的取整过程是舍掉小数部分,而非四舍五入,例:
(fix3.6);
返回值3
还有一类类型转换函数,不仅进行数据类型的转换,而且还有格式化的功能,即将整型、实型数值以及距离、角度等数值类型按照一定的格式转换成字符串。
(1)整型或实型格式化函数rots
该函数把整数或实数按照指定的模式和精度将数值转换成字符串,调用格式为:
(rtosnumber【mode【precision】】)
其中,参数number可以为整型或实型常数、变量或表达式;
中括号为可选;
参数mode为线性单位的格式编码,与AutoCAD的线性格式相对应,具体对应关系如表10-4所示。
表10-4格式码与线性单位格式
rtos中的格式码
线性单位格式
1
科学计数
2
小数
3
工程(英尺+十进制英寸)
4
建筑(英尺+分数英寸)
5
分数
如果调用该函数时没有指定该参数值,则将采用系统变量lunits指定的当前线性单位格式。
参数precision用来指定数值的显示精度,对于前3种格式,该参数用来指定小数点后的小数位数。
对于后两种格式,用来设定最小分数的分母。
如果调用时函数没有指定该参数值,则采用系统变量Luprec设定的当前精度值。
(2)距离格式化函数distof
该函数实现同rtos函数相反的功能,即把表示距离的字符串按照指定的格式转换成实数,调用格式为:
(distofstring【mode】)
其中,参数string必须是根据参数mode指定距离测量格式能正确解释的字符串;
参数mode的用法同函数rtos中参数mode的用法,且设定的格式码与线性单位格式的对应关系如表10-4所示。
(distof"1’-1.25\""3),返回值为13.25。
(3)角度格式化函数angtos
(angtosangle【mode【precision】】)
该函数把以弧度为单位的角度按照指定的角度格式及精度转换成字符串,角度值的大小在【0,2π】之间。
其中参数angle可以是整型和实型常数、变量及表达式;
参数mode为角度格式编码,与AutoCAD的角度格式相对应,具体对应关系如表10-5所示。
表10-5角度格式码与角度格式
angtos中的格式码
角度格式
示例
十进制
15.5000
度/分/秒
15d30’00
百分度
10’-4.50"
弧度
5’-41/4"
勘测单位
151/2"
如果调用函数时没有指定该参数的值,则采用系统变量aunits指定的当前角度格式。
参数precision用来指定转换后小数点之后的位数,如果调用函数时没有指定该参数的值,则采用系统变量auprec设定的当前精度值。
(angtos1.047204);
返回值60.001
(angtos1.047214);
返回值60d0’1\"
(4)角度格式化为弧度函数angtof
(angtofstring【mode】)
该函数实现同angtos函数相反的功能,即把表示角度的字符串按照指定的格式转换成以弧度为单位的实数。
其中,参数string必须是根据参数mode指定角度格式能够正确解释的字符串,既可以与angtos函数返回结果的格式相同,也可以是AutoCAD允许的从键盘输入的角度格式。
参数mode的用法同函数angtos中参数mode的用法,且设定的角度格式编码与角度格式的对应关系也如表10-5所示。
(angtof"
60"
);
返回值1.0472
<
60d0'
0\"
(5)单位换算函数cvunit
(cvunitvaluefromto)
该函数把一种单位格式转换成另一种单位格式,其中参数value为要换算的数值或二维表、三维表,但数值类型必须为整型或实型,且不能为空。
参数from为原来使用的单位,to为返回值使用的单位,这两个单位必须在CAD单位定义文件ACAD.unt(安装根目录\UserDataCache\Support)中已经定义。
而且,转换的两种单位必须为同一类型,否则函数的返回值为空。
(cvunit1"
hour"
minute"
返回值60.0
feet"
m"
返回值0.348
10.3.3逻辑函数
逻辑函数用于将表达式中的一项或者多项参数进行逻辑运算,运算的结果为真或假,AutoIdSP系统提供如下一些最基本的逻辑操作函数。
(1)AND函数
(and【expr1】【expr2】【expr3】…)
该函数用于表达式的“逻辑与”运算,在参数表中,参数可以是一个AutoLISP表达式,也可以是由一个或者多个AutoLISP表达式。
在计算时,只要这些参数表的值有一个为空(nil),AutoLLSP就停止求值并返回空(nil),只有当参数表中的所有参数都不为空时返回真(T);
如果不带参数调用该函数也返回真(T)。
(setqx1y2)
(and1xy);
返回值T
(and1xyz);
返回值nil
(2)OR函数
(or【exprl】【expr2】【expr3】…)
该函数用于表达式的“逻辑或”运算,用法基本同AND。
在计算时,只要这些参数中有一个值非空,则返回真(T),当这些参数均为空时,返回值为空(nil);
如果调用该函数时未提供任何参数,则返回空(nil)。
(or1xz);
(or1‘());
(orz‘());
(3)NOT函数
(notitem)
该函数用于表达式的“逻辑非”运算,NOT函数的<
参数>
仅有一项,该<
可以是一个AutoLISP表达式或由一个AutoLISP表构成。
在计算时,只要该参数的值为空,就返回真(T),非空则返回空(nil)。
如果调用时不带参数,则提示出错信息。
(notz);
(not‘(xy));
(4)NULL函数
(NULLitem)
该函数作用是测试某一项是否为空(nil),同NOT函数的功能大体相同,Null与NOT函数的区别在于,NULL函数一般用于表,而NOT函数则用于其他数据类型和某些类型的控制函数。
(null'
());
返回值为T
10.3.4关系函数
在进行条件判断时,不仅仅需要从各参数的逻辑值进行判断,还需要对参数值本身进行判断,AutoLISP系统提供如下一些最基本的关系运算函数:
(1)=函数
(=numstr【numstr】【numstr】……)
该函数比较两个参数的值是否相等,其中,参数的类型为数值型(整型、实型)或字符串型,参数的个数可以是多个。
只有当所有参数值均相等时函数返回值为T,否则返回值为nil。
如果仅提供一个参数,则函数返回T;
如果不提供参数,则提示出错。
(=1010);
(="
same"
SAME"
(2)/=函数
(/=numstr【numstr1】【numstr2】……)
该函数比较两个参数的值是否不相等,其中参数的类型为数值型(整型、实型)或字符串型,参数的个数可以是多个,但同=函数不同的是,/=函数依次比较相邻两个参数的值,如果没有两个相邻参数值相等则返回T,否则返回空(nil)。
如果仅提供一个参数,函数返回T;
不提供参数,则提示出错。
(/="
(3)<
及<
=函数
(<
numstr【numstr1】【numstr2】……)
函数比较参数之间是否存在小于关系,其中参数的类型为数值型(整型、实型)或字符串型,参数的个数可以是多个,但进行比较时,各参数的数据类型应一致,否则提示出错。
该函数同/=函数一样,依次比较相邻两个参数的值,如果每个参数值都小于它右边的参数值,则函数返回T,否则返回nil。
如果仅提供一个参数,函数返回T,不提供参数,则提示出错。
123);
132);
=函数的用法同<
函数,只是<
=进行的是小于等于判断。
注意:
在进行两个字符串比较时,<
函数(<
=函数)依次比较字符串系列中对应位置的字符的ASCII值。
如果在某一位置小于关系成立,则返回T,否则一直比较下去直至字符串结束,若结束时仍未成立,则返回nil。
对于两字符串长度不等的情况,<
函数在比较至短字符串结束时,则认为长字符串的值大于短字符串的值。
(4)>
及>
numstr【numstr1】【numstr2】……〕
>
函数比较参数之间是否存在大于关系,该函数的用法同<
函数一样,依次比较相邻两个参数的值。
如果每个参数值都大于它右边的参数值,则函数返回T,否则返回nil。
=函数的用法同>
函数,>
=函数进行大于等于判断。
(5)eq函数
(eqexpr1expr2)
该函数判断两个表达式是否为同一对象,其中参数expr1为用于比较的表达式,expr2为与expr1进行比较的表达式。
该函数仅能接受两个参数,过少或过多均会提示出错。
如果两表达式为同一对象则返回T,否则返回nil。
(6)equal函数
(equalexpr1expr2【fuzz】)
该函数判断两个表达式的值是否相同,前两个参数的意义同eq函数一样,参数fuzz为实数,用于定义expr1和expr2之间的最大允许误差。
如果表达式相等(等于同一个数值)或者两者相差在参数fuzz的范围内时,认为二者相等,返回T,否则返回nil。
如果不提供参数Fuzz,则系统默认误差值为0。
(equal10.110.