QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

查看: 5281|回复: 7
收起左侧

[已答复] insertblock在CAD2010中总出错

[复制链接]
发表于 2011-8-5 10:10:56 | 显示全部楼层 |阅读模式 来自: 中国浙江杭州

马上注册,结识高手,享用更多资源,轻松玩转三维网社区。

您需要 登录 才可以下载或查看,没有帐号?注册

x
本帖最后由 157787698 于 2011-8-5 12:11 编辑 2 S$ u' w: [: x2 U

5 Z* L# w& K3 r0 Z) P* A用insertblock向图纸中插入块,代码如下:5 ^5 h1 |9 q9 G# z

  1. , Z7 W6 u+ j% y4 T
  2.     Dim insertionPnt(0 To 2) As Double
    : Y! p& F- z* ?! ^  j) V7 \! ?" {, I
  3.     Dim blockRefObj As AcadBlockReference
    + M( C, F% O: x
  4.     insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 0
    - e! ?  D" T* n) A. q% B  f
  5.     Set blockRefObj = ThisDrawing.ModelSpace.InsertBlock(insertionPnt, "d:\drawing8.dwg", 1#, 1#, 1#, 0)
      ^+ O. ~4 ?# c" N- a
  6.     ZoomAll
    ; N8 ^1 ^7 M& `& T8 ~
复制代码

5 g" D! G% f+ J: g7 q, K9 {4 @; ?  e% U  G' r0 g5 p7 U9 @
在CAD2006中没有问题,但是一旦拿到CAD2010中就有问题:
$ U- i5 a. }% N- |. V8 p当在第一次使用的图纸中重复使用时,没有问题;. |4 ~- P! y) V; q1 w% t
但是一旦关掉第一次使用的那张图纸,在新建的图纸中使用的时候就会跳错,提示如下:
- T4 M1 a) f9 f: n! Z* M1 x. O" s) F# F2 f4 D' D" Q% `
请大虾们帮助解决,或提供其他思路,非常感谢。
未命名.JPG

Drawing8.dwg

47.01 KB, 下载次数: 10

 楼主| 发表于 2011-8-5 10:13:26 | 显示全部楼层 来自: 中国浙江杭州
其实图纸内容是神马都无所谓的,一样会跳错
 楼主| 发表于 2011-8-5 10:17:53 | 显示全部楼层 来自: 中国浙江杭州
难道是因为CAD2010中的thisdrawing需要重新激活?
8 Z! |9 C; z) z( X
6 @9 a3 s" a# ^) P1 v. o# r  C但为神马其他方法方法没有问题?只发现了insertblock有问题
发表于 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
  1. 3 Q4 H  Q5 o7 h. \5 r* D6 u" @9 Q
  2. 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

  1. ( s3 h1 M8 n" s% i
  2. Dim AxDbDoc As New AxDbDocument, Objs(0) As AcadBlockReference, Inserted As Boolean
    0 W1 T6 j2 q$ N8 H. \
  3.     : b; {: u% X  t% l
  4. Sub Sub1()  }0 x! b: k2 H5 v1 J3 M
  5.     Dim insertionPnt(0 To 2) As Double
    : G. v) B$ k) S5 }$ I- J
  6.     Dim blockRefObj As AcadBlockReference
    7 l( J/ _$ q% ]" a
  7.     Dim V As Variant, P(2) As Double
    * w% [' `0 G% n+ {) F
  8.    
    & H; d& V% r1 @& X9 H& c
  9.     If Not Inserted Then' M* A& v. n8 g& s2 U
  10.         Set Objs(0) = AxDbDoc.ModelSpace.InsertBlock(P, "d:\drawing8.dwg", 1, 1, 1, 0)3 |, ?- \; i9 l$ R$ w& X$ z
  11.         Inserted = True0 r. j  f- h( E7 v8 }7 g0 Z
  12.     End If
      D0 D% X  `3 l" F4 j5 [0 Y+ V1 \
  13.    
    ) u: `+ F5 X& e- P! ?' F6 X( [
  14.     V = AxDbDoc.CopyObjects(Objs, ThisDrawing.ModelSpace)
    . L" B( S9 s1 I, |
  15.     Set blockRefObj = V(0)" U  q7 t1 @; n3 ]
  16.     insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 0
    9 l6 y0 @" p! g. A! T4 v7 R2 N: Q
  17.     blockRefObj.Move P, insertionPnt
    * j$ x- I8 T4 f6 {9 _
  18.     # `: [# n1 b! Q( W3 s9 Q/ Y9 O
  19.     ZoomAll
    3 I% u' f" ^+ ]. X8 C7 Q2 E
  20. End Sub
    # T' {; x+ ]9 ]! U
复制代码
' n+ n# z! @7 I! V- s1 O
三.自己编写一段插入外部块的函数,代替 InsertBlock 方法插入外部块
0 Q1 o/ p- U, A& |% i. F
  1. 4 `' ?" J& `. ?9 }* G
  2. Sub Sub2(); s: R( y3 y4 z8 m
  3.     Dim insertionPnt(0 To 2) As Double
    8 ~% y- H- v' R
  4.     Dim blockRefObj As AcadBlockReference
    $ U* _( O9 c( W* k) B. E, f  _
  5.     insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 0
    * I$ o; q! H7 k0 c1 i# C% k
  6.     Set blockRefObj = InsertBlock(ThisDrawing.ModelSpace, insertionPnt, "d:\drawing8.dwg", 1#, 1#, 1#, 0)8 a" e$ v) D4 _4 T( b5 }" G
  7.     ZoomAll
    ( d& w# z6 }, d6 [. x# o
  8. End Sub( C5 Z. _( L  J
  9. - o1 n$ u% J; w3 y+ v9 Z
  10. Private Function InsertBlock(ByVal Block As AcadBlock, ByVal InsertionPoint As Variant, _8 D8 p% W8 h& ~$ n6 G( p
  11. 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
  12. ByVal Rotation As Double) As AcadBlockReference
    : b( F+ f% H+ I* V, P! ^
  13.     Dim BlockName As String
    - c3 z6 n. `% e4 Z
  14.     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
  15.    
    4 w( B+ D1 o3 {/ a
  16.     On Error Resume Next7 i  @+ S- r8 l# b9 _( J
  17.    
    1 e0 h$ k. ^' @$ Y
  18.     BlockName = Right(Name, Len(Name) - InStrRev(Name, "")), J/ O+ g$ |5 ]5 c% N! x- O  u- v
  19.     BlockName = Left(BlockName, InStrRev(BlockName, ".") - 1)
    / y2 K5 U+ [3 S2 W. B$ B
  20.     % w# e9 U$ g/ ?& I, q
  21.     Set InsertBlock = Block.InsertBlock(InsertionPoint, BlockName, Xscale, Yscale, Zscale, Rotation)
    5 _% d$ v2 \- O9 T9 |0 \
  22.     ) T9 Q1 K8 _! }
  23.     If Err Then
    ' _9 L! i! U7 W* A
  24.         D.Open Name( r* W6 Q# s* ^; J& `
  25.         If D.ModelSpace.Count > 0 Then  e% d; E) }% N
  26.             ReDim E(D.ModelSpace.Count - 1): }) F5 U8 n# j6 K/ }  b: d$ i7 K
  27.             For I = 0 To D.ModelSpace.Count - 1
    0 Y$ r. H2 D3 p1 G# ^7 L
  28.                 Set E(I) = D.ModelSpace.Item(I)/ P1 K( S5 p  X- t
  29.             Next7 L7 b, P6 ?- y$ W' \
  30.             Set B = Block.Document.Blocks.Add(P, BlockName)0 O, V! N$ k3 N, t) T. _
  31.             D.CopyObjects E, B
    1 h' T" W2 |; q- l( Q* x
  32.         End If
    0 f7 E" @* i  f, I9 Z8 R* a
  33.         Set InsertBlock = Block.InsertBlock(InsertionPoint, BlockName, Xscale, Yscale, Zscale, Rotation)/ |9 a- \. i- m7 Y0 {
  34.     End If
    % f3 U6 S, t+ N' |- b4 k) W
  35. End Function
    7 {. ?- m+ r& ]/ d; K
复制代码
 楼主| 发表于 2011-8-6 23:47:08 | 显示全部楼层 来自: 中国浙江杭州
斑竹老兄,你太强了,对你的崇拜犹如滔滔江水延绵不绝啊
 楼主| 发表于 2011-8-8 09:20:51 | 显示全部楼层 来自: 中国浙江杭州
数据类型AxDbDocument有提示说用户定义类型未定义
0 F% C' n+ W, i0 e5 s  h+ n) a6 p) S' ~# r4 {! Z
是不是也要引用ObjectDbx 类库?& M/ V# t% i5 O" I, k

0 {% c7 {0 |2 T. V还有如何引用ObjectDbx 类库?我在引用列表里没有找到
 楼主| 发表于 2011-8-8 09:31:39 | 显示全部楼层 来自: 中国浙江杭州
通过在开发人员帮助中搜索ObjectDbx找到了. z7 o& M8 v: Q  ?9 x
: P; J/ e' C" q; v( t
谢谢斑竹
 楼主| 发表于 2011-8-8 16:33:15 | 显示全部楼层 来自: 中国浙江杭州
在引用类库的过程中出现问题
. K( W+ m) T; ~* N9 [& N7 QCAD2006对应的类库版本号为16.07 }$ a" z5 c: G4 X/ K8 b2 S
CAD2008对应的类库版本号为17.08 i' D  ]" }$ ]" L
CAD2010对应的类库版本号为18.0
8 D  T# ?* t, U1 B: \3 _  s7 {: B( Q2 L& e9 Y
本来应该在低版本CAD中引用低版本类库,然后在高版本CAD中应该自动继承为高版本类库; x* ~7 e- o$ R; H2 f% j6 Q" N5 w

0 X3 V8 b! Q  T& t- x可实际上并不会自动向前继承% ]4 W4 ~, v4 t% \; T& E

& O1 |8 ?8 j3 m3 ~请问此问题有没有办法解决呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


Licensed Copyright © 2016-2020 http://www.3dportal.cn/ All Rights Reserved 京 ICP备13008828号

小黑屋|手机版|Archiver|三维网 ( 京ICP备2023026364号-1 )

快速回复 返回顶部 返回列表