autolisp(LISP程序语言)

2023-05-05 38阅读

温馨提示:这篇文章已超过442天没有更新,请注意相关的内容是否还可用!

autolisp

LISP程序语言

AutoLISP是由Autodesk公司开发的一种LISP程序语言,LISP是ListProcessor的缩写。通过autolisp编程,可以节省工程师很多时间。AutoLISP语言作为嵌入在AutoCAD内部的具有智能特点的编程语言,是开发应用AutoCAD不可缺少的工具。

例如,AutoCAD中没有在图形文本对象内绘制矩形及作全局改变的命令。通过AutoLISP,你可以使用AutoLISP程序语言编制能够在图形文本对象内绘制矩形或作全局选择性改变的程序。事实上,可以用AutoLISP编制任何程序,或把它嵌入到菜单中,这样定制你的系统会取得更高的效率。

中文名 autolisp
开发商 Autodesk公司
类型 LISP程序语言
功用 是开发应用AutoCAD的工具

开发软件

AutoCAD软件包中包含大多数用于产生图形的命令,但仍有某些命令未被提供。

现在,已经有数以百计的第三方软件开发人员使用AutoLISP语言编制各种应用程序软件包,例如,本文作者开发了一个名为SMLayout的软件包,用它可以产生各种复杂几何图形的平面布局图,这些几何图形包括管道的交叉部、过渡都、圆柱、弯管接头、圆锥以及罐顶。目前社会上非常需要AutoLISP程序员为应用软件及客户菜单的开发提供顾问。

在本章中,我们假定读者已经熟悉了AutoCAD命令及AutoCAD的系统变量。但是,在开始学习AutoLISP时,却并不需要你是一位AutoCAD或编程专家。同时,本章还假定读者并无编程方面的知识。

如果你熟悉任何一种编程语言,那么学习AutoLISP就会很容易。对各种函数的评细探讨以及对例题的逐步讲解会使你学起来很有兴趣。本章讨论常用的AutoLISP函数以及它们S程序编制中的应用。对于本章中未涉及的函数,请参阅Autodesk公司的《AutoLISP程序员参考手册》。AutoLISP对硬件没有任何特殊要求。如果系统能够运行AutoCAD,那么同样也可以运行AutoLISP。AutoLISP程序可以使用任何文本编辑器进行编制。

数学运算

任何编程语言都提供数学函数。在AutoLISP中,同样提供了编程以及数学计算所需的大部分数学函数,你可以使用AutoLISP对数字进行加、减、乘、除运算,还可以得到以弧度表示的角度的正弦值、余弦值及反正切值等。使用AutoLISP还可以进行许多其他计算。这一节主要讨论AutoLISP程序语言支持的常用数学函数。

加法

格式(+num1num2num3...)

此函数(+)计算加号(+)右边所有数字的和(+num1num2num3...)。这些数字可以是整数或实数。如果均为整数,则和为整数;如果均为实数,则和为实数。但是如果既有整数又有实数,则和为实数。如下所示,在前两个例子中,所有数字均为整数,所以结果是整数。在第三个例子中,一个是实数(50.0),故结果为实数。

示例:

Command:(+25)返回7

Command:(+230450)返回86

Command:(+230450.0)返回86.0

减法

格式(-num1num2num3...)

此函数(-)从第一个数中减去第二个数(num1-num2)。如果多于两个数,就用第一个数字减去其后所有数字的和[num1-(num2+num3...)]。在下面的第一个例子中,28减去14后返回14。因为两个数均为整数,结果亦为整数。在第三个例子中20与10.0相加,并用50减去两数的和(30.0),返回一个实数20.0。

示例:

Command:(-2814)返回14

Command:(-25711)返回7

Command:(-502010.0)返回20.0

Command:(-2030)返回-10

Command:(-20.030.0)返回-10.0

乘法

格式(*num1num2num3…)

此函数(*)计算乘号右边所有数字的乘积(num1×num2×num3...)。若均为整数,它们的乘积亦为整数;若其中含有一个实数,乘积即为实数。

示例:

Command:(*25)返回10

Command:(*253)返回30

Command:(*2532.0)返回60.0

Command:(*2-5.5)返回-11.0

Command:(*2.0-5.5-2)返回22.0

除法

格式(/num1num2num3…)

此函数(/)用第一个数除以第二个数。如果多于两个数,就用第一个数除以其后所有数的乘积[num1/(num2×num3×...)]。在下面的第四个例子中,用200除以5.0与4的乘积[200/(5.0×4)]。

示例:

Command:(/30)返回30

Command:(/32)返回1

Command:(/3.02)返回1.5

Command:(/200.05.04)返回10.0

Command:(/200-5)返回-40

Command:(/-200-5.0)返回40.0

增量数字

格式(1+number)

此函数(l+)使数字与1(整数)相加,返回一个增加1的数。在下面的第二个例子中,1与-10.5相加返回-9.5。

示例:

(1+20)返回21

(1+-10.5)返回-9.5

减量数字

格式(1-number)

此函数(1-)从数字中减去1(整数),并返回一个减去1的数。在下面的第二个例子中-10.5减去1返回-11.5。

示例:

(1-10)返回9

(1--10.5)返回-11.5

绝对数字

格式(absnum)

abs函数返回一个数的绝对值。该数可以是整数或者实数。在下面的第二个例子中,由于-20的绝对值为20,故函数返回20。

(abs20)返回20

(abs-20)返回20

(abs-20.5)返回20.5

三角函数

sin函数

格式(sinangle)

sin函数计算一个角(以弧度表示)的正弦值。在下面的第二个例子中,sin函数计算Pi(180度)的正弦值并返回0。

示例:

Command:(sin0)返回0.0

Command:(sinPi)返回0.0

Command:(sin1.0472)返回0.866027

cos函数

格式(cosangle)

cos函数计算一个角(以弧度表示)的余弦值。在下面的第三个例子中,cos函数计算Pi(180度)的余弦值并返回-1.0。

示例:

Command:(cos0)返回l.0

Command:(cos0.0)返回1.0

Command:(cosPi)返回-1.0

Command:(cos1.0)返回0.540302

atan函数

格式(atannum1)

atan函数计算数的反正切值,返回角度以弧度表示。下面的第二个atan函数计算1.0的反正切值并返回0.785398(弧度)。

示例:

Command:(atan0.5)返回0.463648

Command:(atan1.0)返回0.785398

Command:(atan-1.0)返回-0.785398

两个参数的atan函数

格式(atannum1num2)

还可以在atan函数中再指定一个数。若指定了第二个数,函数将以弧度形式返回(num1/num2)的反正切值。在下面的第一个例子中,第一个数(0.5)除以第二个数(1.0),atan函数计算商(0.5/1=0.5)的反正切值。

示例:

Command:(atan0.51.0)返回0.463648弧度

Command:(atan203.0)返回0.588003弧度

Command:(atan2.0-3.0)返回2.55359弧度

Command:(atan-2.03.00)返回-0.5880033弧度

Command:(atan-2.0-3.0)返回-2.55359弧度

Command:(atan1.00.0)返回1.5708弧度

Command:(atan-0.50.0)返回-1.5708弧度

angtos函数

格式(angtosangle[made[precision]])

angtos函数以字符串格式返回以弧度表示的角度值。字符串格式由made和precision的设置决定。

示例:

Command:(angtos0.58800304)返回“33.6901"

Command:(angtos2.5535904)返回“145.3099"

Command:(angtos1.570804)返回“90.0000"

Command:(angtos-1.570802)返回“270.00"

注意在(angtosangle[mode[precision]])中:

angle是以弧度表示的角度值。

mode是与AutoCAD系统变量AUNITS相对应的angtos模式。

AutoCAD中可用模式如下:

ANGTOS模式编辑格式

0十进制角度

1度/分/秒

2梯度

3弧度

4测量单位

precision是一个整数,用于控制小数的位数,与AutoCAD系统变量AUPREC相对应。其最小值为0,最大值为4。

在上面的第一个例子中,angle为0.588003弧度,mode为0(十进制角度),precision为4(小数点后有四位)。函数返回33.6901。

表达式

在程序中,通常都需要测试某些特定的条件。若条件为真,程序执行某些功能,若不为真,执行另外一些功能。例如,条件表达式(if(<X5)),若变量x的值小于5,测试结果为真。编程过程中经常要用到这种类型的测试条件。本节讨论在AutoLISP编程中要用到的各种关系表达式。

等于

格式(=atom1atom2…)

该函数(=)检查两个元素是否相等。若相等,条件为真,函数返回T。同样,若指定的元素不相等,条件为假,函数返回nil。

示例:

(=55)返回T

(=549)返回nil

(=5.55.55.5)返回T

(="yes"“yes”)返回T

(=“yes""yes"“no”)返回nil

不等于

格式(/=atom1atom2…)

该函数(/=)检查两个元素是否不相等。若不相等,条件为真,函数返回T。同样,若指定的元素相等,条件为假,函数返回nil。

示例:

(/=504)返回T

(/=5050)返回nil

(/=50-50)返回T

(/=“yes”“no”)返回T

小于

格式(

该函数(<)检查第一个元素(atoml)是否小于第H个元素(atomZ)。若为真,函数返回T,否则返回nil。

示例:

(<35)返回T

(<534)返回nil

(<“x”“y”)返回T

小于等于

格式(<=atom1atom2...)

该函数(<=)检查第一个元素(atom1)是否小于等于第二个元素(atom2),若是,函数返回T,否则返回nil。

示例:

(<=1015)返回T

(<=“c”“b”)返回nil

(<=2.00)返回T

大于

格式(>atom1atom2…)

该函数(>)检查第一个元素(atom1)是否大于第二个元素(atom2)。若是,函数返回T,否则返回nil。在下面第一个例子中,15大于10,因此,关系表达式为真,且函数返回T。在第二个例子中,10大于9,但9并不大于其后的9,因此函数返回nil。

示例:

(>1510)返回T

(>1099)返回nil

(>“c”“b”)返回T

大于等于

格式(>=atom1atom2…)

该函数(>=)检查第一个元素(atom1)的值是否大于等于第二个元素(atom2)。若是,函数返回T,否则返回nil。在下面第一个例子中,78大于但木等于50,因此,函数返回T。

示例:

(>=7850)返回T

(>="x"“y")返回nil

abs返回参数的绝对值

(absnumber)

参数number

返回值参数的绝对值

示例(abs100)返回100

(abs-3)返回3

8.acad_colordlg

显示标准的AutoCAD颜色选择对话框

(acad_colordlgcolornum[flag])

参数

colornum

整数,其取值范围是0-256(包括0和256),它用于指定颜色对话框的缺省的颜色代码。

flag

如可选参数flag设为nil,禁用“随层”和“随块”按钮;省略flag参数或将其设为非nil值,则可启用“随层”和“随块”按钮。

colornum为0时代表BYBLOCK(随块),为256时代表BYLAYER(随层)。

返回值

用户所选择的颜色代码,如果用户取消该对话框则返回nil。

示例

下列代码提示用户选择一种颜色,如果不选则指定绿色为缺省颜色:

(acad_colordlg3)

9.acad-pop-dbmod

恢复DBMOD系统变量的值到最近用acad-push-dbmod保存的值

(acad-pop-dbmod)该函数使用acad-push-dbmod控制DBMOD系统变量。DBMOD系统变量跟踪图形的修改状态和触发保存图形请求。

返回值

如果成功时返回T;否则,如果堆栈为空时,返回nil。

10.acad-push-dbmod

储存DBMOD系统变量的当前值

(acad-push-dbmod)

该函数使用acad-pop-dbmod来控制DBMOD系统变量。用户可使用该函数来更改图形而保持DBMOD系统变量不变。DBMOD系统变量跟踪图形的修改状态和触发保存图形请求。

该函数在acapp.arx中实现,acapp.arx默认状态下是加载的。该函数可将DBMOD系统变量的当前值转到内部堆栈。要使用acad-push-dbmod和acad-pop-dbmod,必须先进行acad-push-dbmod操作,再使用acad-pop-dbmod来恢复DBMOD系统变量的初始状态。

返回值

总是返回T。

示例

以下例子显示了怎样储存图形的修改状态,接着对图形进行修改,最后恢复初始状态。

(acad-push-dbmod)(setqnew_line'((0."LINE")(100."AcDbEntity")(8."0")(100."AcDbLine")(101.02.00.0)(112.01.00.0)(2100.00.01.0)))(entmakenew_line);DBMOD被设置标志1(command"_color""2");DBMOD被设置标志4(command"_-vports""_SI");DBMOD被设置标志8(command"_vpoint""0,0,1");DBMOD被设置标志16(acad-pop-dbmod);DBMOD被设置回初始值

嵌入目的

AUTOLISP嵌入AutoCAD的目的使用户充分利用AutoCAD进行二次开发;实现直接增加、修改AutoCAD的命令,随意扩大图形编辑功能,建立图形库和数据库并对当前图形进行直接访问和修改,开发CAD软件包等。

数据类型

符号(SYM)

字符串(STR)

表(LIST)

文件描述符(FILE)

AutoLISP的内部函数(SUBP)

AutoCAD的选择集(PICKSET)

AutoCAD的实体名(ENAME)

函数分页表(PAGETB)

典型应用

一、实现参数化绘图程序设计,包括尺寸驱动程序、鼠标拖动程序等。到目前为止,大多数参数化程序都是针对二维平面图形编制的。实际上,立体图同样可以实现参数化绘图,AutoCAD中编制实体的立体图参数化程序比其三维视图程序更简单,而且立体图生成后,可以很方便地生成三视图、剖面图和轴测图。

二、构成DCL文件创建自己的对话框。驱动利用AutoCAD提供的PDB模块构成DCL文件创建自己的对话框。

命令特点

可以直接调用AutoCAD中的全部命令;

具备一般高级语言的基本结构和功能;

具有强大的图形处理功能。

功能

1.AutoLISP语言是在普通的LISP语言基础上,扩充了许多适用于CAD应用的特殊功能而形成的,一种仅能以解释方式运行于AutoCAD内部的解释性程序设计语言。

2.AutoLISP语言中的一切成分都是以函数的形式给出的,它没有语句概念或其他语法结构。执行AutoLISP程序就是执行一些函数,再调用其他函数。

3.AutoLISP把数据和程序统一表达为表结构,即S-表达式处理,故也可把程序当作数据来处理,也可把数据当作程序来执行。

4.AutoLISP语言中的程序运行过程就是对函数求值过程,是在对函数求值过程中实现函数功能。

5.AutoLISP语言的主要控制结构是采用递归方式。递归方式的使用,使得程序设计简单易懂。

主要工具

文本编辑器、格式编排器、语法检查器、源代码调试器、检验和监视工具、文件编译器、工程程序系统、上下文相关帮助与自动匹配功能和智能化控制平台。

参考资料

1.简介·CSDN下载

目录[+]