Visual LISP是AutoCAD第三代开发语言,它与AutoLISP完全兼容,相比之下功能增强许多,主要有ActiveX、反应器等。ActiveX接口使得VB可以操纵ACAD,这也就是AutoCAD VBA。如今扩展的LISP也有了一系列相应函数,如VL-开头的Visual LISP扩展函数、VLAX-开头的ActiveX函数、VLR-开头的反应器函数、最多而常用的是以VLA-开头的,它们多数在AutoLISP中能找到原型。(前面三类函数在开发人员帮助手册里可以找到,第四类多为"VLA-对应的AutoLISP函数的组合")( _' _6 x- r- j7 a! H% b
对ActiveX 需要知道几个重要概念:
2 d3 E) t( O7 i. Y ~. ~1.对象,他是个广泛的概念,AutoCAD本身、图纸空间、图层、文本样式、一个图元等等都是对象,学习过程中可以理解到。' ]" [$ w+ z" j0 U1 T
2.属性,对象具有属性,属性用于描述对象。比如一个圆具有半径、面积、线型等属性。
$ p$ M. ~: n4 O+ Y7 D3.方法,方法为对特定对象的操作,镜像(图元)、缩放(视图)、加载(应用程序)等等都叫方法。' ^8 I$ D+ `/ Z
4.集合,是对象的分组。3 J& d1 R6 h' j( W7 T# ^/ q
5.事件,用于反应器。* J8 _% R- }. Y
下面从创建和修改基本对象练习开始:
* m7 l: i' t6 V0 D" W! C, [;;;c:aline函数用Active方法绘制一条直线和一个圆
$ t& f2 Q& {# @! R+ g(defun c:aline(/ doc mspace uti p1 p2 line);定义命令aline
2 N8 O+ q( D0 g6 z# n P% ^ (vl-load-com);加载扩展函数) x9 s$ X, n+ K( l
;获取AutoCAD应用程序的当前活动文档对象- N% F" u+ V( a# c! w. C
(setq doc (vla-get-activedocument (vlax-get-acad-object)))
% G1 H7 z- C1 b! B+ S4 r4 z (setq mspace (vla-get-modelspace doc));获取模型空间对象
' ?8 u( [: S3 A/ B1 K9 Z (setq uti (vla-get-utility doc));获取命令行实用程序对象& l4 U( s2 w$ L/ w$ N0 y/ ~3 W# B8 J
(setq p1 (vla-getpoint uti nil"\n输入直线的起点: "));和getpoint类似,uti(命令行)& Y8 I y% O9 h+ J" Y& X
(setq p2 (vla-getpoint uti p1 "\n输入直线的终点: "))
* ^! d: W8 K, }- k; f (setq line (vla-addline mspace p1 p2));在模型空间中添加直线' m1 c, R& U, `2 X1 u
(vla-addcircle mspace p1 (vla-get-Length line));以p1为圆心,line长为半径画圆
( t" L2 J$ v7 r# j* ^- i) E7 b5 }. P' [ (princ)
' |2 F. e2 |0 l- @; q8 P5 T)
6 X+ ~ _+ b/ Q. s3 H5 d* a# x;;;c:alt函数用Active方法对一个圆进行操作
, P% G' j7 ]8 G4 ?# b+ ]2 G: ~(defun c:alt(/ doc mspace uti e1 e2 dis color);定义命令alt5 k8 `0 l9 G8 _1 g
(vl-load-com);加载扩展函数
& J, j& I0 `0 A+ w' ~- ~9 S) |& |# Q7 n ;获取AutoCAD应用程序的当前活动文档对象
% \" ]7 Y1 u, r5 I( K (setq doc (vla-get-activedocument (vlax-get-acad-object)))
- ]3 H/ b5 f, r3 [0 F (setq mspace (vla-get-modelspace doc));获取模型空间对象5 _2 L0 y" X& b" M/ Z. z2 ~! ?
(setq uti (vla-get-utility doc));获取命令行实用程序对象' J, t! c+ j' k5 C% p6 h
(vla-getentity uti 'e1 'e2 "\n选择一个圆: ");参数带回返回值(特别),类似于entsel. o8 Q7 u0 f9 h9 |; J* f
(setq dis (vla-getdistance uti nil "\n输入圆的新周长: "));相当于getreal
6 t9 k4 Q% U" |8 @! O (setq color (vla-getinteger uti "\n输入新的颜色号: "));相当于getint6 c9 W; k4 U7 P& Y9 F, g1 e% U. a
;(vlax-dump-object e1 t)这一句用于查询vla对象(e1)的属性和可用方法,下面的三种方法都支持9 v/ w6 V. ?2 L/ u
(vla-put-Circumference e1 dis);e1是vla-getentity返回的圆对象,vla-put-area对它赋新值4 R% @# Q5 X6 v: `/ Z1 }- Z
(vla-put-color e1 color);更改对象e1颜色
9 D" D8 ~7 b# w7 X2 S$ O2 C, A" q (vla-Arrayrectangular e1 10 8 1 2 2 0);矩形阵列e1对象
/ V$ }( ~# g- ~1 e)
9 W& x" D/ a( d7 D }7 t注意:程序里提到的对象都是VLA对象,和图元对象是不兼容的,这里用的都是纯VLISP函数语法,一般习惯AutoLISP的会将两者结合转换使用,比如:
$ ~! l5 J1 s6 \1 m(setq e1 (car (entsel)));点选图元,图元名给e1
4 T5 s$ j) ]. }" ^# Z5 r(setq v_e1 (vlax-ename->vla-object e1));将e1转换为VLA对象(转换回来用vlax-vla-object->ename), S5 v% c$ X' R! w( W3 H
* h0 n, |2 X4 Z# f4 d- \- y
(vla-getentity uti 'e1 'e2 "\n选择一个圆: ");参数带回返回值(特别),类似于entsel* @8 [5 q! W+ e4 A1 b# a" @
上面这一句比较特别,一些像vla-getentity这样的函数能自带参数返回值,无须用setq,它将vla图元名直接传给e1,拾取点直接传给e2,后面直接用就是了,这一点我喜欢。
8 b! j! b* r' ~
& a a, }* F9 T1 b/ |( N. ^ B: R' e2 D) `
- Q& d" \* R( Z% e/ z
' l! ~9 T z/ Y, r" v
1 V% P7 c6 V7 @4 S& Y: q- _
[ 本帖最后由 yrgui 于 2008-10-13 17:31 编辑 ] |