第十四章 AutoLISP初步 by using the screen cursor. Pl, P2, P3 are triangle corners. (defun: C: triangl O (setq pl(getPoint " n Enter first Point of triangle: ") (setq p2(getpoint " n Enter second Point of triangle (setq P3(getPoint " n Enter third Point of triangle: ") 3456789 ( Command“line”PlP2P3“C”) 说明 第1-3行 前三行为注释行,用于描述程序中的函数。这几行很重要因为有它们,编辑程序会变 得简单一些。可以在任何必要的时候使用注释。所有的注释行都必须以分号(;)开头 当程序装入时这些行会被忽略。 第4行:行为空行,用于分隔程序与注释部分。空行还可以用来分隔程序的不同模块。 这样便于区分程序的不同部分。空行对程序没有影响 第5行:( defun c: triang10 本行中, defun为一个 AutoLISP函数,它定义了函数 TRIANGI。 TRIANG1为该函数的 函数名。由于此函数名前带有C:,因此该函数可以像 AutoCAD命令一样被执行。若没有 C:, TRIANGI命令只能置于圆括号中执行( TRIANG1)。此函数带有三个全局变量(P1,P2 3)。第一次编写 AutolISP程序时,保持变量为全局变量是个好习惯。这是因为装入并运 行程序后,可以通过在 AutoCAD命令提示行中输人感叹号(!)并在其后输入变量名来检 查变量的值( Command:!P1)。一旦程序通过测试并运行正常,就应该使它们成为局部变 E(defun c: TRIANG1(/P1 P2 P3) 第6行:( setq p1( setpoint“\ n Enter first point o f triangle:”)) 本行中, setpoint函数暂停程序的运行,允许用户输入三角形的第一个点。提示信息 Enter first Point of triangle显示在屏幕的提示区内。可以通过键盘输入该点的坐 标,也可以用屏幕光标选择该点。随后setq函数将这些坐标赋予变量Pl。\n的作用是 回车,其后的表达式将被打印在下一行上(“n”代表“ newi ne”) 第7行和第8行:( setg P2( setpoint“\ n Enter second Point of triangle:”) 及( setq P3( setpoint“\ n Enter third point of triangle:”)) 这两行提示用户输入三角形的第二个顶点和第三个顶点,随后把这些坐标赋予P2和 P3。\n的作用是回车,因此输入提示显示在下一行中。 第9行:( Command“line”PIP2P3“C”) 本行中, Command函数用来输入 AutoCAD的line命令,然后从P1到P2,P2到P3各 画一条直线。“C”(表示“ close”选项)把最后一点P3与第一点Pl连接起来。所 有的 AutoCad命令及选项在 AutoLISP程序中使用时都必须置于双引号内。变量P1、P2.P 3之间用空格分隔。 第10行 本行仅包含一个用于表明函数 TRIANG1定义完成的右括号。该括号也可以写在上一行
第十四章 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初步 中。把它单独放在一行是一个好习惯,因为这样做任何程序员都可以很容易的确定定义已 结束。然而某些程序中,同一程序内的多个定义及模块需要明确区分开。括号及空行有助 于明确定义或程序段的起始和结東。 14.7装入一个 AutoLISP程序 般来说与一个 AutoLISP程序相关的名称有两个:程序文件名和函数名。例如, TRIANG1.LSP是一个文件名,而不是函数名。所有的 AutolISP文件名均以.LSP为扩展名。 一个 AutolISP文件可以包含一个或多个函数定义。例如,例1中的 TRIANG1是一个函数 名。要执行一个函数,必须装入定义该函数的 AutoLISP程序文件。在图形编辑器中使用 如下命令装入一个 AutolISP文件 Command:(load“[path] filename”) 其中 Command … Autocad命令提示行 装入一个 AutolISP程序文件 [path] filename………… autolISP程序文件的路径及名称 AutolISP文件名及可选的路径名必须置于双引号内。1oad及 filename必须放在括号 中。若没有括号, AutoCAD将试图装人一个图形或文本字体文件,而不是 AutoLISP文件。 load同 filename间的空格也可省略。如果 AutoCad成功的装入了该文件,函数名将会显 示在屏幕的 Command提示区内。要执行该程序,在 AutoCAD的 Command:提示行中键人函 数的名称,并按下 Enter键,( Command: TRIANG1)。如果程序中函数名前没有C:,可以 通过将函数名置于括号中的形式运行该程序: Command: TRIANG1 E Command:(TRIANG1) 注意定义待装入的 AutolISP程序的路径时应使用斜杠。例如,如果 AutoLISP文件 triang存放在C驱动器的LISP子目录中,使用如下命令装入该文件。还可以使用双反斜 杠()代替斜杠。 command:(load“c:/lisp/ triang”)或 command:(load lisp\ triang”) 还可以通过使用标准的 windows拖放技术装人一个应用程序。要装人一个LISP程序, 种方法是在 Windows的资源管理器中选中该文件,并拖放到 AutoCAD的图形窗口中,选 中的程序将自动装入。还有一种装入 AutolISP程序的方法,就是使用load/ unload application对话框。 该对话框可通过在 tools菜单中选择1 oad applications或在 Autocad命令提示行 中输入 appload将其显示。 load/ unload application对话框 可使用load/ unload application对话框(见图12习)装入LSP、VLX、FAS.VBA、 DB及 ObjectARX应用程序。VBA、DB及 Ob sectary文件被选中时会立即装入:LSP、ⅥLX 及FAS文件在load/ unload application对话框关闭时装人。该对话框的顶部列出了选
第十四章 AutoLISP 初步 280 中。把它单独放在一行是一个好习惯,因为这样做任何程序员都可以很容易的确定定义已 结束。然而某些程序中,同一程序内的多个定义及模块需要明确区分开。括号及空行有助 于明确定义或程序段的起始和结束。 14.7装入一个 AutoLISP 程序 一般来说与一个 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 将其显示。 load/unload application 对话框 可使用 load/unload application 对话框(见图 12 习)装入 LSP、 VLX、 FAS. VBA、 DBX 及 ObjectARX 应用程序。 VBA、DBX 及 ObjectARX 文件被选中时会立即装入;LSP、VLX 及 FAS 文件在 load/unload application 对话框关闭时装人。该对话框的顶部列出了选
第十四章 AutolISP初步 中目录中的文件。文件的类型可以通过在 file of type编辑框中输入(.lsp)或通过在下 拉列表框中选择来改变。选择一个文件并点击LOAD按钮可以装入该文件。以下为10ad/ unload application对话框其他特性的描述: 1. load Load按钮可用于装人或重新装入选中的文件,文件可以从文件列表框,Load Application标签或 History List标签中选取。 Ob jectARX文件不能重新装入,必须先 卸载该 Ob jectARX文件,然后再次装入。 2. Load Application标签 选择 Load Application标签后, autoCAD会显示出当前已装人的应用程序。可以 向该列表中添加文件,方法是从文件列表框中拖动文件名到 Load Application s列表中 istory 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文件及 Ob jectARX文件不能卸载。 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坐标 148 getcorner、 getdist与 setvar函数 1. getcorner函数 getcorner函数暂停程序的运行,等候用户输入一个点的坐标。可以用键盘或使用屏
第十四章 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.8 getcorner、getdist 与 setvar 函数 1.getcorner 函数 getcorner 函数暂停程序的运行,等候用户输入一个点的坐标。可以用键盘或使用屏
第十四章 AutoLISP初步 幕光标将其输入。该函数需要一个基点,在屏幕上移动屏幕光标时将根据该基点显示矩形 etcorner函数格式为: (getcorner Point [P 其中 Point 基点 …显不在屏幕上的提示信息 示例:( getcorner pt1 (setq pt2(getcorner pt1)) (setq pt2(getcorner ptl "Enter second Point)) 注意基点及响应 getcorner函数所选择的点均是关于当前US定位的 若选择的是带有XYZ坐标的3D点,E坐标将被忽略。该点假定当前高度为 其Z坐标。 redist函数 getdist函数暂停程序的运行,等候用户输入距离,随后以实数形式返回该距离 getdist函数格式为 (getdist [Point][Prompt 其中 Point… 距离的第一点坐标 须在屏幕上显示的提示信息 示例:( getdist) (setq dist (getdist)) (setq dist (getdist pt1)) ( setq dist( getdist“ Enter distance”》 (setg dist (getdist ptl "Enter second Point for distance") 可以在屏幕上选择两个点来输入距离。例如,若赋值语句为( setq dist( getdist)), 可以输入数字或选择两个点:若赋值语句为( setq dist( getdist pt1),这里的第一点 (pt1)已经定义,只须选择第二点。 getdist函数总是返回以实数表示的距离。例如,如 果当前设置为 architecture并且以 architecture单位输入了距离, getdist函数将以实 数形式返回该距离 3ear函数 setvar函数用于给 AutoCAD系统变量赋值。系统变量名必须置于双引号中。 setvar函数格式为: variable-name value 其中 variable nam autoCAD系统变量 赋予系统变量的值 示例:( setvar“ cmdecho”0)
第十四章 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.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.setvar 函数 setvar 函数用于给 AutoCAD 系统变量赋值。系统变量名必须置于双引号中。 setvar 函数格式为: (setvar“variable-name value) 其中 variable name…………AutoCAD 系统变量 value……………………赋予系统变量的值 示例:(setvar“cmdecho” 0)
第十四章 AutolISP初步 ( setvar“ dimscale”1.5) ( setvar“ Ltscale”0.5) ( setvar“ dimen”0.25) 编写一个 AutoLISP程序,在给定的两条线间通过输入倒角角度及倒角距离生成 个倒角。 AutoCAD使用赋予系统变量 Chamfer和 Chamfer的值生成该倒角。当选择了 AutoCAD的 Chamfer命令后,第一个倒角及第二个倒角的距离被自动赋予系统变量 Chamfer及 Chamfer。随后 Chamfer命令使用这些值生成一个倒角。然而,在多数工程 图中,人们更喜欢通过输入倒角长度及倒角角度的方式来生成倒角,如图12-5所示。 图125倾角为A,距离为D的倒角 输入 输出 第一个倒角距离(D) 任意两条选中直线间的倒角 倒角角度(A) 处理过程 计算过程 1.计算第二个倒角的距离 x/d=tan 2.将这些值赋予系统变量 Chamfer和 Chamfer x=d*(tana) 3.使用 autoCAD的 Chamfer命令生成倒角。 d*[(sin a)/(cos a)] 下面的文件是例2的程序清单。右边的行号只为方便引用,并不是文件的一部分。 This program generates a chamfer by entering the chamfer angle and the chamfer distance (defun c: chamfer(/da ( setvar“ cmdecho”0) (graphscr) ( setq d( getdist“、n chamfer distance:”) ( setq a( getangle“\n chamfer angle:”) 234567891 ( setvar“ chamfer”d) ( setvar“ chamfer”(d(/sina(cosa)))) ( Command“ chamfer”) ( setvar“ cmdecho”I) 说明
第十四章 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 说明