收藏 分销(赏)

程序的流程控制和AutoLISP文件.pptx

上传人:可**** 文档编号:996811 上传时间:2024-04-10 格式:PPTX 页数:27 大小:178.37KB 下载积分:10 金币
下载 相关 举报
程序的流程控制和AutoLISP文件.pptx_第1页
第1页 / 共27页
程序的流程控制和AutoLISP文件.pptx_第2页
第2页 / 共27页


点击查看更多>>
资源描述
3.1 程序的流程控制程序的流程控制AutoLISP程序的流程通过流程控制函数控制。程序的流程通过流程控制函数控制。3.1.1 分支结构分支结构1.(cond(测测试试表表达达式式1 结结果果表表达达式式1)(测测试试表表达达式式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测试表达式测试表达式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 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)该该程程序序段段的的本本意意是是,若若条条件件成成立立,b等等于于2,然然后后打打印印a与与b之之和和,否否则则b等等于于4,然然后后打打印印b。但但是是在在执执行行该该程程序序段段时时,首首先先检检查查if函函数数变变元元的的数数量量,第第1个个变变元元是是测测试试条条件件表表达达式式,它它对对应应表表达达式式(a 1),第第2个个变变元元是是条条件件成成立立时时执执行行的的表表达达式式,它它对对应应表表达达式式(setq b 2),第第3个个变变元元是是条条件件不不成成立立时时执执行行的的表表达达式式,它它对对应应表表达达式式(print (b a),那那么么后后面面的的两两个个表表达达式式就就是是多多余余的的变变元元,因此显示因此显示“too many arguments(变元太多)(变元太多)”的出错信息。的出错信息。若将该程序段改写为以下代码:若将该程序段改写为以下代码:(if(a 1)(setq b 2)(print (b a)(setq b 4)(print b)用括号将条件成立或不成立的多个表达式括起,虽然变元的数量改为3个,但会出现“error:bad function:2”的出错信息。原因是在计算条件成立的表达式时,首先计算内层表(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,然后打印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)其它表达式 (setq i(1+i)执行结果:i等于11,a等于110,返回值为11。例例如如,定定义义求求解解百百钱钱买买百百鸡鸡的的函函数数。题题目目是是若若母母鸡鸡每每只只3个个钱钱,公公鸡鸡每每只只2个个钱钱,小小鸡鸡每每只只0.5个个钱钱。用用100个个钱钱买买100只只鸡鸡,有有几几个个答答案案,每每个个答答案案各各有有几几只只母母鸡鸡、公公鸡鸡和和小小鸡鸡(不不包包括括0只只),打印所求的结果。打印所求的结果。该该例例没没有有合合适适的的计计算算公公式式,只只能能利利用用枚枚举举,试试出出合合适适的的结结果果。首首先先分分析析母母鸡鸡数数量量的的范范围围,如如果果母母鸡鸡等等于于2020,剩剩余余4040个个钱钱。用用剩剩下下的的钱钱至至少少买买1 1只只公公鸡鸡之之后后,可可以以买买7676只只小小鸡鸡,但但鸡鸡的的总总数数为为9797(小小于于100100),所所以以母母鸡鸡的的数数量量应应小小于于2020。同同样样,买买了了至至少少1 1只只母母鸡鸡和和3232只只公公鸡鸡之之后后,剩剩余余的的3333个个钱钱最最多多买买6666小小鸡鸡,鸡鸡的的总总数数为为9999(小小于于100100),所所以以公公鸡鸡的的数数量量应应小小于于3232。小小鸡鸡的的数数量量只只能能是是100100减减去去母母鸡鸡与与公公鸡鸡之之和和。当当公公鸡鸡的的数数量量和和钱钱数数都都等等于于100100时时,打打印这组解。印这组解。【例例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 chick(-100 hen cock)(setq chick(-100 hen cock);小鸡的数量小鸡的数量 (setq cost(+(*3 hen)(*2 cock)(*0.5 chick)(setq cost(+(*3 hen)(*2 cock)(*0.5 chick);3 3种鸡的钱数种鸡的钱数 (if(=cost 100)(if(=cost 100)(print(list (print(list 母鸡母鸡=hen =hen 公鸡公鸡=cock =cock 小鸡小鸡=chick)=chick)(setq cock(1+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提提供了文本格式编排器,可以将随意书写的程序更新供了文本格式编排器,可以将随意书写的程序更新为缩进格式的程序。为缩进格式的程序。3.3.2 程序中的注释程序中的注释 注注释释可可增增加加程程序序的的可可读读性性,不不仅仅便便于于对对程程序序的的阅阅读读和和调调试试,也便于对程序的维护、移植和扩充。也便于对程序的维护、移植和扩充。注释的形式可以是整行、整段或行间注释。注释的形式可以是整行、整段或行间注释。整整行行或或后后半半行行注注释释以以分分号号“;”开开头头,至至行行尾尾为为注注释释部部分分。例例如如:(setq area(*pi r r);计算圆的面积计算圆的面积整整段段或或行行间间注注释释以以“;|”开开头头,以以“|;”结结尾尾,之之间间可可以以短短到到几几个字符,长到若干行。例如,行间注释:个字符,长到若干行。例如,行间注释:(setq tmode;|此处添加注释此处添加注释|;(getvar tilemode)下面是整段的注释:下面是整段的注释:(setvar orthomode 1);|注释起始部分注释起始部分 连续注释连续注释,.注释到此为止注释到此为止|;(princ nORTHOMODE set On.)【例3-2】定义打印ASCII码为33 90的字符的命令。;该程序打印ASCII码为33 90的字符;在Command:提示下,键入pras(defun c:pras(/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)命令行方式)命令行方式 加载加载AutoLISPAutoLISP文件用文件用loadload函数,调用函数,调用loadload函数的格式函数的格式如下:如下:CommandCommand:(loadload 驱动器驱动器:路径路径文件名文件名 出错信息出错信息)若若加加载载成成功功,返返回回被被加加载载lisplisp文文件件的的最最后后一一个个表表达达式式的的结结果果,若若最最后后一一个个表表达达式式是是函函数数的的定定义义,则则返返回回该该函函数数名名。若若加加载载失失败败,返返回回用用户户定定义义的的出出错错信信息息,若若用用户户没没有有定定义义出出错错信信息息,则则返回返回加载失败的加载失败的信息。信息。例例如如,文文件件fi1e1.lspfi1e1.lsp最最后后一一个个表表达达式式是是定定义义函函数数func1func1,它它的的路径是路径是d:user1d:user1。加载该文件的表达式如下:。加载该文件的表达式如下:CommandCommand:(load(load d:d:user1 user1 fi1e1 fi1e1 没没有有找找到到这这个个文文件!件!)若若加加载载成成功功,返返回回函函数数名名func1func1,否否则则返返回回 没没有有找找到到这这个个文文件件!这个信息。这个信息。如果调用该函数时省略了如果调用该函数时省略了“出错信息出错信息”,例如:,例如:CommandCommand:(load d:/user1/fi1e1)(load d:/user1/fi1e1)若加载成功,返回函数名若加载成功,返回函数名func1func1,否则返回,否则返回;error:LOAD error:LOAD failed:d:user1 fi1e1.failed:d:user1 fi1e1.(2)对话框方式 选择下拉菜单ToolsLoad Application 项,或者选择下拉菜单ToolsAutoLISPLoad项,或者在“Command:”提示下键入appload,通过随后弹出的“Load/Unload Applications”对话框加载AutoLISP文件。3.3.自动加载自动加载 AutoCADAutoCAD在在启启动动时时,可可以以自自动动加加载载acad.lspacad.lsp、acad2006.lspacad2006.lsp、acaddoc.lspacaddoc.lsp和和acad2006doc.lspacad2006doc.lsp四四个个lisplisp文文件件。用用户户可可以以创创建建和和维维护护这这些些文文件件,其其中中acad.lspacad.lsp和和acaddoc.lspacaddoc.lsp只只能能由由用用户户来来创创建建。AutoCADAutoCAD在在加加载载过过程程中中不不报报告告是是否否找找到到或或是是否否加加载载相相关关文文件件的的信信息息。AutoCADAutoCAD在在加加载载菜菜单单时时,自自动动加加载载了了与与菜菜单单文文件同名的扩展名为件同名的扩展名为.mnl.mnl的的lisplisp文件。文件。4.4.间接自动加载间接自动加载 如如果果把把调调用用autoloadautoload函函数数的的表表达达式式写写在在自自动动加加载载的的acad2006doc.lspacad2006doc.lsp等等文文件件内内,在在AutoCADAutoCAD启启动动时时,随随着着acad2006doc.lspacad2006doc.lsp等等文文件件的的自自动动加加载载,被被调调用用的的autoloadautoload函函 数数 还还 可可 以以 加加 载载 一一 些些 lisplisp文文 件件。调调 用用autoloadautoload函数的格式如下:函数的格式如下:CommandCommand:(autoloadautoload lisplisp文件名文件名 命令表命令表)该该函函数数要要求求lisplisp文文件件必必须须在在AutoCADAutoCAD支支持持的的文文件件搜搜索索路路径径下下,命命令令表表列列出出了了在在该该lisplisp文文件件中中定定义义的的部部份份的的AutoCADAutoCAD命命令令名名。无无论论是是否否加加载载成成功功,该该函函数数均均返返回回nilnil。autoloadautoload函函数数与与loadload函函数数的的不不同同之之处处是是,执执行行完完调调用用该该函函数数的的表表达达式式之之后后,AutoCADAutoCAD只只是是记记录录了了被被加加载载的的lisplisp文文件件名名和和相相应应的的命命令令表表,而而lisplisp文文件件本本身身并并没没有有被被加加载载。只只有有等等到到命命令令表表内内的的任任意意一一个个命命令令被被调调用用之之后后,这这个个lisplisp文文件件才才真真正正被被加加载载,这这时时该该lisplisp文文件件所所定定义义的的全全部部AutoCADAutoCAD命命令令才才处处于于可可以以被被调调用用状状态态。也也就就是是说说,如如果果某某个个lisplisp文文件件所所定定义义的的命命令令没没有有被被调调用用,那那么么这这个个lisplisp文文件件就就暂暂时时不不被被加加载载到到内内存存,从从而而节节省省了了内内存存空空间。间。例例如如,文文件件file1.lspfile1.lsp定定义义了了“cmd1cmd1”、“cmd2cmd2”等等多多个个AutoCADAutoCAD命命令令,该该文文件件存存放放在在AutoCADAutoCAD的的supportsupport目目录录下下。用用autoloadautoload加载加载file1.lspfile1.lsp的表达式如下:的表达式如下:CommandCommand:(autoload(autoload file1.lsp file1.lsp(cmd1 cmd1 cmd2cmd2))此此后后如如果果调调用用file1.lspfile1.lsp文文件件定定义义的的命命令令表表之之外外的的命命令令,会会 显显 示示“Unknown Unknown commandcommand(未未 知知 命命 令令).”的的出出错错信信息息,因因为为该该lisplisp文文件件尚尚未未被被真真正正地地加加载载。如如果果调调用用命命令令表表内内的的任任意意一一个个命命令令,例例如如调调用用cmd1cmd1命命令令,file1.lspfile1.lsp文文件件才才被被AutoCADAutoCAD真真正正地地加加载载,随随后该文件定义的所有后该文件定义的所有AutoCADAutoCAD命令均可被调用。命令均可被调用。如如果果将将表表达达式式(autoload(autoload file1.lsp file1.lsp (cmd1 cmd1 cmd2cmd2)),追追加加到到acad2006doc.lspacad2006doc.lsp等等文文件件的的后后面面,即即可在启动可在启动AutoCADAutoCAD时,间接自动地加载了时,间接自动地加载了file1.lspfile1.lsp。
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服