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 支持软件。

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 支持软件。

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。

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

autocad-lisp教程

autocad-lisp教程

autocad-lisp教程Lisp教程一.Lisp基础知识二.对话框基础一.基本知识第1节--------------------------------------------------------------------------------基本知识AutoLISP是一种针对扩充及自订AutoCAD函数机能而产生,以LISP为基础的程序设计语言.LISP本身于50目的是令使用者充份利用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.像素名称在图文件内是唯一的,不会重复对象的像素名称只在目前作业中有效,再开启图档时,会指定新的像素名称予该对象档案(FILE)以OPEN函数所开启档案的指针,作为其它函数(读写该档案)的自变量选集(PICKSET)转化(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 (LIST10 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的主控台窗口中,于提示符号_$ 后键入要显示的变量名称_$变量名称要检查变量所储存的数据型态,可使用内建函数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的结果若没有提供任何参数则传回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 数值参数)(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 = 分数(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上式中两个数值参数均为整数,而结果值大于整数型态所能容许之范围;固导致发生溢位问题,产生无效的结果.修正算式如下: 只要将其中一个参数改为实数型态即可.(+ 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 [参数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 : nilCOMMAND : (= (- 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))程序说明2 WHILE循环函数,并设定进入循环的条件式(变量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,进入循环;将TOTAL(现值0)加上COUNT,存回变数TOTAL COUNT = 1 TOTAL = 1---- 变数COUNT(现值1)递增1变为2,存回变数COUNT COUNT = 2 TOTAL = 1。

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

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

A u t o L I S P从入门到精通初级教程(新手必备)-CAL-FENGHAI.-(YICAI)-Company One1AutoLISP入门单元一:AutoLISP主角登场 .................................................................... 错误!未定义书签。

单元二: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 支持软件。

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;}注意:将单选按钮或复选框组成行列(或区)的时候,具体是有些不同的。

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等函数建立的一个或多个对象的集合或群组转化(VARIANT)可将像素名称转换为可与ActiveX配搭使用的VLA-Object对象符号(SYM)用以储存静态数据的名称;例如内建或使用者定义的函数符号名称不分大小写,可由任意长度的可打印字符组成;但下列的字符除外:左括号(右括号)句点.单引号'双引号"分号;表(LIST)亦称为串行,是放在一对小括号()内,一个或多个元素的有序集合e.g.(1.0"Lisp"()(5.67))元素可以是字符串,符号,整数或实数;也可以是另一个表元素与元素之间要用空格隔开,但元素与小括号之间则可以不隔空格为便于存取表内各元素,每个元素均有其序号;从表的左边开始,第一个元素序号为0,依此类推表的大小即为其顶层元素的数量(内层嵌套式的表,视为单一元素)点对(Dotted Pair)亦是表的一种;表内有2个元素,中间以一圆点分隔,且元素与圆点之间亦须以空格分开若表内没有任何元素,称为空串行或空表;以()或(NIL)表示第4节--------------------------------------------------------------------------------变数(Variable)为程序执行中动态储存数据的符号名称;主要分为2类:区域(Local)变量又称为局部变量;该变量只在该程序段落中有效,不能为其它程序使用全域(Global)变量又称为整体变量;变量在所有程序段落中均可使用变量名称与符号的限制相同,使用时宜采用有意义及易于辨别的名称变量在赋值或使用前无须先行设定相同的变量可以储存不同型态的数据(但同一时间内只可储存一种型态)在指定新的数据之前,变量储存的内容会保持不变赋值将数据给予指定的变量储存以内建函数SETQ进行(可用于绘图模式的指令行或AutoLISP程序),其语法如下:(SETQ变量名称1资料1[变量名称2资料2....])e.g.(SETQ NAME"David"AGE37WEIGHT72.5POINT(LIST1020))在函数名称之后,各参数以两个一组,每组左边为变量名称,右边为存入变量的数据亦可将变量名称赋以空值(NIL):e.g.(SETQ OCCUPATION NIL)要显示变量所储存的数据,可以使用内建函数PRINC(可用于绘图模式的指令行或AutoLISP程序),其语法如下:(PRINC变量名称)MAND:(PRINC NAME)Result:David"David"在绘图模式中,亦可于指令行中使用感叹号!来显示变量内容,或作为指令选项的输入值;语法如下: !变量名称MAND:!NAME Result:"David"在Visual LISP的主控台窗口中,于提示符号_$后键入要显示的变量名称_$变量名称e.g._$NAME要检查变量所储存的数据型态,可使用内建函数TYPE;语法如下:(TYPE变量名称)MAND:(TYPE NAME)Result:STR若检查的变量没有储存数据,则会传回NIL第5节--------------------------------------------------------------------------------练习(Exercises)将四个坐标分别存入四个变量中,并以LINE或PLINE指令,配合四个坐标变量,画出正四边形. COMMAND:(SETQ POINT1(LIST00)POINT2(LIST010)POINT3(LIST1010)POINT4(LIST100)) COMMAND:LINE;直线段指令COMMAND:!POINT1;第一点(左下角起点)COMMAND:!POINT2;第二点(左上角)COMMAND:!POINT3;第三点(右上角)COMMAND:!POINT4;第四点(右下角)COMMAND:C;自动联机至起点以关闭四边形画圆:将圆心坐标及半径长度分别存入两个变量中(变量名称及数据型态自订)COMMAND:(SETQ CEN(LIST00)RAD20);将圆心点设为坐标0,0;半径为20COMMAND:CIRCLE;执行划圆指令Specify center....:!CEN;在提示后以变量CEN响应输入Specify radius....:!RAD;在提示后以变量RAD响应输入将不同型态的数据,分多次存入相同的变数内;每次均以PRINC及TYPE函数显示变量内容及其数据型态COMMAND:(SETQ TEMP1.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.546)Result:12.5函数的结果为各参数之总和若仅提供一个参数,则以0加上此参数的结果为返回值若没有提供任何参数则传回0;各参数须为整数或实数型态若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转换为实数减函数(-[数值参数1数值参数2....])e.g.(-1023)Result:5结果为第一个(最左边)参数减去其右边各参数的总和若只提供一个参数,返回值为0减去该参数的结果若没有提供任何参数则传回0;各参数须为整数或实数型态若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转换为实数乘函数(*[数值参数1数值参数2....])e.g.(*234)Result:24结果为所有参数的乘积若只提供一个参数,则返回值为该参数乘以1的结果若没有提供任何参数则传回0;各参数须为整数或实数型态若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转换为实数除函数(/[数值参数1数值参数2....])e.g.(/2423)Result:4结果为第一个(最左边)参数除以其右边各参数的乘积若仅提供一个参数,则返回值为该参数除以1的结果若没有提供任何参数则传回0;各参数须为整数或实数型态若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转换为实数注意:在本篇教程中,各函数的数值参数,均可以变量(储存值只可以是整数或实数,且不可以是空值nil)取代第2节--------------------------------------------------------------------------------练习(Exercises)计算式(2+4)*3COMMAND:(*3(+24))Result:18计算式(50-8*5)/4COMMAND:(/(-50(*85))4)Result:2注意:上式的正确答案应是2.5,因为函数中的各参数均为整数,所以传回的结果亦为整数递增及递减递增(1+数值参数)e.g.(1+2)Result:3递减(1-数值参数)e.g.(1-4)Result:3三角函数(Trinagular Function)正弦值(SIN弧度参数)e.g.(SIN1)Result:0.841471余弦值(COS弧度参数)e.g.(COS1)Result:0.540302反正切值(ATAN弧度参数)e.g.(ATAN1)Result:0.785398第3节--------------------------------------------------------------------------------其它数值处理次方值(EXPT数值参数次方值)e.g.(EXPT24)Result:16若参数及次方值两个均为整数,返回值亦是整数;若其中一个为实数,结果为实数开方根(SQRT数值参数)e.g.(SQRT30)Result:5.47723绝对值(ABS数值参数)e.g.(ABS-123)Result:123余数(REM[数值参数1数值参数2....])e.g.(REM50265)=(REM(REM5026)5)Result:4将参数1整除参数2的余数若参数多于2个时,则会将余数再整除下一个参数,再得出余数;依此类推若其中一个参数为实数时,则结果为实数;否则为整数最大公约数(GCD数值参数1数值参数2)e.g.(GCD8157)Result:3两个参数均必须为整数值型态自然对数(LOG数值参数)e.g.(LOG3.5)Result:1.25276是EXP函数的反函数;传回值为实数型态自然反对数(EXP数值参数)e.g.(EXP1.25276)Result:3.49999是LOG函数的反函数;传回值为实数型态第4节--------------------------------------------------------------------------------数值资料转型实数转整数(FIX数值参数)e.g.(FIX12.56)Result:12只会截去小数部份(小数字不会4舍5入)整数转实数(FLOAT数值参数)e.g.(FLOAT12)Result:12.0整数转字符串(ITOA数值参数)e.g.(ITOA-17)Result:"-17"数值转字符串(RTOS数值参数[模式[小数字]])e.g.(RTOS17.2333323)Result:12.266若不设定模式,则依系统变量LUNITS的设定值转换数值为字符串若不设定小数字,则依系统变量LUPREC的设定值转换模式设定值可以是下列数值之一:1=科学记号2=十进制3=英呎及十进制英吋4=英呎及分数位英吋5=分数当选用的模式为3,4或5,则传回的字符串受系统变量UNITMODE影响弪度转字符串(ANGTOS角度参数[模式[小数字]])e.g.(ANGTOS0.7853980)Result:"45"e.g.(ANGTOS0.7853984)Result:"N45d 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.(MINUSP0)Result:nile.g.(MINUSP3.45)Result:nil零值(ZEROP数值参数)e.g.(ZEROP0)Result:Te.g.(ZEROP3.45)Result:nil其它应用最大值(MAX[数值参数1数值参数2....])e.g.(MAX-8852)Result:5若没有提供任何参数,则传回值为0最小值(MIN[数值参数1数值参数2....])e.g.(MIN-8852)Result:-88若没有提供任何参数,则传回值为0第6节--------------------------------------------------------------------------------练习(Exercises)计算下列算式:(+12345678901234567890)Result:-1825831516上式中两个数值参数均为整数,而结果值大于整数型态所能容许之范围;固导致发生溢位问题,产生无效的结果.修正算式如下:只要将其中一个参数改为实数型态即可.(+1234567890.01234567890)Result:2.46914e+009计算下列算式:(+98765432101234567890)Result:1.11111e+010上式中两个数值参数均为整数,但其中一个(第一个)参数巳大于整数型态所能容许之范围;系统会自动将此参数先行转为实数型态才计算.计算下列算式:(FIX(SQRT(+1(MAX20104030))))Result:6----最先执行的是最内层的算式(MAX20104030),求出最大值为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若程序文件不在系统的支持目录下,则需在文件名前加上目录路径注意:必须以正斜线/或两个反斜线\\作为目录的分隔符可以在加载失败的参数中提供字符串,以供加载失败时显示;亦可提供有效的自定函数,该函数在加载程序文件失败时会被执行e.g.(LOAD"TEST""Load Fail")或(LOAD"TEST"(DOERROR))注意:在程序文件加载后,在提示行显示的返回值,一般是该程序文件中,最后被定义的函数名称或是在程序文件内没有包含在自定函数中,最后一个表达式的执行结果第3节--------------------------------------------------------------------------------练习(Exercises)启动文字编辑器,编写一AutoLISP程序作两个同心圆(第1个圆半径为50,第2个圆半径为80),程序代码如下所示:(DEFUN C:2CIRCLE()(SETQ CEN(LIST00)RAD50)(COMMAND CIRCLE CEN RAD)(COMMAND CIRCLE CEN(+RAD30)))----输入后以纯文字格式存盘(C:\TEST.LSP)----在AutoCAD绘图模式的指令行提示后,用LOAD函数将程序文件加载COMMAND:(LOAD"C:/TEST")----在指令行提示后,输入程序(函数)名称执行COMMAND:2CIRCLE程序说明1使用DEFUN建立自定函数的名称,并用SETQ函数将中心点(LIST00)存入变数CEN,半径(50)存入变数RAD中2使用COMMAND函数执行AutoCAD内建指令CIRCLE,并以变量CEN(圆的中心点)及变数RAD(圆的半径)回应3与第2行大致相同,但在指定其半径时,先将储存半径的变量加30,使划出半径为80的圆;注意最右边的关括号,与第1行DEFUN左边的开括号是一对的启动文字编辑器,开启TEST.LSP程序文件,复制2CIRCLE至新程序2C,并改为传入自变量方式执行;程序代码如下:(DEFUN2C(CEN RAD)(COMMAND CIRCLE CEN RAD)(COMMAND CIRCLE CEN(+RAD30)))----输入后以纯文字格式存盘----在AutoCAD绘图模式的指令行提示后,用LOAD函数将程序文件重新加载----在指令行提示后,输入程序(函数)名称执行COMMAND:(2C(LIST00)50)第4节--------------------------------------------------------------------------------批注单行批注分号;表示在分号右边(同一行)的字符均为批注,程序执行时会将其忽略多行批注;||;表示在两个批注符号中间所有字符皆为批注,即使字符跨越多行关系运算在各个关系运算中,都会传回一逻辑值;若关系成立,传回T,否则会传回nil各参数可以是字符串,整数或实数型态;若以字符串进行比较,则会以字符串的ASCII码为准若函数中只有一个参数,传回值恒为T等于函数(=参数1[参数2....])会将参数1与其后各个参数比较,若全部相等则传回T,否则传回nil e.g.(=22.0)Result:Te.g.(="A"CHR(65))Result:T不等于函数(/=参数1[参数2....])若参数1不等于其后任何一个参数,即传回T e.g.(/=12.0)Result:Te.g.(/="a"CHR(65))Result:Te.g.(/=1030401020)Result:T小于函数(<参数1[参数2....])各参数顺序以2个为一组比较,若各组左边的参数均小于右边的参数,即传回Te.g.(<12)Result:Te.g.(<"a"CHR(65))Result:T大于函数(>参数1[参数2....])各参数顺序以2个为一组比较,若各组左边的参数均大于右边的参数,即传回Te.g.(>12)Result:nile.g.(>"a"CHR(65))Result:nil小于或等于函数(<=参数1[参数2....])各参数顺序以2个为一组比较,若各组左边的参数均小于或等于右边的参数,即传回Te.g.(<=12)Result:Te.g.(<=22)Result:Te.g.(<="a"CHR(65))Result:T大于或等于函数(>=参数1[参数2....])各参数顺序以2个为一组比较,若各组左边的参数均大于或等于右边的参数,即传回Te.g.(>=12)Result:nile.g.(>=22)Result:Te.g.(>="a"CHR(65))Result:nil第5节--------------------------------------------------------------------------------逻辑运算且运算(AND[表达式....])若各表达式的传回值均为T,函数即返回T值;若其中一个传回值为nil,函数传回nile.g.(AND(<12)(>85))Result:T或运算(OR[表达式....])若各表达式的传回值均为nil,函数即返回nil值;若其中一个传回值为T,函数传回Te.g.(OR(>12)(>85))Result:T否定运算(NOT表达式)若表达式的传回值为T,函数即返回nil值;相反若表达式传回值为nil,函数传回T 可用于检查传回值是否为nil另有一NULL函数与NOT函数功能相似e.g.(NOT(<12))Result:nil练习(Exercises)试求出50减25,与625的开方根值是否相等COMMAND:(=(-5025)(SQRT625))Result:T设计一简单程序(名称为AIR),在呼叫程序时,检查传入的数值自变量(为空气污染指数)是否大于200(即严重空气污染)----启动文字编辑器,开启TEST.LSP程序文件,输入下列程序代码:(DEFUN AIR(NUM)(>NUM200))----输入后存盘(纯文字格式)----在AutoCAD绘图模式的指令行提示符号后,使用LOAD函数重新加载程序文件COMMAND:(LOAD"C:/TEST")----在AutoCAD绘图模式的指令行提示符号后,输入自定函数名称及参数执行COMMAND:(AIR175)Result:nilCOMMAND:(AIR215)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(>NUM100)(PRINC"Very High"))(IF(AND(>NUM50)(<=NUM100))(PRINC"High"))(IF(AND(>NUM25)(<=NUM50))(PRINC"Medium"))(IF(<=NUM25))(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(>NUM50)(PRINC(IF(>NUM100)"Very high""High"))(PRINC(IF(>NUM25)"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(>NUM100)(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((>NUM200)(PRINC"Severe"))((>NUM100)(PRINC"Very High"))((>NUM50)(PRINC"High"))((>NUM25)(PRINC"Medium"))((>NUM0)(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.(REPEAT10(PRINC"David"));重复显示David字符串10次重复(WHILE条件表达式[是表达式....])若条件表达式的传回值为T,即会顺序执行函数内各表达式各表达式顺序执行完后,程序会返回函数的开头,重新检查条件表达式的传回值若条件表达式的传回值为nil,函数内各表达式将不会被执行e.g.(SETQ COUNT1);将1存入变数COUNT(WHILE(<=COUNT10);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 COUNT1TOTAL0)(WHILE(<=COUNT NUM)(SETQ TOTAL(+TOTAL COUNT)COUNT(1+COUNT)))(PRINC TOTAL)(PRINC))程序说明1设定函数SUM并将自变量存入变量NUM,设定变量COUNT以将数目由1开始递增,变量TOTAL(储存总和)初始值为0。

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

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教程

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(二)在第一步中我们是在CAD命令行中进行一些练习,这显然无法满足我们正常的使用要求,所以我们一般将程序写成文件,LISP程序文件的扩展名为“.lsp”。

在AutoCAD2004及以后的CAD中有专门的软件编写程序Visual Lisp,也可以用普通的文本编写软件如记事本进行编写,但文件的扩展名一定要是“.lsp”。

为使大家能对lsp文件的使用有更好的理解,本文一律按使用普通文本编辑器编写的方式进行描述。

打开文本编辑器编写一个文件,文件名为“key.lsp”,将文件保存到C盘根目录下。

键入如下一行程序:(defun c:cm() (command "COPY" pause "" "m"))保存后,在CAD命令行键入:(load"c:/key"),即可将key.lsp调入CAD,返回c:cm。

如下图:在命令行键入“cm”可以执行对一个图元进行多次拷贝的命令,在lisp程序中函数及参数不区分大小写,但参数的返回值有大小之分。

先对程序进行解读:defun 定义函数的函数,后面的c:cm是一个函数的名称。

c:cm 自我定义的函数名称,带“c:”的函数是可以作为操作命令的函数,我们姑且将这类函数称为命令函数。

如果没有“c:”,只有“cm”,则得到的返回值是“cm”,在命令行键入“cm”则不会执行前面的多重拷贝操作。

键入“(cm)”就会执行该操作,我们就称之为一般函数。

() 这个空括弧是用来填写参数的,由于我们的这段程序没有用到任何其他参数,所以括弧内是空的。

command 调用CAD原有命令的函数,这是lsp程序中应用非常多的一个函数,许多操作可以直接调用CAD自己的命令,不许再重新编写。

"copy" 调用的CAD命令名称,名称与前面的command之间有没有空格都可以,而且要用命令全名,不能用简化命令,而且要用引号。

AutoLISP-Visual-LISP教程《第六章》

AutoLISP-Visual-LISP教程《第六章》

单击按钮 ,光标停在(getdist p1 "输入矩形的宽:") 之前,并亮显该表达式。注意,指示按钮内的"I"回到"()"之 前。监视窗口内的变量p1=[100.0 80.0 0.0]。重复类似的操 作,在AutoCAD窗口输入矩形的宽度为200、高度为150,旋转角 为30。在操作过程中指示按钮随时显示着光标相对于表达式的 位置,监视窗口显示着这些变量的当前值(注意,alf的单位为 弧度)。也说明单击按钮 只执行了一步表达式求值。
2. 监视窗口的快捷菜单
选择监视列表中的某一项并单击鼠标右键,可显示图6-4所示监视窗口 的快捷菜单。
调用检验功能,查看所选值。 将所选变量的值复制到系统变量 *obj* 中。 将所选变量值加上一个单引号前缀”,打印到把握台窗口。 对所选变量调用符号效劳对话框。 调用自动匹配选项对话框,用所选变量名作自动匹配参数。 从监视窗口中删除所选变量。
从断点循环退出,将恢复上一层循环。假设在该断 点循环中修改了某变量的值,程序连续运行时将使用变 量修改后的值。
断点循环分为可连续断点循环和不行连续断点循环。
1. 可连续的断点循环 可连续的断点循环是指可以在程序中断处,连续向下执行剩
余的表达式。用以下方法进入可连续断点循环: 〔1〕翻开Stop Once模式,遇到带调试信息的表达式时。 〔2〕遇到带Debug on Entry〔进入时调试〕标志的函数时。 〔3〕遇到程序中设置的断点时。 〔4〕单击暂停按钮进入断点循环时。 〔5〕在前一个断点循环状态下,执行Step Into、Step Over或 Step Out时。
图6-2 Debug下拉菜单
下下跳连退重设添显调
一一出续出置置加示试
层个表执当为或监上指

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教程第2章

AutoLisp教程第2章

同之处。
在 AutoLISP 中,符号的大小写等价,符号的长 度没有限制,且所有的字符都是有意义的。 如果一个符号的长度不超过 6,就用节点本身来存
储;如果符号的长度超过 6 ,这样的符号就不能用节
点来存储,而是在节点中存放一个指向实际存储符号 名的指针。这将会多占用存储空间,且减慢了执行速 度。因此,符号的长度最好不要超过6。
2. 实型(REAL)
实型数是带小数点的数。在-1和1之间的实数必须以0开头,例 如:.5是错误的,应该写成0.5。实数用双精度的浮点数表示,并 且至少有14位有效位数的精度。注意,Visual LISP不显示所有的 有效位。
3. 字符串(STR)
字符串又被称为字符常数 ,它是由双引号括起来的字符序列。
2.2.4 预定义的符号
AutoLISP对变量 nil、T、Pause和Pi进行了预定义,用户可以 在编写AutoLISP程序时直接使用。 (1) nil 如果变量没有被赋值,它的值为 nil 。 nil 与空和 0 不同的是, 它既不是空串,也不是0值,它表示尚无定义。引用未被赋值的 变量是错误的。例如,变量 x 尚未被赋值,( + 1 x )就会出现 error: bad argument type(坏的参数类型错)。 将nil赋给某一有定义的变量,其结果是:取消该变量的定义 ,并释放其所占存储空间。 nil作为逻辑变量的值,表示不成立,相当于其他程序设计语 言的false。
2.2.2 变量的数据类型
AutoLISP变量属于符号,是指存储静态数据的符号。 数据类型是变量的重要的特征,因为它关系到存放变量值的 存储空间的大小。多数的计算机语言都在为变量赋值前对变量做 显式或隐式的说明。 AutoLISP 无须对变量做事先的类型说明, 变量被赋予值的类型即为变量的类型。 用setq函数对变量赋值,例如,(setq a 5),赋值后的结果是 :变量a是整型的,因为5是整型的;同样的原因,(setq b 2.5) 之后, b是实型的,(setq c "ABC")之后,c就是字符串类型的。

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)。

命令: (setq 32bit (float (* 3 30000)))
90000.0
字符串处理
AutoLISP 提供了如下处理字符串值的函数:
strcase strlen wcmatch
strcat substr
下列函数用于在字符串值和数字值之间相互转换(详细信息请参见转换函数)。
在命令行中输入文本时,AutoCAD 将该文本与内部的可用命令名列表作比较,以解释该文本。如果输入的文本与列表中的某项相匹配,AutoCAD 执行该命令。当 AutoCAD 接收到 AutoLISP 代码时,它将该代码传递给 AutoLISP 解释器。AutoLISP 解释器的核心是计算器。该计算器读取一行代码,对它求值,然后返回一个结果。代码必须符合 AutoLISP 表达式的格式要求,它可以从文件中读取,也可以由用户从 AutoCAD 命令行中输入。
30
常见错误是忽略了文本字符串中的双引号 (")。在这种情况下,右括号被解释为字符串的一部分,而不会对 n 产生影响。要改正此错误,可按 ESC 键取消该函数,然后重新输入正确的表达式。
虽然可以在命令行中输入 AutoLISP 代码,但在测试和调试 AutoLISP 代码时,从文件中加载 AutoLISP
~(按位非) expt lsh zerop
1+(增 1) fix max
1-(减 1) float min
关于每个数字处理函数的详细信息,请参见第十三章“AutoLISP 函数列表”。
除了在应用程序中执行复杂的数学计算以外,用户也可在日常使用 AutoCAD 时用数字处理函数来协助完成工作。例如要将一条直线按照长度为模数 *3.1415... 切分,而模数为 3,可在命令提示中使用 *(乘)函数。
命令: (setq newlen (- (strlen filnam) 4))
7
命令: (substr filnam 1 newlen)
"bigfile"
如果应用程序中不需要使用 newlen 的值,可将两行代码合并为一行:
命令: (substr filnam 1 (- (strlen filnam) 4))
所有 AutoLISP 表达式的格式都如下所示:
(function arguments)
每个表达式都以一个左括号开始,由一个函数名和一个该函数的参数组成,并且每个参数都可以是一个表达式。表达式以右括号结束。每个表达式都返回一个可由外层表达式使用的值。如果没有外层表达式,则 AutoLISP 将该值返回给 AutoCAD 命令行。例如,如下代码调用了三个函数。
代码要比每次修改后都重新输入要简单得多。AutoLISP 代码通常保存在扩展名为 .lsp 或 .mnl 的 ASCII 文本文件中。但只要在调用 load 函数时提供完整的文件名,就可以从任何 ASCII 文本文件中加载 AutoLISP 代码。从文件或在命令行中输入的 AutoLISP 表达式的语法相同。
"bigfile"
等量和条件
AutoLISP 中既包括验证等式的函数,也包括条件分支和循环函数。等式和条件函数包括:
=(等于) and or
/=(不等于) Boole repeat
<(小于) cond while
<=(小于或等于) eq
(fun1 (fun2 arguments)(fun3 arguments))
第一个函数 fun1 有两个参数,另两个函数 fun2 和 fun3 各有一个参数。函数 fun2 和 fun3 被函数 fun1
所包含,因此它们的返回值作为参数传递给 fun1。函数 fun1 由这两个参数计算函数值,并将该值返回给命令行。
>(大于) equal
>=(大于或等于) if
表处理
AutoLISP 提供了如下处理表的函数:
append foreach listp reverse
assoc last mapcar subst
car and cdr length member
命令: (strcase "This is a TEST." T)
"this is a test."
strcat 函数用于将多个字符串组合成一个字符串值。这有利于将变量字符串放到常量字符串中。如下代码将变量设置为一个字符串值,然后用 strcat 将该字符串插入到另一字符串中间。
命令: (setq str "BIG") (setq bigstr (strcat "This is a " str " test."))
向您推荐 Addison-Wesley 出版的两本书:Winston 和 Horn 撰写的《LISP》(第二版),Tony Hasemer 撰写的《Looking at LISP》。
基础
在 AutoCAD 的 sample 目录中提供了大量 AutoLISP 程序,包括本手册中的许多样例。许多 AutoLISP 程序也可以作为共享软件或从第三方开发商获取。AutoLISP 代码可以在命令行中输入,因此易于学习。一旦用户学会 AutoLISP,即可将其用于扩展 AutoCAD 命令。
命令: (strcase "This is a TEST.")
"THIS IS A TEST."
如果为第二个参数提供了非 nil 值,则返回字母被转换为小写的字符串。AutoLISP 提供了预定义的变量 T,以便在这种需要用非 nil 值作真/假开关的情况下使用。但用户不必非要使用 T,也可以使用任何非 nil 值,只要该值更适合用户的应用程序。
AutoLISP 变量的数据类型取决于分配给它的值的数据类型。除非给变量分配新值,否则该变量将一直保留原来的值。可以用 AutoLISP setq 函数为变量分配新值。
(setq variable_name1 value1 [variable_name2 value2 ...])
setq 函数将指定的值分配给指定的变量,并将该值作为函数结果返回。如果在命令提示中使用 setq,则 AutoCAD 将设置变量并显示该值。
"This is a BIG test."
单个字符串值的长度最大为 132 个字符。通过用 strcat 函数连接字符串,可以创建长度没有限制的字符串。
如果变量 bigstr 被设置为上述字符串值,则可以用 strlen 函数计算该字符串中的字符个数(包括空格)。
命令: (strlen bigstr)
命令: (* 2 (+ 5 10))
30
如果输入的闭(右)括号数量不对,AutoLISP 将显示如下提示:
n>
其中,n 是一个整数,表明还有几层左括号尚未匹配。如果出现此提示,用户必须输入 n 个右括号后才能对表达式求值。
命令: (* 2 (+ 5 10
2> ) )
命令: (setq val 3 abc 3.875)
3.875
命令: (setq layr "EXTERIOR-WALLS")
"EXTERIOR-WALLS"
命令:
每个变量都要占用一小块内存,因此应当重复使用变量名或在不再需要时将它们设置为 nil,是一种良好的编程习惯。将变量设置为 nil 会释放用于保存该变量值的内存。例如用户不再需要 val 变量,可以用如下表达式释放其值:
cons list nth
本节提供了 append、assoc、car、cons、list、nth 和 subst 函数的样例。
表提供了保存大量相关值的一种有效方法。一些 AutoLISP 函数为设计二维和三维图形应用程序提供了基本工具,这些函数以表的形式返回点值。
命令: measure
选择测量对象:
<分段长度>/块(B): (* 3 Pi)
如果给数字处理函数的 number 参数分别提供整数或实数值,则包含该参数的算术函数将返回不同的值。如果所有的参数都是整数,则返回值也是整数。但如果参数中存在实数,则返回值是实数。如果要确保应用程序返回实数值,则必须保证至少有一个参数是实数。
angtof atof distof
angtos atoi itoa
ascii chr rtos
下列函数用于在命令行中显示字符串值(详细信息请参见显示控制)。
prin1 print
princ prompt
strcase 函数用于将字符串中的所有字母字符转换为大写或小写。它接受两个参数:一个是字符串;另一个是可选参数,用于指定所返回字符的大小写。如果忽略可选的第二个参数,或它被赋值为 nil,那么 strcase 返回字母被转换为大写的字符串。
命令: (setq val nil)
nil
数字处理
AutoLISP 提供了如下处理整数和实数的函数:
+(加) abs gcd cos logand sin
/(除) exp logior sqrt
19
substr 用于返回某个字符串的一个子串。它有两个必要参数和一个可选参数。第一个参数是字符串。第二个参数是一个整数,用于指定子串中第一个字符的位置。如果提供了第三个参数,则它指定子串中包括的字符数;如果未提供第三个参数,substr 将返回由指定的开始字符及其后的所有字符组成的字符串。
AutoLISP教程(一)
AutoLISP 是 LISP 编程语言的一种特定实现方式,是 AutoCAD 的组成部分。借助 AutoLISP,可以用适合编写图形应用程序的强大的高级语言来编写宏程序和函数。AutoLISP 易于使用,并且非常灵活。
相关文档
最新文档