QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 157787698 于 2011-8-5 12:11 编辑 ! f, q. I" r$ L: j0 j: q, A9 a

, |, w+ ~0 ^% e& ?6 l9 d用insertblock向图纸中插入块,代码如下:: y: J, b0 m+ M: h
  1. $ _( C- L2 y- B+ o" Q8 D/ D  h" o0 p
  2.     Dim insertionPnt(0 To 2) As Double+ e: N( J6 {, s
  3.     Dim blockRefObj As AcadBlockReference
    ' Q6 W8 b3 k* Q2 I9 P5 @
  4.     insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 0
    ) y; v0 a: P% P
  5.     Set blockRefObj = ThisDrawing.ModelSpace.InsertBlock(insertionPnt, "d:\drawing8.dwg", 1#, 1#, 1#, 0)
    . G6 P5 U7 a" P8 x6 A& e. l
  6.     ZoomAll* ^" V) Z/ X! X# ~7 \5 X2 \: o
复制代码
2 H3 q6 Y6 K' O9 j$ `
5 w0 n: [8 A1 t) q! m. [
在CAD2006中没有问题,但是一旦拿到CAD2010中就有问题:
+ w4 x4 |1 M! [$ h当在第一次使用的图纸中重复使用时,没有问题;
( I1 i. k; X1 p0 ?: c6 |但是一旦关掉第一次使用的那张图纸,在新建的图纸中使用的时候就会跳错,提示如下:: ~+ G. d3 [, k: U/ J

* f6 v  ^) z+ h; b2 `5 x+ f请大虾们帮助解决,或提供其他思路,非常感谢。
未命名.JPG

Drawing8.dwg

47.01 KB, 下载次数: 10

 楼主| 发表于 2011-8-5 10:13:26 | 显示全部楼层 来自: 中国浙江杭州
其实图纸内容是神马都无所谓的,一样会跳错
 楼主| 发表于 2011-8-5 10:17:53 | 显示全部楼层 来自: 中国浙江杭州
难道是因为CAD2010中的thisdrawing需要重新激活?. g) ~( z+ U; G: W( ^
  c' K# B) I. F6 Q' T, ?
但为神马其他方法方法没有问题?只发现了insertblock有问题
发表于 2011-8-6 06:51:03 | 显示全部楼层 来自: 中国辽宁
貌似这是 ACAD 高版本 ActiveX 的一个BUG,到目前为止我们似乎还只能绕开它.
9 F* ?7 O2 M% F9 B4 E3 w可用的方法大体上有下面几种: . E$ t5 w# h: ~% S
一.使用 Document 对象的 SendCommand 方法
+ W' y0 A- z. L% F! p8 g
  1. % Z6 G4 ^6 e" d% H3 c6 k4 j
  2. ThisDrawing.SendCommand "-insert d:\drawing8.dwg" & vbCr & "2,2,0 1 1 0 "
    % i' \7 p6 A- w9 [" H$ I0 F
复制代码
3 S; y. h$ k, y% s( z
二.首先创建一个用于过渡(中间?辅助?)的新文档,并做为全局变量,用 InsertBlock 方法插入外部块参照.当其它文档需要插入该外部块参照时,从这个过渡(中间?辅助?)文档中拷贝过来,而不再使用 InsertBlock 方法
. z- f* a5 G# t% D% ?  i; E下面两段代码中都引用了 ObjectDbx 类库,目的是在后台运行这个过渡(中间?辅助?)文档,以免它在前台添乱.运行下面两段代码前应引用 ObjectDbx 类库: g3 N5 u  t3 Q. f$ e4 q. x9 w
  1. # U( }7 P8 A( s2 o2 U
  2. Dim AxDbDoc As New AxDbDocument, Objs(0) As AcadBlockReference, Inserted As Boolean' ~1 V( d; g) H. y% m
  3.    
    8 _# O5 d3 {+ F6 e& q, q$ p
  4. Sub Sub1(); A2 o; w: E2 A1 w
  5.     Dim insertionPnt(0 To 2) As Double( a) S& s/ C- d3 N# j
  6.     Dim blockRefObj As AcadBlockReference
    ! ~# h7 M7 b6 @; e+ [! D, T' a4 C
  7.     Dim V As Variant, P(2) As Double
    4 h+ _8 {3 |4 s% N9 K) v$ `+ N8 ^) K
  8.     ; y  `9 _# J' Y: d
  9.     If Not Inserted Then8 T5 C$ V3 M% i: J
  10.         Set Objs(0) = AxDbDoc.ModelSpace.InsertBlock(P, "d:\drawing8.dwg", 1, 1, 1, 0)1 @* R0 S: |' T
  11.         Inserted = True
    ' p( @1 E+ d! p% ]5 s
  12.     End If. n9 ^2 V5 F% ~2 U: |9 U
  13.    
    1 N2 I1 x6 V; y& [4 b* x! X
  14.     V = AxDbDoc.CopyObjects(Objs, ThisDrawing.ModelSpace)& X8 J3 u* F+ j# I- }9 S
  15.     Set blockRefObj = V(0)
    4 T, j! a0 S+ l  A
  16.     insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 0( J6 B# m% D7 m; T) \4 F8 G" T6 p
  17.     blockRefObj.Move P, insertionPnt, I- G4 Z; @; N0 B# m
  18.    
    9 q( @0 f0 q2 V0 }) \) k
  19.     ZoomAll( u1 N5 w: @/ ]+ P2 s5 }2 D* Y
  20. End Sub, E0 ], m* Q: l1 p' I* Z
复制代码

; P2 N! U; X# I1 r. n三.自己编写一段插入外部块的函数,代替 InsertBlock 方法插入外部块
" |* m. l8 [$ Z! s$ _. y! I
  1. 7 {, e9 W* T$ I
  2. Sub Sub2()
    # C$ B. ]( _& [- O: ^3 i2 a9 f
  3.     Dim insertionPnt(0 To 2) As Double
    , S0 z- S8 M) e6 w  Q- ^0 L4 M
  4.     Dim blockRefObj As AcadBlockReference
    9 {% E  p2 c5 I* e
  5.     insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 04 l" I& r% b2 q' S" d+ j% _9 k
  6.     Set blockRefObj = InsertBlock(ThisDrawing.ModelSpace, insertionPnt, "d:\drawing8.dwg", 1#, 1#, 1#, 0)
    9 b  C* {+ E3 Q( _# `$ P
  7.     ZoomAll' \7 @4 v" w0 @9 t
  8. End Sub0 f+ G: K1 G( G, r
  9. ! a8 ^/ q6 l! d  }7 p
  10. Private Function InsertBlock(ByVal Block As AcadBlock, ByVal InsertionPoint As Variant, _* t6 F  G- ^# ~. W0 ], U8 `
  11. ByVal Name As String, ByVal Xscale As Double, ByVal Yscale As Double, ByVal Zscale As Double, _
    $ z$ O" S; Q6 m- A5 E( O& ^9 h
  12. ByVal Rotation As Double) As AcadBlockReference+ r6 ]2 K; p' V6 k1 r9 y* j
  13.     Dim BlockName As String9 S( t0 ]2 l) k) ^$ }, Y0 ~
  14.     Dim D As New AxDbDocument, E() As AcadEntity, I As Integer, B As AcadBlock, P(2) As Double- w, f/ `9 b9 D6 `& r6 O7 z3 x
  15.    
    2 W6 \  K8 t: \! o5 {* Q3 |) B
  16.     On Error Resume Next8 V$ Y. \; ~6 d. \) `1 q
  17.     . X1 B7 h8 b4 W; J1 o. |8 R+ v
  18.     BlockName = Right(Name, Len(Name) - InStrRev(Name, ""))" Z- D1 Z4 }4 q4 G/ v+ _+ w6 O
  19.     BlockName = Left(BlockName, InStrRev(BlockName, ".") - 1)
    3 C/ a1 h+ y, g8 `5 t* F' j
  20.       }2 y* E: N! H* Q" |! D/ n: L! H2 O
  21.     Set InsertBlock = Block.InsertBlock(InsertionPoint, BlockName, Xscale, Yscale, Zscale, Rotation)& W7 ]" a/ a2 _3 }; T: u. I
  22.     ! U2 Z. G& I# y, b  `
  23.     If Err Then
    0 Y- ?$ ]' F/ d( B6 `- q8 B& D7 U% L
  24.         D.Open Name
    $ y' u& u* @1 X* n
  25.         If D.ModelSpace.Count > 0 Then
    5 r9 q5 {6 w+ q! c: @; \; s5 n
  26.             ReDim E(D.ModelSpace.Count - 1)
    . {' u9 r2 g  e
  27.             For I = 0 To D.ModelSpace.Count - 1" G0 A$ I, g) e" F; S
  28.                 Set E(I) = D.ModelSpace.Item(I)+ @! B3 d# i2 B( w
  29.             Next; W: i/ `6 c1 u) `
  30.             Set B = Block.Document.Blocks.Add(P, BlockName)
    ) `: i5 l% p$ J6 d" K
  31.             D.CopyObjects E, B* {- s6 h. N: v$ j/ C7 h
  32.         End If
    # l" _  h+ i( N; ?% m* s
  33.         Set InsertBlock = Block.InsertBlock(InsertionPoint, BlockName, Xscale, Yscale, Zscale, Rotation)6 [) b5 }2 S2 g. h3 O& }6 q) X0 |
  34.     End If
    . }+ [) K" j/ V7 j  j2 ^
  35. End Function
    ! T# Q& ?& {% d4 F1 n& {6 r
复制代码
 楼主| 发表于 2011-8-6 23:47:08 | 显示全部楼层 来自: 中国浙江杭州
斑竹老兄,你太强了,对你的崇拜犹如滔滔江水延绵不绝啊
 楼主| 发表于 2011-8-8 09:20:51 | 显示全部楼层 来自: 中国浙江杭州
数据类型AxDbDocument有提示说用户定义类型未定义6 C( D, e1 V% w

6 j  c, U0 F* }* E是不是也要引用ObjectDbx 类库?
0 i; ^2 I/ v, ?8 G% t7 @+ z5 ?: G4 @3 b6 |! U! G$ F; J
还有如何引用ObjectDbx 类库?我在引用列表里没有找到
 楼主| 发表于 2011-8-8 09:31:39 | 显示全部楼层 来自: 中国浙江杭州
通过在开发人员帮助中搜索ObjectDbx找到了
: X2 E8 n* G1 B7 d- o# M1 o) o: K5 L! [# n2 U, x9 |
谢谢斑竹
 楼主| 发表于 2011-8-8 16:33:15 | 显示全部楼层 来自: 中国浙江杭州
在引用类库的过程中出现问题, R, T  Z. N, s$ j' x4 Y7 X
CAD2006对应的类库版本号为16.0
& O) H- V2 M% h- aCAD2008对应的类库版本号为17.0* E; G5 |& B8 q! T6 C% Y
CAD2010对应的类库版本号为18.0! }' F* @7 K5 z3 D' s7 U
* ^! m" |! }1 ~! K9 C6 ]1 e; J1 `
本来应该在低版本CAD中引用低版本类库,然后在高版本CAD中应该自动继承为高版本类库
% _, w" Q; j! W( v' j# G* g7 d; d2 g9 D3 o6 l1 [
可实际上并不会自动向前继承
! V, P7 Q0 |" a7 n& G8 M$ @3 E: [! g& g- n2 v
请问此问题有没有办法解决呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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