1、;调用调用AutoCADAutoCAD命令画圆命令画圆(defun C:HY()(defun C:HY()(setq P0(getpoint (setq P0(getpoint 第一圆心坐标第一圆心坐标:):)(setq R(getreal (setq R(getreal半径半径:):)(setq L(getreal (setq L(getreal圆心间距离圆心间距离:):)(setq a 1)(setq a 1)(setq n(getintn (setq n(getintn圆的个数圆的个数:):)(while(=a n)(while(=a n)(command circle P0 R)(co
2、mmand circle P0 R)(setq P0(polar P0 0 L)(setq P0(polar P0 0 L)(setq a(1+a)(setq a(1+a);在屏幕上显示在屏幕上显示 ASCIIASCII码为(码为(65659090)的字符)的字符(defun C:zm(/as);(defun C:zm(/as);自定义命令自定义命令 (setq as 65 n 100)(setq as 65 n 100)(while(=as 90)(while(=as 90)(command text(list n 100)15 (chr as)(command text(list n 10
3、0)15 (chr as)(setq as(+as 1)n(+n 20)(setq as(+as 1)n(+n 20)1.求a,b,c三个数的平方和。2.根据前后视读数,求两点间高差。3.求闭合水准线路的高差闭合差。参考答案1:(setq a(getreal输入第一个数a:)(setq b(getreal输入第二个数b:)(setq c(getreal输入第三个数c:)(setq s(+(*a a)(*b b)(*c c)参考答案2:(setq a(getreal输入后视读数a:)(setq b(getreal输入前视读数b:)(setq h(-a b)参考答案3:(setq n(getint
4、 输入高差个数:)(setq fh 0.0)(repeat n (setq h(getrealn依次输入高差:)(setq fh(+fh h)1.绝对值(abs)、平方根(sqrt)、正弦(sin)、余弦(cos)、反正切(atan)以上函数格式:(函数名 )2.幂函数(expt)、(exp)格式:(expt 底数 幂)格式:(exp 底数 )注意:以上各函数返回的数值类型。3.举例viLHHABsinsincosSSyx举例:用AutoLISP表示下列公式:(1)计算三角高程的表达式 (2)计算坐标增量的表达式(3)将度化成弧度单位参考答案参考答案:(1)(setq HA(getreal 输
5、入HA:)(setq L(getreal 输入L:)(setq AF(getreal 输入AF:)(setq i(getreal 输入i:)(setq v(getreal 输入v:)(setq HB1(+HA(-i v)(setq HB2(*L(sin af)(setq HB(+HB1 HB2)参考答案:(3)(setq af(getreal“输入af:”);af是整度数 (setq af(/180(*pi af)v如何将度分秒化成弧度?赋值函数有两个:setq和set1.setq1.setq 格式:(setq 变量1 表达式1 变量2 表达式2)赋给变量的值可以是任何表达式(数值、字符串、字
6、母)。注意:不要用AutoLISP的函数名和常数当作变量。举例:(1)(setq a 32 b 33.26 c yes)(2)(setq a(sin(/pi 4)(3)(setq x 34.3 y 5.23 p(list x y)(4)(setq pt(getpointn输入一点:)2.set2.set与setq不同之处,是set为符号赋值,setq为变量赋值。如:(set a 9)结果a为9 此函数非常有用,和其它函数配合使用,可以得到一维数组。举例:(1)(set(read(getstringn输入点 名:)(getpointn输入点坐标:)(2)(set(read(getstringn输
7、入变量 名:)(getrealn输入变量值:)四、字符串处理函数四、字符串处理函数1.strcat格式:(strcat 串1 串2.)把“串1”、“串2”、等连成一个新的字符串。如:(strcat a bout)返回 about(strcat a b c)返回 abc(strcat a c)返回 ac“2.strlen格式:(strcat 字符串)此函数求“字符串”长度。如:(strlen one two three)返回11 3.substr格式:(substr 字符串 起点 长度)此函数将返回“字符串”的子字符串。子串的起始位置是以“起点”确定,子串长度由“长度”指定。如果“长度”没有设定
8、,则子串将从“起点”到最后。“起点”和“长度”均须为正整型数。如:(substr abcde 2)返回 bcde(substr abcde 3 2)返回 cd0YP 1XP 2七、表处理函数七、表处理函数1.list函数2.car函数 格式:(car 表)返回一个列表中的第一个元素的数值(X元素)。如果该列表中没有任何元素,则返回空值nil。3.cadr函数 返回一个列表的第二个元素(Y元素)。4.last函数 返回一个列表的最后一个元素。5.(nth 表)返回表中第n个元素(n从0算起)。1.(setq p(getpoint“n输入一点:”)(setq x(car p)y(cadr p)举例
9、:举例:2.(setq p(GPS1 3456.786 23415.674 34.567)(setq dh(car p)x(cadr p)y(nth 2 p)z(last p)八、八、CommandCommand函数函数 Command函数是AutoLISP中唯一调用AutoCAD命令实现绘图的途径,非常重要。1.作用:使用Command函数(唯一)可调用AutoCAD命令。2.格式:(Command“AutoCAD命令及其选项”)如:(setq p1(100.453 100.567)p2(200.254 201.587)(command line p1 p2)3.注意事项(1)Command
10、函数不能调用AutoLISP的输入函数,如getpoint、getangle、getstring、getint等。(2)AutoCAD命令名称和选项必需放在双引号中,并要求双引号中不能有空格。(3)不 带“A u t o C A D 命 令 及 其 选 项”,即(command),等效ESC键(中止)。(4)几个命令和数据可以写在一个command函数中,也可分开写在两个或两个以上的command函数中。如:(Command“line”p1 p2 p3 p4 “”)和(Command“Pline”p1 p2)(Command p3 p4“”)等效。(5)文字注记时,字符串也要用“”括起来。如:
11、(Command“Text”(100 100)5“”“AutoLISP”)(6)调用对话框命令时,不显示对话框,以提示方式执行。如:新建“控制点”图层,设置图层为红色。(command layer m 控制点 c 1)举例:画一个边长为L,中心点坐标为P的正三角形,要求底边水平。(setq L(getrealn输入边长:)(setq P(getpointn输入中心:)(setq r(*0.288675134 L);求内切圆半径12r*r=L*L(command polygon 3 P c R)3.3 3.3 自定义命令和自定义函数自定义命令和自定义函数 一、自定义函数(一、自定义函数(defu
12、ndefun)用函数(defun)可以定义用户自己的函数,叫自定义函数。自定义函数象AutoLISP函数一样可以被调用,比如说,把常用的符号定义成自定义函数,实际用时,带入具体参数就可以得到图形,不别再绘制。1.1.自定义函数格式自定义函数格式(defun(defun 函数名函数名 变元表变元表 表达式表达式1 1表达式表达式2 2)例:用自定义函数方式编写例:用自定义函数方式编写一个程序,绘制正三角形。一个程序,绘制正三角形。(defun sjx()(defun sjx()(setq L(getrealn(setq L(getrealn输入输入边长边长:):)(setq P(getpoint
13、n(setq P(getpointn输入输入中心中心:):)(setq r(setq r(*0.288675134 0.288675134 L);L);求内切圆半径求内切圆半径12r12r*r=Lr=L*L L(command polygon 3 P(command polygon 3 P c R)c R)2.2.注意注意(1)函数名是用户自己设定的,不能与AutoLISP内部函数名、变量名相同;(2)变元表的形式有四种:v(参数1 参数2),如上例。变元表为此形式 时,调用要带参数。v(),无参形式。调用时不带参数。v(参数1 参数2/局部变量1 局部变量2)。变元表为此形式时,调用要带参数
14、。v(/局部变量1 局部变量2)。调用时不带参数。q/与参数、局部变量之间必须有空格。(3)表达式是函数的定义体,完成计算和绘图。(4)自定义函数的作用:defun函数用于在AutoLISP程序中定义一个函数。它就象其它标准函数一样,可以为我所用。使用时,通过不同的参数,可以绘制不同的图形。调用自定义函数举例:;度化弧度自定义函数(defun hd(af)(setq hhd(/(*af pi)180)(defun hsjx()(defun hsjx()(setq L(getreal n (setq L(getreal n输入边长输入边长:):)(setq P(getpoint n (setq
15、P(getpoint n输入中心输入中心:):)(setq r(setq r(*0.288675134 L)0.288675134 L);求内切圆半径求内切圆半径 (setq p1(polar P(hd 210)(setq p1(polar P(hd 210)(*2 r)2 r);调用自定义函数调用自定义函数 (setq p2(polar p1(hd 0)L)(setq p2(polar p1(hd 0)L);调用自定义函数调用自定义函数 (setq p3(polar p1(hd 60)L)(setq p3(polar p1(hd 60)L);调用自定义函数调用自定义函数 (command l
16、ine p1 p2 p3 c)(command line p1 p2 p3 c)PP1P2P3二、自定义命令二、自定义命令 自定义命令的作用是用defun函数为AutoCAD增加各种新命令。1.1.格式格式(defun C:(defun C:()()1 2)或或(defun C:(defun C:(/(/)2)1 2)2.注意事项(1)自定义命令格式中是命令名称;必须有C:(大小写等效);与C:之间不能有空格。(2)不能和内部或外部函数名相同;也不能和其它命令同名。(3)注意与自定函数的区别。3.自定义命令调用加载(load)程序后,在命令行上输入自定义命令名。例.编写计算三角高程的AutoL
17、ISP程序。程序清单如下:;计算三角高程(defun c:sjgc()(hd);调用自定义函数hd (setq L(getreal”n斜边边长:”)(setq i(getreal”n仪器高:”)(setq v(getreal”n觇标高:”)(setq h1(*L (sin ard)(setq h2(-i v)(setq h(+h1 h2);把度分秒化成弧度把度分秒化成弧度(defun hd()(defun hd()(setq a(getstring nA:)(setq a(getstring nA:);输入角度(按输入角度(按6.36286.3628形式输入)形式输入)(cond(cond (
18、=(strlen a)6)(=(strlen a)6)(setq ad(substr a 1 1)(setq ad(substr a 1 1)(setq am(substr a 3 2)(setq am(substr a 3 2)(setq as(substr a 5 2)(setq as(substr a 5 2)(=(strlen a)7)(=(strlen a)7)(setq ad(substr a 1 2)(setq ad(substr a 1 2)(setq am(substr a 4 2)(setq am(substr a 4 2)(setq as(substr a 6 2)(se
19、tq as(substr a 6 2)(=(strlen a)8)(=(strlen a)8)(setq ad(substr a 1 3)(setq ad(substr a 1 3)(setq am(substr a 5 2)(setq am(substr a 5 2)(setq as(substr a 7 2)(setq as(substr a 7 2)(setq a1(atof ad)(setq a1(atof ad)(setq a2(atof am)(setq a2(atof am)(setq a3(atof as)(setq a3(atof as)(setq ar(+a1(/a2 60
20、)(setq ar(+a1(/a2 60)(/a3 3600)(/a3 3600)(setq ard(/(setq ard(/(*ar pi)ar pi)180)180)(princ ard)(princ ard)(princ)(princ)3.4 3.4 程序结构函数程序结构函数 程序结构函数用于控制程序的进程,把它叫程序结构函数。包括:关系函数、逻辑函数、谓词函数、条件函数、循环函数。一、关系函数一、关系函数 1.1.等于等于 格式:(=atom1 atom2.)等于函数(=)判断数是否相等。如果相等则条件为真,返回值为T(真值)。同样,如果不相等,则条件为假,返回值为nil(假值)。2.
21、不等于 格式:(/=atom1 atom2.)不等于函数(/=)判断数是否不相等。如果不相等,则条件为真,返回值为T。3.小于 格式:(atom1 atom2.)小于函数()判断前一个数(atom1)是否小于后面的作数(atom2),如果小于,则条件为真,返回值为T,否则返回nil。4.小于等于 格式:(=atom1 atom2.)小于等于函数(atom1 atom2.)大于函数判断第一个数是否大于第二个数,如果大于,则条件为真,返回值为T,否则返回nil。6.大于等于 格式:(=atom1 atom2.)二、逻辑函数二、逻辑函数 1.逻辑“与”格式:(and 表达式1)这个函数求出表达式之间
22、的“与”运算值,即当所有表达式值同时为T时,函数结果为T,如果其中任何一个表达式值为nil,函数结果为nil。例如:(setq a 10 b 20)(and(a 5)(b 5)(b 15)结果为nil 2.逻辑“或”格式:(or 表达式1)这个函数求出表达式之间的“或”运算值,即当所有表达式值同时为nil时,函数结果为nil,如果其中任何一个表达式值为T,函数结果为T。例如:(setq a 10 b 20)(or(a 15)结果为nil(or(b 15)结果为T 3.逻辑“非”格式:(not 数或表达式)这个函数求出表达式之间的“非”运算值,即当“数或表达式”值为nil时,函数结果为T,否则函
23、数结果为NIL。例如:(setq a 10 b 20 c nil)(not a)结果为nil(not c)结果为T(not(or(a 15)结果为T(not(or(b 15)结果为nil三、数据谓词函数和等值谓词函数三、数据谓词函数和等值谓词函数(自学自学)四、条件函数和顺序处理函数四、条件函数和顺序处理函数 1.If1.If函数函数 格式:格式:(If (If 1 2 )if流程图式1式2nil测试式T举例:举例:(1 1)(If(=1 3)“YES”“NO”)(If(=1 3)“YES”“NO”)结果为结果为“NO”NO”(2 2)(setq a 15)(setq a 15)(If(and
24、(=a 10)(=a 10)(=a 18)(setq d 3)(setq d 3)(setq c 10)(setq c 10)结果结果D D为为3 3。2.cond函数格式:(cond )是逻辑表达式,为一个或多个表达式。执行过程见图。cond流程图TTT测试式nnil测试式2测试式1nil结果n结果2结果1举例:(setq d 0.3)(cond (and(=d 0.2)(=d 0.5)(=d 1.0)(setq c 9.0)(d 0.6)(setq c 9.0)运行结果为C=10。3.progn函数progn函数通常和If函数一道用,来控制计算顺序。格式:(prong 表达式1)举例:举例
25、:(setq a 15 b 15.0)(setq a 15 b 15.0)(if(=a b)if(=a b)(princ“(princ“大家好大家好!”)!”)(setq a(+a 1)(setq a(+a 1)b(+b 1)b(+b 1)运行结果是:大家好运行结果是:大家好!a=15a=15,b=15.0b=15.0(setq a 15 b 15.0)(setq a 15 b 15.0)(if(=a b)if(=a b)(prognprogn (princ“(princ“大家好大家好!”)!”)(setq a(+a 1)(setq a(+a 1)b(+b 1)b(+b 1)运 行 结 果 是
26、:大 家 好运 行 结 果 是:大 家 好!a=16a=16,b=16.0b=16.0五、循环函数五、循环函数 有两个循环函数:repeat、while。1.Repeat函数 格式:(Repeat 数 表达式1)数:必须是正整数。表达式:是循环体,循环次数由数来决定。最后返回表达式的值。举例:(setq a 10 b 100)(repeat 4(setq a(+a 10)(setq b(+b 100)2.while函数 格式:(while 表达式1)while函数执行过程循环体外的表达式循环体nil测试式T 执行过程:先计算,若为T,则计算后面若干个表达式(循环体);若为NIL,则退出循环体。
27、举例:按要求画下列图形。P0L(defun C:HY()(setq P0(getpoint 圆心1:)(setq R(getreal半径:)(setq L(getreal间距:)(setq a 1)(while(=a 4)(command circle P0 R)(setq P0(polar P0 0 L)(setq a(1+a)如果要绘制圆如果要绘制圆心的连线与心的连线与x x轴有一夹角轴有一夹角a a,则程序如何编?则程序如何编?3.5 3.5 交互输入函数交互输入函数 getpoint、getint、getreal、getstring、getangle、getdist v(getangle “提示内容”)getangle函数等待用户输入角度。若用户输入一个数,则得到由该数代表的角度值转化为的弧度值。若输入一点,系统提示输入第二点,其结果得到由第一点到第二点构成的向量与X轴正向夹角,单位是弧度。3.63.6系统变量、文件操作和实体访问函数系统变量、文件操作和实体访问函数 一、系统变量函数一、系统变量函数 AutoLISPAutoLISP有两个系统变量函数,用于改变有两个系统变量函数,用于改变(setvar)(setvar)或得到或得到(getvar)(getvar)系统变量的值。系统变量的值。二、文件操作函数二、文件操作函数 三、实体访问函数三、实体访问函数 1234