cad二次开发lisp编程学习_第1页
cad二次开发lisp编程学习_第2页
cad二次开发lisp编程学习_第3页
cad二次开发lisp编程学习_第4页
cad二次开发lisp编程学习_第5页
已阅读5页,还剩114页未读 继续免费阅读

下载本文档

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

文档简介

1、 第1节 根本知识AutoLISP是一种针对扩充及自订AutoCAD函数机能而产生,以LISP为根底的程序设计语言.LISP本身于50年代末期出现,是一种擅于处理串行文字(List of Processing),属第四代人工智能(Artificial Intelligence)的计算机语言. 目的是令使用者充份利用AutoCAD进行开发,直接增加及修改AutoCAD指令. AutoLisp语言建基于普通的LISP语言上,并扩充了许多适用于CAD的特殊功能而形成. 是一种能以直译方式(不须先行编译)亦可于AutoCAD内部执行的直译性程序语言. 程序容易学习及撰写,程序即使出错亦不会对操作系统(

2、如DOS,WINDOWS)有不良影响. 数据及程序均统一以串行 (List)结构表示. 可直接调用几乎全部的AutoCAD命令. 既具备一般高级语言的根本结构和功能,亦有一般高级语言没有的强大图形处理能力. 内建于AutoCAD应用程序,不须另行购置;亦不须使用特定的编辑器或开发环境. 可配合AutoCAD提供的PDB,建立DCL(Dialog Control Language)文件创立对话框. 缺点 : 执行速度较ObjectArx(旧称ARX,以C或C+程序开发,取代以前的ADS)程序慢;原程序不易保护;对低阶的硬件数据不易存取.第2节 函数 (Function)在AutoLISP程序语言

3、中所有的成份都是以函数的形式出现,AutoLISP程序就是顺序执行连串的函数.函数的运行过程就是对函数的求值(结果)过程;函数的根本语法如下: (函数名称 参数1 参数2) e.g. (PRINC AutoLISP Programming) 每一个完整的函数必须包在一对小括号( )内,左边为开括号,右边为关括号;如有假设干数量的开括号,那么一定有同等数量的关括号对应. 左边开括号后紧随函数名称. 函数名称与参数之间,或参数与参数之间须最少留一个空格. 函数可有一个或多个参数(也可能没有参数),视该函数而定. 函数名称不分大小写,即大小写字母视为相同. 第3节 数据型态 (Data Type)整

4、数 (INT)没有小数字的数值,32位有号数,范围从+2,147,483,647到-2,147,483,648实数 (REAL)带小数字的数值,以倍精度浮点格式储存(最少14位小数 当数值在1与-1之间时,必须加上前导零 可以科学记号表示 : 在E或e后加上次方值 字符串 (STR)一般文字,其前后必须加上双引号 e.g. AutoCAD 控制字符或脱逸码必须为小写,且须在字符前加上反斜线 e.g. AutoCAD 像素名称 (ENAME)是指定给图文件内对象的指针(Pointer,为16进位的数字卷标) e.g. 像素名称在图文件内是唯一的,不会重复对象的像素名称只在目前作业中有效,再开启图

5、档时,会指定新的像素名称予该对象档案 (FILE)以OPEN函数所开启档案的指针,作为其它函数(读写该档案)的自变量选集 (PICKSET)用SSGET等函数建立的一个或多个对象的集合或群组转化 (VARIANT)可将像素名称转换为可与ActiveX配搭使用的VLA-Object对象符号 (SYM) 用以储存静态数据的名称;例如内建或使用者定义的函数 符号名称不分大小写,可由任意长度的可打印字符组成;但以下的字符除外: 左括号 ( 右括号 ) 句点 . 单引号 双引号 分号 ; 表 (LIST) 亦称为串行,是放在一对小括号 ( ) 内,一个或多个元素的有序集合 e.g. (1.0 Lisp

6、( ) (5.6 7) 元素可以是字符串,符号,整数或实数;也可以是另一个表 元素与元素之间要用空格隔开,但元素与小括号之间那么可以不隔空格 为便于存取表内各元素,每个元素均有其序号;从表的左边开始,第一个元素序号为0,依此类推 表的大小即为其顶层元素的数量(内层嵌套式的表,视为单一元素) 点对(Dotted Pair)亦是表的一种;表内有2个元素,中间以一圆点分隔,且元素与圆点之间亦须以空格分开 假设表内没有任何元素,称为空串行或空表;以 ( ) 或 (NIL) 表示第4节 变数 (Variable)为程序执行中动态储存数据的符号名称;主要分为2类:区域(Local)变量 又称为局部变量;该

7、变量只在该程序段落中有效,不能为其它程序使用全域(Global)变量 又称为整体变量;变量在所有程序段落中均可使用 变量名称与符号的限制相同,使用时宜采用有意义及易于区分的名称 变量在赋值或使用前无须先行设定 相同的变量可以储存不同型态的数据(但同一时间内只可储存一种型态) 在指定新的数据之前,变量储存的内容会保持不变 赋值 将数据给予指定的变量储存 以内建函数SETQ进行(可用于绘图模式的指令行或AutoLISP程序),其语法如下: (SETQ 变量名称1 资料1 变量名称2 资料2 ) e.g. (SETQ NAME David AGE 37 WEIGHT 72.5 POINT (LIST

8、 10 20) 在函数名称之后,各参数以两个一组,每组左边为变量名称,右边为存入变量的数据 亦可将变量名称赋以空值(NIL) : e.g. (SETQ OCCUPATION NIL) 要显示变量所储存的数据,可以使用内建函数PRINC(可用于绘图模式的指令行或AutoLISP程序),其语法如下 : (PRINC 变量名称 ) e.g. COMMAND : (PRINC NAME) Result : DavidDavid 在绘图模式中,亦可于指令行中使用感慨号 ! 来显示变量内容,或作为指令选项的输入值;语法如下 : !变量名称 e.g. COMMAND : !NAME Result : Dav

9、id 在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 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 : CIRC

11、LE ;执行划圆指令 Specify center : !CEN ;在提示后以变量CEN响应输入 Specify radius : !RAD ;在提示后以变量RAD响应输入 将不同型态的数据,分屡次存入相同的变数内;每次均以PRINC及TYPE函数显示变量内容及其数据型态 COMMAND : (SETQ TEMP 1.2) ;将实数存入变数TEMP COMMAND : !TEMP Result : 1.2 COMMAND : (TYPE TEMP) Result : REAL COMMAND : (SETQ TEMP AutoLISP) ;将字符串存入变量TEMP COMMAND : !TEM

12、P 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 结果为第一个(最左边)参数减去其右边各参数的总和 假设

13、只提供一个参数,返回值为0减去该参数的结果 假设没有提供任何参数那么传回0;各参数须为整数或实数型态 假设所有参数均为整数,结果亦为整数;假设其中一个参数为实数型态,结果会转换为实数 乘函数 (* 数值参数1 数值参数2 ) e.g. (* 2 3 4) Result : 24 结果为所有参数的乘积 假设只提供一个参数,那么返回值为该参数乘以1的结果 假设没有提供任何参数那么传回0;各参数须为整数或实数型态 假设所有参数均为整数,结果亦为整数;假设其中一个参数为实数型态,结果会转换为实数 除函数 (/ 数值参数1 数值参数2 ) e.g. (/ 24 2 3) Result : 4 结果为第一

14、个(最左边)参数除以其右边各参数的乘积 假设仅提供一个参数,那么返回值为该参数除以1的结果 假设没有提供任何参数那么传回0;各参数须为整数或实数型态 假设所有参数均为整数,结果亦为整数;假设其中一个参数为实数型态,结果会转换为实数 注意 : 在本篇教程中,各函数的数值参数,均可以变量(储存值只可以是整数或实数,且不可以是空值 nil)取代第2节 练习 (Exercises)计算式 (2+4)*3 COMMAND : (* 3 (+ 2 4) Result : 18 计算式 (50-8*5)/4 COMMAND : (/ (- 50 (* 8 5) 4) Result : 2 注意 : 上式的正

15、确答案应是2.5,因为函数中的各参数均为整数,所以传回的结果亦为整数递增及递减递增 (1+ 数值参数 ) e.g. (1+ 2) Result : 3 递减 (1- 数值参数 ) e.g. (1- 4) Result : 3 三角函数 (Trinagular Function)正弦值 (SIN 弧度参数) e.g. (SIN 1) Result : 0.841471 余弦值 (COS 弧度参数) e.g. (COS 1) Result : 0.540302 反正切值 (ATAN 弧度参数) e.g. (ATAN 1) Result : 0.785398 第3节 其它数值处理次方值 (EXPT

16、数值参数 次方值 ) 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个时,那么会将余数再整除下一个参数,再得出余数;依此类推 假设其中一

17、个参数为实数时,那么结果为实数;否那么为整数 最大公约数 (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 只会截去小数部份(小

18、数字不会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 = 英呎及分数

19、位英吋 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,那么传回的字符串受系统变量

20、UNITMODE影响 反函数为ANGTOF;参阅第5篇教程 第5节 数值资料检查数值 (NUMBERP 数值参数 ) e.g. (NUMBERP -3.45) Result : T e.g. (NUMBERP AutoLISP) Result : nil 注意 : 在范例的传回值中,T表示函数的结果为真(成立),nil表示结果为假(不成立)负数值 (MINUSP 数值参数 ) e.g. (MINUSP -3.45) Result : T e.g. (MINUSP 0) Result : nil e.g. (MINUSP 3.45) Result : nil 零值 (ZEROP 数值参数 ) e

21、.g. (ZEROP 0) Result : T e.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 上式中两个数值参数均为整数,而结果值大于整数

22、型态所能容许之范围;固导致发生溢位问题,产生无效的结果.修正算式如下 : 只要将其中一个参数改为实数型态即可.(+ 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 1

23、0 40 30) ,求出最大值为40 其次执行加函数,将MAX函数所得的最大值加1,结果为41 再利函数SQRT,将41开方根,结果为 最后使用FIX函数,截去其小数字,得到最后的结果为6第1节 使用者定义函数 是将一群表示式组合成一个函数或指令 可应用于绘图模式的指令行提示,Visual LISP主控台,或供其它自定义函数内的表示式呼叫使用 AutoLISP原始程序代码均以纯文字格式存盘,扩展名为LSP(2000版可编译成扩展名为FAS的档案 可以一般文字编辑器进行开发,如DOS的EDIT,WINDOWS的WORD或WORDPAD等 一个自定函数内最少要有一个表达式 在原程序文件(LSP)里

24、,自定义函数以DEFUN函数开始;其语法如下 : (DEFUN C: 函数名称 ( 自变量串行 . / 局部变数串行 . ) 表达式 .) 在呼叫带有自变量的自定函数时,必须同时提供与定义函数时,同等数量的参数,使各参数传入自定函数的各自变量中 自变量被视为一种特殊类型的局部变量,无法用于该自定函数以外的其它函数 假设自定函数中无须设定任何自变量,亦必须以空串行 ( )加在函数名称之后 假设有提供局部变量,必须以斜线 / 加在局部变量的开头(即使前面没有自变量串行) 各自变量,斜线,局部变量之间要以空格分隔;但与左右小括号之间那么不须以空格分开 假设自变量串行中有相同名称的自变量出现,那么会忽

25、略第一个以后的相同自变量;变数亦是一样 假设在函数名称前加上C:,表示该函数可以在绘图模式的指令行提示下,其执行方式与内建函数相同;亦可以在任何内建命令(执行中)的提示后,以通透方式执行(但须将函数名称包在一对小括号中) 假设在函数名称前没有加上C:,在指令行提示下,必须将函数名称包在一对小括号中才可执行 不可以在执行一自定函数时,以通透方式执行另一自定函数 第2节 加载程序 自定函数在使用前,都要将其所在的程序文件(扩展名为LSP)加载才可执行 程序文件(预设在SUPPORT子目录内)会在启动AutoCAD时自动加载 (LOAD 程序文件名称 加载失败 ) e.g. (LOAD TEST)

26、假设程序文件之文件名为LSP,那么在程序文件名称之后,可以不加上扩展名 假设有需要,系统会顺序尝试其它的扩展名 : VLX FAS LSP 假设程序文件不在系统的支持目录下,那么需在文件名前加上目录路径注意 : 必须以正斜线 / 或两个反斜线 作为目录的分隔符 可以在加载失败的参数中提供字符串,以供加载失败时显示;亦可提供有效的自定函数,该函数在加载程序文件失败时会被执行 e.g. (LOAD TEST Load Fail) 或 (LOAD TEST (DOERROR)注意 : 在程序文件加载后,在提示行显示的返回值,一般是该程序文件中,最后被定义的函数名称 或是在程序文件内没有包含在自定函数

27、中,最后一个表达式的执行结果 第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) 在指令行提示后,输入程序(函数

28、)名称执行 COMMAND : 2CIRCLE 程序说明1 使用DEFUN建立自定函数的名称,并用SETQ函数将中心点(LIST 0 0)存入变数CEN,半径(50)存入变数RAD中 2 使用COMMAND函数执行AutoCAD内建指令CIRCLE,并以变量CEN(圆的中心点)及变数RAD(圆的半径)回应 3 与第2行大致相同,但在指定其半径时,先将储存半径的变量加30,使划出半径为80的圆;注意最右边的关括号,与第1行DEFUN左边的开括号是一对的 启动文字编辑器,开启程序文件,复制2CIRCLE至新程序2C,并改为传入自变量方式执行;程序代码如下 : (DEFUN 2C (CEN RAD)

29、 (COMMAND CIRCLE CEN RAD) (COMMAND CIRCLE CEN (+ RAD 30) 输入后以纯文字格式存盘 在AutoCAD绘图模式的指令行提示后,用LOAD函数将程序文件重新加载 在指令行提示后,输入程序(函数)名称执行 COMMAND : (2C (LIST 0 0) 50) 第4节 批注单行批注 分号 ;表示在分号右边(同一行)的字符均为批注,程序执行时会将其忽略多行批注 ;| |;表示在两个批注符号中间所有字符皆为批注,即使字符跨越多行关系运算 在各个关系运算中,都会传回一逻辑值;假设关系成立,传回 T,否那么会传回 nil 各参数可以是字符串,整数或实数

30、型态;假设以字符串进行比拟,那么会以字符串的ASCII码为准 假设函数中只有一个参数,传回值恒为 T 等于函数 (= 参数1 参数2 )会将参数1与其后各个参数比拟,假设全部相等那么传回 T,否那么传回 nil e.g. (= 2 2.0) Result : T e.g. (= A CHR(65) Result : T 不等于函数 (/= 参数1 参数2 )假设参数1不等于其后任何一个参数,即传回 T e.g. (/= 1 2.0) Result : T e.g. (/= a CHR(65) Result : T e.g. (/= 10 30 40 10 20) Result : T 小于函数

31、 ( 参数1 参数2 ) 各参数顺序以2个为一组比拟,假设各组左边的参数均小于右边的参数,即传回 T e.g. ( 1 2) Result : T e.g. ( 参数1 参数2 ) 各参数顺序以2个为一组比拟,假设各组左边的参数均大于右边的参数,即传回 T e.g. ( 1 2) Result : nil e.g. ( a CHR(65) Result : nil 小于或等于函数 (= 参数1 参数2 ) 各参数顺序以2个为一组比拟,假设各组左边的参数均小于或等于右边的参数,即传回 T e.g. (= 1 2) Result : T e.g. (= 2 2) Result : T e.g. (

32、= 参数1 参数2 ) 各参数顺序以2个为一组比拟,假设各组左边的参数均大于或等于右边的参数,即传回 T e.g. (= 1 2) Result : nil e.g. (= 2 2) Result : T e.g. (= a CHR(65) Result : nil 第5节 逻辑运算且运算 (AND 表达式 ) 假设各表达式的传回值均为 T,函数即返回 T 值;假设其中一个传回值为 nil,函数传回 nil e.g. (AND ( 8 5) Result : T 或运算 (OR 表达式 ) 假设各表达式的传回值均为 nil,函数即返回 nil 值;假设其中一个传回值为 T,函数传回 T e.g

33、. (OR ( 1 2) ( 8 5) Result : T 否认运算 (NOT 表达式 ) 假设表达式的传回值为 T,函数即返回 nil 值;相反假设表达式传回值为 nil,函数传回 T 可用于检查传回值是否为 nil 另有一NULL函数与NOT函数功能相似 e.g. (NOT ( NUM 200) 输入后存盘(纯文字格式) 在AutoCAD绘图模式的指令行提示符号后,使用LOAD函数重新加载程序文件 COMMAND : (LOAD C:/TEST) 在AutoCAD绘图模式的指令行提示符号后,输入自定函数名称及参数执行 COMMAND : (AIR 175) Result : nil CO

34、MMAND : (AIR 215) Result : T 第1节 条件判断是利用条件函数,配合关系及逻辑运算所设定的一些准那么,令程序自行分析,因应情况作出适当行动.单一条件 (IF 条件表达式 是表达式 否表达式 ) 函数先检查条件表达式,假设其传回值为 T,便会执行其后的是表达式 假设有提供否表达式,且条件表达式的传回值为 nil,函数将不会执行(跳过)是表达式而执行否表达式 假设没有提供否表达式,且条件表达式的传回值为 nil时,函数将不作任何事情 IF函数可以巢状方式嵌套,即在是或否的表达式中参加另一个IF函数 练习 (Exercises) 判断空气污染指数 : 大于100 = Ver

35、y High, 51至100 = High, 26至50 = Medium, 25或以下 = Low 启动编辑器,开启程序文件;新增AIR-1自定函数,程序代码如下 : (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) 程序说明1 设定函数名称,并将

36、数据存入自变量NUM内;用IF函数判断变量NUM是否大于50;假设条件成立(变量NUM大于50)时,再用另一个IF函数判断变量是否大于100;假设条件成立(变量NUM大于100)时,使用PRINC函数显示字符串Very High,否那么显示High 2 假设在第1个IF函数判断中,条件不成立(变量NUM不大于50)时;再用另一个IF函数判断变量是否大于25;假设条件成立(NUM大于25)时,显示字符串Medium,否那么显示字符串Low 3 是一个没有提供任何自变量的PRINC函数;用以抑制显示答案时尾部符加的 nil 或重复的传回值;而最右一个关括号,是用以对应第1行最左边的开括号 注意 :

37、 第1行最后一个关括号是对应前面的PRINC函数,尾2的关括号那么是对应IF函数 (判断NUM是否大于100) 第2行最后一个关括号是对应第1行的IF函数 (判断NUM是否大于50),尾2的关括号那么是对应PRINC函数,尾3的关括号那么是对应IF函数 (判断NUM是否大于25) 最右边的关括号是对应第1行最左边的开括号 PROGN 函数 在以上各范例中,执行的表达式均为单一的函数运算;假设要在表达式中顺序执行一连串的函数,便要将各函数包含在一个PROGN函数内;函数的传回值会是该PROGN函数中,最后一个表达式的运算结果 修改程序文件的AIR-1程序,第1个IF函数如下,其余的IF函数请自行

38、修改 e.g. (IF ( NUM 100) (PROGN (SETQ DISP Very High) (PRINC DISP)注意 : 最后一个关括号是对应前面的IF函数 (判断变量NUM是否大于100) 尾2的关括号是对应PROGN函数 (用以包含SETQ及PRINC函数) 尾3的关括号是对应PRINC函数的 第2节 条件判断多重条件 (COND (条件表达式 是表达式) ) 函数会顺序检查各条件表达式;直到其中一个条件成立(传回 T),即执行该条件式所对应的是表达式 每个条件表达式只对应一个是表达式,而没有否表达式 假设条件式成立且执行对应的是表达式后,那么不会再对余下的其它条件表达式进

39、行检查 假设只有条件表达式而没有对应之是表达式,那么只会传回条件表达式的逻辑值 假设没有提供任何条件表达式及是表达式,函数传回值恒为 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)

40、 (PRINC) 程序说明1 设定函数名称,并将数据存入自变量NUM内;用COND函数进行多重判断 2 判断变量NUM是否大于200,假设条件成立,那么显示 Severe 讯息;第3至6行依此类推 7 注意条件式为一个 T 字母,表示条件式恒为真(成立),显示讯息 Cannot Check作用是当以上各条件式均不成立时(变量小于或等于0),即执行此一表达式 第3节 循环 (Loop) 配合条件判断,关系及逻辑运算,令程序不断重复一些动作,以提高效率及减少重复动作时的人为错误 可以多个循环形成巢状(嵌套式)循环,即在一个循环内嵌套另一个(或多个)循环 指定的重复次数必须为正整数,亦可以是储存正整

41、数的变量名称 重复指定次数 (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) ;假设条件成立那么以

42、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的总和 (DE

43、FUN 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 2 WHILE循环函数,并设定进入循环的条件式(变量COUNT小于或等于变量NUM) 3 假设条件成立即进入循环内部,先将变量TOTAL加上变量COUNT,再用SETQ函数存回变量TOTAL中,覆盖原值 4 将变量C

44、OUNT递增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 返回WHILE

45、函数的开头,重新判断条件式 变量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)加上

46、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 略 过 WH

47、ILE 及 PRINC 函数 ) ) (PRINC) 程序说明1 设定函数SUM并将自变量存入变量NUM,并用IF函数判断是否=0,假设条件成立那么显示错误讯息 2 假设条件不成立,即以PROGN函数包含上例中的循环及显示答案部份 3 尾3行的关括号是对应第2行的PROGN函数 4 尾2行的关括号是对应第1行的IF函数 5 最后一行最右边的关括号是对应第1行的DEFUN函数 第1节 输入函数 让AutoCAD应用程序可以提示使用者输入程序所需的数据;这些输入函数一般都是以GET开头;当程序执行至输入函数时,程序便会暂停,等待使用者输入指定类型的数据后,程序即会继续执行.亦可在函数内指定要显示的

48、提示字符串,假设不提供那么没有任何提示.输入整数 (GETINT 提示字符串 ) e.g. (GETINT Input Number : ) 输入的范围从-32,768到+32,767之间;假设超出范围,会有警告讯息 假设输入的数据不是整数型态,如文字或是实数,会显示警告讯息 假设输入空格或按下ENTER键响应,输入值为 nil 输入实数 (GETREAL 提示字符串 ) e.g. (GETREAL Input Number : ) 假设输入的数据是字符串型态,会显示警告讯息;假设输入整数,那么会自动转为实数 假设输入空格或按下ENTER键响应,输入值为 nil 输入字符串 (GETSTRIN

49、G 模式 提示字符串 ) e.g. (GETSTRING T Input Name : ) 假设有提供模式参数且不是 nil 值,使用者即可在输入的字符串中包含空格;但此时必须按ENTER键结束输入 假设没有提供模式参数或该参数为 nil 值,要在字符串中包含空格时,必须在字符串的前后加上双引号 输入时不须在字符串的前后加上双引号(上述的情况例外) 假设输入空格(没有模式参数或为 nil 值时)或按ENTER键响应时,输入值为,即空字符串 输入选取点 (GETPOINT 基准点 提示字符串 ) e.g. (GETPOINT (LIST 0 0) Select Point : ) 可以在屏幕以指

50、向设备(一般是鼠标)选取,或以键盘直接输入坐标值亦可 假设有提供基准点(目前UCS的2D或3D坐标),会从基准点出现伸缩线到十字光标所在位置 可接受单一整数或实数作为长度,代替基准点参数;此时会以系统变量LASTPOINT为基准点,以目前十字光标的位置与LASTPOINT的角度为方向,以长度为距离,求出新的输入点 传回值为目前UCS的三维坐标;假设输入空格或按下ENTER键响应,输入值为 nil输入角度 (GETANGLE 基准点 提示字符串 ) e.g. (GETANGLE (LIST 0 0) Select Point : ) 假设有提供基准点(目前UCS的2D坐标),会从基准点出现伸缩线

51、到十字光标所在位置 假设没有提供基准点,可以在屏幕以指向设备(一般是鼠标)选取两点,以第一点作为基准点 可从键盘直接输入角度值;不管是用指向设备选取或键盘输入,均自动转为弪度传回 弪度以0弪度方向(由系统变量ANGBASE设定)算起,沿反时钟方向增加 输入角度 (GETORIENT 基准点 提示字符串 ) e.g. (GETORIENT (LIST 0 0) Select Point : ) 唯一不同于GETANGLE函数的是 : 以正右方为0弪度,不受 ANGDIR 及 ANGBASE 系统变量影响 输入对角点 (GETCORNER 基准点 提示字符串 ) e.g. (GETCORNER (

52、LIST 0 0) Select Point : ) 必须提供以目前UCS为准的基准点参数;与目前十字光标位置构成伸缩的矩形 传回值为目前UCS的三维坐标;假设输入空格或按下ENTER键响应,输入值为 nil 可直接从键盘输入坐标值,以代替从屏幕点选 输入距离 (GETDIST 基准点 提示字符串 ) e.g. (GETDIST (LIST 0 0) Select Point : ) 会从基准点(目前UCS的2D坐标)出现伸缩线到十字光标所在位置 假设没有提供基准点,可以在屏幕以指向设备(一般是鼠标)选取两点,以第一选取点作为基准点 假设提供3D的点坐标,那么传回值是3D的距离;但假设设定了I

53、NITGET函数第64位,那么会忽略Z坐标而传回2D距离输入关键词 (GETKWORD 提示字符串 ) e.g. (GETKWORD Yes or No (Y/N) 有效的关键词必须在此函数使用前,先行以INITGET函数来设定 假设输入一个无效的关键词时,系统会显示警告讯息并提示再次输入 输入关键词后,会传回输入的关键词的字符串;假设按ENTER键那么传回 nil 标准档案对话框 (GETFILED 标题 预设档名 预设扩展名 模式) e.g. (GETFILED Select file C:/TEST DWG 8) 预设文件名可包含目录路径,假设为空字符串,那么会是AutoCAD启动目录的

54、全部档案 假设预设扩展名为空字符串,那么显示所有类型的档案;假设扩展名为DWG,会在对话框中显示预览影像 假设对话框取得文件名称,函数会传回指定的文件名称及目录路径,否那么传回 nil 模式是控制对话框行为的整数值;假设要一次过设定多种模式,可将其模式对应的数值累加 1 (0位) 建立新的档案;假设是要开启旧档那么切勿使用;假设档案巳存在会显示错误讯息 4 (2位) 此位假设未设定,那么只会接受指定的预设扩展名,假设档案不加扩展名,那么自动加上预设的扩展名 8 (3位) 假设设定此位且未设定0位,档案会依支持路径搜寻;假设找到那么只会传回文件名称,不会传回路径.假设未设定此位,那么会传回完整的

55、目录路径文件名 16 (4位) 假设设定此位,或是预设文件名以路径分隔元结尾,那么仅显示该目录路径的档案,且文件名称输入框会变为空白 32 (5位) 假设设定此位及0位,假设指定的档案巳经存在那么会被覆盖,且覆盖前不会有警告讯息 64 (6位) 假设指定了URL,那么请勿传输远程档案 128 (7位) 完全不允许使用URL 第2节 设定关键词 (INITGET 模式 关键词串 ) e.g. (INITGET 7 Yes No) 假设使用者的输入符合某个关键词,那么会传回整个关键词串;否那么会显示提示重试 每个关键词仅可以含有字母,数字及连字符号 (-);有以下两种方式缩写关键词 : 关键词的必

56、要部份用大写,其余用小写 e.g. Yes No 整个关键词全部为大写,以逗号分隔,再重复简写的部份 e.g. YES,Y NO,N 假设关键词全部为小写或大写,且没有逗号及缩写部份,那么使用者必须输入整个关键词才能辨析 每个关键词之间必须以空格分开 本函数适用于除GETSTRING以外的其它输入函数(但各函数可设定的模式略有不同) 模式的作用为控制使用者的输入,为整数值;假设要一次过设定多个模式,可将该模式对应的数值累加 1 (0位) 不接受使用者按下ENTER键作为响应 2 (1位) 不接受使用者输入0作为响应 4 (2位) 不接受使用者输入负数作为响应 8 (3位) 允许输入超出图面范围

57、以外的坐标点(即使目前系统数数LIMCHECK设定为ON) 16 (4位) 目前并未使用 32 (5位) 使用虚线绘制伸缩线或方框;但如果POPUPS系统变量设定为0,那么会忽略此位的设定 64 (6位) 假设设定此位,那么各输入函数只传回2D的坐标;否那么会传回3D的坐标 128 (7位) 允许任意的输入;这位优先于0位的设定值;假设输入时按ENTER响应,那么会传回空字符串 第3节 输出函数显示或写入档案 (PRIN1 字符串 / 表达式 档案指标 ) e.g. (PRIN1 David) 所有包含在字符串中的控制字符会当为普通字符显示 假设没有提供字符串或表达式,那么函数将不作任何事情

58、结果会在屏幕显示两次,第一次为函数功能所显示的,第二次为系统的传回值 档案指针必须是以OPEN函数,开启档案后传回的指标;假设没有提供,所有传回值均显示在屏幕上;假设有提供,字符串将写入该档案内 e.g. (PRIN1 David FILE_ID)显示或写入档案 (PRINC 字符串 / 表达式 档案指标 ) e.g. (PRINC David) 所有包含在字符串中的控制字符会正常运作 其它与PRIN1函数相同 显示 (PROMPT 字符串参数 ) e.g. (PROMPT David) 在双屏幕规划中,可将字符串显示在两个屏幕上 字符串显示后,传回值恒为 nil 显示 (ALERT 字符串参

59、数 ) e.g. (ALERT David) 字符串参数会显示在对话框中 可配合换行控制字符 显示多行文字 在对话框中,可显示的列数量及每列可显示的字符数量,受平台设备,窗口大小及解像度影响 第4节 练习 (Exercises) 在程序文件中,新增程序2C-1,以修改第三篇课程的2C程序 : 在新增的程序中,使用输入函数取得使用者输入,取代在呼叫旧程序时同时传入自变量的做法 (DEFUN C:2C-1 ( ) (SETQ CEN (GETPOINT Select center point : ) (COMMAND CIRCLE CEN (GETDIST CEN Input radius : )

60、 (PRINC) 程序说明1 设定函数2C-1,并用GETPOINT函数取得使用者选取的坐标点(圆心)再用SETQ函数将坐标存入变量CEN中 2 用COMMAND函数执行CIRCLE指令,随即以变量CEN响应以设定圆心点位置,再使用GETDIST函数,取得使用者输入的长度作为半径响应CIRCLE指令 在程序文件中,新增程序RECT,以对角的两点建立矩形(聚合线),再询问是否在矩形中加上对角线,最后将图形以输入的角度旋转.在程序中要等别注意如何将坐标分解及重组(第3,4行的程序代码) (DEFUN C:RECT ( ) (SETQ PT_START (GETPOINT Select first

温馨提示

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

评论

0/150

提交评论