logo资料库

AutoLISP从入门到精通初级教程(新手必备).doc

第1页 / 共36页
第2页 / 共36页
第3页 / 共36页
第4页 / 共36页
第5页 / 共36页
第6页 / 共36页
第7页 / 共36页
第8页 / 共36页
资料共36页,剩余部分请下载后查看
单元一:AutoLISP主角登场
单元二:AutoLISP的关键、基本结构及语法
单元三:快速分类浏览AutoLISP功能函数(一)
单元四:快速分类浏览AutoLISP功能函数(二)
单元五:轻松快速的掌握AutoLISP设计技巧
单元六:图元数据的取得与活用技巧(一)
单元七:图元数据的取得与活用技巧(二)
单元八:新手上路-参数设计的关键技巧
AutoLISP 入门 单元一:AutoLISP 主角登场 .....................................................................................................2 单元二:AutoLISP 的关键、基本结构及语法.........................................................................4 单元三:快速分类浏览 AutoLISP 功能函数(一)...................................................................10 单元四:快速分类浏览 AutoLISP 功能函数(二)...................................................................13 单元五:轻松快速的掌握 AutoLISP 设计技巧 ......................................................................16 单元六:图元数据的取得与活用技巧(一)............................................................................. 21 单元七:图元数据的取得与活用技巧(二)............................................................................. 25 单元八:新手上路-参数设计的关键技巧...............................................................................31
单元一:AutoLISP 主角登场 一. AutoLISP 是何方神圣? 1、AutoLISP 是 AutoCAD 的最佳拍檔! 2、AutoLISP 内含于 AutoCAD 软件内,不用另外花钱买! 3、AutoLISP 是强化 AutoCAD 最好、最直接的『程序语言』! 4、AutoLISP 易学、易用,即使不会程序设计的 AutoCAD 使用者,都能在最短的 时间内,写出令人 惊讶、赞叹的功能! 若说 AutoLISP 的出现,是替 AutoCAD 创造一片天的『最大功臣』,实不为过一点也不夸张! 5、AutoLISP 希望您去学习它、改善它、发挥它、享受它.真的!它的威力、魅力无穷! 二. AutoLISP 程序语言的特质分析: 学习 AutoLISP 是非常容易的,对初学者而言,即使没有学习过任何的程序语言,都能很快的上手,写 出精彩漂亮的 AutoLISP 程序! 语法简单:不用特殊的变量宣告,非常富有弹性,比起其它的程序语言,它的语法可说是非常简单而 有其独特的风格! 功能函数强大:除一般性的功能函数外,又拥有为数不少控制配合 AutoCAD 的特殊函数,再加上 AutoLISP 可直接呼叫执行所有 AutoCAD 的指令,以及掌握运用所有的 AutoCAD 系统变量,功能之 强大令人欣喜不已! 撰写的环境不挑剔:只要是一般的文书编辑软件都适用! 如:Windows 的记事本、PE2、PE3、DW3、 书中仙、汉书、EDIT....等 直译式程序: 不用再作编译,『即写即测、即测即用』,马上可以在 AutoCAD 中响应效果,马上就 有成就感! 横跨各作业平台:悠然自得,虽然 AutoCAD 有 DOS、Windows 版本之分但是 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. 对设计人员而言: A. 得到一笔提升绩效奖金呢? 当然,无形中,『AutoCAD 高手的封号』也将功力又往前迈出了一大 步,对个人的成长帮助匪浅,幸运的话,搞不好还可以黄袍加身,不亦乐乎!!! B. 『半桶水、响叮当』,千万不要因为会写 AutoLISP 程序而自傲、孤僻、嚣张起来,功力的增长, 只是让您有更多『服务他人、服务公司』的机会,若自恃过重,宁可不要! C. AutoLISP 程序功力的累进,是无远弗届的,千万不要『孤芳自赏』,『人外有人,天外有天』,也许 您觉得是『宝贝加三级』的程序,只是其它设计师基本程序中的一部份罢了! D. 既然 AutoLISP 是 AutoCAD 的『最大功臣』,当然不会轻易被舍弃,如此,您的学习,保证不会白 费! E. 『精益求精』、『虚心求教』、『用心学习、观摩』、『决心成为高手』 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.图元名称代码 如 F.档案代码 如 ..... G.选择群集代码 如 规则 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 4 2> 传回 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.图元名称代码:如 ... 使用范围: AutoCAD 会自动赋予图元指向代码,透过此代码可找到图元的数据库记录 范例说明: (setq en (entlast)) 传回 (entget en) 可找到图元的数据库串行 F.档案代码: 如… 使用范围: 开启(open)档案作读档(r)、写档(w)使用时,所产生的代码,如下: 范例说明: (setq ffr (open "test.txt" "r")) 回应 (setq ffw (open "abc.txt" "w")) 回应 G.选择群集代码: 如… 使用范围: 一个或数个图元所形成的选择集 范例说明: (setq ss (ssget)) 选取对象: (可选择物体) 选取对象: (可选择物体) 选取对象: (按 [ENTER] 键) 回应 规则 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 程序中,在『分号 ;』后的内容均为批注,程序不处理,适时的增加批注,将使程序
更具可看性、学习性及完整性 范例: pp.lsp 内容如下: ;本程序功能可快速画门、窗 ;设计者:QQ 博士 ;版权所有,欢迎使用 (defun c:pp() : : ; 以下为画门子程序 : : ; 以下为画窗子程序, : : : : ) 规则 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)) )
分享到:
收藏