|
|
发表于 2011-8-6 06:51:03
|
显示全部楼层
来自: 中国辽宁
貌似这是 ACAD 高版本 ActiveX 的一个BUG,到目前为止我们似乎还只能绕开它.
7 K) o& v' v; R可用的方法大体上有下面几种: - `" Y- }3 K, J4 R
一.使用 Document 对象的 SendCommand 方法
; T) K; Z4 F9 } I" M, g. \2 @
* {& T1 ]# e2 y; z; _" L- ThisDrawing.SendCommand "-insert d:\drawing8.dwg" & vbCr & "2,2,0 1 1 0 " : I# E! t1 q- o, c/ A
复制代码
/ M/ s& D4 B5 i( Z6 ~二.首先创建一个用于过渡(中间?辅助?)的新文档,并做为全局变量,用 InsertBlock 方法插入外部块参照.当其它文档需要插入该外部块参照时,从这个过渡(中间?辅助?)文档中拷贝过来,而不再使用 InsertBlock 方法- n$ x! L& w. I" A) R
下面两段代码中都引用了 ObjectDbx 类库,目的是在后台运行这个过渡(中间?辅助?)文档,以免它在前台添乱.运行下面两段代码前应引用 ObjectDbx 类库& d+ v* m6 i2 q) q+ u6 R+ `4 a+ ^! D8 T
- / L+ i/ |/ w. j1 A7 W
- Dim AxDbDoc As New AxDbDocument, Objs(0) As AcadBlockReference, Inserted As Boolean
. r4 c' Q7 r0 L; h - c q0 I; t: u0 t
- Sub Sub1()
6 l% i6 J" @8 P4 H3 o" [+ t: B0 ~9 S - Dim insertionPnt(0 To 2) As Double
" }9 Y7 V* `, F2 Q! s! z - Dim blockRefObj As AcadBlockReference. B; s [( }9 f, a$ `
- Dim V As Variant, P(2) As Double
2 M# W) O- b. u; ?7 [7 m - ' I" Y8 s& G; p3 L6 z n3 c3 Q
- If Not Inserted Then
. F8 D4 k3 y( {2 W - Set Objs(0) = AxDbDoc.ModelSpace.InsertBlock(P, "d:\drawing8.dwg", 1, 1, 1, 0)5 E' \3 v5 s. s
- Inserted = True
# f( p' _) t5 N - End If
8 h3 {9 q& I9 B0 s, P - : F# f$ ~( q& ? c& H
- V = AxDbDoc.CopyObjects(Objs, ThisDrawing.ModelSpace)8 _* Y' ~( {' ^# g: G
- Set blockRefObj = V(0)
# k9 ~! p1 E: M7 \" ^. o' x - insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 0* ]1 b: u: J: k1 L2 V4 ~
- blockRefObj.Move P, insertionPnt' e6 O9 L! s7 {4 b1 ^& G- k
- : K" Y% m4 K! S$ l, e( s
- ZoomAll% A$ [' r- `2 N, `( T
- End Sub
. ?2 R" h4 y' I: j7 [
复制代码 4 y1 \6 s' V( x' M
三.自己编写一段插入外部块的函数,代替 InsertBlock 方法插入外部块" Q5 ?( ]4 C3 f- p: e
-
; t _5 Y& z+ i$ M - Sub Sub2()5 G7 I/ i/ |* y- X/ d6 i
- Dim insertionPnt(0 To 2) As Double
) r. O& w% t1 P3 I, B - Dim blockRefObj As AcadBlockReference
. z3 v& t& h+ Y1 p - insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 0( ]7 s6 Y4 U8 s9 y6 d& b; N& K7 u* Y
- Set blockRefObj = InsertBlock(ThisDrawing.ModelSpace, insertionPnt, "d:\drawing8.dwg", 1#, 1#, 1#, 0)
2 N- W1 g" Z0 \! V8 h" W/ y! m - ZoomAll6 ?& X) Z9 e! u8 {# M3 L. K
- End Sub
( W* }1 H' W/ g! L* r -
- o/ D2 B: D' i8 A - Private Function InsertBlock(ByVal Block As AcadBlock, ByVal InsertionPoint As Variant, _
?1 K3 L7 u! E: G - ByVal Name As String, ByVal Xscale As Double, ByVal Yscale As Double, ByVal Zscale As Double, _
( m+ p( G @: \; [ - ByVal Rotation As Double) As AcadBlockReference
- z1 x- v8 F7 i/ j* W7 `) J - Dim BlockName As String
! W& M4 h# E9 H+ \7 i0 D M& O# r& q - Dim D As New AxDbDocument, E() As AcadEntity, I As Integer, B As AcadBlock, P(2) As Double8 f" W# |% U# {
- & P# V; Z: q; L. _' p) _0 n
- On Error Resume Next9 ~% P" O: S) S
- % o O0 U& G, K7 ~: }. {- a1 j
- BlockName = Right(Name, Len(Name) - InStrRev(Name, ""))/ r }4 P$ T. a8 M5 o
- BlockName = Left(BlockName, InStrRev(BlockName, ".") - 1)
: J* D1 c3 T; D. H# v( d& e -
, W W5 F( Y8 u0 m9 K1 ?5 F+ L n& p - Set InsertBlock = Block.InsertBlock(InsertionPoint, BlockName, Xscale, Yscale, Zscale, Rotation)
+ J8 a- U( A8 M2 g, Z* X# \6 n$ D -
4 Q/ ~" j+ B* ` - If Err Then
' R( ?4 I; |# t4 m2 h" t - D.Open Name+ Q# N: Z1 ~0 E* S
- If D.ModelSpace.Count > 0 Then
9 A# I( m6 D2 B1 J+ u, D - ReDim E(D.ModelSpace.Count - 1)1 [+ ~) _6 o6 L0 H+ |! d/ W" {
- For I = 0 To D.ModelSpace.Count - 1% K( Q( O5 O3 A: J* b$ a& L; a
- Set E(I) = D.ModelSpace.Item(I)
6 V6 @( q2 Z) X$ T& r8 J& D - Next
# E2 N' }4 f' H. F( f8 J - Set B = Block.Document.Blocks.Add(P, BlockName). H) A2 P3 U, D! ` R
- D.CopyObjects E, B
1 x8 A3 k, `9 m0 L* @! J5 C - End If8 Q2 \9 N) s9 K# J
- Set InsertBlock = Block.InsertBlock(InsertionPoint, BlockName, Xscale, Yscale, Zscale, Rotation)
9 x/ ?! S) f, g8 V7 u% @ - End If
% f' X+ ]5 z* m9 E' I( w - End Function- n; F; O' D7 G, {7 p
复制代码 |
|