
第七章AutoLISP的绘图功能.ppt
15页第七章AutoLISP的绘图功能•7.1command函数•执行一条或多条 AutoCAD 命令,实现AutoLISP的绘图功能,主要接口•(command [arguments] ...)•参数•arguments •AutoCAD 命令、选项或表达式•返回值•nil•例题:•CAD操作方式操作方式•line•指定第一点: 1,1•指定下一点或 [放弃(U)]: 1,5•指定下一点或 [放弃(U)]:•命令:•AutoLISP操作方式操作方式•(command "line" '(1 1) '(1 5) "")•command函数参数书写规定函数参数书写规定1.命令名和选项用字符串表示,大小写皆可2.数值常数(整数、实数)可以写成数本身,也可写成字符串3.点常数可以写成引用表或字符串,例如‘(2 3)或“2,3”4.空字符串 ("") 表示从键盘键入 ENTER 键,可以终止一个需要不定个数数据的CAD命令,或接受缺省值例题:(command "text" "m" ".1,1" 3.0 0 "AutoCAD")“0.1,1" ".1,1" '(0.1 1) 正确”0.1 1" '(.1 1) 错误5.不带参数调用 command 相当于键入 ESC 键,这样可取消大多数 AutoCAD 命令,两个不带参数调用 command,可取消所有 AutoCAD 命令。
也可以用符号^取消AutoCAD 命令例如:(command ^ ^ "text" "m" ".1,1" 3.0 0 "AutoCAD")6.符号pause暂停AutoCAD命令,等待用户输入,它表示一个反斜杠若用反斜杠表示,应写成"\\"例如:(command "line" pause "\\" "") 等待用户输入两点画一条线段7.若一个期待输入字符串(如TEXT命令)或属性值的命令碰到pause,那么仅当系统变量"textval"置为非零时才会引起暂停,否则pause符号的值(反斜杠)被视为输入文本,不会引起暂停 •(setvar "texteval" 1)•(command "txet" "r" pause 3 0 pause)• 右对齐 右对齐点 字高 转角 等待输入字符•(setvar "texteval" 0)•(command "txet" "r" pause 3 0 pause)• 文本为反斜杠•不建议采用暂停的办法等待用户输入,输入错误导致程序出错。
8.等待用户输入的getxxx函数不能用在command函数中,另外在command函数中不能使用sketch (绘草图)、SCRIPT(执行一组命令)命令如果在函数中使用 SCRIPT 命令,它必须是出现在该 AutoLISP 程序的最后同样,如果在 acad.lsp 或 MNL 文件中使用 command 函数,则只能在 defun 表达式中调用应使用 S::STARTUP 函数定义在绘图任务开始时就要执行的那些初始化命令例题•(initget 1)•(setq pt (getpoint "\n输入文本起点:"))•(command "text" "m" pt 3.0 0 "AutoCAD")•(command "text" "m"• (progn(initget 1)•(setq pt (getpoint "\n输入文本起点:"))• )• 3.0 0 "AutoCAD"•) ;错误9.一个command函数调用可以执行多条CAD命令;多个command函数调用可完成一条CAD命令例题:•(command "line" '(1 1) '(1 5) "" "line" '(2 2) '(2 8) "")•(command "line")•(command '(1 1))•(command '(1 5) "")10.系统变量 "cmdecho"为0,通过command函数执行的cad命令不会在命令行中显示;系统变量 "blipmode"为0,可以消除命令执行过程中小十字线的显示11.如果开发的应用程序运行在外文版的AutoCAD,由command函数发出的命令必须加下划线前缀,这样命令就可以被转换。
例如 (command "_redraw")如果要避免命令被重新定义,可以加圆点前缀圆点前缀和下划线前缀可以任意组合例如 (command "._redraw")或(command "_.redraw")mand函数调用中的命令和选择项不允许有空格例如(command "line " "5,6" "6 ,0" "") 错误13.要注意的是,如果从 Visual LISP 中使用 command 函数,控制并不会转移到 AutoCAD 中如果命令要求用户输入,则可以在控制台窗口中看到返回结果 (nil),但 AutoCAD 将等待输入,必须手动激活 AutoCAD 并响应提示在这样做以前,任何后续命令都会失败;画一个矩形(defun abcd (/ p1 p2 p3 p4) (initget 1) (setq p1 (getpoint "\n输入一点:")) (initget 1) (setq p3 (getpoint p1 "\n输入对角点:")) (setq p2 (list (car p3) (cadr p1) (last p1))) (setq p4 (list (car p1) (cadr p3) (last p1))) (command ^ ^ "line" p1 p2 p3 p4 "C" ""))•7.2图形处理函数•7.2.1求两点连线的角度angle函数•(angle pt1 pt2) •求UCS的点pt1到pt2的连线在当前构造平面的投影与UCS的X轴的夹角,逆时针为正,单位为弧度,二三维点皆可。
与getangle函数在指定两点时测量角度方式相同•样例•命令:(angle '(1.0 1.0) '(1.0 4.0)) •1.5708•命令:(angle '(5.0 1.33) '(2.4 1.33)) •3.14159•7.2.2求UCS两点的距离distance•(distance pt1 pt2)•如果提供的参数中有一个或两个二维点,distance 函数会忽略所提供的任何三维点的 Z 坐标,而返回将这些点投影到当前构造平面上后所得的点之间的二维距离•样例•命令:(distance '(1.0 2.5 3.0) '(7.7 2.5 3.0)) •6.7•命令:(distance '(1.0 2.0 0.5) '(3.0 4.0 0.5)) •2.82843•7.2.3在 UCS 坐标系下,求某点的指定角度和指定距离处的点polar •(polar pt ang dist)•参数•pt •二维或三维点•ang •以弧度为单位的角度值,它是相对于当前构造平面 X 轴按逆时针方向计算的•dist •与指定点 pt 的距离•返回值•根据 pt 指定点的类型,返回二维或三维点如果pt为三维点,返回点的z坐标与pt的z坐标相同。
•样例•为 polar 提供一个三维点:•命令:(polar '(1 1 3.5) 0.785398 1.414214) •(2.0 2.0 3.5)•为 polar 提供一个二维点:•命令:(polar '(1 1) 0.785398 1.414214) •(2.0 2.0)•7.2.4几个函数的比较•(getorient [pt] [prompt]) 方位角,UCS的点•(getangle [pt] [prompt]) 与UCS的x轴逆时针转的夹角, UCS的点•(angle pt1 pt2) 与UCS的x轴逆时针转的夹角, UCS的点•(polar pt ang dist) 与UCS的x轴逆时针转的夹角, UCS的点•7.2.5求二线交点函数inters•(inters pt1 pt2 pt3 pt4 [onseg]) •所有的点都以当前 UCS 表示,如果提供的四个点都是三维点,inters 函数检查三维交点只要所提供的点中有一个是二维点,inters 函数就将这两条线投影到当前构造平面上,仅检查二维交点•参数•pt1 第一条直线的端点。
pt2 第一条直线的另一端点pt3 第二条直线的端点pt4 第二条直线的另一端点•两条线平行或重合返回nil•样例•(setq a '(1.0 1.0) b '(9.0 9.0)) •(setq c '(4.0 1.0) d '(4.0 2.0)) •命令:(inters a b c d) •nil •命令:(inters a b c d nil) •(4.0 4.0)•7.2.6目标捕捉函数•将某种对象捕捉模式作用于指定点而获得一个点,并返回该点•(osnap pt mode) •参数•pt •二维点或三维点•mode •字符串,其中包含了一个或多个有效的对象捕捉模式标志符(如 mid、cen 等),各标志符之间用逗号隔开•返回值•三维点如果在给定的点附近没有捕捉到目标或目标点和捕捉方式不匹配则返回 nilosnap 函数返回的点取决于当前三维视图和系统变量APERTURE(靶区大小 )的设置•注意:目标捕捉只能辨认屏幕可见的图素,已经关闭的层和虚线的抬笔端无法被捕捉,不改变捕捉方式系统变量"osmode"的值•样例•命令:(setq pt1 (getpoint)) •(11.8637 3.28269 0.0)•命令:(setq pt2 (osnap pt1 "_end,_int")) •(12.1424 3.42181 0.0)捕捉方式0NON(无)1END(端点)2MID(中点)4CEN(圆心)8NOD(节点)16 QUA(象限点)32 INT(交点)64 INS(插入点)128PER(垂足)256TAN(切点)512NEA(最近点)1024QUI(快速)2048APP(外观交点)4096EXT(延伸)8192PAR(平行)•7.2.7将一个点(或位移量)从一个坐标系转换成另一个坐标系•(trans pt from to [disp]) •参数•pt 三维实数列表,既可以被解释成一个三维点,又可以被解释成一个三维位移(矢量)。
•from 整数代码、图元名(表示OCS)或三维拉伸矢量(拉伸矢量总是以世界坐标系表示,拉伸矢量 (0,0,1) 指定了世界坐标系 WCS 自身 ),指定 pt 的坐标系整数代码可以为如下值:•0 世界坐标系(WCS)•1 用户坐标系(当前 UCS)•2 与代码 0 或代码 1 一起使用时,表示当前视口的显示坐标系 (DCS)与代码 3 一起使用时,表示当前模型空间视口的 DCS•3 图纸空间 DCS(仅用于代码 2)•to 整数代码、图元名或三维拉伸矢量,指定返回点的坐标系有效的整数代码取值请参见 from 参数•disp 如果存在且不为 nil,则将 pt 作为三维位移而不是三维点看待•如果 from 或 to 参数是图元名,它必须是由 entnext、entlast、entsel、nentsel 和 ssname 等函数返回的图元名这样就可以将某个特定对象的对象坐标系 (OCS) 中的点来回进行转换(对于某些对象,OCS 等价于 WCS,对这些对象,OCS 和 WCS 之间的转换是空操作)使用三维拉伸矢量(三个实数组成的一个表)是来回转换对象 OCS 的另一种方法。
但是,对于 OCS 等价于 WCS 的那些对象,这种转换也不做任何操作•返回值返回值 由参数 to 指定的坐标系表示的一个三维点(或位移)•样例•在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:•命令:(trans '(1.0 2.0 3.0) 0 1) •(2.0 -1.0 3.0)•命令:(trans '(1.0 2.0 3.0) 1 0) •(-2.0 1.0 3.0)•例如,要在不使用对象捕捉的情况下,从一行文本的插入点画一条直线,需要将文本对象的插入点从文本对象的 OCS 转换到 UCS:•(trans text-insert-point text-ename 1)•然后就可以将结果传给“起点:”提示•相反地,将点值送到 entmod 函数中去之前,必须将该点(或位移)值转换成用该对象的 OCS 表示例如,如果要将圆相对 UCS 偏移 (1,2,3)(不使用 MOVE 命令),就需要将该偏移量从 UCS 转换成圆的 OCS:•(trans '(1 2 3) 1 circle-ename)•然后就可以将结果偏移量加到圆的圆心上去•trans 函数也可以转换二维点,这需要通过给 Z 坐标赋一个适当的值来实现。
所使用的 Z 分量取决于所指定的 from 坐标系,以及该值是作为一个点还是作为一个位移如果是作为一个位移,那么其 Z 值总是为 0.0;如果是作为一个点,那么其 Z 值由下表确定•转换二维点时的 Z 坐标值•From 填入的 Z 坐标值•WCS 0.0•UCS 当前标高•OCS 0.0•DCS 投影到当前构造平面(UCS XY 平面 + 当前标高)•PSDCS 投影到当前构造平面(UCS XY 平面 + 当前标高)•7.3屏幕操作函数•(graphscr) 切换到AutoCAD 图形屏幕,返回值 nil等价于 GRAPHSCR 命令或按下切换屏幕功能键•(textscr) 切换至文本屏幕,返回nil•(redraw [ename [mode]])重画当前视口或当前视口中的一个指定对象•如果不带参数调用 redraw 函数,它重画当前视口,但对加亮显示或隐藏的图元无效如果提供了图元名,它将重画该指定图元•REGEN 命令可强制使图元以正常模式重新显示 •参数•ename •要重画图元的名称•mode •整数值,用于控制图元的可见性和亮显。
mode 可为下列值之一:•1 显示图元•2 隐藏图元(使其不可见)•3 亮显图元(虚线)•4 不亮显图元•亮显图元模式 (mode=3) 必须与不亮显图元模式 (mode=4)协调使用•如果 ename 是复杂图元(多段线或带属性的块参照)的头部图元名,那么在 mode 参数为正时,redraw 函数对主图元和它的所有子图元进行处理,而在 mode 参数为负时,它仅处理头部图元•返回值•redraw 函数的返回值始终为 nil•例题 (command "line" '(1 1) '(2 2) "")(setq en (entlast))(redraw en 3)。












