来自当知百科
跳转到: 导航搜索

  AutoLISP是由Autodesk公司开发的一种LISP程序语言(LISP是ListProcessor的缩写)。第一篇关于LISP的参考文献是由John McCarthy 在1960年4月的《ACM通讯》中发表的。

  除了FORTRAN和COBOL,大多数在六十年代早期开发出来的语言都过时了,可是LISP却生下来,并且已经成为人工智能(AI)的首选程序序言。AutoLISP解释程序位于AutoCAD软件包中,然而AutoCADR2.17及更低版本中并不包含AutoLISP解释程序,这样,只有通过AutoCADR2.18及更高版本才可以使用AutoLISP语言。

  AutoCAD软件包中包含大多数用于产生图形的命令,但仍有某些命令末被提供。例如,AutoCAD中没有在图形文本对象内绘制矩形及作全局改变的命令。通过AutoLISP,你可以使用AutoLISP程序语言编制能够在图形文本对象内绘制矩形或作全局选择性改变的程序。事实上,可以用AutoLISP编制任何程序,或把它嵌入到菜单中,这样定制你的系统会取得更高的效率。

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

  在本章中,我们假定读者已经熟悉了AutoCAD命令及AutoCAD的系统变量。但是,在开始学习AutoLISP时,却并不需要你是一位AutoCAD或编程专家。同时,本章还假定读者并无编程方面的知识。如果你熟悉任何一种编程语言,那么学习AutoLISP就会很容易。对各种函数的评细探讨以及对例题的逐步讲解会使你学起来很有兴趣。本章讨论常用的AutoLISP函数以及它们S程序编制中的应用。对于本章中未涉及的函数,请参阅Autodesk公司的《AutoLISP程序员参考手册》。AutoLISP对硬件没有任何特殊要求。如果系统能够运行AutoCAD,那么同样也可以运行AutoLISP。AutoLISP程序可以使用任何文本编辑器进行编制。

  14.2 数学运算

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

  1.加法

  格式(+ num1 num2 num3...)

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

  示例:

  Command:(+2 5)返回 7

  Command:(+2 30 4 50)返回86

  Command:(+2 30 4 50.0)返回 86.0

  2. 减法

  格式(- 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

  3.乘法

  格式(* 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

  4.除法

  格式( / 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

  14.3 增量、减量与绝对数字

  1.增量数字

  格式(1+ number)

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

  示例:

  (1+ 20)返回 21

  (1+ -10.5)返回-9.5

  2.减量数字

  格式(1- number)

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

  示例:

  (1- 10)返回9

  (1- 10.5)返回-11.5

  3.绝对数字

  格式(abs num)

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

  (abs 20)返回 20

  (abs -20)返回20

  (abs -20.5)返回20.5

  14.4 三角函数

  1.sin函数

  格式( sin angle)

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

  示例:

  Command:(sin 0)返回0.0

  Command:(sin Pi)返回0.0

  Command:(sin 1.0472)返回0.866027

  2.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

  3.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

  4.具有两个参数的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弧度

  5.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。

  14.5关系表达式

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

  1.等于

  格式(= atom1 atom2…)

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

  示例:

  (= 5 5)返回T

  (= 5 49)返回nil

  (= 5.5 5.5 5.5)返回T

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

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

  2.不等于

  格式(/= atom1 atom2…)

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

  示例:

  (/=50 4)返回T

  (/= 50 50)返回nil

  (/= 50 -50)返回T

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

  3.小于

  格式(<atom1 atom2…)

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

  示例:

  (< 3 5)返回T

  (< 5 3 4)返回nil

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

  4.小于等于

  格式(<= atom1 atom2...)

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

  示例:

  (<= 10 15)返回T

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

  (<= 2.0 0)返回T

  5.大于

  格式(> atom1 atom2…)

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

  示例:

  (> 15 10)返回T

  (>10 9 9)返回nil

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

  6.大于等于

  格式(>= atom1 atom2…)

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

  示例:

  (>= 78 50) 返回T

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

  7.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.01.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 被设置回初始值

个人工具
名字空间

变换
查看
操作
导航
工具箱