搜索
您的当前位置:首页AUTOLISP教程

AUTOLISP教程

来源:世旅网
函数 (Function)

在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

因篇幅问题不能全部显示,请点此查看更多更全内容

Top