AutoLisp的教程培训PPTAutoLISP绘图程序设计

上传人:s9****2 文档编号:585692591 上传时间:2024-09-03 格式:PPT 页数:85 大小:377.50KB
返回 下载 相关 举报
AutoLisp的教程培训PPTAutoLISP绘图程序设计_第1页
第1页 / 共85页
AutoLisp的教程培训PPTAutoLISP绘图程序设计_第2页
第2页 / 共85页
AutoLisp的教程培训PPTAutoLISP绘图程序设计_第3页
第3页 / 共85页
AutoLisp的教程培训PPTAutoLISP绘图程序设计_第4页
第4页 / 共85页
AutoLisp的教程培训PPTAutoLISP绘图程序设计_第5页
第5页 / 共85页
点击查看更多>>
资源描述

《AutoLisp的教程培训PPTAutoLISP绘图程序设计》由会员分享,可在线阅读,更多相关《AutoLisp的教程培训PPTAutoLISP绘图程序设计(85页珍藏版)》请在金锄头文库上搜索。

1、第三章第三章 AutoLISPAutoLISP绘图程序设计绘图程序设计 主要内容主要内容1.AutoLISP特点2.AutoLISP函数的用法3.AutoLISP程序结构4.AutoLISP程序执行方式9/3/20249/3/20241 13.1 AutoLISP3.1 AutoLISP概述概述 一、一、AutoLISPAutoLISP介绍介绍 1.AutoLISP1.AutoLISP的作用的作用( 1) AutoLISP是 一 种 表 语 言 , 是 常 用 的AutoCAD二次开发手段。 所谓二次开发:是指以AutoCAD软件为平台,加入自己所需要的功能。开发过程,就是编程的过程。 二次开

2、发所支持的语言有VB、C+,大型的二次开发,以C+为主,而小型二次开发,一般以AutoLISP为主。 9/3/20249/3/20242 2(2)必须在AutoCAD环境下运行(内嵌);(3)AutoLISP可以编写程序,调用AutoCAD的许多 命令;举例:在水平方向画n个大小相等的圆。;调用调用AutoCADAutoCAD命令画圆命令画圆( (defundefun C:HY() C:HY() ( (setqsetq P0 ( P0 (getpointgetpoint 第一圆心坐标第一圆心坐标:):) ( (setqsetq R ( R (getrealgetreal 半径半径:):) (

3、(setqsetq L ( L (getrealgetreal 圆心间距离圆心间距离:):) ( (setqsetq a 1) a 1) ( (setqsetq n(getintnn(getintn圆的个数圆的个数:):) (while (= a n) (while (= a n) (command circle P0 R) (command circle P0 R) ( (setqsetq P0 (polar P0 0 L) P0 (polar P0 0 L) ( (setqsetq a (1+ a) a (1+ a) ) ) )9/3/20249/3/20243 3(4)AutoLISP语

4、言中使用大量的函数(有200多个函数),进行各种运算;(5)AutoLISP编写的程序特点(学习中注意):v以表形式描述数据处理过程,程序执行过程就是函数求值过程;v每段程序都是一个函数;v具有交互处理功能,边解释边执行;v采用模块化设计方法。9/3/20249/3/20244 42.AutoLISP2.AutoLISP的数据类型的数据类型 (1)整型数(INT):是由0、1、29、+、-组成的。(2)实型数(REAL):如0.4(0不能少)、-1.23、0.526E9(0.526109)。(3)符号(SYM):除(、)、*、”、;之外的字符序列,并且不能全部是数字。符号常用着变量,如: Co

5、mmand:(setq X 12) ;整型数 Command:(setq X 12.0) ;实型数 Command:(setq X “12”) ;字符串9/3/20249/3/20245 5(4)字符串(STR):如:“ABC”、“abc”、“457”等。(5)表(LIST):带有一对括号、有若干元素组成。(元素1 元素2 元素n) 如:(2 4 f)元素的个数叫表的长度。元素也可以是表,如(45 (3 6) 7),这叫嵌套。元素之间必须用“空格” 隔开。表的定义方式:(LIST 5 6);(5 6);还可以用defun定义(后面讲)。 9/3/20249/3/20246 6例: (setq

6、P(list 12.36 -26.58)结果是:(12.36 -26.58)例:(setq P (12.36 -26.58)结果是:(12.36 -26.58)提示:(1)表的嵌套时一定要注意括号“(”、“)”匹 配。(2)西文状态下输入!9/3/20249/3/20247 7(6)文件描述符(7)AutoLISP内部函数(8)AutoCAD的选择集(9)AutoCAD的实体名 上述数据类型中,前四种称原子,原子包括数值原子(整型数、实型数),符号原子和字符串原子。 AutoLISP基本数据类型是原子和表,重点介绍前五种数据类型。9/3/20249/3/20248 8二、几个基本概念二、几个基

7、本概念1.常数 PI数学中的(3.1415929) T逻辑真,即成立。 NIL逻辑假,即不成立。还代表空,即无值。 注意:(1)大小写等效;(2)它们不能作为变量。2.原子 是程序处理中最小的数据单元。3.表达式 原子和表的统称。 如:(setq P (12.36 -26.58)9/3/20249/3/20249 94.点 是表的一种形式,也叫点表。 有三种获得点的方式: (1)用表示 (120.35 253.24) (2)list函数定义点 (setq X 12.36 Y -26.58) (setq M (list X Y) 结果是:M=(12.36 -26.58) (setq M ( X

8、Y) 结果是:(X Y) (3)由getpoint函数得到点 其格式:(getpoint “n输入一点:”) 9/3/20249/3/20241010三、三、AutoLISPAutoLISP程序结构程序结构1.1.举例举例例(例(1 1) ;在屏幕上显示在屏幕上显示 ASCIIASCII码为(码为(65659090)的字符)的字符( (defundefun C:zmC:zm(/ as) ;(/ as) ;自定义命令自定义命令 ( (setqsetq as 65 n 100) as 65 n 100) (while (= as 90) (while (= as 90) (command text

9、 (list n 100) 15 ( (command text (list n 100) 15 (chrchr as) as) ( (setqsetq as (+ as 1) n (+ n 20) as (+ as 1) n (+ n 20) ) ) )9/3/20249/3/20241111例(例(2 2);绘制正多边形程序绘制正多边形程序( (defundefun c:dbxc:dbx()() ( (setqsetq n ( n (getintngetintn输入多边形边数输入多边形边数:):) ( (setqsetq L ( L (getrealngetrealn输入多边形边长输入多边

10、形边长:):) ( (setqsetq P1(getpointn P1(getpointn输入多边形第一个角点坐输入多边形第一个角点坐标标:):) ( (setqsetq P2(polar P1 0 L) P2(polar P1 0 L) (command polygon n e p1 p2) (command polygon n e p1 p2) )9/3/20249/3/20241212例(例(3 3)( (defundefun yuanyuan( ) ;( ) ;画圆函数画圆函数 ( (setqsetq r ( r (getrealngetrealn半径半径:):) ( (setqset

11、q p ( p (getpointngetpointn圆心圆心:):) (command circle p r) (command circle p r) )9/3/20249/3/20241313例(4)(defun ld( ) (setq p1 (getpointn p1:) p2 (getpointn p2:) );输入两点 (setq d (distance p1 p2);求距离 (setq ang (angle p1 p2);求方位角 (print d) (print ang) (command line p1 p2 );画直线)9/3/20249/3/202414142.2.结构结

12、构 (1)注释行以 ;开始,可在程序头或句尾,增加程序可读性。也可以不要。(2)除字符串外,字母大小写等效。(3)表与表之间可以有空格,也可没有,建议有,这样清楚。如:(distance(3 4)(56 32)或 (distance (3 4) (56 32)(4)函数名后至少要有一个空格,函数名与表之间可有可无。9/3/20249/3/202415153.3.特点特点 (1)所谓语句都是以表形式出现。 (2)一切成分都是以函数的形式给出。 (3)程序执行过程就是求函数值的过程。四、四、AutoLISPAutoLISP程序执行方式程序执行方式有三种方式:行方式、源文件方式、编译文件方式。 1.

13、行方式 就是在AutoCAD的“command:”提示符下,输入表后回车。如:command:(+ 15 6.3)command:(setq a 10)(setq b (+ a 5) 9/3/20249/3/202416162.2.源文件方式源文件方式 用写字板或记事本把AutoLISP程序保存起来(后缀为.LSP)。然后用“LOAD”命令装载并调用。例如:(1)把下列程序保存到“e:zm.lsp”;在屏幕上显示在屏幕上显示 ASCIIASCII码为(码为(65659090)的字符)的字符( (defundefun C:zmC:zm(/ as) ;(/ as) ;自定义命令自定义命令 (set

14、q as 65 n 100)(setq as 65 n 100) (while (= as 90) (while (= as 90) (command text (list n 100) 15 ( (command text (list n 100) 15 (chrchr as) as) (setq as (+ as 1) n (+ n 20) (setq as (+ as 1) n (+ n 20) ) ) )9/3/20249/3/20241717 (2)用“load”装载 即在命令行上输入(load “e:zm.lsp”) (3)在命令行上输入zm 3.3.编译文件方式(重点掌握)编译文

15、件方式(重点掌握) (1) Visual LISP的启动、界面和退出 (2) Visual LISP控制台 (3) Visual LISP创建LISP程序 (4) Visual LISP中运行LISP程序提示:建议在Visual LISP中创建和运行LISP程序举例:9/3/20249/3/202418183.2 3.2 基本函数基本函数一、算数运算函数一、算数运算函数 1.加运算 格式:(+ num1 num2 num3.) Command:(+ 2 5) 返回:7 Command:(+ 2.0 30.0 4.0 50.0) 返回:86.0 Command:(+ 2 30 4 50.0) 返

16、回:86.0注意:“+”与“num1”及各数之间必须要有空格,后面的函数格式都是如此。 9/3/20249/3/202419192. 减运算 格式:(- num1 num2 num3.) “减”函数(-)从第一个数中减去后面所有数的和,即 num1-( num2 + num3 + . . . ) 。 如: Command: (- 28 14) 返回:1 4 Command: (- 25 7 11 ) 返回:7 Command: (- 50 20 10.0) 返回:20.0 Command: (- 20.0 30.0) 返回:-10.09/3/20249/3/20242020 3. 乘运算 格式

17、:(* num1 num2 num3 .) 4. 除运算 格式:(/ num1 num2 num3 .) “除”函数以第一个数除以其他所有运算数的积,即 num1 / ( num2 * num3 * . . . ) 。 例如: (* 2 5 3 2.0) 返回:60.0 (* 2 5 3) 返回:30 (/ 3 2) (Setq a(/ 3.0 2) 返回:1.5 9/3/20249/3/202421215. 增量 格式:(1+ number) 注意:1和“+”之间不能空格,+ 与n u m b e r之间必须要空格。 6. 减量 格式:(1- number) 注意:1和“-”之间不能空格,-

18、 与number之间必须要空格。 例如: (setq b(1+ -12.5) (setq c(1- -16.4)9/3/20249/3/20242222举例举例: :1.求a,b,c三个数的平方和。2.根据前后视读数,求两点间高差。3.求闭合水准线路的高差闭合差。9/3/20249/3/20242323参考答案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:)(set

19、q b (getreal输入前视读数b:)(setq h (- a b)9/3/20249/3/20242424参考答案3:(setq n (getint 输入高差个数:)(setq fh 0.0)(repeat n (setq h (getrealn依次输入高差:) (setq fh(+ fh h)9/3/20249/3/20242525二、标准函数二、标准函数 1.绝对值(abs)、平方根 (sqrt) 、正弦(sin) 、余弦(cos) 、 反正切(atan) 以上函数格式:(函数名 )2.幂函数(expt)、(exp) 格式: (expt 底数 幂) 格式: (exp 底数 ) 注意:

20、以上各函数返回的数值类型。3.举例9/3/20249/3/20242626举例:用AutoLISP表示下列公式:(1)计算三角高程的表达式 (2)计算坐标增量的表达式(3)将度化成弧度单位9/3/20249/3/20242727参考答案参考答案: :(1) (setq HA (getreal 输入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) (set

21、q HB (+ HB1 HB2)9/3/20249/3/20242828参考答案:(3) (setq af (getreal “输入af:”); af是整度数 (setq af (/ 180 (* pi af)v如何将度分秒化成弧度?9/3/20249/3/20242929三、赋值函数三、赋值函数 赋值函数有两个:setq和set1.setq1.setq 格式:(setq 变量1 表达式1 变量2 表达式2 )赋给变量的值可以是任何表达式(数值、字符串、字母)。 注意:不要用AutoLISP的函数名和常数当作变量。举例:(1) (setq a 32 b 33.26 c yes) (2) (se

22、tq a (sin (/ pi 4) (3) (setq x 34.3 y 5.23 p(list x y ) (4) (setq pt(getpointn输入一点:)9/3/20249/3/202430302.set2.set与setq不同之处,是set为符号赋值,setq为变量赋值。如:(set a 9) 结果a为9 此函数非常有用,和其它函数配合使用,可以得到一维数组。举例:(1) (set(read(getstringn输入点 名:)(getpointn输入点坐标:)(2) (set(read(getstringn输入变量 名:)(getrealn输入变量值:)9/3/20249/3/

23、20243131四、字符串处理函数四、字符串处理函数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 9/3/20249/3/202432323.substr格式:(substr 字符串 起点 长度)此函数将返回“字符串”的子字符串。子串的起始位置是以“起点”确定,子串长度由“长度”指定。如

24、果“长度”没有设定, 则子串将从“起点”到最后。“起点”和“长度”均须为正整型数。如:(substr abcde 2) 返回 bcde(substr abcde 3 2) 返回 cd9/3/20249/3/20243333五、类型转换函数五、类型转换函数1.fix格式: (fix number) 此函数将number变为整型数。如果number是实型数,则舍去小数部分。如: (fix 3) 返回 3 (fix 3.7) 返回 3 9/3/20249/3/202434342.float格式: (float number) 此函数将number变为实型数。如:(float 3) 返回 3.0(fl

25、oat 3.75) 返回 3.753.atoi格式: (atoi 字符串) 此函数可用来将字符串转换成整型数。如:(atoi 97) 返回 979/3/20249/3/202435354. atof格式: (atof 字符串) 此函数可用来将字符串转换成实型数。如:(atof 67.9)返回 67.9(atof “97”)返回 97.05. itoa格式:(itoa 整型数) 此函数将整型数转换成字符串。如:(itoa 56) 返回 “56”9/3/20249/3/202436366. rtos rtos函数将按给定的方式和精度把数转换为字符串。格式:(rtos 数 方式 精度)方式:有五种,

26、其代码分别是1、2、3、4、5(只要掌握2)。精度:是制小数位数。例如:(setq A(rtos 5.78925 2 4) 返回5.7893(setq A(rtos 45.23 2 1) 返回45.29/3/20249/3/202437377.(angtos 角度 模式 精度)把弧度转换为度(取整度)注意:(1)角度以弧度表示; (2)模式是04的整数;(0十进制;1度分秒;2梯度;3弧度;4测量单位) (3)精度是一整数,表示十进制数小数位; (4)角度为负时, angtos自动将其还原成02 之间的正值。例:(angtos 0.785398 ) (atof(angtos 0.528 0 2

27、)与angtos互补的函数(angtof 32 )9/3/20249/3/202438388.chr格式:(chr integer)此函数是将 integer中的ASCII码转换成单一的对应字符串。如 :(chr 97) 返回 a(chr 65) 返回 “A(chr 66) 返回 B“9.ascii格式:(ascii 字符串)此函数是将字符串转换成ASCII。如 :(ascii “A”) 返回659/3/20249/3/2024393910.read格式:(read 字符串)此函数将返回字符串的第一个表或原子。如:(read (12 45) (15.36 28.478) 返回(12 45)(r

28、ead 48.65 34.8) 返回48.6511.Cvunit格式:(Cvunit 数值 旧单位 新单位)(cvunit 2.3 minute“ second) 返回138.0(cvunit 1 meter3” inch3) 返回61023.79/3/20249/3/20244040举例1:;得到一组点,如:P1、P2、等等(defun c:pt() (setq n(getint“n输入n值:) (setq m 1) (repeat n (set(read(getstringn输入点名:)(getpointn输入点坐标:) (setq m (1+ m) ) )9/3/20249/3/2024

29、4141举例举例2:2:将度分秒化为弧度将度分秒化为弧度; ;把度分秒化成弧度把度分秒化成弧度( (defundefun hdhd()()( (setqsetq a ( a (getstringgetstring nAnA:);:);输入角度(按输入角度(按6.36286.3628形式输入)形式输入)( (condcond (= ( (= (strlenstrlen a) 6) ;( a) 6) ;(strlenstrlen a) a)求求a a的长度的长度 ( (setqsetq ad ( ad (substrsubstr a 1 1) ; a 1 1) ;以字符串形式保存角的度数以字符串形

30、式保存角的度数 ( (setqsetq am ( am (substrsubstr a 3 2) ; a 3 2) ;以字符串形式保存角的分数以字符串形式保存角的分数 ( (setqsetq as ( as (substrsubstr a 5 2) ; a 5 2) ;以字符串形式保存角的秒数以字符串形式保存角的秒数 ) ) (= ( (= (strlenstrlen a) 7) a) 7) ( (setqsetq ad ( ad (substrsubstr a 1 2) a 1 2) ( (setqsetq am ( am (substrsubstr a 4 2) a 4 2) ( (set

31、qsetq as ( as (substrsubstr a 6 2) a 6 2) ) )9/3/20249/3/20244242(= (strlen a) 8) (setq ad (substr a 1 3) (setq am (substr a 5 2) (setq as (substr a 7 2) (setq a1 (atof ad) ;把ad转换为实数 (setq a2 (atof am) ;把am转换为实数 (setq a3 (atof as) ;把as转换为实数 (setq ar (+ a1 (/ a2 60) (/ a3 3600) (setq ard (/ (* ar pi)

32、 180) (princ ard) (princ)9/3/20249/3/20244343六、求值函数六、求值函数1. 距离(distance)格式:(distance 点1 点2)求出两点之间的距离,结果是实型数。如:(distance (1 2) (7 3)返回:6.082763(distance (1.0 2.5 3.0) (7.7 2.5 9.0)返回:8.99389(空间距离)9/3/20249/3/202444442.angle函数 是求点1到点2的方向与X轴正向的夹角(),如图,单位是弧度。格式:(angle 点1 点2)(angle (5 1) (2 1)返回:3.141593

33、9/3/20249/3/202445453. polar函数 polar函数以一个给定角度和一个与给定点的距离来定义一个新点,如下图所示。其中角用弧度表示,并以逆时针方向测量为正 。polar函数的格式:(polar 点 角度 距离)(setq pt2 (polar (2.0 3.0) pi 100)返回:(-98.0 3.0)(setq p2 (polar (100 100) (/ pi 2) 50) 返回:(100.0 150.0) 9/3/20249/3/202446464.eval格式:(eval 表达式 )此函数求出表达式结果。如:(setq a 56 b 45.3)(eval a)

34、(eval b)提示:eval和strcat、read、setq等函数配合用,可以建立一个一维数组。例如:建立一维数组xi(i=1,2,n)。9/3/20249/3/20244747(setq n(getintn输入一个整数:)(setq i 0 s 0)(repeat n(setq i(1+ i)(set (read(strcatx(itoa i)(getrealn输入一个实数:)(setq s(+ s(eval(read(strcat x(itoa i) 此程序运行结果可以得到: x1,x2,xn。 S=x1+x2+xn。9/3/20249/3/20244848七、表处理函数七、表处理函数

35、1.list函数2.car函数 格式:(car 表) 返回一个列表中的第一个元素的数值(X元素)。如果该列表中没有任何元素,则返回空值nil。3.cadr函数 返回一个列表的第二个元素(Y元素)。4.last函数 返回一个列表的最后一个元素。5.(nth 表)返回表中第n个元素(n从0算起)。9/3/20249/3/202449491.(setq p(getpoint“n输入一点:”)(setq x(car p) y(cadr p)举例:举例:2.(setq p( GPS1 3456.786 23415.674 34.567)(setq dh(car p) x(cadr p) y(nth 2

36、p) z(last p)9/3/20249/3/20245050八、八、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 )9/3/20249/3/202451513.注意事项 (1)Command函数不能调用AutoLISP的输入函数,如getpo

37、int、getangle、getstring、getint等。(2)AutoCAD命令名称和选项必需放在双引号中,并要求双引号中不能有空格。( 3) 不 带 “AutoCAD命 令 及 其 选 项 ”, 即(command),等效ESC键(中止)。(4)几个命令和数据可以写在一个command函数中,也可分开写在两个或两个以上的command函数中。如: (Command “line” p1 p2 p3 p4 “” ) 和 (Command “Pline” p1 p2) (Command p3 p4 “”)等效。9/3/20249/3/20245252(5)文字注记时,字符串也要用“”括起来。

38、如:(Command “Text” (100 100) 5 “” “AutoLISP”)(6)调用对话框命令时,不显示对话框,以提示方式执行。如:新建“控制点”图层,设置图层为红色。(command layer m 控制点 c 1 )9/3/20249/3/20245353举例:画一个边长为L,中心点坐标为P的正三角形,要求底边水平。 (setq L (getrealn输入边长:)(setq P (getpointn输入中心:)(setq r (* 0.288675134 L) ;求内切圆半径12r*r=L*L(command polygon 3 P c R)9/3/20249/3/20245

39、4543.3 3.3 自定义命令和自定义函数自定义命令和自定义函数 一、自定义函数(一、自定义函数(defundefun) 用函数(defun)可以定义用户自己的函数,叫自定义函数。自定义函数象AutoLISP函数一样可以被调用,比如说,把常用的符号定义成自定义函数,实际用时,带入具体参数就可以得到图形,不别再绘制。 9/3/20249/3/202455551. 1. 自定义函数格式自定义函数格式( (defundefun 函数名函数名 变元表变元表 表达式表达式1 1表达式表达式2 2) )例例:用用自自定定义义函函数数方方式式编编写写一个程序,绘制正三角形。一个程序,绘制正三角形。( (d

40、efundefun sjxsjx()()( (setqsetq L ( L (getrealngetrealn输入输入边长边长:):)( (setqsetq P ( P (getpointngetpointn输入输入中心中心:):)( (setqsetq r (* 0.288675134 r (* 0.288675134 L) ;L) ;求内切圆半径求内切圆半径12r*r=L*L12r*r=L*L(command polygon 3 P (command polygon 3 P c R)c R) )9/3/20249/3/202456562.2.注意注意 (1)函数名是用户自己设定的,不能与A

41、utoLISP内部函数名、变量名相同;(2)变元表的形式有四种:v(参数1 参数2),如上例。变元表为此形式 时,调用要带参数。v( ),无参形式。调用时不带参数。 v(参数1 参数2/局部变量1 局部变量2)。变元表为此形式时,调用要带参数。v(/局部变量1 局部变量2)。调用时不带参数。q/ 与参数、局部变量之间必须有空格。 9/3/20249/3/20245757(3)表达式是函数的定义体,完成计算和绘图。( 4) 自 定 义 函 数 的 作 用 : defun函 数 用 于 在AutoLISP程序中定义一个函数。它就象其它标准函数一样,可以为我所用。使用时,通过不同的参数,可以绘制不同

42、的图形。调用自定义函数举例:;度化弧度自定义函数(defun hd(af) (setq hhd(/ (* af pi) 180)9/3/20249/3/20245858( (defundefun hsjxhsjx () () ( (setqsetq L ( L (getrealgetreal n n输入边长输入边长:):) ( (setqsetq P ( P (getpointgetpoint n n输入中心输入中心:):) ( (setqsetq r (* 0.288675134 L) r (* 0.288675134 L) ; ;求内切圆半径求内切圆半径 ( (setqsetq p1 (p

43、olar P ( p1 (polar P (hdhd 210) (* 2 r) 210) (* 2 r) ; ;调用自定义函数调用自定义函数 ( (setqsetq p2 (polar p1 ( p2 (polar p1 (hdhd 0) L) 0) L) ; ;调用自定义函数调用自定义函数 ( (setqsetq p3 (polar p1 ( p3 (polar p1 (hdhd 60) L) 60) L) ; ;调用自定义函数调用自定义函数 (command line p1 p2 p3 c)(command line p1 p2 p3 c) )9/3/20249/3/20245959二、自

44、定义命令二、自定义命令 自定义命令的作用是用defun函数为AutoCAD增加各种新命令。 1.1.格式格式( (defundefun C:() C:() 1 2) )或或( (defundefun C:(/ C:(/)2) 1 2) )9/3/20249/3/202460602.注意事项(1)自定义命令格式中是命令名称;必须有C:(大小写等效);与C:之间不能有空格。(2)不能和内部或外部函数名相同;也不能和其它命令同名。 (3)注意与自定函数的区别。 3. 自定义命令调用加载(load)程序后,在命令行上输入自定义命令名。 9/3/20249/3/20246161例.编写计算三角高程的Au

45、toLISP程序。程序清单如下:;计算三角高程(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)9/3/20249/3/20246262; ;把度分秒化成弧度把度分秒化成弧度( (defundefun hdhd()()( (setqsetq a ( a (getstringgetstring nAnA:):); ;输入角度

46、(按输入角度(按6.36286.3628形式输入)形式输入)( (condcond (= ( (= (strlenstrlen a) 6) a) 6) ( (setqsetq ad ( ad (substrsubstr a 1 1) a 1 1) ( (setqsetq am ( am (substrsubstr a 3 2) a 3 2) ( (setqsetq as ( as (substrsubstr a 5 2) a 5 2) ) ) (= ( (= (strlenstrlen a) 7) a) 7) ( (setqsetq ad ( ad (substrsubstr a 1 2) a

47、 1 2) ( (setqsetq am ( am (substrsubstr a 4 2) a 4 2) ( (setqsetq as ( as (substrsubstr a 6 2) a 6 2) ) )(= (= (strlenstrlen a) 8) a) 8) ( (setqsetq ad ( ad (substrsubstr a 1 a 1 3)3) ( (setqsetq am ( am (substrsubstr a 5 a 5 2)2) ( (setqsetq as ( as (substrsubstr a 7 a 7 2)2) ) ) ( (setqsetq a1 ( a

48、1 (atofatof ad) ad) ( (setqsetq a2 ( a2 (atofatof am) am) ( (setqsetq a3 ( a3 (atofatof as) as) ( (setqsetq arar (+ a1 (/ a2 (+ a1 (/ a2 60) (/ a3 3600)60) (/ a3 3600) ( (setqsetq ardard (/ (* (/ (* arar pi) pi) 180)180) ( (princprinc ardard) ) ( (princprinc)9/3/20249/3/202463633.4 3.4 程序结构函数程序结构函数

49、程序结构函数用于控制程序的进程,把它叫程序结构函数。包括:关系函数、逻辑函数、谓词函数、条件函数、循环函数。一、关系函数一、关系函数 1.1.等于等于 格式:(= atom1 atom2.) 等于函数(= )判断数是否相等。如果相等则条件为真,返回值为T(真值)。同样,如果不相等,则条件为假,返回值为nil(假值)。 9/3/20249/3/20246464 2.不等于 格式:(/= atom1 atom2.) 不等于函数( / =)判断数是否不相等。如果不相等,则条件为真,返回值为T。 3.小于 格式:( atom1 atom2 .) 小于函数( )判断前一个数( atom1)是否小于后面的

50、作数( atom2),如果小于,则条件为真,返回值为T,否则返回nil。 9/3/20249/3/20246565 4.小于等于 格式:(= atom1 atom2.)小于等于函数( atom1 atom2.)大于函数判断第一个数是否大于第二个数,如果大于,则条件为真,返回值为T,否则返回nil。 6.大于等于 格式:(= atom1 atom2.)9/3/20249/3/20246666二、逻辑函数二、逻辑函数 1.逻辑“与” 格式:(and 表达式1) 这个函数求出表达式之间的“与”运算值,即当所有表达式值同时为T时,函数结果为T,如果其中任何一个表达式值为nil,函数结果为nil。例如:

51、(setq a 10 b 20)(and ( a 5)( b 5)( b 15) 结果为nil9/3/20249/3/20246767 2. 逻辑“或” 格式:(or 表达式1) 这个函数求出表达式之间的“或”运算值,即当所有表达式值同时为nil时,函数结果为nil,如果其中任何一个表达式值为T,函数结果为T。例如:(setq a 10 b 20)(or ( a 15) 结果为nil(or ( b 15) 结果为T9/3/20249/3/20246868 3. 逻辑“非” 格式:(not 数或表达式) 这个函数求出表达式之间的“非”运算值,即当“数或表达式”值为nil时,函数结果为T,否则函数

52、结果为NIL。例如:(setq a 10 b 20 c nil)(not a) 结果为nil(not c) 结果为T(not (or ( a 15) 结果为T(not (or ( b 15) 结果为nil9/3/20249/3/20246969三三、数数据据谓谓词词函函数数和和等等值值谓谓词词函函数数(自自学学)四、条件函数和顺序处理函数四、条件函数和顺序处理函数 1.If1.If函数函数 格式:格式: (If (If 1 2 ) )9/3/20249/3/20247070举例:举例:(1 1) (If (If (= (= 1 1 3) 3) “YES” “YES” “NO”) “NO”) 结

53、结果果为为“NO”NO”(2 2) ( (setqsetq a 15) a 15) (If (and (= a 10)(= a 10)(= a 18) ( (setqsetq d 3) d 3) ( (setqsetq c 10) c 10) ) ) 结果结果D D为为3 3。9/3/20249/3/202471712.cond函数格式:(cond )是逻辑表达式,为一个或多个表达式。执行过程见图。 9/3/20249/3/20247272举例:(setq d 0.3)(cond (and(= d 0.2)(= d 0.5)(= d 1.0)(setq c 9.0) ( d 0.6)(setq

54、 c 9.0)运行结果为C=10。 9/3/20249/3/202473733.progn函数progn函数通常和If函数一道用,来控制计算顺序。格式:(prong 表达式1)举例:举例:( (setqsetq a 15 b 15.0) a 15 b 15.0) ( (if (= a b)if (= a b) ( (princprinc “ “大家好大家好!”)!”) ( (setqsetq a (+ a 1) a (+ a 1) b (+ b 1) b (+ b 1) ) )运运行行结结果果是是:大大家家好好! ! a=15a=15, b=15.0b=15.0( (setqsetq a 15

55、 b 15.0) a 15 b 15.0) ( (if (= a b)if (= a b) ( (prognprogn ( (princprinc “ “大家好大家好!”)!”) ( (setqsetq a (+ a 1) a (+ a 1) b (+ b 1) b (+ b 1) ) ) ) )运运行行结结果果是是:大大家家好好! ! a=16a=16, b=16.0b=16.09/3/20249/3/20247474五、循环函数五、循环函数 有两个循环函数:repeat、while。 1.Repeat函数 格式:(Repeat 数 表达式1)数:必须是正整数。 表达式:是循环体,循环次数由

56、数来决定。最后返回表达式的值。举例:(setq a 10 b 100)(repeat 4(setq a (+ a 10) (setq b (+ b 100) ) 9/3/20249/3/202475752.while函数 格式:(while 表达式1) 执行过程:先计算,若为T,则计算后面若干个表达式(循环体);若为NIL,则退出循环体。举例:按要求画下列图形。 9/3/20249/3/20247676(defun C:HY () (setq P0 (getpoint 圆心1:) (setq R (getreal半径:) (setq L (getreal间距:) (setq a 1) (whi

57、le (= a 4) (command circle P0 R) (setq P0 (polar P0 0 L) (setq a (1+ a) ) )如果要绘制圆如果要绘制圆心的连线与心的连线与x x轴有一夹角轴有一夹角a a,则程序如何则程序如何编?编?9/3/20249/3/20247777附加:设置长度和角度单位附加:设置长度和角度单位 如:长度单位设置十进制、3位小数,角度单位设置十进制的度2位小数、X轴正方向为0度、逆时针方向为正。 用command(command units 2 3 1 2 0 N) units:绘图单位命令; 2:长度十进制单位; 3:3位小数; 1:角度十进制

58、单位; 0:X轴正方向为0度; N:逆时针方向为正。 9/3/20249/3/20247878( (defundefun C:HY () C:HY () ( (setqsetq P0 ( P0 (getpointgetpoint 圆心圆心1:)1:) ( (setqsetq R ( R (getrealgetreal 半径半径:):) ( (setqsetq L ( L (getrealgetreal 间距间距:):) ( (setqsetq n ( n (getintgetint 圆的数量圆的数量:):) ( (setqsetq jdjd (getangle (getangle倾斜角度倾斜角

59、度:):) (command units 2 3 1 2 0 N) (command units 2 3 1 2 0 N) ( (setqsetq a 1) a 1) (while (= a n) (while (= a n) (command circle P0 R) (command circle P0 R) ( (setqsetq P0 (polar P0 P0 (polar P0 jdjd L) L) ( (setqsetq a (1+ a) a (1+ a) ) ) ) )9/3/20249/3/202479793.5 3.5 交互输入函数交互输入函数 getpoint 、getin

60、t 、getreal 、getstring 、getangle 、getdist v(getangle “提示内容”)getangle函数等待用户输入角度。若用户输入一个数,则得到由该数代表的角度值转化为的弧度值。若输入一点,系统提示输入第二点,其结果得到由第一点到第二点构成的向量与X轴正向夹角,单位是弧度。 9/3/20249/3/202480803.63.6系统变量、文件操作和实体访问函数系统变量、文件操作和实体访问函数 一、系统变量函数一、系统变量函数 AutoLISPAutoLISP有两个系统变量函数,用于改变有两个系统变量函数,用于改变( (setvarsetvar ) )或得到或得

61、到( (getvargetvar ) )系统变量的值。系统变量的值。 二、文件操作函数二、文件操作函数 三、实体访问函数三、实体访问函数 9/3/20249/3/20248181练习题练习题一、概念题 1.AutoLISP程序有何特点? 2.填空(1)在表达式(sin af)中,af以_为单位,表达式结果是_数。(2)表达式(rtos 45.23 2 1) 返回值是:_ 。 表达式(rtos 45.235 2 2) 返回值是:_ 。9/3/20249/3/20248282(3)(setq db (DXD 76.543 23.763 56.87)(setq dm (nth 0 db)dm返回值是

62、:_ 。(4)表达式(read “23.5 67.89”)返回值是:_ 。(5)已知x=5,y=8,r=10,调用command函数绘制一个圆,判断下列表达式哪些是错误的,并指出错误原因。 1)(command circle (list x y) r ) 2)(command circle (list x y) r) 3)(command circle (x y) r) 4)(command circle (list x y) r)9/3/20249/3/202483833.写出自定义命令和自定义函数的格式。二、编程应用题 1已知线段AB,C点是线段AB外一点,用自定义函数编写方式,求C点到线段AB的距离。 2. 定义一个求三角形面积的函数。 3. 用自定义命令方式编写建立图层的应用程序。4.已知、点,绘制如图。9/3/20249/3/202484845.设A、1、2、3、B是导线点(坐标已知),编写绘制导线略图的AutoLISP程序(要求绘制用圆圈表示导线点,并注记点号)。9/3/20249/3/20248585

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号