autolisp基础.doc_第1页
autolisp基础.doc_第2页
autolisp基础.doc_第3页
autolisp基础.doc_第4页
autolisp基础.doc_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第一篇 基本知识 第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) 例如: (PRINC AutoLISP Programming)每一个完整的函数必须包在一对小括号( )内,左边为开括号,右边为关括号;如有若干数量的开括号,则一定有同等数量的关括号对应;左边开括号后紧随函数名称;函数名称与参数之间,或参数与参数之间须最少留一个空格;函数可有一个或多个参数(也可能没有参数),视该函数而定;函数名称不分大小写,即大小写字母视为相同。第3节 数据型态 (Data Type)整数 (INT) 没有小数字的数值,32位有号数,范围从+2,147,483,647到-2,147,483,648实数 (REAL) 带小数字的数值,以倍精度浮点格式储存(最少14位小数) 例如: 12.5当数值在1与-1之间时,必须加上前导零 例如: 0.05可以科学记号表示:在E或e后加上次方值 例如: 4.1e-6 字符串 (STR) 一般文字,其前后必须加上双引号 例如: AutoCAD控制字符或脱逸码必须为小写,且须在字符前加上反斜线 例如: AutoCAD 像素名称 (ENAME) 是指定给图文件内对象的指针(Pointer,为16进位的数字卷标) 例如: 像素名称在图文件内是唯一的,不会重复对象的像素名称只在目前作业中有效,再开启图档时,会指定新的像素名称予该对象档案(FILE) 以OPEN函数所开启档案的指针,作为其它函数(读写该档案)的自变量选集 (PICKSET) 用SSGET等函数建立的一个或多个对象的集合或群组转化 (VARIANT) 可将像素名称转换为可与ActiveX配搭使用的VLA-Object对象符号 (SYM) 用以储存静态数据的名称;例如内建或使用者定义的函数;符号名称不分大小写,可由任意长度的可打印字符组成;但下列的字符除外:左括号( 右括号) 句点. 单引号 双引号 分号;表 (LIST) 亦称为串行,是放在一对小括号 () 内,一个或多个元素的有序集合 例如:(1.0 Lisp () (5.6 7);元素可以是字符串,符号,整数或实数;也可以是另一个表;元素与元素之间要用空格隔开,但元素与小括号之间则可以不隔空格;为便于存取表内各元素,每个元素均有其序号;从表的左边开始,第一个元素序号为0,依此类推;表的大小即为其顶层元素的数量(内层嵌套式的表,视为单一元素);点对(Dotted Pair)亦是表的一种;表内有2个元素,中间以一圆点分隔,且元素与圆点之间亦须以空格分开;若表内没有任何元素,称为空串行或空表;以 () 或 (NIL) 表示。第4节 变数 (Variable)为程序执行中动态储存数据的符号名称;主要分为2类:区域(Local)变量 又称为局部变量;该变量只在该程序段落中有效,不能为其它程序使用。全域(Global)变量 又称为整体变量;变量在所有程序段落中均可使用。变量名称与符号的限制相同,使用时宜采用有意义及易于辨别的名称;变量在赋值或使用前无须先行设定;相同的变量可以储存不同型态的数据(但同一时间内只可储存一种型态);在指定新的数据之前,变量储存的内容会保持不变赋值 :将数据给予指定的变量储存;以内建函数SETQ进行(可用于绘图模式的指令行或AutoLISP程序),其语法: (SETQ 变量名称1 资料1 变量名称2 资料2 ) 例如: (SETQ NAME David AGE 37 WEIGHT 72.5 POINT (LIST 10 20)在函数名称之后,各参数以两个一组,每组左边为变量名称,右边为存入变量的数据;亦可将变量名称赋以空值(NIL): 例如: (SETQ OCCUPATION NIL) 要显示变量所储存的数据,可以使用内建函数PRINC(可用于绘图模式的指令行或AutoLISP程序),其语法如下: (PRINC 变量名称 ) 例如: COMMAND :(PRINC NAME) Result: DavidDavid 在绘图模式中,亦可于指令行中使用感叹号 ! 来显示变量内容,或作为指令选项的输入值;语法如下: !变量名称 例如: COMMAND :!NAME Result: David 在Visual LISP的主控台窗口中,于提示符号 _$ 后键入要显示的变量名称: _$变量名称 例如: _$NAME 要检查变量所储存的数据型态,可使用内建函数TYPE;语法如下: (TYPE 变量名称) 例如: 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;半径为20 COMMAND : CIRCLE ;执行划圆指令 Specify center : !CEN ;在提示后以变量CEN响应输入 Specify radius : !RAD ;在提示后以变量RAD响应输入将不同型态的数据,分多次存入相同的变数内;每次均以PRINC及TYPE函数显示变量内容及其数据型态COMMAND : (SETQ TEMP 1.2) ;将实数1.2存入变数TEMP COMMAND : !TEMP Result : 1.2 COMMAND : (TYPE TEMP) Result : REAL COMMAND : (SETQ TEMP AutoLISP) ;将字符串存入变量TEMP COMMAND : !TEMP Result : AutoLISP COMMAND : (TYPE TEMP) Result : STR第二篇 数值资料处理第1节 基本运算加函数 (+ 数值参数1 数值参数2 ) 例如: (+ 2.5 4 6) Result: 12.5函数的结果为各参数之总和;若仅提供一个参数,则以0加上此参数的结果为返回值;若没有提供任何参数则传回0;各参数须为整数或实数型态;若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转换为实数。减函数 (- 数值参数1 数值参数2 ) 例如: (- 10 2 3) Result: 5结果为第一个(最左边)参数减去其右边各参数的总和;若只提供一个参数,返回值为0减去该参数的结果;若没有提供任何参数则传回0;各参数须为整数或实数型态;若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转换为实数。乘函数 (* 数值参数1 数值参数2 ) 例如: (* 2 3 4) Result: 24结果为所有参数的乘积;若只提供一个参数,则返回值为该参数乘以1的结果;若没有提供任何参数则传回0;各参数须为整数或实数型态;若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转换为实数。除函数 (/ 数值参数1 数值参数2 ) 例如: (/ 24 2 3) Result: 4结果为第一个(最左边)参数除以其右边各参数的乘积;若仅提供一个参数,则返回值为该参数除以1的结果;若没有提供任何参数则传回0;各参数须为整数或实数型态;若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转换为实数。 注意: 在本篇教程中,各函数的数值参数,均可以变量(储存值只可以是整数或实数,且不可以是空值 nil)取代。第2节 递增、递减与三角函数递增 (1+ 数值参数 ) 例如: (1+ 2) Result: 3递减 (1- 数值参数 ) 例如: (1- 4) Result: 3三角函数 (Trinagular Function)正弦值 (SIN 弧度参数) 例如: (SIN 1) Result: 0.841471余弦值 (COS 弧度参数) 例如: (COS 1) Result: 0.540302反正切值 (ATAN 弧度参数) 例如: (ATAN 1) Result: 0.785398第3节 其它数值处理次方值 (EXPT 数值参数 次方值) 例如:(EXPT 2 4) Result: 16若参数及次方值两个均为整数,返回值亦是整数;若其中一个为实数,结果为实数。开方根 (SQRT 数值参数) 例如:(SQRT 30) Result: 5.47723 绝对值 (ABS 数值参数) 例如:(ABS -123) Result: 123 余数 (REM 数值参数1 数值参数2 ) 例如:(REM 50 26 5)=(REM (REM 50 26) 5)Result: 4将参数1整除参数2的余数;若参数多于2个时,则会将余数再整除下一个参数,再得出余数;依此类推;若其中一个参数为实数时,则结果为实数;否则为整数。 最大公约数 (GCD 数值参数1 数值参数2) 例如: (GCD 81 57) Result: 3 两个参数均必须为整数值型态。 自然对数 (LOG 数值参数) 例如: (LOG 3.5) Result: 1.25276 是EXP函数的反函数;传回值为实数型态。 自然反对数 (EXP 数值参数) 例如:(EXP 1.25276) Result: 3.49999 是LOG函数的反函数;传回值为实数型态。第4节 数值资料转型实数转整数 (FIX 数值参数) 例如: (FIX 12.56) Result: 12 只会截去小数部份整数转实数 (FLOAT 数值参数) 例如:(FLOAT 12) Result: 12.0整数转字符串 (ITOA 数值参数) 例如:(ITOA -17) Result: -17数值转字符串 (RTOS 数值参数 模式 小数字) 例如:(RTOS 17.23333 2 3) Result: 17.233若不设定模式,则依系统变量 LUNITS 的设定值转换数值为字符串;若不设定小数字,则依系统变量 LUPREC 的设定值转换;模式设定值可以是下列数值之一: 1 = 科学记号 2 = 十进制 3 =英尺及十进制英尺吋吋 4 = 英尺及分数位英吋吋 5 = 分数 当选用的模式为3,4或5,则传回的字符串受系统变量UNITMODE影响。弪度转字符串 (ANGTOS 角度参数 模式 小数字) 例如: (ANGTOS 0.785398 0) Result: 45 例如: (ANGTOS 0.785398 4) Result: N 45d E若不设定模式,则依系统变量AUNITS的设定值转换数值为字符串;若不设定小数字,则依系统变量AUPREC的设定值转换;模式设定值可以是下列数值之一: 0 = 度 1 = 度/分/秒 2 = 分度量 3 = 弪度 4 = 土地测量单位 当选用的模式为4,则传回的字符串受系统变量UNITMODE影响 第5节 数值资料检查数值 (NUMBERP 数值参数) 例如: (NUMBERP -3.45) Result: T 例如: (NUMBERP AutoLISP) Result :nil注意: 在范例的传回值中,T表示函数的结果为真(成立),nil表示结果为假(不成立)负数值 (MINUSP 数值参数) 例如: (MINUSP -3.45) Result :T 例如: (MINUSP 0) Result: nil 例如: (MINUSP 3.45) Result :nil零值 (ZEROP 数值参数 ) 例如:(ZEROP 0) Result :T 例如:(ZEROP 3.45) Result: nil最大值 (MAX 数值参数1 数值参数2 ) 例如: (MAX -88 5 2) Result: 5若没有提供任何参数,则传回值为0最小值 (MIN 数值参数1 数值参数2 ) 例如: (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 程序文件名称 加载失败 ) 例如: (LOAD TEST) 若程序文件之文件名为LSP,则在程序文件名称之后,可以不加上扩展名;若有需要,系统会顺序尝试其它的扩展名: VLX FAS LSP ;若程序文件不在系统的支持目录下,则需在文件名前加上目录路径。注意: 必须以正斜线 / 或两个反斜线 作为目录的分隔符;可以在加载失败的参数中提供字符串,以供加载失败时显示;亦可提供有效的自定函数,该函数在加载程序文件失败时会被执行。 例如:(LOAD TEST Load Fail) 或 (LOAD TEST (DOERROR)。注意 :在程序文件加载后,在提示行显示的返回值,一般是该程序文件中,最后被定义的函数名称;或是在程序文件内没有包含在自定函数中,最后一个表达式的执行结果。第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程序说明: 使用DEFUN建立自定函数的名称,并用SETQ函数将中心点(LIST 0 0)存入变数CEN,半径(50)存入变数RAD中;使用COMMAND函数执行AutoCAD内建指令CIRCLE,并以变量CEN(圆的中心点)及变数RAD(圆的半径)回应;与第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。 例如:(= 2 2.0) Result: T 例如: (= A CHR(65) Result: T 不等于函数 (/= 参数1 参数2 ) 若参数1不等于其后任何一个参数,即传回 T 。例如: (/= 1 2.0) Result: T 例如: (/= a CHR(65) Result: T 例如: (/= 10 30 40 10 20) Result: T小于函数 ( 参数1 参数2 ) 各参数顺序以2个为一组比较,若各组左边的参数均小于右边的参数,即传回 T。 例如:( 1 2) Result: T 例如: ( 参数1 参数2 ) 各参数顺序以2个为一组比较,若各组左边的参数均大于右边的参数,即传回 T。 例如:( 1 2) Result: nil 例如:( a CHR(65) Result: nil小于或等于函数 (= 参数1 参数2 ) 各参数顺序以2个为一组比较,若各组左边的参数均小于或等于右边的参数,即传回 T。 例如:(= 1 2) Result: T 例如:(= 2 2) Result: T 例如:(= 参数1 参数2 ) 各参数顺序以2个为一组比较,若各组左边的参数均大于或等于右边的参数,即传回 T。 例如: (= 1 2) Result: nil 例如: (= 2 2) Result: T 例如:(= a CHR(65) Result: nil第5节 逻辑运算且运算 (AND 表达式 ) 若各表达式的传回值均为 T,函数即返回 T 值;若其中一个传回值为 nil,函数传回 nil。 例如: (AND ( 8 5) Result: T 或运算 (OR 表达式 ) 若各表达式的传回值均为 nil,函数即返回 nil 值;若其中一个传回值为 T,函数传回 T。 例如: (OR ( 1 2) ( 8 5) Result: T 否定运算 (NOT 表达式 ) 若表达式的传回值为 T,函数即返回 nil 值;相反若表达式传回值为 nil,函数传回 T;可用于检查传回值是否为 nil;另有一NULL函数与NOT函数功能相似。例如: (NOT ( 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程序代码如下 :(DEFUN AIR-1 (NUM) (IF ( NUM 100) (PRINC Very High) (IF (AND ( NUM 50) ( NUM 25) (= NUM 50) (PRINC Medium) (IF ( NUM 50) (PRINC (IF ( NUM 100) Very high High) (PRINC (IF ( NUM 25) Medium Low) (PRINC)程序说明:,设定函数名称,并将数据存入自变量NUM内;用IF函数判断变量NUM是否大于50;若条件成立(变量NUM大于50)时,再用另一个IF函数判断变量是否大于100;若条件成立(变量NUM大于100)时,使用PRINC函数显示字符串Very High,否则显示High;若在第1个IF函数判断中,条件不成立(变量NUM不大于50)时;再用另一个IF函数判断变量是否大于25;若条件成立(NUM大于25)时,显示字符串Medium,否则显示字符串Low;,是一个没有提供任何自变量的PRINC函数;用以抑制显示答案时尾部符加的 nil 或重复的传回值;而最右一个关括号,是用以对应第1行最左边的开括号。 注意 :第1行最后一个关括号是对应前面的PRINC函数,尾2的关括号则是对应IF函数 (判断NUM是否大于100);第2行最后一个关括号是对应第1行的IF函数 (判断NUM是否大于50),尾2的关括号则是对应PRINC函数,尾3的关括号则是对应IF函数 (判断NUM是否大于25);最右边的关括号是对应第1行最左边的开括号。PROGN 函数 在以上各范例中,执行的表达式均为单一的函数运算;若要在表达式中顺序执行一连串的函数,便要将各函数包含在一个PROGN函数内;函数的传回值会是该PROGN函数中,最后一个表达式的运算结果; 例如:(IF ( NUM 100) (PROGN (SETQ DISP Very High) (PRINC DISP)注意 :最后一个关括号是对应前面的IF函数 (判断变量NUM是否大于100);尾2的关括号是对应PROGN函数 (用以包含SETQ及PRINC函数);尾3的关括号是对应PRINC函数的。第2节 条件判断多重条件 (COND (条件表达式 是表达式) ) 函数会顺序检查各条件表达式;直到其中一个条件成立(传回 T),即执行该条件式所对应的是表达式;每个条件表达式只对应一个是表达式,而没有否表达式;若条件式成立且执行对应的是表达式后,则不会再对余下的其它条件表达式进行检查;若只有条件表达式而没有对应之是表达式,则只会传回条件表达式的逻辑值;若没有提供任何条件表达式及是表达式,函数传回值恒为 nil。练习 (Exercises) 用一个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)程序说明:,设定函数名称,并将数据存入自变量NUM内;用COND函数进行多重判断;,判断变量NUM是否大于200,若条件成立,则显示 Severe 讯息;第3至6行依此类推;,注意条件式为一个 T 字母,表示条件式恒为真(成立),显示讯息 Cannot Check作用是当以上各条件式均不成立时(变量小于或等于0),即执行此一表达式。第3节 循环 (Loop) 配合条件判断,关系及逻辑运算,令程序不断重复一些动作,以提高效率及减少重复动作时的人为错误; 可以多个循环形成巢状(嵌套式)循环,即在一个循环内嵌套另一个(或多个)循环;指定的重复次数必须为正整数,亦可以是储存正整数的变量名称。 重复指定次数 (REPEAT 重复次数 表达式 ) 例如:(REPEAT 10 (PRINC David) ;重复显示David字符串10次 重复 (WHILE 条件表达式 是表达式 ) 若条件表达式的传回值为 T,即会顺序执行函数内各表达式;各表达式顺序执行完后,程序会返回函数的开头,重新检查条件表达式的传回值;若条件表达式的传回值为 nil,函数内各表达式将不会被执行。例如:(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)程序说明:设定函数SUM并将自变量存入变量NUM,设定变量COUNT以将数目由1开始递增,变量TOTAL(储存总和)初始值为0;WHILE循环函数,并设定进入循环的条件式(变量COUNT小于或等于变量NUM);若条件成立即进入循环内部,先将变量TOTAL加上变量COUNT,再用SETQ函数存回变量TOTAL中,覆盖原值;将变量COUNT递增1,存回变数COUNT并覆盖原值;关括号与第2行的WHILE函数左边的开括号对应;循环结束后,用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 返回WHILE函数的开头,重新判断条件式变量COUNT(为2)小于NUM,进入循环;将TOTAL(现值1)加上COUNT,存回变数TOTAL:COUNT=2 TOTAL=3变数COUNT(为2)递增1变为3,存回变数COUNT;COUNT=3 TOTAL=3返回WHILE函数的开头,重新判断条件式 变量COUNT(为3)小于NUM,进入循环;将TOTAL(现值3)加上COUNT,存回变数TOTAL;COUNT=3 TOTAL=6部 份 过 程 省 略返回WHILE函数的开头,重新判断条件式变量COUNT(为10)仍等于NUM,进入循环将TOTAL(为45)加上COUNT,存回变数TOTAL;COUNT=10 TOTAL=55变数COUNT(为10)递增1变为11,存回变数COUNT;COUNT=11 TOTAL=55返回WHILE函数的开头,重新判断条件式变量COUNT(为11)巳大于NUM(本范例假设为10),条件判断不成立,循环结束;COUNT=11 TOTAL=55显示变量TOTAL的现存值,程序结束尝试用IF函数检查输入的自变量是否小于或等于0;若条件成立则不执行余下的程序(DEFUN SUM (NUM)(IF (= NIM 0) (PRINC Input Error) (PROGN 略过 WHILE 及 PRINC 函数 )(PRINC)程序说明:设定函数SUM并将自变量存入变量NUM,并用IF函数判断是否=0,若条件成立则显示错误讯息;若条件不成立,即以PROGN函数包含上例中的循环及显示答案部份; 尾3行的关括号是对应第2行的PROGN函数;尾2行的关括号是对应第1行的IF函数;最后一行最右边的关括号是对应第1行的DEFUN函数。第五篇 输入及输出函数第1节 输入函数 让AutoCAD应用程序可以提示使用者输入程序所需的数据;这些输入函数一般都是以GET开头;当程序执行至输入函数时,程序便会暂停,等待使用者输入指定类型的数据后,程序即会继续执行。亦可在函数内指定要显示的提示字符串,若不提供则没有任何提示。输入整数 (GETINT 提示字符串) 例如: (GETINT Input Number: )输入的范围从-32,768到+32,767之间;若超出范围,会有警告讯息;若输入的数据不是整数型态,如文字或是实数,会显示警告讯息;若输入空格或按下ENTER键响应,输入值为 nil。 输入实数 (GETREAL 提示字符串) 例如: (GETREAL Input Number: )若输入的数据是字符串型态,会显示警告讯息;若输入整数,则会自动转为实数;若输入空格或按下ENTER键响应,输入值为 nil。输入字符串 (GETSTRING 模式 提示字符串) 例如: (GETSTRING T Input Name: )若有提供模式参数且不是 nil 值,使用者即可在输入的字符串中包含空格;但此时必须按ENTER键结束输入;若没有提供模式参数或该参数为 nil 值,要在字符串中包含空格时,必须在字符串的前后加上双引号 ;输入时不须在字符串的前后加上双引号(上述的情况例外);若输入空格(没有模式参数或为 nil 值时)或按ENTER键响应时,输入值为,即空字符串。输入选取点 (GETPOINT 基准点 提示字符串) 例如:(GETPOINT (LIST 0 0) Select Point: )可以在屏幕以指向设备(一般是鼠标)选取,或以键盘直接输入坐标值亦可;若有提供基准点(目前UCS的2D或3D坐标),会从基准点出现伸缩线到十字光标所在位置;可接受单一整数或实数作为长度,代替基准点参数;此时会以系统变量LASTPOINT为基准点,以目前十字光标的位置与LASTPOINT的角度为方向,以长度为距离,求出新的输入点;传回值为目前UCS的三维坐标;若输入空格或按下ENTER键响应,输入值为 nil。输入角度 (GETANGLE 基准点 提示字符串) 例如: (GETANGLE (LIST 0 0) Select Point: )若有提供基准点(目前UCS的2D坐标),会从基准点出现伸缩线到十字光标所在位置;若没有提供基准点,可以在屏幕以指向设备(一般是鼠标)选取两点,以第一点作为基准点;可从键盘直接输入角度值;不论是用指向设备选取或键盘输入,均自动转为弪度传回;弪度以0弪度方向(由系统变量ANGBASE设定)算起,沿反时钟方向增加。输入角度 (GETORIENT 基准点 提示字符串 例如:(GETORIENT (LIST 0 0) Select Point: )唯一不同于GETANGLE函数的是: 以正右方为0弪度,不受 ANGDIR 及 ANGBASE 系统变量影响。输入对角点 (GETCORNER 基准点 提示字符串) 例如:(GETCORNER (LIST 0 0) Select Point: )必须提供以目前UCS为准的基准点参数;与目前十字光标位置构成伸缩的矩形;传回值为目前UCS的三维坐标;若输入空格或按下ENTER键响应,输入值为 nil;可直接从键盘输入坐标值,以代替从屏幕点选。输入距离 (GETDIST 基准点 提示字符串) 例如: (GETDIST (LIST 0 0) Select Point: )会从基准点(目前UCS的2D坐标)出现伸缩线到十字光标所在位置;若没有提供基准点,可以在屏幕以指向设备(一般是鼠标)选取两点,以第一选取点作为基准点;若提供3D的点坐标,则传回值是3D的距离;但若设定了INITGET函数第64位,则会忽略Z坐标而传回2D距离。输入关键词 (GETKWORD 提示字符串) 例如:(GETKWORD Yes or No (Y/N)有效的关键词必须在此函数使用前,先行以INITGET函数来设定;若输入一个无效的关键词时,系统会显示警告讯息并提示再次输入 ;输入关键词后,会传回输入的关键词的字符串;若按ENTER键则传回 nil。标准档案对话框 (GETFILED 标题 预设档名 预设扩展名 模式) 例如:(GETFILED Select file C:/TEST DWG 8)预设文件名可包含目录路径,若为空字符串,则会是AutoCAD启动目录的全部档案;若预设扩展名为空字符串,则显示所有类型的档案;若扩展名为DWG,会在对话框中显示预览影像;若对话框取得文件名称,函数会传回指定的文件名称及目录路径,否则传回 nil ;模式是控制对话框行为的整数值;若要一次过设定多种模式,可将其模式对应的数值累加。1 (0位) 建立新的档案;若是要开启旧档则切勿使用;若档案巳存在会显示错误讯息。4 (2位) 此位若未设定,则只会接受指定的预设扩展名,若档案不加扩展名,则自动加上预设的扩展名。8 (3位) 若设定此位且未设定0位,档案会依支持路径搜寻;若找到则只会传回文件名称,不会传回路径。若未设定此位,则会传回完整的目录路径文件名。16 (4位) 若设定此位,或是预设文件名以路径分隔元结尾,则仅显示该目录路径的档案,且文件名称输入框会变为空白。32 (5位) 若设定此位及0位,若指定的档案巳经存在则会被覆盖,且覆盖前不会有警告讯息。64 (6位) 若指定了URL,则请勿传输远程档案。128 (7位) 完全不允许使用URL。第2节设定关键词(INITGET 模式 关键词串) 例如: (INITGET

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论