Visual LISP是AutoCAD第三代开发语言,它与AutoLISP完全兼容,相比之下功能增强许多,主要有ActiveX、反应器等。ActiveX接口使得VB可以操纵ACAD,这也就是AutoCAD VBA。如今扩展的LISP也有了一系列相应函数,如VL-开头的Visual LISP扩展函数、VLAX-开头的ActiveX函数、VLR-开头的反应器函数、最多而常用的是以VLA-开头的,它们多数在AutoLISP中能找到原型。(前面三类函数在开发人员帮助手册里可以找到,第四类多为"VLA-对应的AutoLISP函数的组合")0 l* W9 B, R5 T4 ]
对ActiveX 需要知道几个重要概念:
9 \: W6 ?. U! r6 M1.对象,他是个广泛的概念,AutoCAD本身、图纸空间、图层、文本样式、一个图元等等都是对象,学习过程中可以理解到。
2 a+ |2 K8 o' J3 \, D1 B1 W+ p2.属性,对象具有属性,属性用于描述对象。比如一个圆具有半径、面积、线型等属性。
; F; s% j) D1 Z+ n' Z! c, E3.方法,方法为对特定对象的操作,镜像(图元)、缩放(视图)、加载(应用程序)等等都叫方法。; b* p9 t$ z' o
4.集合,是对象的分组。
2 v: @3 c5 K) m9 G5.事件,用于反应器。: z& M" l: B T6 X( @/ z7 Z* a
下面从创建和修改基本对象练习开始:
( S+ f# E" N) v! l2 I0 k;;;c:aline函数用Active方法绘制一条直线和一个圆8 u5 ~" x( R9 ]* h, t% E
(defun c:aline(/ doc mspace uti p1 p2 line);定义命令aline! a' M: u2 v% |2 a/ T$ f) \
(vl-load-com);加载扩展函数
6 i( `# e3 N4 Q1 L1 `2 |$ p ;获取AutoCAD应用程序的当前活动文档对象8 t: b) w5 m T/ _$ {
(setq doc (vla-get-activedocument (vlax-get-acad-object)))- c# X$ ?9 e% T& K) M0 X% P4 m
(setq mspace (vla-get-modelspace doc));获取模型空间对象8 T0 R" k7 w9 _( W7 ^/ z
(setq uti (vla-get-utility doc));获取命令行实用程序对象- q9 }' y* f4 Q u; r
(setq p1 (vla-getpoint uti nil"\n输入直线的起点: "));和getpoint类似,uti(命令行)
( p: t: f% V1 ]7 \& c (setq p2 (vla-getpoint uti p1 "\n输入直线的终点: "))
* y, A' o$ ]% {& y4 z (setq line (vla-addline mspace p1 p2));在模型空间中添加直线
6 ~& l" o+ r& g7 L1 ~) W (vla-addcircle mspace p1 (vla-get-Length line));以p1为圆心,line长为半径画圆
8 ?3 T% K2 f" z" Z (princ)0 g) l" \$ m4 o( L. {1 I8 H. |
)! @& i! U2 s3 U1 a! S8 K' ~- Y: N8 n
;;;c:alt函数用Active方法对一个圆进行操作) E3 d |- T5 ~6 D/ P' D
(defun c:alt(/ doc mspace uti e1 e2 dis color);定义命令alt
0 C. Q3 T& q! N+ ? (vl-load-com);加载扩展函数+ z/ v! k0 Y& G* C7 D
;获取AutoCAD应用程序的当前活动文档对象
8 P& ~/ O& r: } (setq doc (vla-get-activedocument (vlax-get-acad-object)))# b4 A7 U4 {, i) g# B6 c4 k3 }
(setq mspace (vla-get-modelspace doc));获取模型空间对象4 b0 q o- W2 {! `0 j. |0 P) T
(setq uti (vla-get-utility doc));获取命令行实用程序对象& j8 M K5 C7 Q V7 d3 N- F# d }- j e
(vla-getentity uti 'e1 'e2 "\n选择一个圆: ");参数带回返回值(特别),类似于entsel
- W( q3 [) G' h. j/ i* h8 z( t (setq dis (vla-getdistance uti nil "\n输入圆的新周长: "));相当于getreal
/ ]* `5 K, A2 @4 t2 A) ~8 ~ (setq color (vla-getinteger uti "\n输入新的颜色号: "));相当于getint
3 N! ~3 Q9 G. P6 ^ ;(vlax-dump-object e1 t)这一句用于查询vla对象(e1)的属性和可用方法,下面的三种方法都支持
7 W8 F/ i: c6 s6 T6 v (vla-put-Circumference e1 dis);e1是vla-getentity返回的圆对象,vla-put-area对它赋新值& l! b+ @2 R# }1 t! D5 D
(vla-put-color e1 color);更改对象e1颜色3 V, T5 _$ {0 L$ e, `3 ]3 m, i
(vla-Arrayrectangular e1 10 8 1 2 2 0);矩形阵列e1对象
6 B. k3 w) y& P1 E" T)( ? B, ]2 T& p3 P+ B" V5 O; ]
注意:程序里提到的对象都是VLA对象,和图元对象是不兼容的,这里用的都是纯VLISP函数语法,一般习惯AutoLISP的会将两者结合转换使用,比如:
1 u- {! @0 c( q(setq e1 (car (entsel)));点选图元,图元名给e1
) w4 R* ^3 S" r: V& Q1 o. ](setq v_e1 (vlax-ename->vla-object e1));将e1转换为VLA对象(转换回来用vlax-vla-object->ename)" ~ Z' @ n! @* }
4 p0 y3 Q3 g* k6 _; x2 O(vla-getentity uti 'e1 'e2 "\n选择一个圆: ");参数带回返回值(特别),类似于entsel' ]) z+ ]0 V' J- j1 U5 @
上面这一句比较特别,一些像vla-getentity这样的函数能自带参数返回值,无须用setq,它将vla图元名直接传给e1,拾取点直接传给e2,后面直接用就是了,这一点我喜欢。
; K: H/ g( L7 s* r! K9 ?) P5 d( G" |! V1 `6 k) [
& q( B8 C8 o6 ?
, |2 y, r3 p( [
: K, e# ^7 z8 x' c1 L( b2 i6 y6 s* n D) H/ k6 O/ s
[ 本帖最后由 yrgui 于 2008-10-13 17:31 编辑 ] |