|
|
发表于 2011-8-6 06:51:03
|
显示全部楼层
来自: 中国辽宁
貌似这是 ACAD 高版本 ActiveX 的一个BUG,到目前为止我们似乎还只能绕开它. 1 |' H+ \8 s7 A6 S0 o
可用的方法大体上有下面几种:
" z, `: y b4 M3 l一.使用 Document 对象的 SendCommand 方法
/ |$ v$ a. W- |2 |
" Q5 d+ t1 N* q% d+ c# V1 m( ^. l4 d, Z8 V; m- ThisDrawing.SendCommand "-insert d:\drawing8.dwg" & vbCr & "2,2,0 1 1 0 "
! ]% Y* O- I/ Y! h: M, g
复制代码 ) r7 l: f( ~* o: T
二.首先创建一个用于过渡(中间?辅助?)的新文档,并做为全局变量,用 InsertBlock 方法插入外部块参照.当其它文档需要插入该外部块参照时,从这个过渡(中间?辅助?)文档中拷贝过来,而不再使用 InsertBlock 方法
5 O/ q; n6 U) j. B( [下面两段代码中都引用了 ObjectDbx 类库,目的是在后台运行这个过渡(中间?辅助?)文档,以免它在前台添乱.运行下面两段代码前应引用 ObjectDbx 类库2 C, m% @0 g% i) f
-
9 _! w0 Y. u# K' m/ D. e - Dim AxDbDoc As New AxDbDocument, Objs(0) As AcadBlockReference, Inserted As Boolean* P- D3 e# c! _5 p
-
/ t$ _+ s* j/ G$ f+ m, a - Sub Sub1(). t4 V0 |2 {& r( ~2 P
- Dim insertionPnt(0 To 2) As Double/ X; N$ J" [8 X; r' V
- Dim blockRefObj As AcadBlockReference
) m9 S# S( b2 z0 {0 D - Dim V As Variant, P(2) As Double( V; \9 U( ?- Q( A! e
-
# O0 U( ]0 \, s3 Q, v+ D5 K - If Not Inserted Then
$ e* M7 Y/ t$ Z9 y# Y: z6 a - Set Objs(0) = AxDbDoc.ModelSpace.InsertBlock(P, "d:\drawing8.dwg", 1, 1, 1, 0)
* k8 i) r4 C7 T! q% C - Inserted = True7 R& M& t% l7 X+ A
- End If
! X) C, L5 c% q9 X; M - * {, P3 o! e" J' S% R7 L" Q, |; Q+ W
- V = AxDbDoc.CopyObjects(Objs, ThisDrawing.ModelSpace)0 b, c6 D: }3 p% l- J
- Set blockRefObj = V(0)# c( _7 P/ W% h- Q
- insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 0% m! _; n1 M* ?1 t
- blockRefObj.Move P, insertionPnt
! U% E/ G; ?7 }0 e -
% i' I0 g0 T! m1 @7 } - ZoomAll
6 |/ H; c5 b# r- L, I - End Sub
1 f6 J9 Z& l4 x" K2 S
复制代码 ) C. s* F% V9 C7 d/ q' f
三.自己编写一段插入外部块的函数,代替 InsertBlock 方法插入外部块1 u6 D2 g6 U! i7 e: s; A2 Z6 ~3 |
- % n* [) @9 p: {- P5 E
- Sub Sub2()6 s" a6 w1 A! a3 M7 h0 d8 h
- Dim insertionPnt(0 To 2) As Double
" _8 p4 y) m% d' `6 O& U& M - Dim blockRefObj As AcadBlockReference
; I0 N& p+ e, y% e - insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 0$ }, L" t. Y9 i$ h: w
- Set blockRefObj = InsertBlock(ThisDrawing.ModelSpace, insertionPnt, "d:\drawing8.dwg", 1#, 1#, 1#, 0)/ F" n8 x- b4 q. X( |1 i" z! Y* S
- ZoomAll% X- I1 o7 Q: F+ g; y/ Z. ^
- End Sub
. s! K' i0 R y8 d0 D1 K, c) x -
$ z7 i1 K6 y" O5 a1 J - Private Function InsertBlock(ByVal Block As AcadBlock, ByVal InsertionPoint As Variant, _4 N& i: h3 Y9 v) R( E6 j$ X$ _# c
- ByVal Name As String, ByVal Xscale As Double, ByVal Yscale As Double, ByVal Zscale As Double, _
* y7 D; B9 o+ ]/ i# {9 B9 J$ w; O - ByVal Rotation As Double) As AcadBlockReference
8 S3 X9 K( Y) J4 i$ M6 G7 y& t - Dim BlockName As String6 t. e# Q! {" _ y( A
- Dim D As New AxDbDocument, E() As AcadEntity, I As Integer, B As AcadBlock, P(2) As Double
: e$ B) ~# [5 p1 T$ }2 u) t/ B - 6 N* f, j& R$ p/ h# G+ i
- On Error Resume Next8 F: x8 e* v* F
-
- P3 a: [3 l S8 A* H4 ^% ~ - BlockName = Right(Name, Len(Name) - InStrRev(Name, ""))4 ^# W7 F8 C# d9 y/ ^5 R
- BlockName = Left(BlockName, InStrRev(BlockName, ".") - 1)
0 K! k2 F& g* Z4 W7 \8 ` - 1 r& ^9 }; ?" d \* u
- Set InsertBlock = Block.InsertBlock(InsertionPoint, BlockName, Xscale, Yscale, Zscale, Rotation)& R4 X- i7 f, P2 |4 q
- " C6 x: z4 F9 `! d' R7 W
- If Err Then& o. |0 w2 ?. \
- D.Open Name* `0 w3 L, W. K ?
- If D.ModelSpace.Count > 0 Then
' {: `, y' @7 `2 [1 O5 I - ReDim E(D.ModelSpace.Count - 1)
- }$ W; v: i# H/ w - For I = 0 To D.ModelSpace.Count - 17 H/ u8 q* S# [% C
- Set E(I) = D.ModelSpace.Item(I)
0 z6 d; w( U/ Z9 R - Next5 I8 z6 D* h9 T/ X k) u
- Set B = Block.Document.Blocks.Add(P, BlockName)% H9 |4 D- q! J1 E6 ^& q
- D.CopyObjects E, B
" K# l. f5 O/ x: G - End If
' k O8 {+ a$ s9 u: ] - Set InsertBlock = Block.InsertBlock(InsertionPoint, BlockName, Xscale, Yscale, Zscale, Rotation)
" l* D: q; h9 f9 G - End If3 k5 N& j y9 w4 q9 ^ k
- End Function% O: l, ?; c" a; \% f
复制代码 |
|