autolisp教程
autolisp培训教程48页word
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教程
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 基础........................................................................................................................... 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 及相 关的各种产品。
AUTOLisp教程
命令: (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,可在命令提示中使用 *(乘)函数。
AutoLISPVisualLISP教程学习教程
第9页/共87页
10.2.2访问其他AutoCAD对象
获取AutoCAD应用程序这个根对象之后,沿着AutoCAD对象模 型图,就可以将其作为起点,逐级访问它的下一级VLA对象。
第5页/共87页
2. 了解AutoCAD应用程序的属性和方法
(vlax-dump-object VLA对象 [T]),该函数的功能是列出指定 VLA对象的属性和方法,参数为VLA对象,如果未设置T,只列出 指定VLA对象的属性。例如
(vlax-dump-object myacad t)返回
; IAcadApplication: An instance of the AutoCAD application
; ZoomCenter (2) ; ZoomExtents () ; ZoomPickWindow () ; ZoomPrevious () ; ZoomScaled (2) ; ZoomWindow (2)
第8页/共87页
在Property values(属性)部份列出了AutoCAD应用程序具 有ActiveDocument(活动的文档)、Application(应用程序的 指针)、Caption(标题)、FullName(可执行文件名)等属性。
第13页/共87页
; Handle (RO) = "81" ; HasExtensionDictionary (RO) = 0 ; Hyperlinks (RO) = #<VLA-OBJECT IAcadHyperlinks 040a53f4> ; Layer = "0" ; Length (RO) = 50.0 ; Linetype = "ByLayer" ; LinetypeScale = 1.0 ; Lineweight = -1 ; Normal = (0.0 0.0 1.0) ; ObjectID (RO) = 2129985160 ; ObjectName (RO) = "AcDbLine" ; OwnerID (RO) = 2129984760 ; PlotStyleName = "ByLayer" ; StartPoint = (10.0 20.0 0.0) ; Thickness = 0.0 ; TrueColor = #<VLA-OBJECT IAcadAcCmColor 040a6db0> ; Visible = -1
AutoLISP从入门到精通初级教程(新手必备)
AutoLISPxx单元一: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的记事本、P2、P3、D3、书中仙、汉书、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从入门到精通初级教程(新手必备)
AutoLISPxx单元一: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的记事本、P2、P3、D3、书中仙、汉书、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教程
第十二章从菜单执行函数1.制作简单的菜单(a)首先定义一个函数,并保存为plus32.lsp:(defun plus32()(setq a (+ 3 2)))(b)编写菜单生成文件,并保存为mylisp.mnu:***MENUGROUP=Mylisp ;菜单组的名称***POP1 ;第一组下拉菜单[Mylisp] ;第一组下拉菜单总的名称[plus] ^c^c^p(load “plus32.lsp”) (plus32) ;菜单名,加载,执行;一定是一个空行(c)加载菜单和执行函数用menuload函数执行加载.2.制作较为复杂的菜单(a)首先定义两个函数,并保存为plus32.lsp和plus45.lsp :(defun plus32()(setq a (+ 3 2)))(defun plus45()(setq a (+ 4 5)))(b)编写菜单生成文件,并保存为mylisp.mnu:***MENYGROUP=MYLISP***pop1[mylisp1][first] ^c^c^p(load "plus32.lsp") (plus32)[first2] ^c^c^p(load "plus45.lsp") (plus45)***pop2[mylisp2][first2] ^c^c^p(load "plus32.lsp") (plus32)[first4] ^c^c^p(load “plus45.lsp”) (plus45)(c)加载菜单和执行函数用menuload函数执行加载.第十三章保持程序畅通1.程序示例(a)首先定义一个函数,并保存为myline.lsp:(defun myline()(graphscr)(setq pt1 (getpoint "\n请输入第一个点:"))(setq pt2 (getpoint pt1 "\n请输入第二个点:"))(command "line" pt1 pt2 ""))(b)执行上述程序后,出现提示,显得很繁琐>:请输入第一个点:>:请输入第二个点:line 指定第一点:>:指定下一点或[放弃(U)]:>:指定下一点或[放弃(U)]:>:命令: nil2.解决办法:通过改变系统变量cmdecho的值来关闭响应(defun myline()(graphscr)(setq oce (getvar "cmdecho"))(setvar "cmdecho" 0)(setq pt1 (getpoint "\n请输入第一个点:"))(setq pt2 (getpoint pt1 "\n请输入第二个点:"))(command "line" pt1 pt2 "")(setvar "cmdecho" oce)(princ))3.程序框架:(defun ×××()(graphscr)(setq oce (getvar "cmdecho"))(setvar "cmdecho" 0)…… ……(setvar "cmdecho" oce)(princ))第十四章读写数据库1.打开数据文件(setq fp (open "d:/lisp/point.txt" "r"))用open函数打开数据库,文件须制定路径,同时需要指出文件的读取模式.文件的读取模式:r----读出w---写入a---添加2.读出数据(setq pt1 (read-line fp)) ;按行读出数据(setq pt1 (read pt1)) ;去掉数据外面的双引号3.关闭数据库(close fp)4.读取数据库程序示例首先建立数据文件d:/lisp/point.txt编写下面的程序,运行,检验程序的正确性.(defun myline()(graphscr) ;图形窗口(setq oce (getvar “cmdecho”)) ;保存变量的值(setvar “cmdecho” 0) ;改变变量的值(setq fp (open “d:/lisp/point.txt”“r”)) ;打开文件(while (/= (setq pt1 (read-line fp)) nil) ;判断是否到文件末(setq pt1 (read pt1)) ;去掉外层引号(princ “\n”) ;回车键(princ pt1) ;显示数据)(close fp) ;关闭文件(setvar “cmdecho”oce) ;回复变量的值(princ) ;关闭最后的响应)5.读取数据库并绘制直线(defun myline()(graphscr) ;图形窗口(setq oce (getvar “cmdecho”)) ;保存变量的值(setvar “cmdecho”0) ;改变变量的值(setq fp (open “d:/lisp/point.t xt”“r”)) ;打开文件(setq pt1 (read-line fp))(setq pt1 (read pt1))(setq pt11 pt1)(while (/= (setq pt2 (read-line fp)) nil)(setq pt2 (read pt2))(command "line" pt1 pt2 "")(setq pt1 pt2))(command "line" pt1 pt11 "")(close fp) ;关闭文件(setvar “cmdecho”oce) ;回复变量的值(princ) ;关闭最后的响应)6.读取数据库并写入另一文件(defun myline()(graphscr)(setq oce (getvar "cmdecho"))(setvar "cmdecho" 0)(setq fp (open “d:/lisp/point.txt”“r”)) ;打开数据文件(setq fp1 (open "d:/lisp/point1.txt" "w"))(while (/= (setq pt1 (read-line fp)) nil) ;读出数据(setq pt1 (read pt1))(princ pt1 fp1) ;写数据(princ “\n”fp1) ;换行)(close fp)(close fp1)(setvar "cmdecho" oce)(princ))第十五章自定义错误函数Autolisp遇到错误时,会通过两种渠道显示错误情况:ERRNO系统变量和*error*函数.通常以后者为主.当*error*函数被设为nil时,Autolisp的错误以预设的显示方式显示:例如:command: (/ 1 0); 错误: 除数为零一般来说(并非所有),当Autolisp的函数执行导致autocad侦测到错误时,系统变量ERRNO会保存对应的错误码.所以,程序里面的自定义错误函数的自定义变得可行.首先定义一个简单报错函数:(defun *error* (msg)(alert msg)(princ))执行语句(/ 1 0) 后,看看响应的提示.1.自定义错误函数的应用(defun sqrtnum()(setvar "errno" 0) ;设置系统变量的值(setq olderr *error*) ;保存*error*的值(defun *error* (msg) ;定义*error*函数(setq en (getvar "errno")) ;取得系统变量"errno"的代码(setq errmsg (strcat "ERRNO = " (itoa en) "\nError: " msg));系统变量的值和错误信息(alert errmsg) ;显示统变量的值和错误信息(setq *error* olderr) ;恢复*error*的值)(setq x (getreal "\n请输入一个数:"))(setq y (* x x))(princ "\n")(princ x)(princ "^2 = ")(princ y)(setq *error* olderr)(princ))运行程序,输入数值时按ESC键看看错误提示.第十六章对话框定义Autolisp不能相其他语言一样用拖拽的方式设计对话框,而是以对话框控制语言进行对话框的设计.Autolisp对话框包括以下的基本组件:标签、按钮、单选框、复选框、编辑框、列表框、下拉列表、滚动条、图象框、图像按钮一、定义各种类型的对话框组件(a) 定义一个空对话框dcl_demo : dialog{label = "我的对话框";ok_cancel;}利用工具菜单里面的“界面工具”,可以对对话框进行预览,如上图所示.(b) 定义一个单选按钮dcl_demo : dialog{label = "我的对话框";: radio_button{key = "myradio";label = "这是一个单选按钮!";}ok_cancel;}(c) 定义一个复选按钮dcl_demo : dialog{label = "我的对话框";: radio_button //定义单选按钮{key = "myradio";label = "这是一个单选按钮!";}: toggle //定义复选按钮{key = "mytoggle";label = "这是一个复选按钮!";}ok_cancel;}(d) 定义一个按钮dcl_demo : dialog{label = "我的对话框";: radio_button //定义单选按钮{key = "myradio";label = "这是一个单选按钮!";}: toggle //定义复选按钮{key = "mytoggle";label = "这是一个复选按钮!";}: button //定义按钮{key = "mybutton";label = "这是一个按钮!";}ok_cancel;}(e) 定义一个编辑框dcl_demo : dialog{label = “我的对话框”;… … … …: button //定义按钮{key = "mybutton";label = "这是一个按钮!";}: edit_box //定义编辑框{key = "myeditbox";label = "这是一个编辑框:";}ok_cancel;}(f) 定义一个标签栏dcl_demo : dialog{label = “我的对话框”;… … … …: button //定义按钮{key = "mybutton";label = "这是一个按钮!";}: edit_box //定义编辑框{key = "myeditbox";label = "这是一个编辑框:";}: text //定义标签栏{key = "mytext";label = "这是一个标签栏,用来写文字说明的!";}ok_cancel;}(g) 定义一个滚动条dcl_demo : dialog{label = "我的对话框";: slider //定义滚动条{key = "myslider";layout = horizontal;max_value = 100;min_value = 1;value = 50;}ok_cancel;}(h) 定义一个下拉列表框dcl_demo : dialog{label = "我的对话框";: slider //定义滚动条{key = "myslider";layout = horizontal;max_value = 100;min_value = 1;value = 50;}: popup_list //定义下拉列表框{key = "mypopup";label = "右边是下拉列表框:";list = "选项1\n选项2\n选项3";edit_width = 12;}ok_cancel;}(i) 定义一个下拉列表框dcl_demo : dialog {label = "我的对话框";: slider //定义滚动条{key = "myslider";layout = horizontal;max_value = 100;min_value = 1;value = 50; }: popup_list //定义下拉列表框{key = "mypopup";label = "右边是下拉列表框:";list = "选项1\n选项2\n选项3";edit_width = 12; }: list_box //定义列表框{key = "mylist";label = "下边是列表框:";list = "选项1\n选项2\n选项3";height = 12; }ok_cancel;}二、用程序驱动单选按钮对话框单选按钮对话框程序dcl_demo : dialog{label = "旋转角度";: boxed_radio_row{key = "rot_angle";label = "请选择一个旋转角度:";: radio_button //定义单选按钮{key = "angle0";label = "0";}: radio_button //定义单选按钮{key = "angle90";label = "90";}: radio_button //定义单选按钮{key = "angle180";label = "180";}: radio_button //定义单选按钮{key = "angle270";label = "270";}}ok_only;}编写上述文件,并保存为dialog.dcl文件.其对应的对话框界面如下图所示: (b)对话框驱动程序,保存为test.lsp文件(defun c:myradio();加载对话框文件,将返回文件识别码的值赋予dcl_id(setq dcl_id (load_dialog "dialog.dcl"));检查打开对话框是否成功(if(not (new_dialog “dcl_demo” dcl_id)) (exit));回调函数(defun choose(ang)(cond((= ang "angle0") (setq r_ang 0))((= ang "angle90") (setq r_ang 90))((= ang "angle180") (setq r_ang 180))((= ang "angle270") (setq r_ang 270))));设定angle0的初始值为"1"(set_tile "angle0" "1");将r_ang的初始值设为0(setq r_ang 0);用户选择的时候进行判断,返回所选的值(action_tile "rot_angle" "(choose $value)");如果单击确定按钮,则销毁对话框(action_tile "accept" "(done_dialog)");显示对话框(start_dialog);将所选的数值进行输出(princ "\n您选择了")(princ r_ang)(princ " 度!");卸载对话框文件(unload_dialog dcl_id)(princ))加载执行可以看到程序的运行结果!三、用程序驱动复选框对话框(defun c:myradio();加载对话框文件,将返回文件识别码的值赋予dcl_id(setq dcl_id (load_dialog "mydcl.dcl"));检查打开对话框是否成功(if(not (new_dialog "dcl_demo" dcl_id)) (exit));回调函数(setq xian 0 sany 0 lanz 0)(action_tile "xa" "(setq xian (atoi $value))")(action_tile "sy" "(setq sany (atoi $value))")(action_tile "lz" "(setq lanz (atoi $value))");如果单击确定按钮,则销毁对话框(action_tile "accept" "(done_dialog)");显示对话框(start_dialog);将所选的数值进行输出(princ "\n在下面的几个城市中,我选择::")(princ "\n西安:") (if(= xian 1) (princ "想去!") (princ "不想去!")) (princ "\n三亚:") (if(= sany 1) (princ "想去!") (princ "不想去!")) (princ "\n兰州:") (if(= lanz 1) (princ "想去!") (princ "不想去!")) ;卸载对话框文件(unload_dialog dcl_id)(princ))下面是对话框程序:dcl_demo : dialog{label = "旋转角度";: row{key = "rot_angle";label = "请选择你想去的旅游城市:";: toggle //定义复选按钮{key = "xa";label = "西安";}: toggle //定义复选按钮{key = "sy";label = "三亚";}: toggle //定义复选按钮{key = "lz";label = "兰州";}}ok_only;}注意:将单选按钮或复选框组成行列(或区)的时候,具体是有些不同的。
AUTOLISP培训教程_4
AUTOLISP培训教程_4在工程设计和绘图领域,AUTOLISP 作为一种强大的编程语言,为我们提供了许多高效和便捷的工具。
接下来,让我们一起深入了解更多关于 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 是何方神聖?1.AutoLISP是AutoCAD的最佳拍檔!2.AutoLISP內含於AutoCAD軟體內,不用另外花錢買!3.AutoLISP是強化AutoCAD最好、最直接的『程式語言』!4.AutoLISP易學、易用,即使不會程式設計的AutoCAD使用者,都能在最短的時間內,寫出令人驚訝、讚嘆的功能!5.若說AutoLISP的出現,是替AutoCAD 創造一片天的『最大功臣』,實不為過一點也不誇張!6.AutoLISP希望您去學習它、改善它、發揮它、享受它.真的!它的威力、魅力無窮!二. AutoLISP 程式語言的特質分析:學習AutoLISP是非常容易的,對初學者而言,即使沒有學習過任何的程式語言,都能很快的上手,寫出精彩漂亮的AutoLISP程式!三.撰寫AutoLISP 的動機?1.欲強化AutoCAD 原有指令時.2.欲創造更有用的AutoCAD 新指令.3.欲簡化繁瑣的環境設定或繪圖步驟時.4.欲處理參數式繪圖時.5.欲做圖面資料讀檔、寫檔.6.欲做AutoCAD 簡報展示時.7.欲達到真正靈活掌控AutoCAD 時.8.欲提昇自己跨上AutoCAD 高手列車時.四.AutoLISP 的效益評估?1. 對公司負責人或設計主管而言:A.也許某員工或幹部花了20個小時撰寫一個AutoLISP程式,表面上,這將近三天的時間,他連一張圖都沒有畫,甚至可能偶有發呆、沈思,若此程式一天可以替公司繪圖部門節省1小時繪圖時間,那算一算,只要20天就抵銷開發成本,而20天以後都是賺的,『用的愈久,省的愈多』!B.若員工皆有此動力,在不影響正常工作,『鼓勵』都來不及,那有『壓抑』的道理,甚至還要派遣優秀人員出去受訓,學習更好的設計技巧與創意呢?!C.千萬不要因為您的不懂或壓抑,SHOW您的權威與POWER,如此,不但對員工造成打擊,甚至您可能成為阻礙了公司電腦化進步的罪魁禍首D.當然,若要撰寫的程式很多,內部設計人員的程式功力距離太遠,達成需求的時間反而變得遙遙無期,那倒不如求助於市面上已有的相關AutoCAD 支援軟體。
AutoCAD之AutoLisp入门教程
AutoLisp入门教程本节通过一个简单的实例来讲述LISP程序的创建过程,介绍编制LISP程序的一些基本步骤,以及LISP程序在AutoCAD中的加载和运行的方法。
首先来创建一个最简单的LISP程序—-“Hello.lsp”,在AutoCAD 2002中加载并运行该程序,将会在命令行出现-“Hello, Visual LISP!”。
36.2.1 Visual LISP与AutoCAD的通信用户可以直接在AutoCAD命令行中键入AutoLISP表达式。
AutoCAD通过括号来确认AutoLISP表达式。
AutoCAD每当发现一个左括号,就确认为AutoLISP表达式,并由AutoLISP求表达式的值后返回AutoCAD,AutoCAD使用返回结果并继续进行其他工作。
注意在AutoLISP表达式中,左、右括号必须配对,否则AutoCAD将给出提示符n>,n表示右括号丢失数目。
此外,在AutoCAD中调用并执行AutoLISP程序。
在AutoLISP程序中采用COMMAND函数来与AutoCAD 命令程序处理器通信,COMMAND从AutoLISP获得命令并将其传给AutoCAD。
36.2.2 实例1 最简单的LISP程序——“Hello.lsp”Step 1 创建新文件(1) 运行AutoCAD 2002系统,以“acadiso.dwt”为样板创建图形文件,并调用“vlisp”命令进入Visual LISP环境。
(2) 单击“Standard(标准)”工具栏中的按钮,新建一个LISP文件。
Step 2 输入代码并保存文件(1) 在编辑窗口中输入源文件“Hello.lsp”的代码,如图36-3所示。
程序清单如下:;;;* Hello.lsp – Visual LISP文件实例(prompt "Pick point:") ;指定运行时的提示信息(setq ipt (getpoint)) ;在屏幕上指定一点并将其坐标值赋予变量“ipt”(setq hgt 15) ;给变量“hgt”赋值(Command "_.TEXT" "_S" "STANDARD" ipt hgt 0 "Hello, Visual LISP!");调用“Commnad”函数与AutoCAD进行通信[img]/Files/AutoCad/146-1.JPG[/img](2) 单击“Standard(标准)”工具栏中的按钮,以“Hello.lsp”为名保存该文件。
autolisp教程
autolisp教程第⼗四章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(二)在第一步中我们是在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教程《第六章》
单击按钮 ,光标停在(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下拉菜单
下下跳连退重设添显调
一一出续出置置加示试
层个表执当为或监上指
CAD二次开发教程AUTOLISP
(Command “Commandname”)
其中Command…………………AutoLISP函数
Commandname……………AutoCAD命令
示例:
(Command“line” Pt1 Pt2“”) “line” ……………AutoCAD LINE命令 Pt1……………………第一点 Pt2……………………第二点 “”…………………用于返回,相当于“回车”键
屏幕光标选择该点。随后setq函数将这些坐标赋予变量P1。\n的作用是回车,
其后的表达式将被打印在下一行上(“n”代表“newline")
第7行和第8行:(setq P2(getpoint“\n Enter second Point of triangle:”))及(setq
P3(getpoint“\n Enter third Point of triangle:”))
Cad二次开发 --AUTOLISP 入门
一、LISP编程语言概述
AutoLISP是由Autodesk公司开发的一种LISP程序语言(LISP是List Processor的缩写)。第一篇关于LISP的参考文献是由John McCarthy
在1960年4月的《ACM通讯》中发表的。 除了FORTRAN和COBOL, 大多数在六十年代早期开发出来的语
这两行提示用户输入三角形的第二个顶点和第三个顶点,随后把 这些坐标赋予P2和P3。\n的作用是回车,因此输入提示显示在下 一行中。
第9行:(Command“line” P1 P2 P3“C”)
本行中,Command函数用来输入AutoCAD的line命令,然后从P1到 P2,P2到P3各画一条直线。“C”(表示“close”选项)把最 后一点P3与第一点P1连接起来。所有的AutoCAD命令及选项在 AutoLISP程序中使用时都必须置于双引号内。变量P1、P2.
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入门教程.doc
横 跨 各 作 业 悠 然 自 得 , 虽 然 AutoCAD 有 DOS 、 Windows 版 本 之 分 但 是 平台
D. 既然 AutoLISP 是 AutoCAD 的『最大功臣』,当然不会轻易被舍弃 ,如此, 您的学习,保证不会白费! E. 『精益求精』、『虚心求教』、『用心学习、观摩』、『决心成为高手』 3.对程序本身而言: A. 少少的几行,却可能有『大大满意』的时候!!! B. 充份掌握了控制、创造 AutoCAD 的『尚方宝剑』,让您在 AutoCAD 的设 计运作中『得心应手』,享受无比的快乐与成就感!!!
3.重要的 AutoLISP 的基本语法结构 规则 1: 以括号组成表达式,、相对称左右括号数一定要成双成对 规则 2: 表达式型态:(操作数 运算子 运算子 运算子) 1.1 操作数包括『功能函数』&『自定函式』 1.2 运算子(自变量)包括: A.整数(Integer) 如 8,-17,500,9999 ..... B.实数(Real) 如 8.5,-17.456 ..... C.字符串(String) 如 "AutoCAD","123" D.串行(List) 如 ("a" "b" "c"),(x y) E.像素名称代码 如 <entity name: 6000f262> F.档案代码 如 <file:#12438>..... G.选择群集代码 如 <Selection set:1> 规则 3:表达式中的『运算子』,可以是另一『表达式』或『子程序』 规则 4: 多重的括号表达式,运算的先后顺序是『由内而外、由左而右』 规则 5: 以档案型态存在的 AutoLISP 程序(ASCII 档案),其扩展名必须是.lsp 规则 6: 撰写的环境, 只要是一般的文书编辑软件、记事本,可编辑 ASCII 档 案者都适用 规则 7: 以 defun 功能函数定义新的指令或新的功能函式 规则 8: 新定义的功能函式名称,若为『C:函式名』,则此函式可为 AutoCAD 新指令 规则 9: 加载 AutoLISP 程序的作法:=> 指令:后直接键入 (load "LISP 主 檔名") 规则 10: AutoLISP 程序中,在『分号 ;』后的内容均为批注,程序不处理,适 时的增加批注,将使程序更具可看性、学习性及完整性 规则 11: AutoLISP 最常用的变量型态是『整数』、『实数』、『字符串』、 『点串行』四种,变量的型态依据设定值而自动定义 ,变量会一直储存该值,直到 被重新设定值或绘图结束自动消失 规则 12:以 setq 功能函数设定变量值 (setq 变量名称 设定值) 规则 13:欲在 AutoCAD 的环境中,查看一变量值,指令 :下键入『! 变量名』即 可 规则 14:以(defun C:函式名(自变量 / 变数) ........)程序中 ,程序中的变量若在 『/』右边变量内, 则称为『区域变量』,否则为『整体变量』
AutoLisp教程第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就是字符串类型的。
AutoLisp教程
1.3 关于Visual LISP
Visual LISP是为加速AutoLISP程序开发而设计的软件开发 工具,是一个完整的集成开发环境。 Visual LISP包括文本编辑 器、格式编排器、语法检查器、源代码调试器、检验和监视工 具、文件编译器、工程管理系统、上下文相关帮助与自动匹配 功能和智能化控制台等。 Visual LISP用户界面良好,用过Microsoft软件的用户只需很 短的时间即可掌握它。 Visual LISP兼容以前的AutoLISP程序。在Visual LISP集成 环境下开发AutoLISP程序,就不再象以前那样编辑程序时,用 其它系统的文本编辑程序编写程序代码;调试程序时,需要用 户自己决定在程序的什么位置插入打印语句,以便查看变量的 内容;在程序运行正常后,再将插入的调试代码删除或注释掉 。
1.2 关于AutoLISP
AutoLISP是为二次开发AutoCAD而专门设计的编程语言,它起源于LISP
语言,嵌入在AutoCAD的内部,是LISP语言和AutoCAD有机结合的产物。 AutoLISP 采 用 了 和 CommonLISP 最 相 近 的 语 法 和 习 惯 约 定 , 具 有 CommonLISP的特性,但又针对AutoCAD增加了许多功能。它既有LISP语 言人工智能的特性,又具有AutoCAD强大的图形编辑功能的特点。它可以把
AutoLISP程序和AutoCAD的绘图命令透明地结合起来,使设计和绘图完全融
为一体,还可以实现对AutoCAD图形数据库的直接访问和修改。 利用AutoLISP语言可以进行各种工程分析计算、自动绘制复杂的图形,
还可以定义新的AutoCAD命令、驱动对话框、控制菜单。为AutoCAD扩充具
有一定智能化、参数化的功能,可以使设计人员的主要精力用于产品的构思 和创新设计上,实现真正意义上的计算机辅助设计。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第十四章 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函数以及它们S程序编制中的应用。
对于本章中未涉及的函数,请参阅Autodesk 公司的《AutoLISP程序员参考手册》。
AutoLISP对硬件没有任何特殊要求。
如果系统能够运行AutoCAD,那么同样也可以运行AutoLISP。
AutoLISP程序可以使用任何文本编辑器进行编制。
14.2 数学运算任何编程语言都提供数学函数。
在AutoLISP中,同样提供了编程以及数学计算所需的大部分数学函数,你可以使用AutoLISP对数字进行加、减、乘、除运算,还可以得到以弧度表示的角度的正弦值、余弦值及反正切值等。
使用AutoLISP还可以进行许多其他计算。
这一节主要讨论AutoLISP程序语言支持的常用数学函数。
269格式(+ num1 num2 num3…)此函数(+)计算加号(+)右边所有数字的和(+ num1 num2 num3…)。
这些数字可以是整数或实数。
如果均为整数,则和为整数;如果均为实数,则和为实数。
但是如果既有整数又有实数,则和为实数。
如下所示,在前两个例子中,所有数字均为整数,所以结果是整数。
在第三个例子中,一个是实数(50.0),故结果为实数。
示例:Command:(+2 5)返回 7Command:(+2 30 4 50)返回86Command:(+2 30 4 50.0)返回 86.02. 减法格式(- num1 num2 num3…)此函数(-)从第一个数中减去第二个数(num1-num2)。
如果多于两个数,就用第一个数字减去其后所有数字的和[num1-(num2+num3…)]。
在下面的第一个例子中,28减去14后返回14。
因为两个数均为整数,结果亦为整数。
在第三个例子中20与10.0相加,并用50减去两数的和(30.0),返回一个实数20.0。
示例:Command:(- 28 14) 返回14Command:(- 25 7 11)返回7Command:(- 50 20 10.0)返回20.0Command:(- 20 30)返回河0Command:(- 20.0 30.0)返回-10.03.乘法格式(* num1 num2 num3…)此函数(*)计算乘号右边所有数字的乘积( num1×num2×num3…)。
若均为整数,它们的乘积亦为整数;若其中含有一个实数,乘积即为实数。
示例:Command:(* 2 5) 返回10Command:(* 2 5 3) 返回30Command:(* 25 3 2.0) 返回60.0Command: (* 2 -5.5) 返回-11.0Command: (* 2.0 -5.5 -2) 返回22.0270格式( / num1 num2 num3…)此函数(/)用第一个数除以第二个数。
如果多于两个数,就用第一个数除以其后所有数的乘积[num1/(num2 × num3 ×…)]。
在下面的第四个例子中,用200除以5.0与4的乘积[200/(5.0×4)]。
示例:Command:(/ 30)返回 30Command:(/ 3 2)返回1Command:(/3.0 2) 返回 1.5Command:(/ 200.0 5.0 4)返回 10.0Command:(/ 200 -5)返回-40Command:(/ -200 -5.0)返回40.014.3 增量、减量与绝对数字1.增量数字格式(1+ number)此函数(l+)使数字与1(整数)相加,返回一个增加1的数。
在下面的第二个例子中,1与-10.5相加返回-9.5。
示例:(1+ 20)返回 21(1+ -10.5)返回-9.52.减量数字格式(1- number)此函数(1-)从数字中减去1(整数),并返回一个减去1的数。
在下面的第二个例子中-10.5减去1返回-11.5。
示例:(1- 10)返回9(1- 10.5)返回-11.52713.绝对数字格式(abs num)abs函数返回一个数的绝对值。
该数可以是整数或者实数。
在下面的第二个例子中,由于-20的绝对值为20,故函数返回20。
(abs 20)返回 20(abs -20)返回20(abs -20.5)返回20.514.4 三角函数1.sin函数格式( sin angle)sin函数计算一个角(以弧度表示)的正弦值。
在下面的第二个例子中,sin函数计算Pi(180度)的正弦值并返回0。
示例:Command:(sin 0)返回0.0Command:(sin Pi)返回0.0Command:(sin 1.0472)返回0.8660272.cos函数格式(cos angle)cos函数计算一个角(以弧度表示)的余弦值。
在下面的第三个例子中,cos函数计算Pi(180度)的余弦值并返回-1.0。
示例:Command:(cos 0)返回l.0Command:(cos 0.0)返回1.0Command:(cos Pi)返回-1.0Command:(cos 1.0)返回0.5403023.atan函数格式( atan num1)atan函数计算数的反正切值,返回角度以弧度表示。
下面的第二个atan函数计算2721.0的反正切值并返回0.785398(弧度)。
示例:Command:(atan 0.5)返回0.463648Command:(atan 1.0)返回0.785398Command:(atan -1.0)返回-0.7853984.具有两个参数的atan函数格式( atan num1 num2)还可以在atan函数中再指定一个数。
若指定了第二个数,函数将以弧度形式返回(num1/num2)的反正切值。
在下面的第一个例子中,第一个数(0.5)除以第二个数(1.0),atan函数计算商(0.5/1=0.5)的反正切值。
示例:Command:(atan 0.5 1.0)返回0.463648弧度Command:(atan 20 3.0)返回0.588003弧度Command:(atan 2.0 -3.0)返回2.55359弧度Command:(atan -2.0 3.00)返回-0.5880033弧度Command:(atan -2.0 -3.0)返回-2.55359弧度Command:(atan 1.0 0.0)返回1.5708弧度Command:(atan -0.5 0.0)返回-1.5708弧度5.angtos函数格式(angtos angle[made[precision]])angtos函数以字符串格式返回以弧度表示的角度值。
字符串格式由made和 precision的设置决定。
示例:Command:(angtos 0.588003 0 4)返回“33.6901”Command:(angtos 2.55359 0 4)返回“145.3099”Command:(angtos 1.5708 0 4)返回“90.0000”Command:(angtos -1.5708 0 2)返回“270.00”注意 在(angtos angle[mode[precision]])中:angle是以弧度表示的角度值。
mode是与AutoCAD系统变量AUNITS相对应的angtos模式。
AutoCAD中可用模式如下:ANGTOS模式 编辑格式0 十进制角度1 度/分/秒2732 梯度3 弧度4 测量单位precision是一个整数,用于控制小数的位数,与AutoCAD系统变量AUPREC相对应。
其最小值为0,最大值为4。
在上面的第一个例子中,angle为0.588003弧度,mode为0(十进制角度),precision为4(小数点后有四位)。
函数返回33.6901。
14.5关系表达式在程序中,通常都需要测试某些特定的条件。
若条件为真,程序执行某些功能,若不为真,执行另外一些功能。
例如,条件表达式(if(< X 5)),若变量x的值小于5,测试结果为真。
编程过程中经常要用到这种类型的测试条件。
本节讨论在AutoLISP编程中要用到的各种关系表达式。
1.等于格式(= atom1 atom2…)该函数(=)检查两个元素是否相等。
若相等,条件为真,函数返回T。
同样,若指定的元素不相等,条件为假,函数返回nil。
示例:(= 5 5)返回T(= 5 49)返回nil(= 5.5 5.5 5.5)返回T(= “yes”“yes”)返回T(=“yes” “yes” “no”)返回nil2.不等于格式(/= atom1 atom2…)该函数(/=)检查两个元素是否不相等。
若不相等,条件为真,函数返回T。
同样,若指定的元素相等,条件为假,函数返回nil。