为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

autolisp教程

2012-07-04 46页 pdf 852KB 45阅读

用户头像

is_544305

暂无简介

举报
autolisp教程 第十四章 AutoLISP初步 269 第十四章 AutoLISPAutoLISPAutoLISPAutoLISP 14.114.114.114.1 关于关于关于关于 AAAAutoLISPutoLISPutoLISPutoLISP AutoLISP 是由 Autodesk公司开发的一种 LISP 程序语言(LISP是 List Processor 的 缩写)。第一篇关于 LISP 的参考文献是由 John McCarthy 在 1960 年 4 月的《ACM 通讯》 中发表的。 除了 FORTRAN 和 COBO...
autolisp教程
第十四章 AutoLISP初步 269 第十四章 AutoLISPAutoLISPAutoLISPAutoLISP 14.114.114.114.1 关于关于关于关于 AAAAutoLISPutoLISPutoLISPutoLISP 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.214.214.214.2 数学运算数学运算数学运算数学运算 任何编程语言都 nowpei.com提供数学函数。在 AutoLISP中,同样提供了编程以及数 学计算所需的大部分数学函数,你可以使用 AutoLISP对数字进行加、减、乘、除运算, 还可以得到以弧度表示的角度的正弦值、余弦值及反正切值等。使用 AutoLISP 还可以进 行许多其他计算。这一节主要讨论 AutoLISP程序语言支持的常用数学函数。100029.cn 第十四章 AutoLISP初步 270 1.1.1.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.2.2.2. 减法 格式(- num1 num2 num3…) 此函数(-)从第一个数中减去第二个数(num1-num2)。如果多于两个数,就用第一 个数字减去其后所有数字的和[num1-(num2+num3…)]。在下面的第一个例子中,28减去 14后返回 14。因为两个数均为整数,结果亦为整数。kcar8.com在第三个例子中 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.3.3.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初步 271 4.4.4.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.314.314.314.3 增量、减量与绝对数字增量、减量与绝对数字增量、减量与绝对数字增量、减量与绝对数字 1.1.1.1.增量数字 格式(1+ number) 此函数(l+)使数字与 1(整数)相加,返回一个增加 1 的数。在下面的第二个例子 中,1 与-10.5相加返回-9.5。 示例: (1+ 20)返回 21 (1+ -10.5)返回-9.5 2.2.2.2.减量数字 格式(1- number) 此函数(1-)从数字中减去 1(整数),并返回一个减去 1 的数。在下面的第二个例子 中-10.5 减去 1返回-11.5。 示例: (1- 10)返回 9 (1- 10.5)返回-11.5 第十四章 AutoLISP初步 272 3.3.3.3.绝对数字 格式(abs num) abs 函数返回一个数的绝对值。该数可以是整数或者实数。在下面的第二个例子中, 由于-20的绝对值为 20,故函数返回 20。 (abs 20)返回 20 (abs -20)返回 20 (abs -20.5)返回 20.5 14.414.414.414.4 三角函数三角函数三角函数三角函数 1.1.1.1.sinsinsinsin函数 格式( sin angle) sin函数计算一个角(以弧度表示)的正弦值。在下面的第二个例子中,sin 函数 计算 Pi(180 度)的正弦值并返回 0。ghzmd.com 示例: Command:(sin 0)返回 0.0 Command:(sin Pi)返回 0.0 Command:(sin 1.0472)返回 0.866027 2.2.2.2.coscoscoscos函数 格式(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.3.3.3.atanatanatanatan函数 格式( atan num1) atan 函数计算数的反正切值,返回角度以弧度表示。下面的第二个 atan函数计算 第十四章 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.4.4.4.具有两个参数的 atanatanatanatan函数 格式( 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.5.5.5.angtosangtosangtosangtos函数 格式(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初步 274 2 梯度 3 弧度 4 测量单位 precision 是一个整数,用于控制小数的位数,与 AutoCAD系统变量 AUPREC 相对应。 其最小值为 0,最大值为 4。 在上面的第一个例子中,angle 为 0.588003 弧度,mode为 0(十进制角度), precision为 4(小数点后有四位)。函数返回 33.6901。 14.514.514.514.5关系表达式关系表达式关系表达式关系表达式 在程序中,通常都需要测试某些特定的条件。若条件为真,程序执行某些功能,若不 为真,执行另外一些功能。例如,条件表达式(if(< X 5)),若变量x的值小于 5,测试 结果为真。编程过程中经常要用到这种类型的测试条件。本节讨论在 AutoLISP 编程中要 用到的各种关系表达式。 1.1.1.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.2.2.2.不等于 格式(/= atom1 atom2…) 该函数(/=)检查两个元素是否不相等。若不相等,条件为真,函数返回T。同 样,若指定的元素相等,条件为假,函数返回 nil。 示例: (/=50 4)返回T (/= 50 50)返回 nil (/= 50 -50)返回T (/= “yes” “no”)返回T 第十四章 AutoLISP初步 275 3.3.3.3.小于 格式(<atom1 atom2…) 该函数(<)检查第一个元素(atoml)是否小于第H个元素(atomZ)。若为 真,函数返回T,否则返回 nil。 示例: (< 3 5)返回 T (< 5 3 4)返回 nil (< “x” “y”)返回 T 4.4.4.4.小于等于 格式(<= atom1 atom2…) 该函数(<=)检查第一个元素(atom1)是否小于等于第二个元素(atom2),若是,函数 返回T,否则返回 nil。 示例: (<= 10 15)返回 T (<=“c”“b”)返回 nil (<= 2.0 0)返回 T 5.5.5.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.6.6.6.大于等于 格式(>= atom1 atom2…) 该函数(>=)检查第一个元素(atom1)的值是否大于等于第二个元素(atom2)。 若是,函数返回T,否则返回 nil。在下面第一个例子中,78大于但木等于 50,因此,函 数返回T。 第十四章 AutoLISP初步 276 示例: (>= 78 50) 返回T (>= “x”“y”) 返回 nil 11114444.6.6.6.6 defundefundefundefun、、、、setqsetqsetqsetq、、、、getpointgetpointgetpointgetpoint与与与与 CommandCommandCommandCommand函数函数函数函数 1.defun1.defun1.defun1.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.setq2.setq2.setq2.setq函数 setq 函数用于给变量赋值,其格式如下: (setq name value[Name value]…) 其中 Name…………………变量名 value…………………赋予变量的值 赋予变量的值可以是任何表达式(数字表达式,字符串表达式或既含有字母又含有 第十四章 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.getpoint3.getpoint3.getpoint3.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.Command4.Command4.Command4.Command 函数 Command函数用于在 AutoLISP程序内部执行的 AutoCAD 命令。AutoCAD命令名及 命令选项必须置于双引号内。Command函数的格式为: (Command “Commandname”) 其中 Command…………………AutoLISP函数 Commandname……………AutoCAD 命令 示例: 第十四章 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 第十四章 AutoLISP初步 279 ;by using the screen cursor .P1,P2,P3 are triangle corners. 3 4 (defun: C:triang1() 5 (setq P1(getPoint“\n Enter first Point of triangle:”)) 6 (setq P2(getPoint“\n Enter second Point of triangle:” 7 (setq P3(getPoint“\n Enter third Point of triangle:”)) 8 (Command“line” P1 P2 P3“C”) 9 ) 10 说明 第 1-3 行 前三行为注释行,用于描述程序中的函数。这几行很重要因为有它们,编辑程序会变 得简单一些。可以在任何必要的时候使用注释。所有的注释行都必须以分号(;)开头, 当程序装入时这些行会被忽略。 第 4 行:行为空行,用于分隔程序与注释部分。空行还可以用来分隔程序的不同模块。 这样便于区分程序的不同部分。空行对程序没有影响。 第 5 行:(defun C: triang1() 本行中,defun为一个 AutoLISP 函数,它定义了函数 TRIANG1。TRIANG1为该函数的 函数名。由于此函数名前带有C:,因此该函数可以像 AutoCAD 命令一样被执行。若没有 C:, TRIANG1 命令只能置于圆括号中执行(TRIANG1)。此函数带有三个全局变量(P1,P2, P3)。第一次编写 AutoLISP程序时,保持变量为全局变量是个好习惯。这是因为装入并运 行程序后,可以通过在 AutoCAD命令提示行中输人感叹号(!)并在其后输入变量名来检 查变量的值(Command:!P1)。一旦程序通过测试并运行正常,就应该使它们成为局部变 量(defun c:TRIANG1(/P1 P2 P3) 第 6 行:(setq P1(getpoint“\n Enter first Point of triangle:”)) 本行中,getpoint 函数暂停程序的运行,允许用户输入三角形的第一个点。提示信息 Enter first Point of triangle显示在屏幕的提示区内。可以通过键盘输入该点的坐 标,也可以用屏幕光标选择该点。随后 setq函数将这些坐标赋予变量 P1。\n的作用是 回车,其后的表达式将被打印在下一行上(“n”代表“newline”) 第7行和第 8 行:(setq P2(getpoint“\n Enter second Point of triangle:”)) 及(setq P3(getpoint“\n Enter third Point of triangle:”)) 这两行提示用户输入三角形的第二个顶点和第三个顶点,随后把这些坐标赋予P2 和 P3。\n的作用是回车,因此输入提示显示在下一行中。 第 9 行:(Command“line” P1 P2 P3“C”) 本行中,Command 函数用来输入 AutoCAD 的 line 命令,然后从 P1 到 P2,P2 到 P3 各 画一条直线。“C”(表示“close”选项)把最后一点P3 与第一点 P1 连接起来。所 有的AutoCAD命令及选项在AutoLISP程序中使用时都必须置于双引号内。变量P1、P2. P 3之间用空格分隔。 第 10 行 本行仅包含一个用于表明函数 TRIANG1 定义完成的右括号。该括号也可以写在上一行 第十四章 AutoLISP初步 280 中。把它单独放在一行是一个好习惯,因为这样做任何程序员都可以很容易的确定定义已 结束。然而某些程序中,同一程序内的多个定义及模块需要明确区分开。括号及空行有助 于明确定义或程序段的起始和结束。 11114444....7装入一个7装入一个7装入一个7装入一个 AutoLISPAutoLISPAutoLISPAutoLISP程序程序程序程序 一般来说与一个 AutoLISP 程序相关的名称有两个:程序文件名和函数名。例如, TRIANG1.LSP是一个文件名,而不是函数名。所有的 AutoLISP文件名均以.LSP 为扩展名。 一个 AutoLISP 文件可以包含一个或多个函数定义。例如,例 1 中的 TRIANG1 是一个函数 名。要执行一个函数,必须装入定义该函数的 AutoLISP 程序文件。在图形编辑器中使用 如下命令装入一个 AutoLISP文件。 Command:(load“[path]filename”) 其中 Command…………………AutoCAD命令提示行 load……………………装入一个 AutoLISP 程序文件 [path]filename……………AutoLISP 程序文件的路径及名称 AutoLISP 文件名及可选的路径名必须置于双引号内。load及 filename 必须放在括号 中。若没有括号,AutoCAD将试图装人一个图形或文本字体文件,而不是 AutoLISP文件。 load同 filename 间的空格也可省略。如果 AutoCAD成功的装入了该文件,函数名将会显 示在屏幕的 Command 提示区内。要执行该程序,在 AutoCAD 的 Command:提示行中键人函 数的名称,并按下 Enter键,(Command:TRIANG1)。如果程序中函数名前没有C:,可以 通过将函数名置于括号中的形式运行该程序: Command:TRIANG1或 Command:(TRIANG1) 注意 定义待装入的 AutoLISP 程序的路径时应使用斜杠。例如,如果 AutoLISP 文件 triang 存放在C驱动器的 LISP 子目录中,使用如下命令装入该文件。还可以使用双反斜 杠 (\\) 代 替 斜 杠 。 command :( load “ c:/lisp/triang ”) 或 command :( load “c:\\lisp\\triang”) 还可以通过使用标准的 windows拖放技术装人一个应用程序。要装人一个 LISP 程序, 一种方法是在 Windows的资源管理器中选中该文件,并拖放到 AutoCAD的图形窗口中,选 中的程序将自动装入。还有一种装入 AutoLISP 程序的方法,就是使用 load /unload application对话框。 该对话框可通过在 tools 菜单中选择 load applications 或在 AutoCAD 命令提示行 中输入 appload 将其显示。 loadloadloadload/unloadunloadunloadunload applicationapplicationapplicationapplication对话框 可使用 load/unload application对话框(见图 12 习)装入 LSP、 VLX、 FAS. VBA、 DBX及 ObjectARX 应用程序。 VBA、DBX及 ObjectARX文件被选中时会立即装入;LSP、VLX 及 FAS 文件在 load/unload application 对话框关闭时装人。该对话框的顶部列出了选 第十四章 AutoLISP初步 281 中目录中的文件。文件的类型可以通过在 file of type 编辑框中输入(.lsp)或通过在下 拉列表框中选择来改变。选择一个文件并点击 LOAD 按钮可以装入该文件。以下为 load/ unload application对话框其他特性的描述: 1.load Load 按钮可用于装人或重新装入选中的文件,文件可以从文件列表框, Load Application标签或 History List 标签中选取。 ObjectARX 文件不能重新装入,必须先 卸载该 ObjectARX 文件,然后再次装入。 2.Load Application标签 选择 Load Application 标签后, AutoCAD会显示出当前已装人的应用程序。可以 向该列表中添加文件,方法是从文件列表框中拖动文件名到 Load Applications列表中。 History List标签 选择 History List 标签后, AutoCAD 会显示出以前通过选中 Add to History 复 选框装入的文件列表。如果未选中该复选框,拖放 History List中的文件会装入该文件, 但木将其添加到 History List中。 3.add to History 选中 Add to History 复选框后,拖放 History List 中的文件会使其自动添加到 History List 中。 4.unload Unload 按钮在选中 Loaded Applications 标签时出现。要卸载一个应用程序,在 Loaded Applications 文件列表中选中该文件名,然后选择 unload 按钮。未注册卸载的 lisp文件及 ObjectARX文件不能卸载。 5. Remove Remove 按钮在选中 History List 标签时出现。要从 History List 中移除一个 文件,选中该文件并选择 Remove按钮。 6. Startup Suite 每次 AutoCAD启动时都会自动装人 Startup Suite 中的文件。选中 Startup Suite 后, AutoCAD会显示出包含一个文件列表的 Startup Suite对话框。可以选择 Add按钮向 该列表中添加文件,还可以从文件列表框中拖放文件到 Startup suit1中。要从 History List中添加文件,右去该文件。 练习 1 编写一个在两点间画线的 AutoLISP程序(见图 12-4)。该程序必须提示用户输入两 点的X、Y坐标。 14.814.814.814.8 getcornergetcornergetcornergetcorner、、、、getdistgetdistgetdistgetdist与与与与 setvarsetvarsetvarsetvar函数函数函数函数 1111.getcorner.getcorner.getcorner.getcorner函数 getcorner函数暂停程序的运行,等候用户输入一个点的坐标。可以用键盘或使用屏 第十四章 AutoLISP初步 282 幕光标将其输入。该函数需要一个基点,在屏幕上移动屏幕光标时将根据该基点显示矩形。 Getcorner函数格式为: (getcorner Point[Prompt]) 其中 Point ……………… 基点 prompt ……………… 显不在屏幕上的提示信息 示例:(getcorner pt1) (setq pt2(getcorner pt1)) (setq pt2(getcorner pt1“Enter second Point)) 注意 基点及响应 getcorner函数所选择的点均是关于当前 UCS定位的。 若选择的是带有 X,Y,Z坐标的 3D点,FZ 坐标将被忽略。该点假定当前高度为 其Z坐标。 2.getdist2.getdist2.getdist2.getdist函数 getdist 函数暂停程序的运行,等候用户输入距离,随后以实数形式返回该距离。 getdist函数格式为: (getdist[Point][Prompt]) 其中 Point…………………距离的第一点坐标 Prompt………………须在屏幕上显示的提示信息 示例:(getdist) (setq dist(getdist)) (setq dist(getdist pt1)) (setq dist(getdist“Enter distance”》 (setq dist(getdist pt1“Enter second Point for distance”)) 可以在屏幕上选择两个点来输入距离。例如,若赋值语句为(setq dist(getdist)), 可以输入数字或选择两个点;若赋值语句为(setq dist(getdist pt1)),这里的第一点 (pt1)已经定义,只须选择第二点。getdist函数总是返回以实数表示的距离。例如,如 果当前设置为 architecture并且以 architecture单位输入了距离,getdist函数将以实 数形式返回该距离。 3.setvar3.setvar3.setvar3.setvar函数 setvar 函数用于给 AutoCAD系统变量赋值。系统变量名必须置于双引号中。 setvar 函数格式为: (setvar“variable-name value) 其中 variable name…………AutoCAD系统变量 value……………………赋予系统变量的值 示例:(setvar“cmdecho” 0) 第十四章 AutoLISP初步 283 (setvar“dimscale”1.5) (setvar “Ltscale”0.5) (setvar“dimcen” 0.25) 例 2 编写一个 AutoLISP 程序,在给定的两条线间通过输入倒角角度及倒角距离生成 一个倒角。AutoCAD 使用赋予系统变量 ChamferA 和 ChamferB 的值生成该倒角。当选择了 AutoCAD 的 Chamfer 命令后,第一个倒角及第二个倒角的距离被自动赋予系统变 量 ChamferA 及 ChamferB。随后 Chamfer 命令使用这些值生成一个倒角。然而,在多数工程 图中,人们更喜欢通过输入倒角长度及倒角角度的方式来生成倒角,如图 12-5 所示。 输入 输出 第一个倒角距离(D) 任意两条选中直线间的倒角 倒角角度(A) 处理过程 计算过程 l.计算第二个倒角的距离 x/d=tan a 2.将这些值赋予系统变量 ChamferA 和 ChamferB x=d*(tan a) 3.使用 AutoCAD的 Chamfer 命令生成倒角。 =d*[(sin a)/(cos a)] 下面的文件是例 2 的程序清单。右边的行号只为方便引用,并不是文件的一部分。 ;This program generates a chamfer by entering 1 ;the chamfer angle and the chamfer distance 2 ; 3 (defun c:chamfer(/ d a) 4 (setvar“cmdecho”0) 5 (graphscr) 6 (setq d(getdist“\n Enter chamfer distance:”)) 7 (setq a(getangle“\n Enter chamfer angle:”)) 8 (setvar“chamfera”d) 9 (setvar“chamferb”( d(/sin a (cos a)))) 10 (Command“chamfer”) 11 (setvar“cmdecho”l) 12 (princ) 13 ) 14 说明 第十四章 AutoLISP初步 284 cmdecho系统变量:控制 AutoLISP 的 command 函数运行时 AutoCAD 是否回显提示 和输入。 第7行:(setq d(getdist“\n Enter chamfer distance:”)) getdist函数暂停程序的运行,等候用户输入倒角距离,随后 setq函数将该值赋予变 量d。 第 8 行:(setq a(getangle“\n Enter chamfer angle:”)) getangle 函数暂停程序的运行,等候用户输入倒角角度,随后 setq 函数将该值赋予 变量a。 第 9 行: setvar“chamfera’ d) setvar 函数将变量d的值赋予 AutoCAD系统变量 chamfera。 第 10 行: (setvar“chamferb”( d(/sin a (cos a)))) setvar 函数将从表达式(*d(/(sin a)(cos a)))中取得的值赋予 AutoCAD 系 统变量 chamferb。 第 11 行:(Command“chamfer) Command函数使用 AutoCAD CHAMFER命令生成倒角。 练习 2 编写一个 AutoLISP 程序,生成图 12-6 所示的图形。该程序应该提示用户输入 P1点和P2 点以及 D1 和 D2 的直径。 14.914.914.914.9 ListListListList函数函数函数函数 List函数用于定义一个二维或三维点。若表达式中不包含任何变量及未定义项,则该 函数还可以使用单引号(’)命名。 示例(setq x(List 2.5 3.56)) 返回 2.5,3.56 (setq x’(2.5 3.56)) 返回 2.5,3.56 第十四章 AutoLISP初步 285 14.1014.1014.1014.10 carcarcarcar、、、、cdrcdrcdrcdr与与与与 cadrcadrcadrcadr函数函数函数函数 1.1.1.1.carcarcarcar函数 car函数返回一个表中的第一个元素。若表中不包含任何元素,函数返回 nil。 car函数格式为:(car List) 其中 car………返回第一个元素 list………元素列表 示例:(car‘(2.5 3.56)) 返回 2.5 (car‘(x y z)) 返回 X (car‘((15 20) 56)返回(15 20) (car‘())返回 nil 其中的单引号表示~个表。 2.2.2.2.cdrcdrcdrcdr函数 cdr函数返回一个移去了表的第一个元素后的列表,其格式为(cdr List) 其中 cdr ………返回第一个元素被移去的列表 list………元素列表 示例:(cdr‘(2.5 3.56)) 返回(3.56) (cdr‘(x,y,z) 返回(y,z) (cdr‘((15 20)56) 返回( 56) (cdr‘()) 返回 nil 3.3.3.3.cadrcadrcadrcadr函数 cadr 函数执行两个操作,cdr 和 car,返回列表中第二个元素。cdr函数移去了第一 个元素。car函数返回新表中的第一个元素。、cadr 函数的格式为:(cadr List) 其中 cadr………执行两个操作( car(cdr‘(x y z))) List………元素列表 示例:(cadr‘(2 3)) 返回 3 (cadr‘(2 3 56)) 返回 3 ( cadr‘(x y z)) 返回y (cadr‘((15 20) 56 24))返回 56 这些例子中, cadr执行两个操作 (cadr‘(x y z))=(car(cdr‘(x y z)) 第十四章 AutoLISP初步 286 =(car‘(y z)) 返回 y 注意 除 car、cdr 和 cadr 函数外,还有其他几个函数用于选取列表中的不同元 素。下面是这些函数的列表,其中函数f由列表‘((x y f)z w)组成。 (setq f‘((x y)z w)) (caar f)=(car(car n) 返回x (cdar f)=(cdr(car f)) 返回(y) (cadar f)=(car(cdr(car f))) 返回y (cddr f)=(cdr(cdr f) 返回(w) (caddr f)=(car(cdr(cdr f))) 返回W 11114.4.4.4.11111111 graphscrgraphscrgraphscrgraphscr、、、、textscrtextscrtextscrtextscr、、、、princprincprincprinc与与与与 terpriterpriterpriterpri函数函数函数函数 1111.graphscr.graphscr.graphscr.graphscr函数 若系统只有一个屏幕,graphscr 函数将文本窗口转换为图形窗口,若系统有两个屏幕, 该函数将被忽略。 2.textscr2.textscr2.textscr2.textscr函数 若系统只有一个屏幕,textscr 函数将图形窗口转换为文本窗口,若系统有两个 屏幕,该函数将被忽略。 3.princ3.princ3.princ3.princ函数 Princ函数打印(或显示)变量的值。若变量位于双引号中,该函数打印(或显示) 双引号内的表达式。 princ函数的格式为:(Princ[变量或表达式]) 示例:(princ)在屏幕上打印一个空行 (princa)在屏幕上打印出变量a的值 (princ“Welcome”)在屏幕上打印 Welcome 4.terpri4.terpri4.terpri4.terpri函数 terpri 函数用于在屏幕上打印一个新行,与\n 作用相同。该函数用于打印紧跟着 terpri函数的一行。 示例:(setq p1(getPoint“Enter first Point:”))(terpri) 第十四章 AutoLISP初步 287 (setq p2(getPoint“Enter second Point:”)) 第一行(Enter first Point:)将显示在屏幕的命令提示区中。 terpri 函数 产生了一个回车,因此第二行(Enter second Point:)将显示在新的一行中,也就是第 一行下面的一行。若没有 terpri函数,这两行将显示在同一行中(Enter first Point: Enter second Point:) 例 3 编写一个程序,提示用户输入一个矩形的两个对角的坐标,然后在屏幕上画出该矩 形,如图 12-7所示。 输入 处理过程 P1点的坐标 1.计算PZ点和P4 点的坐标 P3点的坐标 2.画出下列直线 P1 到 P2 的直线 P2 到 P3 的直线 P3 到 P4 的直线 P4 到 P1 的直线 P2 和 P4 两点的X,Y坐标可以通过 car 及 cadr 函数算出。car 函数从给定的列表 中选取X坐标,cadr函数选取Y坐标。 P2 点的X坐标: P2 点的Y坐标: X2=X3 Y2=Y1 X2=car(X3 Y3) Y2=cadr(X1 Y1) X2=car P3 Y2=cadr P1 P4 点的X坐标: P4 点的Y坐标: X4=X1 Y4=Y3 X4=car(X1 Y1) Y4=cadr(X3 Y3) X4=car P1 Y4=cadr P3 故,P2 点和 P4 点为: P2=(list(car P3)(cadr P1)) P4=(List(car P1)(cadr P3)) 第十四章 AutoLISP初步 288 下面的文件是例 3 的程序清单。 (defun c:rect1(/p1 p2 p3 p4) (graphscr) (setvar“cmdecho”0) (prompt“rect1 command draws a rectangle”)(terpri) (setq p1(getpoint “Enter first corner”)(terpri) (setq p3(getpoint “Enter opposite corner”)(terpri) (setq p2(list(car p3)(cadr p1))) (setq p4(list(car p1)(cadr p3))) (command “line”p1 p2 p3 p4 “c”) (setval “cmdecho” 1) (Princ) ) 说明 第 1 行:(defun c:rect1(/p1 p2 p3 p4) defun 函数定义了函数 rect1。 第 2 行:(graphscr) 如果当前屏幕恰好是文本屏幕,该函数将文本屏幕转换为图形屏幕。否则,对显示 屏幕无影响。 第 3 行:(setvar“cmdecho”0) 函数 setvar 将 0 赋予 AutoCAD 系统变量 cmdecho,即关闭了回显。如果 cmdecho 被 关闭,AutoCAD的命令提示就不会显示在屏幕的命令提示区中。 第 4 行:(prompt“rect1 command draws a rectangle”)(terpri) prompt 函数将显示双引号中的信息(“rect1 command draws a rectangle”)。函数 terpri产生一个回车,因此下一行文本会打印在单独一行上。 第 5 行:(setq p1(getpoint “Enter first corner”)(terpri) getpoint 函数暂停程序的运行,等候用户输入一个点(该矩形的第一个角),随后 setq 函数将该值赋予变量 P1。 第 6 行:(setq p3(getpoint “Enter opposite corner”)(terpri) getpoint 函数暂停程序的运行,等候用户输入一个点(该短形的对角),随后 setq 函 数
/
本文档为【autolisp教程】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索