QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
6天前
查看: 5266|回复: 7
收起左侧

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

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

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

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

x
本帖最后由 157787698 于 2011-8-5 12:11 编辑 2 y, Q" u% B8 E2 x+ i" }1 w

6 c. q* J8 {) c/ B; i; G用insertblock向图纸中插入块,代码如下:9 G/ Y# U* _3 M" t' _

  1. 1 S4 e& W2 ~0 @* f! s9 \3 [, g
  2.     Dim insertionPnt(0 To 2) As Double
    % ?8 `8 F! M3 I$ `) o' I
  3.     Dim blockRefObj As AcadBlockReference: z4 P0 }- L" K9 W2 A  l8 U. b4 _
  4.     insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 0# Q% P, a0 W$ ?8 D( G. q
  5.     Set blockRefObj = ThisDrawing.ModelSpace.InsertBlock(insertionPnt, "d:\drawing8.dwg", 1#, 1#, 1#, 0)$ v/ A; s+ f- F4 V9 L
  6.     ZoomAll0 f7 W3 M. L) n% R; d3 t& C
复制代码
0 x0 v+ }( I0 t& W6 n( g8 t

; M$ W* E! Y: e  P在CAD2006中没有问题,但是一旦拿到CAD2010中就有问题:
, C' _7 h: M+ I1 u当在第一次使用的图纸中重复使用时,没有问题;
# b9 N! y% _+ G( j5 A2 L, q7 J但是一旦关掉第一次使用的那张图纸,在新建的图纸中使用的时候就会跳错,提示如下:5 w9 T( c2 r, b8 @" S6 P, c; X/ P

! u8 g6 a8 l+ J, ]请大虾们帮助解决,或提供其他思路,非常感谢。
未命名.JPG

Drawing8.dwg

47.01 KB, 下载次数: 10

 楼主| 发表于 2011-8-5 10:13:26 | 显示全部楼层 来自: 中国浙江杭州
其实图纸内容是神马都无所谓的,一样会跳错
 楼主| 发表于 2011-8-5 10:17:53 | 显示全部楼层 来自: 中国浙江杭州
难道是因为CAD2010中的thisdrawing需要重新激活?; b  v$ B5 `. m' ?- k! g

. K: F- c* p7 F) A4 z; v但为神马其他方法方法没有问题?只发现了insertblock有问题
发表于 2011-8-6 06:51:03 | 显示全部楼层 来自: 中国辽宁
貌似这是 ACAD 高版本 ActiveX 的一个BUG,到目前为止我们似乎还只能绕开它.
" s. ~: ~8 `0 |7 \. H; ]' a4 r可用的方法大体上有下面几种:
3 |! U5 I. n2 ~# j( z一.使用 Document 对象的 SendCommand 方法: u# R- ~! k2 H# J7 j9 t: ?

  1. " S! p4 y2 L' d1 s
  2. ThisDrawing.SendCommand "-insert d:\drawing8.dwg" & vbCr & "2,2,0 1 1 0 "
    - w1 h3 {/ z" J+ u. U, K. d' K
复制代码
. f9 s) B7 g8 r$ v7 d
二.首先创建一个用于过渡(中间?辅助?)的新文档,并做为全局变量,用 InsertBlock 方法插入外部块参照.当其它文档需要插入该外部块参照时,从这个过渡(中间?辅助?)文档中拷贝过来,而不再使用 InsertBlock 方法
8 W& s# U" R$ {4 j下面两段代码中都引用了 ObjectDbx 类库,目的是在后台运行这个过渡(中间?辅助?)文档,以免它在前台添乱.运行下面两段代码前应引用 ObjectDbx 类库9 T$ s7 k7 o! s! g

  1. * ]. h  P! J! b# L! E
  2. Dim AxDbDoc As New AxDbDocument, Objs(0) As AcadBlockReference, Inserted As Boolean
    9 u" {; `; i+ E- C' u/ y4 `
  3.    
    ( s8 ?2 G4 j$ {7 B1 U9 Y: f
  4. Sub Sub1()
    1 V8 R* J$ G2 j  c7 Z1 t: ^
  5.     Dim insertionPnt(0 To 2) As Double
    7 |- R0 Y$ i6 a% p
  6.     Dim blockRefObj As AcadBlockReference* w; l2 p! H; i( H9 B1 Y/ U6 c
  7.     Dim V As Variant, P(2) As Double1 g3 s9 g! P$ B/ ]) u3 K
  8.     / O! I# e6 u4 W5 N/ R
  9.     If Not Inserted Then9 ~" h  a# [  J
  10.         Set Objs(0) = AxDbDoc.ModelSpace.InsertBlock(P, "d:\drawing8.dwg", 1, 1, 1, 0)
    * `; K' {/ b$ _. ?& w' b: t
  11.         Inserted = True1 f6 x) u6 |' [  `  P
  12.     End If9 E0 t1 W( O( E) B" K3 q4 {
  13.     # w1 `% B0 w6 G) W- P" B
  14.     V = AxDbDoc.CopyObjects(Objs, ThisDrawing.ModelSpace)( z/ X" M' w1 P; f: U
  15.     Set blockRefObj = V(0)2 p* j9 P' x* `3 m
  16.     insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 0
    ( ?4 Q+ E4 ~0 f
  17.     blockRefObj.Move P, insertionPnt
    , q- l% O2 N+ {& _+ Y5 q
  18.     3 d8 Y7 t' P/ M: R& |1 g7 b
  19.     ZoomAll+ e# q: u) k/ U# J' A& u
  20. End Sub
    , h, h, T2 F6 A- @% w
复制代码

& N( Z2 B- z- P& ^3 w% f0 r8 C三.自己编写一段插入外部块的函数,代替 InsertBlock 方法插入外部块+ E5 U4 L5 V" |2 R0 p
  1. # `3 F. U: v8 ^- D8 f. n
  2. Sub Sub2()% i+ B* C; h' _' X3 l8 G
  3.     Dim insertionPnt(0 To 2) As Double6 A" Q% ?; A. S' q7 H* p/ i* Z' c
  4.     Dim blockRefObj As AcadBlockReference: V5 I0 Z# [& A
  5.     insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 0
    ; i8 j/ m5 A1 U: }9 s4 l1 C
  6.     Set blockRefObj = InsertBlock(ThisDrawing.ModelSpace, insertionPnt, "d:\drawing8.dwg", 1#, 1#, 1#, 0)
    6 X5 j5 v# a, `. u& l+ v
  7.     ZoomAll) z- D- e& ~: x2 B$ F5 v8 P
  8. End Sub$ R7 E& i, T1 k

  9. 9 F1 z7 }* z6 e( s+ `) S
  10. Private Function InsertBlock(ByVal Block As AcadBlock, ByVal InsertionPoint As Variant, _
    0 U2 l+ K0 I$ ~0 W
  11. ByVal Name As String, ByVal Xscale As Double, ByVal Yscale As Double, ByVal Zscale As Double, _
    ) ^1 I2 a- K; J. ]8 q6 R4 {4 k
  12. ByVal Rotation As Double) As AcadBlockReference
    * r# ?' ?  X) P3 J' ]2 g2 n; Q
  13.     Dim BlockName As String
    . k' ^1 B  ~7 D1 k) z
  14.     Dim D As New AxDbDocument, E() As AcadEntity, I As Integer, B As AcadBlock, P(2) As Double  Y: @3 w& }- ~8 D
  15.    
    ( O$ C( ~; {$ A' E4 Q$ D
  16.     On Error Resume Next% P* b4 `$ d6 d# H& q
  17.     6 X4 p) j" T: G- C3 l4 t/ N6 Y
  18.     BlockName = Right(Name, Len(Name) - InStrRev(Name, ""))
    , I3 q, |8 r! h3 k6 ^. j* H
  19.     BlockName = Left(BlockName, InStrRev(BlockName, ".") - 1)( e. i1 G. d& ]: |, b) {
  20.     , \3 ~  Q- V) a; p
  21.     Set InsertBlock = Block.InsertBlock(InsertionPoint, BlockName, Xscale, Yscale, Zscale, Rotation)) n* t, |: Z  _/ ]4 X% }- }$ `# }8 B  U
  22.    
    ( S) u! ~* D6 F8 q" U( \3 p
  23.     If Err Then
    # ]( g$ D0 a1 H6 N
  24.         D.Open Name% {: x) m2 T% _2 K: H7 p! j/ G
  25.         If D.ModelSpace.Count > 0 Then
    2 p' D0 R3 h8 k; m
  26.             ReDim E(D.ModelSpace.Count - 1)- _4 T3 H, k- }/ |
  27.             For I = 0 To D.ModelSpace.Count - 1
    , b) L) R4 T7 o! S- a( p& `5 F1 q
  28.                 Set E(I) = D.ModelSpace.Item(I)* k2 f2 R+ R* ?# ?0 C2 U  O
  29.             Next, k  X' \" n3 z' e2 e' f$ c
  30.             Set B = Block.Document.Blocks.Add(P, BlockName)
    5 W! K+ _) c9 ]/ V3 N- m. w  \
  31.             D.CopyObjects E, B1 a) U: K' N6 u$ I" k1 t; y5 E
  32.         End If* P1 i& r0 j* N8 H
  33.         Set InsertBlock = Block.InsertBlock(InsertionPoint, BlockName, Xscale, Yscale, Zscale, Rotation)/ r0 y: S  ^2 a7 T2 @1 y. l
  34.     End If
    8 Y2 F3 D& \: {0 t& C+ @; p$ d
  35. End Function: T8 c: I4 ]& x  z
复制代码
 楼主| 发表于 2011-8-6 23:47:08 | 显示全部楼层 来自: 中国浙江杭州
斑竹老兄,你太强了,对你的崇拜犹如滔滔江水延绵不绝啊
 楼主| 发表于 2011-8-8 09:20:51 | 显示全部楼层 来自: 中国浙江杭州
数据类型AxDbDocument有提示说用户定义类型未定义
7 \1 N! w  I: `1 {; _" m- v( N$ P- A# B+ \! c$ r
是不是也要引用ObjectDbx 类库?& ^6 o7 `' d9 R2 [1 C0 i3 L8 j

4 N* ]$ a. }, w' z, R# d+ [还有如何引用ObjectDbx 类库?我在引用列表里没有找到
 楼主| 发表于 2011-8-8 09:31:39 | 显示全部楼层 来自: 中国浙江杭州
通过在开发人员帮助中搜索ObjectDbx找到了1 @! |& o" I6 ~: q

1 p+ j. R! E! d5 G) a. N& m  W谢谢斑竹
 楼主| 发表于 2011-8-8 16:33:15 | 显示全部楼层 来自: 中国浙江杭州
在引用类库的过程中出现问题& u! H7 z* y  J
CAD2006对应的类库版本号为16.0
! P, Q! C! U9 p& WCAD2008对应的类库版本号为17.0
: T" g  ]$ N$ ~/ Y4 k% s9 u. S8 ~CAD2010对应的类库版本号为18.0
+ X& C: t" x. W8 g, p8 V+ [; h3 a1 N' S7 r- `
本来应该在低版本CAD中引用低版本类库,然后在高版本CAD中应该自动继承为高版本类库
/ m' n( S* L5 ^: H/ H8 J0 U
8 M/ z- b3 S" x. b) w可实际上并不会自动向前继承7 h) q$ l3 P' |0 r9 `2 m

- {3 X% ~' P$ j" L" d5 S. G, L请问此问题有没有办法解决呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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