QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 157787698 于 2011-8-5 12:11 编辑   U% {( r  v9 V6 L' V6 m0 w

  `6 D# B- C; R% Z用insertblock向图纸中插入块,代码如下:* p$ u* L$ n: [; r
  1. 8 @) k: |5 W0 j4 ^  D. M1 {6 l
  2.     Dim insertionPnt(0 To 2) As Double" s5 j: T! R! m$ G6 t
  3.     Dim blockRefObj As AcadBlockReference! l5 T  ?/ X' q# T7 o1 h4 G, }
  4.     insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 0
    + `5 i9 d# {. B- t5 [; b  p+ w
  5.     Set blockRefObj = ThisDrawing.ModelSpace.InsertBlock(insertionPnt, "d:\drawing8.dwg", 1#, 1#, 1#, 0)
    . G) B' [2 t6 \, T/ C) C  b
  6.     ZoomAll
    % w4 c  i5 u  z* K
复制代码
' m% a- O1 J# r  P% V7 ?  F4 T6 _- C
9 r0 M1 W$ ~2 D' r7 O+ I4 k. p
在CAD2006中没有问题,但是一旦拿到CAD2010中就有问题:
$ @9 ^, A7 q1 W( ?* P9 D7 ]8 ^+ M当在第一次使用的图纸中重复使用时,没有问题;
$ k) K% }2 n: n7 V但是一旦关掉第一次使用的那张图纸,在新建的图纸中使用的时候就会跳错,提示如下:! `. `0 U0 ~9 w3 U( P4 s. q  o) X

; \) h1 o* l6 [- ~2 Z请大虾们帮助解决,或提供其他思路,非常感谢。
未命名.JPG

Drawing8.dwg

47.01 KB, 下载次数: 10

 楼主| 发表于 2011-8-5 10:13:26 | 显示全部楼层 来自: 中国浙江杭州
其实图纸内容是神马都无所谓的,一样会跳错
 楼主| 发表于 2011-8-5 10:17:53 | 显示全部楼层 来自: 中国浙江杭州
难道是因为CAD2010中的thisdrawing需要重新激活?
* r% F4 c0 @6 x$ x7 H7 _0 f- N& }+ X+ X; K& S9 k1 S
但为神马其他方法方法没有问题?只发现了insertblock有问题
发表于 2011-8-6 06:51:03 | 显示全部楼层 来自: 中国辽宁
貌似这是 ACAD 高版本 ActiveX 的一个BUG,到目前为止我们似乎还只能绕开它. % T+ H& X% w7 S" \
可用的方法大体上有下面几种:
/ t  ?( b7 h4 b一.使用 Document 对象的 SendCommand 方法5 V' ~2 L9 d) `* D* X1 O0 x
  1. ' o8 C! [: n# f: B
  2. ThisDrawing.SendCommand "-insert d:\drawing8.dwg" & vbCr & "2,2,0 1 1 0 " 6 F7 o, y) k; r, U7 \
复制代码
  x- Q+ n: p! x5 _7 c) k& d' U. Y! S
二.首先创建一个用于过渡(中间?辅助?)的新文档,并做为全局变量,用 InsertBlock 方法插入外部块参照.当其它文档需要插入该外部块参照时,从这个过渡(中间?辅助?)文档中拷贝过来,而不再使用 InsertBlock 方法/ |' \5 X; d8 G' t! K9 D4 `
下面两段代码中都引用了 ObjectDbx 类库,目的是在后台运行这个过渡(中间?辅助?)文档,以免它在前台添乱.运行下面两段代码前应引用 ObjectDbx 类库) m$ z5 U, P: [, C5 F

  1. / f5 t0 K; `9 k* E* T
  2. Dim AxDbDoc As New AxDbDocument, Objs(0) As AcadBlockReference, Inserted As Boolean
    9 z3 W/ C' P/ H& ?
  3.     / N+ R9 {/ z, I: [; ?6 W! H
  4. Sub Sub1()% `. A& }( K5 l
  5.     Dim insertionPnt(0 To 2) As Double
    : {( u& ?7 Q; ?; ~' o* H) h
  6.     Dim blockRefObj As AcadBlockReference
    - j* d' O2 m3 j6 o. m5 j
  7.     Dim V As Variant, P(2) As Double3 K! P, {0 c! s1 w# ^; a
  8.    
    9 T2 y% C. B- X# ?
  9.     If Not Inserted Then
    ( _+ ?, R$ r3 L3 w9 U
  10.         Set Objs(0) = AxDbDoc.ModelSpace.InsertBlock(P, "d:\drawing8.dwg", 1, 1, 1, 0)+ t$ D$ ~0 x& n/ \" ]
  11.         Inserted = True
    ( g8 V( f+ U# o& _2 q
  12.     End If
    5 j2 i3 M/ T& G$ L" Q
  13.    
    1 n5 f" c) C: Q1 b3 u8 Q
  14.     V = AxDbDoc.CopyObjects(Objs, ThisDrawing.ModelSpace)8 m, n; y: r7 j% \% P4 _4 E
  15.     Set blockRefObj = V(0)& }# f# G, S- Q+ I) L' I4 N3 T
  16.     insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 0* K& o3 O, R6 s! n& n
  17.     blockRefObj.Move P, insertionPnt) X6 {5 |# i9 ^  o1 h$ u# M. n- u9 O1 N
  18.     5 U) y9 m$ r: @- K6 G6 F* d/ K- S, H
  19.     ZoomAll
    5 x& @" a- `2 }% \
  20. End Sub
    9 U9 |& ]& T+ M( m; I
复制代码

  w; w3 n9 p$ Q: i. z6 S7 k" n三.自己编写一段插入外部块的函数,代替 InsertBlock 方法插入外部块% Z# o7 g6 t2 |& L- E+ d0 w

  1. ! g2 @, k' o! I6 R
  2. Sub Sub2()3 q5 _7 i  D& |9 k
  3.     Dim insertionPnt(0 To 2) As Double
    # ]1 s& N. {4 W% |) S
  4.     Dim blockRefObj As AcadBlockReference2 c" O/ O* z6 F2 ]* R6 k0 \
  5.     insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 0, G  S% n( j/ t5 {' b6 u7 ]
  6.     Set blockRefObj = InsertBlock(ThisDrawing.ModelSpace, insertionPnt, "d:\drawing8.dwg", 1#, 1#, 1#, 0)& Z/ t8 t  q/ i4 |; t4 A
  7.     ZoomAll
    4 C' Z$ F# ~8 n' e6 ]7 M$ f
  8. End Sub
    / t6 j( c" d9 I+ h5 @* t
  9. # P7 Y: `, x+ \% B7 R
  10. Private Function InsertBlock(ByVal Block As AcadBlock, ByVal InsertionPoint As Variant, _# X- }. Q0 ^, e, \+ w' A
  11. ByVal Name As String, ByVal Xscale As Double, ByVal Yscale As Double, ByVal Zscale As Double, _
    9 j( J" B) V3 r$ }  D7 \: _& O$ P
  12. ByVal Rotation As Double) As AcadBlockReference. a; c  _2 Q. p  I
  13.     Dim BlockName As String
    6 F3 y* j0 L* ~* T
  14.     Dim D As New AxDbDocument, E() As AcadEntity, I As Integer, B As AcadBlock, P(2) As Double9 [3 l8 D3 s! X9 d; x* o. i$ ?
  15.    
    - ^% F) S( W5 @  Q% F2 c
  16.     On Error Resume Next
    $ f  K! P4 c* N4 h9 X
  17.     & x0 z7 W: w0 G1 ~( S- f
  18.     BlockName = Right(Name, Len(Name) - InStrRev(Name, ""))
    ' K5 i) l; o( f# _
  19.     BlockName = Left(BlockName, InStrRev(BlockName, ".") - 1)' x0 {. m0 s: h4 g
  20.    
    . l3 `* g$ }. k9 h- U
  21.     Set InsertBlock = Block.InsertBlock(InsertionPoint, BlockName, Xscale, Yscale, Zscale, Rotation)
    % b; D% `) ~7 J/ H4 ^, x
  22.    
    - T* J2 h/ u5 y! D
  23.     If Err Then
    / d  }+ W' ~  S" u6 v; D
  24.         D.Open Name2 o, _, C4 A7 e0 I& a
  25.         If D.ModelSpace.Count > 0 Then
    : s% ]" k8 s' e! a$ u
  26.             ReDim E(D.ModelSpace.Count - 1)
    % K% J+ w% {: X  T5 s
  27.             For I = 0 To D.ModelSpace.Count - 19 j+ b$ ~0 a( _1 G8 G. u- t
  28.                 Set E(I) = D.ModelSpace.Item(I), d( t9 G( F  f6 e6 K3 v- D
  29.             Next# O, @- m, h3 ~+ T& f
  30.             Set B = Block.Document.Blocks.Add(P, BlockName)- K, V, T6 g  G
  31.             D.CopyObjects E, B2 G0 }8 m) a* p8 D* G
  32.         End If
    # p  f( x. W$ C
  33.         Set InsertBlock = Block.InsertBlock(InsertionPoint, BlockName, Xscale, Yscale, Zscale, Rotation)4 Z- t$ w) z1 W$ j& _
  34.     End If
    ; O" I" [+ j3 L% j4 a
  35. End Function, Q1 V0 ^3 i; ^7 h
复制代码
 楼主| 发表于 2011-8-6 23:47:08 | 显示全部楼层 来自: 中国浙江杭州
斑竹老兄,你太强了,对你的崇拜犹如滔滔江水延绵不绝啊
 楼主| 发表于 2011-8-8 09:20:51 | 显示全部楼层 来自: 中国浙江杭州
数据类型AxDbDocument有提示说用户定义类型未定义
7 R9 E& Q( h" e$ u
: H, D9 @$ j% l5 _是不是也要引用ObjectDbx 类库?
' M/ U0 ?8 m" |6 t
& a% a0 R1 i# L# m7 K  L还有如何引用ObjectDbx 类库?我在引用列表里没有找到
 楼主| 发表于 2011-8-8 09:31:39 | 显示全部楼层 来自: 中国浙江杭州
通过在开发人员帮助中搜索ObjectDbx找到了9 d; T6 J1 Q; \
& s& W( A4 o  a- t* X/ M
谢谢斑竹
 楼主| 发表于 2011-8-8 16:33:15 | 显示全部楼层 来自: 中国浙江杭州
在引用类库的过程中出现问题
2 y& R. O5 i$ m. K5 ^. a% ECAD2006对应的类库版本号为16.0) C3 J7 r* `5 S1 _
CAD2008对应的类库版本号为17.0
+ ~# N# m6 e+ |" D% t0 CCAD2010对应的类库版本号为18.04 y8 `! N) o8 v/ w7 p, ~' X

. ]2 b5 j9 i3 ?0 i本来应该在低版本CAD中引用低版本类库,然后在高版本CAD中应该自动继承为高版本类库6 `/ a0 h( {" h# L/ j" t) w3 Q
) L0 T3 I6 p7 ]. L
可实际上并不会自动向前继承+ I+ t8 L: L% ?
$ v0 E0 G, V2 _! L
请问此问题有没有办法解决呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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