AutoLISP绘图程序设计课件_第1页
AutoLISP绘图程序设计课件_第2页
AutoLISP绘图程序设计课件_第3页
AutoLISP绘图程序设计课件_第4页
AutoLISP绘图程序设计课件_第5页
已阅读5页,还剩165页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第三章AutoLISP绘图程序设计

主要内容1.AutoLISP特点2.AutoLISP函数的用法3.AutoLISP程序结构4.AutoLISP程序执行方式12/19/20221第三章AutoLISP绘图程序设计主要内容12/12/§3.1AutoLISP概述

一、AutoLISP介绍

1.AutoLISP的作用(1)AutoLISP是一种表语言,是常用的AutoCAD二次开发手段。

所谓二次开发:是指以AutoCAD软件为平台,加入自己所需要的功能。开发过程,就是编程的过程。二次开发所支持的语言有VB、C++,大型的二次开发,以C++为主,而小型二次开发,一般以AutoLISP为主。12/19/20222§3.1AutoLISP概述一、AutoLISP介绍12(2)必须在AutoCAD环境下运行(内嵌);(3)AutoLISP可以编写程序,调用AutoCAD的许多命令;举例:在水平方向画n个大小相等的圆。;;调用AutoCAD命令画圆(defunC:HY()(setqP0(getpoint"第一圆心坐标:"))(setqR(getreal"半径:"))(setqL(getreal"圆心间距离:"))(setqa1)(setqn(getint"\n圆的个数:"))(while(<=an)(command"circle"P0R)(setqP0(polarP00L))(setqa(1+a))))12/19/20223(2)必须在AutoCAD环境下运行(内嵌);;;调用Aut(4)AutoLISP语言中使用大量的函数(有200多个函数),进行各种运算;(5)AutoLISP编写的程序特点(学习中注意):以表形式描述数据处理过程,程序执行过程就是函数求值过程;每段程序都是一个函数;具有交互处理功能,边解释边执行;采用模块化设计方法。12/19/20224(4)AutoLISP语言中使用大量的函数(有200多个函数2.AutoLISP的数据类型

(1)整型数(INT):是由0、1、2…9、+、-组成的。(2)实型数(REAL):如0.4(0不能少)、-1.23、0.526E9(0.526×109)。(3)符号(SYM):除(、)、*、‘、”、;之外的字符序列,并且不能全部是数字。符号常用着变量,如:Command:(setqX12);整型数Command:(setqX12.0);实型数Command:(setqX“12”);字符串12/19/202252.AutoLISP的数据类型(1)整型数(INT):是由(4)字符串(STR):如:“ABC”、“abc”、“457”等。(5)表(LIST):带有一对括号、有若干元素组成。(元素1元素2…元素n)如:(24f)

元素的个数叫表的长度。

元素也可以是表,如(45(36)7),这叫嵌套。

元素之间必须用“空格”隔开。

表的定义方式:(LIST56);’(56);还可以用defun定义(后面讲)。

12/19/20226(4)字符串(STR):如:“ABC”、“abc”、“457例:(setqP(list12.36-26.58))结果是:(12.36-26.58)例:(setqP'(12.36-26.58))结果是:(12.36-26.58)提示:(1)表的嵌套时一定要注意括号“(”、“)”匹配。(2)西文状态下输入!!!12/19/20227例:(setqP(list12.36-26.58))(6)文件描述符(7)AutoLISP内部函数(8)AutoCAD的选择集(9)AutoCAD的实体名上述数据类型中,前四种称原子,原子包括数值原子(整型数、实型数),符号原子和字符串原子。AutoLISP基本数据类型是原子和表,重点介绍前五种数据类型。12/19/20228(6)文件描述符12/12/20228二、几个基本概念1.常数PI——数学中的π(3.1415929…)T——逻辑真,即成立。NIL——逻辑假,即不成立。还代表空,即无值。

注意:(1)大小写等效;(2)它们不能作为变量。2.原子是程序处理中最小的数据单元。3.表达式原子和表的统称。如:(setqP'(12.36-26.58))12/19/20229二、几个基本概念12/12/202294.点是表的一种形式,也叫点表。有三种获得点的方式:(1)用'表示'(120.35253.24)(2)list函数定义点(setqX12.36Y-26.58)(setqM(listXY))结果是:M=(12.36-26.58)(setqM'(XY))结果是:(XY)(3)由getpoint函数得到点其格式:(getpoint“\n输入一点:”)

12/19/2022104.点12/12/202210三、AutoLISP程序结构1.举例例(1)

;;在屏幕上显示ASCII码为(65-90)的字符(defunC:zm(/as);自定义命令(setqas65n100)(while(<=as90)(command"text"(listn100)15""(chras))(setqas(+as1)n(+n20))))12/19/202211三、AutoLISP程序结构12/12/202211例(2);;绘制正多边形程序(defunc:dbx()(setqn(getint"\n输入多边形边数:"))(setqL(getreal"\n输入多边形边长:"))(setqP1(getpoint"\n输入多边形第一个角点坐标:"))(setqP2(polarP10L))(command"polygon"n"e"p1p2))12/19/202212例(2)12/12/202212例(3)(defunyuan();;画圆函数(setqr(getreal"\n半径:"))(setqp(getpoint"\n圆心:"))(command"circle"pr))12/19/202213例(3)12/12/202213例(4)(defunld()(setqp1(getpoint"\np1:")p2(getpoint"\np2:"));;;输入两点(setqd(distancep1p2));求距离(setqang(anglep1p2));求方位角(printd)(printang)(command"line"p1p2"");画直线)12/19/202214例(4)12/12/2022142.结构

(1)注释行以;开始,可在程序头或句尾,增加程序可读性。也可以不要。(2)除字符串外,字母大小写等效。(3)表与表之间可以有空格,也可没有,建议有,这样清楚。如:(distance'(34)'(5632))或(distance'(34)'(5632))(4)函数名后至少要有一个空格,函数名与表之间可有可无。12/19/2022152.结构12/12/2022153.特点

(1)所谓语句都是以表形式出现。(2)一切成分都是以函数的形式给出。(3)程序执行过程就是求函数值的过程。四、AutoLISP程序执行方式有三种方式:行方式、源文件方式、编译文件方式。1.行方式就是在AutoCAD的“command:”提示符下,输入表后回车。如:command:(+156.3)↙command:(setqa10)(setqb(+a5))↙

12/19/2022163.特点12/12/2022162.源文件方式用写字板或记事本把AutoLISP程序保存起来(后缀为.LSP)。然后用“LOAD”命令装载并调用。例如:(1)把下列程序保存到“e:\zm.lsp”;;在屏幕上显示ASCII码为(65-90)的字符(defunC:zm(/as);自定义命令(setqas65n100)(while(<=as90)(command"text"(listn100)15""(chras))(setqas(+as1)n(+n20))))12/19/2022172.源文件方式;;在屏幕上显示ASCII码为(65-90)

(2)用“load”装载即在命令行上输入(load“e:\zm.lsp”)(3)在命令行上输入zm3.编译文件方式(重点掌握)(1)VisualLISP的启动、界面和退出(2)VisualLISP控制台(3)VisualLISP创建LISP程序(4)VisualLISP中运行LISP程序提示:建议在VisualLISP中创建和运行LISP程序举例:12/19/202218(2)用“load”装载12/12/202218§3.2基本函数一、算数运算函数

1.加运算格式:(+num1num2num3...)

Command:(+25)返回:7Command:(+2.030.04.050.0)返回:86.0Command:(+230450.0)返回:86.0注意:“+”与“num1”及各数之间必须要有空格,后面的函数格式都是如此。12/19/202219§3.2基本函数一、算数运算函数12/12/2022192.减运算格式:(-num1num2num3...)“减”函数(-)从第一个数中减去后面所有数的和,即[num1-(num2+num3+...)]。如:Command:(-2814)返回:14Command:(-25711)返回:7Command:(-502010.0)返回:20.0Command:(-20.030.0)返回:-10.012/19/2022202.减运算12/12/202220

3.乘运算格式:(*num1num2num3...)

4.除运算格式:(/num1num2num3...)“除”函数以第一个数除以其他所有运算数的积,即[num1/(num2*num3*...)]。例如:(*2532.0)返回:60.0(*253)返回:30(/32)(Setqa(/3.02))返回:1.512/19/2022213.乘运算12/12/2022215.增量格式:(1+number)注意:1和“+”之间不能空格,+与number之间必须要空格。6.减量格式:(1-number)注意:1和“-”之间不能空格,-与number之间必须要空格。例如:(setqb(1+-12.5))(setqc(1--16.4))12/19/2022225.增量12/12/202222举例:1.求a,b,c三个数的平方和。2.根据前后视读数,求两点间高差。3.求闭合水准线路的高差闭合差。12/19/202223举例:1.求a,b,c三个数的平方和。12/12/20222参考答案1:(setqa(getreal"输入第一个数a:"))(setqb(getreal"输入第二个数b:"))(setqc(getreal"输入第三个数c:"))(setqs(+(*aa)(*bb)(*cc)))参考答案2:(setqa(getreal"输入后视读数a:"))(setqb(getreal"输入前视读数b:"))(setqh(-ab))12/19/202224参考答案1:参考答案2:12/12/202224参考答案3:(setqn(getint"输入高差个数:"))(setqfh0.0)(repeatn(setqh(getreal"\n依次输入高差:"))(setqfh(+fhh)))12/19/202225参考答案3:12/12/202225二、标准函数

1.绝对值(abs)、平方根(sqrt)、正弦(sin)、余弦(cos)、反正切(atan)

以上函数格式:(函数名<数或表达式>)2.幂函数(expt)、(exp)格式:(expt底数幂)格式:(exp底数<数或表达式>)

注意:以上各函数返回的数值类型。3.举例12/19/202226二、标准函数1.绝对值(abs)、平方根(sqrt)、举例:用AutoLISP表示下列公式:(1)计算三角高程的表达式

(2)计算坐标增量的表达式(3)将度化成弧度单位12/19/202227举例:用AutoLISP表示下列公式:(1)计算三角高程的表参考答案:(1)(setqHA(getreal"输入HA:"))(setqL(getreal"输入L:"))(setqAF(getreal"输入AF:"))(setqi(getreal"输入i:"))(setqv(getreal"输入v:"))(setqHB1(+HA(-iv)))(setqHB2(*L(sinaf)))(setqHB(+HB1HB2))12/19/202228参考答案:12/12/202228参考答案:(3)(setqaf(getreal“输入af:”));af是整度数(setqaf(/180(*piaf)))如何将度分秒化成弧度?12/19/202229参考答案:12/12/202229三、赋值函数

赋值函数有两个:setq和set1.setq

格式:(setq变量1表达式1变量2表达式2…)赋给变量的值可以是任何表达式(数值、字符串、字母)。注意:不要用AutoLISP的函数名和常数当作变量。举例:(1)(setqa32b33.26c"yes")(2)(setqa(sin(/pi4)))(3)(setqx34.3y5.23p(listxy))(4)(setqpt(getpoint"\n输入一点:"))12/19/202230三、赋值函数赋值函数有两个:setq和set12/12/22.set与setq不同之处,是set为符号赋值,setq为变量赋值。如:(set‘a9)结果a为9此函数非常有用,和其它函数配合使用,可以得到一维数组。举例:(1)(set(read(getstring"\n输入点名:"))(getpoint"\n输入点坐标:"))(2)(set(read(getstring"\n输入变量名:"))(getreal"\n输入变量值:"))12/19/2022312.set12/12/202231四、字符串处理函数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

12/19/202232四、字符串处理函数12/12/2022323.substr格式:(substr字符串起点长度)此函数将返回“字符串”的子字符串。子串的起始位置是以“起点”确定,子串长度由“长度”指定。如果“长度”没有设定,则子串将从“起点”到最后。“起点”和“长度”均须为正整型数。如:(substr"abcde"2)返回"bcde"(substr"abcde"32)返回"cd"12/19/2022333.substr12/12/202233五、类型转换函数1.fix格式:(fixnumber)此函数将number变为整型数。如果number是实型数,则舍去小数部分。如:(fix3)返回3(fix3.7)返回312/19/202234五、类型转换函数12/12/2022342.float格式:(floatnumber)此函数将number变为实型数。如:(float3)返回3.0(float3.75)返回3.753.atoi格式:(atoi字符串)此函数可用来将字符串转换成整型数。如:(atoi"97")返回9712/19/2022352.float12/12/2022354.atof格式:(atof字符串)此函数可用来将字符串转换成实型数。如:(atof"67.9")返回67.9(atof“97”)返回97.05.itoa格式:(itoa整型数)此函数将整型数转换成字符串。如:(itoa56)返回“56”12/19/2022364.atof12/12/2022366.rtosrtos函数将按给定的方式和精度把数转换为字符串。格式:(rtos数方式精度)方式:有五种,其代码分别是1、2、3、4、5(只要掌握2)。精度:是制小数位数。例如:(setqA(rtos5.7892524))返回"5.7893"(setqA(rtos45.2321))返回"45.2"12/19/2022376.rtos12/12/2022377.(angtos角度[模式[精度]])把弧度转换为度(取整度)注意:(1)角度以弧度表示;(2)模式是0~4的整数;(0十进制;1度分秒;2梯度;3弧度;4测量单位)(3)精度是一整数,表示十进制数小数位;(4)角度为负时,angtos自动将其还原成0~2之间的正值。例:(angtos0.785398)(atof(angtos0.52802))与angtos互补的函数(angtof"32")12/19/2022387.(angtos角度[模式[精度]])12/18.chr格式:(chrinteger)此函数是将integer中的ASCII码转换成单一的对应字符串。如:(chr97)返回"a"(chr65)返回“A"(chr66)返回"B“9.ascii格式:(ascii字符串)此函数是将字符串转换成ASCII。如:(ascii“A”)返回6512/19/2022398.chr12/12/20223910.read格式:(read字符串)此函数将返回字符串的第一个表或原子。如:(read"(1245)(15.3628.478)")返回(1245)(read"48.6534.8")返回48.6511.Cvunit格式:(Cvunit数值旧单位新单位)(cvunit2.3"minute“"second")返回138.0(cvunit1"meter^3”"inch^3")返回61023.712/19/20224010.read12/12/202240举例1:;;;得到一组点,如:P1、P2、等等(defunc:pt()(setqn(getint“\n输入n值:"))(setqm1)(repeatn(set(read(getstring"\n输入点名:"))(getpoint"\n输入点坐标:"))(setqm(1+m))))12/19/202241举例1:12/12/202241举例2:将度分秒化为弧度;把度分秒化成弧度(defunhd()(setqa(getstring"\nA:"));输入角度(按6.3628形式输入)(cond((=(strlena)6);;(strlena)求a的长度(setqad(substra11));;以字符串形式保存角的度数(setqam(substra32));;以字符串形式保存角的分数(setqas(substra52));;以字符串形式保存角的秒数)((=(strlena)7)(setqad(substra12))(setqam(substra42))(setqas(substra62)))12/19/202242举例2:将度分秒化为弧度12/12/202242((=(strlena)8)(setqad(substra13))(setqam(substra52))(setqas(substra72))))(setqa1(atofad));;把ad转换为实数(setqa2(atofam));;把am转换为实数(setqa3(atofas));;把as转换为实数(setqar(+a1(/a260)(/a33600)))(setqard(/(*arpi)180))(princard)(princ))12/19/202243((=(strlena)8)12/12/202243六、求值函数1.距离(distance)格式:(distance点1点2)求出两点之间的距离,结果是实型数。如:(distance’(12)’(73))返回:6.082763(distance’(1.02.53.0)’())返回:8.99389(空间距离)12/19/202244六、求值函数12/12/2022442.angle函数是求点1到点2的方向与X轴正向的夹角(α),如图,单位是弧度。格式:(angle点1点2)(angle‘(51)‘(21))返回:3.141593α12/19/2022452.angle函数α12/12/2022453.polar函数

polar函数以一个给定角度和一个与给定点的距离来定义一个新点,如下图所示。其中角用弧度表示,并以逆时针方向测量为正。polar函数的格式:(polar点角度距离)(setqpt2(polar‘(2.03.0)pi100))返回:(-98.03.0)(setqp2(polar'(100100)(/pi2)50))返回:(100.0150.0)12/19/2022463.polar函数12/12/2022464.eval格式:(eval表达式)此函数求出表达式结果。如:(setqa56b45.3)(evala)(evalb)提示:eval和strcat、read、setq等函数配合用,可以建立一个一维数组。例如:建立一维数组xi(i=1,2,…,n)。12/19/2022474.eval12/12/202247(setqn(getint"\n输入一个整数:"))(setqi0s0)(repeatn(setqi(1+i))(set(read(strcat"x"(itoai)))(getreal"\n输入一个实数:"))(setqs(+s(eval(read(strcat"x"(itoai)))))))此程序运行结果可以得到:x1,x2,…xn。S=x1+x2+…+xn。12/19/202248(setqn(getint"\n输入一个整数:"))12/七、表处理函数1.list函数2.car函数格式:(car表)返回一个列表中的第一个元素的数值(X元素)。如果该列表中没有任何元素,则返回空值nil。3.cadr函数返回一个列表的第二个元素(Y元素)。4.last函数返回一个列表的最后一个元素。5.(nth<n>表)返回表中第n个元素(n从0算起)。12/19/202249七、表处理函数1.list函数12/12/2022491.(setqp(getpoint“\n输入一点:”))(setqx(carp)y(cadrp))举例:2.(setqp'(GPS13456.78623415.67434.567))(setqdh(carp)x(cadrp)y(nth2p)z(lastp))12/19/2022501.举例:2.12/12/202250八、Command函数

Command函数是AutoLISP中唯一调用AutoCAD命令实现绘图的途径,非常重要。1.作用:使用Command函数(唯一)可调用AutoCAD命令。2.格式:(Command“AutoCAD命令及其选项”)

如:(setqp1'(100.453100.567)p2'(200.254201.587))(command"line"p1p2"")12/19/202251八、Command函数Command函数是AutoLISP3.注意事项(1)Command函数不能调用AutoLISP的输入函数,如getpoint、getangle、getstring、getint等。(2)AutoCAD命令名称和选项必需放在双引号中,并要求双引号中不能有空格。(3)不带“AutoCAD命令及其选项”,即(command),等效ESC键(中止)。(4)几个命令和数据可以写在一个command函数中,也可分开写在两个或两个以上的command函数中。如:(Command“line”p1p2p3p4“”)和(Command“Pline”p1p2)(Commandp3p4“”)等效。12/19/2022523.注意事项12/12/202252(5)文字注记时,字符串也要用“”括起来。如:(Command“Text”‘(100100)5“”“AutoLISP”)(6)调用对话框命令时,不显示对话框,以提示方式执行。如:新建“控制点”图层,设置图层为红色。(command"layer""m""控制点""c"1"""")12/19/202253(5)文字注记时,字符串也要用“”括起来。如:12/12/2举例:画一个边长为L,中心点坐标为P的正三角形,要求底边水平。

(setqL(getreal"\n输入边长:"))(setqP(getpoint"\n输入中心:"))(setqr(*0.288675134L));求内切圆半径12r*r=L*L(command"polygon"3P"c"R)12/19/202254举例:画一个边长为L,中心点坐标为P的正三角形,要求底边水平§3.3自定义命令和自定义函数

一、自定义函数(defun)

用函数(defun)可以定义用户自己的函数,叫自定义函数。自定义函数象AutoLISP函数一样可以被调用,比如说,把常用的符号定义成自定义函数,实际用时,带入具体参数就可以得到图形,不别再绘制。12/19/202255§3.3自定义命令和自定义函数一、自定义函数(defun1.自定义函数格式(defun函数名变元表表达式1表达式2┇)例:用自定义函数方式编写一个程序,绘制正三角形。(defunsjx()(setqL(getreal"\n输入边长:"))(setqP(getpoint"\n输入中心:"))(setqr(*0.288675134L));求内切圆半径12r*r=L*L(command"polygon"3P"c"R))12/19/2022561.自定义函数格式例:用自定义函数方式编写一个程序,绘制正2.注意

(1)函数名是用户自己设定的,不能与AutoLISP内部函数名、变量名相同;(2)变元表的形式有四种:(参数1参数2…),如上例。变元表为此形式时,调用要带参数。(),无参形式。调用时不带参数。(参数1参数2…/局部变量1局部变量2…)。变元表为此形式时,调用要带参数。(/局部变量1局部变量2…)。调用时不带参数。/与参数、局部变量之间必须有空格。

12/19/2022572.注意12/12/202257(3)表达式是函数的定义体,完成计算和绘图。(4)自定义函数的作用:defun函数用于在AutoLISP程序中定义一个函数。它就象其它标准函数一样,可以为我所用。使用时,通过不同的参数,可以绘制不同的图形。调用自定义函数举例:;度化弧度自定义函数(defunhd(af)(setqhhd(/(*afpi)180)))12/19/202258(3)表达式是函数的定义体,完成计算和绘图。调用自定义函数举(defunhsjx()(setqL(getreal"\n输入边长:"))(setqP(getpoint"\n输入中心:"))(setqr(*0.288675134L))

;求内切圆半径(setqp1(polarP(hd210)(*2r)));调用自定义函数(setqp2(polarp1(hd0)L));调用自定义函数(setqp3(polarp1(hd60)L));调用自定义函数(command"line"p1p2p3"c"))12/19/202259(defunhsjx()12/12/202259二、自定义命令

自定义命令的作用是用defun函数为AutoCAD增加各种新命令。

1.格式(defunC:×××()<表达式1><表达式2>┇)或(defunC:×××(/<局部变量1><局部变量2>…)<表达式1><表达式2>┇)12/19/202260二、自定义命令自定义命令的作用是用defun函数为2.注意事项(1)自定义命令格式中×××是命令名称;必须有C:(大小写等效);×××与C:之间不能有空格。(2)×××不能和内部或外部函数名相同;也不能和其它命令同名。(3)注意与自定函数的区别。3.自定义命令调用加载(load)程序后,在命令行上输入自定义命令名×××。12/19/2022612.注意事项12/12/202261例.编写计算三角高程的AutoLISP程序。程序清单如下:;计算三角高程(defunc:sjgc()(hd);调用自定义函数hd(setqL(getreal”\n斜边边长:”))(setqi(getreal”\n仪器高:”))(setqv(getreal”\n觇标高:”))(setqh1(*L(sinard)))(setqh2(-iv))(setqh(+h1h2)))12/19/202262例.编写计算三角高程的AutoLISP程序。12/12/20;把度分秒化成弧度(defunhd()(setqa(getstring"\nA:"));输入角度(按6.3628形式输入)(cond((=(strlena)6)(setqad(substra11))(setqam(substra32))(setqas(substra52)))((=(strlena)7)(setqad(substra12))(setqam(substra42))(setqas(substra62)))((=(strlena)8)(setqad(substra13))(setqam(substra52))(setqas(substra72))))(setqa1(atofad))(setqa2(atofam))(setqa3(atofas))(setqar(+a1(/a260)(/a33600)))(setqard(/(*arpi)180))(princard)(princ))12/19/202263;把度分秒化成弧度((=(strlena)8)12/1§3.4程序结构函数

程序结构函数用于控制程序的进程,把它叫程序结构函数。包括:关系函数、逻辑函数、谓词函数、条件函数、循环函数。一、关系函数

1.等于

格式:(=atom1atom2...)等于函数(=)判断数是否相等。如果相等则条件为真,返回值为T(真值)。同样,如果不相等,则条件为假,返回值为nil(假值)。

12/19/202264§3.4程序结构函数程序结构函数用于控制程序的进

2.不等于格式:(/=atom1atom2...)不等于函数(/=)判断数是否不相等。如果不相等,则条件为真,返回值为T。3.小于格式:(<atom1atom2...)小于函数(<)判断前一个数(atom1)是否小于后面的作数(atom2),如果小于,则条件为真,返回值为T,否则返回nil。12/19/2022652.不等于12/12/202265

4.小于等于格式:(<=atom1atom2....)小于等于函数(<=)判断第一个数是否小于或等于第个数(atom2),如果小于或等于,则条件为真,返回值为T,否则返回nil。5.大于格式:(>atom1atom2...)大于函数判断第一个数是否大于第二个数,如果大于,则条件为真,返回值为T,否则返回nil。6.大于等于格式:(>=atom1atom2...)12/19/2022664.小于等于12/12/202266二、逻辑函数

1.逻辑“与”格式:(and表达式1…)这个函数求出表达式之间的“与”运算值,即当所有表达式值同时为T时,函数结果为T,如果其中任何一个表达式值为nil,函数结果为nil。例如:(setqa10b20)(and(>a5)(<a15))结果为T(and(>b5)(<b15))结果为nil12/19/202267二、逻辑函数12/12/202267

2.逻辑“或”格式:(or表达式1…)这个函数求出表达式之间的“或”运算值,即当所有表达式值同时为nil时,函数结果为nil,如果其中任何一个表达式值为T,函数结果为T。例如:(setqa10b20)(or(<a5)(>a15))结果为nil(or(<b5)(>b15))结果为T12/19/2022682.逻辑“或”12/12/2022683.逻辑“非”格式:(not数或表达式)这个函数求出表达式之间的“非”运算值,即当“数或表达式”值为nil时,函数结果为T,否则函数结果为NIL。例如:(setqa10b20cnil)(nota)结果为nil(notc)结果为T(not(or(<a5)(>a15)))结果为T(not(or(<b5)(>b15)))结果为nil12/19/2022693.逻辑“非”12/12/202269三、数据谓词函数和等值谓词函数(自学)四、条件函数和顺序处理函数

1.If函数格式:(If<测试式><式1><式2>)12/19/202270三、数据谓词函数和等值谓词函数(自学)12/12/20227举例:(1)(If(=13)“YES”“NO”)结果为“NO”(2)(setqa15)(If(and(>=a10)(<=a18))(setqd3)(setqc10))结果D为3。12/19/202271举例:12/12/2022712.cond函数格式:(cond<测试式1><结果1><测试式2><结果2>┇<测试式n><结果n>)<测试式i>是逻辑表达式,<结果i>为一个或多个表达式。执行过程见图。12/19/2022722.cond函数12/12/202272举例:(setqd0.3)(cond((and(>=d0.2)(<=d0.4))(setqc10))((and(>=d0.5)(<=d1.0))(setqc9.0))((<d0.6)(setqc9.0)))运行结果为C=10。12/19/202273举例:12/12/2022733.progn函数progn函数通常和If函数一道用,来控制计算顺序。格式:(prong表达式1…)举例:(setqa15b15.0)

(if(=ab)(princ“大家好!”)(setqa(+a1)b(+b1))

)运行结果是:大家好!a=15,b=15.0(setqa15b15.0)

(if(=ab)

(progn(princ“大家好!”)(setqa(+a1)b(+b1))

)

)运行结果是:大家好!a=16,b=16.012/19/2022743.progn函数举例:(setqa15b15.0)五、循环函数

有两个循环函数:repeat、while。

1.Repeat函数格式:(Repeat数表达式1…)数:必须是正整数。

表达式:是循环体,循环次数由数来决定。最后返回表达式的值。举例:(setqa10b100)(repeat4(setqa(+a10))(setqb(+b100)))12/19/202275五、循环函数有两个循环函数:repeat、while。举例2.while函数格式:(while<测试式>表达式1…)

执行过程:先计算<测试式>,若为T,则计算后面若干个表达式(循环体);若为NIL,则退出循环体。举例:按要求画下列图形。

12/19/2022762.while函数执行过程:先计算<测试式>,若为T,则(defunC:HY()(setqP0(getpoint"圆心1:"))(setqR(getreal"半径:"))(setqL(getreal"间距:"))(setqa1)(while(<=a4)(command"circle"P0R)(setqP0(polarP00L))(setqa(1+a))))如果要绘制圆心的连线与x轴有一夹角a,则程序如何编?12/19/202277(defunC:HY()如果要绘制圆心的连线与x轴有一夹附加:设置长度和角度单位

如:长度单位设置十进制、3位小数,角度单位设置十进制的度2位小数、X轴正方向为0度、逆时针方向为正。

用command(command"units"23120"N")units:绘图单位命令;2:长度十进制单位;3:3位小数;1:角度十进制单位;0:X轴正方向为0度;N:逆时针方向为正。12/19/202278附加:设置长度和角度单位如:长度单位设置十进制、3位(defunC:HY()(setqP0(getpoint"圆心1:"))(setqR(getreal"半径:"))(setqL(getreal"间距:"))(setqn(getint"圆的数量:"))(setqjd(getangle"倾斜角度:"))(command"units"23120"N")(setqa1)(while(<=an)(command"circle"P0R)(setqP0(polarP0jdL))(setqa(1+a))))12/19/202279(defunC:HY()12/12/202279§3.5交互输入函数

getpoint、getint、getreal、getstring、getangle、getdist(getangle“提示内容”)getangle函数等待用户输入角度。若用户输入一个数,则得到由该数代表的角度值转化为的弧度值。若输入一点,系统提示输入第二点,其结果得到由第一点到第二点构成的向量与X轴正向夹角,单位是弧度。12/19/202280§3.5交互输入函数getpoint、getint、§3.6系统变量、文件操作和实体访问函数

一、系统变量函数AutoLISP有两个系统变量函数,用于改变(setvar)或得到(getvar)系统变量的值。二、文件操作函数

三、实体访问函数

12/19/202281§3.6系统变量、文件操作和实体访问函数一、系统变量函数1练习题一、概念题1.AutoLISP程序有何特点?2.填空(1)在表达式(sinaf)中,af以_____为单位,表达式结果是_____数。(2)表达式(rtos45.2321)返回值是:_____。表达式(rtos45.23522)返回值是:_____。12/19/202282练习题一、概念题12/12/202282(3)(setqdb'(DXD76.54323.76356.87))(setqdm(nth0db))dm返回值是:_____。(4)表达式(read“23.567.89”)返回值是:_____。(5)已知x=5,y=8,r=10,调用command函数绘制一个圆,判断下列表达式哪些是错误的,并指出错误原因。1)(command"circle"(listxy)r"")2)(command"circle"(listxy)r)3)(command"circle"'(xy)r)4)(command"circle"(listxy)"r")12/19/202283(3)12/12/2022833.写出自定义命令和自定义函数的格式。二、编程应用题1.已知线段AB,C点是线段AB外一点,用自定义函数编写方式,求C点到线段AB的距离。2.定义一个求三角形面积的函数。3.用自定义命令方式编写建立图层的应用程序。4.已知1、2、3、4点,绘制如图。12/19/2022843.写出自定义命令和自定义函数的格式。12/12/202285.设A、1、2、3、B是导线点(坐标已知),编写绘制导线略图的AutoLISP程序(要求绘制用圆圈表示导线点,并注记点号)。12/19/2022855.设A、1、2、3、B是导线点(坐标已知),编写绘制导线略第三章AutoLISP绘图程序设计

主要内容1.AutoLISP特点2.AutoLISP函数的用法3.AutoLISP程序结构4.AutoLISP程序执行方式12/19/202286第三章AutoLISP绘图程序设计主要内容12/12/§3.1AutoLISP概述

一、AutoLISP介绍

1.AutoLISP的作用(1)AutoLISP是一种表语言,是常用的AutoCAD二次开发手段。

所谓二次开发:是指以AutoCAD软件为平台,加入自己所需要的功能。开发过程,就是编程的过程。二次开发所支持的语言有VB、C++,大型的二次开发,以C++为主,而小型二次开发,一般以AutoLISP为主。12/19/202287§3.1AutoLISP概述一、AutoLISP介绍12(2)必须在AutoCAD环境下运行(内嵌);(3)AutoLISP可以编写程序,调用AutoCAD的许多命令;举例:在水平方向画n个大小相等的圆。;;调用AutoCAD命令画圆(defunC:HY()(setqP0(getpoint"第一圆心坐标:"))(setqR(getreal"半径:"))(setqL(getreal"圆心间距离:"))(setqa1)(setqn(getint"\n圆的个数:"))(while(<=an)(command"circle"P0R)(setqP0(polarP00L))(setqa(1+a))))12/19/202288(2)必须在AutoCAD环境下运行(内嵌);;;调用Aut(4)AutoLISP语言中使用大量的函数(有200多个函数),进行各种运算;(5)AutoLISP编写的程序特点(学习中注意):以表形式描述数据处理过程,程序执行过程就是函数求值过程;每段程序都是一个函数;具有交互处理功能,边解释边执行;采用模块化设计方法。12/19/202289(4)AutoLISP语言中使用大量的函数(有200多个函数2.AutoLISP的数据类型

(1)整型数(INT):是由0、1、2…9、+、-组成的。(2)实型数(REAL):如0.4(0不能少)、-1.23、0.526E9(0.526×109)。(3)符号(SYM):除(、)、*、‘、”、;之外的字符序列,并且不能全部是数字。符号常用着变量,如:Command:(setqX12);整型数Command:(setqX12.0);实型数Command:(setqX“12”);字符串12/19/2022902.AutoLISP的数据类型(1)整型数(INT):是由(4)字符串(STR):如:“ABC”、“abc”、“457”等。(5)表(LIST):带有一对括号、有若干元素组成。(元素1元素2…元素n)如:(24f)

元素的个数叫表的长度。

元素也可以是表,如(45(36)7),这叫嵌套。

元素之间必须用“空格”隔开。

表的定义方式:(LIST56);’(56);还可以用defun定义(后面讲)。

12/19/202291(4)字符串(STR):如:“ABC”、“abc”、“457例:(setqP(list12.36-26.58))结果是:(12.36-26.58)例:(setqP'(12.36-26.58))结果是:(12.36-26.58)提示:(1)表的嵌套时一定要注意括号“(”、“)”匹配。(2)西文状态下输入!!!12/19/202292例:(setqP(list12.36-26.58))(6)文件描述符(7)AutoLISP内部函数(8)AutoCAD的选择集(9)AutoCAD的实体名上述数据类型中,前四种称原子,原子包括数值原子(整型数、实型数),符号原子和字符串原子。AutoLISP基本数据类型是原子和表,重点介绍前五种数据类型。12/19/202293(6)文件描述符12/12/20228二、几个基本概念1.常数PI——数学中的π(3.1415929…)T——逻辑真,即成立。NIL——逻辑假,即不成立。还代表空,即无值。

注意:(1)大小写等效;(2)它们不能作为变量。2.原子是程序处理中最小的数据单元。3.表达式原子和表的统称。如:(setqP'(12.36-26.58))12/19/202294二、几个基本概念12/12/202294.点是表的一种形式,也叫点表。有三种获得点的方式:(1)用'表示'(120.35253.24)(2)list函数定义点(setqX12.36Y-26.58)(setqM(listXY))结果是:M=(12.36-26.58)(setqM'(XY))结果是:(XY)(3)由getpoint函数得到点其格式:(getpoint“\n输入一点:”)

12/19/2022954.点12/12/202210三、AutoLISP程序结构1.举例例(1)

;;在屏幕上显示ASCII码为(65-90)的字符(defunC:zm(/as);自定义命令(setqas65n100)(while(<=as90)(command"text"(listn100)15""(chras))(setqas(+as1)n(+n20))))12/19/202296三、AutoLISP程序结构12/12/202211例(2);;绘制正多边形程序(defunc:dbx()(setqn(getint"\n输入多边形边数:"))(setqL(getreal"\n输入多边形边长:"))(setqP1(getpoint"\n输入多边形第一个角点坐标:"))(setqP2(polarP10L))(command"polygon"n"e"p1p2))12/19/202297例(2)12/12/202212例(3)(defunyuan();;画圆函数(setqr(getreal"\n半径:"))(setqp(getpoint"\n圆心:"))(command"circle"pr))12/19/202298例(3)12/12/202213例(4)(defunld()(setqp1(getpoint"\np1:")p2(getpoint"\np2:"));;;输入两点(setqd(distancep1p2));求距离(setqang(anglep1p2));求方位角(printd)(printang)(command"line"p1p2"");画直线)12/19/202299例(4)12/12/2022142.结构

(1)注释行以;开始,可在程序头或句尾,增加程序可读性。也可以不要。(2)除字符串外,字母大小写等效。(3)表与表之间可以有空格,也可没有,建议有,这样清楚。如:(distance'(34)'(5632))或(distance'(34)'(5632))(4)函数名后至少要有一个空格,函数名与表之间可有可无。12/19/20221002.结构12/12/2022153.特点

(1)所谓语句都是以表形式出现。(2)一切成分都是以函数的形式给出。(3)程序执行过程就是求函数值的过程。四、AutoLISP程序执行方式有三种方式:行方式、源文件方式、编译文件方式。1.行方式就是在AutoCAD的“command:”提示符下,输入表后回车。如:command:(+156.3)↙command:(setqa10)(setqb(+a5))↙

12/19/20221013.特点12/12/2022162.源文件方式用写字板或记事本把AutoLISP程序保存起来(后缀为.LSP)。然后用“LOAD”命令装载并调用。例如:(1)把下列程序保存到“e:\zm.lsp”;;在屏幕上显示ASCII码为(65-90)的字符(defunC:zm(/as);自定义命令(setqas65n100)(while(<=as90)(command"text"(listn100)15""(chras))(setqas(+as1)n(+n20))))12/19/20221022.源文件方式;;在屏幕上显示ASCII码为(65-90)

(2)用“load”装载即在命令行上输入(load“e:\zm.lsp”)(3)在命令行上输入zm3.编译文件方式(重点掌握)(1)VisualLISP的启动、界面和退出(2)VisualLISP控制台(3)VisualLISP创建LISP程序(4)VisualLISP中运行LISP程序提示:建议在VisualLISP中创建和运行LISP程序举例:12/19/2022103(2)用“load”装载12/12/202218§3.2基本函数一、算数运算函数

1.加运算格式:(+num1num2num3...)

Command:(+25)返回:7Command:(+2.030.04.050.0)返回:86.0Command:(+230450.0)返回:86.0注意:“+”与“num1”及各数之间必须要有空格,后面的函数格式都是如此。12/19/2022104§3.2基本函数一、算数运算函数12/12/2022192.减运算格式:(-num1num2num3...)“减”函数(-)从第一个数中减去后面所有数的和,即[num1-(num2+num3+...)]。如:Command:(-2814)返回:14Command:(-25711)返回:7Command:(-502010.0)返回:20.0Command:(-20.030.0)返回:-10.012/19/20221052.减运算12/12/202220

3.乘运算格式:(*num1num2num3...)

4.除运算格式:(/num1num2num3...)“除”函数以第一个数除以其他所有运算数的积,即[num1/(num2*num3*...)]。例如:(*2532.0)返回:60.0(*253)返回:30(/32)(Setqa(/3.02))返回:1.512/19/20221063.乘运算12/12/2022215.增量格式:(1+number)注意:1和“+”之间不能空格,+与number之间必须要空格。6.减量格式:(1-number)注意:1和“-”之间不能空格,-与number之间必须要空格。例如:(setqb(1+-12.5))(setqc(1--16.4))12/19/20221075.增量12/12/202222举例:1.求a,b,c三个数的平方和。2.根据前后视读数,求两点间高差。3.求闭合水准线路的高差闭合差。12/19/2022108举例:1.求a,b,c三个数的平方和。12/12/20222参考答案1:(setqa(getreal"输入第一个数a:"))(setqb(getreal"输入第二个数b:"))(setqc(getreal"输入第三个数c:"))(setqs(+(*aa)(*bb)(*cc)))参考答案2:(setqa(getreal"输入后视读数a:"))(setqb(getreal"输入前视读数b:"))(setqh(-ab))12/19/2022109参考答案1:参考答案2:12/12/202224参考答案3:(setqn(getint"输入高差个数:"))(setqfh0.0)(repeatn(setqh(getreal"\n依次输入高差:"))(setqfh(+fhh)))12/19/2022110参考答案3:12/12/202225二、标准函数

1.绝对值(abs)、平方根(sqrt)、正弦(sin)、余弦(cos)、反正切(atan)

以上函数格式:(函数名<数或表达式>)2.幂函数(expt)、(exp)格式:(expt底数幂)格式:(exp底数<数或表达式>)

注意:以上各函数返回的数值类型。3.举例12/19/2022111二、标准函数1.绝对值(abs)、平方根(sqrt)、举例:用AutoLISP表示下列公式:(1)计算三角高程的表达式

(2)计算坐标增量的表达式(3)将度化成弧度单位12/19/2022112举例:用AutoLISP表示下列公式:(1)计算三角高程的表参考答案:(1)(setqHA(getreal"输入HA:"))(setqL(getreal"输入L:"))(setqAF(getreal"输入AF:"))(setqi(getreal"输入i:"))(setqv(getreal"输入v:"))(setqHB1(+HA(-iv)))(setqHB2(*L(sinaf)))(setqHB(+HB1HB2))12/19/2022113参考答案:12/12/202228参考答案:(3)(setqaf(getreal“输入af:”));af是整度数(setqaf(/180(*piaf)))如何将度分秒化成弧度?12/19/2022114参考答案:12/12/202229三、赋值函数

赋值函数有两个:setq和set1.setq

格式:(setq变量1表达式1变量2表达式2…)赋给变量的值可以是任何表达式(数值、字符串、字母)。注意:不要用AutoLISP的函数名和常数当作变量。举例:(1)(setqa32b33.26c"yes")(2)(setqa(sin(/pi4)))(3)(setqx34.3y5.23p(listxy))(4)(setqpt(getpoint"\n输入一点:"))12/19/2022115三、赋值函数赋值函数有两个:setq和set12/12/22.set与setq不同之处,是set为符号赋值,setq为变量赋值。如:(set‘a9)结果a为9此函数非常有用,和其它函数配合使用,可以得到一维数组。举例:(1)(set(read(getstring"\n输入点名:"))(getpoint"\n输入点坐标:"))(2)(set(read(getstring"\n输入变量名:"))(getreal"\n输入变量值:"))12/19/20221162.set12/12/202231四、字符串处理函数1.strc

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论