QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 157787698 于 2011-8-5 12:11 编辑 ! n6 I8 Z0 U# w  y9 N! k

& |( N9 c( s. G用insertblock向图纸中插入块,代码如下:
/ O# ^) a& }- v; r- R5 i

  1. ( J9 c' x! [. ?3 c5 I
  2.     Dim insertionPnt(0 To 2) As Double' L7 S3 i, C: P: m0 j
  3.     Dim blockRefObj As AcadBlockReference
    8 C; h; r, A" _% F
  4.     insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 0
    & y0 N! Q: X' Z- n8 ?7 H5 L
  5.     Set blockRefObj = ThisDrawing.ModelSpace.InsertBlock(insertionPnt, "d:\drawing8.dwg", 1#, 1#, 1#, 0)
    3 r2 |: V0 e. ?2 Z% c& y8 p" K, f
  6.     ZoomAll# B' s7 s+ e! _
复制代码
) E: v6 \1 D8 Z% j' }# Z2 r3 {. A
' _3 T) ^8 W* i8 `( w$ r
在CAD2006中没有问题,但是一旦拿到CAD2010中就有问题:* m. m% h8 @( k9 ]7 R
当在第一次使用的图纸中重复使用时,没有问题;
$ {* y1 A2 T. [& C" T1 v但是一旦关掉第一次使用的那张图纸,在新建的图纸中使用的时候就会跳错,提示如下:/ Y3 @& {# K7 B3 f$ ?& G
, Q& |8 D6 J0 \/ i$ @+ c1 Z
请大虾们帮助解决,或提供其他思路,非常感谢。
未命名.JPG

Drawing8.dwg

47.01 KB, 下载次数: 10

 楼主| 发表于 2011-8-5 10:13:26 | 显示全部楼层 来自: 中国浙江杭州
其实图纸内容是神马都无所谓的,一样会跳错
 楼主| 发表于 2011-8-5 10:17:53 | 显示全部楼层 来自: 中国浙江杭州
难道是因为CAD2010中的thisdrawing需要重新激活?
9 @5 ?" l/ Q- G% p/ @% n* p
9 Q, d9 v. l9 H8 V) F但为神马其他方法方法没有问题?只发现了insertblock有问题
发表于 2011-8-6 06:51:03 | 显示全部楼层 来自: 中国辽宁
貌似这是 ACAD 高版本 ActiveX 的一个BUG,到目前为止我们似乎还只能绕开它. % k7 S$ V) N" }9 s, J' H: J
可用的方法大体上有下面几种:
: X- h/ `; X% @7 m: I一.使用 Document 对象的 SendCommand 方法
3 l2 |* g- x$ V# M- W) B
  1. & J1 K! n% F% L7 d
  2. ThisDrawing.SendCommand "-insert d:\drawing8.dwg" & vbCr & "2,2,0 1 1 0 " 9 Y+ C9 D, N2 {' E
复制代码

  S+ S5 r6 k# `' R二.首先创建一个用于过渡(中间?辅助?)的新文档,并做为全局变量,用 InsertBlock 方法插入外部块参照.当其它文档需要插入该外部块参照时,从这个过渡(中间?辅助?)文档中拷贝过来,而不再使用 InsertBlock 方法3 V3 I. `4 v' S; P5 Z" L# ^- N
下面两段代码中都引用了 ObjectDbx 类库,目的是在后台运行这个过渡(中间?辅助?)文档,以免它在前台添乱.运行下面两段代码前应引用 ObjectDbx 类库2 s, J9 K  g: v" T5 _6 C

  1. 9 C( n/ H( ?5 ~' V3 a& V# {5 q+ W  I
  2. Dim AxDbDoc As New AxDbDocument, Objs(0) As AcadBlockReference, Inserted As Boolean7 I5 A6 U% d: u/ ]
  3.       C, |7 B! Z: I7 R. T0 n) e6 b
  4. Sub Sub1()
    2 m7 K- L  i  W  i
  5.     Dim insertionPnt(0 To 2) As Double& U+ w% }" ^7 V9 g
  6.     Dim blockRefObj As AcadBlockReference  D! A  a* I1 b# b2 f! r& ]9 U
  7.     Dim V As Variant, P(2) As Double
    " V4 B' H$ A+ U" f* a
  8.     4 [2 G" x6 ?* C" B
  9.     If Not Inserted Then
    - k/ J* M6 b# }1 o3 O
  10.         Set Objs(0) = AxDbDoc.ModelSpace.InsertBlock(P, "d:\drawing8.dwg", 1, 1, 1, 0)
    - g( U3 ~, ?0 q* _# f9 Q
  11.         Inserted = True9 h' N2 Y8 V: D! C% [
  12.     End If
    ( e) }. h4 w# B: `
  13.    
    4 \- S" T! Q( e2 @$ Z0 w" k2 u& G8 Q
  14.     V = AxDbDoc.CopyObjects(Objs, ThisDrawing.ModelSpace)
    ' o/ |4 H* S" w2 x
  15.     Set blockRefObj = V(0)
    1 D: z4 N, {$ c( y
  16.     insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 04 {! @% q( G8 T# Q2 p+ N/ e( f  K& Q
  17.     blockRefObj.Move P, insertionPnt6 W% H& z0 B) z
  18.     + Q! d  R& f( H* L; e9 h. z* ^3 c
  19.     ZoomAll
    " x' Z  Z0 p  ^! D
  20. End Sub
    2 a1 e9 c0 y7 F/ A. m2 w
复制代码
/ ^; Z" f7 Y  F6 }* `& Q! V
三.自己编写一段插入外部块的函数,代替 InsertBlock 方法插入外部块; l" t8 }8 ?9 N( Y9 r! F" T
  1. 8 V6 g8 _4 Y" F% `6 i" S- a# R
  2. Sub Sub2()
    & a# t% d6 h5 z7 s1 U  g$ D; C
  3.     Dim insertionPnt(0 To 2) As Double
    " ]  Q* o* J) ]6 E% B9 ~3 w
  4.     Dim blockRefObj As AcadBlockReference
    : C) J& o( S4 \! i! r
  5.     insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 0
    - F1 ]/ j. \' K0 S
  6.     Set blockRefObj = InsertBlock(ThisDrawing.ModelSpace, insertionPnt, "d:\drawing8.dwg", 1#, 1#, 1#, 0)4 Z# {) g) S8 u
  7.     ZoomAll7 R: ?  i9 t% R0 o, K3 v& E
  8. End Sub% T+ K) ~- d7 l, ~# ^
  9. 8 ^' V) x" [$ O5 E. }
  10. Private Function InsertBlock(ByVal Block As AcadBlock, ByVal InsertionPoint As Variant, _
    + |1 u5 i  e% v9 a7 Y: Q& _% F4 Z
  11. ByVal Name As String, ByVal Xscale As Double, ByVal Yscale As Double, ByVal Zscale As Double, _8 Y; u4 K. F( e7 n
  12. ByVal Rotation As Double) As AcadBlockReference
    8 A+ W* K1 `3 D, T. D7 V
  13.     Dim BlockName As String1 T5 A1 F' T( C& H1 M- `$ `4 @0 V2 \
  14.     Dim D As New AxDbDocument, E() As AcadEntity, I As Integer, B As AcadBlock, P(2) As Double
    4 r5 S* P  [0 `; ?, X3 E
  15.    
    # x& x# H4 x6 Z. q# Z3 B
  16.     On Error Resume Next9 I9 p: w3 v0 z; s+ n- G
  17.     ! O% p+ x0 H. A7 u
  18.     BlockName = Right(Name, Len(Name) - InStrRev(Name, "")); [+ f* [6 g& I! r3 J# ~: ?8 }8 C
  19.     BlockName = Left(BlockName, InStrRev(BlockName, ".") - 1)
    - [$ |- {0 E5 M: W
  20.    
    : F3 F- Y- p- Z
  21.     Set InsertBlock = Block.InsertBlock(InsertionPoint, BlockName, Xscale, Yscale, Zscale, Rotation)
    # g' }  C# z# L+ K) h1 F
  22.    
    5 k2 r" d7 ^. |0 W8 e
  23.     If Err Then
    8 {; G, n4 E2 Z/ c4 [: _  c2 F
  24.         D.Open Name
    : r7 b% Q& H8 N$ g
  25.         If D.ModelSpace.Count > 0 Then! I" ]2 @. @5 s& B. [6 G; q: a
  26.             ReDim E(D.ModelSpace.Count - 1)/ ~+ X6 v0 x, N
  27.             For I = 0 To D.ModelSpace.Count - 12 k7 v% k1 w5 v) h5 Y
  28.                 Set E(I) = D.ModelSpace.Item(I)! v( |  }7 e7 O9 i3 A8 B
  29.             Next
    : Y& W; ]* r. x9 j2 Z- F& C
  30.             Set B = Block.Document.Blocks.Add(P, BlockName)3 B! J& r/ @: ?# L- d$ J
  31.             D.CopyObjects E, B! }. N# V3 a/ ~. D
  32.         End If8 {+ k4 `! T0 t. K! V$ n- H
  33.         Set InsertBlock = Block.InsertBlock(InsertionPoint, BlockName, Xscale, Yscale, Zscale, Rotation)3 `1 L* v. |& a2 y9 a# _- P
  34.     End If
    & L% X: \4 ?, s. _8 Q1 S2 H
  35. End Function
    4 Z* n" |6 ]. {5 @0 Y3 |; m2 V
复制代码
 楼主| 发表于 2011-8-6 23:47:08 | 显示全部楼层 来自: 中国浙江杭州
斑竹老兄,你太强了,对你的崇拜犹如滔滔江水延绵不绝啊
 楼主| 发表于 2011-8-8 09:20:51 | 显示全部楼层 来自: 中国浙江杭州
数据类型AxDbDocument有提示说用户定义类型未定义
. k) ?1 I2 ~9 U7 k) |- K" L  i3 ?) [1 t; C" x
是不是也要引用ObjectDbx 类库?
. d$ Z0 V  J4 _# Y3 P- `! M( j; n3 B* Y  ]8 D, Z- x
还有如何引用ObjectDbx 类库?我在引用列表里没有找到
 楼主| 发表于 2011-8-8 09:31:39 | 显示全部楼层 来自: 中国浙江杭州
通过在开发人员帮助中搜索ObjectDbx找到了3 L. x1 o  ]: J

5 y6 V8 c  n! }8 ?( ]# m谢谢斑竹
 楼主| 发表于 2011-8-8 16:33:15 | 显示全部楼层 来自: 中国浙江杭州
在引用类库的过程中出现问题7 W3 F" _+ e( [- e. R& z+ |4 @
CAD2006对应的类库版本号为16.0
2 B4 l' U% S' c* d4 }CAD2008对应的类库版本号为17.0
7 {& _$ f, @3 Q) R6 |. pCAD2010对应的类库版本号为18.00 Z$ }* F9 \  ~( l1 z7 A

/ p2 v+ ?+ L% k' C% {1 r9 u本来应该在低版本CAD中引用低版本类库,然后在高版本CAD中应该自动继承为高版本类库1 }4 Q) n+ x- v: [( m" x. L
$ k! y2 z0 l9 V, k( d: K! K6 ?
可实际上并不会自动向前继承
* ?) A8 r' i  h
7 M8 i2 w% x4 }请问此问题有没有办法解决呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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