首页 理论教育 AutoLISP语言概述

AutoLISP语言概述

时间:2023-06-26 理论教育 版权反馈
【摘要】:3)AutoLISP语言的函数和数据的形式是一致的,都是符号表达式的形式。4)AutoLISP语言中程序的运行过程就是对函数求值的过程。5)AutoLISP语言的一个主要控制结构就是递归。因而常被AutoLISP解释程序忽略。其值总保持不变的内存变量称为常量,AutoLISP仅有一个常量Pi。AutoLISP程序进行计算并将结果存入一个内存变量中。AutoLISP命令解释程序可以追踪嵌套函数达到100级深度。

AutoLISP语言概述

1.AutoLISP语言的特点

1)AutoLISP语言是一种仅能以解释方式运行于AutoCAD内的程序设计语言,所以脱离AutoCAD环境它就不能运行。

2)AutoLISP语言是函数型语言,它的一切功能都由函数实现。因此执行AutoLISP程序就是执行一个函数,这个函数再调用其他函数。用AutoLISP语言进行程序设计就是定义自己需要的函数。

3)AutoLISP语言的函数和数据的形式是一致的,都是符号表达式的形式。

4)AutoLISP语言中程序的运行过程就是对函数求值的过程。AutoLISP的函数除完成一定的功能外,每个函数都有一个值,因此执行一个函数就可以理解成对函数求值。在对函数求值的过程中实现函数的功能。

5)AutoLISP语言的一个主要控制结构就是递归。递归的使用,使程序设计简单易懂。

2.基本语法结构

AutoLISP的语法书写在文本文件中,系统可读取文本文件并执行其中的指令。指令所用的语法结构必须按它的规则书写。

(1)AutoLISP语言的函数AutoCAD里面有一个数学计算器。这个计算器可在Auto-CAD软件包的命令行下使用。例如,在命令行下键入Command:(/84.0372.56)。

当使用AutoCAD进行数学计算时,实际上是在使用AutoCAD的AutoLISP解释程序。在上面的例子中,提供了一个函数名“/”,表示除法运算符,另外还提供了进行除法运算所需要的被除数和除数。AutoLISP解释程序计算完函数后,返回运算结果。此例中,运算结果为32.826950。

上述这个简单的数学函数,遵循某些适用于所有AutoLISP函数的通用规则。这些规则如下。

1)AutoLISP的函数要放在括号里面,LISP程序的所有括号都需要左右匹配。也就是说,一对括号包围单个函数。

2)AutoLISP解释程序阅读函数时,按从左向右的规则进行。

3)括号内的第一个字符串是函数运算符,是给AutoLISP解释程序的一条命令,告诉它做什么事情。在上面的例子中,命令是进行除法运算,这个命令的运算符是斜线(/)。

4)函数运算符与参数之间至少要一个空格来分开。

5)两个函数之间的和函数内不需要多余空格和回车。因而常被AutoLISP解释程序忽略。这也意味着在一个文本文件中,一个函数可以占许多行。

6)函数使用标准的ASCII字符,它们不分字符的大写和小写。但如果在程序设计时遵循一定的规则,将会有助于程序的阅读和维护。

下面再举几个简单的函数实例。

(+74.0373.56) 返回结果值77.597。

(-74.0373.56) 返回结果值70.477。

(∗74.0373.56) 返回结果值263.572。

AutoLISP主要提供了270多个预定义的函数。不同函数需要不同类型和不同数量的参数,许多函数所用的参数是可选择的。

(2)内存变量 内存变量是计算机能够组织、记忆、识别和供随后调用的信息的基本方式。

AutoLISP语言的内存变量以下面的方式进行工作:

1)内存变量是计算机随机存取存储器的一部分,是AutoLISP语言存放临时信息的地方。

2)当要建立一个内存变量时,应给它起一个名称,称为变量名。

3)当一个内存变量被建立和命名时,对它可赋值

4)当内存变量赋值时,以后的函数可通过使用变量名来使用这个值。计算函数时,每当遇到内存变量名,AutoLISP解释程序用内存变量的值来代替这个名字。

AutoLISP使用特殊的函数建立内存变量,并将内存变量与值联系起来。这个函数就是setq。它至少需要两个参数:第一个参数是内在变量名,第二个参数是内存变量的值。

例如(setq x 2)表达式的含义是“建立一个内存变量x,使它的值是整数2”。当Au-toLISP已计算了这个函数,(∗3.36 x)函数就有效了。AutoLISP用2代替x,3.36乘以2返回结果是6.72。若根据需要,可用setq函数重新将新值赋给x。

在AutoCAD的命令行下,键入一个惊叹号(!),紧随一个内存变量名,就会迅速得到内存变量的值。例如,已给内存变量x赋予了一个值2,在AutoCAD的命令行下,输入!x回车后,就会将内存变量x的当前值显示出来。

内存变量名不能包含空格字符或分隔符,并总是以字母开头。内存变量名的长度是任意的。不过取短一些,使用6个或更少的字符,AutoLISP程序则可更快地处理它,同时还节省了计算机内存。

内存变量的值可有各种类型。给内存变量取名时,最好能从变量名的形式就能看出变量所实际代表的值的用途。例如,使用像Pt(或XPt、YPt、Pt1、Pt2等)这样的内存变量来存放坐标信息。

其值总保持不变的内存变量称为常量,AutoLISP仅有一个常量Pi。Pi的值大约等于3.1415926。由于常量Pi的实际值可计算到十进制的无限位,所以使用常量比用十进制数更精确。

AutoLISP程序进行计算并将结果存入一个内存变量中。例如(setq m(/102)),这个函数用2去除10,并将计算结果存入新的内存变量m中去。这个例子展示了AutoLISP函数中十分常用的结构。

(3)嵌套 在一个过程中,函数的返回结果可以用作另一个函数的参数,这种用法称为嵌套。例如,(+11)的返回结果是2。

接下来观察(∗3.36(+11))函数,上述加法函数嵌套在乘法函数中了。这两个函数的组合运算结果是6.72。1加1函数称为二级嵌套函数,因为它是嵌套在另一个函数之中的。函数之中再嵌套函数的方法是AutoLISP程序中强有力的程序设计技术。AutoLISP命令解释程序可以追踪嵌套函数达到100级深度。对于嵌套函数的计算,AutoLISP命令解释程序是从嵌套在最深层的函数开始。

例如(-(∗3.36(+11))2)

AutoLISP命令解释程序遇到上面这样的表达式时,它首先作整数1加1的工作,返回结果是2;接着,将深一层的函数返回的结果2乘以3.36,结果是6.72;最后,从6.72中减去2,得到最后结果是4.72。这个4.72就是三层嵌套函数计算完后的最后结果。

(4)系统变量AutoLISP有一些专用的内存变量,称为系统变量。一个系统变量所包含的值与AutoCAD的绘图环境和当前绘图状态有关。AutoLISP有几百个这样预先定义的系统变量,当建立一个改变AutoCAD图形参数的LISP程序时,系统变量非常有用。详见Auto-CAD帮助主题。

(5)弧度 度量角度时,AutoLISP不使用度而使用弧度。在程序设计过程中,频繁地将度转换成弧度或将弧度转换成度是很不方便的。可以设计两个简单的AutoLISP函数来完成这一工作。

1)度转换成弧度函数

(defun dtr(a)

(∗pi(/a 180.0))

函数中的符号a是要转换成弧度的以度表示的角度值,pi是数学中的π常量。

2)弧度转换成度

(defu rtd(a)(www.xing528.com)

(∗(/a pi)180)

函数中的符号a是要转换成度的以弧度表示的角度值。

3.AutoLISP程序中的表达式

在AutoCAD命令行下键入遵循某些适用于所有AutoLISP函数的通用规则的文本串时,AutoCAD通过将它与系统内部的一个由有效命令名组成的表进行比较,从而对读者所键入的文本串的含义作出解释。如果读者键入的一个词与系统内部的命令名表中的一个词相匹配,AutoCAD就会把这些代码传送到AutoLISP解释器,并且对命令定义的函数进行求值。AutoLISP解释器的核心是求值器。该求值器读入一行LISP程序代码,对该行代码求值,然后返回求值的结果。求值器所处理的代码行必须以表达式的形式出现,该表达式既可以由AutoLISP程序从文件中读入,也可以从AutoCAD的命令行处由读者输入。

所有的AutoLISP表达式都具有(函数名 变元表)的形式。每一个表达式都以一个左括号打头,紧接着是一个函数名,然后是一个可任选的该函数的变元表,最后用一个右括号结束。函数的变元表中的每一个变元本身又可以是一个AutoLISP表达式。每一个表达式均返回一个可由它的外层表达式所使用的值。如果某一个表达式再没有外层表达式,AutoLISP就将该值返回到AutoCAD的命令行。以下面的引用了三个函数的表达式为例说明。

(fun1(fun2 arguments)(fun3 arguments))

第一个函数fun1有两个变元,fun2和fun3各自有一个(参数)变元。函数fun2和函数fun3的外层是函数fun1,这样它们的返回值就作为变元传递给funl。函数funl求这两个变元的值,再将返回值传递给命令行。

现在举一个具体的表达式(∗2(+510)(/5010))来说明它的求值过程:(∗2(+510)(/5010))→(∗2155)→150。

如果在嵌套表达式中,所使用的括号不匹配,即有左括号,没有相应的右括号与之匹配,AutoLISP会显示如下的提示:n>

n是一个整数,它表示还有多少个左括号没有与它相匹配的右括号。如果出现这样的提示,读者必须录入几个右括号才能开始对所录入的表达式求值。在文本串中忘掉闭合该文本串的一个双引号(”)是程序设计中常出现的错误。在该种情况下,AutoLISP解释器会把表达式的某些右括号当作文本串的一部分看待,这样会使本来左右括号匹配的表达式变成不匹配。若出现上述缺少右括号的出错信息时,读者用键入右括号的方法企图改正错误是无济于事的。这时只有按Ctrl+c两键或按Esc键中断函数的执行,重新以正确的形式录入。

在VLISP文本编辑器的窗口中,VLISP提供了许多工具,帮助读者检测括号的不平衡和不匹配情况。请参考Visual LISP帮助主题的Visual LISP开发人员手册→第二章用Visual LISP开发程序→检查语法错误→括号匹配检测。

AutoLISP求值器根据在括号中代码的顺序和数据类型来处理表达式。在充分运用Au-toLISP之前,了解AutoLISP不同的数据类型之间的差异和它们的使用方法是很有必要的。

1)子程序。约定由AutoLISP解释器提供的函数称之为子程序,子程序名的大小写是不加区别的。

2)整型数。整型数是不包含小数点的数。AutoLISP的整型数是一个32位的带符号的数,整型数的表示范围是+2147483648~-2147483647。虽然在内部AutoLISP使用32位值来表示数,但是在AutoLISP和AutoCAD之间的数的传递仍限制为16位值。由于这一限制的存在,读者不能传递一个大于+32767或小于-32768的值给AutoCAD。当表达式中使用一个整型数时,该值就会被当作一个常量看待。如2,-56和1200196等数都是有效的Au-toLISP整型数。

3)实型数。一个实型数是一个包含小数点的数。-1和1之间的实数在书写时必须加一个前导0。虽然在AutoCAD命令行显示出的实型数仅有6位有效数字,但在系统内部实型数是按照双精度浮点数格式存储的,并提供至少14位有效数值的精度。实型数可用科学记数制来表示,科学记数制是拥有一个任选的e或E,其后再跟随一个幂数的记数形式。例如,0.0000041与写为科学记数制形式的数4.1e-6是等价的。当表达式中使用一个实数时,它的值被作为一个常量看待。如3.1,0.23,-56.123和210000.0都是有效的AutoLISP实型数。

4)字符串。字符串是由双引号引起来的一组字符。

字符串内部的右下斜杠字符(\)后可用于安排控制字符(或换码字符)。

一个字符串变量中最多可以存放132个字符。当表达式中使用一个用双引号引起来的字符串时,该字符串的值被作为一个文字字符串常量或一个字符串常量看待。如,“请输入圆管直径D:”和“\n请输入第一点:”都是有效的字符串。

5)表。一个AutoLISP表是一组由空格分隔的相关值,并用括号将该组值括起来组成的。表为存储相关的数字值提供了有效方法,AutoCAD用三个实数组成的一个表来表达3维点。如(1.01.00.0)、(“this”“that”“the other”)和(1“ONE”)等都是有效的表。

6)选择集。选择集是由一个或多个对象(图元)组成的对象组。通过使用AutoLISP子程序,可以交互式地往选择集中加入对象,或者也可以从选择集中减去对象。下面的实例中使用AutoLISP的ssgst函数来返回包含了图形中全部对象的一个选择集。

命令:(ssget“x”)

<Selection set:1>

7)图元名。一个图元名是赋给图形中的对象的一个数字标示代码。图元名实际上是指向由AutoCAD保持的一个文件的指针,通过图元名AutoLISP就能找到该对象的数据库记录和它的矢量。图元名可由AutoLISP函数来引用,这样就可以用各种方法来选择要处理的对象。在系统内部,AutoCAD将对象作为图元看待。下面的实例中使用了entlast函数,来获得最后加入到图形中的那个对象的图元名。

命令:(entlast)

8)文件描述符。文件描述符是一个赋给由AutoLISP所打开的文件的字符数字标示代码。当一个AutoLISP函数需要从一个文件中读入信息或需要将信息写入到一个文件中去时,就要用到文件描述符。下面是一个为读文件myinfo.dat中的信息而首先将其打开的一个实例。

命令:(open“mylnfo.dat”“r”)

<File:#44614>

9)符号和变量。AutoLISP使用符号来访问数据。符号名的大小写是不加区别的,并且可以由任意字符数字序列和符号字符组成,但()_、”;五个字符除外。一个符号名不能仅由数字字符组成。实际AutoLISP应用程序是由符号或由常量值(如:字符串,实型数,整型数)组成的。为清楚起见,使用术语“符号”来指存储静态数据的一个符号名,例如内建式函数和读者定义函数名就是一个符号。使用术语“变量”来指存储程序数据的一个符号名。

下面的程序中,使用setq函数将一个字符串赋给变量str1:

命令:(setq str1“this is a string”)

“this is a string”

4.AutoLISP程序文件

AutoLISP代码可以在命令行上输入,但通常这只是调试程序的一种辅助手段。对于实用的AutoLISP程序,可以用Visual LISP文本编辑器将它编排成一个文本文件,然后把它加载到内存,进行测试和排错,最后形成一个可重复使用的AutoLISP程序。AutoLISP代码实际上是以ASCII文本文件的格式存储的,其文件名的扩展名是.LSP或.MNL。当然,使用Load函数加载程序时提供了完整的文件名的话(包括扩展名),就可以从任何ASCII文本文件中加载AutoLISP代码。

(1)AutoLISP原程序中注释的写法 为了阅读程序的方便,在AutoLISP源程序中通常需要写上注释。在源程序中写上注释,注释用分号(;)开始,作用至行尾。

(2)程序的缩格方式 在AutoLISP程序中过多地使用括号,会使程序变得很难阅读。采用适当的缩格和对齐方式,有助于程序的阅读和维护。AutoLISP程序采用的典型的缩格标准是从最外层开始,嵌套层次每深一层就向右缩进几个空格字符。

可用Visual LISP文本编辑器的“设置编辑窗口格式”或“设置选定代码格式”按钮,可以合理安排程序表达式的格式,使它更美观并增强代码的可读性。

5.AutoLISP的变量

一个AutoLISP变量会保持赋给它的值的数据类型。在将变量赋一个新值之前,变量会一直保持它的源值。AutoLISP的setq函数可以给变量赋值。

例如 命令:(setq val 3 abc 3.875)返回3.875

每一个变量都要消耗少量的内存,因此当变量的值不再有用时,将它的值设置成nil,就释放了存储该变量的值的那些存储器单元。这是良好的程序设计习惯。

AutoCAD提供了三个预定义变量,读者可以在应用程序中使用它们。

1)预定义变量PAUSE。该变量将单个右下斜杠(\)字符定义成一个字符串。这个变量由Command函数使用,可用于实现暂停,且让读者做输入。

2)预定义变量Pi。该变量定义成常量π(Pi)。它的近似值是3.1415926。

3)预定义变量T。该变量定义成常量T。它用作为非空值。

尽管上述变量已有意义,但读者还是可以用setq函数改变这几个变量的值。然而其他的应用程序为保持一致性,可能始终使用的是它们的预定义值,因此建议读者不要修改这些预定义变量的值。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈