|
Autocad VBA初级教程 第十三课块操作
定义块方法:
6 h+ Q* L: r, u' H4 l, r2 U
9 q! n, P9 p$ l/ a; Y, l* D! gSet blocksobj=ThisDrawing.Blocks.Add(基点, 块名)
& e( C9 E& f' y* t把选择集加入块中的方法:" ~, y( ?6 b) i, D: j7 l0 D! \) @
ThisDrawing.CopyObjects(选择集,块)/ Q3 N3 }9 A% E0 P( N& s! r
插入块方法:
( n" e& u- ]' H: @- L: WThisDrawing.ModelSpace.InsertBlock(插入点,块名, X轴比例,Y轴比例,Z轴比例, 旋转角度)
9 p, a# ]0 n, t; y! [" o b画块属性方法:
3 S$ o7 ] D, ]9 p3 Y+ eThisDrawing.ModelSpace.AddAttribute(文字高度,模式,提示字符, 插入点, 显示字符,默认值)# J1 R7 U( Y; t$ G( W
一共有五种模式,在输入时会有提示,其中最常用的是“acAttributeModeNormal”普通模式/ V4 E! F+ l# n* d; w
# D/ L A2 [3 Q+ r: M3 C9 D. B( J V" y
下面的例题是利用属性块画足球场的阵型图。4 h: K4 K+ w$ [
程序画出一个球员块,然后把块写到用户指定位置,球员号码由程序自动递增,把球员姓名改为用户输入值。画足球场请参阅上一课内容。- s, }0 {: P" I P' `& x6 M' d
; r3 l0 g# O0 x2 e, F% D
1 A0 N1 `" X$ \. k
) e7 ? z* R" f" Z/ L
9 v; ~/ r) _ l( L7 j- G: r$ \' T6 h, \5 u( `
# o( c* U& @# |- M: W. c, V. p3 n编程思路:
8 S! v( g7 O- i% g' O ]6 j1.定义一个空块
$ V+ B ?0 ]( I0 b) _# [9 {' \2.在块中画一段弧(球服衣领)
0 k) A1 O$ Z% o( c3.画多段线,镜像画出球衣
' d7 b P0 a! Y/ M4.画块属性,由于块属性默认的对齐方式是左对齐,而球员号码应该居中,所以必须把块的对齐属性改为居中。但是当这个属性更改时块属性对齐点会自动归零,所以不得不再次更改对齐点属性. o, H2 \8 |) p/ v
5.把多段线和属性复制到块中; ?4 w1 _) ]1 f2 Q( a9 U4 e
6.提示用户点选球员位置和姓名1 K/ @" _. A: @: j o3 f: e
7.插入块,修改球衣号码属性、球员姓名属性4 @9 v; I/ b! r- [2 M
1 L& W% `+ a; }( g
以下是源码,附有详细的注释,如果有疑问,建议用变量跟踪法研究一下。( n1 ^9 f D' O, T& g H
Sub team()
6 B+ m. P. d, p) @* X* tDim playerlay As AcadLayer '定义球员图层/ i9 N& o5 Q$ p% f( u
Dim playerblock As AcadBlock '定义块变量8 S9 x' G5 T& Q: S* A/ S" [
Dim arcc(0 To 2) As Double '圆弧圆心# A6 }5 J7 ~1 z
Dim linep1(0 To 2) As Double '线条端点1
3 i/ C7 T& K6 fDim linep2(0 To 2) As Double '线条端点26 \. B3 T& a! x
Dim pline(0 To 20) As Double '定义队服右侧多段线7个顶点& l7 f! r) c8 ?; z* q: K+ E1 n( m
Dim basep(0 To 2) As Double '块基点7 w8 C h3 Q- |7 Z$ r
Dim playernumberpoint(0 To 2) As Double '块属性插入点
( P$ W! H% C( m" e# f oDim mytxt As AcadTextStyle '定义mytxt变量为文本样式* Z. q1 b7 {( ^. q, |; F
Dim blockRef As AcadBlockReference '定义块属性变量& `' _1 i0 h: E3 b, P
Dim Attr3 As Variant '插入块属性变量
% T3 P9 j" ~) T% r- C9 ~3 \
# p( H/ F8 o3 G; m3 A$ k' d TSet playerblock = ThisDrawing.Blocks.Add(basep, "球员") '定义一个"球员"的块
& }5 K! d& C* E0 N; h+ T# ? S- R1 k; K
arcc(0) = 0' D0 M9 I! D7 V3 e
arcc(1) = 430
5 `+ m* ?1 x. d7 D1 H4 u, ^% _Call playerblock.AddArc(arcc, 50, ThisDrawing.Utility.AngleToReal(180, 0), 0) '画弧并加入块中) H9 C/ Q( {. z
& m" G- K9 a2 G+ g; Z g" Q
pline(0) = 0
% b: G0 q9 M: A/ t# ^1 y7 ]. P% kpline(1) = 20
$ E4 Z6 ^+ \. e8 B2 ~
6 A8 w1 R' z2 Epline(3) = 100
) M" I( o9 h: D* C1 p3 J$ ?pline(4) = 202 i" v: B' ]5 C% h
6 n4 E' n" p7 h" F) T8 J
pline(6) = 100
5 w2 U8 R( a! C# x+ T! R/ mpline(7) = 250
6 `! j8 r$ e! j; J" _2 C: \/ \5 R1 n1 M9 D1 h1 S6 G4 O
pline(9) = 1257 \4 R- U, a1 M) c* Q8 |
pline(10) = 207
$ [* A7 f. M3 Z# h" w/ Q4 r" W6 l6 d
pline(12) = 212) ~ E7 o, U- _* f1 F6 k E8 t7 o( F
pline(13) = 257
( s; v) {! j% r" x8 u; X' O$ v; o4 C7 X
3 B+ Y2 z8 G9 L+ Y' ^1 E) x/ o8 k; t
pline(15) = 112
. E7 p* v( L+ A4 Q, \pline(16) = 4309 y1 P7 j" o$ u$ l4 w3 t! d, [( T4 O
6 S* ^7 ?/ v1 c+ I r+ I7 t
3 _0 X4 r; ]$ Upline(18) = 50/ `6 L: H$ C+ ~" V
pline(19) = 430
; `; `: i" w+ {1 F0 |" G2 Y- {$ X0 g
Set line1 = ThisDrawing.ModelSpace.AddPolyline(pline) '画队服右侧多段线
/ f& j( }' @* L# b* @0 n9 N4 C" G" j |5 _8 j# `$ W
linep2(1) = 1 '镜像轴第二点位于Y轴上任一点* e9 g" K1 U$ c% {$ F( ]
Set line2 = line1.Mirror(linep1, linep2) '镜像获得另一半多段线
6 D1 _9 \: B- _& i4 \8 `+ s3 W
1 f+ W* C* r8 I: r0 VDim p(0 To 2) As Double '定义坐标变量; S$ _/ d$ J! D# ~+ K9 I
Set mytxt = ThisDrawing.TextStyles.Add("mytxt") '添加mytxt样式" V5 p, P8 f/ e
mytxt.fontFile = "c:\windows\fonts\simfang.ttf" '设置字体文件为仿宋体2 x# a4 n2 S( o1 g) P! y: T, n4 D
ThisDrawing.ActiveTextStyle = mytxt '将当前文字样式设置为mytxt
" y3 }5 s! Y2 J: g H
3 H3 L; [5 q7 J, s* X1 Hplayernumberpoint(0) = 0 '块属性位置& m$ w2 L: \ J3 t) n- s
playernumberpoint(1) = 200
_; C! l1 V( ?$ @; ~( r/ d7 U" LSet attr1 = ThisDrawing.ModelSpace.AddAttribute(100, acAttributeModeNormal, "号码", playernumberpoint, "X", 0) '画块属性3 O* ]# d. S; d' o9 B: U7 t3 o
attr1.Alignment = 7 '居中5 I5 p( D, @. O% f8 C1 e4 K' h
attr1.TextAlignmentPoint = playernumberpoint '重定义对齐点. n( w D: N! p: s- F. f5 F
Set attr2 = ThisDrawing.ModelSpace.AddAttribute(100, acAttributeModeNormal, "姓名", playernumberpoint, "???", 0) '画块属性5 n+ |$ r2 v# _3 r
attr2.Alignment = 7 '居中/ ~5 H6 q5 d( k0 I8 K1 y0 S. m
: `: Q9 S( n0 z# {
! K% \) W5 ^2 o. W& c* T! ?Dim objCollection(0 To 3) As Object '创建选择集
, c( S3 [% I4 A/ A5 VSet objCollection(0) = line1 '线条1加入选择集
* |3 }" `1 _! [% C0 T, B$ mSet objCollection(1) = line2 '线条2加入选择集" {1 f. D$ f& H# |. D
Set objCollection(2) = attr1 '属性1加入选择集
* E- h% `; Q2 e, ~, e' @, zSet objCollection(3) = attr2 '属性2加入选择集
- e9 E/ q- p1 R* }+ b! g8 h9 g2 Y) w% F7 Z1 V
Call ThisDrawing.CopyObjects(objCollection, playerblock) '把选择集加入块中
& j Z2 m; |2 h& f, D# z
, I5 l: H; J5 D1 ZFor Each element In objCollection '在选择集中进行循环
/ W8 ]/ H2 T* F; v! D& I element.Delete '删除线条和属性(此操作并不影响已创建的块)8 P/ H4 _6 u0 F8 ` j! |
Next
8 w+ P1 U, }) h
9 j# W \' M% p* I1 K& S3 k1 H& W& J+ O8 {( @( a' N8 I
Set playerlay = ThisDrawing.Layers.Add("球员") '新建图层
2 A& ^0 s0 a, N! g! o k3 k Pplayerlay.color = 2 '为黄色8 L6 K1 p! ?$ j
ThisDrawing.ActiveLayer = playerlay '将当前图层设置为球员图层
2 m _: d5 D0 ?5 Y c* j& A0 Q, f- I$ @+ Y# q" q* E
Dim p1 As Variant '块插入点位置: L% D/ W* H+ n7 V4 v
% C' n( W! X1 j& X. k! C
For i = 1 To 11 '插入块
5 H, H1 z+ z. n7 H# X! ?; G( R6 W pstring = CStr(i) & "号球员位置:"
! E1 h5 q; O: Q9 O" h- d/ Z+ r p1 = ThisDrawing.Utility.GetPoint(, pstring) '点选球员位置坐标
1 P& H" q7 z9 G: v8 e6 ~+ x$ P nstring = ThisDrawing.Utility.GetString(30, "球员姓名:")
% ^% ~" N$ k& R Set blockRef = ThisDrawing.ModelSpace.InsertBlock(p1, "球员", 1, 1, 1, 0) '插入块, ?- S/ j; A$ D0 D" m
Attr3 = blockRef.GetAttributes '获取块属性7 J$ W0 |7 J8 D4 [2 Q2 y
Attr3(0).TextString = CStr(i) '赋值球员号码
& v y' N L5 ?+ I1 p Attr3(1).TextString = nstring '赋值球员姓名
5 K3 i! C4 F6 B" `: sNext3 R9 B F+ D1 ]1 V$ x, D, o
( ~" P7 m5 n" y4 o) _ `# D0 QEnd Sub
6 B- ]) }2 S4 F9 k
4 R) S# s n" R n$ |9 T" s本课思考题:
' b% y N/ U& _4 @; h8 v' i# \1、在本课例程的最后一段增加出错陷阱代码,当用户输入非正常数值时退出程序
8 U/ A' v, I: a2 R* O+ Y5 t. e2、画一个简易路灯块,用属性块做为路灯编号,由用户点选路灯位置,程序画路灯时自动为路灯编号 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|