在AutoLISP程序语言中所有的成份都是以函数的形式出现,AutoLISP程序就是顺序执行连串的函数.函数的运行过程就是对函数的求值(结果)过程;函数的基本语法如下:
(函数名称 参数1 参数2....)
e.g. (PRINC \"AutoLISP Programming\")
每一个完整的函数必须包在一对小括号( )内,左边为开括号,右边为关括号;
如有若干数量的开括号,则一定有同等数量的关括号对应. 左边开括号后紧随函数名称.
函数名称与参数之间,或参数与参数之间须最少留一个空格.
函数可有一个或多个参数(也可能没有参数),视该函数而定.
函数名称不分大小写,即大小写字母视为相同.
数据型态 (Data Type) 整数 (INT)
没有小数字的数值,32位有号数,范围从+2,147,483,647到-2,147,483,648
实数 (REAL)
带小数字的数值,以倍精度浮点格式储存(最少14位小
e.g. 12.5
数)
当数值在1与-1之间时,必须加上前导零 e.g. 0.05 可以科学记号表示 : 在E或e后加上次方值 e.g. 4.1e-6
字符串 (STR)
一般文字,其前后必须加上双引号 \" e.g. \"AutoCAD\" 控制字符或脱逸码必须为小写,且须在字符前加上反斜
e.g. \"\\AutoCAD\"
杠 \\
像素名称 (ENAME)
是指定给图文件内对象的指针(Pointer,为16进位的数字卷标) e.g. 像素名称在图文件内是唯一的,不会重复 对象的像素名称只在目前作业中有效,再开启图档时,会指定新的像素名称予该对象 档案 (FILE) 以OPEN函数所开启档案的指针,作为其它函数(读写该档案)的自变量 数据型态 (Data Type) 选集 (PICKSET) 用SSGET等函数建立的一个或多个对象的集合或群组 转化 (VARIANT) 可将像素名称转换为可与ActiveX配搭使用的VLA-Object对象 符号 (SYM) 用以储存静态数据的名称;例如内建或用户定义的函数 符号名称不分大小写,可由任意长度的可打印字符组成;但下列的字符除外: 左括号 ( 右括号 ) 句点 . 单引号 ' 双引号 \" 分 号 ; 表 (LIST) 亦称为串行,是放在一对小括号 ( ) 内,一个或多个元素的有序集合 e.g. (1.0 \"Lisp\" ( ) (5.6 7)) 元素可以是字符串,符号,整数或实数;也可以是另一个表 元素与元素之间要用空格隔开,但元素与小括号之间则可以不隔空格 为便于存取表内各元素,每个元素均有其序号;从表的左边开始,第一个元素 序号为0,依此类推 表的大小即为其顶层元素的数量(内层嵌套式的表,视为单一元素) 点对(Dotted Pair)亦是表的一种;表内有2个元素,中间以一圆点分隔,且元 素与圆点之间亦须以空格分开 若表内没有任何元素,称为空串行或空表;以 ( ) 或 (NIL) 表示 变数 (Variable) 为程序执行中动态储存数据的符号名称;主要分为2类: 区域(Local)变量 又称为局部变量;该变量只在该程序段落中有效,不能为其它程序使用 全局(Global)变量 又称为整体变量;变量在所有程序段落中均可使用 变量名称与符号的限制相同,使用时宜采用有意义及易于辨别的名称 变量在赋值或使用前无须先行设定 相同的变量可以储存不同型态的数据(但同一时间内只可储存一种型态) 在指定新的数据之前,变量储存的内容会保持不变 赋值 将数据给予指定的变量储存 以内建函数SETQ进行(可用于绘图模式的指令行或AutoLISP程序),其语法 如下: (SETQ 变量名称1 资料1 [变量名称2 资料2 ....] ) e.g. (SETQ NAME \"David\" AGE 37 WEIGHT 72.5 POINT (LIST 10 20)) 在函数名称之后,各参数以两个一组,每组左边为变量名称,右边为存入变量 的数据 亦可将变量名称赋以空值(NIL) : e.g. (SETQ OCCUPATION NIL) 要显示变量所储存的数据,可以使用内建函数PRINC(可用于绘图模式的指令 行或AutoLISP程序),其语法如下 : (PRINC 变量名称 ) e.g. COMMAND : (PRINC NAME) Result : David\"David\" 在绘图模式中,亦可于指令行中使用感叹号 ! 来显示变量内容,或作为指令 选项的输入值;语法如下 : !变量名称 e.g. COMMAND : !NAME Result : \"David\" 在Visual LISP的控制台窗口中,于提示符号 _$ 后键入要显示的变量名称 _$变量名称 e.g. _$NAME 要检查变量所储存的数据型态,可使用内建函数TYPE;语法如下: (TYPE 变量名称) e.g. COMMAND : (TYPE NAME) 若检查的变量没有储存数据,则会传回NIL Result : STR 练习 (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 ;自动联机至起点以关闭四边形 画圆 : 将圆心坐标及半径长度分别存入两个变量中(变量名称及数据型态 自定义) ;将圆心点设为坐标0,0;半径为 COMMAND : (SETQ CEN (LIST 0 0) RAD 20) 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 数值参数2 ....] ) e.g. (+ 2.5 4 6) Result : 12.5 函数的结果为各参数之总和 若仅提供一个参数,则以0加上此参数的结果为返回值 若没有提供任何参数则传回0;各参数须为整数或实数型态 若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转 换为实数 减函数 (- [数值参数1 数值参数2 ....] ) e.g. (- 10 2 3) Result : 5 结果为第一个(最左边)参数减去其右边各参数的总和 若只提供一个参数,返回值为0减去该参数的结果 若没有提供任何参数则传回0;各参数须为整数或实数型态 若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转 换为实数 乘函数 (* [数值参数1 数值参数2 ....] ) e.g. (* 2 3 4) Result : 24 结果为所有参数的乘积 若只提供一个参数,则返回值为该参数乘以1的结果 若没有提供任何参数则传回0;各参数须为整数或实数型态 若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转 换为实数 除函数 (/ [数值参数1 数值参数2 ....] ) e.g. (/ 24 2 3) Result : 4 结果为第一个(最左边)参数除以其右边各参数的乘积 若仅提供一个参数,则返回值为该参数除以1的结果 若没有提供任何参数则传回0;各参数须为整数或实数型态 若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转 换为实数 注意 : 在本篇教程中,各函数的数值参数,均可以变量(储存值只可以是整数或实数,且不可以是空值 nil)取代. 练习 (Exercises) 计算式 (2+4)*3 COMMAND : (* 3 (+ 2 4)) 计算式 (50-8*5)/4 COMMAND : (/ (- 50 (* 8 5)) 4) Result : 2 注意 : 上式的正确答案应是2.5,因为函数中的各参数均为整数,所以传回的结果亦为整数 递增及递减 Result : 18 递增 (1+ 数值参数 ) e.g. (1+ 2) 递减 (1- 数值参数 ) e.g. (1- 4) 三角函数 (Trinagular Function) 正弦值 (SIN 弧度参数) e.g. (SIN 1) 余弦值 (COS 弧度参数) e.g. (COS 1) 反正切值 (ATAN 弧度参数) e.g. (ATAN 1) Result : 3 Result : 3 Result : 0.841471 Result : 0.540302 Result : 0.785398 其它数值处理 次方值 (EXPT 数值参数 次方值 ) e.g. (EXPT 2 4) Result : 16 若参数及次方值两个均为整数,返回值亦是整数;若其中一个为实数,结果为 实数 开方根 (SQRT 数值参数 ) e.g. (SQRT 30) Result : 5.47723 绝对值 (ABS 数值参数 ) e.g. (ABS -123) Result : 123 余数 (REM [数值参数1 数值参数2 ....] ) e.g. (REM 50 26 5) = (REM (REM 50 26) 5) Result : 4 将参数1整除参数2的余数 若参数多于2个时,则会将余数再整除下一个参数,再得出余数;依此类推 若其中一个参数为实数时,则结果为实数;否则为整数 最大公约数 (GCD 数值参数1 数值参数2 ) e.g. (GCD 81 57) Result : 3 两个参数均必须为整数值型态 自然对数 (LOG 数值参数 ) e.g. (LOG 3.5) Result : 1.25276 是EXP函数的反函数;传回值为实数型态 自然反对数 (EXP 数值参数 ) e.g. (EXP 1.25276) Result : 3.49999 是LOG函数的反函数;传回值为实数型态 数值资料转型 实数转整数 (FIX 数值参数 ) e.g. (FIX 12.56) 只会截去小数部份(小数字不会4舍5入) 整数转实数 Result : 12 (FLOAT 数值参数 ) e.g. (FLOAT 12) Result : 12.0 整数转字符串 (ITOA 数值参数 ) e.g. (ITOA -17) Result : \"-17\" 数值转字符串 (RTOS 数值参数 [模式 [小数字] ] ) e.g. (RTOS 17.23333 2 3) Result : 12.266 若不设定模式,则依系统变量 LUNITS 的设定值转换数值为字符串 若不设定小数字,则依系统变量 LUPREC 的设定值转换 模式设定值可以是下列数值之一 : 1 = 科学记号 2 = 十进制 3 = 英呎及十进制英吋 4 = 英呎及分数位英吋 5 = 分数 当选用的模式为3,4或5,则传回的字符串受系统变量UNITMODE影响 弪度转字符串 (ANGTOS 角度参数 [模式 [小数字] ] ) e.g. (ANGTOS 0.785398 0) Result : \"45\" e.g. (ANGTOS 0.785398 4) Result : \"N 45d E\" 若不设定模式,则依系统变量AUNITS的设定值转换数值为字符串 若不设定小数字,则依系统变量AUPREC的设定值转换 模式设定值可以是下列数值之一 : 0 = 度 1 = 度/分/秒 2 = 分度量 3 = 弪度 4 = 土地测量单位 当选用的模式为4,则传回的字符串受系统变量UNITMODE影响 反函数为ANGTOF;参阅第5篇教程 数值资料检查 数值 (NUMBERP 数值参数 ) e.g. (NUMBERP -3.45) Result : T e.g. (NUMBERP \"AutoLISP\") Result : nil 注意 : 在范例的传回值中,T表示函数的结果为真(成立),nil表示结果为假(不成立) 负数值 (MINUSP 数值参数 ) e.g. (MINUSP -3.45) e.g. (MINUSP 0) e.g. (MINUSP 3.45) 零值 (ZEROP 数值参数 ) e.g. (ZEROP 0) e.g. (ZEROP 3.45) 其它应用 最大值 (MAX [数值参数1 数值参数2 ....] ) e.g. (MAX -88 5 2) 若没有提供任何参数,则传回值为0 最小值 (MIN [数值参数1 数值参数2 ....] ) e.g. (MIN -88 5 2) 若没有提供任何参数,则传回值为0 练习 (Exercises) 计算下列算式 : (+ 1234567890 1234567890) Result : T Result : nil Result : nil Result : T Result : nil Result : 5 Result : -88 Result : -1825831516 上式中两个数值参数均为整数,而结果值大于整数型态所能容许之范围;固导致发生溢位问题,产生无效的结果.修正算式如下 : 只要将其中一个参数改为实数型态即可. (+ 1234567890.0 1234567890) 计算下列算式 : (+ 9876543210 1234567890) Result : 1.11111e+010 Result : 2.46914e+009 上式中两个数值参数均为整数,但其中一个(第一个)参数巳大于整数型态所能容许之范围;系统会自动将此参数先行转为实数型态才计算. 计算下列算式 : (FIX (SQRT (+ 1 (MAX 20 10 40 30)))) Result : 6 ---- 最先执行的是最内层的算式 (MAX 20 10 40 30) ,求出最大值为40 ---- 其次执行加函数,将MAX函数所得的最大值加1,结果为41 ---- 再利函数SQRT,将41开方根,结果为6.4031 ---- 最后使用FIX函数,截去其小数字,得到最后的结果为6 用户定义函数 是将一群表示式组合成一个函数或指令 可应用于绘图模式的指令行提示,Visual LISP控制台,或供其它自定义函数 内的表示式呼叫使用 AutoLISP源代码均以纯文本格式存档,扩展名为LSP(2000版可编译成扩展名 为FAS的档案 可以一般文本编辑器进行开发,如DOS的EDIT,WINDOWS的WORD或WORDPAD 等 一个自定函数内最少要有一个表达式 在原程序文件(LSP)里,自定义函数以DEFUN函数开始;其语法如下 : (DEFUN [C:] 函数名称 ( [自变量串行 ...] [/ 局部变数串行 ...] ) 表达式 ...) 在呼叫带有自变量的自定函数时,必须同时提供与定义函数时,同等数量的 参数,使各参数传入自定函数的各自变量中 自变量被视为一种特殊类型的局部变量,无法用于该自定函数以外的其它函 数 若自定函数中无须设定任何自变量,亦必须以空串行 ( )加在函数名称之后 若有提供局部变量,必须以斜线 / 加在局部变量的开头(即使前面没有自变 量串行) 各自变量,斜线,局部变量之间要以空格分隔;但与左右小括号之间则不须以 空格分开 若自变量串行中有相同名称的自变量出现,则会忽略第一个以后的相同自变 量;变数亦是一样 若在函数名称前加上C:,表示该函数可以在绘图模式的指令行提示下,其执 行方式与内建函数相同;亦可以在任何内建命令(执行中)的提示后,以通透方式执行(但须将函数名称包在一对小括号中) 若在函数名称前没有加上C:,在指令行提示下,必须将函数名称包在一对小 括号中才可执行 不可以在执行一自定函数时,以通透方式执行另一自定函数 加载程序 自定函数在使用前,都要将其所在的程序文件(扩展名为LSP)加载才可执行 ACAD.LSP程序文件(默认在SUPPORT子目录内)会在启动AutoCAD时自动加载 (LOAD \"程序文件名称\" [加载失败] ) e.g. (LOAD \"TEST\") 若程序文件之文件名为LSP,则在程序文件名称之后,可以不加上扩展名 若有需要,系统会顺序尝试其它的扩展名 : VLX FAS LSP 若程序文件不在系统的支持目录下,则需在文件名前加上目录路径 注意 : 必须以正斜线 / 或两个反斜杠 \\\\ 作为目录的分隔符 可以在加载失败的参数中提供字符串,以供加载失败时显示;亦可提供有效 的自定函数,该函数在加载程序文件失败时会被执行 e.g. (LOAD \"TEST\" \"Load Fail\") 或 (LOAD \"TEST\" (DOERROR)) 注意 : 在程序文件加载后,在提示行显示的返回值,一般是该程序文件中,最后被定 义的函数名称 或是在程序文件内没有包含在自定函数中,最后一个表达式的执行结果 练习 (Exercises) 启动文本编辑器,编写一AutoLISP程序作两个同心圆 (第1个圆半径为50, 第2个圆半径为80),程序代码如下所示 : (DEFUN C: 2CIRCLE () (SETQ CEN (LIST 0 0) RAD 50) (COMMAND CIRCLE CEN RAD) (COMMAND CIRCLE CEN (+ RAD 30))) ---- 输入后以纯文本格式存档(C:\\TEST.LSP) ---- 在AutoCAD绘图模式的指令行提示后,用LOAD函数将程序文件加载 COMMAND : (LOAD \"C:/TEST\") ---- 在指令行提示后,输入程序(函数)名称执行 COMMAND : 2CIRCLE 程序说明 1 使用DEFUN建立自定函数的名称,并用SETQ函数将中心点(LIST 0 0)存入变 数CEN,半径(50)存入变数RAD中 2 使用COMMAND函数执行AutoCAD内建指令CIRCLE,并以变量CEN(圆的中心点) 及变数RAD(圆的半径)回应 3 与第2行大致相同,但在指定其半径时,先将储存半径的变量加30,使划出半 径为80的圆;注意最右边的关括号,与第1行DEFUN左边的开括号是一对的 启动文本编辑器,开启TEST.LSP程序文件,复制2CIRCLE至新程序2C,并改为 传入自变量方式执行;程序代码如下 : (DEFUN 2C (CEN RAD) (COMMAND CIRCLE CEN RAD) (COMMAND CIRCLE CEN (+ RAD 30))) ---- 输入后以纯文本格式存档 ---- 在AutoCAD绘图模式的指令行提示后,用LOAD函数将程序文件重载 ---- 在指令行提示后,输入程序(函数)名称执行 COMMAND : (2C (LIST 0 0) 50) 批注 单行批注 分号 ; 表示在分号右边(同一行)的字符均为批注,程序执行时会将其忽略 多行批注 ;| |; 表示在两个批注符号中间所有字符皆为批注,即使字符跨越多行 关系运算 在各个关系运算中,都会传回一逻辑值;若关系成立,传回 T,否则会传回 nil 各参数可以是字符串,整数或实数型态;若以字符串进行比较,则会以字符串 的ASCII码为准 若函数中只有一个参数,传回值恒为 T 等于函数 (= 参数1 [参数2 ....] ) 会将参数1与其后各个参数比较,若全部相等则传回 T,否则传回 nil e.g. (= 2 2.0) Result : T e.g. (= \"A\" CHR(65)) Result : T 不等于函数 (/= 参数1 [参数2 ....] ) 若参数1不等于其后任何一个参数,即传回 T e.g. (/= 1 2.0) e.g. (/= \"a\" CHR(65)) e.g. (/= 10 30 40 10 20) 小于函数 (< 参数1 [参数2 ....] ) 各参数顺序以2个为一组比较,若各组左边的参数均小于右边的参数,即传回 T e.g. (< 1 2) Result : T e.g. (< \"a\" CHR(65)) Result : T 大于函数 Result : T Result : T Result : T (> 参数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. (<= \"a\" CHR(65)) Result : T 大于或等于函数 (>= 参数1 [参数2 ....] ) 各参数顺序以2个为一组比较,若各组左边的参数均大于或等于右边的参数, 即传回 T e.g. (>= 1 2) Result : nil e.g. (>= 2 2) Result : T e.g. (>= \"a\" CHR(65)) Result : nil 条件判断 是利用条件函数,配合关系及逻辑运算所设定的一些准则,令程序自行分析,因应情况作出适当行动. 单一条件 (IF 条件表达式 是表达式 [否表达式] ) 函数先检查条件表达式,若其传回值为 T,便会执行其后的是表达式 若有提供否表达式,且条件表达式的传回值为 nil,函数将不会执行(跳过) 是表达式而执行否表达式 若没有提供否表达式,且条件表达式的传回值为 nil时,函数将不作任何事 情 IF函数可以巢状方式嵌套,即在是或否的表达式中加入另一个IF函数 练习 (Exercises) 判断空气污染指数 : 大于100 = Very High, 51至100 = High, 26至50 = Medium, 25或以下 = Low 启动编辑器,开启C:/TEST.LSP程序文件;新增AIR-1自定函数,程序代码如---- 下 : (DEFUN AIR-1 (NUM) (IF (> NUM 100) (PRINC \"Very High\")) (IF (AND (> NUM 50) (<= NUM 100)) (PRINC \"High\")) (IF (AND (> NUM 25) (<= NUM 50)) (PRINC \"Medium\")) (IF (<= NUM 25)) (PRINC \"Low\")) (PRINC)) 程序说明 1 设定函数名称,并将数据存入自变量NUM内;用IF函数判断变量NUM是否大 于100;若是则显示字符串Very High响应 2 用IF函数判断变量NUM是否大于50且(AND)小于或等于100;若是则显示 High响应 3 用IF函数判断变量NUM是否大于25且(AND)小于或等于50;若是则显示 Medium 4 用IF函数判断变量NUM是否小于或等于25;若是则显示Low 5 是一个没有提供任何自变量的PRINC函数;用以抑制显示答案时尾部符加的 nil 或重复的传回值;而最右一个关括号,是用以对应第1行最左边的开括号 续下一课 .... 续上一课 .... IF函数的巢状练习 : 修改上一课的程序练习,将多个IF函数合并成巢状嵌 套 ---- 启动文本编辑器,开启C:/TEST.LSP程序文件 ---- 新增程序AIR-2,其程序代码如下 : (PRINC (IF (> NUM 100) \"Very high\" (DEFUN AIR-2 (NUM) (IF (> NUM 50) \"High\")) 程序说明 1 设定函数名称,并将数据存入自变量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行最左边的开括号 注意 : 第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函数的 (PRINC (IF (> NUM 25) \"Medium\" \"Low\"))) (PRINC)) 循环 (Loop) 配合条件判断,关系及逻辑运算,令程序不断重复一些动作,以提高效率及减 少重复动作时的人为错误 可以多个循环形成巢状(嵌套式)循环,即在一个循环内嵌套另一个(或多个) 循环 指定的重复次数必须为正整数,亦可以是储存正整数的变量名称 重复指定次数 (REPEAT 重复次数 [表达式 ....] ) e.g. (REPEAT 10 (PRINC \"David\")) 重复 (WHILE 条件表达式 [是表达式 ....] ) 若条件表达式的传回值为 T,即会顺序执行函数内各表达式 各表达式顺序执行完后,程序会返回函数的开头,重新检查条件表达式的传 回值 若条件表达式的传回值为 nil,函数内各表达式将不会被执行 e.g. (SETQ COUNT 1) (WHILE (<= COUNT 10) 注意 : 第4行最右边的关括号,是对应第2行WHILE函数的开括号 无限循环 又称为死循环,即循环的条件判断式传回值恒为 T,令循环不断重复而无法 结束;在上例中 : ---- 若WHILE函数的条件表达式设定为 (T) ;即条件永远成立 ---- 不作SETQ函数,或不将变量COUNT递增 ;变量COUNT储存值恒久不变, 导致条件式永远成立 ;重复显示David字符串10次 ;将1存入变数COUNT ;WHILE函数并检查变量COUNT是否<=10 ;若条件成立则以PRINC函数显示David (PRINC \"David\") 字符串 (SETQ COUNT (1+ COUNT))) ;变量COUNT递增1,并将新值重新存入 变量COUNT中取代原值 练习 (Exercises) 编写一程序SUM并将自变量存在NUM变量内,计算1+2+3+4 ....至变数NUM 的总和 (DEFUN SUM (NUM) (SETQ COUNT 1 TOTAL 0) (WHILE (<= COUNT NUM) (SETQ TOTAL (+ TOTAL COUNT) COUNT (1+ COUNT)) ) (PRINC TOTAL) (PRINC)) 程序说明 1 设定函数SUM并将自变量存入变量NUM,设定变量COUNT以将数目由1开始递 增,变量TOTAL(储存总和)初始值为0 2 WHILE循环函数,并设定进入循环的条件式(变量COUNT小于或等于变量NUM) 3 若条件成立即进入循环内部,先将变量TOTAL加上变量COUNT,再用SETQ函数 存回变量TOTAL中,覆盖原值 4 将变量COUNT递增1,存回变数COUNT并覆盖原值 5 关括号与第2行的WHILE函数左边的开括号对应 6 循环结束后,用PRINC函数显示变量TOTAL(总和)的内容 程序流程 假设执行程序时传入变量NUM的数值为10 ---- 变数初始值 ---- 判断变量COUNT是否<=变量NUM ---- 变量COUNT(现值1)小于NUM,进入循环;将 TOTAL(现值0)加上COUNT,存回变数TOTAL ---- 变数COUNT(现值1)递增1变为2,存回变数 COUNT ---- 返回WHILE函数的开头,重新判断条件式 ---- 变量COUNT(现值2)小于NUM,进入循环;将 TOTAL(现值1)加上COUNT,存回变数TOTAL ---- 变数COUNT(现值2)递增1变为3,存回变数 COUNT ---- 返回WHILE函数的开头,重新判断条件式 ---- 变量COUNT(现值3)小于NUM,进入循环;将 TOTAL(现值3)加上COUNT,存回变数TOTAL 部 份 过 程 省 略 COUNT = 1 COUNT = 1 COUNT = 1 COUNT = 2 TOTAL = 0 TOTAL = 0 TOTAL = 1 TOTAL = 1 COUNT = 2 COUNT = 3 TOTAL = 3 TOTAL = 3 COUNT = 3 TOTAL = 6 ---- 返回WHILE函数的开头,重新判断条件式 ---- 变量COUNT(现值10)仍等于NUM,进入循环; 将TOTAL(现值45)加上COUNT,存回变数 COUNT = 10 TOTAL = 55 TOTAL ---- 变数COUNT(现值10)递增1变为11,存回变 数COUNT ---- 返回WHILE函数的开头,重新判断条件式 ---- 变量COUNT(现值11)巳大于NUM(本范例假设 为10),条件判断不成立,循环结束 ---- 显示变量TOTAL的现存值,程序结束 COUNT = 11 TOTAL = 55 COUNT = 11 TOTAL = 55 尝试用IF函数检查输入的自变量是否小于或等于0;若条件成立则不执行余下的程序 (DEFUN SUM (NUM) 程序说明 1 设定函数SUM并将自变量存入变量NUM,并用IF函数判断是否<=0,若条件成 立则显示错误讯息 2 若条件不成立,即以PROGN函数包含上例中的循环及显示答案部份 3 尾3行的关括号是对应第2行的PROGN函数 4 尾2行的关括号是对应第1行的IF函数 5 最后一行最右边的关括号是对应第1行的DEFUN函数 (IF (<= NIM 0) (PRINC \"Input Error\") (PROGN 略 过 WHILE 及 PRINC 函数 ) ) (PRINC)) 输入函数 让AutoCAD应用程序可以提示用户输入程序所需的数据;这些输入函数一般都是以GET开头;当程序执行至输入函数时,程序便会暂停,等待用户输入指定类型的数据后,程序即会继续执行.亦可在函数内指定要显示的提示字符串,若不提供则没有任何提示. 输入整数 (GETINT [提示字符串] ) e.g. (GETINT \"Input Number : \") 输入的范围从-32,768到+32,767之间;若超出范围,会有警告讯息 若输入的数据不是整数型态,如文字或是实数,会显示警告讯息 若输入空格或按下ENTER键响应,输入值为 nil 输入实数 (GETREAL [提示字符串] ) e.g. (GETREAL \"Input Number : \") 若输入的数据是字符串型态,会显示警告讯息;若输入整数,则会自动转为实 数 若输入空格或按下ENTER键响应,输入值为 nil 输入字符串 (GETSTRING [模式] [提示字符串] ) e.g. (GETSTRING T \"Input Name : \") 若有提供模式参数且不是 nil 值,用户即可在输入的字符串中包含空格;但 此时必须按ENTER键结束输入 若没有提供模式参数或该参数为 nil 值,要在字符串中包含空格时,必须在 字符串的前后加上双引号 \" 输入时不须在字符串的前后加上双引号(上述的情况例外) 若输入空格(没有模式参数或为 nil 值时)或按ENTER键响应时,输入值为 \"\即空字符串 输入选取点 (GETPOINT [基准点] [提示字符串] ) e.g. (GETPOINT (LIST 0 0) \"Select Point : \") 可以在屏幕以指向设备(一般是鼠标)选取,或以键盘直接输入坐标值亦可 若有提供基准点(目前UCS的2D或3D坐标),会从基准点出现伸缩线到十字 光标所在位置 可接受单一整数或实数作为长度,代替基准点参数;此时会以系统变量 LASTPOINT为基准点,以目前十字光标的位置与LASTPOINT的角度为方向,以 长度为距离,求出新的输入点 传回值为目前UCS的三维坐标;若输入空格或按下ENTER键响应,输入值为 nil 续下一课 .... 续上一课 .... 输入角度 (GETANGLE [基准点] [提示字符串] ) e.g. (GETANGLE (LIST 0 0) \"Select Point : \") 若有提供基准点(目前UCS的2D坐标),会从基准点出现伸缩线到十字光标所 在位置 若没有提供基准点,可以在屏幕以指向设备(一般是鼠标)选取两点,以第一 点作为基准点 可从键盘直接输入角度值;不论是用指向设备选取或键盘输入,均自动转为 弪度传回 弪度以0弪度方向(由系统变量ANGBASE设定)算起,沿反时钟方向增加 输入角度 (GETORIENT [基准点] [提示字符串] ) e.g. (GETORIENT (LIST 0 0) \"Select Point : \") 唯一不同于GETANGLE函数的是 : 以正右方为0弪度,不受 ANGDIR 及 ANGBASE 系统变量影响 输入对角点 (GETCORNER 基准点 [提示字符串] ) e.g. (GETCORNER (LIST 0 0) \"Select Point : \") 必须提供以目前UCS为准的基准点参数;与目前十字光标位置构成伸缩的矩 形 传回值为目前UCS的三维坐标;若输入空格或按下ENTER键响应,输入值为 nil 可直接从键盘输入坐标值,以代替从屏幕点选 输入距离 (GETDIST [基准点] [提示字符串] ) e.g. (GETDIST (LIST 0 0) \"Select Point : \") 会从基准点(目前UCS的2D坐标)出现伸缩线到十字光标所在位置 若没有提供基准点,可以在屏幕以指向设备(一般是鼠标)选取两点,以第一 选取点作为基准点 若提供3D的点坐标,则传回值是3D的距离;但若设定了INITGET函数第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启动目录的全 部档案 若默认扩展名为空字符串,则显示所有类型的档案;若扩展名为DWG,会在对 话框中显示预览影像 若对话框取得文件名,函数会传回指定的文件名及目录路径,否则传回 nil 模式是控制对话框行为的整数值;若要一次过设定多种模式,可将其模式对 应的数值累加 1 (0位) 建立新的档案;若是要开启旧档则切勿使用;若档案巳存在会显示错 误讯息 4 (2位) 此位若未设定,则只会接受指定的预设扩展名,若档案不加扩展名, 则自动加上预设的扩展名 8 (3位) 若设定此位且未设定0位,档案会依支持路径搜寻;若找到则只会传 回文件名,不会传回路径.若未设定此位,则会传回完整的目录路径文件名 16 (4位) 若设定此位,或是默认文件名以路径分隔元结尾,则仅显示该目录路 径的档案,且文件名输入框会变为空白 32 (5位) 若设定此位及0位,若指定的档案巳经存在则会被覆盖,且覆盖前不 会有警告讯息 64 (6位) 若指定了URL,则请勿传输远程档案 128 (7位) 完全不允许使用URL 设定关键词 (INITGET 模式 关键词串 ) e.g. (INITGET 7 \"Yes No\") 若用户的输入符合某个关键词,则会传回整个关键词串;否则会显示提示重 试< 每个关键词仅可以含有字母,数字及连字符号 (-);有以下两种方式缩写关 键词 : ---- 关键词的必要部份用大写,其余用小写 e.g. \"Yes No\" e.g. \"YES,Y ---- 整个关键词全部为大写,以逗号分隔,再重复简写的部份 NO,N\" 若关键词全部为小写或大写,且没有逗号及缩写部份,则用户必须输入整个 关键词才能辨析 每个关键词之间必须以空格分开 本函数适用于除GETSTRING以外的其它输入函数(但各函数可设定的模式略 有不同) 模式的作用为控制用户的输入,为整数值;若要一次过设定多个模式,可将该 模式对应的数值累加 1 (0位) 不接受使用者按下ENTER键作为响应 2 (1位) 不接受使用者输入0作为响应 4 (2位) 不接受使用者输入负数作为响应 8 (3位) 允许输入超出图面范围以外的坐标点(即使目前系统数数 LIMCHECK设定为ON) 16 (4位) 目前并未使用 32 (5位) 使用虚线绘制伸缩线或方框;但如果POPUPS系统变量设定为0,则 会忽略此位的设定 64 (6位) 若设定此位,则各输入函数只传回2D的坐标;否则会传回3D的坐标 128 (7位) 允许任意的输入;这位优先于0位的设定值;若输入时按ENTER响 应,则会传回空字符串 输出函数 显示或写入档案 (PRIN1 字符串 / 表达式 [档案指标] ) e.g. (PRIN1 \"David\") 所有包含在字符串中的控制字符会当为普通字符显示 若没有提供字符串或表达式,则函数将不作任何事情 结果会在屏幕显示两次,第一次为函数功能所显示的,第二次为系统的传回 值 档案指针必须是以OPEN函数,开启档案后传回的指标;若没有提供,所有传回 值均显示在屏幕上;若有提供,字符串将写入该档案内 e.g. (PRIN1 \"David\" FILE_ID) 显示或写入档案 (PRINC 字符串 / 表达式 [档案指标] ) e.g. (PRINC \"David\") 所有包含在字符串中的控制字符会正常运作 其它与PRIN1函数相同 显示 (PROMPT 字符串参数 ) e.g. (PROMPT \"David\") 在双屏幕规划中,可将字符串显示在两个屏幕上 字符串显示后,传回值恒为 nil 显示 (ALERT 字符串参数 ) e.g. (ALERT \"David\") 字符串参数会显示在对话框中 可配合换行控制字符 显示多行文字 在对话框中,可显示的列数量及每列可显示的字符数量,受平台设备,窗口大 小及解像度影响 练习 (Exercises) 在TEST.LSP程序文件中,新增程序2C-1,以修改第三篇课程的2C程序 : 在 新增的程序中,使用输入函数取得用户输入,取代在呼叫旧程序时同时传入自变量的做法 (DEFUN C:2C-1 ( ) (SETQ CEN (GETPOINT \"Select center point : \")) (COMMAND \"CIRCLE\" CEN (GETDIST CEN \"Input radius : \")) (PRINC)) 程序说明 1 设定函数2C-1,并用GETPOINT函数取得用户选取的坐标点(圆心)再用SETQ 函数将坐标存入变量CEN中 2 用COMMAND函数执行CIRCLE指令,随即以变量CEN响应以设定圆心点位置, 再使用GETDIST函数,取得用户输入的长度作为半径响应CIRCLE指令 在TEST.LSP程序文件中,新增程序RECT,以对角的两点建立矩形(聚合线), 再询问是否在矩形中加上对角线,最后将图形以输入的角度旋转.在程序中要等别注意如何将坐标分解及重组(第3,4行的程序代码) <> (DEFUN C:RECT ( ) (SETQ PT_START (GETPOINT \"Select first point\") PT_END (GETCORNER PT_START \"Select second point\") PT_TMP1 (LIST (CAR PT_START) (CADR PT_END)) PT_TMP2 (LIST (CAR PT_END) (CADR PT_START))) (COMMAND \"PLINE\" PT_START PT_TMP1 PT_END PT_TMP2 \"C\") (COMMAND \"SELECT\" \"L\" \"\") (INITGET 128 \"Yes No\") (SETQ YESNO (GETKWORD \"Diagonal Line (Y/N) : \")) (IF (= YESNO \"Yes\") (PROGN (COMMAND \"LINE\" PT_START PT_END \"\") (COMMAND \"SELECT\" \"P\" \"L\" \"\") (COMMAND \"LINE\" PT_TMP1 PT_TMP2 \"\") (COMMAND \"SELECT\" \"P\" \"L\" \"\") ) ) (COMMAND \"ROTATE\" \"P\" \"\" PT_START (* (GETANGLE PT_START \"Rotate Angle : \") (/ 180 PI))) (PRINC)) 续下一课 .... 程序说明 1 设定函数名称,并用GETPOINT函数取得第1点坐标,存入变量PT_START 2 使用GETCORNER函数取得第2点(矩形对角点)坐标,存入变数PT_END 3 抽出变数PT_START的X坐标,及PT_END的Y坐标,结合成新坐标并存入变数 PT_TMP1 4 抽出变数PT_END的X坐标,及PT_START的Y坐标,结合成新坐标并存入变数 PT_TMP2 5 用COMMAND函数执行PLINE指令,顺序设定四个角点位置,最后以\"C\"选项将 聚合线封闭 6 用COMMAND函数执行SELECT指令,并选用Last模式,将刚建立的聚合线选取 7 以INITGET函数设定关键词Yes及No 8 用GETKWORD函数询问用户是否要在矩形中加上对角线,并将传回值存入变数 YESNO中 9 用IF函数判断变量YESNO,若用户输入Y,则以PROGN函数包含各顺序执行的 指令 10 以COMMAND函数执行LINE指令划出第1条对角线 11 用COMMAND函数执行SELECT指令,用Previous模式选取对上一个选集的对 象(聚合线),再选用Last模式,将刚建立的对角线选取并加入新选集中 12 以COMMAND函数执行LINE指令划出第2条对角线 13 用COMMAND函数执行SELECT指令,用Previous模式选取对上一个选集的对 象(聚合线和直线段),再选用Last模式,将刚建立的对角线选取并加入新选集中 14 右边的关括号是对应IF函数,左边的关括号则是对应PROGN函数 15 以COMMAND函数执行ROTATE指令,将对上一个选集(以Previous模式响应), 绕变量PT_START为基准点转旋 16 旋转的角度以GETANGLE函数取得;因为函数的传回值是弪度,所以要乘以180 除PI(弪度3.14159等于180度),使弪度转换为角度值 新增程序AIR-4,并将第4篇课程的AIR-3程序修改为 : 在程序中直接要求用户输入空气污染指数(只可输入正整数或实数,但不可以是0,负数或以ENTER响应),而不是在呼叫程序时以自变量的方式传入 (DEFUN C:AIR-4 ( ) (INITGET 7) (SETQ NUM (GETINT \"Input number\")) COND函数及其余程序省略 程序说明 1 设定函数名称,并用INITGET函数,设定输入模式为7,没有任何关键词 (1 = 不可以ENTER 2 = 不可以是 0 4 = 不可以是负数 所以设定值为1+2+4 = 7) 2 用GETINT函数(或GETREAL)函数取得用户输入的数值并存入变量NUM中,以 便进行后续的判断程序 字符串函数 字符串链接 (STRCAT [字符串参数1 [字符串参数2]....] ) Result : \"David and e.g. (STRCAT \"David and \" \"Katy\") Katy\" 如果仅有一个参数,则传回该参数 若没有提供任何参数,则传回零长度的字符串(空字符串) e.g. (STRCAT) Result : \"\" 字符串长度 (STRLEN [字符串参数1 [字符串参数2]....] ) e.g. (STRLEN \"David\") Result : 5 如果有多个参数,会传回所有字符串参数的长度总和 e.g. (STRLEN \"David\" \"Katy\") Result : 9 如果没有提供参数,或字符串参数为空字符串,则传回值为0 e.g. (STRLEN) 或 (STRLEN \"\") Result : 0 截取字符串 (SUBSTR 字符串参数 开始位置数值 [截取长度] ) e.g. (SUBSTR \"David and Katy\" 7 3) Result : and 字符串参数中第一个字符(最左边)的位置编号为1,依此类推 空格亦占一个字符位置及编号 起始位置数值必须为正整数;若其数值大于整个字符串的长度,则传回空字 符串\"\" e.g. (SUBSTR \"David and katy\" 100) Result : \"\" 截取长度亦必须为正整数;若没有提供此参数,则传回起始位置及其右边的 全部字符 e.g. (SUBSTR \"David and katy\" 11) Result : \"Katy\" 若不提供任何参数,或仅提供字符串参数,系统即会显示警告讯息 字符串数据转型 大小写转换 (STRCASE 字符串参数 [转换模式] ) e.g. (STRCASE \"David and Katy\") Result : \"DAVID AND KATY\" 如果不指定转换模式,或转换模式为 nil,会将字符串参数全部转为大写字 母 如果指定了转换模式,且转换模式为不是 nil,会将字符串参数全部转为小 大写字母 e.g. (SUBSTR \"DAVID\" T) Result : \"david\" 字符转ASCII码 (ASCII 字符串参数 ) e.g. (ASCII \"David\") Result : 68 若字符串参数多于一个字符,则只会传回该字符串中第1个字符的ASCII码 反函数是CHR 若不提供任何参数,或该参数不是字符串型态,系统会显示警告讯息 ASCII码转字符 (CHR 整数参数 ) e.g. (CHR 65) Result : \"A\" 整数参数必须在1至255的范围内,否则传回值无法预测 若不提供任何参数,或该参数不是整数型态,系统亦会显示警告讯息 字符串转整数 (ATOI 字符串参数 ) e.g. (ATOI \"123\") Result : 123 若字符串参数内的数字包含有小数点及小数字,转换后将会被截去 若不提供字符串参数,则系统会发出警告讯息 若字符串参数内的数字包含有非数值字符(如英文字母),则函数只会将第1 个非数值字符,前面(左边)的数值字符转元为整数 若字符串参数内的第1个字符为非数值字符(如英文字母),则函数会传回 0 字符串转实数 (ATOF 字符串参数 ) e.g. (ATOI \"123.45\") Result : 123.45 e.g. (ATOI \"123\") Result : 123.0 若字符串参数内的数字没有包含小数点及小数字,转换后将会自动加上小数 点及补 0 若不提供字符串参数,则系统会发出警告讯息 若字符串参数内的数字包含有非数值字符(如英文字母),则函数只会将第1 个非数值字符,前面(左边)的数值字符转为实数 若字符串参数内的第1个字符为非数值字符(如英文字母),则函数会传回 0 续下一课 .... 角度字符串转弪度实数 (ANGTOF 字符串参数 [转换模式] ) e.g. (ANGTOF \"45\" 0) Result : 0.785398 e.g. (ANGTOF \"45\" 3) Result : 1.0177 提供的字符串参数格式必须配合所设定之模式需求 反函数为ANGTOS,请参阅第二篇课程 模式设定值可以是下列数字之一 : 0 = 度 1 = 度/分/秒 2 = 分度量 3 = 弪度 4 = 土地测 量单位 若不提供任何参数,系统会显示警告讯息 若仅提供字符串参数而不提供转换模式,会使用系统默认模式0将字符串转 为度 若提供的字符串参数不能转换为指定模式的实数,函数将传回 nil 实数字符串转实数 (DISTOF 字符串参数 [转换模式] ) e.g. (DISTOF \"123.45\" 0) Result : 123.45 提供的字符串参数格式必须配合所设定之模式需求 模式设定值可以是下列数字之一 : 1 = 科学记号 2 = 十进制 3 = 英呎,十进制英吋 4 = 英呎, 分数英吋 5 = 分数 若不提供任何参数,系统会显示警告讯息 若仅提供字符串参数而不提供转换模式,会使用系统默认模式1将字符串转 为科学记号 若提供的字符串参数不能转换为指定模式的实数,函数将传回 nil 练习 (Exercises) 将字符串\"David and Katy\"存入变量中,分别截取字符串\"David\及 \"Katy\再重新将字符串链接且对调位置 COMMAND : (SETQ TEXT \"David and Katy\") Result : \"David and Katy\" COMMAND : (STRCAT (SUBSTR TEXT 11) (SUBSTR TEXT 6 5) (SUBSTR TEXT 1 5)) Result : \"Katy and David\" 说明 1 用SETQ函数将字符串存入变量TEXT中 2 用STRCAT函数将随后的三个截取字符串重新链接 ---- 第一个截取函数起始位置11(K字母),截取其右边所有字符(没有设定截取长度) ---- 第二个截取函数起始位置6(第1个空格)开始,截取其右边5个字符长度 ( and ) ---- 第三个截取函数起始位置1(D字母)开始,截取其右边5个字符长度 (David) 控制字符 在双引号的字符串内,反斜杠 \\ 字符是用以表示包含的控制子元或脱逸码;各控制字符如下 : 反斜杠 \\\\ e.g. (PRINC Result : \"C:\\WINDOWS\" \"C:\\\\WINDOWS\") e.g. (PRINC \"\\\"David\\\"\") 双引号 \\\" 脱逸(Escape) \\e 新行(Newline) \\n e.g. (PRINC \"\\nDavid\") 返回(Return) \\r 定位(Tab) \ e.g. (PRINC \"\David\") 8进位码 \\nnn e.g. (PRINC \"\\104avid\") Result : \"David\" 新行控制字符 ,与使用TERPRI函数相同 在反斜杠后的字母必须为小写 在计算字符长度(STRLEN函数)时,不会将字符前的反斜杠计算在内 练习 (Exercises) 使用一个PRINC函数,配合各控制字符,显示下列数据 : NAME AGE Mary 25 Tony 37 COMMAND : (PRINC \"NAME\AGE\\nMary\25\\nTony\37\") 万用对比字符 (WCMATCH 字符串参数 对比样式 ) 字符串的对比要区分大小写 对比样式中可以使用逗号分隔,输入一个以上的样式条件;只要其中一个样 式符合即传回 T 字符串参数及对比样式,大约只有前500个字符会作比较;过长的字符会被忽 略 对比样式字符 # @ . * ? 井字号 at符号 句号 星号 问号 任何单一数字 任何单一字母 任何单一非英数字元 任何字符序列(包括空格) 任何单一字符 ~ 波浪符号 [ ] 中括号 [~ ] - 连字符 , ' 逗号 反引号 如果它是样式中第一个字符,会对比除了该样式以外的任何符号 任何包含在中括号内的字符 任何不包含在中括号内的单一字符 使用在中括号内,以指定单一字符的范围(若连字符是中括号内第一个或最后一个宇元时,将不作连字功能处理) 将两个样式分隔, 避开特殊字符,在单一反引号之后的字符,不读为通配符(例如'*) e.g. (WCMATCH \"David\" \"D*\") Result : T e.g. (WCMATCH \"David\" \"Da[a-z]id\") Result : T e.g. (WCMATCH \"David\" \"Da[~va-z]id\") Result : nil 范例说明 ---- 在第1行的范例中,是对比字符串参数是否以字母D开头(注意大小写) ---- 第2行的范例,是对比字符串参数中,第3个字符(v)是否在a至z的范围内 ---- 第3行的范例,是对比字符串参数中,第3个字符(v)是否在a至z的范围内 (但不包括字母v) 练习 (Exercises) 以自己的英文名称作为字符串参数,检查当中是否包含A,B或C其中任何一 个字母 COMMAND : (WCMATCH \"英文名称\" \"*A*,*B*,*C*\") QUOTE函数 直接传回其后的表达式而不予计算 e.g. (QUOTE (+ 1 2)) e.g. (QUOTE (A B)) Result : (+ 1 2) Result : (A B) 当在其它函数中使用QUOTE时,可将其写成为单引号 ' e.g. (SETQ DATA '(\"1234\" \"David\")) Result : (\"1234\" \"David\") 建立串行 (LIST [表达式 ....] ) 如果串行中没有变量,或末定义的项目,则可直接以QUOTE取代LIST函数 e.g. (SETQ NAME \"David\") ;将字符串存入变量NAME (SETQ DATA (LIST NAME \"Katy\")) e.g. (SETQ DATA '(NAME \"Katy\")) 中 Result : (\"David\" \"Katy\") Result : (NAME \"Katy\") 各表达式要以空格分开;若未提供任何表达式,函数传回 nil 通常以LIST函数来定义2D或3D的点坐标(即由2至3个实数或整数组成的 串行) e.g. (LIST 10.5 25.3 20.5) Result : (10.5 25.3 20.5) 可以建立嵌套式的串行,即在串行包含另一个串行 Result : (\"1234\" (\"David\" e.g. (LIST \"1234\" (LIST \"David\" \"Katy\")) \"Katy\")) 或 (LIST \"1234\" (LIST DATA)) 点对 (Dotted Pair) 是一种特殊形式的串行;它有两元素,在两个元素中间以一个圆点.分隔,而 元素与圆点之间要以空格分开 e.g. (8 . \"0\") 在AutoCAD的像素数据中,数据常以点对形式出现 型态检查 (LISTP 参数 ) 若参数是一个串行或是 nil,函数即传回 T,否则传回 nil e.g. (LISTP DATA) Result : T ;参数是一个储存串行的变量 (LISTP (LIST e.g. Result : T ;参数是串行 \"David\")) e.g. (LISTP NIL) Result : T ;参数是 nil e.g. (LISTP \"David\") Result : nil ;参数是字符串型态 亦可使用TYPE函数,检查传回值是否为LIST型态(请参阅第一篇课程) 串行连结 APPEND函数 (APPEND [串行 ....] ) 若提供不是串行型态的数据参数,系统会显示错误讯息 将各串行顺序链接并传回;若不提供任何串行参数,函数则返回 nil 值 Result : (\"1234\" \"David\" e.g. (APPEND '(\"1234\") DATA) \"Katy\") Result : (\"1234\" (\"David\" e.g. (APPEND '(\"1234\") (LIST DATA)) \"Katy\")) CONS函数 (CONS 元素 串行参数 ) 将元素(亦可以是串行)加到串行参数的开端 Result : (\"1234\" \"David\" e.g. (CONS '\"1234\" '(\"David\" \"Katy\")) \"Katy\") 可用此函数建立点对(Dotted Pair)形式的串行 e.g. (CONS '8 '\"0\") Result : (8 . \"0\") 练习 (Exercises) 建立员工数据的串行并存入变量中;串行中包括下列各元素 : (\"员工编号\" (\"姓\" \"名\") 年龄 \"职位\") (SETQ DATA (LIST \"1234\" (LIST \"Chen\" \"Katy\") 24 \"Draftsman\")) 将3个坐标(由左至右,分别为X,Y,Z坐标)以串行形式存入变数内 : (SETQ PT (LIST 50.5 25.5 0)) 串行分离 CAR函数 (CAR 串行参数 ) 传回串行参数中的第一个元素(该元素可能是一个串行) e.g. (CAR DATA) Result : \"1234\" 若串行参数为一空串行,则函数传回 nil e.g. (CAR (LIST nil)) e.g. (CAR '( )) Result : nil Result : nil CDR函数 (CDR 串行参数 ) 传回串行中,除第一个元素以外,所有其余的元素串行 Result : ((\"Chen\" \"Katy\") 24 e.g. (CDR DATA) \"Draftsman\") 若串行为一空中列,函数则传回 nil 若串行为点对(Dotted Pari)形式,则传回圆点以后的串行数据 e.g. (CDR '(8 . \"Layer\")) Result : \"Layer\" 续下一课 .... 注意 : CAR及CDR函数可互相组合,以提取串行中的各项数据 组合以 C 字母开头及 R 字母结尾,中间可提供最多4个 A 字母(提取串行 中第一个元素)或 D 字母(提取串行中的其余元素)的任意组合 e.g. (CADDR DATA) Result : 24 ;提取员工的年龄数据 等于 (CAR (CDR (CDR DATA))) ---- 除了开头的 C 字母及结尾的 R 字母外,中间的ADD分别等于3个分离串行 函数,最右边的字母所代表的函数优先执行 Result : ((\"Chen\" \"Katy\") 24 (CDR DATA) ;第1元素以外的其余元素 \"Draftsman\") (CDR ;第1元素以外的其余元素 Result : (24 \"Draftsman\") (CAR ;抽取第1个元素 Result : 24 坐标通常会以2个或3个的实数(或整数)以串行形式出现,可用以下方式抽取各轴坐标的元素数据 X坐标 = CAR Y坐标 = CADR Z坐标 = CADDR ---- 实际应用可参考第五篇课程的练习程序RECT LAST函数 (LAST 串行参数 ) e.g. (LAST DATA) Result : \"Draftsman\" 传回串行参数中的最后一个元素 若参数为空串行则传回 nil;若不提供串行参数,系统会显示错误讯息 NTH函数 (NTH 元素序数 串行参数 ) e.g. (NTH 2 DATA) Result : 38 传回串行参数中指定位置(以元素序数设定)的元素 序数必须为整数型态,串行中第一个元素(最左边)的序号为 0,依此类推 若不提供任何参数,或仅提供元素序数,则系统会显示错误讯息 若序数大于整个串行的元素总数量,函数会传回 nil 因篇幅问题不能全部显示,请点此查看更多更全内容