Visual LISP是AutoCAD第三代开发语言,它与AutoLISP完全兼容,相比之下功能增强许多,主要有ActiveX、反应器等。ActiveX接口使得VB可以操纵ACAD,这也就是AutoCAD VBA。如今扩展的LISP也有了一系列相应函数,如VL-开头的Visual LISP扩展函数、VLAX-开头的ActiveX函数、VLR-开头的反应器函数、最多而常用的是以VLA-开头的,它们多数在AutoLISP中能找到原型。(前面三类函数在开发人员帮助手册里可以找到,第四类多为"VLA-对应的AutoLISP函数的组合")( V) `0 Q. G; Q* j
对ActiveX 需要知道几个重要概念:9 Q! t+ m8 r2 _3 z
1.对象,他是个广泛的概念,AutoCAD本身、图纸空间、图层、文本样式、一个图元等等都是对象,学习过程中可以理解到。
. y2 H$ m: Q6 z; A9 j5 I) L' V5 {2.属性,对象具有属性,属性用于描述对象。比如一个圆具有半径、面积、线型等属性。2 E) j4 c t, h& O, }% r
3.方法,方法为对特定对象的操作,镜像(图元)、缩放(视图)、加载(应用程序)等等都叫方法。' F: u9 f. q2 { @6 l
4.集合,是对象的分组。
9 k7 U+ E; z7 p. N4 V& Q5.事件,用于反应器。
2 g5 M: V: S6 P( k5 ?0 {( `; s下面从创建和修改基本对象练习开始:% O) h' _1 _6 N8 V: D1 `' ]+ w
;;;c:aline函数用Active方法绘制一条直线和一个圆2 l; t* ^, J( Z/ o r
(defun c:aline(/ doc mspace uti p1 p2 line);定义命令aline; g6 z) E1 A4 z
(vl-load-com);加载扩展函数
+ u/ ? W2 S9 R4 W8 k ;获取AutoCAD应用程序的当前活动文档对象1 q9 C8 t5 V5 ~& q: C
(setq doc (vla-get-activedocument (vlax-get-acad-object)))
5 w* V& U/ X+ ^, g5 {" n- u D (setq mspace (vla-get-modelspace doc));获取模型空间对象
8 v8 t4 S$ o- J1 _9 q: P0 t (setq uti (vla-get-utility doc));获取命令行实用程序对象
( F9 o) j0 L+ A- h (setq p1 (vla-getpoint uti nil"\n输入直线的起点: "));和getpoint类似,uti(命令行)
/ m# C" `; j0 c5 [" o# ` (setq p2 (vla-getpoint uti p1 "\n输入直线的终点: "))8 G+ g4 N: w/ D' g" X9 `2 X! W
(setq line (vla-addline mspace p1 p2));在模型空间中添加直线
0 \+ V: E6 T$ \! f (vla-addcircle mspace p1 (vla-get-Length line));以p1为圆心,line长为半径画圆
& r. ~& s8 y) [) u# O- O' D (princ)+ x, y* _! b% o5 b. ~8 O
)
3 |. r. D1 n4 ~ S;;;c:alt函数用Active方法对一个圆进行操作
' q9 Z `$ b8 J7 o/ K3 m s(defun c:alt(/ doc mspace uti e1 e2 dis color);定义命令alt
& o, k- r0 Q( N( h( T5 o6 f (vl-load-com);加载扩展函数
" J7 E% v9 Y _3 M) z( U" I ;获取AutoCAD应用程序的当前活动文档对象
8 t5 R5 L) {( R (setq doc (vla-get-activedocument (vlax-get-acad-object)))
+ L8 Z4 ^' Y6 k5 l( ~+ t (setq mspace (vla-get-modelspace doc));获取模型空间对象
7 |- P7 `" B+ k* ]* @ (setq uti (vla-get-utility doc));获取命令行实用程序对象( Y6 e1 y" v0 I) W3 i
(vla-getentity uti 'e1 'e2 "\n选择一个圆: ");参数带回返回值(特别),类似于entsel+ G$ t8 ~; p) U3 A3 g2 w" f
(setq dis (vla-getdistance uti nil "\n输入圆的新周长: "));相当于getreal- m0 {. L, m5 l
(setq color (vla-getinteger uti "\n输入新的颜色号: "));相当于getint# o: X! P* p2 d: B: X `! b
;(vlax-dump-object e1 t)这一句用于查询vla对象(e1)的属性和可用方法,下面的三种方法都支持
, y+ H( \$ L! I$ s9 w (vla-put-Circumference e1 dis);e1是vla-getentity返回的圆对象,vla-put-area对它赋新值
# [3 R& S( k' l6 @ (vla-put-color e1 color);更改对象e1颜色
, T; Q& [+ m$ q, N& u' z (vla-Arrayrectangular e1 10 8 1 2 2 0);矩形阵列e1对象# i# a: @6 }4 U- T# `, W
)
- D1 m4 m( S4 `注意:程序里提到的对象都是VLA对象,和图元对象是不兼容的,这里用的都是纯VLISP函数语法,一般习惯AutoLISP的会将两者结合转换使用,比如:
9 m# t' T$ ]- w* B(setq e1 (car (entsel)));点选图元,图元名给e14 i* @$ ~5 k$ r2 _3 @% {8 k9 f
(setq v_e1 (vlax-ename->vla-object e1));将e1转换为VLA对象(转换回来用vlax-vla-object->ename)
& c9 p' V' ^2 g: h: B" i @1 G T
(vla-getentity uti 'e1 'e2 "\n选择一个圆: ");参数带回返回值(特别),类似于entsel0 o7 @9 _, H; M
上面这一句比较特别,一些像vla-getentity这样的函数能自带参数返回值,无须用setq,它将vla图元名直接传给e1,拾取点直接传给e2,后面直接用就是了,这一点我喜欢。
! P3 R0 g4 b& I" e: \
" [: x" T* h3 q; S; e: a5 i2 a- N( F o
- y! c# [ v" M+ I/ F! y: A: s6 B; A) \- ?% L; q/ u" g
( O+ r1 r% B& z$ L; R" l$ V7 M' O
[ 本帖最后由 yrgui 于 2008-10-13 17:31 编辑 ] |