AutoLISP入门教程

合集下载

Lisp教程(上册 基础)彩版

Lisp教程(上册 基础)彩版

AutoLisp基础教程课程简介课程主要介绍AutoLISP程序的编写,及AutoCAD的菜单应用;内容充实,绝无废话,并由浅入深,辅以练习加深了解.本课程适合一般的初学者;即使你对程序设计全无认识,亦可轻松应付. 全课共分为18篇,每篇一个主题;而每篇再分为若干小节,每天顺序显示.内文若有错漏,敬祁见谅,欢迎来函赐教,多谢!!课程大纲第一篇程序设计基本知识----- 函数,数据型态及变量第二篇数值数据处理----- 数值运算,转型及型态检查第三篇程序设计基础----- 自定函数,批注,关系及逻辑运算第四篇条件判断及流程控制----- 程序分支及循环第五篇输入及输出函数----- 用户输入及屏幕输出第六篇字符串数据处理----- 字符串转型及对比,控制字符第七篇串行数据处理----- 串行的建立,分离,增加,删除及搜寻第八篇像素数据处理----- 像素的建立,取得,删除及修改第九篇选集数据处理----- 选集的建立,增加及删除第十篇其它常用函数1 ----- 系统变量,屏幕显示,逻辑位第十一篇其它常用函数2 ----- 加载程序,取得数据第十二篇档案数据处理----- 档案的开启,关闭及数据存取第十三篇符号表处理----- 非图形对象数据第十四篇下拉式及快捷菜单----- 菜单节及菜单项第十五篇影像菜单----- 建立,加载及运用第十六篇工具栏----- 按钮及拉出式图标工具栏第十七篇自定线型及填充图案----- LIN及P AT档案的应用第十八篇脚本文件(Script)及指令别名定义文件----- SCR及PGP档案的应用注意事项在各篇课程所介绍的语法结构中,包含在方括号[]中的数据,表示为选择性项目;可因应情况,自行决定是否须要加上.字型为紫色的项目,表示可自行设定其名称或内容在各范列中,前部的COMMAND : 为绘图模式下之命令行的提示符号,不须输入.同一程序行中,在分号; 右边的文字为程序批注,可以不输入.在范例中,部份过长的指令行提示会以省略号.... 表示第一篇基本知识基本知识AutoLISP是一种针对扩充及自定义AutoCAD函数机能而产生,以LISP为基础的程序设计语言.LISP 本身于50年代末期出现,是一种擅于处理串行文字(List of Processing),属第四代「人工智能(Artificial Intelligence)」的计算机语言.带小数字的数值,以倍精度浮点格式储存(最少14位小数)e.g. 12.5 当数值在1与-1之间时,必须加上前导零e.g. 0.05 可以科学记号表示 : 在E 或e 后加上次方值 e.g. 4.1e-6一般文字,其前后必须加上双引号 "e.g. "AutoCAD" 控制字符或脱逸码必须为小写,且须在字符前加上反斜杠 \ e.g. "\AutoCAD"目的是令使用者充份利用AutoCAD 进行开发,直接增加及修改AutoCAD 指令.AutoLisp 语言建基于普通的LISP 语言上,并扩充了许多适用于CAD 的特殊功能而形成. 是一种能以直译方式(不须先行编译)亦可于Au t oCAD 内部执行的直译性程序语言. 程序容易学习及撰写,程序即使出错亦不会对操作系统(如DOS,WINDOWS)有不良影响. 数据及程序均统一以串行 (List)结构表示.可直接调用几乎全部的AutoCAD 命令. 既具备一般高级语言的基本结构和功能,亦有一般高级语言没有的强大图形处理能力. 内建于AutoCAD 应用程序,不须另行购买;亦不须使用特定的编辑器或开发环境. 可配合AutoCAD 提供的PDB,建立DCL(Dialog Co n trol Language)文件创建对话框. 缺点 : 执行速度较ObjectArx(旧称ARX,以C 或C ++程序开发,取代以前的ADS)程序慢;原 程序不易保护;对低阶的硬件数据不易存取.函数 (Function)在AutoLISP 程序语言中所有的成份都是以函数的形式出现,AutoLISP 程序就是顺序执行连串的 函数.函数的运行过程就是对函数的求值(结果)过程;函数的基本语法如下:(函数名称 参数1 参数2....) e.g. (PRINC "AutoLISP Program m ing")每一个完整的函数必须包在一对小括号( )内,左边为开括号,右边为关括号;如有若干数 量的开括号,则一定有同等数量的关括号对应. 左边开括号后紧随函数名称.函数名称与参数之间,或参数与参数之间须最少留一个空格. 函数可有一个或多个参数(也可能没有参数),视该函数而定. 函数名称不分大小写,即大小写字母视为相同.数据型态 (Data Type)整数 (INT)没有小数字的数值,32位有号数,范围从+2,147,483,647到-2,147,483,648实数 (REAL)字符串 (STR)像素名称 (ENAME)是指定给图文件内对象的指针(Pointer,为16进位的数字卷标) e.g. <Entity name:14e5180> 像素名称在图文件内是唯一的,不会重复 对象的像素名称只在目前作业中有效,再开启图档时,会指定新的像素名称予该对象档案(FILE)以OPEN函数所开启档案的指针,作为其它函数(读写该档案)的自变量选集(PICKSET)用SSGET等函数建立的一个或多个对象的集合或群组转化(VARIANT)可将像素名称转换为可与ActiveX配搭使用的V L A-Object对象符号(SYM)用以储存静态数据的名称;例如内建或用户定义的函数符号名称不分大小写,可由任意长度的可打印字符组成;但下列的字符除外: 左括号(右括号)句点.单引号'双引号"分号;表(LIST)亦称为串行,是放在一对小括号( ) 内,一个或多个元素的有序集合e.g. (1.0 "Lisp" ( ) (5.6 7)) 元素可以是字符串,符号,整数或实数;也可以是另一个表元素与元素之间要用空格隔开,但元素与小括号之间则可以不隔空格为便于存取表内各元素,每个元素均有其序号;从表的左边开始,第一个元素序号为0,依此类推表的大小即为其顶层元素的数量(内层嵌套式的表,视为单一元素)点对(Dotted Pair)亦是表的一种;表内有2个元素,中间以一圆点分隔,且元素与圆点之间亦须以空格分开若表内没有任何元素,称为空串行或空表;以( ) 或(NIL) 表示变数(Variable)为程序执行中动态储存数据的符号名称;主要分为2类:区域(Local)变量又称为局部变量;该变量只在该程序段落中有效,不能为其它程序使用全局(Global)变量又称为整体变量;变量在所有程序段落中均可使用变量名称与符号的限制相同,使用时宜采用有意义及易于辨别的名称变量在赋值或使用前无须先行设定相同的变量可以储存不同型态的数据(但同一时间内只可储存一种型态) 在指定新的数据之前,变量储存的内容会保持不变赋值将数据给予指定的变量储存以内建函数SETQ进行(可用于绘图模式的指令行或AutoLISP程序),其语法如下: (SETQ 变量名称1 资料1 [变量名称2资料2 ....] )e.g. (SETQ NAME "David" AGE 37 WEIGHT 72.5 POINT (LIST 10 20))在函数名称之后,各参数以两个一组,每组左边为变量名称,右边为存入变量的数据亦可将变量名称赋以空值(NIL) :e.g. (SETQ OCCUPATION NIL)要显示变量所储存的数据,可以使用内建函数P R INC(可用于绘图模式的指令行或AutoLISP 程序),其语法如下:(PRINC 变量名称)e.g. COMMAND : (PRINC NAME)Result : David"David"在绘图模式中,亦可于指令行中使用感叹号! 来显示变量内容,或作为指令选项的输入值;语法如下:!变量名称e.g. COMMAND : !NAME Result : "David"在Visual LISP的控制台窗口中,于提示符号_$ 后键入要显示的变量名称_$变量名称e.g. _$NAME要检查变量所储存的数据型态,可使用内建函数TYPE;语法如下:(TYPE 变量名称)e.g. COMMAND : (TYPE NAME)Result : STR若检查的变量没有储存数据,则会传回NIL练习(Exercises)将四个坐标分别存入四个变量中,并以LINE或P LINE指令,配合四个坐标变量,画出正四边形.COMMAND : (SETQ POINT1 (LIST 0 0) POINT2 (LIST 0 10) POINT3 (LIST 10 10) POINT4 (LIST 10 0))COMMAND : LINE ;直线段指令COMMAND : !POINT1 ;第一点(左下角起点)COMMAND : !POINT2 ;第二点(左上角)COMMAND : !POINT3 ;第三点(右上角)COMMAND : !POINT4 ;第四点(右下角)COMMAND : C;自动联机至起点以关闭四边形画圆: 将圆心坐标及半径长度分别存入两个变量中(变量名称及数据型态自定义)COMMAND : (SETQ CEN (LIST 0 0) RAD 20) ;将圆心点设为坐标0,0;半径为20 COMMAND : CIRCLE;执行划圆指令Specify center.... : !CEN;在提示后以变量CEN响应输入Specify radius.... : !RAD;在提示后以变量RAD响应输入将不同型态的数据,分多次存入相同的变数内;每次均以PRINC及TYPE函数显示变量内容及其数据型态COMMAND : (SETQ TEMP 1.2) ;将实数1.2存入变数TEMP COMMAND : !TEMP Result : 1.2COMMAND : (TYPE TEMP)Result : REALCOMMAND : (SETQ TEMP "AutoLISP") ;将字符串存入变量TEMPCOMMAND : !TEMP Result : "AutoLISP"COMMAND : (TYPE TEMP)Result : STR第二篇数值数据处理基本运算加函数(+ [数值参数1数值参数2 ....] )e.g. (+ 2.5 4 6) Result : 12.5函数的结果为各参数之总和若仅提供一个参数,则以0加上此参数的结果为返回值若没有提供任何参数则传回0;各参数须为整数或实数型态若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转换为实数减函数(- [数值参数1数值参数2 ....] )e.g. (- 10 2 3) Result : 5结果为第一个(最左边)参数减去其右边各参数的总和若只提供一个参数,返回值为0减去该参数的结果若没有提供任何参数则传回0;各参数须为整数或实数型态若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转换为实数乘函数(* [数值参数1数值参数2 ....] )e.g. (* 2 3 4) Result : 24结果为所有参数的乘积若只提供一个参数,则返回值为该参数乘以1的结果若没有提供任何参数则传回0;各参数须为整数或实数型态若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转换为实数除函数(/ [数值参数1数值参数2 ....] )e.g. (/ 24 2 3) Result : 4结果为第一个(最左边)参数除以其右边各参数的乘积若仅提供一个参数,则返回值为该参数除以1的结果若没有提供任何参数则传回0;各参数须为整数或实数型态若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转换为实数注意: 在本篇教程中,各函数的数值参数,均可以变量(储存值只可以是整数或实数,且不可以是空值nil)取代.练习(Exercises)计算式(2+4)*3COMMAND : (* 3 (+ 2 4)) Result : 18计算式(50-8*5)/4COMMAND : (/ (- 50 (* 8 5)) 4) Result : 2注意: 上式的正确答案应是2.5,因为函数中的各参数均为整数,所以传回的结果亦为整数递增及递减递增(1+ 数值参数)e.g. (1+ 2) Result : 3递减(1- 数值参数)e.g. (1- 4) Result : 3三角函数(Trinagular Function)正弦值(SIN 弧度参数)e.g. (SIN 1) Result : 0.841471余弦值(COS 弧度参数)e.g. (COS 1) Result : 0.540302反正切值(ATAN 弧度参数)e.g. (ATAN 1) Result : 0.785398其它数值处理次方值(EXPT 数值参数次方值)e.g. (EXPT 2 4) Result : 16若参数及次方值两个均为整数,返回值亦是整数;若其中一个为实数,结果为实数开方根(SQRT 数值参数)e.g. (SQRT 30) Result : 5.47723绝对值(ABS 数值参数)e.g. (ABS -123)Result : 123余数(REM [数值参数1数值参数2 ....] )e.g. (REM 50 26 5) = (REM (RE M 50 26) 5) Result : 4将参数1整除参数2的余数若参数多于2个时,则会将余数再整除下一个参数,再得出余数;依此类推若其中一个参数为实数时,则结果为实数;否则为整数最大公约数(GCD 数值参数1 数值参数2 )e.g. (GCD 81 57) Result : 3两个参数均必须为整数值型态自然对数(LOG 数值参数)e.g. (LOG 3.5) Result : 1.25276是EXP函数的反函数;传回值为实数型态自然反对数(EXP 数值参数)e.g. (EXP 1.25276) Result : 3.49999是LOG函数的反函数;传回值为实数型态数值资料转型实数转整数(FIX 数值参数)e.g. (FIX 12.56) Result : 12只会截去小数部份(小数字不会4舍5入)整数转实数(FLOAT 数值参数)e.g. (FLOAT 12) Result : 12.0整数转字符串(ITOA 数值参数)e.g. (ITOA -17) Result : "-17"数值转字符串(RTOS 数值参数[模式[小数字]] )e.g. (RTOS 17.23333 2 3) Result : 12.266若不设定模式,则依系统变量LUNITS 的设定值转换数值为字符串若不设定小数字,则依系统变量LUPREC 的设定值转换模式设定值可以是下列数值之一:1 = 科学记号2 = 十进制3 = 英呎及十进制英吋4 = 英呎及分数位英吋5 = 分数当选用的模式为3,4或5,则传回的字符串受系统变量UNITMODE影响弪度转字符串(ANGTOS 角度参数[模式[小数字]] )e.g. (ANGTOS 0.785398 0) Result : "45"e.g. (ANGTOS 0.785398 4) Result : "N 45d E"若不设定模式,则依系统变量AUNITS的设定值转换数值为字符串若不设定小数字,则依系统变量AUPREC的设定值转换模式设定值可以是下列数值之一:0 = 度1 = 度/分/秒2 = 分度量3 = 弪度4 = 土地测量单位当选用的模式为4,则传回的字符串受系统变量UN I TMODE影响反函数为ANGTOF;参阅第5篇教程数值资料检查数值(NUMBERP 数值参数)e.g.(NUMBERP-3.45)Result :Te.g.(NUMBERP"AutoLISP")Result :nil注意: 在范例的传回值中,T表示函数的结果为真(成立),nil表示结果为假(不成立)负数值(MINUSP 数值参数)e.g. (MINUSP -3.45)Result : Te.g. (MINUSP 0) Result : nile.g. (MINUSP 3.45) Result : nil零值(ZEROP数值参数)e.g.(ZEROP0)Result :Te.g.(ZEROP 3.45)Result :nil练习(Exercises)计算下列算式:(+ 1234567890 1234567890) Result : -1825831516上式中两个数值参数均为整数,而结果值大于整数型态所能容许之范围;固导致发生溢位问题,产生无效的结果.修正算式如下: 只要将其中一个参数改为实数型态即可.(+ 1234567890.0 1234567890) Result : 2.46914e+009计算下列算式:(+ 9876543210 1234567890) Result : 1.11111e+010上式中两个数值参数均为整数,但其中一个(第一个)参数巳大于整数型态所能容许之范围;系统会自动将此参数先行转为实数型态才计算.计算下列算式:(FIX (SQRT (+ 1 (MAX 20 10 40 30))))Result : 6----最先执行的是最内层的算式(MAX 20 10 40 30) ,求出最大值为40----其次执行加函数,将MAX函数所得的最大值加1,结果为41----再利函数SQRT,将41开方根,结果为6.4031----最后使用FIX函数,截去其小数字,得到最后的结果为6其它应用最大值(MAX [数值参数1数值参数2 ....] )e.g. (MAX -88 5 2) Result : 5若没有提供任何参数,则传回值为0最小值(MIN [数值参数1数值参数2 ....] )e.g. (MIN -88 5 2) Result : -88若没有提供任何参数,则传回值为0第三篇程序设计基础用户定义函数是将一群表示式组合成一个函数或指令可应用于绘图模式的指令行提示,Visual LISP控制台,或供其它自定义函数内的表示式呼叫使用AutoLISP源代码均以纯文本格式存档,扩展名为LSP(2000版可编译成扩展名为FAS的档案可以一般文本编辑器进行开发,如DOS的EDIT,W I NDOWS的WORD或WORDPAD等一个自定函数内最少要有一个表达式在原程序文件(LSP)里,自定义函数以DEFUN函数开始;其语法如下:(DEFUN [C:] 函数名称( [自变量串行...] [/ 局部变数串行...] ) 表达式...)在呼叫带有自变量的自定函数时,必须同时提供与定义函数时,同等数量的参数,使各参数传入自定函数的各自变量中自变量被视为一种特殊类型的局部变量,无法用于该自定函数以外的其它函数若自定函数中无须设定任何自变量,亦必须以空串行( )加在函数名称之后若有提供局部变量,必须以斜线/ 加在局部变量的开头(即使前面没有自变量串行) 各自变量,斜线,局部变量之间要以空格分隔;但与左右小括号之间则不须以空格分开若自变量串行中有相同名称的自变量出现,则会忽略第一个以后的相同自变量;变量亦是一样若在函数名称前加上C:,表示该函数可以在绘图模式的指令行提示下,其执行方式与内建函数相同;亦可以在任何内建命令(执行中)的提示后,以通透方式执行(但须将函数名称包在一对小括号中) 若在函数名称前没有加上C:,在指令行提示下,必须将函数名称包在一对小括号中才可执行不可以在执行一自定函数时,以通透方式执行另一自定函数加载程序自定函数在使用前,都要将其所在的程序文件(扩展名为LSP)加载才可执行ACAD.LSP程序文件(默认在SUPPORT子目录内)会在启动AutoCAD时自动加载(LOAD "程序文件名称"[加载失败])e.g. (LOAD "TEST")若程序文件之文件名为LSP,则在程序文件名称之后,可以不加上扩展名若有需要,系统会顺序尝试其它的扩展名: VLX FAS LSP若程序文件不在系统的支持目录下,则需在文件名前加上目录路径注意: 必须以正斜线/ 或两个反斜杠\\ 作为目录的分隔符可以在加载失败的参数中提供字符串,以供加载失败时显示;亦可提供有效的自定函数,该函数在加载程序文件失败时会被执行e.g. (LOAD "TEST" "Load Fail") 或(LOAD "TEST" (DOERROR))注意: 在程序文件加载后,在提示行显示的返回值,一般是该程序文件中,最后被定义的函数名称或是在程序文件内没有包含在自定函数中,最后一个表达式的执行结果练习(Exercises)启动文本编辑器,编写一AutoLISP程序作两个同心圆(第1个圆半径为50,第2个圆半径为80),程序代码如下所示:(DEFUN C: 2CIRCLE ()(SETQ CEN (LIST 0 0) RAD 50)(COMMAND CIRCLE CEN RAD)(COMMAND CIRCLE CEN (+ RAD 30)))----输入后以纯文本格式存档(C:\TEST.LSP)----在AutoCAD绘图模式的指令行提示后,用LOAD函数将程序文件加载COMMAND : (LOAD "C:/TEST")----在指令行提示后,输入程序(函数)名称执行COMMAND : 2CIRCLE程序说明1 使用DEFUN建立自定函数的名称,并用SETQ函数将中心点(LIST 0 0)存入变数CEN,半径(50)存入变数RAD中2 使用COMMAND函数执行AutoCAD内建指令CIRCLE,并以变量CEN(圆的中心点)及变数RAD(圆的半径)回应3 与第2行大致相同,但在指定其半径时,先将储存半径的变量加30,使划出半径为80的圆;注意最右边的关括号,与第1行DEFUN左边的开括号是一对的启动文本编辑器,开启TEST.LSP程序文件,复制2C I RCLE至新程序2C,并改为传入自变量方式执行;程序代码如下:(DEFUN 2C (CEN RAD) (COMMAND CIRCLE CEN RAD)(COMMAND CIRCLE CEN (+ RAD 30)))----输入后以纯文本格式存档----在AutoCAD绘图模式的指令行提示后,用LOAD函数将程序文件重载----在指令行提示后,输入程序(函数)名称执行COMMAND : (2C (LIST 0 0) 50)批注单行批注分号;表示在分号右边(同一行)的字符均为批注,程序执行时会将其忽略多行批注;||;表示在两个批注符号中间所有字符皆为批注,即使字符跨越多行关系运算在各个关系运算中,都会传回一逻辑值;若关系成立,传回T,否则会传回nil 各参数可以是字符串,整数或实数型态;若以字符串进行比较,则会以字符串的ASCII码为准若函数中只有一个参数,传回值恒为T等于函数(= 参数1 [参数2....] )会将参数1与其后各个参数比较,若全部相等则传回T,否则传回nile.g.(= 2 2.0)Result :Te.g.(= "A" CHR(65))Result :T不等于函数(/= 参数1 [参数2....] )若参数1不等于其后任何一个参数,即传回Te.g.(/=1 2.0)Result :Te.g.(/="a" CHR(65))Result :Te.g.(/=10 30 40 10 20)Result :T小于函数(< 参数1 [参数2....] )各参数顺序以2个为一组比较,若各组左边的参数均小于右边的参数,即传回Te.g.(< 1 2)Result : Te.g.(< "a" CHR(65))Result : T大于函数(> 参数1 [参数2....] )各参数顺序以2个为一组比较,若各组左边的参数均大于右边的参数,即传回Te.g.(> 1 2)Result : nile.g.(> "a" CHR(65))Result : nil小于或等于函数(<= 参数1 [参数2....] )各参数顺序以2个为一组比较,若各组左边的参数均小于或等于右边的参数,即传回Te.g.(<=1 2)Result :Te.g.(<=2 2)Result :Te.g.(<="a" CHR(65))Result :T大于或等于函数(>= 参数1 [参数2....] )各参数顺序以2个为一组比较,若各组左边的参数均大于或等于右边的参数,即传回Te.g.(>=1 2)Result :nile.g.(>=2 2)Result :Te.g.(>="a" CHR(65))Result :nil逻辑运算且运算(AND [表达式....] )若各表达式的传回值均为T,函数即返回T 值;若其中一个传回值为nil,函数传回nile.g. (AND (< 1 2) (> 8 5)) Result : T或运算(OR [表达式....] )若各表达式的传回值均为nil,函数即返回ni l值;若其中一个传回值为T,函数传回Te.g. (OR (> 1 2) (> 8 5)) Result : T否定运算(NOT 表达式)若表达式的传回值为T,函数即返回nil 值;相反若表达式传回值为nil,函数传回T 可用于检查传回值是否为nil另有一NULL函数与NOT函数功能相似e.g. (NOT (< 1 2)) Result : nil练习(Exercises)试求出50减25,与625的开方根值是否相等COMMAND : (= (- 50 25) (SQRT 625)) Result : T设计一简单程序(名称为AIR),在呼叫程序时,检查传入的数值自变量(为空气污染指数)是否大于200(即严重空气污染)----启动文本编辑器,开启TEST.LSP程序文件,输入下列程序代码:(DEFUN AIR (NUM) (> NUM 200))----输入后存档(纯文本格式)----在AutoCAD绘图模式的指令行提示符号后,使用L OAD函数重载程序文件COMMAND : (LOAD "C:/TEST")----在AutoCAD绘图模式的指令行提示符号后,输入自定函数名称及参数执行COMMAND : (AIR 175) Result : nilCOMMAND : (AIR 215) Result : T第四篇条件判断及流程控制>条件判断是利用条件函数,配合关系及逻辑运算所设定的一些准则,令程序自行分析,因应情况作出适当行动.单一条件(IF 条件表达式是表达式[否表达式])函数先检查条件表达式,若其传回值为T,便会执行其后的是表达式若有提供否表达式,且条件表达式的传回值为n il,函数将不会执行(跳过)是表达式而执行否表达式若没有提供否表达式,且条件表达式的传回值为nil时,函数将不作任何事情IF函数可以巢状方式嵌套,即在是或否的表达式中加入另一个IF函数练习(Exercises)判断空气污染指数: 大于100 = Very High, 51至100 = High, 26至50 = Medium, 25或以下= Low----启动编辑器,开启C:/TEST.LSP程序文件;新增AIR-1自定函数,程序代码如下:(DEFUN AIR-1 (NUM) (IF (> NUM 100) (PRINC "Very High"))(IF (AND (> NUM 50) (<= NUM 100)) (PRIN C"High"))(IF (AND (> NUM 25) (<= NUM 50)) (PRINC "Medium"))(IF (<= NUM 25)) (PRIN C"Low"))(PRINC))程序说明1 设定函数名称,并将数据存入自变量NUM内;用IF函数判断变量NUM是否大于100;若是则显示字符串Very High响应2 用IF函数判断变量NUM是否大于50且(AND)小于或等于100;若是则显示High响应3 用IF函数判断变量NUM是否大于25且(AND)小于或等于50;若是则显示Medium4 用IF函数判断变量NUM是否小于或等于25;若是则显示Low5 是一个没有提供任何自变量的PRINC函数;用以抑制显示答案时尾部符加的nil 或重复的传回值;而最右一个关括号,是用以对应第1行最左边的开括号IF函数的巢状练习: 修改上一课的程序练习,将多个IF函数合并成巢状嵌套----启动文本编辑器,开启C:/TEST.LSP程序文件----新增程序AIR-2,其程序代码如下:(DEFUN AIR-2 (NUM) (IF (> NUM 50) (PRINC (IF (> NUM 100) "Very high" "High"))(PRINC (IF (> NUM 25) "Medium" "Low"))) (PRINC))程序说明1 设定函数名称,并将数据存入自变量NUM内;用IF函数判断变量NUM是否大于50;若条件成立(变量NUM大于50)时,再用另一个IF函数判断变量是否大于100;若条件成立(变量NUM大于100)时,使用PRINC函数显示字符串Very High,否则显示High2 若在第1个IF函数判断中,条件不成立(变量NUM不大于50)时;再用另一个IF函数判断变量是否大于25;若条件成立(NUM大于25)时,显示字符串Medium,否则显示字符串Low3 是一个没有提供任何自变量的PRINC函数;用以抑制显示答案时尾部符加的nil 或重复的传回值;而最右一个关括号,是用以对应第1行最左边的开括号注意:第1行最后一个关括号是对应前面的PRINC函数,尾2的关括号则是对应IF函数(判断NUM是否大于100)第2行最后一个关括号是对应第1行的IF函数(判断NUM是否大于50),尾2的关括号则是对应PRINC函数,尾3的关括号则是对应IF函数(判断NUM是否大于25)最右边的关括号是对应第1行最左边的开括号PROGN 函数在以上各范例中,执行的表达式均为单一的函数运算;若要在表达式中顺序执行一连串的函数,便要将各函数包含在一个PROGN函数内;函数的传回值会是该PROGN函数中,最后一个表达式的运算结果----修改TEST.LSP程序文件的AIR-1程序,第1个IF函数如下,其余的IF函数请自行修改e.g. (IF (> NUM 100) (PROGN (S ETQ DISP "Very High") (PRINC DISP)))注意:最后一个关括号是对应前面的IF函数(判断变量NUM是否大于100)尾2的关括号是对应PROGN函数(用以包含SETQ及PRINC函数)尾3的关括号是对应PRINC函数的条件判断多重条件(COND [ (条件表达式是表达式)....] )函数会顺序检查各条件表达式;直到其中一个条件成立(传回T),即执行该条件式所对应的是表达式每个条件表达式只对应一个是表达式,而没有否表达式若条件式成立且执行对应的是表达式后,则不会再对余下的其它条件表达式进行检查若只有条件表达式而没有对应之是表达式,则只会传回条件表达式的逻辑值若没有提供任何条件表达式及是表达式,函数传回值恒为nil练习(Exercises)新增程序AIR-3,以改善上一课AIR-1程序;用一个COND函数判断多个条件表达式DEFUN AIR-3 (NUM) (COND((> NUM 200) (PRINC "Severe"))((> NUM 100) (PRINC "Very High"))((> NUM 50) (PRINC "High"))((> NUM 25) (PRINC "Medium"))((> NUM 0) (PRINC "Low"))(T (PRINC "Cannot Check")))(PRINC))程序说明1 设定函数名称,并将数据存入自变量NUM内;用COND函数进行多重判断2 判断变量NUM是否大于200,若条件成立,则显示Severe 讯息;第3至6行依此类推7 注意条件式为一个T 字母,表示条件式恒为真(成立),显示讯息Cannot Check作用是当以上各条件式均不成立时(变量小于或等于0),即执行此一表达式。

Autolisp基础教程

Autolisp基础教程

Autolisp基础教程单元一: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 支持软件。

AutoLISP基础教程

AutoLISP基础教程

作者:今早去爬山目录第一章 AutoLISP 基础........................................................................................................................... 4 1.1 AutoLISP 简介........................................................................................................................ 4 1.2 AutoLISP 的基本结构和语法................................................................................................. 4 1.3 AutoLISP 程序的加载............................................................................................................. 6 1.4 本章总结.................................................................................................................................. 6 第二章 AutoLISP 功能函数分类........................................................................................................... 7 2.1.功能函数的分类....................................................................................................................... 7 2.2.数学运算功能函数................................................................................................................... 7 2.3 检验与逻辑运算功能函数....................................................................................................... 8 2.4 转换运算功能函数................................................................................................................... 8 2.5 列表处理功能函数................................................................................................................... 9 2.6 字符串、字符、文件处理函数............................................................................................... 9 2.7 等待输入功能函数................................................................................................................. 10 2.7 几何运算功能函数................................................................................................................. 10 2.8 对象处理功能函数................................................................................................................. 11 2.9 选择集、符号表处理功能函数............................................................................................. 11 2.10 AutoCAD 相关查询、控制功能函数................................................................................. 12 2.11 判断式、循环功能函数....................................................................................................... 12 2.12 函数处理、定义、追踪与错误处理功能函数 ................................................................... 12 2.13 显示、打印控制功能函数................................................................................................... 13 2.14 符号、元素、表达式处理功能函数................................................................................... 13 2.15 ADS、ARX、AutoLISP 加载与卸载函数......................................................................... 1412.16 内存空间管理函数............................................................................................................... 14 2.17 其他重要的功能函数........................................................................................................... 15 2.18 DCL 对话框定义相关的函数与命令.................................................................................. 15 2.19 本章总结............................................................................................................................... 15 第三章 AutoLISP 的程序设计............................................................................................................. 16 3.1 AutoLISP 的程序设计步骤................................................................................................... 16 3.2 第一个 AutoLISP 程序...........................................................................................................16 第四章 AutoLISP 参数化设计............................................................................................................ 22 4.1 什么是参数化设计................................................................................................................. 22 4.2 重要关键-三角函数................................................................................................................ 22 4.3 AutoLISP 三角函数和转换相关函数................................................................................... 24 4.4 三角函数应用实例................................................................................................................. 24 4.5 本章小结................................................................................................................................. 27 第五章 对象属性的获取与修改............................................................................................................28 5.1 什么是对象属性..................................................................................................................... 28 5.2 对象属性应用的相关功能函数............................................................................................. 28 5.3 在 AutoCAD 的命令提示行练习获取对象属性列表.......................................................... 28 5.4 对象属性的修改与更新......................................................................................................... 31 5.5 对象属性修改的应用练习..................................................................................................... 32 5.6 本章小结................................................................................................................................. 33 第六章 循环与判断式............................................................................................................................34 6.1 循环与判断式的作用............................................................................................................. 3426.2 判断式、循环相关功能函数................................................................................................ 34 6.3 IF 判断式应用......................................................................................................................... 36 6.4 COND 判断式应用.................................................................................................................37 6.5 repeat 循环式应用................................................................................................................. 37 6.6 WHILE 循环式的应用............................................................................................................ 38 6.7 本章小结................................................................................................................................ 39 第七章 AutoLISP 的子程序................................................................................................................ 40 7.1 什么是子程序........................................................................................................................ 40 7.2 子程序的应用........................................................................................................................ 40 7.3 子程序的自变量.................................................................................................................... 413第一章 AutoLISP 基础1.1 AutoLISP 简介一、AutoLISP AutoLISP 的由来是基于 LISP 语言衍生出来的高阶编程语言,专门用于 AutoCAD 及相 关的各种产品。

AutoLISPVisualLISP教程学习教程

AutoLISPVisualLISP教程学习教程
在Methods supported (支持的方法)部份列出了可以对过 AutoCAD应用程序施加Eval、GetAcadState、GetInterface Object等 操作。
第9页/共87页
10.2.2访问其他AutoCAD对象
获取AutoCAD应用程序这个根对象之后,沿着AutoCAD对象模 型图,就可以将其作为起点,逐级访问它的下一级VLA对象。
第5页/共87页
2. 了解AutoCAD应用程序的属性和方法
(vlax-dump-object VLA对象 [T]),该函数的功能是列出指定 VLA对象的属性和方法,参数为VLA对象,如果未设置T,只列出 指定VLA对象的属性。例如
(vlax-dump-object myacad t)返回
; IAcadApplication: An instance of the AutoCAD application
; ZoomCenter (2) ; ZoomExtents () ; ZoomPickWindow () ; ZoomPrevious () ; ZoomScaled (2) ; ZoomWindow (2)
第8页/共87页
在Property values(属性)部份列出了AutoCAD应用程序具 有ActiveDocument(活动的文档)、Application(应用程序的 指针)、Caption(标题)、FullName(可执行文件名)等属性。
第13页/共87页
; Handle (RO) = "81" ; HasExtensionDictionary (RO) = 0 ; Hyperlinks (RO) = #<VLA-OBJECT IAcadHyperlinks 040a53f4> ; Layer = "0" ; Length (RO) = 50.0 ; Linetype = "ByLayer" ; LinetypeScale = 1.0 ; Lineweight = -1 ; Normal = (0.0 0.0 1.0) ; ObjectID (RO) = 2129985160 ; ObjectName (RO) = "AcDbLine" ; OwnerID (RO) = 2129984760 ; PlotStyleName = "ByLayer" ; StartPoint = (10.0 20.0 0.0) ; Thickness = 0.0 ; TrueColor = #<VLA-OBJECT IAcadAcCmColor 040a6db0> ; Visible = -1

autolisp教程

autolisp教程

第十二章从菜单执行函数1.制作简单的菜单(a)首先定义一个函数,并保存为plus32.lsp:(defun plus32()(setq a (+ 3 2)))(b)编写菜单生成文件,并保存为mylisp.mnu:***MENUGROUP=Mylisp ;菜单组的名称***POP1 ;第一组下拉菜单[Mylisp] ;第一组下拉菜单总的名称[plus] ^c^c^p(load “plus32.lsp”) (plus32) ;菜单名,加载,执行;一定是一个空行(c)加载菜单和执行函数用menuload函数执行加载.2.制作较为复杂的菜单(a)首先定义两个函数,并保存为plus32.lsp和plus45.lsp :(defun plus32()(setq a (+ 3 2)))(defun plus45()(setq a (+ 4 5)))(b)编写菜单生成文件,并保存为mylisp.mnu:***MENYGROUP=MYLISP***pop1[mylisp1][first] ^c^c^p(load "plus32.lsp") (plus32)[first2] ^c^c^p(load "plus45.lsp") (plus45)***pop2[mylisp2][first2] ^c^c^p(load "plus32.lsp") (plus32)[first4] ^c^c^p(load “plus45.lsp”) (plus45)(c)加载菜单和执行函数用menuload函数执行加载.第十三章保持程序畅通1.程序示例(a)首先定义一个函数,并保存为myline.lsp:(defun myline()(graphscr)(setq pt1 (getpoint "\n请输入第一个点:"))(setq pt2 (getpoint pt1 "\n请输入第二个点:"))(command "line" pt1 pt2 ""))(b)执行上述程序后,出现提示,显得很繁琐>:请输入第一个点:>:请输入第二个点:line 指定第一点:>:指定下一点或[放弃(U)]:>:指定下一点或[放弃(U)]:>:命令: nil2.解决办法:通过改变系统变量cmdecho的值来关闭响应(defun myline()(graphscr)(setq oce (getvar "cmdecho"))(setvar "cmdecho" 0)(setq pt1 (getpoint "\n请输入第一个点:"))(setq pt2 (getpoint pt1 "\n请输入第二个点:"))(command "line" pt1 pt2 "")(setvar "cmdecho" oce)(princ))3.程序框架:(defun ×××()(graphscr)(setq oce (getvar "cmdecho"))(setvar "cmdecho" 0)…… ……(setvar "cmdecho" oce)(princ))第十四章读写数据库1.打开数据文件(setq fp (open "d:/lisp/point.txt" "r"))用open函数打开数据库,文件须制定路径,同时需要指出文件的读取模式.文件的读取模式:r----读出w---写入a---添加2.读出数据(setq pt1 (read-line fp)) ;按行读出数据(setq pt1 (read pt1)) ;去掉数据外面的双引号3.关闭数据库(close fp)4.读取数据库程序示例首先建立数据文件d:/lisp/point.txt编写下面的程序,运行,检验程序的正确性.(defun myline()(graphscr) ;图形窗口(setq oce (getvar “cmdecho”)) ;保存变量的值(setvar “cmdecho” 0) ;改变变量的值(setq fp (open “d:/lisp/point.txt”“r”)) ;打开文件(while (/= (setq pt1 (read-line fp)) nil) ;判断是否到文件末(setq pt1 (read pt1)) ;去掉外层引号(princ “\n”) ;回车键(princ pt1) ;显示数据)(close fp) ;关闭文件(setvar “cmdecho”oce) ;回复变量的值(princ) ;关闭最后的响应)5.读取数据库并绘制直线(defun myline()(graphscr) ;图形窗口(setq oce (getvar “cmdecho”)) ;保存变量的值(setvar “cmdecho”0) ;改变变量的值(setq fp (open “d:/lisp/point.t xt”“r”)) ;打开文件(setq pt1 (read-line fp))(setq pt1 (read pt1))(setq pt11 pt1)(while (/= (setq pt2 (read-line fp)) nil)(setq pt2 (read pt2))(command "line" pt1 pt2 "")(setq pt1 pt2))(command "line" pt1 pt11 "")(close fp) ;关闭文件(setvar “cmdecho”oce) ;回复变量的值(princ) ;关闭最后的响应)6.读取数据库并写入另一文件(defun myline()(graphscr)(setq oce (getvar "cmdecho"))(setvar "cmdecho" 0)(setq fp (open “d:/lisp/point.txt”“r”)) ;打开数据文件(setq fp1 (open "d:/lisp/point1.txt" "w"))(while (/= (setq pt1 (read-line fp)) nil) ;读出数据(setq pt1 (read pt1))(princ pt1 fp1) ;写数据(princ “\n”fp1) ;换行)(close fp)(close fp1)(setvar "cmdecho" oce)(princ))第十五章自定义错误函数Autolisp遇到错误时,会通过两种渠道显示错误情况:ERRNO系统变量和*error*函数.通常以后者为主.当*error*函数被设为nil时,Autolisp的错误以预设的显示方式显示:例如:command: (/ 1 0); 错误: 除数为零一般来说(并非所有),当Autolisp的函数执行导致autocad侦测到错误时,系统变量ERRNO会保存对应的错误码.所以,程序里面的自定义错误函数的自定义变得可行.首先定义一个简单报错函数:(defun *error* (msg)(alert msg)(princ))执行语句(/ 1 0) 后,看看响应的提示.1.自定义错误函数的应用(defun sqrtnum()(setvar "errno" 0) ;设置系统变量的值(setq olderr *error*) ;保存*error*的值(defun *error* (msg) ;定义*error*函数(setq en (getvar "errno")) ;取得系统变量"errno"的代码(setq errmsg (strcat "ERRNO = " (itoa en) "\nError: " msg));系统变量的值和错误信息(alert errmsg) ;显示统变量的值和错误信息(setq *error* olderr) ;恢复*error*的值)(setq x (getreal "\n请输入一个数:"))(setq y (* x x))(princ "\n")(princ x)(princ "^2 = ")(princ y)(setq *error* olderr)(princ))运行程序,输入数值时按ESC键看看错误提示.第十六章对话框定义Autolisp不能相其他语言一样用拖拽的方式设计对话框,而是以对话框控制语言进行对话框的设计.Autolisp对话框包括以下的基本组件:标签、按钮、单选框、复选框、编辑框、列表框、下拉列表、滚动条、图象框、图像按钮一、定义各种类型的对话框组件(a) 定义一个空对话框dcl_demo : dialog{label = "我的对话框";ok_cancel;}利用工具菜单里面的“界面工具”,可以对对话框进行预览,如上图所示.(b) 定义一个单选按钮dcl_demo : dialog{label = "我的对话框";: radio_button{key = "myradio";label = "这是一个单选按钮!";}ok_cancel;}(c) 定义一个复选按钮dcl_demo : dialog{label = "我的对话框";: radio_button //定义单选按钮{key = "myradio";label = "这是一个单选按钮!";}: toggle //定义复选按钮{key = "mytoggle";label = "这是一个复选按钮!";}ok_cancel;}(d) 定义一个按钮dcl_demo : dialog{label = "我的对话框";: radio_button //定义单选按钮{key = "myradio";label = "这是一个单选按钮!";}: toggle //定义复选按钮{key = "mytoggle";label = "这是一个复选按钮!";}: button //定义按钮{key = "mybutton";label = "这是一个按钮!";}ok_cancel;}(e) 定义一个编辑框dcl_demo : dialog{label = “我的对话框”;… … … …: button //定义按钮{key = "mybutton";label = "这是一个按钮!";}: edit_box //定义编辑框{key = "myeditbox";label = "这是一个编辑框:";}ok_cancel;}(f) 定义一个标签栏dcl_demo : dialog{label = “我的对话框”;… … … …: button //定义按钮{key = "mybutton";label = "这是一个按钮!";}: edit_box //定义编辑框{key = "myeditbox";label = "这是一个编辑框:";}: text //定义标签栏{key = "mytext";label = "这是一个标签栏,用来写文字说明的!";}ok_cancel;}(g) 定义一个滚动条dcl_demo : dialog{label = "我的对话框";: slider //定义滚动条{key = "myslider";layout = horizontal;max_value = 100;min_value = 1;value = 50;}ok_cancel;}(h) 定义一个下拉列表框dcl_demo : dialog{label = "我的对话框";: slider //定义滚动条{key = "myslider";layout = horizontal;max_value = 100;min_value = 1;value = 50;}: popup_list //定义下拉列表框{key = "mypopup";label = "右边是下拉列表框:";list = "选项1\n选项2\n选项3";edit_width = 12;}ok_cancel;}(i) 定义一个下拉列表框dcl_demo : dialog {label = "我的对话框";: slider //定义滚动条{key = "myslider";layout = horizontal;max_value = 100;min_value = 1;value = 50; }: popup_list //定义下拉列表框{key = "mypopup";label = "右边是下拉列表框:";list = "选项1\n选项2\n选项3";edit_width = 12; }: list_box //定义列表框{key = "mylist";label = "下边是列表框:";list = "选项1\n选项2\n选项3";height = 12; }ok_cancel;}二、用程序驱动单选按钮对话框单选按钮对话框程序dcl_demo : dialog{label = "旋转角度";: boxed_radio_row{key = "rot_angle";label = "请选择一个旋转角度:";: radio_button //定义单选按钮{key = "angle0";label = "0";}: radio_button //定义单选按钮{key = "angle90";label = "90";}: radio_button //定义单选按钮{key = "angle180";label = "180";}: radio_button //定义单选按钮{key = "angle270";label = "270";}}ok_only;}编写上述文件,并保存为dialog.dcl文件.其对应的对话框界面如下图所示: (b)对话框驱动程序,保存为test.lsp文件(defun c:myradio();加载对话框文件,将返回文件识别码的值赋予dcl_id(setq dcl_id (load_dialog "dialog.dcl"));检查打开对话框是否成功(if(not (new_dialog “dcl_demo” dcl_id)) (exit));回调函数(defun choose(ang)(cond((= ang "angle0") (setq r_ang 0))((= ang "angle90") (setq r_ang 90))((= ang "angle180") (setq r_ang 180))((= ang "angle270") (setq r_ang 270))));设定angle0的初始值为"1"(set_tile "angle0" "1");将r_ang的初始值设为0(setq r_ang 0);用户选择的时候进行判断,返回所选的值(action_tile "rot_angle" "(choose $value)");如果单击确定按钮,则销毁对话框(action_tile "accept" "(done_dialog)");显示对话框(start_dialog);将所选的数值进行输出(princ "\n您选择了")(princ r_ang)(princ " 度!");卸载对话框文件(unload_dialog dcl_id)(princ))加载执行可以看到程序的运行结果!三、用程序驱动复选框对话框(defun c:myradio();加载对话框文件,将返回文件识别码的值赋予dcl_id(setq dcl_id (load_dialog "mydcl.dcl"));检查打开对话框是否成功(if(not (new_dialog "dcl_demo" dcl_id)) (exit));回调函数(setq xian 0 sany 0 lanz 0)(action_tile "xa" "(setq xian (atoi $value))")(action_tile "sy" "(setq sany (atoi $value))")(action_tile "lz" "(setq lanz (atoi $value))");如果单击确定按钮,则销毁对话框(action_tile "accept" "(done_dialog)");显示对话框(start_dialog);将所选的数值进行输出(princ "\n在下面的几个城市中,我选择::")(princ "\n西安:") (if(= xian 1) (princ "想去!") (princ "不想去!")) (princ "\n三亚:") (if(= sany 1) (princ "想去!") (princ "不想去!")) (princ "\n兰州:") (if(= lanz 1) (princ "想去!") (princ "不想去!")) ;卸载对话框文件(unload_dialog dcl_id)(princ))下面是对话框程序:dcl_demo : dialog{label = "旋转角度";: row{key = "rot_angle";label = "请选择你想去的旅游城市:";: toggle //定义复选按钮{key = "xa";label = "西安";}: toggle //定义复选按钮{key = "sy";label = "三亚";}: toggle //定义复选按钮{key = "lz";label = "兰州";}}ok_only;}注意:将单选按钮或复选框组成行列(或区)的时候,具体是有些不同的。

AUTOLISP培训教程_4

AUTOLISP培训教程_4

AUTOLISP培训教程_4在工程设计和绘图领域,AUTOLISP 作为一种强大的编程语言,为我们提供了许多高效和便捷的工具。

接下来,让我们一起深入了解更多关于 AUTolisp 的知识和应用技巧。

首先,我们来谈谈 autolisp 中的数据类型。

AUTOLISP 支持多种数据类型,比如整数、实数、字符串、列表等等。

整数就是我们常见的没有小数部分的数字,实数则包含小数部分。

字符串就是被引号括起来的一系列字符。

而列表则是用括号括起来的一组数据,可以包含不同的数据类型。

理解这些数据类型是编写有效 autolisp 程序的基础。

函数是 autolisp 编程中的重要组成部分。

例如,(setq x 10) 这个语句,其中“setq”就是一个函数,用于给变量 x 赋值为 10 。

再比如,(+ 5 3) 会返回 8 ,这里的“+”就是一个用于加法运算的函数。

在实际编程中,我们经常需要进行条件判断。

比如,(if (> x 5) (princ "x 大于 5")(princ "x 不大于 5"))这个语句,如果变量 x 的值大于 5 ,就会输出“x 大于5”,否则输出“x 不大于5”。

通过合理使用条件判断,我们可以让程序根据不同的情况执行不同的操作。

循环结构在 autolisp 中也非常有用。

像(while (< x 10) (princ x) (setq x (+ x 1))),只要 x 小于 10 ,就会执行循环体中的操作,不断输出 x 的值,并将 x 的值增加 1 。

循环结构能够帮助我们处理需要重复执行的任务,提高编程效率。

接下来,我们说一说 autolisp 与 AutoCAD 的交互。

通过 autolisp ,我们可以获取 AutoCAD 中的图形对象信息,例如点、线、圆等的坐标、长度、半径等属性。

还可以使用 autolisp 来创建、修改和删除这些图形对象。

例如,要创建一个圆,可以使用(command "circle" "0,0" 5) 这个语句。

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 支援軟體。

AutoCAD之AutoLisp入门教程

AutoCAD之AutoLisp入门教程

AutoLisp入门教程本节通过一个简单的实例来讲述LISP程序的创建过程,介绍编制LISP程序的一些基本步骤,以及LISP程序在AutoCAD中的加载和运行的方法。

首先来创建一个最简单的LISP程序—-“Hello.lsp”,在AutoCAD 2002中加载并运行该程序,将会在命令行出现-“Hello, Visual LISP!”。

36.2.1 Visual LISP与AutoCAD的通信用户可以直接在AutoCAD命令行中键入AutoLISP表达式。

AutoCAD通过括号来确认AutoLISP表达式。

AutoCAD每当发现一个左括号,就确认为AutoLISP表达式,并由AutoLISP求表达式的值后返回AutoCAD,AutoCAD使用返回结果并继续进行其他工作。

注意在AutoLISP表达式中,左、右括号必须配对,否则AutoCAD将给出提示符n>,n表示右括号丢失数目。

此外,在AutoCAD中调用并执行AutoLISP程序。

在AutoLISP程序中采用COMMAND函数来与AutoCAD 命令程序处理器通信,COMMAND从AutoLISP获得命令并将其传给AutoCAD。

36.2.2 实例1 最简单的LISP程序——“Hello.lsp”Step 1 创建新文件(1) 运行AutoCAD 2002系统,以“acadiso.dwt”为样板创建图形文件,并调用“vlisp”命令进入Visual LISP环境。

(2) 单击“Standard(标准)”工具栏中的按钮,新建一个LISP文件。

Step 2 输入代码并保存文件(1) 在编辑窗口中输入源文件“Hello.lsp”的代码,如图36-3所示。

程序清单如下:;;;* Hello.lsp – Visual LISP文件实例(prompt "Pick point:") ;指定运行时的提示信息(setq ipt (getpoint)) ;在屏幕上指定一点并将其坐标值赋予变量“ipt”(setq hgt 15) ;给变量“hgt”赋值(Command "_.TEXT" "_S" "STANDARD" ipt hgt 0 "Hello, Visual LISP!");调用“Commnad”函数与AutoCAD进行通信[img]/Files/AutoCad/146-1.JPG[/img](2) 单击“Standard(标准)”工具栏中的按钮,以“Hello.lsp”为名保存该文件。

AutoLisp编程入门

AutoLisp编程入门

基本指南:两数求和在命令行输入:(+ 2 3) (- 2 3) (* 2 3) (/ 2 3)如果直接输入(/ 2 3)则会显示0 因为2和3是整型所以AutoLisp把这些数字译为整型(AutoLisp进行了四舍五入)所以输入(setq x (/2.0 3))就可得到0.666667六位小数在命令行输入:!p则会显示p这个变量的值SETQ和变量Setq是来保存计算的结果的,相当于给一个变量赋值例:(setq x (/2.0 3)) 这边x是变量就是把2.0/3的值赋给xSetq能完成多项“设置相等”例如:(setq x 1.0 y 2.0 z 3.0) 就是分别赋给x y z 赋值AutoLISP函数1.数学函数(min 7 3 5 11) 就是取7 3 5 11这四个数的最小值(setq minbr (min 7 3 5 11))数学函数功能+加- 减*乘/除1+自增11- 自减1FLX截取实数的整数部分FLOAT整数变为实数REM返回除法的余数EXPT指数SIN求弧度角的正弦COS求弧度角的余弦ATAN求两个数字的反正切(setq rad (*(/ 45 180.0)pi))2.几何函数(setq p1 '(1.3 5.7)) ‘表示指定2个(3个)的坐标值,这样AutoLISP就不会计算这些值了(setq p2 '(7.5 3.1))(setq p3 '(9 4))(setq p4 '(0.1 2.5))(distance p1 p2)(angle p1 p2)(inters p1 p2 p3 p4)(osnap p1 "mid")2.例:在一个绘制楼梯间的AutoLISP例程中,一部分程序检查层高是否大于8英寸:如果大于,就绘制出14级台阶,如果小于就绘制13级台阶。

3.(strlen “Using AutoCAD”)STRLEN函数将报告Using AutoCAD为13个字符,计算空格。

autolisp教程

autolisp教程

autolisp教程第⼗四章AutoLISP14.1 关于AutoLISPAutoLISP是由Autodesk公司开发的⼀种LISP程序语⾔(LISP是List Processor的缩写)。

第⼀篇关于LISP的参考⽂献是由John McCarthy 在1960年4⽉的《ACM通讯》中发表的。

除了FORTRAN和COBOL,⼤多数在六⼗年代早期开发出来的语⾔都过时了,可是LISP却⽣下来,并且已经成为⼈⼯智能(AI)的⾸选程序序⾔。

AutoLISP解释程序位于AutoCAD软件包中,然⽽AutoCAD R2.17及更低版本中并不包含AutoLISP解释程序,这样,只有通过AutoCAD R2.18及更⾼版本才可以使⽤AutoLISP语⾔。

AutoCAD软件包中包含⼤多数⽤于产⽣图形的命令,但仍有某些命令末被提供。

例如,AutoCAD中没有在图形⽂本对象内绘制矩形及作全局改变的命令。

通过AutoLISP,你可以使⽤AutoLISP程序语⾔编制能够在图形⽂本对象内绘制矩形或作全局选择性改变的程序。

事实上,可以⽤AutoLISP编制任何程序,或把它嵌⼊到菜单中,这样定制你的系统会取得更⾼的效率。

现在,已经有数以百计的第三⽅软件开发⼈员使⽤AutoLISP语⾔编制各种应⽤程序软件包,例如,本⽂作者开发了⼀个名为SMLayout的软件包,⽤它可以产⽣各种复杂⼏何图形的平⾯布局图,这些⼏何图形包括管道的交叉部、过渡都、圆柱、弯管接头、圆锥以及罐顶。

⽬前社会上⾮常需要AutoLISP程序员为应⽤软件及客户菜单的开发提供顾问。

在本章中,我们假定读者已经熟悉了AutoCAD命令及AutoCAD的系统变量。

但是,在开始学习AutoLISP时,却并不需要你是⼀位AutoCAD或编程专家。

同时,本章还假定读者并⽆编程⽅⾯的知识。

如果你熟悉任何⼀种编程语⾔,那么学习AutoLISP 就会很容易。

对各种函数的评细探讨以及对例题的逐步讲解会使你学起来很有兴趣。

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

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

AutoLISP入门单元一: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.图元名称代码如 <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 程序中,在『分号 ;』后的内容均为批注,程序不处理,合时的增长批注,将使程序更具可看性.进修惯及完全性典范: 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)))回到:指令:键入(load"tt") 传回:c:tt指令:tt 传回:130指令:!sa 传回:nil (属区域变量)指令:!sb 传回:nil (属区域变量)指令:!sc 传回:nil (属区域变量)指令:!sd 传回:130 (属整体变量)单元三:快速分类阅读AutoLISP功效函数(一)一.看到以下那么多的 AutoLISP 功效函数,洋洋洒洒17大类:1.您第一个念头,必定惊奇怎么会那么多,您可能快吓坏了!2.您第二个念头,必定会想『那么多,怎么记得下来』,您可能快废弃了!二.其实,您应当要『很高兴』而『充满信念』的,怎么说呢?1.您有那么多的『大将』协助您撰写 AutoLISP 程序,当然阁下又逢源,不单轻松, 并且要快活的不得了!!!2.这些函数只要您先阅读有印象, 要用时,再翻查该函数,懂得用处语法再参加到您的程序中就可以了!!!3.经常应用的函数,写久.用久后,天然会深深切记脑海,想忘都很难,不经常应用的函数, 若硬要您记下来,信任连高手都很艰苦,更况且是初学的您!!!4.您不必再摸不着头绪了,因为您荣幸的失去了本书,就是您成功的开端!!!第一类数学运算功效函数项目函数语法传回1.1 (+ 数值数值 ...) 累计实数或整数数值1.2 (- 数值数值 ...) 减去数值1.3 (* 数值数值 ...) 所稀有值乘积1.4 (/ 数值数值 ...) 第一个数值除以第二个今后数值的商1.5 (1+ 数值) 数值+11.6 (1- 数值) 数值-11.7 (abs 数值) 数值的绝对值1.8 (atan 数值) 横竖切值1.9 (cos 角度) 角度的余弦值,角度值为弧度.1.10 (exp 数值) 数值的指数1.11 (expt 基数指数) 基数的指数值1.12 (fix 数值) 将数值转换为整数值(取整)1.13 (float 数值) 将数值转换为实数值1.14 (gcd 数值 1 数值2) 二数值的最大公因子(greatest common divisor)1.15 (log 数值) 数值的天然对数值(相当于ln,e=2.71828182845904523……)1.16 (max 数值数值 ...) 数值中的最大值1.17 (min 数值数值 ...) 数值中的最小值1.18 pi 常数p ,其值约为 3.14159261.19 (rem 数值1 数值2) 二数值的相除的余数(remainder)1.20 (sin 角度) 角度的正旋值,角度值为弪度1.21 (sqrt 数值) 数值的平方根第二类磨练 & 逻辑运算功效函数项目函数语法传回2.1 (= 暗示式1 暗示式2) 比较暗示式1是否等于暗示式2实用数值及字符串2.2 (/= 暗示式1 暗示式2) 比较暗示式1是否不等于暗示式 22.3 (< 暗示式1 暗示式2) 比较暗示式 1 是否 <小于暗示式22.4 (<= 暗示式1 暗示式2) 比较暗示式 1 是否 <=小于等于暗示式 22.5 (> 暗示式1 暗示式2) 比较暗示式 1 是否 >大于暗示式 22.6 (>= 暗示式1 暗示式2) 比较暗示式1是否大于等于暗示式22.7 (~ 数值) 传回:数值的位not值,(1的补码)2.8 (and 暗示式1 暗示式2…) 逻辑and的成果2.9 (boole 函数整数整数…) 位式布尔运算2.10 (eq 暗示式1 暗示式2) 比较暗示式1与暗示式2是否雷同, 实用串行比较(现实雷同)2.11 (equal 暗示式1 暗示式2 [差量]) 比较暗示式1与暗示式2是否雷同, 差量可省略(内容雷同)第三类转换运算功效函数项目函数语法传回3.1 (angtof 字符串 [模式]) 角度值(单位为度)的字符串转成实数3.2 (angtos 角度 [模式 [精度]]) 角度(单位为弧度)转成的字符串值3.3 (atof 字符串) 字符串转成实数值3.4 (atoi 字符串) 字符串转成整数值3.5 (cvunit 数值原始单位转换单位) 数值转换单位后的值转换根据acad.unt 档案3.6 (distof 字符串 [模式]) 依模式将字符串转成实数值3.7 (itoa 整数) 整数转成字符串3.8 (rtos 数值模式 [精度]) 实数转成字符串3.9 (trans 点原地位新地位 [位移]) 转换坐标体系值第四类串行处理功效函数项目函数语法传回4.1 (append 串行串行 ...) 结合所有串行成一个串行4.2 (assoc 症结元素结合串行) 依症结元素找寻结合串行中关系数据4.3 (car 串行) 串行中的第一个元素通经常应用来求 x 坐标4.4 (cadr 串行) 串行中的第二个元素通经常应用来求 y 坐标4.5 (caddr 串行) 串行中的第三个元素通经常应用来求 z 坐标4.6 (cdr 串行) 除去第一个元素后的串行4.7 (cons 新元素串行) 将新元素结合到串行4.8 (foreach 名称串行暗示式) 将串行的每一元素对应至名称再依暗示式履行响应4.9 (length 串行) 串行内的元素数目4.10 (list 元素元素…) 将所有元素结合成一串行4.11 (listp 元素) 断定元素是否为一串4.12 (mapcar 函数串行1 串行2 ...) 将串行1.串行2.…等串行的元素合营函数,求得新串行4.13 (member 症结元素串行) 取症结元素(含)今后的串行4.14 (nth n 串行) 串行的第n个元素(串行中的元素是从0开端编号的)4.15 (reverse 串行) 将串行元素依次序颠倒过来的串行4.16 (subst 新项旧项串行) 用新项调换串行中的旧项 (substitute,调换)第五类字符串.字符.档案处理功效函数项目函数语法传回5.1 (ascii 字符串) 字符串第一个字符的『ASCII』码(a~z:97~122;A~Z:65~90)5.2 (chr 整数) 整数所对应的 ASCII 单一字符串5.3 (close 文件名称) 封闭档案5.4 (open 文件名模式) 开启档案代码,预备读取或写入数据5.5 (read 字符串) 串行中的字符串的第一组元素5.6 (read-char [档案代码]) 经由键盘或档案中读取单一字符5.7 (read-line [档案代码]) 经由键盘或档案中读取一行字符串5.8 (strcase 字符串 [字样]) 转换字符串大小写5.9 (strcat 字符串1 字符串2 ...) 将各字符串结合成一字符串5.10 (strlen 字符串) 字符串构成的字符数(即字符串长度)5.11 (substr 字符串肇端长度) 掏出子字符串5.12 (wcmatch 字符串格局) T或nil,将字符串与通用字符进行比对5.13 (write-char 数值 [档案代码]) 将一ASCII字符写到档案或屏幕5.14 (write-line 字符串 [档案代码]) 将字符串写到档案或屏幕上第六类等待输入功效函数项目函数语法传回6.1 (getangle [基点] [提醒]) 请求输入十进制角度数值,响应一弧度值提醒及参考点无关紧要6.2 (getcorner 基点 [提醒]) 请求输入另一矩框对角点坐标6.3 (getdist [基点] [提醒]) 请求输入一段距离6.4 (getint [提醒]) 请求输入一整数值6.5 (getkword [提醒]) 请求输入『症结词』6.6 (getorient [基点] [提醒]) 请求输入十进制角度,响应一弧度值不受angbase.angdir影响6.7 (getpoint [基点] [提醒]) 请求输入一个点坐标6.8 (getreal [提醒]) 请求输入一实数6.9 (getstring [提醒]) 请求输入一字符串6.10 (initget [位] 字符串) 设定下次 getxxx 函数的有效输入第七类几何运算功效函数项目函数语法传回7.1 (angle 点1 点2) 取得二点的角度弧度值7.2 (distance 点1 点2) 取得二点的距离7.3 (inters 点1 点2 点3 点4 [模式]) 取得两条线的交点7.4 (osnap 点模式字符串) 依帮助抓点模式取得另一坐标点7.5 (polar 基点弧度距离) 依极坐标法取得另一坐标点7.6 (textbox 图元串行) 取得文字符串的二对角点坐标第八类图元处理功效函数项目函数语法传回8.1 (entdel 图元名称) 删除或逆删除图元8.2 (entget 图元名称 [应用程序串行]) 掏出图元名称的数据串行8.3 (entlast) 掏出图形数据中的最后一个图元8.4 (entmake 图元串行) 树立一个新的图元串行8.5 (entmod 图元串行) 依更新的数据串行更新屏幕上元体8.6 (entnext [图元名称]) 找寻图面中的下一个图元8.7 (entsel [提醒]) 请求拔取一个图元,响应包含图元名称及选点坐标的串行8.8 (entupd 图元名称) 更新屏幕上复元体图形8.9 (handent 图码) 图码的元体名称8.10 (nentsel [提醒]) BLOCK所含副元体图元数据串行8.11 (nentselp [提醒] [点]) BLOCK所含副元体图元数据(以 4 x 4矩形暗示)单元四:快速分类阅读AutoLISP功效函数(二)第九类选择集.符号表处理功效函数项目函数语法传回9.1 (ssadd [图元名称] [选择集]) 将图元参加选择集或树立一新选择集9.2 (ssdel 图元名称选择集) 将图元自选择分散移出9.3 (ssget [模式] [点1] [点2]) 取得一个选择集9.4 (ssget "X" [过滤串行]) 取得依过滤串行所指定规模的选择集9.5 (sslenth 选择集) 盘算选择集的图元个数9.6 (ssmemb 图元名称选择集) 响应图元名称是否包含于选择集内9.7 (ssname 选择集索引值) 依索引值掏出选择分散的图元名称9.8 (tblnext 符号表名称[T]) 检视符号表,有效的符号表: "LAYER"."LTYPE"."VIEW"."STYLE"."BLOCK"9.9 (tblsearch 符号表名称符号) 在符号表中搜寻符号第十类 AutoCAD 相干查询.控制功效函数项目函数语法传回10.1 (command "AutoCAD 指令" ...) 呼叫履行AutoCAD指令10.2 (findfile 檔名) 传回:应当文件名的路径及文件名10.3 (getfiled 标题内定档名扩大名旗帜) 透过尺度AutoCAD档案对话DCL 攀谈框求得档案10.4 (getenv "情况变量") 取得该情况变量的设定值,以字符串暗示10.5 (getvar "体系变量") 取得该体系变量的设定值,以字符串暗示10.6 (setvar "体系变量" 值) 设定该体系变量的值10.7 (regapp 应用类项) 将今朝的AutoCAD图形登记为一个应用程序名称第十一类断定式.轮回相干功效函数项目函数语法传回11.1 (if <比较式> <暗示式1> [暗示式2]) 检算比较式成果,假如为真,履行<暗示式1>不然,履行<暗示式2>11.2 (repeat 整数 [<表达式> <表达式> ...]) 反复履行<整数>次数11.3 (while 标题内定档名扩大名旗帜) 透过尺度 AutoCAD 档案对话DCL攀谈框求得档案11.4 (cond "情况变量") 取得该情况变量的设定值,以字符串暗示11.5 (progn 表达式 1 表达式2 ...) 贯穿连接其内的表达式为一组,经常应用于合营if.cond等函数第十二类函数处理.界说.追踪 & 错误处理功效函数项目函数语法传回12.1 (*error* 字符串) 程序错误时的警示讯息12.2 (alert 字符串) 以攀谈框式显示出警告字符串12.3 (apply 功效函数串行) 将功效函数与串行结合后履行12.4 (defun 名称自变量串行暗示式 ...) 自定函数或子程序12.5 (eval 暗示式) 传回:暗示式的履行成果12.6 (exit) 强迫退出今朝的应用程序12.7 (lambda 自变量暗示式) 界说未签字的函数12.8 (progn 表达式 1 表达式2 ...) 贯穿连接其内的表达式为一组,经常应用于合营if.cond等函数12.9 (quit) 强迫退出今朝的应用程序12.10 (tablet 代码 [列1 列2 列3 偏向]) 取用或树立对数字板的校调12.11 (trace 函数…) 对函数设定追踪旗帜,帮助除错12.12 (untrace 函数…) 对函数设定解除追踪旗帜第十三类显示.打印控制功效函数项目函数语法传回13.1 (graphscr) 作图情况切换到图形画面13.2 (grclear) 临时消除模前的屏幕画面13.3 (grdraw 起点终点色彩 [亮显]) 临时性的画出一条线13.4 (grread [追踪]) 由输入装备读取追踪值13.5 (grtext 地位字符串 [亮显]) 将字符串显示在状况列或屏幕菜单上13.6 (grvecs 向量串行 [转置矩阵]) 临时性的画出多条线13.7 (menucmd 字符串) 供给在AutoLISP中呼叫各菜单13.8 (prin1 [暗示式 [档案代码]) 将暗示式打印于敕令区或已开启的档案,句柄字符则以"\" 为前缀睁开13.9 (princ [暗示式 [档案代码]) 除句柄字符则不以 "\" 为前缀睁开外其余同prin113.10 (print [暗示式 [档案代码]) 除暗示式会往下一新行列出,及一空非分特别其余同prin113.11 (prompt 讯息) 将讯息显示于屏幕的敕令区,并随后响应一个nil讯息13.12 (redraw [图元名称 [模式]]) 重绘整张图或依图元名称重绘该图形13.13 (terpri) 在屏幕上显示新列13.14 (textscr) 作图情况切换到文书画面13.15 (textpage) 消除文书画面文字相似DOS的cls指令13.16 (vports) 传回:窗口组态串行第十四类符号.元素.暗示式处理功效函数。

AUTOLISP教程

AUTOLISP教程

函数 (Function)在AutoLISP程序语言中所有的成份都是以函数的形式出现,AutoLISP程序就是顺序执行连串的函数.函数的运行过程就是对函数的求值(结果)过程;函数的基本语法如下:(函数名称参数1 参数2....)e.g. (PRINC "AutoLISP Programming")每一个完整的函数必须包在一对小括号( )内,左边为开括号,右边为关括号;如有若干数量的开括号,则一定有同等数量的关括号对应.左边开括号后紧随函数名称.函数名称与参数之间,或参数与参数之间须最少留一个空格.函数可有一个或多个参数(也可能没有参数),视该函数而定.函数名称不分大小写,即大小写字母视为相同.数据型态 (Data Type)整数 (INT)没有小数字的数值,32位有号数,范围从+2,147,483,647到-2,147,483,648实数 (REAL)带小数字的数值,以倍精度浮点格式储存(最少14位小e.g. 12.5数)当数值在1与-1之间时,必须加上前导零 e.g. 0.05可以科学记号表示 : 在E或e后加上次方值 e.g. 4.1e-6字符串 (STR)一般文字,其前后必须加上双引号 " e.g. "AutoCAD"控制字符或脱逸码必须为小写,且须在字符前加上反斜e.g. "\AutoCAD"杠 \像素名称 (ENAME)是指定给图文件内对象的指针(Pointer,为16进位的数字卷标)e.g. <Entity name:14e5180>像素名称在图文件内是唯一的,不会重复对象的像素名称只在目前作业中有效,再开启图档时,会指定新的像素名称予该对象档案 (FILE)以OPEN函数所开启档案的指针,作为其它函数(读写该档案)的自变量数据型态 (Data Type)选集 (PICKSET)用SSGET等函数建立的一个或多个对象的集合或群组转化 (VARIANT)可将像素名称转换为可与ActiveX配搭使用的VLA-Object对象符号 (SYM)用以储存静态数据的名称;例如内建或用户定义的函数符号名称不分大小写,可由任意长度的可打印字符组成;但下列的字符除外: 左括号 ( 右括号 ) 句点 . 单引号 ' 双引号 " 分号 ;表 (LIST)亦称为串行,是放在一对小括号 ( )内,一个或多个元素的有序集合e.g. (1.0 "Lisp" ( ) (5.6 7))元素可以是字符串,符号,整数或实数;也可以是另一个表元素与元素之间要用空格隔开,但元素与小括号之间则可以不隔空格为便于存取表内各元素,每个元素均有其序号;从表的左边开始,第一个元素序号为0,依此类推表的大小即为其顶层元素的数量(内层嵌套式的表,视为单一元素)点对(Dotted Pair)亦是表的一种;表内有2个元素,中间以一圆点分隔,且元素与圆点之间亦须以空格分开若表内没有任何元素,称为空串行或空表;以 ( ) 或 (NIL) 表示变数 (Variable)为程序执行中动态储存数据的符号名称;主要分为2类:区域(Local)变量又称为局部变量;该变量只在该程序段落中有效,不能为其它程序使用全局(Global)变量又称为整体变量;变量在所有程序段落中均可使用变量名称与符号的限制相同,使用时宜采用有意义及易于辨别的名称变量在赋值或使用前无须先行设定相同的变量可以储存不同型态的数据(但同一时间内只可储存一种型态) 在指定新的数据之前,变量储存的内容会保持不变赋值将数据给予指定的变量储存以内建函数SETQ进行(可用于绘图模式的指令行或AutoLISP程序),其语法如下:(SETQ 变量名称1 资料1 [变量名称2 资料2 ....] )e.g. (SETQ NAME "David" AGE 37 WEIGHT 72.5 POINT (LIST 10 20))在函数名称之后,各参数以两个一组,每组左边为变量名称,右边为存入变量的数据亦可将变量名称赋以空值(NIL) :e.g. (SETQ OCCUPATION NIL)要显示变量所储存的数据,可以使用内建函数PRINC(可用于绘图模式的指令行或AutoLISP程序),其语法如下 :(PRINC 变量名称 )e.g. COMMAND : (PRINC NAME)Result : David"David"在绘图模式中,亦可于指令行中使用感叹号 ! 来显示变量内容,或作为指令选项的输入值;语法如下 :!变量名称e.g. COMMAND : !NAME Result : "David"在Visual LISP的控制台窗口中,于提示符号 _$ 后键入要显示的变量名称_$变量名称e.g. _$NAME要检查变量所储存的数据型态,可使用内建函数TYPE;语法如下:(TYPE 变量名称)e.g. COMMAND : (TYPE NAME)Result : STR若检查的变量没有储存数据,则会传回NIL练习 (Exercises)将四个坐标分别存入四个变量中,并以LINE或PLINE指令,配合四个坐标变量,画出正四边形.COMMAND : (SETQ POINT1 (LIST 0 0) POINT2 (LIST 0 10) POINT3 (LIST 10 10) POINT4 (LIST 10 0))COMMAND : LINE;直线段指令COMMAND : !POINT1;第一点(左下角起点) COMMAND : !POINT2;第二点(左上角)COMMAND : !POINT3;第三点(右上角)COMMAND : !POINT4;第四点(右下角)COMMAND : C;自动联机至起点以关闭四边形画圆 : 将圆心坐标及半径长度分别存入两个变量中(变量名称及数据型态自定义)COMMAND : (SETQ CEN (LIST 0 0) RAD 20);将圆心点设为坐标0,0;半径为20COMMAND : CIRCLE;执行划圆指令Specify center.... : !CEN;在提示后以变量CEN响应输入Specify radius.... : !RAD;在提示后以变量RAD响应输入将不同型态的数据,分多次存入相同的变数内;每次均以PRINC及TYPE函数显示变量内容及其数据型态COMMAND : (SETQ TEMP 1.2);将实数1.2存入变数TEMP COMMAND : !TEMP Result : 1.2COMMAND : (TYPE TEMP)Result : REALCOMMAND : (SETQ TEMP "AutoLISP");将字符串存入变量TEMP COMMAND : !TEMP Result : "AutoLISP" COMMAND : (TYPE TEMP)Result : STR+基本运算加函数(+ [数值参数1 数值参数2 ....] )e.g. (+ 2.5 4 6)Result : 12.5函数的结果为各参数之总和若仅提供一个参数,则以0加上此参数的结果为返回值若没有提供任何参数则传回0;各参数须为整数或实数型态若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转换为实数减函数(- [数值参数1 数值参数2 ....] )e.g. (- 10 2 3)Result : 5结果为第一个(最左边)参数减去其右边各参数的总和若只提供一个参数,返回值为0减去该参数的结果若没有提供任何参数则传回0;各参数须为整数或实数型态若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转换为实数乘函数(* [数值参数1 数值参数2 ....] )e.g. (* 2 3 4)Result : 24结果为所有参数的乘积若只提供一个参数,则返回值为该参数乘以1的结果若没有提供任何参数则传回0;各参数须为整数或实数型态若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转换为实数除函数(/ [数值参数1 数值参数2 ....] )e.g. (/ 24 2 3)Result : 4结果为第一个(最左边)参数除以其右边各参数的乘积若仅提供一个参数,则返回值为该参数除以1的结果若没有提供任何参数则传回0;各参数须为整数或实数型态若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转换为实数注意 : 在本篇教程中,各函数的数值参数,均可以变量(储存值只可以是整数或实数,且不可以是空值 nil)取代.练习 (Exercises)计算式 (2+4)*3COMMAND : (* 3 (+ 2 4))Result : 18计算式 (50-8*5)/4COMMAND : (/ (- 50 (* 8 5)) 4)Result : 2注意 : 上式的正确答案应是2.5,因为函数中的各参数均为整数,所以传回的结果亦为整数递增及递减递增(1+ 数值参数 )e.g. (1+ 2)Result : 3递减(1- 数值参数 )e.g. (1- 4)Result : 3三角函数 (Trinagular Function)正弦值(SIN 弧度参数)e.g. (SIN 1)Result : 0.841471余弦值(COS 弧度参数)e.g. (COS 1)Result : 0.540302反正切值(ATAN 弧度参数)e.g. (ATAN 1)Result : 0.785398其它数值处理次方值(EXPT 数值参数次方值 )e.g. (EXPT 2 4)Result : 16若参数及次方值两个均为整数,返回值亦是整数;若其中一个为实数,结果为实数开方根(SQRT 数值参数 )e.g. (SQRT 30)Result : 5.47723绝对值(ABS 数值参数 )e.g. (ABS -123)Result : 123余数(REM [数值参数1 数值参数2 ....] )e.g. (REM 50 26 5) = (REM (REM 50 26) 5)Result : 4将参数1整除参数2的余数若参数多于2个时,则会将余数再整除下一个参数,再得出余数;依此类推若其中一个参数为实数时,则结果为实数;否则为整数最大公约数(GCD 数值参数1 数值参数2 )e.g. (GCD 81 57)Result : 3两个参数均必须为整数值型态自然对数(LOG 数值参数 )e.g. (LOG 3.5)Result : 1.25276是EXP函数的反函数;传回值为实数型态自然反对数(EXP 数值参数 )e.g. (EXP 1.25276)Result : 3.49999是LOG函数的反函数;传回值为实数型态数值资料转型实数转整数(FIX 数值参数 )e.g. (FIX 12.56)Result : 12只会截去小数部份(小数字不会4舍5入)整数转实数(FLOAT 数值参数 )e.g. (FLOAT 12)Result : 12.0整数转字符串(ITOA 数值参数 )e.g. (ITOA -17)Result : "-17"数值转字符串(RTOS 数值参数 [模式 [小数字] ] )e.g. (RTOS 17.23333 2 3)Result : 12.266若不设定模式,则依系统变量 LUNITS 的设定值转换数值为字符串若不设定小数字,则依系统变量 LUPREC 的设定值转换模式设定值可以是下列数值之一 :1 = 科学记号2 = 十进制3 = 英呎及十进制英吋4 = 英呎及分数位英吋5 = 分数当选用的模式为3,4或5,则传回的字符串受系统变量UNITMODE影响弪度转字符串(ANGTOS 角度参数[模式 [小数字] ] )e.g. (ANGTOS 0.785398 0)Result : "45"e.g. (ANGTOS 0.785398 4)Result : "N 45d E"若不设定模式,则依系统变量AUNITS的设定值转换数值为字符串若不设定小数字,则依系统变量AUPREC的设定值转换模式设定值可以是下列数值之一 :0 = 度1 = 度/分/秒2 = 分度量3 = 弪度4 = 土地测量单位当选用的模式为4,则传回的字符串受系统变量UNITMODE影响反函数为ANGTOF;参阅第5篇教程数值资料检查数值(NUMBERP 数值参数 )e.g. (NUMBERP -3.45)Result : Te.g. (NUMBERP "AutoLISP")Result : nil注意 : 在范例的传回值中,T表示函数的结果为真(成立),nil表示结果为假(不成立)负数值(MINUSP 数值参数 )e.g. (MINUSP -3.45)Result : Te.g. (MINUSP 0)Result : nile.g. (MINUSP 3.45)Result : nil零值(ZEROP 数值参数 )e.g. (ZEROP 0)Result : Te.g. (ZEROP 3.45)Result : nil其它应用最大值(MAX [数值参数1 数值参数2 ....] )e.g. (MAX -88 5 2)Result : 5若没有提供任何参数,则传回值为0最小值(MIN [数值参数1 数值参数2 ....] )e.g. (MIN -88 5 2)Result : -88若没有提供任何参数,则传回值为0练习 (Exercises)计算下列算式 :(+ 1234567890 1234567890)Result : -1825831516上式中两个数值参数均为整数,而结果值大于整数型态所能容许之范围;固导致发生溢位问题,产生无效的结果.修正算式如下 : 只要将其中一个参数改为实数型态即可.(+ 1234567890.0 1234567890)Result : 2.46914e+009计算下列算式 :(+ 9876543210 1234567890)Result : 1.11111e+010上式中两个数值参数均为整数,但其中一个(第一个)参数巳大于整数型态所能容许之范围;系统会自动将此参数先行转为实数型态才计算.计算下列算式 :(FIX (SQRT (+ 1 (MAX 20 10 40 30))))Result : 6最先执行的是最内层的算式(MAX 20 10 40 30) ,求出最大值为40----其次执行加函数,将MAX函数所得的最大值加1,结果为41----再利函数SQRT,将41开方根,结果为6.4031----最后使用FIX函数,截去其小数字,得到最后的结果为6----用户定义函数是将一群表示式组合成一个函数或指令可应用于绘图模式的指令行提示,Visual LISP控制台,或供其它自定义函数内的表示式呼叫使用AutoLISP源代码均以纯文本格式存档,扩展名为LSP(2000版可编译成扩展名为FAS的档案可以一般文本编辑器进行开发,如DOS的EDIT,WINDOWS的WORD或WORDPAD 等一个自定函数内最少要有一个表达式在原程序文件(LSP)里,自定义函数以DEFUN函数开始;其语法如下 :(DEFUN [C:] 函数名称( [自变量串行 ...] [/ 局部变数串行 ...] ) 表达式 ...)在呼叫带有自变量的自定函数时,必须同时提供与定义函数时,同等数量的参数,使各参数传入自定函数的各自变量中自变量被视为一种特殊类型的局部变量,无法用于该自定函数以外的其它函数若自定函数中无须设定任何自变量,亦必须以空串行 ( )加在函数名称之后若有提供局部变量,必须以斜线 / 加在局部变量的开头(即使前面没有自变量串行)各自变量,斜线,局部变量之间要以空格分隔;但与左右小括号之间则不须以空格分开若自变量串行中有相同名称的自变量出现,则会忽略第一个以后的相同自变量;变数亦是一样若在函数名称前加上C:,表示该函数可以在绘图模式的指令行提示下,其执行方式与内建函数相同;亦可以在任何内建命令(执行中)的提示后,以通透方式执行(但须将函数名称包在一对小括号中)若在函数名称前没有加上C:,在指令行提示下,必须将函数名称包在一对小括号中才可执行不可以在执行一自定函数时,以通透方式执行另一自定函数加载程序自定函数在使用前,都要将其所在的程序文件(扩展名为LSP)加载才可执行ACAD.LSP程序文件(默认在SUPPORT子目录内)会在启动AutoCAD时自动加载(LOAD "程序文件名称" [加载失败] )e.g. (LOAD "TEST")若程序文件之文件名为LSP,则在程序文件名称之后,可以不加上扩展名若有需要,系统会顺序尝试其它的扩展名 : VLX FAS LSP若程序文件不在系统的支持目录下,则需在文件名前加上目录路径注意 : 必须以正斜线 / 或两个反斜杠 \\ 作为目录的分隔符可以在加载失败的参数中提供字符串,以供加载失败时显示;亦可提供有效的自定函数,该函数在加载程序文件失败时会被执行e.g. (LOAD "TEST" "Load Fail") 或 (LOAD "TEST" (DOERROR))注意 :在程序文件加载后,在提示行显示的返回值,一般是该程序文件中,最后被定义的函数名称或是在程序文件内没有包含在自定函数中,最后一个表达式的执行结果练习 (Exercises)启动文本编辑器,编写一AutoLISP程序作两个同心圆 (第1个圆半径为50,第2个圆半径为80),程序代码如下所示 :(DEFUN C: 2CIRCLE ()(SETQ CEN (LIST 0 0) RAD 50)(COMMAND CIRCLE CEN RAD)(COMMAND CIRCLE CEN (+ RAD 30)))输入后以纯文本格式存档(C:\TEST.LSP)----在AutoCAD绘图模式的指令行提示后,用LOAD函数将程序文件加载----COMMAND : (LOAD "C:/TEST")在指令行提示后,输入程序(函数)名称执行----COMMAND : 2CIRCLE程序说明1使用DEFUN建立自定函数的名称,并用SETQ函数将中心点(LIST 0 0)存入变数CEN,半径(50)存入变数RAD中2使用COMMAND函数执行AutoCAD内建指令CIRCLE,并以变量CEN(圆的中心点)及变数RAD(圆的半径)回应3与第2行大致相同,但在指定其半径时,先将储存半径的变量加30,使划出半径为80的圆;注意最右边的关括号,与第1行DEFUN左边的开括号是一对的启动文本编辑器,开启TEST.LSP程序文件,复制2CIRCLE至新程序2C,并改为传入自变量方式执行;程序代码如下 :(DEFUN 2C (CEN RAD)(COMMAND CIRCLE CEN RAD)(COMMAND CIRCLE CEN (+ RAD 30)))----输入后以纯文本格式存档在AutoCAD绘图模式的指令行提示后,用LOAD函数将程序文件重载----在指令行提示后,输入程序(函数)名称执行----COMMAND : (2C (LIST 0 0) 50)批注单行批注分号 ;表示在分号右边(同一行)的字符均为批注,程序执行时会将其忽略多行批注;| |;表示在两个批注符号中间所有字符皆为批注,即使字符跨越多行关系运算在各个关系运算中,都会传回一逻辑值;若关系成立,传回 T,否则会传回nil各参数可以是字符串,整数或实数型态;若以字符串进行比较,则会以字符串的ASCII码为准若函数中只有一个参数,传回值恒为 T等于函数(= 参数1 [参数2 ....] )会将参数1与其后各个参数比较,若全部相等则传回 T,否则传回 nile.g. (= 2 2.0)Result : Te.g. (= "A" CHR(65))Result : T不等于函数(/= 参数1 [参数2 ....] )若参数1不等于其后任何一个参数,即传回 Te.g. (/= 1 2.0)Result : Te.g. (/= "a" CHR(65))Result : Te.g. (/= 10 30 40 10 20)Result : T小于函数(< 参数1 [参数2 ....] )各参数顺序以2个为一组比较,若各组左边的参数均小于右边的参数,即传回Te.g. (< 1 2)Result : Te.g. (< "a" CHR(65))Result : T大于函数(> 参数1 [参数2 ....] )各参数顺序以2个为一组比较,若各组左边的参数均大于右边的参数,即传回Te.g. (> 1 2)Result : nile.g. (> "a" CHR(65))Result : nil小于或等于函数(<= 参数1 [参数2 ....] )各参数顺序以2个为一组比较,若各组左边的参数均小于或等于右边的参数,即传回 Te.g. (<= 1 2)Result : Te.g. (<= 2 2)Result : Te.g. (<= "a" CHR(65))Result : T大于或等于函数(>= 参数1 [参数2 ....] )各参数顺序以2个为一组比较,若各组左边的参数均大于或等于右边的参数,即传回 Te.g. (>= 1 2)Result : nile.g. (>= 2 2)Result : Te.g. (>= "a" CHR(65))Result : nil条件判断是利用条件函数,配合关系及逻辑运算所设定的一些准则,令程序自行分析,因应情况作出适当行动.单一条件(IF 条件表达式 是表达式 [否表达式] )函数先检查条件表达式,若其传回值为 T,便会执行其后的是表达式若有提供否表达式,且条件表达式的传回值为 nil,函数将不会执行(跳过)是表达式而执行否表达式若没有提供否表达式,且条件表达式的传回值为 nil 时,函数将不作任何事情IF 函数可以巢状方式嵌套,即在是或否的表达式中加入另一个IF 函数练习 (Exercises)判断空气污染指数 : 大于100 = Very High, 51至100 = High, 26至50 = Medium, 25或以下 = Low----启动编辑器,开启C:/TEST.LSP 程序文件;新增AIR-1自定函数,程序代码如下 :(DEFUN AIR-1 (NUM) (IF (> NUM 100) (PRINC "Very High")) (IF (AND (> NUM 50) (<= NUM 100)) (PRINC "High")) (IF (AND (> NUM 25) (<= NUM 50)) (PRINC "Medium")) (IF (<= NUM 25)) (PRINC "Low")) (PRINC))程序说明1 设定函数名称,并将数据存入自变量NUM 内;用IF 函数判断变量NUM 是否大于100;若是则显示字符串Very High 响应2 用IF 函数判断变量NUM 是否大于50且(AND )小于或等于100;若是则显示High 响应3 用IF 函数判断变量NUM 是否大于25且(AND )小于或等于50;若是则显示Medium4 用IF 函数判断变量NUM 是否小于或等于25;若是则显示Low5 是一个没有提供任何自变量的PRINC 函数;用以抑制显示答案时尾部符加的nil 或重复的传回值;而最右一个关括号,是用以对应第1行最左边的开括号续下一课 .... 续上一课 ....IF 函数的巢状练习 : 修改上一课的程序练习,将多个IF 函数合并成巢状嵌套---- 启动文本编辑器,开启C:/TEST.LSP 程序文件 ---- 新增程序AIR-2,其程序代码如下 :(DEFUN AIR-2 (NUM) (IF (> NUM 50)(PRINC (IF (> NUM 100) "Very high""High"))(PRINC (IF (> NUM 25) "Medium""Low"))) (PRINC))程序说明1 设定函数名称,并将数据存入自变量NUM 内;用IF 函数判断变量NUM 是否大于50;若条件成立(变量NUM 大于50)时,再用另一个IF 函数判断变量是否大于100; 若条件成立(变量NUM 大于100)时,使用PRINC 函数显示字符串Very High,否则显示High2 若在第1个IF 函数判断中,条件不成立(变量NUM 不大于50)时;再用另一个IF 函数判断变量是否大于25;若条件成立(NUM 大于25)时,显示字符串Medium,否则显示字符串Low3 是一个没有提供任何自变量的PRINC 函数;用以抑制显示答案时尾部符加的nil 或重复的传回值;而最右一个关括号,是用以对应第1行最左边的开括号注意 :第1行最后一个关括号是对应前面的PRINC 函数,尾2的关括号则是对应IF 函数 (判断NUM 是否大于100)第2行最后一个关括号是对应第1行的IF 函数 (判断NUM 是否大于50),尾2的关括号则是对应PRINC 函数,尾3的关括号则是对应IF 函数 (判断NUM 是否大于25)最右边的关括号是对应第1行最左边的开括号PROGN 函数在以上各范例中,执行的表达式均为单一的函数运算;若要在表达式中顺序执行一连串的函数,便要将各函数包含在一个PROGN 函数内;函数的传回值会是该PROGN 函数中,最后一个表达式的运算结果----修改TEST.LSP 程序文件的AIR-1程序,第1个IF 函数如下,其余的IF 函数请自行修改e.g. (IF (> NUM 100) (PROGN (SETQ DISP "Very High") (PRINC DISP)))注意 :最后一个关括号是对应前面的IF 函数 (判断变量NUM 是否大于100)尾2的关括号是对应PROGN 函数 (用以包含SETQ 及PRINC 函数)尾3的关括号是对应PRINC 函数的循环 (Loop)配合条件判断,关系及逻辑运算,令程序不断重复一些动作,以提高效率及减少重复动作时的人为错误可以多个循环形成巢状(嵌套式)循环,即在一个循环内嵌套另一个(或多个)循环指定的重复次数必须为正整数,亦可以是储存正整数的变量名称重复指定次数(REPEAT 重复次数 [表达式 ....] )e.g. (REPEAT 10 (PRINC "David"));重复显示David字符串10次重复(WHILE 条件表达式 [是表达式 ....] )若条件表达式的传回值为 T,即会顺序执行函数内各表达式各表达式顺序执行完后,程序会返回函数的开头,重新检查条件表达式的传回值若条件表达式的传回值为 nil,函数内各表达式将不会被执行e.g.(SETQ COUNT 1);将1存入变数COUNT(WHILE (<= COUNT 10);WHILE函数并检查变量COUNT是否<=10(PRINC "David");若条件成立则以PRINC函数显示David 字符串(SETQ COUNT (1+ COUNT)));变量COUNT递增1,并将新值重新存入变量COUNT中取代原值注意 : 第4行最右边的关括号,是对应第2行WHILE函数的开括号无限循环又称为死循环,即循环的条件判断式传回值恒为 T,令循环不断重复而无法结束;在上例中 :----若WHILE函数的条件表达式设定为 (T) ;即条件永远成立----不作SETQ函数,或不将变量COUNT递增;变量COUNT储存值恒久不变,导致条件式永远成立练习 (Exercises)编写一程序SUM并将自变量存在NUM变量内,计算1+2+3+4 ....至变数NUM(DEFUN SUM (NUM)(SETQ COUNT 1 TOTAL 0)(WHILE (<= COUNT NUM)(SETQ TOTAL (+ TOTAL COUNT)COUNT (1+ COUNT)))(PRINC TOTAL) (PRINC))程序说明1设定函数SUM并将自变量存入变量NUM,设定变量COUNT以将数目由1开始递增,变量TOTAL(储存总和)初始值为02WHILE循环函数,并设定进入循环的条件式(变量COUNT小于或等于变量NUM) 3若条件成立即进入循环内部,先将变量TOTAL加上变量COUNT,再用SETQ函数存回变量TOTAL中,覆盖原值4将变量COUNT递增1,存回变数COUNT并覆盖原值5关括号与第2行的WHILE函数左边的开括号对应6循环结束后,用PRINC函数显示变量TOTAL(总和)的内容程序流程假设执行程序时传入变量NUM的数值为10----变数初始值COUNT = 1 TOTAL = 0 判断变量COUNT是否<=变量NUM COUNT = 1 TOTAL = 0 --------变量COUNT(现值1)小于NUM,进入循环;将COUNT = 1 TOTAL = 1 TOTAL(现值0)加上COUNT,存回变数TOTALCOUNT = 2 TOTAL = 1 ----变数COUNT(现值1)递增1变为2,存回变数COUNT返回WHILE函数的开头,重新判断条件式----变量COUNT(现值2)小于NUM,进入循环;将----COUNT = 2 TOTAL = 3 TOTAL(现值1)加上COUNT,存回变数TOTAL----变数COUNT(现值2)递增1变为3,存回变数COUNT = 3 TOTAL = 3 COUNT返回WHILE函数的开头,重新判断条件式--------变量COUNT(现值3)小于NUM,进入循环;将COUNT = 3 TOTAL = 6 TOTAL(现值3)加上COUNT,存回变数TOTAL部份过程省略返回WHILE函数的开头,重新判断条件式----COUNT = 10 TOTAL = 55 变量COUNT(现值10)仍等于NUM,进入循环;----将TOTAL(现值45)加上COUNT,存回变数----变数COUNT(现值10)递增1变为11,存回变COUNT = 11 TOTAL = 55 数COUNT返回WHILE函数的开头,重新判断条件式----COUNT = 11 TOTAL = 55 变量COUNT(现值11)巳大于NUM(本范例假设----为10),条件判断不成立,循环结束----显示变量TOTAL的现存值,程序结束尝试用IF函数检查输入的自变量是否小于或等于0;若条件成立则不执行余下的程序(DEFUN SUM (NUM)(IF (<= NIM 0) (PRINC "Input Error")(PROGN略过 WHILE 及 PRINC 函数))(PRINC))程序说明1设定函数SUM并将自变量存入变量NUM,并用IF函数判断是否<=0,若条件成立则显示错误讯息2若条件不成立,即以PROGN函数包含上例中的循环及显示答案部份3尾3行的关括号是对应第2行的PROGN函数4尾2行的关括号是对应第1行的IF函数5最后一行最右边的关括号是对应第1行的DEFUN函数输入函数让AutoCAD应用程序可以提示用户输入程序所需的数据;这些输入函数一般都是以GET开头;当程序执行至输入函数时,程序便会暂停,等待用户输入指定类型的数据后,程序即会继续执行.亦可在函数内指定要显示的提示字符串,若不提供则没有任何提示.输入整数(GETINT [提示字符串] )e.g. (GETINT "Input Number : ")输入的范围从-32,768到+32,767之间;若超出范围,会有警告讯息若输入的数据不是整数型态,如文字或是实数,会显示警告讯息若输入空格或按下ENTER键响应,输入值为 nil输入实数(GETREAL [提示字符串] )e.g. (GETREAL "Input Number : ")若输入的数据是字符串型态,会显示警告讯息;若输入整数,则会自动转为实数若输入空格或按下ENTER键响应,输入值为 nil输入字符串(GETSTRING [模式] [提示字符串] )e.g. (GETSTRING T "Input Name : ")若有提供模式参数且不是 nil 值,用户即可在输入的字符串中包含空格;但此时必须按ENTER键结束输入若没有提供模式参数或该参数为 nil 值,要在字符串中包含空格时,必须在字符串的前后加上双引号 "输入时不须在字符串的前后加上双引号(上述的情况例外)若输入空格(没有模式参数或为 nil 值时)或按ENTER键响应时,输入值为"",即空字符串输入选取点(GETPOINT [基准点] [提示字符串] )e.g. (GETPOINT (LIST 0 0) "Select Point : ")可以在屏幕以指向设备(一般是鼠标)选取,或以键盘直接输入坐标值亦可若有提供基准点(目前UCS的2D或3D坐标),会从基准点出现伸缩线到十字光标所在位置可接受单一整数或实数作为长度,代替基准点参数;此时会以系统变量LASTPOINT为基准点,以目前十字光标的位置与LASTPOINT的角度为方向,以。

AutoLISP教程-杜宝江

AutoLISP教程-杜宝江
取得二点的距离 依辅助抓点模式取得另一座标点 依极座标法取得另一座标点 取得文字串的二对角点座标
(inters点1点2点3点4 [模式]) 取得两条线的交点
第八类 图元处理 功能函数
项目 8.1 8.2 8.3 8.4 8.5 8.6 函数语法 (entdel 图元名称 ) (entget 图元名称 [ 应用程 式串列 ]) (entlast) (entmake 图元串列 ) (entmod 图元串列 ) (entnext [ 图元名称 ]) 删除或逆删除图元 取出图元名称的资料串列 取出图形资料中的最后一个图元 建立一个新的图元串列 依更新的资料串列更新萤幕上元体 找寻图面中的下一个图元 请求选取一个图元,回应包含图元名称及选 点座标的串列 更新萤幕上复元体图形 图码的元体名称 BLOCK所含副元体图元资料串列 BLOCK所含副元体图元资料(4 x 4矩形表示) 传回
6.5 6.6 6.7 6.8 6.9
(getint [提示])
(getkword [提示]) (getorient [基点] [提示])
请求输入一整数值
请求输入『关键字』 请求输入十进位角度,回应一弪度值不受 angbase 、 angdir影响 请求输入一实数 请求输入一字串
(getpoint [基点] [提示]) 请求输入一个点座标 (getreal [提示]) (getstring [提示])
第一节 AutoLISP的基本语法结构
规则1 :以括弧()组成运算式, 、相对称左右括弧数一定要成双成对 规则2 :运算式型态: (运算元 运算子 运算子 „„) 运算元包括『功能函数』 & 『自定函式』;运算子(引数)包括: A.整数 (Integer), B.实数(Real),C.字串(String),D.串列(List)如(“a” “b” “c”), (xy),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 : 分号; 后的内容为注解,程式不处理, 注解具可看性、学习性及完整性 规则11 : 变数型态是『整数』、『实数』、『字串』、『点串列』四种,变数的型 态依据设定值而自动定义,变数会一直储存该值,直到被重新设定值或绘图结束 规则12 :以setq功能函数设定变数值(setq变数名称设定值) 规则13 :欲在AutoCAD的环境中,查看一变数值,指令:下键入『 !变数名』即可 规则14 :以(defun C:函式名(引数/变数) ........)程式中,程式中的变数若在“/” 右边变数内,则称为『区域变数』 ,否则为『整体变数』

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

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

AutoLISP入门单元一:AutoLISP主角登场 (2)单元二:AutoLISP的关键、基本结构及语法 (6)单元三:快速分类浏览AutoLISP功能函数(一) (17)单元四:快速分类浏览AutoLISP功能函数(二) (23)单元五:轻松快速的掌握AutoLISP设计技巧 (29)单元六:图元数据的取得与活用技巧(一) (39)单元七:图元数据的取得与活用技巧(二) (47)单元八:新手上路-参数设计的关键技巧 (58)单元一: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 支持软件。

AutoLISP入门教程.doc

AutoLISP入门教程.doc

横 跨 各 作 业 悠 然 自 得 , 虽 然 AutoCAD 有 DOS 、 Windows 版 本 之 分 但 是 平台
D. 既然 AutoLISP 是 AutoCAD 的『最大功臣』,当然不会轻易被舍弃 ,如此, 您的学习,保证不会白费! E. 『精益求精』、『虚心求教』、『用心学习、观摩』、『决心成为高手』 3.对程序本身而言: A. 少少的几行,却可能有『大大满意』的时候!!! B. 充份掌握了控制、创造 AutoCAD 的『尚方宝剑』,让您在 AutoCAD 的设 计运作中『得心应手』,享受无比的快乐与成就感!!!
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程序入门-教学资料一. AutoLISP简介(优越性及缺点)AutoLISP语言是开发Autocad的主要工具,是LISP语言和Autocad有机结合的产物,在Autocad的发展及壮大过程中起到了重要的作用。

正是以AutoLISP为代表的开放式结构,才使Autocad在众多的CAD软件竞争中长期处于不败之地。

AutoLISP是一种解释型语言,可直接在Autocad中运行,而不象编译型语言必须借助于编译器对原程序进行编译和连接,才能生成可执行的代码模块,用户只需借助于文本编辑器(例如DOS的"EDIT"程序)即可进行编程。

AutoLISP(List Processing Language)是一种表处理语言?quot;表"是AutoLISP语言独有的数据结构,在AutoLISP中广泛使用,表是在一个变量中储存大量相关数据的有效方法。

例如AutoCAD中以三个实数(X Y Z)这种表的形式来表示三维点。

二. 在AutoLISP的赋值方法不象大多数计算机语言采用"中缀法"来表示程序语句(表达式),而采用"前缀法"。

例如:C语言中为实型数X赋值125.0,写成:X = 125.0;运算符"="放在操作数X和125.0之间。

而AutoLISP中则写成:(setq X 125.0)运算符"setq"放在操作数X和125.0之前。

"setq"是AutoLISP最主要的赋值函数,几乎所有的变量赋值都要依?quot;setq"来实现。

三. 如何向AutoCAD增加一个新命令(或如何定义一个函数)一般程序的结构组成及加载在下面的例子中,我们将了解AutoLISP语言一般程序的结构组成、如何定义一个在AutoCAD中可执行的函数、"setq"的用法以及如何在AutoCAD中加载程序。

autocad-lisp教程

autocad-lisp教程

Lisp教程一.Lisp基础知识二.对话框基础一.基本知识第1节--------------------------------------------------------------------------------基本知识AutoLISP是一种针对扩充及自订AutoCAD函数机能而产生,以LISP为基础的程序设计语言.LISP本身于50年代末期出现,是一种擅于处理串行文字(List of Processing),属第四代「人工智能(Artificial Intelligence)」的计目的是令使用者充份利用AutoCAD进行开发,直接增加及修改AutoCAD指令.AutoLisp语言建基于普通的LISP语言上,并扩充了许多适用于CAD的特殊功能而形成.是一种能以直译方式(不须先行编译)亦可于AutoCAD内部执行的直译性程序语言.程序容易学习及撰写,程序即使出错亦不会对操作系统(如DOS,WINDOWS)有不良影响.数据及程序均统一以串行(List)结构表示.可直接调用几乎全部的AutoCAD命令.既具备一般高级语言的基本结构和功能,亦有一般高级语言没有的强大图形处理能力.内建于AutoCAD应用程序,不须另行购买;亦不须使用特定的编辑器或开发环境.可配合AutoCAD提供的PDB,建立DCL(Dialog Control Language)文件创建对话框.缺点: 执行速度较ObjectArx(旧称ARX,以C或C++程序开发,取代以前的ADS)程序慢;原程序不易保护;对低阶的硬件数据不易存取.第2节--------------------------------------------------------------------------------函数(Function)在AutoLISP程序语言中所有的成份都是以函数的形式出现,AutoLISP程序就是顺序执行连串的函数.函数的运行过程就是对函数的求值(结果)过程;函数的基本语法如下:(函数名称参数1 参数2....)e.g. (PRINC "AutoLISP Programming")每一个完整的函数必须包在一对小括号( )内,左边为开括号,右边为关括号;如有若干数量的开括号,则一定有同等数量的关括号对应.左边开括号后紧随函数名称.函数名称与参数之间,或参数与参数之间须最少留一个空格.函数可有一个或多个参数(也可能没有参数),视该函数而定.函数名称不分大小写,即大小写字母视为相同.第3节--------------------------------------------------------------------------------数据型态(Data Type)整数(INT)没有小数字的数值,32位有号数,范围从+2,147,483,647到-2,147,483,648实数(REAL)带小数字的数值,以倍精度浮点格式储存(最少14位小数) e.g. 12.5当数值在1与-1之间时,必须加上前导零 e.g. 0.05可以科学记号表示: 在E或e后加上次方值 e.g. 4.1e-6字符串(STR)一般文字,其前后必须加上双引号" e.g. "AutoCAD"控制字符或脱逸码必须为小写,且须在字符前加上反斜线\ e.g. "\AutoCAD"像素名称(ENAME)是指定给图文件内对象的指针(Pointer,为16进位的数字卷标)e.g. <Entity name:14e5180>像素名称在图文件内是唯一的,不会重复对象的像素名称只在目前作业中有效,再开启图档时,会指定新的像素名称予该对象档案(FILE)以OPEN函数所开启档案的指针,作为其它函数(读写该档案)的自变量选集(PICKSET)用SSGET等函数建立的一个或多个对象的集合或群组转化(V ARIANT)可将像素名称转换为可与ActiveX配搭使用的VLA-Object对象符号(SYM)用以储存静态数据的名称;例如内建或使用者定义的函数符号名称不分大小写,可由任意长度的可打印字符组成;但下列的字符除外:左括号( 右括号) 句点. 单引号' 双引号" 分号;表(LIST)亦称为串行,是放在一对小括号( ) 内,一个或多个元素的有序集合e.g. (1.0 "Lisp" ( ) (5.6 7))元素可以是字符串,符号,整数或实数;也可以是另一个表元素与元素之间要用空格隔开,但元素与小括号之间则可以不隔空格为便于存取表内各元素,每个元素均有其序号;从表的左边开始,第一个元素序号为0,依此类推表的大小即为其顶层元素的数量(内层嵌套式的表,视为单一元素)点对(Dotted Pair)亦是表的一种;表内有2个元素,中间以一圆点分隔,且元素与圆点之间亦须以空格分开若表内没有任何元素,称为空串行或空表;以( ) 或(NIL) 表示第4节--------------------------------------------------------------------------------变数(Variable)为程序执行中动态储存数据的符号名称;主要分为2类:区域(Local)变量又称为局部变量;该变量只在该程序段落中有效,不能为其它程序使用全域(Global)变量又称为整体变量;变量在所有程序段落中均可使用变量名称与符号的限制相同,使用时宜采用有意义及易于辨别的名称变量在赋值或使用前无须先行设定相同的变量可以储存不同型态的数据(但同一时间内只可储存一种型态)在指定新的数据之前,变量储存的内容会保持不变赋值将数据给予指定的变量储存以内建函数SETQ进行(可用于绘图模式的指令行或AutoLISP程序),其语法如下:(SETQ 变量名称1 资料1 [变量名称2 资料2 ....] )e.g. (SETQ NAME "David" AGE 37 WEIGHT 72.5 POINT (LIST 10 20))在函数名称之后,各参数以两个一组,每组左边为变量名称,右边为存入变量的数据亦可将变量名称赋以空值(NIL) :e.g. (SETQ OCCUPATION NIL)要显示变量所储存的数据,可以使用内建函数PRINC(可用于绘图模式的指令行或AutoLISP程序),其语法如下:(PRINC 变量名称)e.g. COMMAND : (PRINC NAME) Result : David"David"在绘图模式中,亦可于指令行中使用感叹号! 来显示变量内容,或作为指令选项的输入值;语法如下: !变量名称e.g. COMMAND : !NAME Result : "David"在Visual LISP的主控台窗口中,于提示符号_$ 后键入要显示的变量名称_$变量名称e.g. _$NAME要检查变量所储存的数据型态,可使用内建函数TYPE;语法如下:(TYPE 变量名称)e.g. COMMAND : (TYPE NAME) Result : STR若检查的变量没有储存数据,则会传回NIL第5节--------------------------------------------------------------------------------练习(Exercises)将四个坐标分别存入四个变量中,并以LINE或PLINE指令,配合四个坐标变量,画出正四边形. COMMAND : (SETQ POINT1 (LIST 0 0) POINT2 (LIST 0 10) POINT3 (LIST 10 10) POINT4 (LIST 10 0)) COMMAND : LINE ;直线段指令COMMAND : !POINT1 ;第一点(左下角起点)COMMAND : !POINT2 ;第二点(左上角)COMMAND : !POINT3 ;第三点(右上角)COMMAND : !POINT4 ;第四点(右下角)COMMAND : C ;自动联机至起点以关闭四边形画圆: 将圆心坐标及半径长度分别存入两个变量中(变量名称及数据型态自订)COMMAND : (SETQ CEN (LIST 0 0) RAD 20) ;将圆心点设为坐标0,0;半径为20COMMAND : CIRCLE ;执行划圆指令Specify center.... : !CEN ;在提示后以变量CEN响应输入Specify radius.... : !RAD ;在提示后以变量RAD响应输入将不同型态的数据,分多次存入相同的变数内;每次均以PRINC及TYPE函数显示变量内容及其数据型态COMMAND : (SETQ TEMP 1.2) ;将实数1.2存入变数TEMPCOMMAND : !TEMP Result : 1.2COMMAND : (TYPE TEMP) Result : REALCOMMAND : (SETQ TEMP "AutoLISP") ;将字符串存入变量TEMPCOMMAND : !TEMP Result : "AutoLISP"COMMAND : (TYPE TEMP) Result : STR二数值资料第1节--------------------------------------------------------------------------------基本运算加函数(+ [数值参数1 数值参数2 ....] )e.g. (+ 2.5 4 6) Result : 12.5函数的结果为各参数之总和若仅提供一个参数,则以0加上此参数的结果为返回值若没有提供任何参数则传回0;各参数须为整数或实数型态若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转换为实数减函数(- [数值参数1 数值参数2 ....] )e.g. (- 10 2 3) Result : 5结果为第一个(最左边)参数减去其右边各参数的总和若只提供一个参数,返回值为0减去该参数的结果若没有提供任何参数则传回0;各参数须为整数或实数型态若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转换为实数乘函数(* [数值参数1 数值参数2 ....] )结果为所有参数的乘积若只提供一个参数,则返回值为该参数乘以1的结果若没有提供任何参数则传回0;各参数须为整数或实数型态若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转换为实数除函数(/ [数值参数1 数值参数2 ....] )e.g. (/ 24 2 3) Result : 4结果为第一个(最左边)参数除以其右边各参数的乘积若仅提供一个参数,则返回值为该参数除以1的结果若没有提供任何参数则传回0;各参数须为整数或实数型态若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转换为实数注意: 在本篇教程中,各函数的数值参数,均可以变量(储存值只可以是整数或实数,且不可以是空值nil)取代第2节--------------------------------------------------------------------------------练习(Exercises)计算式(2+4)*3COMMAND : (* 3 (+ 2 4)) Result : 18计算式(50-8*5)/4COMMAND : (/ (- 50 (* 8 5)) 4) Result : 2注意: 上式的正确答案应是2.5,因为函数中的各参数均为整数,所以传回的结果亦为整数递增及递减递增(1+ 数值参数)e.g. (1+ 2) Result : 3递减(1- 数值参数)e.g. (1- 4) Result : 3三角函数(Trinagular Function)正弦值(SIN 弧度参数)e.g. (SIN 1) Result : 0.841471余弦值(COS 弧度参数)e.g. (COS 1) Result : 0.540302反正切值(A TAN 弧度参数)e.g. (ATAN 1) Result : 0.785398第3节--------------------------------------------------------------------------------其它数值处理次方值(EXPT 数值参数次方值)e.g. (EXPT 2 4) Result : 16若参数及次方值两个均为整数,返回值亦是整数;若其中一个为实数,结果为实数开方根(SQRT 数值参数)e.g. (SQRT 30) Result : 5.47723(ABS 数值参数)e.g. (ABS -123) Result : 123余数(REM [数值参数1 数值参数2 ....] )e.g. (REM 50 26 5) = (REM (REM 50 26) 5) Result : 4将参数1整除参数2的余数若参数多于2个时,则会将余数再整除下一个参数,再得出余数;依此类推若其中一个参数为实数时,则结果为实数;否则为整数最大公约数(GCD 数值参数1 数值参数2 )e.g. (GCD 81 57) Result : 3两个参数均必须为整数值型态自然对数(LOG 数值参数)e.g. (LOG 3.5) Result : 1.25276是EXP函数的反函数;传回值为实数型态自然反对数(EXP 数值参数)e.g. (EXP 1.25276) Result : 3.49999是LOG函数的反函数;传回值为实数型态第4节--------------------------------------------------------------------------------数值资料转型实数转整数(FIX 数值参数)e.g. (FIX 12.56) Result : 12只会截去小数部份(小数字不会4舍5入)整数转实数(FLOAT 数值参数)e.g. (FLOAT 12) Result : 12.0整数转字符串(ITOA 数值参数)e.g. (ITOA -17) Result : "-17"数值转字符串(RTOS 数值参数[模式[小数字] ] )e.g. (RTOS 17.23333 2 3) Result : 12.266若不设定模式,则依系统变量LUNITS 的设定值转换数值为字符串若不设定小数字,则依系统变量LUPREC 的设定值转换模式设定值可以是下列数值之一:1 = 科学记号2 = 十进制3 = 英呎及十进制英吋4 = 英呎及分数位英吋5 = 分数当选用的模式为3,4或5,则传回的字符串受系统变量UNITMODE影响(ANGTOS 角度参数[模式[小数字] ] )e.g. (ANGTOS 0.785398 0) Result : "45"e.g. (ANGTOS 0.785398 4) Result : "N 45d E"若不设定模式,则依系统变量AUNITS的设定值转换数值为字符串若不设定小数字,则依系统变量AUPREC的设定值转换模式设定值可以是下列数值之一:0 = 度1 = 度/分/秒2 = 分度量3 = 弪度4 = 土地测量单位当选用的模式为4,则传回的字符串受系统变量UNITMODE影响反函数为ANGTOF;参阅第5篇教程第5节--------------------------------------------------------------------------------数值资料检查数值(NUMBERP 数值参数)e.g. (NUMBERP -3.45) Result : Te.g. (NUMBERP "AutoLISP") Result : nil注意: 在范例的传回值中,T表示函数的结果为真(成立),nil表示结果为假(不成立)负数值(MINUSP 数值参数)e.g. (MINUSP -3.45) Result : Te.g. (MINUSP 0) Result : nile.g. (MINUSP 3.45) Result : nil零值(ZEROP 数值参数)e.g. (ZEROP 0) Result : Te.g. (ZEROP 3.45) Result : nil其它应用最大值(MAX [数值参数1 数值参数2 ....] )e.g. (MAX -88 5 2) Result : 5若没有提供任何参数,则传回值为0最小值(MIN [数值参数1 数值参数2 ....] )e.g. (MIN -88 5 2) Result : -88若没有提供任何参数,则传回值为0第6节--------------------------------------------------------------------------------练习(Exercises)计算下列算式:(+ 1234567890 1234567890) Result : -1825831516上式中两个数值参数均为整数,而结果值大于整数型态所能容许之范围;固导致发生溢位问题,产生无效的结果.修正算式如下: 只要将其中一个参数改为实数型态即可.(+ 1234567890.0 1234567890) Result : 2.46914e+009(+ 9876543210 1234567890) Result : 1.11111e+010上式中两个数值参数均为整数,但其中一个(第一个)参数巳大于整数型态所能容许之范围;系统会自动将此参数先行转为实数型态才计算.计算下列算式:(FIX (SQRT (+ 1 (MAX 20 10 40 30)))) Result : 6---- 最先执行的是最内层的算式(MAX 20 10 40 30) ,求出最大值为40---- 其次执行加函数,将MAX函数所得的最大值加1,结果为41---- 再利函数SQRT,将41开方根,结果为6.4031---- 最后使用FIX函数,截去其小数字,得到最后的结果为6三程序设计第1节--------------------------------------------------------------------------------使用者定义函数是将一群表示式组合成一个函数或指令可应用于绘图模式的指令行提示,Visual LISP主控台,或供其它自定义函数内的表示式呼叫使用AutoLISP原始程序代码均以纯文字格式存盘,扩展名为LSP(2000版可编译成扩展名为FAS的档案可以一般文字编辑器进行开发,如DOS的EDIT,WINDOWS的WORD或WORDPAD等一个自定函数内最少要有一个表达式在原程序文件(LSP)里,自定义函数以DEFUN函数开始;其语法如下:(DEFUN [C:] 函数名称( [自变量串行...] [/ 局部变数串行...] ) 表达式...)在呼叫带有自变量的自定函数时,必须同时提供与定义函数时,同等数量的参数,使各参数传入自定函数的各自变量中自变量被视为一种特殊类型的局部变量,无法用于该自定函数以外的其它函数若自定函数中无须设定任何自变量,亦必须以空串行( )加在函数名称之后若有提供局部变量,必须以斜线/ 加在局部变量的开头(即使前面没有自变量串行)各自变量,斜线,局部变量之间要以空格分隔;但与左右小括号之间则不须以空格分开若自变量串行中有相同名称的自变量出现,则会忽略第一个以后的相同自变量;变数亦是一样若在函数名称前加上C:,表示该函数可以在绘图模式的指令行提示下,其执行方式与内建函数相同;亦可以在任何内建命令(执行中)的提示后,以通透方式执行(但须将函数名称包在一对小括号中) 若在函数名称前没有加上C:,在指令行提示下,必须将函数名称包在一对小括号中才可执行不可以在执行一自定函数时,以通透方式执行另一自定函数第2节--------------------------------------------------------------------------------加载程序自定函数在使用前,都要将其所在的程序文件(扩展名为LSP)加载才可执行ACAD.LSP程序文件(预设在SUPPORT子目录内)会在启动AutoCAD时自动加载(LOAD "程序文件名称" [加载失败] )e.g. (LOAD "TEST")若程序文件之文件名为LSP,则在程序文件名称之后,可以不加上扩展名若有需要,系统会顺序尝试其它的扩展名: VLX FAS LSP若程序文件不在系统的支持目录下,则需在文件名前加上目录路径注意: 必须以正斜线/ 或两个反斜线\\ 作为目录的分隔符可以在加载失败的参数中提供字符串,以供加载失败时显示;亦可提供有效的自定函数,该函数在加载程序文件失败时会被执行注意:在程序文件加载后,在提示行显示的返回值,一般是该程序文件中,最后被定义的函数名称或是在程序文件内没有包含在自定函数中,最后一个表达式的执行结果第3节--------------------------------------------------------------------------------练习(Exercises)启动文字编辑器,编写一AutoLISP程序作两个同心圆(第1个圆半径为50,第2个圆半径为80),程序代码如下所示:(DEFUN C: 2CIRCLE () (SETQ CEN (LIST 0 0) RAD 50)(COMMAND CIRCLE CEN RAD)(COMMAND CIRCLE CEN (+ RAD 30)))---- 输入后以纯文字格式存盘(C:\TEST.LSP)---- 在AutoCAD绘图模式的指令行提示后,用LOAD函数将程序文件加载COMMAND : (LOAD "C:/TEST")---- 在指令行提示后,输入程序(函数)名称执行COMMAND : 2CIRCLE程序说明1 使用DEFUN建立自定函数的名称,并用SETQ函数将中心点(LIST 0 0)存入变数CEN,半径(50)存入变数RAD中2 使用COMMAND函数执行AutoCAD内建指令CIRCLE,并以变量CEN(圆的中心点)及变数RAD(圆的半径)回应3 与第2行大致相同,但在指定其半径时,先将储存半径的变量加30,使划出半径为80的圆;注意最右边的关括号,与第1行DEFUN左边的开括号是一对的启动文字编辑器,开启TEST.LSP程序文件,复制2CIRCLE至新程序2C,并改为传入自变量方式执行;程序代码如下:(DEFUN 2C (CEN RAD) (COMMAND CIRCLE CEN RAD)(COMMAND CIRCLE CEN (+ RAD 30)))---- 输入后以纯文字格式存盘---- 在AutoCAD绘图模式的指令行提示后,用LOAD函数将程序文件重新加载---- 在指令行提示后,输入程序(函数)名称执行COMMAND : (2C (LIST 0 0) 50)第4节--------------------------------------------------------------------------------批注单行批注分号;表示在分号右边(同一行)的字符均为批注,程序执行时会将其忽略多行批注;| |;表示在两个批注符号中间所有字符皆为批注,即使字符跨越多行关系运算在各个关系运算中,都会传回一逻辑值;若关系成立,传回T,否则会传回nil各参数可以是字符串,整数或实数型态;若以字符串进行比较,则会以字符串的ASCII码为准若函数中只有一个参数,传回值恒为T等于函数(= 参数1 [参数2 ....] )会将参数1与其后各个参数比较,若全部相等则传回T,否则传回nil e.g. (= 2 2.0) Result : T不等于函数(/= 参数1 [参数2 ....] )若参数1不等于其后任何一个参数,即传回T e.g. (/= 1 2.0) Result : Te.g. (/= "a" CHR(65)) Result : Te.g. (/= 10 30 40 10 20) Result : T小于函数(< 参数1 [参数2 ....] )各参数顺序以2个为一组比较,若各组左边的参数均小于右边的参数,即传回Te.g. (< 1 2) Result : Te.g. (< "a" CHR(65)) Result : T大于函数(> 参数1 [参数2 ....] )各参数顺序以2个为一组比较,若各组左边的参数均大于右边的参数,即传回Te.g. (> 1 2) Result : nile.g. (> "a" CHR(65)) Result : nil小于或等于函数(<= 参数1 [参数2 ....] )各参数顺序以2个为一组比较,若各组左边的参数均小于或等于右边的参数,即传回Te.g. (<= 1 2) Result : Te.g. (<= 2 2) Result : Te.g. (<= "a" CHR(65)) Result : T大于或等于函数(>= 参数1 [参数2 ....] )各参数顺序以2个为一组比较,若各组左边的参数均大于或等于右边的参数,即传回Te.g. (>= 1 2) Result : nile.g. (>= 2 2) Result : Te.g. (>= "a" CHR(65)) Result : nil第5节--------------------------------------------------------------------------------逻辑运算且运算(AND [表达式....] )若各表达式的传回值均为T,函数即返回T 值;若其中一个传回值为nil,函数传回nile.g. (AND (< 1 2) (> 8 5)) Result : T或运算(OR [表达式....] )若各表达式的传回值均为nil,函数即返回nil 值;若其中一个传回值为T,函数传回Te.g. (OR (> 1 2) (> 8 5)) Result : T否定运算(NOT 表达式)若表达式的传回值为T,函数即返回nil 值;相反若表达式传回值为nil,函数传回T 可用于检查传回值是否为nil另有一NULL函数与NOT函数功能相似e.g. (NOT (< 1 2)) Result : nil练习(Exercises)COMMAND : (= (- 50 25) (SQRT 625)) Result : T设计一简单程序(名称为AIR),在呼叫程序时,检查传入的数值自变量(为空气污染指数)是否大于200(即严重空气污染)---- 启动文字编辑器,开启TEST.LSP程序文件,输入下列程序代码:(DEFUN AIR (NUM) (> NUM 200))---- 输入后存盘(纯文字格式)---- 在AutoCAD绘图模式的指令行提示符号后,使用LOAD函数重新加载程序文件COMMAND : (LOAD "C:/TEST")---- 在AutoCAD绘图模式的指令行提示符号后,输入自定函数名称及参数执行COMMAND : (AIR 175) Result : nilCOMMAND : (AIR 215) Result : T四流程控制第1节--------------------------------------------------------------------------------条件判断是利用条件函数,配合关系及逻辑运算所设定的一些准则,令程序自行分析,因应情况作出适当行动.单一条件(IF 条件表达式是表达式[否表达式] )函数先检查条件表达式,若其传回值为T,便会执行其后的是表达式若有提供否表达式,且条件表达式的传回值为nil,函数将不会执行(跳过)是表达式而执行否表达式若没有提供否表达式,且条件表达式的传回值为nil时,函数将不作任何事情IF函数可以巢状方式嵌套,即在是或否的表达式中加入另一个IF函数练习(Exercises)判断空气污染指数: 大于100 = Very High, 51至100 = High, 26至50 = Medium, 25或以下= Low---- 启动编辑器,开启C:/TEST.LSP程序文件;新增AIR-1自定函数,程序代码如下:(DEFUN AIR-1 (NUM) (IF (> NUM 100) (PRINC "Very High"))(IF (AND (> NUM 50) (<= NUM 100)) (PRINC "High"))(IF (AND (> NUM 25) (<= NUM 50)) (PRINC "Medium"))(IF (<= NUM 25)) (PRINC "Low"))(PRINC))程序说明1 设定函数名称,并将数据存入自变量NUM内;用IF函数判断变量NUM是否大于100;若是则显示字符串Very High响应2 用IF函数判断变量NUM是否大于50且(AND)小于或等于100;若是则显示High响应3 用IF函数判断变量NUM是否大于25且(AND)小于或等于50;若是则显示Medium4 用IF函数判断变量NUM是否小于或等于25;若是则显示Low5 是一个没有提供任何自变量的PRINC函数;用以抑制显示答案时尾部符加的nil 或重复的传回值;而最右一个关括号,是用以对应第1行最左边的开括号IF函数的巢状练习: 修改上一课的程序练习,将多个IF函数合并成巢状嵌套---- 启动文字编辑器,开启C:/TEST.LSP程序文件---- 新增程序AIR-2,其程序代码如下:(DEFUN AIR-2 (NUM) (IF (> NUM 50) (PRINC (IF (> NUM 100) "Very high" "High"))(PRINC (IF (> NUM 25) "Medium" "Low")))(PRINC))程序说明1 设定函数名称,并将数据存入自变量NUM内;用IF函数判断变量NUM是否大于50;若条件成立(变量NUM大于50)时,再用另一个IF函数判断变量是否大于100;若条件成立(变量NUM大于100)时,使用PRINC函数显示字符串Very High,否则显示High2 若在第1个IF函数判断中,条件不成立(变量NUM不大于50)时;再用另一个IF函数判断变量是否大于25;若条件成立(NUM大于25)时,显示字符串Medium,否则显示字符串Low3 是一个没有提供任何自变量的PRINC函数;用以抑制显示答案时尾部符加的nil 或重复的传回值;而最右一个关括号,是用以对应第1行最左边的开括号注意:第1行最后一个关括号是对应前面的PRINC函数,尾2的关括号则是对应IF函数(判断NUM是否大于100)第2行最后一个关括号是对应第1行的IF函数(判断NUM是否大于50),尾2的关括号则是对应PRINC 函数,尾3的关括号则是对应IF函数(判断NUM是否大于25)最右边的关括号是对应第1行最左边的开括号PROGN 函数在以上各范例中,执行的表达式均为单一的函数运算;若要在表达式中顺序执行一连串的函数,便要将各函数包含在一个PROGN函数内;函数的传回值会是该PROGN函数中,最后一个表达式的运算结果---- 修改TEST.LSP程序文件的AIR-1程序,第1个IF函数如下,其余的IF函数请自行修改e.g. (IF (> NUM 100) (PROGN (SETQ DISP "Very High") (PRINC DISP)))注意: 最后一个关括号是对应前面的IF函数(判断变量NUM是否大于100)尾2的关括号是对应PROGN函数(用以包含SETQ及PRINC函数)尾3的关括号是对应PRINC函数的第2节--------------------------------------------------------------------------------条件判断多重条件(COND [ (条件表达式是表达式) ....] )函数会顺序检查各条件表达式;直到其中一个条件成立(传回T),即执行该条件式所对应的是表达式每个条件表达式只对应一个是表达式,而没有否表达式若条件式成立且执行对应的是表达式后,则不会再对余下的其它条件表达式进行检查若只有条件表达式而没有对应之是表达式,则只会传回条件表达式的逻辑值若没有提供任何条件表达式及是表达式,函数传回值恒为nil练习(Exercises)新增程序AIR-3,以改善上一课AIR-1程序;用一个COND函数判断多个条件表达式DEFUN AIR-3 (NUM) (COND((> NUM 200) (PRINC "Severe"))((> NUM 100) (PRINC "Very High"))((> NUM 50) (PRINC "High"))((> NUM 25) (PRINC "Medium"))((> NUM 0) (PRINC "Low"))(T (PRINC "Cannot Check")))(PRINC))程序说明1 设定函数名称,并将数据存入自变量NUM内;用COND函数进行多重判断2 判断变量NUM是否大于200,若条件成立,则显示Severe 讯息;第3至6行依此类推7 注意条件式为一个T 字母,表示条件式恒为真(成立),显示讯息Cannot Check作用是当以上各条件式均不成立时(变量小于或等于0),即执行此一表达式第3节--------------------------------------------------------------------------------循环(Loop)配合条件判断,关系及逻辑运算,令程序不断重复一些动作,以提高效率及减少重复动作时的人为错误可以多个循环形成巢状(嵌套式)循环,即在一个循环内嵌套另一个(或多个)循环指定的重复次数必须为正整数,亦可以是储存正整数的变量名称重复指定次数(REPEAT 重复次数[表达式....] )e.g. (REPEAT 10 (PRINC "David")) ;重复显示David字符串10次重复(WHILE 条件表达式[是表达式....] )若条件表达式的传回值为T,即会顺序执行函数内各表达式各表达式顺序执行完后,程序会返回函数的开头,重新检查条件表达式的传回值若条件表达式的传回值为nil,函数内各表达式将不会被执行e.g. (SETQ COUNT 1) ;将1存入变数COUNT(WHILE (<= COUNT 10) ;WHILE函数并检查变量COUNT是否<=10(PRINC "David") ;若条件成立则以PRINC函数显示David字符串(SETQ COUNT (1+ COUNT))) ;变量COUNT递增1,并将新值重新存入变量COUNT中取代原值注意: 第4行最右边的关括号,是对应第2行WHILE函数的开括号无限循环又称为死循环,即循环的条件判断式传回值恒为T,令循环不断重复而无法结束;在上例中:---- 若WHILE函数的条件表达式设定为(T) ;即条件永远成立---- 不作SETQ函数,或不将变量COUNT递增;变量COUNT储存值恒久不变,导致条件式永远成立第4节--------------------------------------------------------------------------------练习(Exercises)编写一程序SUM并将自变量存在NUM变量内,计算1+2+3+4 ....至变数NUM的总和(DEFUN SUM (NUM) (SETQ COUNT 1 TOTAL 0)(WHILE (<= COUNT NUM)(SETQ TOTAL (+ TOTAL COUNT)COUNT (1+ COUNT)))(PRINC TOTAL) (PRINC))程序说明1 设定函数SUM并将自变量存入变量NUM,设定变量COUNT以将数目由1开始递增,变量TOTAL(储存总和)初始值为0。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

横 跨 各 作 业 悠 然 自 得 , 虽 然 AutoCAD 有 DOS 、 Windows 版 本 之 分 但 是 平台
三.撰写 AutoLISP 的动机?
1. 欲强化 AutoCAD 原有指令时. 2. 欲创造更有用的 AutoCAD 新指令. 3. 欲简化繁琐的环境设定或绘图步骤时. 4. 欲处理参数式绘图时 . 5. 欲做图面资料读文件、写文件. 6. 欲做 AutoCAD 简报展示时. 7. 欲达到真正灵活掌控 AutoCAD 时. 8. 欲提升自己跨上 AutoCAD 高手列车时.
单元二:AutoLISP 的关键、基本结构及语法
一、学好 AutoLISP 的关键、 基本结构与语法:
1. AutoLISP 程序语言的特质 A.语法简单 B.功能函数强大 C.撰写的环境不挑剃 D.直译式程序,『即写即测、即测即用』 E.横跨 AutoCAD 各作业平台 ,悠然自得 (注:以上五点 ,读者可以参考上一章 的剖析!!!) 2.学好 AutoLISP 的关键:充份掌握『语法结构』&『功能函数』的搭配!!!
指令:(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) 表示法 => 以二实数形成串行
二、学好 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 程序语言的特质分析:
学习 AutoLISP 是非常容易的,对初学者而言,即使没有学习过任何的程序语言, 都能很快的上手,写出精彩漂亮的 AutoLISP 程序! 语法简单 不用特殊的变量宣告,非常富有弹性 ,比起其它的程序语言 ,它的语 法可说是非常简单而有其独特的风格 ! 除一般性的功能函数外,又拥有为数不少控制配合 AutoCAD 的特 功 能 函 数 强 殊函数,再加上 AutoLISP 可直接呼叫执行所有 AutoCAD 的指令 , 大 以及掌握运用所有的 AutoCAD 系统变量,功能之强大令人欣喜不 已! 撰 写 的 环 境 只要是一般的文书编辑软件都适用 ! 如:Windows 的记事本、 PE2、 不挑剔 PE3、DW3、书中仙、汉书、EDIT....等 直译式程序 不用再作编译,『即写即测、即测即用』,马上可以在 AutoCAD 中 响应效果,马上就有成就感 ! 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 (注:! 号可用来查询变数值)
单元一:AutoLISP 主角潇洒登场
一. AutoLISP 是何方神圣?
1. AutoLISP 是 AutoCAD 的最佳拍檔! 2. AutoLISP 内含于 AutoCAD 软件内,不用另外花钱买! 3. AutoLISP 是强化 AutoCAD 最好、最直接的『 程序语言』! 4. AutoLISP 易学、 易用,即使不会程序设计的 AutoCAD 使用者,都能在最 短的时间内,写出令人惊讶、赞叹的功能! 5. 若说 AutoLISP 的出现, 是替 AutoCAD 创造一片天的『最大功臣』 , 实不为过一点也不夸张! 6. AutoLISP 希望您去学习它、改善它、发挥它、享受它.真的! 它的威力、 魅力无穷!
ቤተ መጻሕፍቲ ባይዱ
四.AutoLISP 的效益评估?
1. 对公司负责人或设计主管而言: A. 也许某员工或干部花了 20 个小时撰写一个 AutoLISP 程序,表面上,这将近三 天的时间,他连一张图都没有画,甚至可能偶有发呆、 沈思,若此程序一天可以 替公司绘图部门节省 1 小时绘图时间,那算一算,只要 20 天就抵销开发成本, 而 20 天以后都是赚的, 『用的愈久,省的愈多』! B. 若员工皆有此动力, 在不影响正常工作,『鼓励』都来不及,那有『压抑』的道 理,甚至还要派遣优秀人员出去受训,学习更好的设计技巧与创意呢?! C. 千万不要因为您的不懂或压抑,SHOW 您的权威与 POWER,如此,不但对员 工造成打击,甚至您可能成为阻碍了公司计算机化进步的罪魁祸首 D. 当然 , 若要撰写的程序很多 ,内部设计人员的程序功力距离太远 ,达成需求的 时间反而变得遥遥无期 , 那倒不如求助于市面上已有的相关 AutoCAD 支 持软件。 2. 对设计人员而言: A. 得到一笔提升绩效奖金呢 ? 当然,无形中, 『AutoCAD 高手的封号』也将黄 功力又往前迈出了一大步 , 对个人的成长帮助匪浅 ,幸运的话 , 搞不好还可以 袍加身,不亦乐乎!!! B. 『半桶水、响叮当』, 千万不要因为会写 AutoLISP 程序而自傲、孤僻、嚣 张起来,功力的增长 ,只是让您有更多『服务他人、服务公司』的机会,若自恃 过重,宁可不要! C. 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:函式名(自变量 / 变数) ........)程序中 ,程序中的变量若在 『/』右边变量内, 则称为『区域变量』,否则为『整体变量』
相关文档
最新文档