《AutoLISP》由会员分享,可在线阅读,更多相关《AutoLISP(30页珍藏版)》请在金锄头文库上搜索。
1、第第 10 章章AutoCAD 二次开发二次开发10.2.2AutoLISP 表达式表达式 AutoLISP 处理的对象是符号表达式(简称表达式),是 LISP 程序的基本单元。表达式 相当于其他编程语言中程序的语句。 (1)表达式构成)表达式构成 表达式是包含函数关键字,并按 AutoLISP 语言规则书写的字符串。字符串中可以有 数、串和符号。数或串的值是数或串本身,符号的值是赋给该符号的值。多数情况下,表 达式以表的形式存在,其格式如下:(函数名 【参数】) 表达式由左括号开始,右括号结束,表达式可以嵌套,不伦嵌套几层,其左右括号必 须是配对的。表达式形式的表中,左括号之后的第一个元素必
2、须是函数名。 (2)表达式的表示)表达式的表示 大多数程序语言的表达式采用中缀表示法,即运算符在操作数中间,如: x=y+z。AutoLISP 采用前缀表示法,将函数名或运算符放在所有操作数之前,如: (setq x (+ y z) (3)表达式返回值)表达式返回值 在 LISP 语言中,函数之间不存在是否优先的关系,求值的先后顺序只能通过表的层 次来实现。最里层的表最先被求值,把求值的结果返回给外层的表,直至求值完毕。 例如,表达式(setq x(* (+ a b) c),先求出最内层 a 与 b 之和,然后求出 a,b 之和与 c 的积,将求得的积赋给 x,最后返回 x 的值。 (4)错误
3、信息 在表达式运行过程中,如果输入的右括号不配对,则会显示错误提示:输入的列表有 缺陷。Vlisp 环境下支持自动修正缺失的括号功能。 10.2.3AutoLISP 数据类型、变量数据类型、变量 AutoLISP 语言有着丰富的数据类型、灵活的变量定义。 (一)(一) 、数据类型、数据类型 AutoLISP 的数据类型丰富,除了具有一般程序设计语言的整型、实型、字符串等数据 类型之外,还有表、文件描述符、AutoCAD 选择集、AuroCAD 图元名、VLA 对象等数据 类型。 (1)整型()整型(INT) 整型即整数型。由 09 数字、字符组成,不允许出现其他字符, “十”号可省 略,如11
4、0,321,30 均是合法的整型数据。在目前使用比较多的 32 位计算机上, AutoLISP 的整型数据用 32 位表示,其取值范围为2 147 483 648 到2 147 483 648。如 果用户输人的数据超出此范围,AutoLLSP 会自动将整型数据转换为实型数据,但对于两 个有效整数进行运算所产生的结果超出此范围的情况,最后会得到无效的结果。 (2)实型()实型(REAL)实型数据又称为浮点数,AutoLISP 中为双精度,即保证有 14 位的有效精度。实数有 小数和科学计数两种表示形式:小数形式例如:0.123,2.345 但需要注意的是,与其他语言不同,AutoLLSP 中对于
5、绝对值小 于 1 的实数不能直接以小数点开头,必须在小数据点前加上 0,否则计算机会误认为是点 对而出错。例如不能将 0.123 简写为.123科学计数法形式即数字后有一个 e 或 E,而后跟数的指数。如 1. 23E3 表示 1.2310,同样也可表示 为 0.123E4 或 12.3e2。但要注意 e 或 E 之前必须有数字,且指数必须为整数,如 E3、1.23E2.5、e 均不是合法的指数形式。 (3)字符串()字符串(STRING) 字符串又称为字符常数,它是由双引号括起来的字符序列。字符串中字母的大、小写 和空格符都有特定意义。字符串中字符的个数称为字符串的长度,最大为 132,如果
6、超出, 则后面的字符无效。任何字符都可以用“nnn”的格式表示,其中反斜杠“”是 ASCII 码 的前导标识字符,nnn 是该字符八进制的 ASCII 码。例如,字符串 ABCD 也可表示为 101102123104。一些常用的控制字符,像反斜杠、双引号,除了可以用“nnn”的格式 表示之外,还可以用转义字符格式表示为“” 、 “”等特殊字符,见表 10-1。 表 10-1 用前导“”符号表示控制字符的方法控制字符用转义字符表示用 ASCII 码表示反斜杠“”134双引号“”“042ESC 键e033换行n012回车r015Tab 键t011 注意:其中的字符 e,n,r,t 必须小写;在 V
7、isual LISP 中转义字符 r 不能作为回 车符使用,文字会紧跟在最后一个打印文字后面显示,需要打印回车符时可用(CHR 13 ) 来代替。 (4)表()表(LIST) 表是放在一对圆括号中的一个元素或用空格分隔的多个元素的组合,表中的元素可以 是函数,也可以是上述 3 种数据类型,甚至是另一个表,因而表提供了在一个符号中存储 大量相关数值的有效方法。表是 LISP 语言处理的对象,是 Visual LISP 基本数据结构。例 如,(+ 1 2 3),(sin(* 2.3 pi), (A B) C (D E),(0 “LINE“),()都是合法的表。表中元素的个数称为表的长度。例如,表(
8、+ 1 2 3)的长度为 4,表 (sin ( * 2.3 pi)的长 度为 2,表(A B) C D)的长度为 3,表()的长度为 0。 用表可以很方便地构造出复杂的数据结构。例如, (2.5 2.2 1.6)可以表示为 X 等于 2.5,Y 等于 2.2 , Z 等于 1.6 的三维点。 (5)文件描述符)文件描述符(FILE) 文件描述符是在打开一个文件时 Visual LLSP 赋予该文件的一个代码,用来作为该文 件的标识号。当 AutoLISP 函数需要访问一个文件时(读文件或写文件),首先通过该文件描 述符去识别并建立联系,然后再进行相应的读写操作。例如, (setq file (
9、open “file.dat“ “w“), 用于打开当前目录下的文件“file. dat” ,使它可被其他函数所用,同时将该文件描述符的 数值赋予 file 变量。(6)图元名()图元名(ENAME)图元名又叫实体名,是 AutoCAD 为图形对象指定的十六进制的数字标识。AutoLISP 通过该标识找到该图形对象在图形数据库中的位置,以便对其进行访问或编辑。例如, (setq ent (entlast) 是把图形中最后一个实体的实体名赋予变量 ent。(7)选择集)选择集(PICKSET)选择集是一个或多个实体对象的集合。可以通过 AutoLISP 程序建立选择集或向指定 的选择集添加或移除
10、图形对象,通过选择集可以对其内部指定的成员进行访问或编辑。例如, (setq ss (ssget “S“ (1 1) (10 10) 是选择与对角顶点为 (1,1), (10,10)矩形区域相交的图 形对象,并赋予变量 ss。 (8)VLA 对象对象 VLA 对象是 ActiveX 应用程序的主要组成部分。不仅直线、圆弧、多义线和圆等称为 VLA 对象,图层、组、块、视图、视口、图形的模型空间、图纸空间、线型和尺寸标注样 式等也称为 VLA 对象,甚至连 AutoCAD 应用程序本身也被认为是 VLA 对象。 (二)(二) 、LISP 变量变量 同其他编程语言一样,LLSP 也用变量来存储数据
11、,但 Visual LISP 中的变量同其他高 级语言相比,还是有着很大的不同。 (1)变量的命名)变量的命名Visual LISP 把任何数据都看成是被求值的数据,因而函数与变量的标识(即函数名、 变量名)也会被当成数据,称为符号,可理解成是一种特殊的数据类型。它一般由字母、 数字及其它除系统保留(表 10-2)外的可打印字符组成,但不能仅由数字组成,也不能包 含空格。 表表 10-2 系统保留字符系统保留字符 保留字符保留字符用途用途 左或右括号 ()用于表的定义 .点对标识符 quote 函数的简写 “字符串界定符 ;程序注释标识符 ?显示操作符AutoLLSP 中,变量名最长可达 10
12、0 个字符,但为了程序的易读性及节约内存,变量 名的长度尽量不要超过 6 个字符。如果一个变量名的长度超过 6 个字符,那么变量名不能 用节点来存储,而是在节点中会有一个指向另一个包含实际符号名的内存指针,这样就要 占用额外的内存,而且符号名越长,代码的执行速度就越慢。在 AutoLISP 中,符号的大 小写是等效的。 (2)变量的数据类型)变量的数据类型 数据类型是变量的重要特征,它关系到存放变量的存储空间大小。大多数计算机语言 在为变量赋初值前,都会对变量的数据类型作一定说明。而 AutoLISP 无须对变量做事先 的类型说明,变量被赋予值的类型即变量的数据类型。 在程序运行过程中,同一变
13、量在不同的时刻可以被赋予不同类型的值,即在程序运行的 过程中可以改变变量的数据类型。例如:(setq x 1) ;给变量 x 赋值 1,变量 x 为整型(setq x “text”) ;给变量 x 赋值 text,变量 x 为字符串型 (3)预定义变量)预定义变量 AutoLISP 对变量 nil、T、PI、PAUSE 进行了预定义,供用户在编写程序时直接使用。 没有指定值的变量称为 nil 变量。nil 与空字符串及 0 不同,nil 既不是字符串,也不是一个 整数 0,它表示尚无定义。另外,nil 作为逻辑变量的值,表示不成立,相当于 false。每一 个变量都占用一小部分内存,如果将某一
14、变量赋值为 nil,则相当于是取消该变量的定义, 并释放该变量所占用的内存空间。T、PI 及 PAUSE 均为常量。T 为逻辑变量的值,表示成 立,相当于 true;PI 表示一个实数型常量;PAUSE 表示一个双反斜杠()字符构成的字符 串常量,常与 Command 函数配合使用,用于暂停,等候用户输入。(4)变量的值域)变量的值域 AutoLISP 所使用的变量也分为局部变量和全局变量。 局部变量是指用户在某一个函数中定义的变量,它在函数执行过程中值被保存,函数 执行结束,变量则自动消失。局部变量由函数 defun 来定义。 全局变量是用 setq 函数定义的变量,它的值永久被保存,直到用
15、户退出程序为止。10.1AutoLISP 函数函数AutoLISP 提供功能齐全的各种函数。一般计算机语言所说的函数,AutoLISP 同样称 之为函数,一般计算机语言里的子程序、过程、运算符、程序流程控制的关键字,在 AutoLISP 里仍然被称之为函数。AutoLISP 将函数分为内部和外部函数。AutoLISP 提供的或用 AutoLISP 定义的函数为 内部函数,用 ADS、ADSRX 或 ARX 定义的函数为外部函数。在此,我们主要介绍常用的 几种内部函数,其它函数参考附录。 10.3.1 赋值函数赋值函数 AutoLISP 系统提供了以下函数供用户来为变量赋值。 (1)setqse
16、tq 函数函数(setq sym1 expr1 sym2 expr2 sym3 expr3) 返回值为最后一个变量的赋值。 例如: (setq n “ABC“ X 1 y 2),此式将使 x 的值为 1, y 的值为 2,n 的值为 ABC,并 最后返回结果 2。如果该表达式还有外层表达式,则该表达式返回的结果可参与运算。例 如:(+1 (setq n “ABC“ x 1 y 2),此式不仅进行上述赋值过程,还将(setq n “ABC“ x 1 y 2)返回的结果 2 参与加法运算,得到结果为 3。 (2)SetSet 函数函数(set sym expr) 函数返回值为变量的值。Set 函数与 setq 函数类似,但 set 把其参数中 sym 与 expr 均当做表达式来看待,分别进行求值运算后再进行赋值操作,而 setq 则仅对参数 expr 进行表