当前位置:文档之家› 数字测图原理与应用——Lisp语言的学习和使用

数字测图原理与应用——Lisp语言的学习和使用

数字测图原理与应用——Lisp语言的学习和使用主要内容AutoLisp语言介绍AutoLisp语言的基本知识赋值与数值计算函数自定义函数程序分支与循环函数逻辑运算函数字符串与类型转换函数表处理函数交互数据输入函数及相关的计算函数与文件有关的函数实体和设备访问类函数其它函数一、AutoLisp语言介绍LISP(List Processing)是一种计算机的表处理语言。

LISP语言是人工智能领域中广泛应用的一种程序语言。

AutoLISP语言是一种运行在AutoCAD环境下的LISP编程语言,或称为AutoCAD的一种嵌入式语言。

它采用了与CommandLISP(一种通用的LISP语言版本)相近的语法及习惯约定,并吸收了LISP语言的主要函数,同时增加了针对AutoCAD特点的许多功能,如:可以把AutoLISP和AutoCAD的绘图命令透明地结合起来,使设计和绘图完全融为一体。

利用AutoLISP语言编程可以实现对AutoCAD当前图形数据库进行直接访问和修改。

在LISP语言中,最基本的数据类型是符号表达式。

LISP语言的特点是程序和数据都采用符号表达式的形式,即一个LISP程序可以把另一个LISP程序作为它的数据进行处理。

因此使用LISP语言编程十分灵活,看起来是一个一个的函数调用。

支持递归定义也是Auto LISP语言的重要特性。

AutoLISP语言是提供给用户的主要二次开发工具之一。

用AutoLISP语言编写应用程序,可以为AutoCAD增加新的命令或修改AutoCAD,以适应用户的特殊需要。

AutoCAD软件的开发者——AutoDesk公司许诺,将保证今后AutoCAD 软件对AutoLISP语言的支持。

掌握使用和编制AutoLISP应用程序的方法和技术将大大提高用户的工作效率和二次开发水平,增强AutoCAD的灵活性,并将得到长期、稳定的技术支持。

二、AutoLISP语言的基本知识2.1 AutoLISP语言的特性AutoLISP语言是一种解释型语言,它的特点如下:1.解释型语言编程语言有两种基本类型:解释型和编译型。

AutoLISP属于解释型语言。

在解释型语言中,用户编写的源程序直接由解释器解释并执行。

而在编译型的语言中,源代码首先要编译为一种中间格式(目标文件),然后再与所需的库文件链接,生成机器码可执行文件。

AutoCAD本身是用编译型语言写成的。

解释型语言的主要优点是在执行这种语言编写的程序之前不需要中间步骤,用户可以交互、独立于其它部分来试验或验证程序段或程序语句,而不需像编译型语言那样,每当试验程序时,要全部地编译和链接整个程序。

2.平台和操作系统独立AutoLISP语言的另一个优点是可移植性。

AutoLISP程序可以在运行于多种支持平台(如Windows、DOS、UNIX和Macintosh等)上的AutoCAD中执行而与CPU或操作系统无关。

3.AutoCAD的版本独立AutoLISP程序除平台和操作系统独立外,AutoLISP的设计还考虑了向下的兼容。

这样,任一版本AutoCAD编写的AutoLISP程序一般不加修改就可以在以后版本的AutoCAD中运行。

4.AutoLISP与主流编程语言的比较AutoLISP与目前使用比较多的编程语言(如C/C++,BASIC等)之间有一些明显的差别。

具体可体现在下述几个方面:(1)AutoLISP与其它大多数语言之间最重要的差别是它用表(List)存放数据。

AutoLISP........没有数组、联合、结构及记录,所有复杂的数据集均由表来表...........................示和处理....。

(2)AutoLISP的变量没有明确的类型。

LISP变量的类型是在赋值时动态确定的。

(3)AutoLISP不需要预先声明变量或函数。

(4)与C/C++,BASIC等语言不一样,LISP没有语句、关键词及运算符。

它是函数定位的语言,其所有运算都是由函数调用完成。

2.2 AutoLISP语言中的数据类型AutoLISP支持下述10种数据类型:●整型数●实型数●字符串●符号●表●文件描述符●AutoCAD实体名●AutoCAD选择集●内部函数(AutoLISP子程序)●外部函数(ADS、ARX函数)整型数整型数是一种不带小数点的数字,它可由0,1,2……,9,+,-共12个字符组成,例如:123,-76,+322等。

实型数实型数是带有小数点的数,它可由0,1,2……,9,+,-,E,e共14个字符组成。

实数有两种表示方法,即十进制表示法和科学计数表示法。

例如:十进制表示法:12.3,-7.6,+3.22科学计数表示法:6.1E5(610000),-0.12E2(-12),-0.45E-2(-0.0045)字符串字符串(字符串常数)由一对双引号(”)括起来的字符序列组成。

这对双引号是字符串的定界符。

字符串常数最大长度为132个字符,但表示字符串的符号名所约束的值可以是任意长度,因而可以利用“STRCAT“(字符串拼接)函数无限制地增加其长度。

字符串中,同一字母的大小写认为是不同的字符,空格是一个有意义的字符。

字符串的长度是指字符串一对双引号之间的字符个数(不包括一对双引号)。

如果字符串的定界符之间无任何字符(即””)称为空串,其长度为零。

字符串中可以包含ASCII码中任一字符,通用的表示形式为“\nnn“,nnn 为八进制形式的ASCII码。

例如:“\101\102 \103”表示“ABC”,两者的作用完全相同。

由于反斜杠“\”已作为字符串中的前导转义符,因而当字符串中要使用反斜杠时,必须加转义符,即用双反斜杠“\\”表示字符串中一个反斜杠“\”,也可以用反斜杠的ASCII码表示(即“\114”)。

同样,由于双引号已作为字符串的定界符使用,因而字符串中的双引号可以用“\””或“\042”表示。

对于一些常用的控制字符,其ASCII代码见下表。

字符代码表例如:下面的表达式表示在显示提示内容前先进行换行,然后再显示字符串内容。

(prompt “\nEnter filename:”)或(prompt “\012Enter filename:”)二者效果完全相同。

符号AutoLISP中符号用于存储数据,因此“符号”和“变量”这两个词含义相同,可以互相交换使用。

符号名可以由除下列6个字符外的任何可以打印的长度不限的字符序列来组成:“(”、“)“、“,”、“’”、“””、“;”,当这6个字符中的任一字符在符号名中出现时,将终止符号名。

不允许使用数字符号作为第一个字符。

下列为合法的符号名:ABC,!A,&AB,A3下列为不合法的符号名:(A),A.B,3A在AutoLISP中符号名的大小写是等价的。

LISP中“约束”是指对一对符号和值,当把一个值赋给一个符号时,也即把这个符号约束为那个值。

例如:(setq a 6)“!a”将显示6,表示a是一个整数,其值为6。

(setq a 6.0)“!a”将显示6.0,表示a是一个实数,其值为6.0。

(setq a “6.0”)“!a”将显示6,表示a是一个字符串,其值为“6.0”。

表表是指在一对相匹配的左右圆括号之间的元素的有序集合。

表中的每一项称为表的元素,表中的元素可以是整数、实数、字符串和符号,也可以是另一个表。

为了处理图形中点的坐标,AutoLISP对二维和三维点的坐标按如下规则表示:二维点:以分别代表x,y坐标的两个实数所构成的表(x y)的形式表示,如:(3.21 7.58)三维点:以分别代表x,y,z坐标的三个实数所构成的表(x y z)的形式表示,如:(3.21 7.58 4.68)。

表的大小用其长度来度量。

长度是表中顶层元素的个数。

例如:(setq a 6) 表的长度为3(setq a (+ c (/ d 2) ) ) 表的长度为3表有两种基本类型:标准表和引用表。

标准表是从左括号开始到配对的右括号结束。

表中的第一个元素(0号元素)必须是一个合法的已存在的AutoLISP函数。

引用表是在左括号前加一撇号,表示不对此表作求值处理.........................。

文件描述符当AutoLISP打开一个文件时,系统将给该文件赋一个数字标号,在以后要访问该文件时(读或写文件),可利用该文件描述符对指定的文件进行操作。

例如:打开一个名为:“myfile.dat”的文件,把打开文件时的文件描述符赋给符号f,再把“This is a sample under AutoLISP.”写入该文件。

(setq f (open “c:\\myfile.dat” “w”) )(print “This is a sample under AutoLISP.” f)实体名实体名是AutoCAD系统在绘图过程中赋予所绘实体的一个数字标号。

实际是指向一个AutoCAD系统内部的数据文件的一个指针。

例如:(setq elast (entlast) )注:entlast 是获取数据库中最新图元的名称。

选择集选择集一个或多个实体的集合。

它类似AutoCAD的实体选择过程。

在AutoLISP程序中也可以构造一个选择集,并把它赋予一个符号供其它函数使用。

例如:(setq ss (ssget “p”))子程序和外部子程序由AutoLISP提供的函数称为子程序(内部函数),外部子程序是由ADSRX或ARX应用程序定义的子程序。

2.3 程序结构C,VC,VB等采用“中缀表示法”例如:X=3.4AutoLISP采用的是“前缀表示法“例如:(setq x 3.4)表达式X=(A+B)*C在AutoLISP中表示为:(setq X (* ( + A B) C) )(setq a 2.3 )(setq b 6.7)(+ a b )(defun C:ff(/)(setq a 2.3 )(setq b 6.7)(setq c (+ a b ) ))2.4 求值、表达式及变量求值每个LISP程序的核心是一个求值器。

求值器读入用户的输入行(一个符号表达式),对其进行计算,然后返回计算结果。

AutoLISP的求值过程如下:(1)整形数、实型数、字符串对、文件指针和子程序以它们本身的值作为结果。

(2)符号以它们当前的约束值作为计算结果。

(3)表根据其第一个元素的类型来进行求值。

表达式所有AutoLISP表达式均为下述形式:(function_name [arguments]……)左边以左括号“(”开始,其后由函数名和函数的参数组成,最后以右括号“)”结束。

每个表达式都有一个返回值。

表达式的参数可以是一个表达式,它的返回值将被外层表达式使用。

变量AutoLISP的变量有四种类型:整型数、实型数、字符串和表。

相关主题