第十四章 AutolISP初步 第十四章 AutolISP 14.1关于 AutolIsP AutoLISP是由 Autodesk公司开发的一种LISP程序语言(LISP是 List processor的 缩写)。第一篇关于LISP的参考文献是由 John McCarthy在1960年4月的《ACM通讯》 中发表的 除了 FORTRAN和 COBOL,大多数在六十年代早期开发出来的语言都过时了,可是LISP 却生下来,并且已经成为人工智能(A)的首选程序序言。 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程序可以使用任何文本编辑器进 行编制 142数学运算 任何编程语言都提供数学函数。在 AutolISP中,同样提供了编程以及数学计算所需 的大部分数学函数,你可以使用 AutolISP对数字进行加、减、乘、除运算,还可以得到 以弧度表示的角度的正弦值、余弦值及反正切值等。使用 AutoLISP还可以进行许多其他 计算。这一节主要讨论 AutolISP程序语言支持的常用数学函数
第十四章 AutoLISP 初步 269 第十四章 AutoLISP 14.1 关于 AutoLISP AutoLISP 是由 Autodesk 公司开发的一种 LISP 程序语言(LISP 是 List Processor 的 缩写)。第一篇关于 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 程序可以使用任何文本编辑器进 行编制。 14.2 数学运算 任何编程语言都提供数学函数。在 AutoLISP 中,同样提供了编程以及数学计算所需 的大部分数学函数,你可以使用 AutoLISP 对数字进行加、减、乘、除运算,还可以得到 以弧度表示的角度的正弦值、余弦值及反正切值等。使用 AutoLISP 还可以进行许多其他 计算。这一节主要讨论 AutoLISP 程序语言支持的常用数学函数
第十四章 AutolISP初步 1加法 格式(+ numl num2num3…) 此函数(+)计算加号(+)右边所有数字的和(+mum1num2num3…)。这些数字可 以是整数或实数。如果均为整数,则和为整数:如果均为实数,则和为实数。但是如果既 有整数又有实数,则和为实数。如下所示,在前两个例子中,所有数字均为整数,所以结 果是整数。在第三个例子中,一个是实数(50.0),故结果为实数。 示例 Command:(+25)返回7 Command:(+230450)返回86 Command:(+230450.0)返回86.0 2.减法 格式(- numI numi2num3…) 此函数(一)从第一个数中减去第二个数(mum1-nun2)。如果多于两个数,就用第 个数字减去其后所有数字的和[mum1-(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)返回河0 Command:(-20.030.0)返回-10.0 3乘法 格式(*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 270
第十四章 AutoLISP 初步 270 1.加法 格式(+ 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 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
第十四章 AutolISP初步 4除法 格式(/num1num2num3…) 此函数(/)用第一个数除以第二个数。如果多于两个数,就用第一个数除以其后所 有数的乘积[num1/(mum2×mum3×…)]。在下面的第四个例子中,用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 14.3增量、减量与绝对数字 1增量数字 格式(1+ number) 此函数(1+)使数字与1(整数)相加,返回一个增加1的数。在下面的第二个例子 中,1与-10.5相加返回-9.5 示例: (1+20)返回 (1+-10.5)返回-9.5 2减量数字 格式(1- number) 此函数(1-)从数字中减去1(整数),并返回一个减去1的数。在下面的第二个例子 中-10.5减去1返回-1.5 示例 10)返回9 10.5)返回-11.5
第十四章 AutoLISP 初步 271 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
第十四章 AutolISP初步 3绝对数字 格式( abs num) abs函数返回一个数的绝对值。该数可以是整数或者实数。在下面的第二个例子中, 由于-20的绝对值为20,故函数返回20 (abs20)返回20 (abs-20)返回20 (abs-20.5)返回20.5 144三角函数 lsin函数 格式( sin angle) sin函数计算一个角(以弧度表示)的正弦值。在下面的第二个例子中,sin函数 计算Pi(180度)的正弦值并返回0。 Command:(sin0)返回0.0 Command:( sin pi)返回0.0 Command:(sin1.0472)返回0.866027 2cos函数 格式( cos angle) cos函数计算一个角(以弧度表示)的余弦值。在下面的第三个例子中,cos函数 计算Pi(180度)的余弦值并返回-1.0。 示例: Command:(cos0)返回1.0 Command:(cos0.0)返回1.0 Command:( cos Pi)返回-1.0 Command:(cos1.0)返回0.540302 3atan函数 格式( atan num1) atan函数计算数的反正切值,返回角度以弧度表示。下面的第二个atan函数计算
第十四章 AutoLISP 初步 272 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 函数计算
第十四章 AutolISP初步 1.0的反正切值并返回0.785398(弧度)。 示例 Command:(atan0.5)返回0.463648 Command:(atan1.0)返回0.785398 Command:(atan-1.0)返回-0.785398 4.具有两个参数的atan函数 格式( atan num1num2) 还可以在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弧度 5 antos函数 格式( antos angle[made[ precision]]) antos函数以字符串格式返回以弧度表示的角度值。字符串格式由made和 recision的设置决定。 示例 Command:( antos0.58800304)返回“33.6901” Command:( antos2.5535904)返回“145.3099” Command:( antos1.570804)返回“90.0000” Command:( antos-1.570802)返回“270.00” 注意在( antos angle [mode [precision])中 angle是以弧度表示的角度值。 mode是与 AutoCaD系统变量 AUNITS相对应的 antos模式 AutoCAD中可用模式如下 ANGTOS模式编辑格式 十进制角度 度/分/秒
第十四章 AutoLISP 初步 273 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 度/分/秒
第十四章 AutolISP初步 梯度 弧度 4 测量单位 precision是一个整数,用于控制小数的位数,与 AutoCAD系统变量 AUPREC相对应 其最小值为0,最大值为4 在上面的第一个例子中, angle为0.588003弧度,mode为0(十进制角度), precision为4(小数点后有四位)。函数返回33.6901 145关系表达式 在程序中,通常都需要测试某些特定的条件。若条件为真,程序执行某些功能,若不 为真,执行另外一些功能。例如,条件表达式(if(<X5)),若变量x的值小于5,测试 结果为真。编程过程中经常要用到这种类型的测试条件。本节讨论在 AutoLISP编程中要 用到的各种关系表达式 1等于 格式(= atomI atom2…) 该函数(=)检查两个元素是否相等。若相等,条件为真,函数返回T。同样,若指 定的元素不相等,条件为假,函数返回nil 示例 (=55)返回T (=549)返回nil (=5.55.55.5)返回T no”)返回nil 2不等于 格式(/= atom atom2…) 该函数(/=)检查两个元素是否不相等。若不相等,条件为真,函数返回T。同 样,若指定的元素相等,条件为假,函数返回nil 示例 (/=504)返回T (/=5050)返回nil (/=50-50)返回T (/=“yes”“no”)返回T
第十四章 AutoLISP 初步 274 2 梯度 3 弧度 4 测量单位 precision 是一个整数,用于控制小数的位数,与 AutoCAD 系统变量 AUPREC 相对应。 其最小值为 0,最大值为 4。 在上面的第一个例子中,angle 为 0.588003 弧度,mode为 0(十进制角度), precision 为 4(小数点后有四位)。函数返回 33.6901。 14.5 关系表达式 在程序中,通常都需要测试某些特定的条件。若条件为真,程序执行某些功能,若不 为真,执行另外一些功能。例如,条件表达式(if(< X 5)),若变量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
第十四章 AutolISP初步 3小于 格式( atom atom2 该函数(>)检查第一个元素(atom1)是否大于第二个元素(atom2)。若是,函数返 T,否则返回nil。在下面第一个例子中,15大于10,因此,关系表达式为真,且函数 返回T。在第二个例子中,10大于9,但9并不大于其后的9,因此函数返回nil 示例 (>1510)返回T (>1099)返回nil (>“c”“b”)返回T 6大于等于 格式(>= atom atom2…) 该函数(>=)检査第一个元素(atom1)的值是否大于等于第二个元素(atom2) 若是,函数返回T,否则返回nil。在下面第一个例子中,78大于但木等于50,因此,函
第十四章 AutoLISP 初步 275 3.小于 格式(<atom1 atom2…) 该函数(<)检查第一个元素(atoml)是否小于第H个元素(atomZ)。若为 真,函数返回T,否则返回 nil。 示例: (< 3 5)返回 T (< 5 3 4)返回 nil (< “x” “y”)返回 T 4.小于等于 格式(<= atom1 atom2…) 该函数( 15 10)返回T (>10 9 9)返回 nil (>“c”“b”)返回T 6.大于等于 格式(>= atom1 atom2…) 该函数(>=)检查第一个元素(atom1)的值是否大于等于第二个元素(atom2)。 若是,函数返回T,否则返回 nil。在下面第一个例子中,78 大于但木等于 50,因此,函 数返回T
第十四章 AutolISP初步 示例 (>=7850)返回T (>=“x”“y”)返回nil 146 defun、setq、 setpoint与 Command函数 1. defun函数 defun函数用于在 AutoLISP程序中定义函数,其格式为: (defun name [argument ]) 其中name ……函数名 ………参数列表 示例: ( defun adNum(),定义了一个函数 ADNUM,此函数天参数,亦无局部变量( Local symbols)。这就意味着程序中用到所有变量均为全局变量。全局变量的值在程序结束时不 会丢失。 ( defun adnum(abc),定义了一个含有三个参数a、b和c的函数 ADNUM。变量a、 b、c从程序外部获取它们的值 ( defun AdNUM(/ab),定义了一个含有两个局部变量a和b的函数 ADNUM。局部 变量在程序的执行期间保留其值,而且只能在它所在的程序中使用。 ( defun c:ADNM(),在函数名前加上C:后,此函数就可以通过在 AutoCAD的 Command:提示符后输入其函数名来执行。如果没有使用C:,函数名则必须置于圆括号中。 注意 AutolISP包含一些内置函数,不要使用其中的任一名称作为函数名或变量名 以下是一些 AutoLISP内置函数的保留名称列表。 Abs ads alloc and angle angtos append apply at Atof atoi distance equal fix float if length list load member Open or pi read repeat reverse set type while 2setq函数 setq函数用于给变量赋值,其格式如下 (setq name value [Name value].) 其中Name…………变量名 value ……赋予变量的值 赋予变量的值可以是任何表达式(数字表达式,字符串表达式或既含有字母又含有 276
第十四章 AutoLISP 初步 276 示例: (>= 78 50) 返回T (>= “x”“y”) 返回 nil 14.6 defun、setq、getpoint 与 Command 函数 1.defun 函数 defun 函数用于在 AutoLISP 程序中定义函数,其格式为: (defun name[argument]) 其中 name………………函数名 argument…………参数列表 示例: (defun ADNUM(),定义了一个函数 ADNUM,此函数天参数,亦无局部变量( Local symbols)。这就意味着程序中用到所有变量均为全局变量。全局变量的值在程序结束时不 会丢失。 (defun ADNUM (ab c),定义了一个含有三个参数a、 b和 c 的函数 ADNUM。变量a、 b、 c从程序外部获取它们的值。 (defun ADNUM(/a b),定义了一个含有两个局部变量a和b的函数 ADNUM。局部 变量在程序的执行期间保留其值,而且只能在它所在的程序中使用。 (defun C:ADNUM(),在函数名前加上C:后,此函数就可以通过在 AutoCAD 的 Command:提示符后输入其函数名来执行。如果没有使用C:,函数名则必须置于圆括号中。 注意 AutoLISP 包含一些内置函数,不要使用其中的任一名称作为函数名或变量名, 以下是一些 AutoLISP 内置函数的保留名称列表。 Abs ads alloc and angle angtos append apply atom ascii assoc atan Atof atoi distance equal fix float if length list load member nil Open or pi read repeat reverse set type while 2.setq 函数 setq 函数用于给变量赋值,其格式如下: (setq name value[Name value]…) 其中 Name…………………变量名 value…………………赋予变量的值 赋予变量的值可以是任何表达式(数字表达式,字符串表达式或既含有字母又含有
第十四章 AutolISP初步 数字的表达式)。若该值为字符串,其长度不可超过100个字符。 Command: (setq x 12) Command: (setq x 6.5) ommand: (setq x 8.5 y 12) 在最后一个表达式中,8.5被赋予变量X,12被赋予变量Y Command:( setq answer“YEs”) 这个表达式中,字符串值“YES”被赋给变量 answer s setq函数还可用于与其他表达式联合为变量赋值。下面的例子setq函数被用来为 不同的变量赋值。 (setq ptl ((getPoint "Enter start Point: ) (setq angl(getangle"Enter I nclud d angle: ") ( setq answer( gestating“ Enter yes or no:”) 注意]不要给 AutoLISP使用的一些内置函数名及符号赋值。下面的函数是有效的 但由于保留符号Pi及 angle将被重新定义,因此不要使用。 (setq Pi 3. 0) ( setq angle…) 3 setpoint函数 ge tpoint函数暂停程序的运行,允许用户输入一个点的X、Y坐标或X、Y、Z坐标。 该点的坐标可以由键盘或使用屏幕光标输入。 setpoint函数的格式为 (setPoint [Point] [Prompt ] 其中 point ·输入一个点,或选择一个点 prompt… ……将显示在屏幕上的提示 示例 (setg ptl (getpoint)) ( setq ptl( setPoint“ Enter start i n g Point》 注意不能输入其他的 Autol例程名来响应 setpoint函数。二维或三维的点 应考虑定义在当前用户坐标系统(UCS)下 4 Command函数 Command函数用于在 AutoLISP程序内部执行标准的 AutoCAD命令。 AutoCAD命令名及 命令选项必须置于双引号内。 Command函数的格式为: ( Command“ Commandname”) 其中 Command………… AutoLISP函数 Commandname………… . AutoCAD命令 例
第十四章 AutoLISP 初步 277 数字的表达式)。若该值为字符串,其长度不可超过 100 个字符。 Command:(setq x 12) Command:(setq x 6.5) Command:(setq x 8.5 y 12) 在最后一个表达式中,8.5 被赋予变量X,12 被赋予变量Y。 Command:(setq answer“YES”) 这个表达式中,字符串值“YES”被赋给变量 answer。 setq 函数还可用于与其他表达式联合为变量赋值。下面的例子 setq 函数被用来为 不同的变量赋值。 (setq pt1((getPoint“Enter start Point:)) (setq angl(getangle“Enter Included angle:”)) (setq answer(geststring“Enter YES or NO:”)) 注意 不要给 AutoLISP 使用的一些内置函数名及符号赋值。下面的函数是有效的, 但由于保留符号 Pi 及 angle 将被重新定义,因此不要使用。 (setq Pi 3.0) (setq angle…) 3.getpoint 函数 getpoint 函数暂停程序的运行,允许用户输入一个点的X、Y坐标或X、Y、Z坐标。 该点的坐标可以由键盘或使用屏幕光标输入。getpoint 函数的格式为: (getPoint[Point][Prompt]) 其中 point…………………输入一个点,或选择一个点 prompt…………………将显示在屏幕上的提示 示例: (setq Pt1(getpoint)) (setq Pt1(getPoint“Enter starting Point》 注意 不能输入其他的 AutoLISP 例程名来响应 getpoint 函数。二维或三维的点 应考虑定义在当前用户坐标系统(UCS)下。 4.Command 函数 Command 函数用于在 AutoLISP 程序内部执行标准的 AutoCAD 命令。AutoCAD 命令名及 命令选项必须置于双引号内。Command 函数的格式为: (Command “Commandname”) 其中 Command…………………AutoLISP 函数 Commandname……………AutoCAD 命令 示例:
第十四章 AutolISP初步 ( Command“line” Ptl Pt2“”) AutOCAD LINe命令 第一点 Pt2… ……第二点 用于返回 注匐在 AutoCAD r12之前的版本中,不能使用 Command函数执行 AutoC0.D0的Por 命令。例如,( Command“plot”…)是无效表达式。在 AutoCad2000、R14和R13中 才可以通过 Command函数使用plot命令( Command“plot”…)。 Command函数不能使用 AutoCaD的 DTEXT或TEXT命令输入数据。(可以用 Command 函数发出 DTEXT及TEX命令,还可以输入文本高度及旋转角度,但却不能在 DTEXT或TEXT 命令提示文本输入时输入文本)。 不能通过 Command函数使用 AutoLISP的输入函数。这些输入函数为 getpoin t、 getangle、 getstring及 getint。例如,( Command“ setPoint…)和( Command“ getangle…) 均为无效函数。如果程序中包含这样的函数,在其被装入时就会显示一条错误信息 例编写一个程序,该程序将提示用户选择三角形的三个顶点,并通过它们绘出如 图12.1所示的三角形。 多数程序都包含三个基本组成部分,即输入、输出及处理过程。其中处理过程的功 能为根据给定的输入来产生预期的输出(见图12-2)。 编写程序前,必须确认这三部分。 本例中,程序的输入为三个点的坐标,期望的输出为一个三角形。用以生成该三角 形的处理过程为:由P1到P2、由P2到P3、到P3到P1各画一条直线。弄清这三部分就 会使编程过程更清晰 处理过程对于程序的成功起着很重要的作用。有时它很简单,有时却包含复杂的计 算。如果程序包含大量运算,就应该把它分成若干个程序(甚至是子程序),并按逻辑的 顺序和系统的顺序安排好它们。同时请记住,程序需要随时修改,也很有可能被其他程序 员修改。因此,应尽可能使程序清晰、明了,以便其他程序员了解程序在其执行过程中的 不同阶段在做些什么。如果可能,请给出草图,并且说明要点 输入 输出 P1点的位置 P2点的位置 角形P1,P2,P3 P3点的位置 处理过程 从P1到P2画线 从P2到P3画线 从P3到P1画线 下面的文件是例1的 AuotlISP程序清单。右边的行号只为方便引用,并不是程序的 一部分。 this program will prom ter th of a triangle from the keyboard or select three points 2
第十四章 AutoLISP 初步 278 (Command“line” Pt1 Pt2“”) “line” ……………AutoCAD LINE命令 Pt1……………………第一点 Pt2……………………第二点 “”…………………用于返回 注意 在 AutoCAD R12 之前的版本中,不能使用 Command 函数执行 AutoCAD 的 PLOT 命令。 例如,(Command“plot”…)是无效表达式。在 AutoCAD 2000、 R14 和 R13 中, 才可以通过 Command 函数使用 plot 命令(Command“plot”…)。 Command 函数不能使用 AutoCAD 的 DTEXT 或 TEXT 命令输入数据。( 可以用 Command 函数发出 DTEXT 及 TEXT 命令,还可以输入文本高度及旋转角度,但却不能在 DTEXT 或 TEXT 命令提示文本输入时输入文本)。 不能通过 Command 函数使用 AutoLISP 的输入函数。这些输入函数为 getpoint、 getangle、getstring 及 getint。例如,(Command“getPoint…)和(Command“getangle…) 均为无效函数。如果程序中包含这样的函数,在其被装入时就会显示一条错误信息。 例 1 编写一个程序,该程序将提示用户选择三角形的三个顶点,并通过它们绘出如 图 12.1 所示的三角形。 多数程序都包含三个基本组成部分,即输入、输出及处理过程。其中处理过程的功 能为根据给定的输入来产生预期的输出(见图 12-2)。 编写程序前,必须确认这三部分。 本例中,程序的输入为三个点的坐标,期望的输出为一个三角形。用以生成该三角 形的处理过程为:由 P1 到 P2、由 P2 到 P3、到 P3 到 P1 各画一条直线。弄清这三部分就 会使编程过程更清晰。 处理过程对于程序的成功起着很重要的作用。有时它很简单,有时却包含复杂的计 算。如果程序包含大量运算,就应该把它分成若干个程序(甚至是子程序),并按逻辑的 顺序和系统的顺序安排好它们。同时请记住,程序需要随时修改,也很有可能被其他程序 员修改。因此,应尽可能使程序清晰、明了,以便其他程序员了解程序在其执行过程中的 不同阶段在做些什么。如果可能,请给出草图,并且说明要点。 输入 输出 P1 点的位置 P2 点的位置 三角形 P1,P2,P3 P3 点的位置 处理过程 从 P1 到 P2 画线 从 P2 到 P3 画线 从 P3 到 P1 画线 下面的文件是例 1 的 AuotLISP 程序清单。右边的行号只为方便引用,并不是程序的 一部分。 ;this program will prompt you to enter three points 1 ;of a triangle from the keyboard ,or select three points 2