先简单介绍两条命令:# @$ u R) v" a1 ^. f
# j" X( x* `* V/ c. Z+ {1、这条语句可以建立图层:7 ~1 O$ q& ?9 i8 E' P p4 \
ThisDrawing.Layers.Add("新建图层")$ s$ E+ o0 A% k$ Q7 b; `( n3 D0 q
在括号中填写图层的名称。2 i A4 q3 [, S% l3 u0 ^
; k5 I" ~: @% I4 g2、设置为当前的图层
. p4 ~2 }% V& Q! p1 ~# n9 ?ThisDrawing.ActiveLayer=图层对象
5 {0 u# ?, \9 O% `$ y% Q' j" ~注意,等号右边的变量不能用图层名称,必须使用一个有效的图层变量
2 s [; m; `! v2 i; J q6 c4 n2 Q4 b; X- L1 u6 M
以下一些属性在图层比较常用:
& O4 w( f* O, e+ e* Z* QLayerOn 打开关闭
- H- Y+ R5 t4 {: b0 K4 _ KFreeze 冻结
2 p& q, Z% \* g7 t0 k! g0 \Lock锁定
3 `' ~1 Y* W2 s, p/ O4 MColor 颜色9 G( g* _5 E3 ^+ P8 P
Linetype 线型) _1 Y1 I( S" S0 x, ~8 B* t
# a0 a, N* [" b/ i8 l3 T. m
" V) A- ^. l: q* ^1 n看一个例题:
y9 i- K1 `; H+ o3 ~2 c) B5 J: N' {1、先在已有的图层中寻找一个名为“新建图层”的图层
* B- s0 `( N& Q; P; i$ u- n2、如果找到这个图层,显示该图层的信息,并提示用户是否需要设置为当前图层,如果用户确认,则设置为当前图层。+ S' d8 V- C' L: y
3、如果图层没有找到,新建一个名为“新建图层”的图层,设置为黄色,HIDDEN线型,并把这个图层设置为当前图层. X, W m( l9 Z7 b
$ h5 z. r( a' ]* M. R# A4 x
Sub mylay()% A3 D: F5 Q$ @! ]- u
8 V7 p8 J, c9 e' p, h
Dim lay0 As AcadLayer '定义作为图层的变量
; K3 S5 [' k' P" MDim lay1 As AcadLayer
" u" ~+ g$ f$ M
+ n6 {. \+ A% H) ^findlay = 0 '寻找图层的结果的变量,0没有找到,1找到
5 E$ `3 p U. ?, m
5 ]- c) y* R) u5 Q C+ |! tFor Each lay0 In ThisDrawing.Layers '在所有的图层中进行循环0 A5 j- I2 h6 @4 |1 W: C+ j
+ x% U P* \; a6 ^& b9 `; g If lay0.Name = "新建图层" Then '如果找到图层名
1 o/ E! K G8 t7 X; e! ?6 a2 {4 w findlay = 1 '把变量改为1标志着图层已经找到 [! c" u2 }; [( s0 b4 ^6 `* o
msgstr = lay0.Name + "已经存在" + vbCrLf
# i# Q7 L9 ?, n9 V* }! d msgstr = msgstr + "图层状态:" + IIf(lay0.LayerOn = True, "打开", "关闭") + vbCrLf
& V8 J ~+ t6 g6 S& { msgstr = msgstr + "图层" + IIf(lay0.Freeze = True, "已经", "没有") + "冻结" + vbCrLf
0 C0 H3 E8 L( a. ?4 v+ M% K msgstr = msgstr + "图层" + IIf(lay0.Lock = True, "已经", "没有") + "锁定" + vbCrLf
) x( ~8 d( x+ A+ K msgstr = msgstr + "图层颜色号:" + CStr(lay0.Color) + vbCrLf
7 T3 L9 \( f" m- k, y2 | msgstr = msgstr + "图层线型:" + lay0.Linetype + vbCrLf
4 q `: h9 N# ?# z6 x. v* N7 B0 Y msgstr = msgstr + "图层线宽:" + CStr(lay0.Lineweight) + vbCrLf
9 P9 n# ?, `- E! X3 {' C0 B msgstr = msgstr + "打印开关" + IIf(lay0.Plottable = False, "关闭", "打开") + vbCrLf + vbCrLf
5 u( x1 y+ n* B: z- v" e msgstr = msgstr + "是否设置为当前图层?"
) e% P0 k- [! l" d; { If MsgBox(msgstr, 1) = 1 Then '如果用户点击确定8 T7 x# U( p9 k. B
If Not lay0.LayerOn Then lay0.LayerOn = True '打开
! B8 U& |# H* f3 p. {; Z ThisDrawing.ActiveLayer = lay0 '把当前图层设为已经存在的图层0 Y# o# J5 Z% z% A6 w
End If
8 @: @) J! O& A9 m8 @ Exit For '结束寻找# Y+ z+ \$ O% c) N- e' n8 t
End If% _" D6 W4 Y; V4 S, D+ |9 I+ m
Next lay06 D6 J* E3 g& F/ P# e
2 Y6 ~5 L( ^1 p
If findlay = 0 Then '没有找到图层2 N! e' { {! M) {! t8 B# [$ S
Set lay1 = ThisDrawing.Layers.Add("新建图层") '增加一个名为“临时图层”的图层4 P6 ]9 Q* _) o& W6 j( B
lay1.Color = 2 '图层设置为黄色
4 f9 F8 s- o1 j1 G 8 L. L! B. z O |
ltfind = 0 '找到线型的标志,0没有找到,1找到
* a" Y8 F+ [0 P; A' a7 [1 D# s For Each entry In ThisDrawing.Linetypes '在现有的线型中进行循环( H& ?( @6 a; t; \
If StrComp(entry.Name, "HIDDEN") = 0 Then '如果线型名为"HIDDEN"9 ~% t1 n* A& e% t5 ?6 Y
ltfind = 1 '标志为已找到线型
t' h. Z' j( H Exit For '退出循环
2 @4 Z; E! ^3 S; h, V0 p End If+ l/ U. ?; g3 g0 m7 C
Next entry '结束循环( [' l; l! y$ K# E
: N' l; e. p* Q# I If ltfind = 0 Then '没有找到线型+ `5 p( }; j! X) X: b( @% P8 D
ThisDrawing.Linetypes.Load "HIDDEN", "acadiso.lin" '加载线型
* Q! V/ ?* j% ]+ f* I$ W End If
0 A5 a8 q' O# T. s2 A lay1.Linetype = "HIDDEN" '设置线型
8 E4 D; b9 P4 n+ Z2 K: c: ]4 s8 s( i9 ^' F% B+ y
ThisDrawing.ActiveLayer = lay1 '将当前图层设置为新建图层6 M; _/ c( V* `# p1 `& @7 j1 n2 d
End If
% u1 O! s5 c" O' ~6 ]3 s9 N: u+ m2 |; N# l
End Sub3 Q& `4 z* R* C/ ]' T% Q$ |9 S! ~
+ I, w) N/ s5 d# z在寻找图时时我们用到for each……next 语句: u5 w: P Z9 m0 P8 T
它的语法是这样的:; N) i/ J# b [4 g1 P2 F
For Each 变量 In 数组或集合对象
, h4 C; ~) @% m) _: h……3 o! |+ w3 E: E; w. J
exit for / k2 t& I" ^- A- ?9 f- @. V
……* N$ r7 d1 k; L( a: f, T
next 变量
5 R* s1 H% t/ _6 L, l M W它的作用是在数组或集合对象中进行循环,每循环一次,变量就成为数组或集合对象中的一个元素。本例在所有的图层对象中进行循环,每循环一次layo变量就代表一个图层
! i/ g8 J/ D8 S) n在循环体中遇到exit for 语句则退出循环,如果没有 exit for,循环将在所有的元素都操作一遍后结束。
6 P0 X7 w1 s! z% m) C* O! S0 ^+ J0 ~! N7 h$ T' p( s& d
If lay0.Name = "新建图层" Then
) v5 e; E. Q1 x. G9 o' qlay0.name代表这处图层的图层名$ L3 {, r$ }7 n0 C; z( v
) w. R O% J/ g4 v
IIf(lay0.LayerOn = True, "打开", "关闭")
]* `, a' ` X9 O8 L& s. f这是一个简单判断语句,语法如下:" S- T' G! N( \% ]: U; i y+ N2 A) m
iif(判断表达式,返回值1,返回值2)
. u/ e) f0 X3 n+ }当判断表达式成立,函数值=返回值1,如果表达式不成立,函数值=2
) u) w2 s3 b9 u! M7 z" F7 w
' n( Y5 A5 p: d, l- C% aMsgBox(msgstr, 1)
8 S; `) |; w4 KMgbox显示一个对话框,第一个参数是对话框显示的内容
+ G' p* ^% y& P9 T第二个参数可以控制对话框上的按钮。
( a w; @# `9 F) e% e" {0 只有确认按钮$ @! l* @- V. Y+ b2 Y2 H
1 确认、取消
5 |6 I+ y. w0 t8 ]2 终止、重试、忽略
/ o. ]1 Q7 P* ^0 m$ I; {) c3 是、否、取消
+ F2 S' R/ K) @9 M4 是、否. r' l' }4 h& s5 D
MsgBox获得值如下:' o6 A, k0 z% Q' X; n
确认:1
, p' r$ q0 m) g5 \取消:2
* K) i% x$ n% t; a终止:3
4 ^* C% X: x2 T; X. d重试:4
, r/ D: J9 n7 e$ ]9 r* d7 T忽略:5 A# S. U5 Y# L% @3 @4 {8 O
是:6/ h3 ]5 I: n/ c, y
否76 x4 Y$ K' ^4 O! H {7 c. y
初学者不需要死记硬背,能有所了解就行了
6 Z7 z7 V+ w# y( O/ p4 U
/ ^. W$ R7 x+ T5 S0 ?9 ]6 [5 WACAD图层中最麻烦的就是线型问题了,本例先寻找一个HIDDEN线型,如果找不到就加载这个线型,用这条语句:$ X5 _9 U! Q/ h3 a4 b1 L9 Z) ^! T& T8 f
ThisDrawing.Linetypes.Load "HIDDEN", "acadiso.lin"
5 K4 o/ \. ], a n- xThisDrawing.Linetypes.Load后需要两个参数,一个是线型的名称,另外一个是线型文件的名称。 |