QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 157787698 于 2011-8-5 12:11 编辑 - r0 k6 g4 m' p& g: s( r1 ^

' V4 P. m; c7 J& C' S; F用insertblock向图纸中插入块,代码如下:
( p+ ^# J$ |: f: x
  1. " ^' {" q1 W, M( |# Q: ?
  2.     Dim insertionPnt(0 To 2) As Double+ Y2 E8 @4 A2 t$ ?* O; Q7 ?
  3.     Dim blockRefObj As AcadBlockReference+ T1 x2 s2 H/ V5 I* Z( @1 x
  4.     insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 0
    0 e, Q/ S8 Q3 B# P
  5.     Set blockRefObj = ThisDrawing.ModelSpace.InsertBlock(insertionPnt, "d:\drawing8.dwg", 1#, 1#, 1#, 0)5 X5 t' o  h1 E, g
  6.     ZoomAll
    4 c4 n# `0 o" |" z1 h
复制代码
3 P% Z  m8 |/ d$ y" k

. c  o: F% T  t6 v' ?3 `3 u9 m2 U' w& `在CAD2006中没有问题,但是一旦拿到CAD2010中就有问题:
- w. `" n0 L" Z4 u  W$ a当在第一次使用的图纸中重复使用时,没有问题;
( ]$ V, N1 g7 r; m# S. X4 L. d# z但是一旦关掉第一次使用的那张图纸,在新建的图纸中使用的时候就会跳错,提示如下:; A+ V- c& F& c8 v& k
4 j* ~" O4 A& W2 x0 S0 @5 a
请大虾们帮助解决,或提供其他思路,非常感谢。
未命名.JPG

Drawing8.dwg

47.01 KB, 下载次数: 11

 楼主| 发表于 2011-8-5 10:13:26 | 显示全部楼层 来自: 中国浙江杭州
其实图纸内容是神马都无所谓的,一样会跳错
 楼主| 发表于 2011-8-5 10:17:53 | 显示全部楼层 来自: 中国浙江杭州
难道是因为CAD2010中的thisdrawing需要重新激活?
1 a8 _" ~5 P" d) C) P# X5 Z, o5 I3 j. N  P) q1 O
但为神马其他方法方法没有问题?只发现了insertblock有问题
发表于 2011-8-6 06:51:03 | 显示全部楼层 来自: 中国辽宁
貌似这是 ACAD 高版本 ActiveX 的一个BUG,到目前为止我们似乎还只能绕开它.
4 u4 K  a# A; W$ [可用的方法大体上有下面几种: ( v7 G% [, }2 \% Z
一.使用 Document 对象的 SendCommand 方法
( Z, g. c/ i+ Z6 {  H  o& l/ P( w
  1. " S/ u! A( F' f, \6 _: U- u1 s+ D
  2. ThisDrawing.SendCommand "-insert d:\drawing8.dwg" & vbCr & "2,2,0 1 1 0 " ( W4 Q! m, k7 {. o" I, D) n
复制代码

9 V9 V6 K0 r% \$ H二.首先创建一个用于过渡(中间?辅助?)的新文档,并做为全局变量,用 InsertBlock 方法插入外部块参照.当其它文档需要插入该外部块参照时,从这个过渡(中间?辅助?)文档中拷贝过来,而不再使用 InsertBlock 方法
" L5 D5 e, F; X  v5 J8 |下面两段代码中都引用了 ObjectDbx 类库,目的是在后台运行这个过渡(中间?辅助?)文档,以免它在前台添乱.运行下面两段代码前应引用 ObjectDbx 类库# A, L% U' t. q0 F! v, a# ^- c

  1. / T6 V+ J& d1 b" O4 T
  2. Dim AxDbDoc As New AxDbDocument, Objs(0) As AcadBlockReference, Inserted As Boolean3 l) f' M5 Z1 N3 [1 T
  3.    
    - T8 \# s  E0 }4 D5 [6 b, u
  4. Sub Sub1()
    - \3 R+ W! U( V% I- w- s
  5.     Dim insertionPnt(0 To 2) As Double5 P% U2 L% d1 y# w$ R" t
  6.     Dim blockRefObj As AcadBlockReference
    : a% f* p+ G8 A9 t6 y3 a. a
  7.     Dim V As Variant, P(2) As Double: d, W6 I# b" j) r+ |$ o4 ~
  8.    
    $ e, n- j+ |% [6 H8 b0 ?
  9.     If Not Inserted Then( R1 p7 k2 x) _- @3 O2 O4 A
  10.         Set Objs(0) = AxDbDoc.ModelSpace.InsertBlock(P, "d:\drawing8.dwg", 1, 1, 1, 0)8 u- k7 n. Y0 c- |7 i, N, z
  11.         Inserted = True/ a% F6 W# X. P
  12.     End If. }$ [8 [7 p& v% ~) w& L2 g3 |6 a
  13.    
      W: d2 M# c. x6 ^2 O
  14.     V = AxDbDoc.CopyObjects(Objs, ThisDrawing.ModelSpace)
    * b: l0 N% }% S) h6 f; k/ k( d
  15.     Set blockRefObj = V(0)
    0 a6 [: i' N# ^$ h
  16.     insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 08 w$ x' z0 E7 P
  17.     blockRefObj.Move P, insertionPnt
    0 \9 Q6 o( B0 t4 i" x/ V
  18.    
    9 a$ @! h5 V. ?- w4 {
  19.     ZoomAll
    0 W! f5 E  X( ~, k! Z. ~
  20. End Sub
    9 G& J1 t% g- k5 e$ y
复制代码
  N2 T' d8 C* ?+ H9 r6 k
三.自己编写一段插入外部块的函数,代替 InsertBlock 方法插入外部块$ T; G# l0 c) ^0 _3 ]% Z# ?
  1. 7 A: u% P5 g8 @9 G; H  J& D. n0 J1 X
  2. Sub Sub2()
    2 K4 T8 S* w: m% C
  3.     Dim insertionPnt(0 To 2) As Double6 {' V! k' c2 o; F
  4.     Dim blockRefObj As AcadBlockReference! M. t% ?& l6 i0 T) \, L, M" o
  5.     insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 0% g& s1 W+ P+ k0 g* ^
  6.     Set blockRefObj = InsertBlock(ThisDrawing.ModelSpace, insertionPnt, "d:\drawing8.dwg", 1#, 1#, 1#, 0). E: e% i3 l$ `0 N( T4 Z" ^
  7.     ZoomAll( ^0 M9 {4 K; I! Y6 w
  8. End Sub& S& R7 a) W4 N
  9. + y$ X5 v1 P2 U  m' J6 J3 u# K
  10. Private Function InsertBlock(ByVal Block As AcadBlock, ByVal InsertionPoint As Variant, _
    # A9 ?% o+ T4 W. B; |$ F1 C: v9 [0 M4 s
  11. ByVal Name As String, ByVal Xscale As Double, ByVal Yscale As Double, ByVal Zscale As Double, _- e7 z( a% g( P# s
  12. ByVal Rotation As Double) As AcadBlockReference6 k5 L" |/ E  w7 f2 |
  13.     Dim BlockName As String
    8 I6 z8 w' `; p, a  a, ]
  14.     Dim D As New AxDbDocument, E() As AcadEntity, I As Integer, B As AcadBlock, P(2) As Double
    . N; C% c' J! d; C1 Q
  15.    
    9 W8 d  g; G! f  Y) U7 @; _! T
  16.     On Error Resume Next
    0 p) V& w  M: v  {' j4 K
  17.    
    ! f9 ~% u: ^$ s) _( y( p. _9 |
  18.     BlockName = Right(Name, Len(Name) - InStrRev(Name, ""))
    + z6 B3 s) j: }1 H9 R
  19.     BlockName = Left(BlockName, InStrRev(BlockName, ".") - 1); @& v5 G4 u" T; L+ Q
  20.    
    8 {" l  `! [: J; ?" x
  21.     Set InsertBlock = Block.InsertBlock(InsertionPoint, BlockName, Xscale, Yscale, Zscale, Rotation)
    ; n2 g8 X3 v' ]
  22.     0 ?5 x: c. x# J+ H" t8 l
  23.     If Err Then
    1 L. @  v/ J3 \! m! ?+ h
  24.         D.Open Name" _8 ^7 Q, O- d3 A4 w4 A
  25.         If D.ModelSpace.Count > 0 Then& [2 _' ^2 C/ m, i, h: ?
  26.             ReDim E(D.ModelSpace.Count - 1). X! Y* T3 l) o1 n$ S5 C
  27.             For I = 0 To D.ModelSpace.Count - 1
    2 C7 r3 ]  r9 ]6 F9 I) V2 D
  28.                 Set E(I) = D.ModelSpace.Item(I)" T4 G: [# E( K' [1 @$ Y# {- d
  29.             Next# \7 q2 P7 }  e2 `2 q9 N
  30.             Set B = Block.Document.Blocks.Add(P, BlockName)
      q) |2 X- K8 T& h$ f1 W4 ^
  31.             D.CopyObjects E, B
    ' L# c* p( C/ F) L
  32.         End If
    1 P" K: k/ P% Z$ ~, p
  33.         Set InsertBlock = Block.InsertBlock(InsertionPoint, BlockName, Xscale, Yscale, Zscale, Rotation)
    # R( t" G# u2 d7 C- `
  34.     End If
    4 j: B8 {) w' Z, c
  35. End Function* z  ]8 h8 g0 q5 w5 s
复制代码
 楼主| 发表于 2011-8-6 23:47:08 | 显示全部楼层 来自: 中国浙江杭州
斑竹老兄,你太强了,对你的崇拜犹如滔滔江水延绵不绝啊
 楼主| 发表于 2011-8-8 09:20:51 | 显示全部楼层 来自: 中国浙江杭州
数据类型AxDbDocument有提示说用户定义类型未定义
0 w2 Q: H% m7 i- F! |& A7 E' E. x2 y0 u) |0 o( o
是不是也要引用ObjectDbx 类库?: m: `* d" F( z* t% f1 c! D

+ f* q# c- y* Z还有如何引用ObjectDbx 类库?我在引用列表里没有找到
 楼主| 发表于 2011-8-8 09:31:39 | 显示全部楼层 来自: 中国浙江杭州
通过在开发人员帮助中搜索ObjectDbx找到了
1 `. r9 _) q6 V: R7 F
2 q6 A/ }4 q1 J$ R/ C$ m谢谢斑竹
 楼主| 发表于 2011-8-8 16:33:15 | 显示全部楼层 来自: 中国浙江杭州
在引用类库的过程中出现问题+ w9 V5 z8 W  V# K
CAD2006对应的类库版本号为16.03 \) M: `6 z8 {+ q" g; I1 w
CAD2008对应的类库版本号为17.08 [; B" \! T2 L
CAD2010对应的类库版本号为18.07 @$ D/ ]. v% P  O& T
% @  h# t* [# B# N- `* [
本来应该在低版本CAD中引用低版本类库,然后在高版本CAD中应该自动继承为高版本类库1 h4 e. r- K9 B* e- z9 ^
( p! @+ s5 p8 F& }. V3 {
可实际上并不会自动向前继承
% p$ V- J' q( N1 t4 n$ V# `+ U2 B% `; P3 o! I
请问此问题有没有办法解决呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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