|
发表于 2011-8-6 06:51:03
|
显示全部楼层
来自: 中国辽宁
貌似这是 ACAD 高版本 ActiveX 的一个BUG,到目前为止我们似乎还只能绕开它.
. f5 U7 u6 k% [8 z5 _4 b4 x0 ^可用的方法大体上有下面几种:
% U1 x* M8 o" `5 A$ [$ g7 v一.使用 Document 对象的 SendCommand 方法5 ~" S; N7 O2 L9 P+ B# q
- `' _3 I O# t1 u! ~! Z$ r- C
- ThisDrawing.SendCommand "-insert d:\drawing8.dwg" & vbCr & "2,2,0 1 1 0 " 3 [$ q! z9 w# e/ _; }; h
复制代码 9 u3 e% j$ w4 L- z! d2 u
二.首先创建一个用于过渡(中间?辅助?)的新文档,并做为全局变量,用 InsertBlock 方法插入外部块参照.当其它文档需要插入该外部块参照时,从这个过渡(中间?辅助?)文档中拷贝过来,而不再使用 InsertBlock 方法
! `/ d$ X8 ]" D% ~/ B# c+ i2 M2 ]下面两段代码中都引用了 ObjectDbx 类库,目的是在后台运行这个过渡(中间?辅助?)文档,以免它在前台添乱.运行下面两段代码前应引用 ObjectDbx 类库5 R1 A( F5 x* z1 u
-
' [, ]/ c5 D/ d! ~' B% t - Dim AxDbDoc As New AxDbDocument, Objs(0) As AcadBlockReference, Inserted As Boolean6 e: e; }3 f' Y- h
- 4 ]% v; N" H) H6 j% n/ I# q4 d
- Sub Sub1()* l% Z$ a& U, z$ f! m0 f
- Dim insertionPnt(0 To 2) As Double
5 ^. n9 X( `% o9 u0 G - Dim blockRefObj As AcadBlockReference
% b* u3 B/ w6 k6 E- Q, v$ D - Dim V As Variant, P(2) As Double
9 z3 y# J( O+ h& l2 Y -
2 S& G: G) K3 s! {( D1 d2 q - If Not Inserted Then x8 G6 N/ R/ q" R) [% y
- Set Objs(0) = AxDbDoc.ModelSpace.InsertBlock(P, "d:\drawing8.dwg", 1, 1, 1, 0)5 g" h" O3 ]" ^
- Inserted = True& q4 U% f. u+ `1 I9 u; h
- End If" k* k0 X2 c; A/ A+ F2 H) u
-
" D" v3 N3 o8 L3 A( k- ? - V = AxDbDoc.CopyObjects(Objs, ThisDrawing.ModelSpace)
. Y; m. L+ ^- B& w+ @- I0 B1 [ - Set blockRefObj = V(0)
% C8 G, r5 g! N* u* S% K. _7 u - insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 0# C) m' K6 `( G5 b) R' V
- blockRefObj.Move P, insertionPnt
" g# @! f: w5 Q) q' a" j8 J: t - 2 [0 [: H" l$ o# i4 u' p
- ZoomAll1 C: a# s3 c( H. j2 ^
- End Sub
0 }/ t4 |6 i+ W9 c# u6 r
复制代码
, e: U8 [! a# B6 ? Z三.自己编写一段插入外部块的函数,代替 InsertBlock 方法插入外部块
2 [ e. l8 {7 H* g* A# X- 8 S6 p' K$ s2 {, ^( }, X" l( [% Z3 @
- Sub Sub2()
/ ]. F' M, d2 q# P - Dim insertionPnt(0 To 2) As Double
6 G" A" U( H# e8 | - Dim blockRefObj As AcadBlockReference$ v$ \9 r( s8 a4 q y$ v+ @
- insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 0
) V- _7 H2 S9 }7 F, Q! ^ - Set blockRefObj = InsertBlock(ThisDrawing.ModelSpace, insertionPnt, "d:\drawing8.dwg", 1#, 1#, 1#, 0)
O- d5 d+ D! B - ZoomAll; G; D2 R! A9 W& c
- End Sub
+ k5 V& T+ ~- `: L: i; n- ? -
: {: p7 T# L H1 O- k - Private Function InsertBlock(ByVal Block As AcadBlock, ByVal InsertionPoint As Variant, _: E; r5 C1 z6 T/ e" ^
- ByVal Name As String, ByVal Xscale As Double, ByVal Yscale As Double, ByVal Zscale As Double, _
* [! y5 K/ s7 C H - ByVal Rotation As Double) As AcadBlockReference9 T9 W* ~* h# Z1 N' }$ O
- Dim BlockName As String
$ W/ r7 z/ R8 Q' d: X - Dim D As New AxDbDocument, E() As AcadEntity, I As Integer, B As AcadBlock, P(2) As Double2 m: x2 j$ W2 g9 s1 z# F* i
- ) N# E6 H9 y3 \; A' s" R# [1 ~
- On Error Resume Next7 M2 q7 s" p% h' `; I! X! x
-
" B* o4 r+ N8 @ - BlockName = Right(Name, Len(Name) - InStrRev(Name, ""))) }! \7 K; e5 t+ R {
- BlockName = Left(BlockName, InStrRev(BlockName, ".") - 1)
# |" l' g& C+ a, I9 F% D -
# K% I/ Y* P4 A* a - Set InsertBlock = Block.InsertBlock(InsertionPoint, BlockName, Xscale, Yscale, Zscale, Rotation)
1 m8 D; ^5 K- W2 G2 o - - j, l/ z* S/ u6 U; I: C$ [' O
- If Err Then8 `) I7 }1 J/ s6 [' T: V1 i9 x
- D.Open Name" a$ m9 d" [1 c3 i8 u1 D- Q
- If D.ModelSpace.Count > 0 Then
* h# J) ]8 A8 q - ReDim E(D.ModelSpace.Count - 1)6 V! N1 y2 j: q/ z* f6 t+ Q# E
- For I = 0 To D.ModelSpace.Count - 1
, v& Q9 W2 z9 G5 c* P9 p; l1 q - Set E(I) = D.ModelSpace.Item(I)" \/ p- ]7 k% t" D- S& [- _
- Next
% g! n% p3 S+ W7 q; L6 A' z' y - Set B = Block.Document.Blocks.Add(P, BlockName)
[) g- X# H4 p7 q0 [+ n - D.CopyObjects E, B. s# a* Q) x% p2 j, U0 P
- End If
' `/ r: f& E* s q0 o: B, z - Set InsertBlock = Block.InsertBlock(InsertionPoint, BlockName, Xscale, Yscale, Zscale, Rotation)
5 `* @1 d |& J - End If
8 N' M. }' b1 Q: p8 v% T - End Function
6 }% b2 A% x# [% f! C8 w! B6 V2 \; c4 p
复制代码 |
|