Visual LISP是AutoCAD第三代开发语言,它与AutoLISP完全兼容,相比之下功能增强许多,主要有ActiveX、反应器等。ActiveX接口使得VB可以操纵ACAD,这也就是AutoCAD VBA。如今扩展的LISP也有了一系列相应函数,如VL-开头的Visual LISP扩展函数、VLAX-开头的ActiveX函数、VLR-开头的反应器函数、最多而常用的是以VLA-开头的,它们多数在AutoLISP中能找到原型。(前面三类函数在开发人员帮助手册里可以找到,第四类多为"VLA-对应的AutoLISP函数的组合")
8 s0 Q S s E2 E& l对ActiveX 需要知道几个重要概念:
0 p& i D# v/ s0 N1.对象,他是个广泛的概念,AutoCAD本身、图纸空间、图层、文本样式、一个图元等等都是对象,学习过程中可以理解到。- l! n0 o$ k* p
2.属性,对象具有属性,属性用于描述对象。比如一个圆具有半径、面积、线型等属性。
$ G$ m" z0 y8 d3.方法,方法为对特定对象的操作,镜像(图元)、缩放(视图)、加载(应用程序)等等都叫方法。/ v5 Z" U9 t* H3 g
4.集合,是对象的分组。
( u5 @* x- B3 b) D6 q. E5.事件,用于反应器。. y- Z5 a9 |% w% N6 K$ N
下面从创建和修改基本对象练习开始:; A2 |- t" ^, W( k+ g2 D3 e
;;;c:aline函数用Active方法绘制一条直线和一个圆0 F% D' {7 v) e$ _; v; H
(defun c:aline(/ doc mspace uti p1 p2 line);定义命令aline
^9 k* x% m+ D& k) {, ^" d6 R (vl-load-com);加载扩展函数
& E- L1 G5 b, }2 l ;获取AutoCAD应用程序的当前活动文档对象
2 X* q$ r4 N* [' }1 H/ H1 K* \" j2 Q (setq doc (vla-get-activedocument (vlax-get-acad-object)))
2 [, p3 n' {' C" z; u! m. [ (setq mspace (vla-get-modelspace doc));获取模型空间对象
: E1 i( y3 n+ M0 W; f, o1 o9 ~% x (setq uti (vla-get-utility doc));获取命令行实用程序对象
( \! d8 k: i7 Z! K (setq p1 (vla-getpoint uti nil"\n输入直线的起点: "));和getpoint类似,uti(命令行)
6 `* w# K9 H3 Y! k( o0 J9 X (setq p2 (vla-getpoint uti p1 "\n输入直线的终点: "))* I2 @6 d2 K+ n! R
(setq line (vla-addline mspace p1 p2));在模型空间中添加直线4 s" `. R4 p$ t* T# w0 V9 l! ^
(vla-addcircle mspace p1 (vla-get-Length line));以p1为圆心,line长为半径画圆
8 [9 _( ]$ U. }+ p0 h (princ)+ J6 y0 h- i1 e& n
)
1 G( I; N8 ^( h. E& P0 G0 s;;;c:alt函数用Active方法对一个圆进行操作1 j) G7 J- d7 C3 e) ~
(defun c:alt(/ doc mspace uti e1 e2 dis color);定义命令alt x2 k0 _: u" U& s1 P% x4 J
(vl-load-com);加载扩展函数# H8 P2 I# w7 M' G
;获取AutoCAD应用程序的当前活动文档对象* r( L: E% Y0 k/ |
(setq doc (vla-get-activedocument (vlax-get-acad-object)))
7 Q5 w) @7 E& O" Z- l (setq mspace (vla-get-modelspace doc));获取模型空间对象1 Q! _( E7 |. v" f8 a# p2 U
(setq uti (vla-get-utility doc));获取命令行实用程序对象
, P3 Y' O4 ^8 m1 e. H (vla-getentity uti 'e1 'e2 "\n选择一个圆: ");参数带回返回值(特别),类似于entsel
* X% g' ~1 m0 X% s+ O. P (setq dis (vla-getdistance uti nil "\n输入圆的新周长: "));相当于getreal: q# R2 t# ~% u9 C" T, T
(setq color (vla-getinteger uti "\n输入新的颜色号: "));相当于getint0 z) M* R4 p! N( f3 s& P+ N* p
;(vlax-dump-object e1 t)这一句用于查询vla对象(e1)的属性和可用方法,下面的三种方法都支持" _2 h7 b2 a9 V1 W& s U
(vla-put-Circumference e1 dis);e1是vla-getentity返回的圆对象,vla-put-area对它赋新值& E0 p. e6 a. N$ A1 Z; P
(vla-put-color e1 color);更改对象e1颜色2 n: ^4 M; \+ j8 b8 X4 N
(vla-Arrayrectangular e1 10 8 1 2 2 0);矩形阵列e1对象
& @* S, ]4 e( y)
* E+ W; Z5 o9 @* b$ ^, Q: K1 b注意:程序里提到的对象都是VLA对象,和图元对象是不兼容的,这里用的都是纯VLISP函数语法,一般习惯AutoLISP的会将两者结合转换使用,比如:
" l% @8 }$ V6 M4 v. u+ m(setq e1 (car (entsel)));点选图元,图元名给e1
* {' p0 N# [ y4 t3 D! h(setq v_e1 (vlax-ename->vla-object e1));将e1转换为VLA对象(转换回来用vlax-vla-object->ename)
+ G' E1 X4 Z" f9 N7 q' V
) a: `0 F' |) ]% @0 [# J(vla-getentity uti 'e1 'e2 "\n选择一个圆: ");参数带回返回值(特别),类似于entsel. \( L7 Y2 f8 Z
上面这一句比较特别,一些像vla-getentity这样的函数能自带参数返回值,无须用setq,它将vla图元名直接传给e1,拾取点直接传给e2,后面直接用就是了,这一点我喜欢。
. |( C' d5 }) w3 g1 @" }- V( C9 R! z u; U O7 y) Q
$ V! j8 Q4 R1 X) N1 C
0 f$ x/ j3 s3 [+ t6 z/ g8 U3 T1 {' s
5 F8 q4 B0 G; \4 D. A
) l- \! T; K2 `9 M4 \
[ 本帖最后由 yrgui 于 2008-10-13 17:31 编辑 ] |