标题：autolisp
基本介绍
第一篇关于LISP的参考文献是由John McCarthy 在1960年4月的《ACM通讯》中发表的。
除了FORTRAN和COBOL，大多数在六十年代早期开发出来的语言都过时了，可是LISP却生下来，并且已经成为人工智能（AI）的首选程序序言。AutoLISP解释程序位于AutoCAD软件包中，然而AutoCAD R2.17及更低版本中并不包含AutoLISP解释程序，这样，只有通过AutoCAD R2.18及更高版本才可以使用AutoLISP语言。
开发软件
AutoCAD软件包中包含大多数用于产生图形的命令，但仍有某些命令末被提供。例如，AutoCAD中没有在图形文本对象内绘制矩形及作全局改变的命令。通过AutoLISP，你可以使用AutoLISP程序语言编制能够在图形文本对象内绘制矩形或作全局选择性改变的程序。事实上，可以用AutoLISP编制任何程序，或把它嵌入到菜单中，这样定制你的系统会取得更高的效率。
现在，已经有数以百计的第三方软件开发人员使用AutoLISP语言编制各种应用程序软件包，例如，本文作者开发了一个名为SMLayout的软件包，用它可以产生各种复杂几何图形的平面布局图，这些几何图形包括管道的交叉部、过渡都、圆柱、弯管接头、圆锥以及罐顶。目前社会上非常需要AutoLISP程序员为应用软件及客户菜单的开发提供顾问。
在本章中，我们假定读者已经熟悉了AutoCAD命令及AutoCAD的系统变量。但是，在开始学习AutoLISP时，却并不需要你是一位AutoCAD或编程专家。同时，本章还假定读者并无编程方面的知识。如果你熟悉任何一种编程语言，那么学习AutoLISP就会很容易。对各种函数的评细探讨以及对例题的逐步讲解会使你学起来很有兴趣。本章讨论常用的AutoLISP函数以及它们S程序编制中的应用。对于本章中未涉及的函数，请参阅Autodesk公司的《AutoLISP程序员参考手册》。AutoLISP对硬件没有任何特殊要求。如果系统能够运行AutoCAD，那么同样也可以运行AutoLISP。AutoLISP程序可以使用任何文本编辑器进行编制。
数学运算
任何编程语言都提供数学函数。在AutoLISP中，同样提供了编程以及数学计算所需的大部分数学函数，你可以使用AutoLISP对数字进行加、减、乘、除运算，还可以得到以弧度表示的角度的正弦值、余弦值及反正切值等。使用AutoLISP还可以进行许多其他计算。这一节主要讨论AutoLISP程序语言支持的常用数学函数。
加法格式(+ num1 num2 num3...)
此函数（+）计算加号（+）右边所有数字的和(+ num1 num2 num3...)。这些数字可以是整数或实数。如果均为整数，则和为整数；如果均为实数，则和为实数。但是如果既有整数又有实数，则和为实数。如下所示，在前两个例子中，所有数字均为整数，所以结果是整数。在第三个例子中，一个是实数（50.0），故结果为实数。
示例：
Command:（+2 5）返回 7
Command:（+2 30 4 50）返回86
Command:（+2 30 4 50.0）返回 86.0
减法格式(- num1 num2 num3...）
此函数（－）从第一个数中减去第二个数（num1-num2）。如果多于两个数，就用第一个数字减去其后所有数字的和[num1-(num2+num3...)]。在下面的第一个例子中，28减去14后返回14。因为两个数均为整数，结果亦为整数。在第三个例子中20与10.0相加，并用50减去两数的和（30.0），返回一个实数20.0。
示例：
Command：(- 28 14) 返回14
Command：（- 25 7 11）返回7
Command：（－ 50 20 10.0）返回20.0
Command：（－ 20 30）返回河0
Command：（－ 20.0 30.0）返回-10.0
乘法格式（* num1 num2 num3…）
此函数（*）计算乘号右边所有数字的乘积( num1×num2×num3...)。若均为整数，它们的乘积亦为整数；若其中含有一个实数，乘积即为实数。
示例：
Command:(* 2 5) 返回10
Command:(* 2 5 3) 返回30
Command:(* 25 3 2.0) 返回60.0
Command: (* 2 -5.5) 返回-11.0
Command: (* 2.0 -5.5 -2) 返回22.0
除法[1]格式（ / num1 num2 num3…）
此函数（/）用第一个数除以第二个数。如果多于两个数，就用第一个数除以其后所有数的乘积[num1/（num2 × num3 ×...）]。在下面的第四个例子中，用200除以5.0与4的乘积[200/(5.0×4)]。
示例：
Command：（/ 30）返回 30
Command：（/ 3 2）返回1
Command：(/3.0 2) 返回 1.5
Command：（/ 200.0 5.0 4）返回 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
绝对数字格式(abs num）
abs函数返回一个数的绝对值。该数可以是整数或者实数。在下面的第二个例子中,由于-20的绝对值为20，故函数返回20。
（abs 20）返回 20
（abs -20）返回20
（abs -20.5）返回20.5
三角函数
sin函数格式( sin angle)
sin函数计算一个角（以弧度表示）的正弦值。在下面的第二个例子中，sin函数计算Pi（180度）的正弦值并返回0。
示例：
Command：（sin 0）返回0.0
Command：（sin Pi）返回0.0
Command：（sin 1.0472）返回0.866027
cos函数格式(cos angle)
cos函数计算一个角（以弧度表示）的余弦值。在下面的第三个例子中，cos函数计算Pi（180度）的余弦值并返回-1.0。
示例：
Command：（cos 0）返回l.0
Command：（cos 0.0）返回1.0
Command：（cos Pi）返回-1.0
Command：（cos 1.0）返回0.540302
atan函数格式( atan num1）
atan函数计算数的反正切值，返回角度以弧度表示。下面的第二个atan函数计算1.0的反正切值并返回0.785398（弧度）。
示例：
Command：（atan 0.5）返回0.463648
Command：（atan 1.0）返回0.785398
Command：（atan -1.0）返回-0.785398
具有两个参数的atan函数格式( atan num1 num2）
还可以在atan函数中再指定一个数。若指定了第二个数，函数将以弧度形式返回（num1/num2）的反正切值。在下面的第一个例子中，第一个数（0.5）除以第二个数(1.0)，atan函数计算商（0.5/1=0.5）的反正切值。
示例：
Command：（atan 0.5 1.0）返回0.463648弧度
Command：（atan 20 3.0）返回0.588003弧度
Command：（atan 2.0 -3.0）返回2.55359弧度
Command：（atan -2.0 3.00）返回-0.5880033弧度
Command：（atan -2.0 -3.0）返回-2.55359弧度
Command：（atan 1.0 0.0）返回1.5708弧度
Command：(atan -0.5 0.0)返回-1.5708弧度
angtos函数格式(angtos angle[made[precision]]）
angtos函数以字符串格式返回以弧度表示的角度值。字符串格式由made和 precision的设置决定。
示例：
Command：（angtos 0.588003 0 4）返回“33.6901"
Command：（angtos 2.55359 0 4）返回“145.3099"
Command：（angtos 1.5708 0 4）返回“90.0000"
Command：（angtos -1.5708 0 2）返回“270.00"
注意 在（angtos angle[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(< X 5)），若变量x的值小于5，测试结果为真。编程过程中经常要用到这种类型的测试条件。本节讨论在AutoLISP编程中要用到的各种关系表达式。
等于格式（= atom1 atom2…）
该函数（=）检查两个元素是否相等。若相等，条件为真，函数返回T。同样，若指定的元素不相等，条件为假，函数返回nil。
示例：
（= 5 5）返回T
（= 5 49）返回nil
（= 5.5 5.5 5.5）返回T
(= "yes"“yes”）返回T
（=“yes" "yes" “no”）返回nil
不等于格式（/= atom1 atom2…）
该函数（/=）检查两个元素是否不相等。若不相等，条件为真，函数返回T。同样，若指定的元素相等，条件为假，函数返回nil。
示例：
（/=50 4）返回T
（/= 50 50）返回nil
（/= 50 -50）返回T
（/= “yes” “no”）返回T
小于格式（<atom1 atom2…）
该函数（<）检查第一个元素（atoml）是否小于第H个元素（atomZ）。若为真，函数返回T，否则返回nil。
示例：
（< 3 5）返回T
（< 5 3 4）返回nil
（< “x” “y”）返回T
小于等于格式(<= atom1 atom2...）
该函数(<=)检查第一个元素(atom1)是否小于等于第二个元素(atom2),若是，函数返回T，否则返回nil。
示例：
(<= 10 15)返回T
（<=“c”“b”）返回nil
(<= 2.0 0)返回T
大于格式（> atom1 atom2…）
该函数（>）检查第一个元素(atom1) 是否大于第二个元素（atom2）。若是，函数返回T，否则返回nil。在下面第一个例子中，15大于10，因此，关系表达式为真，且函数返回T。在第二个例子中，10大于9，但9并不大于其后的9，因此函数返回nil。
示例：
（> 15 10）返回T
（>10 9 9）返回nil
（>“c”“b”）返回T
大于等于格式（>= atom1 atom2…）
该函数(>=)检查第一个元素（atom1）的值是否大于等于第二个元素（atom2）。若是，函数返回T，否则返回nil。在下面第一个例子中，78大于但木等于50，因此，函数返回T。 
示例：
(>= 78 50) 返回T
(>= "x"“y") 返回nil
abs 返回参数的绝对值(abs number)
参数 number
返回值 参数的绝对值
示例 (abs 100) 返回100
(abs -3) 返回3
8.acad_colordlg
显示标准的AutoCAD颜色选择对话框
(acad_colordlg colornum [flag])
参数
colornum
整数，其取值范围是 0-256 （包括 0 和 256），它用于指定颜色对话框的缺省的颜色代码。
flag
如可选参数 flag 设为 nil，禁用“随层”和“随块”按钮；省略 flag 参数或将其设为非 nil 值，则可启用“随层”和“随块”按钮。
colornum 为 0 时代表 BYBLOCK（随块），为 256 时代表 BYLAYER（随层）。
返回值
用户所选择的颜色代码，如果用户取消该对话框则返回 nil。
示例
下列代码提示用户选择一种颜色，如果不选则指定绿色为缺省颜色：
(acad_colordlg 3)
9.acad-pop-dbmod 
恢复 DBMOD 系统变量的值到最近用 acad-push-dbmod 保存的值
(acad-pop-dbmod) 该函数使用 acad-push-dbmod 控制 DBMOD 系统变量。DBMOD 系统变量跟踪图形的修改状态和触发保存图形请求。
该函数在 acapp.arx 中实现，acapp.arx 默认状态下是加载的。该函数可将 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)(setq new_line '((0 . "LINE") (100 . "AcDbEntity") (8 . "0") (100 . "AcDbLine") (10 1.0 2.0 0.0) (11 2.0 1.0 0.0) (210 0.0 0.0 1.0)))(entmake new_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嵌入CAD的目的
AUTOLISP嵌入AutoCAD的目的使用户充分利用AutoCAD进行二次开发；实现直接增加、修改AutoCAD的命令，随意扩大图形编辑功能，建立图形库和数据库并对当前图形进行直接访问和修改，开发CAD软件包等。
AutoLISP数据类型
符号 （SYM）
字符串　（STR）
表　 （LIST）
文件描述符　 （FILE）
AutoLISP的内部函数　 （SUBP）
AutoCAD的选择集 （PICKSET）
AutoCAD的实体名 （ENAME）
函数分页表 （PAGETB）
典型应用
一、实现参数化绘图程序设计，包括尺寸驱动程序、鼠标拖动程序等。到目前为止，大多数参数化程序都是针对二维平面图形编制的。实际上，立体图同样可以实现参数化绘图，AutoCAD中编制实体的立体图参数化程序比其三维视图程序更简单，而且立体图生成后，可以很方便地生成三视图、剖面图和轴测图。
二、构成DCL文件创建自己的对话框。驱动利用AutoCAD提供的PDB模块构成DCL文件创建自己的对话框。
AutoLISP的命令特点
可以直接调用AutoCAD中的全部命令；
具备一般高级语言的基本结构和功能；
具有强大的图形处理功能。
AutoLISP的功能
1.AutoLISP语言是在普通的LISP语言基础上，扩充了许多适用于CAD应用的特殊功能而形成的，一种仅能以解释方式运行于AutoCAD内部的解释性程序设计语言。
2.AutoLISP语言中的一切成分都是以函数的形式给出的，它没有语句概念或其他语法结构。执行AutoLISP程序就是执行一些函数，再调用其他函数。
3.AutoLISP把数据和程序统一表达为表结构，即S-表达式处理，故也可把程序当作数据来处理，也可把数据当作程序来执行。
4.AutoLISP语言中的程序运行过程就是对函数求值过程，是在对函数求值过程中实现函数功能。
5.AutoLISP语言的主要控制结构是采用递归方式。递归方式的使用，使得程序设计简单易懂。
AutoLISP主要工具
文本编辑器、格式编排器、语法检查器、源代码调试器、检验和监视工具、文件编译器、工程程序系统、上下文相关帮助与自动匹配功能和智能化控制平台。