|
|
发表于 2011-8-6 06:51:03
|
显示全部楼层
来自: 中国辽宁
貌似这是 ACAD 高版本 ActiveX 的一个BUG,到目前为止我们似乎还只能绕开它. 9 x# ]* y X$ a- T
可用的方法大体上有下面几种: 2 \: d* x5 n c! C
一.使用 Document 对象的 SendCommand 方法
: |8 ]% z: `. ^; C' B, T- 3 Q4 H Q5 o7 h. \5 r* D6 u" @9 Q
- ThisDrawing.SendCommand "-insert d:\drawing8.dwg" & vbCr & "2,2,0 1 1 0 "
4 U) c, w( k% A* s( n8 w6 O: M
复制代码
7 P, }: I) @# c5 F- {5 }二.首先创建一个用于过渡(中间?辅助?)的新文档,并做为全局变量,用 InsertBlock 方法插入外部块参照.当其它文档需要插入该外部块参照时,从这个过渡(中间?辅助?)文档中拷贝过来,而不再使用 InsertBlock 方法* ?* `. {" q4 j5 G. x3 c5 @
下面两段代码中都引用了 ObjectDbx 类库,目的是在后台运行这个过渡(中间?辅助?)文档,以免它在前台添乱.运行下面两段代码前应引用 ObjectDbx 类库+ m) ?8 R: o, N- H
-
( s3 h1 M8 n" s% i - Dim AxDbDoc As New AxDbDocument, Objs(0) As AcadBlockReference, Inserted As Boolean
0 W1 T6 j2 q$ N8 H. \ - : b; {: u% X t% l
- Sub Sub1() }0 x! b: k2 H5 v1 J3 M
- Dim insertionPnt(0 To 2) As Double
: G. v) B$ k) S5 }$ I- J - Dim blockRefObj As AcadBlockReference
7 l( J/ _$ q% ]" a - Dim V As Variant, P(2) As Double
* w% [' `0 G% n+ {) F -
& H; d& V% r1 @& X9 H& c - If Not Inserted Then' M* A& v. n8 g& s2 U
- Set Objs(0) = AxDbDoc.ModelSpace.InsertBlock(P, "d:\drawing8.dwg", 1, 1, 1, 0)3 |, ?- \; i9 l$ R$ w& X$ z
- Inserted = True0 r. j f- h( E7 v8 }7 g0 Z
- End If
D0 D% X `3 l" F4 j5 [0 Y+ V1 \ -
) u: `+ F5 X& e- P! ?' F6 X( [ - V = AxDbDoc.CopyObjects(Objs, ThisDrawing.ModelSpace)
. L" B( S9 s1 I, | - Set blockRefObj = V(0)" U q7 t1 @; n3 ]
- insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 0
9 l6 y0 @" p! g. A! T4 v7 R2 N: Q - blockRefObj.Move P, insertionPnt
* j$ x- I8 T4 f6 {9 _ - # `: [# n1 b! Q( W3 s9 Q/ Y9 O
- ZoomAll
3 I% u' f" ^+ ]. X8 C7 Q2 E - End Sub
# T' {; x+ ]9 ]! U
复制代码 ' n+ n# z! @7 I! V- s1 O
三.自己编写一段插入外部块的函数,代替 InsertBlock 方法插入外部块
0 Q1 o/ p- U, A& |% i. F- 4 `' ?" J& `. ?9 }* G
- Sub Sub2(); s: R( y3 y4 z8 m
- Dim insertionPnt(0 To 2) As Double
8 ~% y- H- v' R - Dim blockRefObj As AcadBlockReference
$ U* _( O9 c( W* k) B. E, f _ - insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 0
* I$ o; q! H7 k0 c1 i# C% k - Set blockRefObj = InsertBlock(ThisDrawing.ModelSpace, insertionPnt, "d:\drawing8.dwg", 1#, 1#, 1#, 0)8 a" e$ v) D4 _4 T( b5 }" G
- ZoomAll
( d& w# z6 }, d6 [. x# o - End Sub( C5 Z. _( L J
- - o1 n$ u% J; w3 y+ v9 Z
- Private Function InsertBlock(ByVal Block As AcadBlock, ByVal InsertionPoint As Variant, _8 D8 p% W8 h& ~$ n6 G( p
- ByVal Name As String, ByVal Xscale As Double, ByVal Yscale As Double, ByVal Zscale As Double, _
4 p8 z) Z! R0 K8 _. ^1 [7 H. U+ L+ y - ByVal Rotation As Double) As AcadBlockReference
: b( F+ f% H+ I* V, P! ^ - Dim BlockName As String
- c3 z6 n. `% e4 Z - Dim D As New AxDbDocument, E() As AcadEntity, I As Integer, B As AcadBlock, P(2) As Double
+ m6 a' _/ D% E! f5 B$ {3 S -
4 w( B+ D1 o3 {/ a - On Error Resume Next7 i @+ S- r8 l# b9 _( J
-
1 e0 h$ k. ^' @$ Y - BlockName = Right(Name, Len(Name) - InStrRev(Name, "")), J/ O+ g$ |5 ]5 c% N! x- O u- v
- BlockName = Left(BlockName, InStrRev(BlockName, ".") - 1)
/ y2 K5 U+ [3 S2 W. B$ B - % w# e9 U$ g/ ?& I, q
- Set InsertBlock = Block.InsertBlock(InsertionPoint, BlockName, Xscale, Yscale, Zscale, Rotation)
5 _% d$ v2 \- O9 T9 |0 \ - ) T9 Q1 K8 _! }
- If Err Then
' _9 L! i! U7 W* A - D.Open Name( r* W6 Q# s* ^; J& `
- If D.ModelSpace.Count > 0 Then e% d; E) }% N
- ReDim E(D.ModelSpace.Count - 1): }) F5 U8 n# j6 K/ } b: d$ i7 K
- For I = 0 To D.ModelSpace.Count - 1
0 Y$ r. H2 D3 p1 G# ^7 L - Set E(I) = D.ModelSpace.Item(I)/ P1 K( S5 p X- t
- Next7 L7 b, P6 ?- y$ W' \
- Set B = Block.Document.Blocks.Add(P, BlockName)0 O, V! N$ k3 N, t) T. _
- D.CopyObjects E, B
1 h' T" W2 |; q- l( Q* x - End If
0 f7 E" @* i f, I9 Z8 R* a - Set InsertBlock = Block.InsertBlock(InsertionPoint, BlockName, Xscale, Yscale, Zscale, Rotation)/ |9 a- \. i- m7 Y0 {
- End If
% f3 U6 S, t+ N' |- b4 k) W - End Function
7 {. ?- m+ r& ]/ d; K
复制代码 |
|