QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 157787698 于 2011-8-5 12:11 编辑
$ A% X6 U7 T7 r9 W  A: E& q1 I; l' M
用insertblock向图纸中插入块,代码如下:! I* _. Y& P' F7 T
  1. # ]8 F9 q4 ]/ g2 H- n# ]7 A
  2.     Dim insertionPnt(0 To 2) As Double( }( Z$ f9 @/ m: T7 V5 ]( [
  3.     Dim blockRefObj As AcadBlockReference
      i, _+ m% R  }+ W
  4.     insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 0
    . p0 _2 R, n9 Q$ `# {6 t2 ~
  5.     Set blockRefObj = ThisDrawing.ModelSpace.InsertBlock(insertionPnt, "d:\drawing8.dwg", 1#, 1#, 1#, 0)
    3 W  [0 h2 @/ j& W% _
  6.     ZoomAll
    0 {9 \% Q4 W1 N5 j6 d: k
复制代码

9 G" S9 ]; M  f3 r, J( z2 n! \) @5 M# u
在CAD2006中没有问题,但是一旦拿到CAD2010中就有问题:. Y" F1 x! Z/ G% D$ q
当在第一次使用的图纸中重复使用时,没有问题;
& R+ y1 E, t3 V但是一旦关掉第一次使用的那张图纸,在新建的图纸中使用的时候就会跳错,提示如下:1 h$ y3 s' s& z

. F+ ~0 `% c" E; J+ j& e1 a请大虾们帮助解决,或提供其他思路,非常感谢。
未命名.JPG

Drawing8.dwg

47.01 KB, 下载次数: 11

 楼主| 发表于 2011-8-5 10:13:26 | 显示全部楼层 来自: 中国浙江杭州
其实图纸内容是神马都无所谓的,一样会跳错
 楼主| 发表于 2011-8-5 10:17:53 | 显示全部楼层 来自: 中国浙江杭州
难道是因为CAD2010中的thisdrawing需要重新激活?
. S+ L# Z0 P, _2 I, g9 v: J  Y6 Q
8 O& y- v6 g* P但为神马其他方法方法没有问题?只发现了insertblock有问题
发表于 2011-8-6 06:51:03 | 显示全部楼层 来自: 中国辽宁
貌似这是 ACAD 高版本 ActiveX 的一个BUG,到目前为止我们似乎还只能绕开它. + ?5 d) T& v0 X5 _. }- g+ g! F, m
可用的方法大体上有下面几种:
% t2 d0 t! i+ v一.使用 Document 对象的 SendCommand 方法7 I" F% [- N. ~2 v9 ?1 y$ ~, F

  1. ( j7 B- S2 ?0 x- L4 n" x% l$ W8 F. l, v8 n
  2. ThisDrawing.SendCommand "-insert d:\drawing8.dwg" & vbCr & "2,2,0 1 1 0 "
    8 s& H+ Z/ v# _6 v/ _2 [) D
复制代码

) ^7 i# O1 J  n0 e6 ]) x5 [二.首先创建一个用于过渡(中间?辅助?)的新文档,并做为全局变量,用 InsertBlock 方法插入外部块参照.当其它文档需要插入该外部块参照时,从这个过渡(中间?辅助?)文档中拷贝过来,而不再使用 InsertBlock 方法
5 f5 \6 }' D4 J9 d% X6 h* S下面两段代码中都引用了 ObjectDbx 类库,目的是在后台运行这个过渡(中间?辅助?)文档,以免它在前台添乱.运行下面两段代码前应引用 ObjectDbx 类库! }9 [+ {$ A3 f" [1 i) |
  1. " g& a6 M7 B& x+ G1 t  @8 w1 Z8 R
  2. Dim AxDbDoc As New AxDbDocument, Objs(0) As AcadBlockReference, Inserted As Boolean
    * W+ B8 w* g; q! O, G. J7 j" P  m
  3.     ' C% D* J3 V" `. M# |, r6 N
  4. Sub Sub1()  v* R$ ?# N; `9 U3 N
  5.     Dim insertionPnt(0 To 2) As Double
    " d7 A" F5 Y: v! P
  6.     Dim blockRefObj As AcadBlockReference$ k4 U" k( W1 a5 V$ T3 Z" u- y
  7.     Dim V As Variant, P(2) As Double
    5 u! J% e: W" O4 D6 O  s
  8.    
    * I# ^, Z2 j  R' m& S7 W/ {4 h
  9.     If Not Inserted Then
    % o" u5 P, |3 k8 M- {! D
  10.         Set Objs(0) = AxDbDoc.ModelSpace.InsertBlock(P, "d:\drawing8.dwg", 1, 1, 1, 0)
    7 \4 J6 R- k( x; G! X# q) `
  11.         Inserted = True8 S9 }8 V0 n, }5 v5 A
  12.     End If
    # X; \3 |1 Q4 U. x
  13.    
    ) w# q& f/ G+ z+ B# e2 U1 D
  14.     V = AxDbDoc.CopyObjects(Objs, ThisDrawing.ModelSpace)5 v' `! j5 [# x
  15.     Set blockRefObj = V(0)
    ) E6 m; K" p! P: S; j/ L- O8 }
  16.     insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 0. Q, \" r  e5 T3 Z0 u
  17.     blockRefObj.Move P, insertionPnt+ i" a7 D7 s2 c# ]  x" p
  18.    
    " o" y9 ?' G/ s
  19.     ZoomAll
    1 d: f( E' W6 e: E9 }
  20. End Sub
    # i3 J- ]; n5 V0 d* V" J  |$ j9 e
复制代码
0 A" a4 p3 U5 l, [) s) z/ k& E
三.自己编写一段插入外部块的函数,代替 InsertBlock 方法插入外部块
- K1 b0 v* Q, R, ~4 r; }" \7 Z
  1. ! Y8 n' i- P/ l/ m$ i8 Z7 y
  2. Sub Sub2()
    " L; ]% f  R; ]$ f* M) f
  3.     Dim insertionPnt(0 To 2) As Double* l3 W$ Q5 l( E' C2 E
  4.     Dim blockRefObj As AcadBlockReference
    : w  f9 K; o# H# i1 G8 ~& @
  5.     insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 0
    / c8 ^$ P1 n1 v
  6.     Set blockRefObj = InsertBlock(ThisDrawing.ModelSpace, insertionPnt, "d:\drawing8.dwg", 1#, 1#, 1#, 0)
    2 o+ d2 A4 `: }. h* C7 b8 Y- V! p
  7.     ZoomAll
    2 D. A. A( G/ u% N; W# E' v* ?
  8. End Sub6 C  r) C4 _1 a' {7 b

  9. # i: P* G; x* s- z1 A/ g' X
  10. Private Function InsertBlock(ByVal Block As AcadBlock, ByVal InsertionPoint As Variant, _" L& ?$ W3 \3 o7 x4 S# B" G
  11. ByVal Name As String, ByVal Xscale As Double, ByVal Yscale As Double, ByVal Zscale As Double, _
    + o6 p3 N/ j$ x; ], D. K/ b; g
  12. ByVal Rotation As Double) As AcadBlockReference1 w2 S! x4 o( [: x4 [
  13.     Dim BlockName As String
      }) [) e* U9 E! T; \4 z
  14.     Dim D As New AxDbDocument, E() As AcadEntity, I As Integer, B As AcadBlock, P(2) As Double& Z1 \. ?. [. v6 X# ]
  15.     ) y$ K4 t  o: I, I& \% |
  16.     On Error Resume Next
    / t& V: r* O$ ?. g* w
  17.    
    ' q. O) E" i- N0 ~
  18.     BlockName = Right(Name, Len(Name) - InStrRev(Name, ""))
    ) c8 c/ {* u7 f. f6 h, y! j
  19.     BlockName = Left(BlockName, InStrRev(BlockName, ".") - 1)
    - m' h: R3 P/ x( Q' X( D/ W5 c
  20.    
    " K! ]' h- M0 _* m. }
  21.     Set InsertBlock = Block.InsertBlock(InsertionPoint, BlockName, Xscale, Yscale, Zscale, Rotation)
    / u1 Q/ t/ v( l, T, Q0 p! Y: K+ E! p
  22.    
    6 A! g0 a. b$ \# c; [5 K
  23.     If Err Then! c: b$ V7 I6 D( A
  24.         D.Open Name
    1 J$ a1 ~) ^& X# N* ?. x) g% z3 S
  25.         If D.ModelSpace.Count > 0 Then2 G3 n( V( L# C8 f
  26.             ReDim E(D.ModelSpace.Count - 1)( D5 G; q6 K3 U* {7 e7 J- r
  27.             For I = 0 To D.ModelSpace.Count - 1
    ) r7 y0 \6 w" C
  28.                 Set E(I) = D.ModelSpace.Item(I)* S1 z: W5 @/ {! b+ r
  29.             Next- X4 x) j4 J# m: s+ I
  30.             Set B = Block.Document.Blocks.Add(P, BlockName)
    3 b8 q' P! m: r: o
  31.             D.CopyObjects E, B/ i: q; t3 o' X, z& _$ l
  32.         End If. K6 I7 Y8 C# u
  33.         Set InsertBlock = Block.InsertBlock(InsertionPoint, BlockName, Xscale, Yscale, Zscale, Rotation)$ ], n" f  S7 p, B" d$ k
  34.     End If
    ! c8 u0 B( V* p" I5 k  t
  35. End Function
    9 U! B/ l/ g6 ?1 |7 X# ~  Q
复制代码
 楼主| 发表于 2011-8-6 23:47:08 | 显示全部楼层 来自: 中国浙江杭州
斑竹老兄,你太强了,对你的崇拜犹如滔滔江水延绵不绝啊
 楼主| 发表于 2011-8-8 09:20:51 | 显示全部楼层 来自: 中国浙江杭州
数据类型AxDbDocument有提示说用户定义类型未定义
' T  C2 {4 c0 q/ g( K
; X: m$ Y7 K2 n& h2 n: ?1 d1 t. q是不是也要引用ObjectDbx 类库?
3 {. E) i* c7 a, V" a2 B2 r0 r
; b8 q. I7 |4 m- ]6 P还有如何引用ObjectDbx 类库?我在引用列表里没有找到
 楼主| 发表于 2011-8-8 09:31:39 | 显示全部楼层 来自: 中国浙江杭州
通过在开发人员帮助中搜索ObjectDbx找到了
8 L3 l. {/ L6 x3 o/ E$ M6 W( y- n, U, U& |
谢谢斑竹
 楼主| 发表于 2011-8-8 16:33:15 | 显示全部楼层 来自: 中国浙江杭州
在引用类库的过程中出现问题# l) e# ^  C+ ?, J  ]5 l+ _
CAD2006对应的类库版本号为16.03 j" U0 U' }& c& t, ?* Q9 M# n8 ?
CAD2008对应的类库版本号为17.02 @) @2 g; [  @" w  X9 M6 _
CAD2010对应的类库版本号为18.0
' ]# h; D( t/ q* o& U+ U9 u- @
# p+ v! L: [$ T4 s# K本来应该在低版本CAD中引用低版本类库,然后在高版本CAD中应该自动继承为高版本类库* b8 ~- J, U# A7 S/ a$ \0 E

& Z1 f6 @3 n# d! z7 a+ f8 |可实际上并不会自动向前继承6 u# z1 r4 @3 |

5 ]" o" C3 F$ o3 h, ?请问此问题有没有办法解决呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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