QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 157787698 于 2011-8-5 12:11 编辑 ; _% k: R! g4 T, O; C- Y. z. d+ k
" i8 }" L: P8 V0 |; c) F) u
用insertblock向图纸中插入块,代码如下:
5 g( E6 f8 m- ~9 q

  1. 4 a, u- ~& f  B
  2.     Dim insertionPnt(0 To 2) As Double
    " l3 b, w1 D; N) e7 R
  3.     Dim blockRefObj As AcadBlockReference
    7 y2 a( X$ z4 q; r6 O* L) H
  4.     insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 0
    ! u8 N' B6 o# r1 @* u: A/ E
  5.     Set blockRefObj = ThisDrawing.ModelSpace.InsertBlock(insertionPnt, "d:\drawing8.dwg", 1#, 1#, 1#, 0)
    + b" h" p  Z, r- T
  6.     ZoomAll
    ( o" I% W; r5 O4 D6 R5 B* @
复制代码

+ N, {5 H! d, r% V) ~3 S( ~! ^" ^# [- J, ]
在CAD2006中没有问题,但是一旦拿到CAD2010中就有问题:
$ @$ g; m% x7 p; h7 a  g当在第一次使用的图纸中重复使用时,没有问题;  W0 z9 G% X) w& y) t
但是一旦关掉第一次使用的那张图纸,在新建的图纸中使用的时候就会跳错,提示如下:
" L7 I. L2 G+ y# w' O! @! Q; ?8 [& W( b8 e8 ]/ r. Q. O
请大虾们帮助解决,或提供其他思路,非常感谢。
未命名.JPG

Drawing8.dwg

47.01 KB, 下载次数: 10

 楼主| 发表于 2011-8-5 10:13:26 | 显示全部楼层 来自: 中国浙江杭州
其实图纸内容是神马都无所谓的,一样会跳错
 楼主| 发表于 2011-8-5 10:17:53 | 显示全部楼层 来自: 中国浙江杭州
难道是因为CAD2010中的thisdrawing需要重新激活?0 M: ~" E5 b' J& |7 S* U8 o
7 i( Q' T4 y2 U, K+ B
但为神马其他方法方法没有问题?只发现了insertblock有问题
发表于 2011-8-6 06:51:03 | 显示全部楼层 来自: 中国辽宁
貌似这是 ACAD 高版本 ActiveX 的一个BUG,到目前为止我们似乎还只能绕开它. ; t# @( a3 R! M: c, t
可用的方法大体上有下面几种:
" a' E, m5 p% P一.使用 Document 对象的 SendCommand 方法" d2 O' J+ N/ X! f3 q1 z/ N

  1. % d% @) Y# A5 y6 a" }
  2. ThisDrawing.SendCommand "-insert d:\drawing8.dwg" & vbCr & "2,2,0 1 1 0 " # I8 z5 d9 c! O2 j  a
复制代码
; p. e6 r+ r) T1 Q
二.首先创建一个用于过渡(中间?辅助?)的新文档,并做为全局变量,用 InsertBlock 方法插入外部块参照.当其它文档需要插入该外部块参照时,从这个过渡(中间?辅助?)文档中拷贝过来,而不再使用 InsertBlock 方法
$ O: d2 [4 b& t' f7 T% e% B下面两段代码中都引用了 ObjectDbx 类库,目的是在后台运行这个过渡(中间?辅助?)文档,以免它在前台添乱.运行下面两段代码前应引用 ObjectDbx 类库
) E: a; m/ z6 M0 v1 y
  1. : j4 ?/ H+ f% O! i8 O
  2. Dim AxDbDoc As New AxDbDocument, Objs(0) As AcadBlockReference, Inserted As Boolean7 G3 j' z5 g7 T* I' i; b
  3.    
    / M) |" G; Z: S! j4 \
  4. Sub Sub1()
    7 z$ h3 y8 F2 z2 X) [( R2 }
  5.     Dim insertionPnt(0 To 2) As Double$ e$ ^: r! V2 u! W/ @0 T
  6.     Dim blockRefObj As AcadBlockReference
    $ V# a6 A2 U1 `& X$ R( c: A
  7.     Dim V As Variant, P(2) As Double
    + X/ Z* g( [: P; ^. w* D
  8.     ; D! p( }9 v! ]" v2 a" K1 p9 U1 l' C
  9.     If Not Inserted Then
    : ?  e1 p) G" x# @9 n
  10.         Set Objs(0) = AxDbDoc.ModelSpace.InsertBlock(P, "d:\drawing8.dwg", 1, 1, 1, 0)
    1 d3 p0 V$ A) P; ~( \9 S& K
  11.         Inserted = True
    " R8 T( K8 d9 e' T& @# K% }2 E- P
  12.     End If& t1 E% C0 t* x3 V% y
  13.    
      ]/ I& S1 ]9 B. ]
  14.     V = AxDbDoc.CopyObjects(Objs, ThisDrawing.ModelSpace)
    * M, n, ~, R- _. x+ R
  15.     Set blockRefObj = V(0)( l- @$ B2 a- @3 ^0 Y. C# P
  16.     insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 0$ I) |% f6 Y: W+ e
  17.     blockRefObj.Move P, insertionPnt
    8 m' b4 m* F, W6 {* t* k, E+ L
  18.     ! P6 E3 ?+ X7 O
  19.     ZoomAll# [" K/ h1 r# z# G; J7 z
  20. End Sub
    7 H& N8 R: h; ^' A3 `3 C
复制代码

. ?4 F7 r# t7 S" z1 p9 J& L+ L三.自己编写一段插入外部块的函数,代替 InsertBlock 方法插入外部块
% D9 N  ?5 r  a8 G4 @0 Y
  1. + m& V# ]$ }, x+ e- ?
  2. Sub Sub2()
    ) y! u3 @! Y. D  D
  3.     Dim insertionPnt(0 To 2) As Double( D0 g9 @  c: R7 E1 t) I
  4.     Dim blockRefObj As AcadBlockReference9 w2 a, e5 y0 z1 a2 Q1 `
  5.     insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 0
    / t2 Q( C5 o4 ?8 S* O( X
  6.     Set blockRefObj = InsertBlock(ThisDrawing.ModelSpace, insertionPnt, "d:\drawing8.dwg", 1#, 1#, 1#, 0)+ Q' E; y3 b+ v1 @9 N/ ^  X
  7.     ZoomAll
    ' e) x; [9 ?. g- o* u7 U6 }: Z
  8. End Sub9 ?' y) A- w* {7 M6 R! m1 H( o, z

  9.   P* q1 N1 q% R. _4 ]/ {2 X
  10. Private Function InsertBlock(ByVal Block As AcadBlock, ByVal InsertionPoint As Variant, _
    ; ^+ u) N  P' H, w$ D- a- M
  11. ByVal Name As String, ByVal Xscale As Double, ByVal Yscale As Double, ByVal Zscale As Double, _
      x" j: n( c% V$ W
  12. ByVal Rotation As Double) As AcadBlockReference4 @6 V% ?, W5 d$ @
  13.     Dim BlockName As String
    5 e$ `4 T, p- j8 y
  14.     Dim D As New AxDbDocument, E() As AcadEntity, I As Integer, B As AcadBlock, P(2) As Double) R$ M  P( k; q4 _0 O# K/ B
  15.     ( W9 A; d4 ~! F  o  O4 n* Y  R
  16.     On Error Resume Next2 {3 H. V5 V7 W6 `8 A: x
  17.    
    , L5 p0 ?2 Z1 C- |/ E& H% T$ k: i- Z
  18.     BlockName = Right(Name, Len(Name) - InStrRev(Name, ""))
    8 S# Y2 o$ U  f* v9 T; p
  19.     BlockName = Left(BlockName, InStrRev(BlockName, ".") - 1)/ X) A$ e& p. i, `6 @
  20.    
    9 X) R# ]8 S( k& S# G2 x
  21.     Set InsertBlock = Block.InsertBlock(InsertionPoint, BlockName, Xscale, Yscale, Zscale, Rotation)" @6 R& \% E5 l1 N" y  J
  22.       D2 q+ O- {4 l2 A/ b8 e. Y& e
  23.     If Err Then& I- {5 [4 I4 V
  24.         D.Open Name# G. ]; w# ?4 k/ }0 S, a- p
  25.         If D.ModelSpace.Count > 0 Then) y2 Y& U) A0 P. ~
  26.             ReDim E(D.ModelSpace.Count - 1)* g, X5 N; S/ G! B8 F
  27.             For I = 0 To D.ModelSpace.Count - 1/ P* f! S! g3 W) u4 O% d
  28.                 Set E(I) = D.ModelSpace.Item(I)# t& z# @  n+ p5 p" ?
  29.             Next& j. j( Z4 b7 V9 ]
  30.             Set B = Block.Document.Blocks.Add(P, BlockName)6 Y  U' M3 ^- s
  31.             D.CopyObjects E, B
    : R" Q# J3 `# {* H, z! \9 S
  32.         End If/ k9 \- H) f) F4 ^' Z7 {
  33.         Set InsertBlock = Block.InsertBlock(InsertionPoint, BlockName, Xscale, Yscale, Zscale, Rotation)
    : [. j  V3 ^& q$ p8 h1 D8 \/ K' }/ p3 K
  34.     End If
    4 j+ W0 B# \9 F. x) I- m
  35. End Function
    ) A7 }) t4 J, @) s% {, |
复制代码
 楼主| 发表于 2011-8-6 23:47:08 | 显示全部楼层 来自: 中国浙江杭州
斑竹老兄,你太强了,对你的崇拜犹如滔滔江水延绵不绝啊
 楼主| 发表于 2011-8-8 09:20:51 | 显示全部楼层 来自: 中国浙江杭州
数据类型AxDbDocument有提示说用户定义类型未定义
; j" Z" H- ]( D( E* Y4 J
4 ]2 s2 \2 X5 h/ C; T7 ^% ?. [是不是也要引用ObjectDbx 类库?
6 J4 ]0 O; N, Z! e4 Z5 u0 x, S" }, U+ V  B! o9 k# T8 V
还有如何引用ObjectDbx 类库?我在引用列表里没有找到
 楼主| 发表于 2011-8-8 09:31:39 | 显示全部楼层 来自: 中国浙江杭州
通过在开发人员帮助中搜索ObjectDbx找到了
, r6 p. D- D+ ~6 M; t
; t% ]. J  ]- q" ~谢谢斑竹
 楼主| 发表于 2011-8-8 16:33:15 | 显示全部楼层 来自: 中国浙江杭州
在引用类库的过程中出现问题
$ Y) U# r5 \1 u" D' G9 x' `+ KCAD2006对应的类库版本号为16.0; n# O% Q: U, N& d, p' T/ {/ [
CAD2008对应的类库版本号为17.0
. S) [% c/ `9 f2 `4 VCAD2010对应的类库版本号为18.0
1 |0 G+ R2 l: h5 y1 W
! `/ f* t+ J9 Q: R本来应该在低版本CAD中引用低版本类库,然后在高版本CAD中应该自动继承为高版本类库* S/ @$ F1 Z7 W# H: ^9 F& J

; J: a+ D9 Z7 p* w$ I9 i0 K3 s! C; F可实际上并不会自动向前继承  S* t* ~2 C8 M. T7 o/ H5 [# t; k
' E/ P9 A( W+ I9 M0 ?
请问此问题有没有办法解决呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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