|
|
发表于 2011-8-6 06:51:03
|
显示全部楼层
来自: 中国辽宁
貌似这是 ACAD 高版本 ActiveX 的一个BUG,到目前为止我们似乎还只能绕开它. % T+ H& X% w7 S" \
可用的方法大体上有下面几种:
/ t ?( b7 h4 b一.使用 Document 对象的 SendCommand 方法5 V' ~2 L9 d) `* D* X1 O0 x
- ' o8 C! [: n# f: B
- ThisDrawing.SendCommand "-insert d:\drawing8.dwg" & vbCr & "2,2,0 1 1 0 " 6 F7 o, y) k; r, U7 \
复制代码 x- Q+ n: p! x5 _7 c) k& d' U. Y! S
二.首先创建一个用于过渡(中间?辅助?)的新文档,并做为全局变量,用 InsertBlock 方法插入外部块参照.当其它文档需要插入该外部块参照时,从这个过渡(中间?辅助?)文档中拷贝过来,而不再使用 InsertBlock 方法/ |' \5 X; d8 G' t! K9 D4 `
下面两段代码中都引用了 ObjectDbx 类库,目的是在后台运行这个过渡(中间?辅助?)文档,以免它在前台添乱.运行下面两段代码前应引用 ObjectDbx 类库) m$ z5 U, P: [, C5 F
-
/ f5 t0 K; `9 k* E* T - Dim AxDbDoc As New AxDbDocument, Objs(0) As AcadBlockReference, Inserted As Boolean
9 z3 W/ C' P/ H& ? - / N+ R9 {/ z, I: [; ?6 W! H
- Sub Sub1()% `. A& }( K5 l
- Dim insertionPnt(0 To 2) As Double
: {( u& ?7 Q; ?; ~' o* H) h - Dim blockRefObj As AcadBlockReference
- j* d' O2 m3 j6 o. m5 j - Dim V As Variant, P(2) As Double3 K! P, {0 c! s1 w# ^; a
-
9 T2 y% C. B- X# ? - If Not Inserted Then
( _+ ?, R$ r3 L3 w9 U - Set Objs(0) = AxDbDoc.ModelSpace.InsertBlock(P, "d:\drawing8.dwg", 1, 1, 1, 0)+ t$ D$ ~0 x& n/ \" ]
- Inserted = True
( g8 V( f+ U# o& _2 q - End If
5 j2 i3 M/ T& G$ L" Q -
1 n5 f" c) C: Q1 b3 u8 Q - V = AxDbDoc.CopyObjects(Objs, ThisDrawing.ModelSpace)8 m, n; y: r7 j% \% P4 _4 E
- Set blockRefObj = V(0)& }# f# G, S- Q+ I) L' I4 N3 T
- insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 0* K& o3 O, R6 s! n& n
- blockRefObj.Move P, insertionPnt) X6 {5 |# i9 ^ o1 h$ u# M. n- u9 O1 N
- 5 U) y9 m$ r: @- K6 G6 F* d/ K- S, H
- ZoomAll
5 x& @" a- `2 }% \ - End Sub
9 U9 |& ]& T+ M( m; I
复制代码
w; w3 n9 p$ Q: i. z6 S7 k" n三.自己编写一段插入外部块的函数,代替 InsertBlock 方法插入外部块% Z# o7 g6 t2 |& L- E+ d0 w
-
! g2 @, k' o! I6 R - Sub Sub2()3 q5 _7 i D& |9 k
- Dim insertionPnt(0 To 2) As Double
# ]1 s& N. {4 W% |) S - Dim blockRefObj As AcadBlockReference2 c" O/ O* z6 F2 ]* R6 k0 \
- insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 0, G S% n( j/ t5 {' b6 u7 ]
- Set blockRefObj = InsertBlock(ThisDrawing.ModelSpace, insertionPnt, "d:\drawing8.dwg", 1#, 1#, 1#, 0)& Z/ t8 t q/ i4 |; t4 A
- ZoomAll
4 C' Z$ F# ~8 n' e6 ]7 M$ f - End Sub
/ t6 j( c" d9 I+ h5 @* t - # P7 Y: `, x+ \% B7 R
- Private Function InsertBlock(ByVal Block As AcadBlock, ByVal InsertionPoint As Variant, _# X- }. Q0 ^, e, \+ w' A
- ByVal Name As String, ByVal Xscale As Double, ByVal Yscale As Double, ByVal Zscale As Double, _
9 j( J" B) V3 r$ } D7 \: _& O$ P - ByVal Rotation As Double) As AcadBlockReference. a; c _2 Q. p I
- Dim BlockName As String
6 F3 y* j0 L* ~* T - Dim D As New AxDbDocument, E() As AcadEntity, I As Integer, B As AcadBlock, P(2) As Double9 [3 l8 D3 s! X9 d; x* o. i$ ?
-
- ^% F) S( W5 @ Q% F2 c - On Error Resume Next
$ f K! P4 c* N4 h9 X - & x0 z7 W: w0 G1 ~( S- f
- BlockName = Right(Name, Len(Name) - InStrRev(Name, ""))
' K5 i) l; o( f# _ - BlockName = Left(BlockName, InStrRev(BlockName, ".") - 1)' x0 {. m0 s: h4 g
-
. l3 `* g$ }. k9 h- U - Set InsertBlock = Block.InsertBlock(InsertionPoint, BlockName, Xscale, Yscale, Zscale, Rotation)
% b; D% `) ~7 J/ H4 ^, x -
- T* J2 h/ u5 y! D - If Err Then
/ d }+ W' ~ S" u6 v; D - D.Open Name2 o, _, C4 A7 e0 I& a
- If D.ModelSpace.Count > 0 Then
: s% ]" k8 s' e! a$ u - ReDim E(D.ModelSpace.Count - 1)
% K% J+ w% {: X T5 s - For I = 0 To D.ModelSpace.Count - 19 j+ b$ ~0 a( _1 G8 G. u- t
- Set E(I) = D.ModelSpace.Item(I), d( t9 G( F f6 e6 K3 v- D
- Next# O, @- m, h3 ~+ T& f
- Set B = Block.Document.Blocks.Add(P, BlockName)- K, V, T6 g G
- D.CopyObjects E, B2 G0 }8 m) a* p8 D* G
- End If
# p f( x. W$ C - Set InsertBlock = Block.InsertBlock(InsertionPoint, BlockName, Xscale, Yscale, Zscale, Rotation)4 Z- t$ w) z1 W$ j& _
- End If
; O" I" [+ j3 L% j4 a - End Function, Q1 V0 ^3 i; ^7 h
复制代码 |
|