Visual LISP函数分为内部函数和用户定义的外部函数,它对Auto LISP进行了扩展,增加了新的功能及新函数,扩大了应用范畴。学习Visual LISP语言,重点要掌握这些函数的应用,本章限于篇幅,只对其常用函数进行简要介绍。其常用函数包括赋值函数、数学函数、符号操作函数、字符串处理函数、表处理函数、函数处理函数、出错处理函数及应用程序管理函数等。Visual LISP语言调用函数是通过标准表来实现的,其格式如下:
(函数名[〈参数1〉][〈参数2〉]…[〈参数n〉])
表中第一元素必须是函数名,后面的各元素是该函数的参数,可以为具体数字符号,也可以是其他函数,参数的类型与多少取决于相应的函数。
1)赋值函数
格式:(setq符号1表达式1符号2表达式2…)与(set符号 表达式)
功能:将表达式的值赋给符号
setq函数是基本赋值函数,它将表达式的值赋给符号,并可同时将多个表达式的值分别赋给多个符号。
例如:(setq a 8.0)
返回8.0,并将符号a的值置为8.0
(setq a 5.0b35)
返回35,并将符号a的值置为5.0,b的值置为35
set函数也将表达式的值赋给符号,但它与setq函数有以下区别:
①set函数对第一个变元(符号)进行计算,并可将一个新值间接赋给另一个符号,而setq则不然。下面的例子可以说明这一点。
(setq a′b)将变量名b赋给变量a
(set a 100)返回100,且b的值也为100
②若将set函数的第一个变元加上引用符号,则等价于setq函数。例如:
(set′a 3.0)等价于(setq a 3.0)
2)数学计算函数
常用的数学计算函数的使用方法如下:
(1)加函数
格式:(+数1数2…)
功能:该函数返回所有数的总和。
例如:(+3.8 9.2 4.5) 返回17.5
(2)减函数
格式:(-数1数2…)
功能:该函数用第一个数减去后面所有的数。
例如:(-2.7 3.9 4) 返回-5.2
(3)乘函数
格式:(*数1数2…)
功能:该函数返回所有数的乘积。
例如:(*2.7 3) 返回8.1
(4)除函数
格式:(/数1数2…)
功能:该函数用第一个数除以后面所有的数。
例如:(/24 2 3.0) 返回4.0
(5)加1函数
格式:(1+数)
功能:该函数返回后面的数加1的结果。
例如:(1+-5.7) 返回-4.7
(6)减1函数
格式:(1- 数)
功能:该函数返回后面的数减1的结果。
例如:(1--6) 返回-7
(7)求绝对值函数
格式:(abs数)
功能:该函数返回数的绝对值。
例如:(abs-60)返回60
(8)求最大值函数
格式:(max数 数…)
功能:该函数返回后面数中的最大的数。
例如:(max-30.1 40.0 25.0) 返回40.0
(9)求最小值函数
格式:(min数 数…)
功能:该函数返回后面数中的最小的数。
例如:(min-150 200 130) 返回-150
(10)平方根函数
格式:(sqrt数)
功能:该函数返回数的平方根,该平方根为实数。
例如:(sqrt 36) 返回6
(11)乘方函数
格式:(expt数 数)
功能:该函数返回底数的幂次方。
例如:(expt 4.0 2) 返回16.0
(12)求e的任意次方函数
格式:(exp幂)
功能:该函数返回e的幂次方,其结果为实数。
例如:(exp 3.2) 返回24.532 5
(13)对数函数
格式:(log数)
功能:该函数返回数的自然对数,其结果为实数。
例如:(log 5.5) 返回1.704 75
(14)正弦函数
格式:(sin角度)
功能:该函数返回“角度”的正弦值,其中“角度”以弧度表示。
例如:(sin 1.0) 返回0.841 471
(15)余弦函数
格式:(cos角度)
功能:该函数返回“角度”的余弦值,其中“角度”以弧度表示。
例如:(cos 0.0) 返回1.0
(16)反正切函数(atan数1数2)
格式:(atan数1数2)
功能:若仅有数1,该函数返回其反正切值,单位为弧度。若有数1与数2,则该函数返回数1除以数2的反正切值。
例如:(atan 1.0 2.0) 返回0.463648
3)字符串处理与类型转换函数
(1)ASCII码转换函数
格式:(ascii字符串)
功能:该函数返回字符串中第一个字符的ASCII码。
例如:(ascii″G″) 返回71
(2)字符转换函数
格式:(chr整数)
功能:该函数将“整数”代表的ASCII码转换为字符。
例如:(chr 66) 返回″B″
(3)字符串连接函数
格式:(strcat字符串…)
功能:该函数将其后面的所有字符串连接在一起,并返回连接后的结果。
例如:(strcat″a″″bout″) 返回about
(4)字符串长度函数
格式:(strlen字符串…)
功能:该函数返回字符串的长度,其结果为整数。
例如:(strlen″about″) 返回5
(5)求子字符串函数
格式:(substr字符串 起点 长度)
功能:该函数返回字符串的一个子串,该子串从字符串中“起点”为止开始,连续取“长度”个字符。例如:(substr″about″2 1) 返回b
(6)字符串大小写函数
格式:(strcase字符串[方式])
功能:该函数根据第二个变元(方式)的要求把字符串的全部字母转换为大写字母或小写字母,并返回结果。若指定了“方式”且非空(NIL),则把所有字母转换为小写;否则转换为大写。
例如:(strcase″sample″T) 返回″sample″
(strcase″sample″) 返回″SAMPLE″
(7)整型变实型函数
格式:(float数)
功能:该函数将“数”转换为实型数,并返回结果。数可以是整型或实型的。
例如:(float6) 返回6.0
(8)实型变整型函数
格式:(fix数)
功能:该函数将“数”(实型或整型)转换为整型数,并返回结果。
例如:(fix 7.5) 返回7
(9)整型变字符串函数
格式:(itoa整型数)
功能:该函数将整型数转换为字符串,并返回结果。
例如:(itoa78) 返回″78″
(10)字符串变整型数函数
格式:(atoi字符串)
功能:该函数将字符串转换为整型数,并返回结果。
例如:(atoi″2015″) 返回2015
(11)字符串变实型数函数
格式:(atof字符串)
功能:该函数将字符串转换为实型数,并返回结果。
例如:(atof″2015″) 返回2015.0
(12)实型数计数制转换函数
格式:(rtos数 方式 精度)
功能:该函数对“数”按“方式”和“精度”的要求进行计数制的转换,并以字符串的形式返回。其中,“精度”表示小数点后的位数;“方式”则按如下约定:1为科学计数法,2为十进制,3为工程制(英寸与小数英寸),4为建筑制(英寸与分数英寸)。
例如::(rtos 18.4567 2 3) 返回″18.457″
(13)角度单位制转换函数
格式:(angtos角值 方式 精度)
功能:该函数将“角值”(实型数,单位为弧度)转换为其他单位制,并返回一个字符串。该字符串是根据“方式”和“精度”的要求,按AutoCAD的系统变量UNITMODE(单位模式)对“角值”进行处理所得到的。其中“精度”表示小数点后的位数;“方式”则按如下约定:0为度,1为度/分/秒,2为梯度,3为弧度等。
例如:(angtos 1.369 1 6) 返回″78d26′16.52″
(14)单位制转换函数
格式:(cvunit值 旧单位 新单位)
功能:该函数将“值”从一个计量单位转换到另一个,并返回转换后的值,要换算的数值或点表(二维或三维点)。其中,“旧单位”与“新单位”的名称可以是acad.unt文件中给出的任何单位格式,否则函数将返回NIL。
例如:(cvunit 1″m″″inch″) 返回39.3701
(cvunit′(1.0 2.5)″m″″in″) 返回(39.3701 98.4252);点表转换
(cvunit 1″minute″″second″ 返回60.0
(15)坐标系转换函数
格式:(trans点 旧坐标系 新坐标系)
功能:该函数将“点”从一个坐标系统转换到另一个坐标系统,并返回转换后的值。其中,“点”是包含其三个坐标值的一张表,“旧坐标系”是点所在的坐标系统,“新坐标系”是点所要转换到的那个坐标系统。这两个坐标系统均用代码表示,其约定为:0为WCS(世界坐标系),1为UCS(用户坐标系),2为DCS(显示坐标系)等。
例如,给定某一用户坐标系统(UCS),它相对世界坐标系统(WCS)中的之轴逆时针旋转90度,则有:
(trans′(1.0 2.0 3.0)0 1) 返回(2.0 1.0 3.0)
(trans′(1.0 2.0 3.0)1 0) 返回(2.0 1.0 3.0)
注意:该函数的第一个变元也可以是位移,表示新旧坐标系统的两个变元也可以用实体坐标系统(ESC)等其他方式表示。
4)表处理函数
(1)建立表的函数
格式:(list表达式…)
功能:该函数的变元个数不限,它将所有表达式的值组成一张表返回。
例如:(list′c′d) 返回(C D)
(list(+1 5)8) 返回(6 8)
(2)测表长函数
格式:(length表)
功能:该函数返回表的长度,即代表表中元素个数的一个整数。
例如:(length′(a b c e f)) 返回5
(3)连接表函数
格式:(append表1表2…)
功能:该函数要求其变元必须是表,它将各表联在一起,组成一个新表。
例如:(append′(a b)′(c d)) 返回(A B C D)
(4)取表中第一个元素函数
格式:(car表)
功能:该函数返回表中第一个元素。
例如:(car′(a b c)) 返回A
(5)取子表函数
格式:(cdr表)
功能:该函数返回一个表中除第一个元素以外的所有元素组成的新表。
例如:(cdr′(a b c)) 返回(b c)
(6)car与cdr组合而成的函数
格式:(C****R表);其中“****”四个字符可以是A或D
功能:该函数返回一个表中特定位置的元素。
car与cdr是取表中元素的基本函数,这两个函数可以组合起来使用,从而获得表中的其他元素。例如cadr。这种组合最多可达四级(层),即最多为六个字符,如caddar。AutoLISP执行这种组合函数时先从后面做起。
例如:(caddr′(1 2 3)) 返回3
也就是说,若L为一张表,则有:
(cadr′L)等价于(car(cdr L))
其余情况可依此类推。
(7)取表中最后一个元素函数
格式:(last表)
功能:该函数返回表中最后一个元素,表不能为空。
例如:(last′(a b c)) 返回C
(8)取表中第n个元素函数
格式:(nth n表)
功能:该函数返回表中第n个元素。n为表中要返回的元素的序号(第一个元素的序号为0)。
例如:(nth 3′(abcde)) 返回D
(9)向表的头部添加一个元素函数
格式:(cons《表达式1》《表达式2》)
功能:向表的头部添加一个元素,或构造一个点对函数。
命令行输入:(cons′A′(B C D))
显示:(A B C D) ;构成新表
命令行输入:(cons′(A B)′(C D))
显示:((A B)C D) ;构成新表
命令行输入:(CONS′5′8)
显示:(5·8) ;构成新点对
5)出错处理函数
在程序的编辑操作或者调用其他命令时,总是不可避免地出现一些错误,这时系统会给出提示信息以指示错误所在,这就是出错处理函数的作用。程序编辑与调试中采用的出错处理函数有Alert、*error*、exit(quit)等函数,它们的使用方法,现分别介绍如下:
(1)*error*函数
格式:(*error*字符串)
功能:该函数允许用户自己定义出错提示。
若该函数不为NIL时,每当AutoLISP产生错误,该函数将被自动执行。例如:
式中msq为错误信息说明,此函数和AutoLISP标准错误处理程序(error)一样,打印出error和说明。
(2)Alert函数
格式:(Alert string)
功能:显示一个警告框,其中显示一条出错或警告信息。
图5-3 AutoCAD错误提示框
例如(Alert″数据类型错误!\n请输入正确类型数据!″)
此行表达式在AutoCAD命令行运行后,将出现错误提示框,如图5-3所示。
(3)exit(quit)函数
格式:(exit)或(quit)
功能:强行使当前应用程序退出。
如果调用exit函数,它会返回错误信息quit/exit abort,并返回到AutoCAD的命令提示。
6)逻辑运算函数
AutoLISP的逻辑运算分为两种:一种是数值的逻辑运算,它将数值化成二进制数,然后按位进行逻辑运算,仍以数值为其结果(返回值)。另一种是根据函数的要求对后面的表达式进行测试,若满足要求,则函数返回T;不满足要求则返回NIL(逻辑假)。常用的有以下几种:
(1)等于函数
格式:(=原子 原子…)
功能:对多个原子进行逻辑判断,若满足要求,则函数返回T;不满足要求则返回NIL(逻辑假)。
原子可以是数或字符串。
例如:(=5 5.0) ;返回T
(=99 99 100) ;返回NIL
(=″me″″yuo″) ;返回NIL
(2)不等于函数
格式:(/=原子 原子)
功能:比较参数(原子)是否值不相等。
如果没有两个相邻的参数值相等则返回T;否则返回NIL。如果仅提供一个参数,函数返回T。
例如:(/=10 20 30) 返回T
(/=10 10 20 30) 返回NIL
(3)小于函数
格式:(<原子 原子…)
功能:比较参数(原子)大小。
若每个原子均小于其右面的原子,该函数返回T,否则返回NIL。
例如: (<10 20) 返回T
(<″b″″c″) 返回T
(<10 20 30 20) 返回NIL
(4)大于函数
格式:(>原子 原子…)
功能:比较参数(原子)大小。
若每个原子均大于其右面的原子,该函数返回T,否则返回NIL。
例如:
(5)相等测试函数
格式:(equal表达式1表达式2[fuzz])
功能:测试两个表达式的值是否相等。
该函数测试两个表达式的值是否相等,相等返回T,否则返回NIL。选项fuzz为实型数,是判断表达式1表达式2之间的最大允许误差。误差在此范围内时,仍然认为二者相等。
例如先给f1、f2、f3赋值,然后进行相等测试:
7)程序分支与循环函数
(1)条件函数
格式:(if条件 式1[式2])
功能:根据对条件的判断结果,对两个表达式求值。
该函数根据条件的真或假来执行后面的式1或式2。若条件为真(T),则执行式1;若条件为假(NIL),则执行式2。式2可以没有。若条件为NIL时,且无式2时,该函数返回NIL。例如:
(2)分支函数
功能:多条件、多处理结果函数。
cond是AutoLISP中最基本的条件函数,由它为核心构成的自定义函数可以实现循环、递归等功能。该函数以任意多个表为其变元。它依次检查每个表中的第一项(即条件),若查到某个表的条件为真,则执行该子表中后面的那些表达式,返回该组算式中最后一个的值。此时函数不再对剩余的子表中的条件进行测试。(www.daowen.com)
例如碎部点展点时,可以有三种方式,我们可以定义1代表按测点号展点;2代表按高程展点;3代表按测点和高程展点;这样分支函数根据1、2、3来判断采用哪一种方式展点,其部分代码如下:
(3)重复函数
格式:(repeat次数 式1式2…)
功能:函数按照“次数”的要求重复执行后面的所有表达式,并返回最后一个表达式的计算结果。例如,以下程序段可以计算1到100间所有整数之和:
将显示结果5 050。
(4)循环函数(While条件 式1式2…)
格式:(While条件 式1式2…)
功能:该函数先判断条件,若条件为真(T)则执行后面的所有表达式,然后再次判断其他条件。这样一直循环到条件为假(NIL)为止,然后返回最后一个表达式的最终计算结果。
例如,以下程序段亦可计算1到100间所有整数之和:
将显示结果5 050。
(5)求多个表达式值函数
格式:(progn式1式2…)
功能:该函数按顺序执行后面的每一个表达式,返回最后一个表达式的求值结果。在只能用一个表达式的地方,使用progn可以完成多个表达式的计算。
例如:if函数只允许有三个变元,要完成下列表达式运算时,系统提示:“错误:参数太多。”
但若采用progn函数,就能很好地解决这一问题,它把三个表达式组合起来,作为if函数的一个表达式来执行。
使用本函数可以在a等于b时同时进行三个表达式的计算。
8)自定义函数
(1)defun函数
格式:(defun符号 变元表 表达式…)
功能:允许用户定义新函数的功能。
其中“符号”为所要定义的函数的名称,将来用户在使用这一自己定义的函数时就用此名称调用。变元表被一个前后均有空格的斜杠符号“/”分成两个部分:(形参/局部变量)。前一部分为形参部分,在调用函数时接受参数传递而转换为实参;后一部分为局部变量,仅用于函数内部,不参与参数传递。需要说明的是:
①变元表可以是空格,此时在调用函数时无参数传递。
②变元表中的形参与局部变量均只在所定义的函数中起作用。甚至可以与某些外部变量同名,而不会对外部变量造成任何影响。
变元表后面的表达式部分是用户所定义的函数的内容,即在调用函数时的具体操作部分。defun函数以定义的函数名为其返回值。
例如:定义一个角度(度-分-秒)化弧度的函数。
式中B为形参,其值为(度-分-秒)制,如30°45′36″。实际输入时为30.4536,D、M、S、B10为局部变量,D表示整度数,M为分化算成的度(一般为小数),S为秒换算成的度(一般为小数),B10为总的角度(十进制)。
若将用defun函数定义用户函数的程序写acad.lsp文件,则在启动AutoCAD时该文件被自动调入内存,用户可直接使用所定义的函数,也可写入一个以lsp为扩展名的文件中,在使用时用load函数装入。使用时,按下式调用即可:
(2)用defun函数定义AutoCAD新命令
格式:(defun c:命令名()表达式…)
功能:定义AutoCAD新命令。
其中,“命令名”为所要定义的新命令的名称,其前面的“c:”必须有,命令名的后面必须带一个没有形参的变元表。
例如,下面定义的函数用来查询两点间边长和方位角。
;查询两点间边长和方位角
该函数调试通过后,SFWJ就成为AutoCAD的一个新命令。使用时和其他任何Auto-CAD命令一样,只需在AutoCAD的“command:”提示下键入该命令名SFWJ即可。
9)交互数据输入函数及相关的计算函数
(1)整型数输入函数
格式:(getint[提示])
功能:该函数等待用户输入一个整型数,并返回该整型数。提示部分可有可无。
例如:(setq num(getint))
(setq num(getint″Enter a number:″))
若输入非整数,如1.333,则系统提示“需要整数值.”,需要输入一个整型数。
(2)实型数输入函数
格式:(getreal[提示])
功能:该函数等待用户输入一个实型数并返回该实型数。它和getint的用法完全相同。
例如:(setq num(getreal))
(setq num(getreal“输入一个实数:”))
当输入5,返回5.0,此函数把整数与其等值的实数等同看待。
(3)字符串输入函数
格式:(getstring[cr][提示])
功能:该函数等待用户输入一个字符串,并返回该字符串(最大长度为132个字符)。
如果提供了cr且cr不为NIL,则输入的字符串中可以有空格,此时只有用回车来终止输入,否则可以用空格来终止输入。
例如:
(4)点输入函数
格式:(getpoint[基点][提示])
功能:该函数等待用户输入一个点。
用户可用键盘输入点的坐标或用光标选点的方式输入一个点。若有基点变元,则AutoCAD会从该点向当前的光标位置画一条可拖动的直线。
例如:
(5)距离输入函数
格式:(getdist[基点][提示])
功能:该函数等待用户输入一个距离值;或用光标输入两个点,函数将返回两点间的距离值。
若有基点变元,则只需再输入一个点,该点与基点间的距离就是输入的值。
例如:
(6)角度输入函数
格式:(getangle[基点][提示])
功能:该函数等待用户输入一个角度,并将该角度以弧度值返回。
Getangle函数在度量角度时,以变量ANGBASE设置的当前角度为零弧度,角度按逆时针方向增加。用户可用键盘输入一个数值来指定一个角度。也可用指定屏幕上两个点的方式来输入一个角度,此时两点间连线与零度基准线的夹角就是输入的角度。若指定了“基点”,则可用输入一个点的方式来获取角度。后两种方式中屏幕上都会出现拖动线,如“基点”坐标为(5,5),运行该函数时,光标和基点间有一条拖动线,如图5-4所示。
图5-4 光标和基点间的拖动线
(7)方位角输入函数
格式:(getorient[基点][提示])
功能:获取一个角度,角度的零度基准方向是水平向右的。
该函数与上面的函数非常类似,唯一不同的是getorient度量角度的零度基准方向是水平向右的。在需要知道相对角度(如点转过的角度)的情况下应使用getangle,而在需要知道绝对角度(如直线的方位)的情况下应用getorient。
实际使用时应输入角度或两点。例如:
(8)求方位角函数
格式:(angle点1点2)
功能:该函数返回UCS(用户坐标系)中两点连线的方位角。该角度从当前作图平面的X轴正向开始,按逆时针方向计算。返回值为弧度。
例如: (angle′(1.0 1.0)′(1.0 4.0)) 返回1.570796
(9)求两点间距离函数
格式:(distance点1点2)
功能:该函数返回两、三维点之间的距离。
例如: (distance′(1.0 2.5 3.0)′(7.0 2.5 3.0)) 返回6.000000
(10)求另一点坐标函数
格式:(polar点 角度 距离)
功能:该函数可以根据一个已知点求出另一个点,并返回所求的点。
其变元中,“点”是已知点,“角度”是另一点所在的方位,“距离”为两点间距离。
例如:
(11)求交点函数
格式:(inters点1点2点3点4[方式])
功能:该函数求两直线的交点,并返回其交点坐标。
其中,“点1”与“点2”为第一条直线的两个端点,“点3”与“点4”为第二条直线的两个端点,变元“方式”控制求交点的方式,即若此处有值且为NIL时,该函数允许交点在这两条线段的延长线上;若无方式变元或此变元不为NIL,则函数只求两线段内的交点。若无交点,函数返回NIL。
例如:
10)文件操作函数
(1)打开文件函数
格式:(Open文件名 读/写标志)
功能:该函数打开一个文件,以便AutoLISP的I/O函数进行存取。函数返回文件描述符。
式中“文件名”为一个字符串(含有扩展名)。“读/写标志”必须用小写的单个字母来表示:r表示读,w表示写,a表示向旧文件中读写的内容(该文件中应没有以CTRL/z表示的文件结束标记)。在w和a状态下,若磁盘上无此文件,则产生并打开一个新文件。
假设下例表达式中的文件都不存在,则有:
在文件名中含有路径时,要以反斜杠“/”代替“\”。
(2)关闭文件函数
格式:(close文件描述符)
功能:该函数关闭指定的文件,返回NIL。例如要关闭当前打开的文件,只需执行该函数即可。
例如:(close f) 返回NIL
(3)读函数
格式:(read字符串)
功能:该函数返回从“字符串”中取得的第一个表或原子。
例如:
(read″hello baby″) 返回HELLO
(4)读字符函数
格式:(read-char[文件描述符])
功能:该函数从键盘输入缓冲区或从“文件描述符”表示的打开文件中读入一个字符,并返回该字符的ASCII码值。
例如,假设键盘输入缓冲区为空,则:
(read-char)
将等待用户输入。若用户键入“hello”并回车,则返回104。
(5)读行函数
格式:(read-line[文件描述符])
功能:该函数类似于read-char,只是每次以字符串的形式读入一行,并返回该行(仍以字符串返回,而非ASCII码)。
在打开的文件中读入时,每读入一行,文件指针就指向下一行,则下一次调用read-line时,就可读入下一行。例如:
(6)写字符函数
格式:(write-char整数[文件描述符])
功能:该函数将一个字符写到屏幕上或写到由“文件描述符”表示的打开的文件中。
其中,″整数″,是要写字符的ASCII码,也是函数的返回值。
例如:
(write-char 65) 返回65
把大写字母A写在屏幕上。
(7)写行函数
格式:(write-line字符串[文件描述符])
功能:该函数将“字符串”写到屏幕上,或写到由“文件描述符”表示的打开的文件中。它返回一个字符串,写入文件时不带引号。例如,下式可将字符串″my Test data.″写入文件中:
(8)prin1函数
格式:(prin1[表达式[文件描述符]])
功能:该函数在命令行显示(或向文件写入)表达式的值。
例如,(setq A 666B′(A)) ;;//返回(A)
(prin1′A) ;;//打印A并返回A
(prin1A) ;;//打印666并返回666
(prin1B) ;;//打印(A)并返回(A)
使用该函数时应注意prinl中的“1”是数字1,不是小写字母“l”。
(9)princ函数
格式:(princ[表达式[文件描述符]])
功能:该函数功能和prin1基本相同,区别是它能实现“表达式”中控制字符的作用。
例如:
(10)print函数(print[表达式[文件描述符]])
格式:(print[表达式[文件描述符]])
功能:该函数除了在打印“表达式”之前先换行和在打印之后加印空格外,其他均和prin1相同。
例如:
11)调用AutoCAD命令函数
格式:(command AutoCAD命令 参数…)
功能:执行来自AutLISP的AutoCAD命令,返回NIL。
该函数其中第一个变元为AutoCAD命令,其后的参数变元作为对该命令相应的连续提示的响应。命令名和选择项作为字符串传递,点则作为实数构成的表传递。
例如下面的表达式可以完成圆的绘制,其圆心坐标为(5,5)、半径为10。
(command″circle″′(5 5)10″″);在(5,5)位置绘制半径为10的圆。
Command函数在使用中应注意以下几点:
①command函数的参数可以是字符串、实数、整数或点,但必须与要执行的命令所需的参数一致。一个空字符串″″等效于从键盘上输入一个空格,通常用于结束一个命令。
②调用(不加任何参数),即(command)形式,等效于在键盘上键入Ctrl+C,它取消AutoCAD的大多数命令。
③AutoCAD命令需要目标选择时,应提供一个包含entsel(实体选择)的表,而不是一个点来选择目标。
④dtext、sketch、plot、prplot等AutoCAD命令不能和AutoLISP的command函数一起使用。
⑤command函数具有暂停功能。
当该函数的变元中出现保留字PAUSE时,command函数将暂停,以便用户进行某些操作。完成这些操作后,command函数继续执行。例如:
依顺序执行circle命令,置圆心为(10,10),然后暂停,待用户输入半径数值后函数继续执行,从(15,15)到(27,25)画一条直线。
12)选择集函数
在Visual LISP中提供了一组对当前图形进行编辑操作的函数,通过它可以对图形数据库进行操作,达到实时编辑修改的目的。
(1)选择集构造函数
格式:(ssget[选择方法][点1][点2][点表][过滤表])
功能:根据选定对象创建选择集。
选择方法的可选参数较多,其含义和功能如表5-1所示。
表5-1 选择集构造函数选择方法参数表
过滤表是与选择方法配合使用的,根据过滤表的参数,对所选对象进行筛选,保留满足过滤表条件的对象。过滤表的参数是实体组代码,部分采用的实体组代码如表5-2所示。
表5-2 实体组代码表
调用该函数的几个基本应用例题如下:
;该表达式创建一个选择集,通过点(5 5)的图元被选中,并将返回的选择集的名字赋值给变量s1。
;该表达式创建一个选择集,点(5 5)和(25 25)定义窗口内的完整图元被选中,并将返回选择集的名字赋值给变量s2。
;该表达式以交互方式创建一个选择集,用户可以用多种选择方法进行多次选择,直至完成全部选择。同时返回选择集的名字赋值给变量s3。
;该表达式创建一个选择集,″X″参数代表对于整个数据库对象选择,((0.″CIRCLE″)(62.1))是过滤表,选择集的对象是所有红色的圆。如果选择成功,同时返回选择集的名字赋值给变量s4。
(2)选择集操作函数
格式:(sslength[选择方法][点1][点2][点表][过滤表])
功能:求出一个选择集中的对象(图元)数目,并将其作为一个整数返回。
例如向新的选择集中添加最后一个对象:
命令行输入:(setq sset(ssget″L″))
显示:〈selection set:3〉;选择集创建成功
使用sslength确定新选择集中对象的数目:
命令行输入:(sslength sset)
显示:1;返回sset选择集中的对象(图元)数目,此时为1。
(3)实体名检索函数
格式:(ssname〈选择集〉〈序号〉)
功能:返回选择集中由序号指定的那个对象(图元)的图元名。
例题,获取选择集中第三个图元的名称:
命令行输入:(setq ent3(ssname sset 2))
显示:〈图元名:7ee7e9b8〉 ;选择集中的实体序号为0,1,2,3,…,n-1,(总数为n)
(4)加入新实体函数
格式:(ssadd〈实体名〉〈选择集〉)
功能:将对象(图元)加入到选择集中,或创建新的选择集。
例题,下面的命令将ent1图元添加到ss1选择集中:
命令行输入:(ssadd ent1ss1)
显示:〈selection set:2〉
(5)撤消对象函数
格式:(ssdel〈实体名〉〈选择集〉)
功能:从选择集中撤消对象(图元)。
例题,图元ent1是选择集ss1的成员而图元ent3不是ss1的成员:
命令行输入:(ssdel ent1ss1)
显示:〈selection set:2〉 ;返回删除图元ent1后的选择集ss1
命令行输入:(ssdel ent3ss1)
显示:nil ;ent3不是选择集ss1的成员,所以函数返回nil
13)其他函数
(1)ObjectARX应用程序操作函数
常用的该类函数有(arx)、(arxload)、(arxunload)三个,其使用方法如下:
格式:(arx)
功能:返回当前已加载的ObjectARX应用程序名表。
例如在AutoCAD命令行输入(ARX),则显示当前系统已经加载的ObjectARX应用程序,其形式如下:
(2)加载ObjectARX应用程序
格式:(arxload application[onfailure])
功能:加载ObjectARX应用程序。
Application项是用双引号引起来的字符串,可以省略文件名中的后缀.arx。若该文件不在AutoCAD支持文件搜索路径中须提供ObjectARX可执行文件的全路径名。Onfailure项是加载失败时要执行的表达式。
例题,若需要加载Cass9.arx应用程序,操作步骤如下:
命令行输入:(arxload″cass9.arx″)
(3)卸载ObjectARX应用程序
格式:(arxunload application[onfailure])
功能:卸载ObjectARX应用程序。
application参数项用双引号引起来的字符串或包含已用arxload函数加载的可执行文件名的变量。可以省略文件名中的.arx后缀和路径。onfailure卸载失败时要执行的表达式。
例题,若需要卸载Cass9.arx应用程序,操作步骤如下:
命令行输入:(arxunload″cass9.arx″)
显示:″cass9.arx″ ;该程序卸载成功
(4)启动windows应用程序函数
格式:(startapp appcmd[file])
功能:启动windows应用程序。
Appcmd参数项为字符串,指定要执行的应用程序描述字串。如果appcmd没有包含全路径名,startapp将按照环境变量PATH设置的路径来搜索该应用程序。file参数项字符串,指定要打开的文件的名称。如果成功则返回大于0的整数,否则返回nil。
例题,要启动windows应用程序″notepad.exe″,同时打开″my data.txt″进行编辑,操作步骤如下:
命令行输入:(startapp″notepad.exe″″\″my data.txt\″″)
显示:33;返回大于0的整数,该程序启动成功。如图5-5所示。
有关Visual LISP扩展函数、ActiveX函数、反应器函数的使用方法,可以参考相应的Visual LISP开发资料与书籍。
图5-5 启动windows应用程序
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。