当前位置:文档之家› AutoLISP基础入门案例,很受用精编版

AutoLISP基础入门案例,很受用精编版

单元一:AutoLISP主角潇洒登场一. AutoLISP 是何方神圣?1.AutoLISP是AutoCAD的最佳拍檔!2.AutoLISP内含于AutoCAD软件内,不用另外花钱买!3.AutoLISP是强化AutoCAD最好、最直接的『程序语言』!4.AutoLISP易学、易用,即使不会程序设计的AutoCAD使用者,都能在最短的时间内,写出令人惊讶、赞叹的功能!5.若说AutoLISP的出现,是替AutoCAD 创造一片天的『最大功臣』,实不为过一点也不夸张!6.AutoLISP希望您去学习它、改善它、发挥它、享受它.真的!它的威力、魅力无穷!二. AutoLISP 程序语言的特质分析:学习AutoLISP是非常容易的,对初学者而言,即使没有学习过任何的程序语言,都能很快的上手,写出精彩漂亮的AutoLISP程序!三.撰写AutoLISP 的动机?1.欲强化AutoCAD 原有指令时.2.欲创造更有用的AutoCAD 新指令.3.欲简化繁琐的环境设定或绘图步骤时.4.欲处理参数式绘图时.5.欲做图面资料读文件、写文件.6.欲做AutoCAD 简报展示时.7.欲达到真正灵活掌控AutoCAD 时.8.欲提升自己跨上AutoCAD 高手列车时.四.AutoLISP 的效益评估?1. 对公司负责人或设计主管而言:A.也许某员工或干部花了20个小时撰写一个AutoLISP程序,表面上,这将近三天的时间,他连一张图都没有画,甚至可能偶有发呆、沈思,若此程序一天可以替公司绘图部门节省1小时绘图时间,那算一算,只要20天就抵销开发成本,而20天以后都是赚的,『用的愈久,省的愈多』!B.若员工皆有此动力,在不影响正常工作,『鼓励』都来不及,那有『压抑』的道理,甚至还要派遣优秀人员出去受训,学习更好的设计技巧与创意呢?!C.千万不要因为您的不懂或压抑,SHOW您的权威与POWER,如此,不但对员工造成打击,甚至您可能成为阻碍了公司计算机化进步的罪魁祸首D.当然,若要撰写的程序很多,内部设计人员的程序功力距离太远,达成需求的时间反而变得遥遥无期,那倒不如求助于市面上已有的相关AutoCAD 支持软件。

2. 对设计人员而言:3.对程序本身而言:A.少少的几行,却可能有『大大满意』的时候B.充份掌握了控制、创造AutoCAD 的『尚方宝剑』,让您在AutoCAD 的设计运作中『得心应手』,享受无比的快乐与成就感五.如何有效的学习AutoLISP ?1.先由小程序着手,认识AutoLISP语法规定!2.浏览所有的AutoLISP功能函数,重要的功能函数要熟记脑海,俗语说的好『一回生,二回熟』,除非您不用心,否则没有学不好的道理3.要懂得偷懒:不要认为在绘图的过程中,繁琐的步骤是合理的,困难的绘图过程是必须忍耐的,试着用AutoLISP解决看看!4.多观摩别人的程序设计,吸取精华,像海棉一样=>『吸』、『吸』、『吸』5.动手『写』程序比用眼睛看程序,更能够领略深记脑海!6.随时随地整理您的程序,并加以批注,以免因时间的飞逝,当时用心的成果也烟消云散,忘的一乾二净7.『决心』是学好AutoLISP 最重要的关键!8.期许自己,要由操作者变成创造者单元二:AutoLISP的关键、基本结构及语法一、学好AutoLISP 的关键、基本结构与语法:1. AutoLISP 程序语言的特质A.语法简单B.功能函数强大C.撰写的环境不挑剃D.直译式程序,『即写即测、即测即用』E.横跨AutoCAD 各作业平台,悠然自得(注:以上五点,读者可以参考上一章的剖析)2.学好AutoLISP 的关键:充份掌握『语法结构』&『功能函数』的搭配3.重要的AutoLISP 的基本语法结构规则1:以括号组成表达式,、相对称左右括号数一定要成双成对规则2:表达式型态:(操作数运算子运算子运算子)1.1 操作数包括『功能函数』&『自定函式』1.2 运算子(自变量)包括:A.整数(Integer) 如8,-17,500,9999 .....B.实数(Real) 如8.5,-17.456 .....C.字符串(String) 如"AutoCAD","123"D.串行(List) 如("a" "b" "c"),(x y)E.像素名称代码如<entity name: 6000f262>F.档案代码如<file:#12438>.....G.选择群集代码如<Selection set:1>规则3:表达式中的『运算子』,可以是另一『表达式』或『子程序』规则4:多重的括号表达式,运算的先后顺序是『由内而外、由左而右』规则5:以档案型态存在的AutoLISP 程序(ASCII 档案),其扩展名必须是.lsp规则6:撰写的环境,只要是一般的文书编辑软件、记事本,可编辑ASCII 档案者都适用规则7:以defun 功能函数定义新的指令或新的功能函式规则8:新定义的功能函式名称,若为『C:函式名』,则此函式可为AutoCAD新指令规则9:加载AutoLISP 程序的作法:=> 指令:后直接键入(load "LISP主檔名")规则10:AutoLISP 程序中,在『分号;』后的内容均为批注,程序不处理,适时的增加批注,将使程序更具可看性、学习性及完整性规则11:AutoLISP 最常用的变量型态是『整数』、『实数』、『字符串』、『点串行』四种,变量的型态依据设定值而自动定义,变量会一直储存该值,直到被重新设定值或绘图结束自动消失规则12:以setq 功能函数设定变量值(setq 变量名称设定值)规则13:欲在AutoCAD 的环境中,查看一变量值,指令:下键入『!变量名』即可规则14:以(defun C:函式名(自变量/ 变数) ........)程序中,程序中的变量若在『/』右边变量内,则称为『区域变量』,否则为『整体变量』二、学好AutoLISP 的关键:充份掌握『语法结构』&『功能函数』的搭配其时这个关键亦是学习其它程序语言的关键.•『语法结构』AutoLISP 的语法结构规定的并不多,变量不用事先定义及宣告,读者可熟记下一单元有关重要的AutoLISP基本语法结构,十四条设计上要求的『规则』•『功能函数』AutoLISP 之所以能功能如此强大,都有赖功能函数,其成员共约200个:1.一般性函数170个2.ADS 定义特殊函数9个3.配合DCL 交谈框设计函数22个各功能函数在使用上要求配合的运算子(自变量)型态,均有其规定,当然,您可不能乱给!例如:指令:(+ 1 2 3 "ABC")传回:error : bad argument type (自变量型态错误)因为『+』函数不接受字符串,而"abc" 正是字符串指令:(rtos "abc")传回:error : bad argument type (自变量型态错误)因为『rtos』函数只接受实数转字符串详细内容可参考下一章『快速浏览AutoLISP 功能函数』至于各功能函数详细的语法与实例应用,读者请参阅本书『第三篇AutoLISP功能函数详解』三、重要的AutoLISP 的基本语法结构:规则1:以括号组成表达式,左右括号数一定要成双成对、相对称请依序在『指令:』列(或指令:) 后面直接键入以下表达式指令:(+ 1 2 3 4 5) 传回加总和15指令:(max 14.5 8.9 35) 传回最大值35指令:(menucmd "p1=*") 显示拉下POP1指令:(getint "Enter Real:") 传回Enter Real:要求输入一个实数指令:(setq a (* 12.5 4)) 传回相乘值50,同时设定给『变量a』指令:!a 回应50 (注:! 号可用来查询变数值)指令:(min 75 a 63) 响应最小值50 (因为变量值a代表50)错误的范例:指令:(setq a (* 12.5 4)1> 传回1>表示少了一个括号1> ) 此时,只要再补上一个) 即可指令:(setq a (* 12.5 42> 传回2>表示少了二个括号2> )) 此时,只要再补上二个) 即可规则2:表达式型态(操作数运算子运算子运算子...)或(函数(式) 自变量自变量自变量...)或(函数(式) 元素元素元素...)1.1 操作数包括『功能函数』&『自定函式』功能函数:如上练习中的+、max、menucmd、getint、setq、*、min,详细内容可参考下一章『快速浏览AutoLISP 功能函数』&『第三篇AutoLISP功能函数详解』自定函式:由设计者自行定义的新函式或子程序1.2 运算子(又称自变量或元素)包括:A.整数(Integer): 如8,-17,500,9999…正常范围: 2的16次方,介于-32768与+32767之间特殊范围:若以float 函数将其转为实数,则范围2的32次方, 介于-2147483648与+2147483647之间B.实数(Real): 如8.5,-17.456…正常范围:带有小数点的数,精度可达14 位有效数字C.字符串(String): 如"AutoCAD","123","Enter Real:","7.5",…正常范围:以双引号内夹『字符』为认定,字符数不受限制D.串行(List): 如("a" "b" "c"),(x y),(x y z),("a" 8 3.5),....正常范围:以左右括号内夹『元素』为认定,元素型态非常弹性使用频率:在AutoLISP 程序设计中应用非常高范例说明: ("a" 8 3.5 kk (1 2))表示此串行内有五个元素"a"表示字符串a、8表示整数8、3.5表示实数3.5、kk表示变量kk、(1 2)表示串行(1 2)2D 点坐标(x y) 表示法=> 以二实数形成串行3D 点坐标(x y z) 表示法=> 以三实数形成串行E.像素名称代码:如<entity name: 6000f262> ...使用范围: AutoCAD 会自动赋予像素指向代码,透过此代码可找到像素的数据库记录范例说明: (setq en (entlast))传回<entity name: 60000062>(entget en) 可找到像素的数据库串行F.档案代码: 如<file:#12438>…使用范围:开启(open)档案作读档(r)、写档(w)使用时,所产生的代码,如下:范例说明:(setq ffr (open "test.txt" "r")) 回应<file:#24138>(setq ffw (open "abc.txt" "w")) 回应<file:#34812>G.选择群集代码: 如<Selection set:1>、<Selection set:1>…使用范围:一个或数个像素所形成的选择集范例说明:(setq ss (ssget))选取对象: (可选择物体)选取对象: (可选择物体)选取对象: (按[ENTER] 键)回应<Selection set:1>规则3:表达式中的『运算子』,可以是另一『表达式』或『子程序』功能函数使用语法:(strcat 字符串1 字符串2 字符串3 ....) 字符串结合功能函数(getstring 提示) 要求键入一个字符串(rtos 实数) 将实数转换成字符串范例说明1: (strcat "abc" "123" "LISP") 传回:"abc123LISP"范例说明2: (strcat "abc" (getstring "Enter String:" ) (rtos 123.45))执行结果: Enter String: 键入任一字符串,假设是键入*HELLO*回应"abc*HELLO*123.45"本例中的strcat函数在语法中要求的『运算子』必须是『字符串』型态『运算子1』= "abc" 是正常的字符串运算子『运算子2』= 表达式(getstring "Enter String:") 传回结果是一字符串"*HELLO*"『运算子3』= 表达式(rtos 123.45) 传回结果是一字符串"123.45"规则4:多重的括号表达式,运算的先后顺序是『由内而外、由左而右』范例说明:请将10.25 + 17 - 13.2 / 7的结果,设定给变量kk,并转换成AutoLISP 的表达式解法技巧A:1:运用『二分法、加括号』:(10.25 + 17) - (13.2 / 7)2:操作数往前提:kk = (- (10.25 + 17) (13.2 / 7))3:操作数再往前提:kk = (- (+ 10.25 17) (/ 13.2 7))4:转换完成:(setq kk (- (+ 10.25 17) (/ 13.2 7)))解法技巧B:1:运用『二分法、加括号』:(10.25 + (17 - (13.2 / 7)))2:操作数往前提:kk = (+ 10.25 (17 - (13.2 / 7)))3:操作数再往前提:kk = (+ 10.25 (- 17 (/ 13.2 7)))4:转换完成:(setq kk (+ 10.25 (- 17 (/ 13.2 7))))规则5:以档案型态存在的AutoLISP程序(ASCII档案),其扩展名必须是.LSP规则6:撰写的环境,只要是一般的文书编辑软件,可编辑ASCII 档案者都适用如:PE2、PE3、DW3、书中仙、汉书、EDIT、记事本....等规则7:以defun 功能函数定义新的指令或新的功能函式(注:自变量及区域变量可省略)程序结构型态:(defun 函式名称(自变量/区域变量): :: : 程序内容: :)规则8:新定义的功能函式名称,若为『C:函式名』,则此函式可为AutoCAD 新指令(注:自变量及区域变量可省略)程序结构型态:(defun C:KK(自变量/区域变量): :程序内容: :: :)则加载此LISP 程序后,可在指令: 后直接键入新定义的KK 指令规则9:加载AutoLISP程序的作法:指令:后直接键入(load "LISP主檔名")注:load 与字符串间的空格,可有可无注:load 与双引号间的空格,可有可无(load"LISP主檔名")范例:在c:\lsptools 目录下有一LISP程序tt.lsp,而您目前的工作目录在c:\dwg 下•若『环境设定』之『支持档案搜寻路径』有指定到c:\lsptools目录,则欲使用加载tt.lspà指令:后键入(load "tt") 即可•若『环境设定』之『支持档案搜寻路径』无指定到c:\lsptools目录,则键入(load"tt") 后,会出现错误讯息如下:无法开启「tt.lsp」做输入错误: 载入失败(LOAD "tt")*取消*此时您可键入:指令:(load "c:\\lsptools\\tt") 或指令:(load "c:"/lsptools/tt)不可键入: (load "c:\lsptools\tt")因为『\』在AutoLISP 结构语法中已经用于『跳脱码控制』了规则10:AutoLISP 程序中,在『分号;』后的内容均为批注,程序不处理,适时的增加批注,将使程序更具可看性、学习性及完整性规则11:AutoLISP 最常用的变量型态是『整数』、『实数』、『字符串』、『点串行』四种,变量的型态依据设定值而自动定义,变量会一直储存该值,直到被重新设定值或绘图结束自动消失规则12:以setq 功能函数设定变量值(setq 变量名称设定值)范例:(setq a 100) ;变量a 值设定成整数100(setq b 123.56) ;变量b值设定成实数123.56(setq c "Good morning") ;变量c 值设定成字符串(setq pt1 (getpoint "Enter POINT:")) ;变量pt1 值设定成点串行(setq pt2 (list a b));此时,a值是100,b值是123.56变量pt2值设定成点串行(100 123.56)(setq pt3 '(297 210)) ;变量pt3 值设定成点串行(297 210)注意: 直接设定成点串行时,不能省略单引号『'』否则会被误认(297 210)又是一个表达式, 297是操作数而出错!规则13:欲在AutoCAD 的环境中,查看一变量值,指令:下键入『!变量名』即可范例:指令:(setq aa (+ 100 75)) 传回:175指令:!aa 传回:175指令:(setq pp (list 90 50)) 传回:(90 50)指令:!pp 传回:(90 50)指令:!ww 传回:nil 空值无设定规则14:以(defun C:函式名(自变量/ 变数) ........)程序中,程序中的变量若在『/』右边变量内,则称为『区域变量』,否则为『整体变量』(注:在AutoLISP 中,未赋予值的变量,其值皆响应nil)『区域变量』于此程序执行完毕后,其值自动消失『整体变量』于此程序执行完毕后,其值仍然存在范例: test.lsp 内容如下(defun c:tt(/ sa sb sc)(setq sa 100)(setq sb 20)(setq sc 10)(setq sd (+ sa sb sc)))回到:指令:键入(load"tt") 传回:c:tt指令:tt 传回:130指令:!sa 传回:nil (属区域变量)指令:!sb 传回:nil (属区域变量)指令:!sc 传回:nil (属区域变量)指令:!sd 传回:130 (属整体变量)单元三:快速分类浏览AutoLISP功能函数(一)一?看到以下那么多的AutoLISP 功能函数,洋洋洒洒17大类:1.您第一个念头,一定惊讶怎么会那么多,您可能快吓坏了!2.您第二个念头,一定会想『那么多,怎么记得下来』,您可能快放弃了!二?其实,您应该要『很兴奋』而『充满信心』的,怎么说呢?1.您有那么多的『大将』协助您撰写AutoLISP 程序,当然左右又逢源,不但轻松, 而且要快乐的不得了2.这些函数只要您先浏览有印象, 要用时,再翻查该函数,了解用途语法再加入到您的程序中就可以了3.常用的函数,写久、用久后,自然会深深牢记脑海,想忘都很难,不常用的函数, 若硬要您记下来,相信连高手都很困难,更何况是初学的您4.您不用再摸不着头绪了,因为您幸运的拥有了本书,就是您成功的开始第一类数学运算功能函数第二类检验& 逻辑运算功能函数第三类转换运算功能函数第四类串行处理功能函数第五类字符串、字符、档案处理功能函数第六类等待输入功能函数第七类几何运算功能函数第八类像素处理功能函数单元四:快速分类浏览AutoLISP功能函数(二)第九类选择集、符号表处理功能函数第十类AutoCAD 相关查询、控制功能函数第十一类判断式、循环相关功能函数第十二类函数处理、定义、追踪& 错误处理功能函数第十三类显示、打印控制功能函数第十四类符号、元素、表示式处理功能函数第十五类ADS、AutoLISP 加载与释放函数第十六类内存空间管理函数单元五:轻松快速的掌握AutoLISP设计技巧一、AutoLISP 程序设计的四个步骤:1.第一步骤:产生写程序的动机、预期目标2.第二步骤:构思程序流程、所需之LISP功能函数、相关变量订定&提示讯息3.第三步骤:利用文书软件(如记事本) 撰写xxx.lsp程序4.第四步骤:回到AutoCAD下,加载AutoLISP程序以(load"LSP主檔名") 或(load "LSP主檔名")5.第五步骤:执行新的AutoLISP 指令二、透过简单范例全程演练AutoLISP:1.第一步骤:动机、预期目标如图: 希望能在输入『左下角点』、『矩形宽』、『矩形高』后,自动的将图形依所给的条件画出,如此一来,尔后画这个图就轻松愉快了!2.第二步骤:构思程序相关变量订定(如下图)•定出程序名为pbox.lsp•构思程序流程、相关变量:变量名称可自行设定(如pa、ww、hh、pb、pc、pd、mp1、mp2、mp3、mp4),掌握三个原则:不可重复好记不会混淆适时的以分号『;』加上批注(defun c:pbox();以下pa、ww、hh 值须由使用者输入(setq pa (请求输入左下角点))(setq ww (请求输入矩形宽度实数值))(setq hh (请求输入矩形高度实数值));以下pb、pc、pd值须由程序依据pa、ww、hh求出(setq pb (依据相对极坐标法求出pb点坐标值))(setq pc (依据相对极坐标法求出pc点坐标值))(setq pd (依据相对极坐标法求出pd点坐标值));以下依据pa、pb、pc、pd 点画矩形(以pline指令画出矩形);以下mp1、mp2、mp3、mp4值须由程序依据pa、ww、hh;& pb、pc、pd 值求出(setq mp1 (求出mp1 点坐标值))(setq mp3 (求出mp3 点坐标值))(setq mp2 (求出mp2 点坐标值))(setq mp4 (求出mp4 点坐标值));以下依据mp1、mp2、mp3、mp4 点画出二条线(以line 指令画出mp1 到mp3 的线)(以line 指令画出mp2 到mp4 的线))本程序所需的AutoLISP功能函数及其用法(getpoint [基点] [提示]) <-- 请求输入一个点坐标(getreal [提示]) <-- 请求输入一实数(polar 基点弪度距离) <-- 依极坐标法取得另一坐标点其中『弪度值』之转换为:(command "AutoCAD 指令" ...) <--呼叫执行AutoCAD 指令注意:指令及其副选项皆要用双引号处理假设pa、pb、pc、pd 皆为变量,其值为点坐标正确:(command "pline" pa pb pc pd "c")错误:(command pline pa pb pc pd c)原因:指令pline 及其副选项 c 皆没用双引号括住错误:(command "pline" pa pb pc pd c)原因:副选项c (代表close) 没用双引号括住,会被误认为是AutoLISP的变量名,但事实又没有c 这个变数错误:(command "pline" "pa" "pb" "pc" "pd" "c")原因:变数pa、pb、pc、pd 不须用双引号括住注意:副选项中,若使用"" ,连续二个双引号,代表按[ENTER] 键若想画一条pa 到pc 的LINE & 一条pb 到pd 的LINE 正确:(command "line" pa pc "")(command "line" pb pd "")错误:(command "line" pa pc)(command "line" pb pd)其它相关接近的功能函数...(getdist [基点] [提示])✍请求输入一段距离(getint [提示])✍请求输入一整数值(getcorner 基点[提示])✍请求输入另一矩框对角点坐标(car 串行) ∙ ✍传回:串行中的第一个元素通常用来求x坐标(cadr 串行)∙∙ ✍传回:串行中的第二个元素通常用来求y 坐标(caddr 串行)∙ ✍传回:串行中的第三个元素通常用来求z坐标3.第三步骤:利用PE2、CE 或记事本,撰写PBOX.LSP 程序并储存到C:\LISPTOOL目录下(defun c:pbox();以下pa、ww、hh 值须由使用者输入(setq pa (getpoint "Enter Left/Low Point:"))(setq ww (getreal "Width:"))(setq hh (getreal "Height:"));以下pb、pc、pd值须由程序依据pa、ww、hh求出(setq pb (polar pa 0 ww))(setq pc (polar pb (/ pi 2) hh))(setq pd (polar pc pi ww));以下依据pa、pb、pc、pd 点画矩形(command "pline" pa pb pc pd "c");以下mp1、mp2、mp3、mp4值须由程序依据pa、ww、hh;& pb、pc、pd 值求出(setq mp1 (polar pa 0 (/ ww 2)))(setq mp2 (polar pb (/ pi 2) (/ hh 2)))(setq mp3 (polar pd 0 (/ ww 2)))(setq mp4 (polar pa (/ pi 2) (/ hh 2)));以下依据mp1、mp2、mp3、mp4 点画出二条线(command "line" mp1 mp3 "")(command "line" mp2 mp4 ""))4.第四步骤:回到AutoCAD 下,加载AutoLISP 程序若您的AutoCAD『环境设定』中『支持文件搜寻路径』有加上c:\lisptool,则您可轻松载入pbox.lsp 程序指令:(load"pbox") 传回:c:pbox或指令:(load "pbox") 传回:c:pbox或指令:(load "pbox.lsp") 传回:c:pbox若您的AutoCAD『环境设定』中『支持文件搜寻路径』并未加上c:\lisptool,则您载入pbox.lsp 程序时,须包含程序所在路径:错误的加载:指令:(load "pbox")会出现:无法开启「pbox.lsp」做输入错误: 加载失败(LOAD "pbox")*取消正确的加载方式:指令:(load "c:/lisptool/pbox") 传回:c:pbox或:指令:(load "c:\\lisptool\\pbox") 传回:c:pbox5.第五步骤:执行新的AutoLISP 指令指令:pbox <-- 成功加载后,直接键入pbox 指令Enter Left/Low Point: <-- 请给一左下角点Width: <-- 给一实数当宽度,例如100Hieght: <-- 给一实数当高度,例如50指令:nil指令三、PBOX.LSP 程序产生的问题& 改良1. 原程序虽是成功的加载执行了,但却有以下几点小问题:问题1:给完左下角点后,『Width:』及『Height:』提示却在同一行出现,应该一个提示各别一行才好ANS:很简单,只要做如下的改变,加入『\n』即可(setq ww (getreal "Width:"))→ (setq ww (getreal "\nWidth:"))(setq hh (getreal "Height:"))→ (setq hh (getreal "\nHeight:"))问题2:希望给宽度及高度时,也能直接在屏幕上拉一段距离代替ANS:很简单,只要做以下的函数变动即可将(setq ww (getreal "\nWidth:"))改成(setq ww (getdist pa "\nWidth:")) ✍ pa为参考基准点将(setq hh (getreal "\nHeight:"))改成(setq hh (getdist pa "\nHeight:")) ✍ pa为参考基准点问题3:给完宽度及高度值后,开始画出所要的图形,可是指令操作过程却也跟着在『指令:』下一一配合出现着,不但影响速度,也没有实质的意义,如何改善? ANS:很简单,只要在程序一开始加入如下一行即可改善:(setvar "cmdecho" 0) ✍设定变量cmdecho=0关闭指令响应问题4:画完所要的图形过程中,画面出现了小十字点,还得用redraw指令清除,该如何使其不出现,但又不影响正常绘图设定呢 (R14环境blipmode内定值为0)ANS:很简单,只要在程序一开始加入(setvar "blipmode" 0) 即可有效压抑小十字虚点出现!但须在程序结束前恢复设定(setvar "blipmode" 1) ,才不会影响正常绘图设定问题5:全部过程执行完后,在『指令:』后却出现了空响应nil,如何消除呢指令:pboxEnter Left/Low Point:Width:Hieght:指令:nil ✍就是这一行指令ANS:很简单,只要在程序结束前,加入一行(prin1) 即可问题6:程序确认无误后,想将所有变量均处理成『区域变量』,以免占据内存ANS:很简单,只要做如下的改变即可将(defun c:pbox()改成(defun c:pbox(/ pa pb pc pd ww hh mp1 mp2 mp3 mp4)问题7:希望在(load "pbox") 程序的响应讯息能有更多样的变化ANS:很简单,原回应是c:pbox,请在程序结束后,再加入二列:(prompt "********** << C:PBOX >> **********")2.改良后完整PBOX.LSP 程序的全貌:(defun c:pbox(/ pa pb pc pd ww hh mp1 mp2 mp3 mp4) (setvar "cmdecho" 0)(setvar "blipmode" 0);以下pa、ww、hh 值须由使用者输入(setq pa (getpoint "Enter Left/Low Point:"))(setq ww (getdist pa "\nWidth:"))(setq hh (getdist pa "\nHeight:"));以下pb、pc、pd值须由程序依据pa、ww、hh求出(setq pb (polar pa 0 ww))(setq pc (polar pb (/ pi 2) hh))(setq pd (polar pc pi ww));以下依据pa、pb、pc、pd 点画矩形(指令"pline" pa pb pc pd "c");以下mp1、mp2、mp3、mp4值须由程序依据pa、ww、hh ;& pb、pc、pd 值求出(setq mp1 (polar pa 0 (/ ww 2)))(setq mp2 (polar pb (/ pi 2) (/ hh 2)))(setq mp3 (polar pd 0 (/ ww 2)))(setq mp4 (polar pa (/ pi 2) (/ hh 2)));以下依据mp1、mp2、mp3、mp4 点画出二条线(指令"line" mp1 mp3 "")(指令"line" mp2 mp4 ""))(prompt "********** << C:PBOX >> **********")(prin1)四、本章结语:•经由简单的PBOX.LSP 程序设计全程演练,从『产生动机、预期目标』→『构思程序流程、相关变量订定』→『撰写程序』→『加载程序』→『执行PBOX指令』→『改良PBOX.LSP』•相信您已能更了解AutoLISP 是怎么回事了,短短的十几行,能做的事却不少,一路循序渐进练习下来,您应该觉得一点儿也不吃力、『游刃有余』才对,果真如此,那恭喜您,『好戏还在后头』,还有体力的话,就继续『征服下一章』吧•若您仍觉得有点『迷迷糊糊』,那就休息一下,配合复习第二章『学好AutoLISP的关键、基本结构与语法』再好好的把第四章『看』&『做』个明白,相信有心成为AutoCAD高手的您,一定不会那么容易就『被十几行打败』的。

相关主题