三维网

标题: Autocad vbA 初级教程(13) 块操作 [打印本页]

作者: zzb7240    时间: 2006-9-22 15:59
标题: Autocad vbA 初级教程(13) 块操作
定义块方法:, `9 G' U- [3 s, n. W; @) I: j" F
Set blocksobj=ThisDrawing.Blocks.Add(基点, 块名)
" K% U3 O) h4 G# A$ n0 p把选择集加入块中的方法:
; G6 Q* [+ {3 b1 J& {' ~1 R! ^1 EThisDrawing.CopyObjects(选择集,块)' W1 h( _) L. J
插入块方法:
/ s+ F7 O) b1 @( F) dThisDrawing.ModelSpace.InsertBlock(插入点,块名, X轴比例,Y轴比例,Z轴比例, 旋转角度)
! W/ D+ ~2 J7 ]9 H6 ~画块属性方法:  e; ]( d% e2 N5 P
ThisDrawing.ModelSpace.AddAttribute(文字高度,模式,提示字符, 插入点, 显示字符,默认值)( N/ A$ u) y7 y1 W# \5 O
一共有五种模式,在输入时会有提示,其中最常用的是“acAttributeModeNormal”普通模式
* `* ]) |! ~. @* W9 }9 ?. H编程思路:
6 Y/ c. n" {7 u2 V: l1.定义一个空块5 n" a, V: G( c! c% {0 b
2.在块中画一段弧(球服衣领)# k, m, H6 \! X; L$ L
3.画多段线,镜像画出球衣5 J1 u  p- ]  E9 s) S
4.画块属性,由于块属性默认的对齐方式是左对齐,而球员号码应该居中,所以必须把块的对齐属性改为居中。但是当这个属性更改时块属性对齐点会自动归零,所以不得不再次更改对齐点属性7 f& X9 f/ G! i
5.把多段线和属性复制到块中
5 u# U6 P; Y' {2 U( m6.提示用户点选球员位置和姓名" ]$ f8 S. ~5 v/ r( X
7.插入块,修改球衣号码属性、球员姓名属性
1 c; h# b7 D( F. v2 Q3 A$ W& j( C3 _
% @. H7 j8 L1 C4 h, m- Z以下是源码,附有详细的注释,如果有疑问,建议用变量跟踪法研究一下。
, b: N* l: @. Q0 t& ESub team()
; i$ r) y6 O1 m3 u; q+ c$ K- PDim playerlay As AcadLayer '定义球员图层
4 L3 f1 p: [0 d( ]# C; pDim playerblock As AcadBlock '定义块变量
7 U# b: `2 Q7 k$ H% c9 |Dim arcc(0 To 2) As Double '圆弧圆心' E% Z2 F8 D5 o: u' b. n! I8 |
Dim linep1(0 To 2) As Double '线条端点19 l2 Q9 X8 z) [8 \: ]% z
Dim linep2(0 To 2) As Double '线条端点2
6 s; N! J, f9 l  }( nDim pline(0 To 20) As Double '定义队服右侧多段线7个顶点
+ x% }4 b( Z/ f$ }* CDim basep(0 To 2) As Double '块基点
8 O3 y! n$ m1 J5 h! L' R- `Dim playernumberpoint(0 To 2) As Double '块属性插入点+ |6 C( U6 B9 m+ K# q
Dim mytxt As AcadTextStyle '定义mytxt变量为文本样式
1 b0 z, o3 m5 o- f( WDim blockRef As AcadBlockReference '定义块属性变量
/ Q$ N# ^1 S/ tDim Attr3 As Variant '插入块属性变量3 j5 W  ^$ o! D
7 r8 q- j: K" v* @% c- f
Set playerblock = ThisDrawing.Blocks.Add(basep, "球员") '定义一个"球员"的块+ `9 S" \  c* U0 L7 a" q

2 N" r1 S7 U: w5 V% X3 p* Barcc(0) = 0; A/ i; y# W0 L' `8 X2 q
arcc(1) = 4300 g) A& z: D% j8 O, w
Call playerblock.AddArc(arcc, 50, ThisDrawing.Utility.AngleToReal(180, 0), 0) '画弧并加入块中
& j9 P! z6 a7 R6 }4 @& x/ c, \( c) H) ]6 Z7 j
pline(0) = 0
  X2 Z1 G* i7 i! S$ @2 j* Zpline(1) = 200 I+ ~: i* a+ U, b, |, V2 A# A0 P2 H
( v9 }, S$ V$ t0 \  Z/ x/ \
pline(3) = 100
2 I5 n, g& p# e' ?pline(4) = 20
' M0 b! z% J5 w( x' ?
- d6 V2 y1 u. _5 e( {) i$ cpline(6) = 100
& Z, w: j  }# E( A8 v. Zpline(7) = 250
2 w  }0 B: x" N5 t
- p/ J5 W6 z3 D' z6 t* mpline(9) = 125
' m+ K& i3 N, R& ?( {  tpline(10) = 207. Z) y$ j$ {& W) c: X- G
/ Y# t( b+ P' z
pline(12) = 212& |' {2 \$ c" u5 k4 R
pline(13) = 2577 R" h3 x& y3 r; u5 p+ d

7 Q) U' z, {8 _8 h7 M, C& C) A$ s3 C
$ T  n5 w3 k/ @% d8 f+ z$ o* npline(15) = 112
8 g6 z9 ~3 M: D* n$ w, wpline(16) = 430
. n) S; y1 O7 {% k: ?( {% b
  l0 l' d7 k0 c
" R$ {* i0 `' f% f3 apline(18) = 50* m5 h6 }$ \4 x# N, k) ~
pline(19) = 430  [0 T& H( ^& C% H( K, \

6 }* I1 i1 V1 V& y. pSet line1 = ThisDrawing.ModelSpace.AddPolyline(pline) '画队服右侧多段线
, m- N1 O# D+ b3 b8 H3 W4 \8 q' ^3 T$ e. q
linep2(1) = 1 '镜像轴第二点位于Y轴上任一点4 i& {( z* ?. s5 |; {1 z7 |
Set line2 = line1.Mirror(linep1, linep2) '镜像获得另一半多段线- W! e. e9 a0 F% \7 ?

- h1 S4 q1 X' [5 PDim p(0 To 2) As Double '定义坐标变量
, Z4 S; O7 D! ~! O$ ^# CSet mytxt = ThisDrawing.TextStyles.Add("mytxt") '添加mytxt样式
* h2 k1 S4 i! |, u) R& {+ \mytxt.fontFile = "c:\windows\fonts\simfang.ttf" '设置字体文件为仿宋体  b- W3 U' R. ~5 w2 Q! G. k
ThisDrawing.ActiveTextStyle = mytxt '将当前文字样式设置为mytxt
9 ]+ V  ^; y8 ]" c3 g/ p" z( y* H6 F, l4 K: p3 {2 |/ m1 ^+ y
playernumberpoint(0) = 0 '块属性位置
# k0 u0 e; ~& V7 v3 x. Jplayernumberpoint(1) = 2007 z) l. N* v  n. N, U& ^% `! |) L) Y8 @
Set attr1 = ThisDrawing.ModelSpace.AddAttribute(100, acAttributeModeNormal, "号码", playernumberpoint, "X", 0) '画块属性+ g1 @, r! ^% V3 f, H! s
attr1.Alignment = 7 '居中/ R5 Z7 o. c# W5 g  a2 N7 n
attr1.TextAlignmentPoint = playernumberpoint '重定义对齐点& i, x4 z- a4 T% @
Set attr2 = ThisDrawing.ModelSpace.AddAttribute(100, acAttributeModeNormal, "姓名", playernumberpoint, "???", 0) '画块属性( `8 \  A7 H5 U* a, M6 q
attr2.Alignment = 7 '居中3 \  `0 r" E0 j' F3 p$ u' ]6 \

+ u# r" O. A7 _) R8 I0 m9 r' G
: G) v1 I; e: q3 v1 l- GDim objCollection(0 To 3) As Object '创建选择集
3 `  C: H2 X' Q/ f: g* E$ JSet objCollection(0) = line1 '线条1加入选择集
9 I5 k3 q6 l6 k) o) P: rSet objCollection(1) = line2 '线条2加入选择集
! q/ v# L# ?- C2 F: }Set objCollection(2) = attr1 '属性1加入选择集
# N. d5 ]% l) JSet objCollection(3) = attr2 '属性2加入选择集: s- U2 h; d0 H. q3 k, r
+ x: l; ]1 i  n$ F9 m. U7 ]+ L
Call ThisDrawing.CopyObjects(objCollection, playerblock) '把选择集加入块中) `9 t7 m4 L, s2 }( B' V" I9 j3 Z/ h" D
6 a8 s! }. P- ]" A/ {5 V: X
For Each element In objCollection '在选择集中进行循环# q; k( F9 g' K; T' R- h& q
  element.Delete '删除线条和属性(此操作并不影响已创建的块)6 a: l( }# h1 f1 O6 r
Next4 h) U7 k3 T; x! B/ _, n
! ^6 s6 R  x0 m7 A5 V. B  y
9 {. V# V$ |: `5 Y+ A# @" e
Set playerlay = ThisDrawing.Layers.Add("球员") '新建图层
6 o8 P3 w+ q+ A) Gplayerlay.color = 2 '为黄色
2 y  J# W$ t* f+ s* `3 gThisDrawing.ActiveLayer = playerlay '将当前图层设置为球员图层
0 `+ F* C  a& P5 z0 Z( G! K1 n  M+ v# C$ _1 L2 b7 o! M8 t
Dim p1 As Variant '块插入点位置- ~+ a8 o6 U# _( z

$ P4 ~& V# z- a; K: Y9 pFor i = 1 To 11 '插入块: F# l! q# F' F! X/ F) P3 N0 E
  pstring = CStr(i) & "号球员位置:"8 a4 a8 T8 b9 e5 L
  p1 = ThisDrawing.Utility.GetPoint(, pstring) '点选球员位置坐标
* x, ?* o5 K# X8 H0 G) k$ |  nstring = ThisDrawing.Utility.GetString(30, "球员姓名:")
% H% O  r8 Y; @" s$ i! J& y  Set blockRef = ThisDrawing.ModelSpace.InsertBlock(p1, "球员", 1, 1, 1, 0) '插入块  q+ l# n5 r! ^0 ^0 c. ?4 U
  Attr3 = blockRef.GetAttributes '获取块属性
8 \0 q# b0 l0 J# y7 J  Attr3(0).TextString = CStr(i) '赋值球员号码3 `1 F; C$ u% ?6 V
  Attr3(1).TextString = nstring '赋值球员姓名, @1 Q; y! Z2 N2 [
Next  g- y5 @  b8 h& ~" w/ G

' M: w$ f. `! NEnd Sub
作者: ytcadtools    时间: 2008-10-30 11:26
太好了,本人正在研究这方面的程序,借鉴一下
作者: licumu    时间: 2009-2-12 11:28
感谢楼主的分享,在CAD2009中尝试一下,有问题来咨询楼主您。
作者: 林一飞    时间: 2010-1-18 23:04
正在找这方面的资料呀……
作者: cqc2007    时间: 2010-5-25 13:42
非常受用,谢谢楼主
作者: arena    时间: 2010-8-31 17:16
非常詳細的VBA教學,對初學者是一大幫助.謝謝!
作者: baby008    时间: 2010-11-30 17:50
资料很好的




欢迎光临 三维网 (http://www.3dportal.cn/discuz/) Powered by Discuz! X3.4