




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第3 3章章 程序的流程控程序的流程控制和制和AutoLISPAutoLISP文件文件 3.1 程序的流程控制程序的流程控制AutoLISP程序的流程通过流程控制函数控制程序的流程通过流程控制函数控制。3.1.1 分支结构分支结构1. (cond (测试表达式测试表达式1 结果表达式结果表达式1) (测试表测试表达式达式2 结果表达式结果表达式2) ) 该函数从第一个子表起,计算每一个子表该函数从第一个子表起,计算每一个子表的测试表达式,直至有一个子表的测试表达式的测试表达式,直至有一个子表的测试表达式成立为止,然后计算该子表的结果表达式,并成立为止,然后计算该子表的结果表达式,并返回这个结
2、果表达式的值。返回这个结果表达式的值。 例如,当例如,当 i 小于等于小于等于1时,时,n=1;小于等于;小于等于2时,时,n=4;小于等于;小于等于3时,时,n=10;其它情况下;其它情况下n=100。用。用cond函数实现变量函数实现变量n和和i 之间以上关之间以上关系的源代码如下:系的源代码如下:测试表达式测试表达式1结果表达式结果表达式1测试表达式测试表达式2结果表达式结果表达式2测试表达式测试表达式n结果表达式结果表达式n成立成立成立成立成立成立不成立不成立不成立不成立不成立不成立测试表达式测试表达式1结果表达式结果表达式1测试表达式测试表达式2结果表达式结果表达式2测试表达式测试表
3、达式n结果表达式结果表达式n成立成立成立成立成立成立不成立不成立不成立不成立不成立不成立T其他)其他)结果表达式结果表达式 (setq n(cond (= i 1) 1) (= i 2) 4) (= i 3) 10) (t 100) ) ) 阐明:该函数类似于C语言的switch语句, 最后一个测试表达式“t或T)”相当于C语言的“default”,指其余的情况,例如i 等于5时,n等于100,也可以缺少这个测试表达式。与C语言switch语句不同的是,若某一测试表达式成立,即返回相应结果表达式的值,不再向下测试。例如,上述表达式中,若i 等于0,已满足第一个测试表达式( a 1) (setq
4、 b 2) ) 该表达式的含义是;如果a 大于 1,则b等于2,否则不作任何计算,求值结束。(if ( a 1) (setq b 2) (setq b 3) ) 该表达式的含义是;如果a 大于 1,则b等于2,否则b等于3,求值结束。留意:该函数最多只有3个变元,即测试条件表达式、表达式1和表达式2。先分析下列程序代码:测试条件测试条件表达式表达式表达式表达式1成立成立表达式表达式2测试条件测试条件表达式表达式表达式表达式1成立成立不成立不成立(if ( a 1) (setq b 2) (print ( b a) (setq b 4) (print b) 该程序段的本意是,若条件成立,该程序段
5、的本意是,若条件成立,b等于等于2,然后打印,然后打印a与与b之之和,否则和,否则b等于等于4,然后打印,然后打印b。但是在执行该程序段时,首先检。但是在执行该程序段时,首先检查查if函数变元的数量,第函数变元的数量,第1个变元是测试条件表达式,它对应表达个变元是测试条件表达式,它对应表达式式( a 1),第,第2个变元是条件成立时执行的表达式,它对应表达个变元是条件成立时执行的表达式,它对应表达式式(setq b 2),第,第3个变元是条件不成立时执行的表达式,它对应个变元是条件不成立时执行的表达式,它对应表达式表达式(print ( b a) ,那么后面的两个表达式就是多余的变元,那么后面
6、的两个表达式就是多余的变元,因此显示,因此显示“too many arguments变元太多)变元太多)”的出错信息。的出错信息。若将该程序段改写为以下代码:若将该程序段改写为以下代码:(if ( a 1) (setq b 2) (print ( b a) ) (setq b 4) (print b) ) 用括号将条件成立或不成立的多个表达式括起,虽然变元的用括号将条件成立或不成立的多个表达式括起,虽然变元的数量改为数量改为3个,但会出现个,但会出现“error: bad function: 2的出错信息的出错信息。原因是在计算条件成立的表达式时,首先计算内层表。原因是在计算条件成立的表达式时
7、,首先计算内层表(setq b 2),将其返回值,将其返回值“2作为外层表的函数名,显然这是一个坏的作为外层表的函数名,显然这是一个坏的函数名。利用函数名。利用progn函数可以很好地解决了本程序段存在的问题函数可以很好地解决了本程序段存在的问题。3. (prong 表达式.) 该函数将n个表达式组合起来,作为if函数的一个表达式。在执行时,按顺序计算n个表达式,返回最后一个表达式的计算结果。例如:(if ( a 1) (progn (setq b 2) (print ( b a) ) (progn (setq b 4) (print b) ) 该程序段的执行过程是,若条件成立,b等于2,然后
8、打印a与b之和,返回a与b之和;若条件不成立,b等于4,然后打印4,返回4。 3.1.2 循环结构1. (repeat 整数n 表达式 ) 重复执行n次,对所有的表达式求值,返回最后一个表达式的计算结果。例如:(setq a 1 b 100)(repeat 10 (setq a(1+ a) 其它表达式 (setq b(+ 10 b)执行结果:a等于11,b等于200,返回值为200。2. (while 测试式 表达式 ) 若测试结果不为nil,执行各表达式, 直至测试结果为nil。例如:(setq i 1 a 10)(while (= i 10) (setq a(+ a 10) 其它表达式 (
9、setq i (1+ i )执行结果:i等于11,a等于110,返回值为11。 例如,定义求解百钱买百鸡的函数。题目是若母鸡每只例如,定义求解百钱买百鸡的函数。题目是若母鸡每只3个钱个钱,公鸡每只,公鸡每只2个钱,小鸡每只个钱,小鸡每只0.5个钱。用个钱。用100个钱买个钱买100只鸡,有只鸡,有几个答案,每个答案各有几只母鸡、公鸡和小鸡不包括几个答案,每个答案各有几只母鸡、公鸡和小鸡不包括0只)只),打印所求的结果。,打印所求的结果。 该例没有合适的计算公式,只能利用枚举,试出合适的结果。该例没有合适的计算公式,只能利用枚举,试出合适的结果。首先分析母鸡数量的范围,如果母鸡等于首先分析母鸡数
10、量的范围,如果母鸡等于20,剩余,剩余40个钱。用剩个钱。用剩下的钱至少买下的钱至少买1只公鸡之后,可以买只公鸡之后,可以买76只小鸡,但鸡的总数为只小鸡,但鸡的总数为97小于小于100),所以母鸡的数量应小于),所以母鸡的数量应小于20。同样,买了至少。同样,买了至少1只母只母鸡和鸡和32只公鸡之后,剩余的只公鸡之后,剩余的33个钱最多买个钱最多买66小鸡,鸡的总数为小鸡,鸡的总数为99小于小于100),所以公鸡的数量应小于),所以公鸡的数量应小于32。小鸡的数量只能是。小鸡的数量只能是100减去母鸡与公鸡之和。当公鸡的数量和钱数都等于减去母鸡与公鸡之和。当公鸡的数量和钱数都等于100时,打
11、印时,打印这组解。这组解。【例【例3-13-1】解百钱买百鸡程序】解百钱买百鸡程序(defun chicken( / hen cock chick cost)(defun chicken( / hen cock chick cost) (setq hen 1) (setq hen 1) (while ( hen 20) (while ( hen 20);母鸡的数量不超过;母鸡的数量不超过2020 (setq cock 1) (setq cock 1) (while ( cock 32) (while ( cock 32);公鸡的可能数量不超过;公鸡的可能数量不超过3232 (setq chic
12、k (- 100 hen cock) (setq chick (- 100 hen cock);小鸡的数量;小鸡的数量 (setq cost (+ (setq cost (+ (* * 3 hen)( 3 hen)(* * 2 cock)( 2 cock)(* * 0.5 chick) 0.5 chick);3 3种鸡的钱数种鸡的钱数 (if (= cost 100)(if (= cost 100) (print (list (print (list 母鸡母鸡= hen = hen 公鸡公鸡= cock = cock 小鸡小鸡= = chick)chick) ) ) (setq cock (1
13、+ cock) (setq cock (1+ cock);公鸡的数量加;公鸡的数量加1 1 ) ) (setq hen (1+ hen) (setq hen (1+ hen) ;母鸡的数量加;母鸡的数量加1 1 ) )(princ)(princ);静默退出;静默退出) )阐明: 程序的第3行(setq hen 1)不可缺少,否则第4行(while ( x 0) 1) (= x 0) 2) ( x 0) 1)(= x 0) 2)( x 0) 0) 显然后者便于程序的阅读和调试。显然后者便于程序的阅读和调试。Visual LISP提提供了文本格式编排器,可以将随意书写的程序更新供了文本格式编排器,
14、可以将随意书写的程序更新为缩进格式的程序。为缩进格式的程序。 3.3.2 程序中的注释程序中的注释 注释可增加程序的可读性,不仅便于对程序的阅读注释可增加程序的可读性,不仅便于对程序的阅读和调试,也便于对程序的维护、移植和扩充。和调试,也便于对程序的维护、移植和扩充。注释的形式可以是整行、整段或行间注释。注释的形式可以是整行、整段或行间注释。整行或后半行注释以分号整行或后半行注释以分号“;”开头,至行尾为注释部开头,至行尾为注释部分。例如:分。例如:(setq area (* pi r r) ; 计算圆的面积计算圆的面积整段或行间注释以整段或行间注释以“;|”开头,以开头,以“|;”结尾,之间
15、可结尾,之间可以短到几个字符,长到若干行。例如,行间注释:以短到几个字符,长到若干行。例如,行间注释:(setq tmode ;|此处添加注释此处添加注释|; (getvar tilemode)下面是整段的注释:下面是整段的注释:(setvar orthomode 1) ;|注释起始部分注释起始部分 连续注释连续注释, . . . . . . 注释到此为止注释到此为止|; (princ nORTHOMODE set On.) 【例3-2】定义打印ASCII码为33 90的字符的命令。;该程序打印ASCII码为33 90的字符;在Command:提示下,键入pras(defun c:pras(/
16、 as );定义pras为AutoCAD命令,as为局部变元 (setq as 33);设置as为第一个ASCII码33 (while(= as 90) ;while循环开始 (princ(chr as) ;打印ASCII码的为as的字符 (terpri) ;换新行 (setq as (1+ as);设置as为as 的下一个ASCII码 ) ;while循环结束);命令定义结束3.2.3 在在AutoCAD环境下加载环境下加载AutoLISP文件文件 (1命令行方式命令行方式 加载加载AutoLISP文件用文件用load函数,调用函数,调用load函数函数的格式如下:的格式如下: Comman
17、d:(load 驱动器驱动器:途径途径文件名文件名 出错信息出错信息) 若加载成功,返回被加载若加载成功,返回被加载lisp文件的最后一个文件的最后一个表达式的结果,若最后一个表达式是函数的定表达式的结果,若最后一个表达式是函数的定义,则返回该函数名。若加载失败,返回用户义,则返回该函数名。若加载失败,返回用户定义的出错信息,若用户没有定义出错信息,定义的出错信息,若用户没有定义出错信息,则返回加载失败的信息。则返回加载失败的信息。 例如,文件例如,文件fi1e1.lspfi1e1.lsp最后一个表达式是定义函数最后一个表达式是定义函数func1func1,它的,它的路径是路径是d:user1
18、d:user1。加载该文件的表达式如下:。加载该文件的表达式如下:CommandCommand:(load d: user1 fi1e1 (load d: user1 fi1e1 没有找到这个文没有找到这个文件!件! ) )若加载成功,返回函数名若加载成功,返回函数名func1func1,否则返回,否则返回 没有找到这个文件没有找到这个文件! 这个信息。这个信息。如果调用该函数时省略了如果调用该函数时省略了“出错信息出错信息”,例如:,例如:CommandCommand:(load d:/ user1/fi1e1)(load d:/ user1/fi1e1) 若加载成功,返回函数名若加载成功,
19、返回函数名func1func1,否则返回,否则返回; error: LOAD ; error: LOAD failed: d: user1 fi1e1. failed: d: user1 fi1e1. (2对话框方式 选择下拉菜单ToolsLoad Application 项,或者选择下拉菜单ToolsAutoLISPLoad项,或者在“Command:”提示下键入appload,通过随后弹出的“Load/Unload Applications对话框加载AutoLISP文件。 3. 自动加载自动加载 AutoCAD在启动时,可以自动加载在启动时,可以自动加载acad.lsp、acad2019.
20、lsp、acaddoc.lsp和和acad2019doc.lsp四个四个lisp文件。用户可以文件。用户可以创建和维护这些文件,其中创建和维护这些文件,其中acad.lsp和和a c a d d o c . l s p 只 能 由 用 户 来 创 建 。只 能 由 用 户 来 创 建 。AutoCAD在加载过程中不报告是否找到在加载过程中不报告是否找到或是否加载相关文件的信息。或是否加载相关文件的信息。AutoCAD在加载菜单时,自动加载了与菜单文件在加载菜单时,自动加载了与菜单文件同名的扩展名为同名的扩展名为.mnl的的lisp文件。文件。 4. 4. 间接自动加载间接自动加载 如果把调用如
21、果把调用autoloadautoload函数的表达式写在自动加载函数的表达式写在自动加载的的acad2019doc.lspacad2019doc.lsp等文件内,在等文件内,在AutoCADAutoCAD启动时,随启动时,随着着acad2019doc.lspacad2019doc.lsp等文件的自动加载,被调用的等文件的自动加载,被调用的autoloadautoload函数还可以加载一些函数还可以加载一些lisplisp文件。调用文件。调用autoloadautoload函数的格式如下:函数的格式如下:CommandCommand:(autoload lisp(autoload lisp文件名
22、文件名 命令表命令表) ) 该函数要求该函数要求lisplisp文件必须在文件必须在AutoCADAutoCAD支持的文件搜支持的文件搜索路径下,命令表列出了在该索路径下,命令表列出了在该lisplisp文件中定义的部份文件中定义的部份的的AutoCADAutoCAD命令名。无论是否加载成功,该函数均返命令名。无论是否加载成功,该函数均返回回nilnil。 autoload autoload函数与函数与loadload函数的不同之处是,执行完调用该函函数的不同之处是,执行完调用该函数的表达式之后,数的表达式之后,AutoCADAutoCAD只是记录了被加载的只是记录了被加载的lisplisp文
23、件名和文件名和相应的命令表,而相应的命令表,而lisplisp文件本身并没有被加载。只有等到命令文件本身并没有被加载。只有等到命令表内的任意一个命令被调用之后,这个表内的任意一个命令被调用之后,这个lisplisp文件才真正被加载文件才真正被加载,这时该,这时该lisplisp文件所定义的全部文件所定义的全部AutoCADAutoCAD命令才处于可以被调命令才处于可以被调用状态。也就是说,如果某个用状态。也就是说,如果某个lisplisp文件所定义的命令没有被调文件所定义的命令没有被调用,那么这个用,那么这个lisplisp文件就暂时不被加载到内存,从而节省了内文件就暂时不被加载到内存,从而节省了内存空间。存空间。 例如,文件例如,文件file1.lspfile1.lsp定义了定义了“cmd1”cmd1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 主材定金合同样本
- 海堤施工企业制定与实施新质生产力战略研究报告
- 轨道交通隧道状态监测和预警系统行业跨境出海战略研究报告
- 琉璃瓦企业制定与实施新质生产力战略研究报告
- 铁路车辆车身及其零件行业直播电商战略研究报告
- 饼干喷油机行业跨境出海战略研究报告
- 内场销售合同标准文本
- 养老院入院合同样本
- 农村短期租房合同标准文本
- 住建部购房合同标准文本
- 青岛市李沧区教育系统招聘中小学教师笔试真题2024
- 福建省部分地市2025届高中毕业班4月诊断性质量检测英语试题(含答案无听力音频无听力原文)
- 急诊护理人文关怀成效汇报
- 2024北京中学高二(下)期中数学试题及答案
- 电力技术监督专责人员上岗资格考试题库汽轮机技术监督分册
- 榜样的力量有一种力量叫榜样的力量课件
- 防控医疗纠纷课件
- 搅拌站的施工方案
- 陕西省扶风县法门小学-小学班主任带班方略【课件】
- 2024年司法考试完整真题及答案
- 雷雨-剧本原文-高中语文雷雨剧本原文
评论
0/150
提交评论