QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 157787698 于 2011-8-5 12:11 编辑 1 n8 W3 H; f5 T
, g% S. Z" w% |; c7 I8 a, x$ `
用insertblock向图纸中插入块,代码如下:0 X" z( f- B) M0 f8 D; y) d6 P
  1. 6 s6 I# V4 N- q4 s, X: H$ ~. G+ a
  2.     Dim insertionPnt(0 To 2) As Double
    0 ]. n! C" c# F5 w
  3.     Dim blockRefObj As AcadBlockReference3 i" i3 v1 M! h# Q+ h( W! N
  4.     insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 0) m! E3 t) d6 u+ `
  5.     Set blockRefObj = ThisDrawing.ModelSpace.InsertBlock(insertionPnt, "d:\drawing8.dwg", 1#, 1#, 1#, 0)) `+ g4 T' K- F0 _/ ~+ E
  6.     ZoomAll/ j8 Z- B$ G- ~" G
复制代码
, q( x* f/ b" A4 G, A. b6 y

1 `: U, F/ [2 z" E$ A) W# P在CAD2006中没有问题,但是一旦拿到CAD2010中就有问题:
# @* M( W& K: f" q4 q当在第一次使用的图纸中重复使用时,没有问题;
3 c$ X6 N6 {( j, B7 T( @) E但是一旦关掉第一次使用的那张图纸,在新建的图纸中使用的时候就会跳错,提示如下:
8 o& V- `1 m* S: k& b; Z, g" r: |) _) S
请大虾们帮助解决,或提供其他思路,非常感谢。
未命名.JPG

Drawing8.dwg

47.01 KB, 下载次数: 10

 楼主| 发表于 2011-8-5 10:13:26 | 显示全部楼层 来自: 中国浙江杭州
其实图纸内容是神马都无所谓的,一样会跳错
 楼主| 发表于 2011-8-5 10:17:53 | 显示全部楼层 来自: 中国浙江杭州
难道是因为CAD2010中的thisdrawing需要重新激活?! V% Y/ p" @$ T
+ `# d8 i4 Q) [7 H5 N9 H
但为神马其他方法方法没有问题?只发现了insertblock有问题
发表于 2011-8-6 06:51:03 | 显示全部楼层 来自: 中国辽宁
貌似这是 ACAD 高版本 ActiveX 的一个BUG,到目前为止我们似乎还只能绕开它. ' O) o" e$ y" z5 a- o1 S2 x; P
可用的方法大体上有下面几种:
/ ~6 N( k5 N% N% S4 T一.使用 Document 对象的 SendCommand 方法
! K. B; w$ U: ]9 y0 M9 g2 H4 A4 }

  1. % t$ F' m* a  H( L- `7 @. T5 I
  2. ThisDrawing.SendCommand "-insert d:\drawing8.dwg" & vbCr & "2,2,0 1 1 0 "
    9 B  c7 P6 O/ H! R$ z
复制代码

- J/ P% o; x$ }+ n7 i; J+ K; }, j二.首先创建一个用于过渡(中间?辅助?)的新文档,并做为全局变量,用 InsertBlock 方法插入外部块参照.当其它文档需要插入该外部块参照时,从这个过渡(中间?辅助?)文档中拷贝过来,而不再使用 InsertBlock 方法
( ~  f1 ~% [& O; w# G$ p& l下面两段代码中都引用了 ObjectDbx 类库,目的是在后台运行这个过渡(中间?辅助?)文档,以免它在前台添乱.运行下面两段代码前应引用 ObjectDbx 类库7 u6 c- f3 _# W& c

  1. . M4 U, x; t( ?; r3 y) o. n. {
  2. Dim AxDbDoc As New AxDbDocument, Objs(0) As AcadBlockReference, Inserted As Boolean" Z5 z$ F2 \! g# h
  3.    
    & }- `+ K- L% `2 z" g
  4. Sub Sub1()% Y4 P4 U; E2 y' x4 e0 o
  5.     Dim insertionPnt(0 To 2) As Double
    # ^$ p+ L+ V8 z8 ~! k* m
  6.     Dim blockRefObj As AcadBlockReference
    2 r) ^# M2 [. _( s& z, \" w2 d
  7.     Dim V As Variant, P(2) As Double
    8 D0 F/ D9 f" Q$ N2 c! h/ q
  8.    
    $ Y- N& l  n6 p
  9.     If Not Inserted Then
    % g5 C5 W) r1 R  _- H; n3 P
  10.         Set Objs(0) = AxDbDoc.ModelSpace.InsertBlock(P, "d:\drawing8.dwg", 1, 1, 1, 0)0 ]8 E, `% z% X/ A
  11.         Inserted = True
    4 P/ W# e4 M) F2 X4 f8 U
  12.     End If
      [* _, ~9 l* E# ^- u( L
  13.     - p7 n9 A/ Y9 Y% B
  14.     V = AxDbDoc.CopyObjects(Objs, ThisDrawing.ModelSpace)
    - O! l6 {& W" R3 i/ Q8 @# i$ b
  15.     Set blockRefObj = V(0)
    # Y* @% k- L- d" a4 r7 }
  16.     insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 0
    0 A% S8 r2 e. D' J: k* n7 S  T
  17.     blockRefObj.Move P, insertionPnt' s2 Y( U: F% m! c# Y; z6 ~) E: R
  18.     + ]. v4 Q; I( `4 A8 J- e7 `: ]
  19.     ZoomAll
      C% y1 t2 ?7 {& A
  20. End Sub3 \9 Q& Q( v) J0 e( h6 S" Y
复制代码
- G4 ?, c/ [$ w
三.自己编写一段插入外部块的函数,代替 InsertBlock 方法插入外部块
+ I& ~9 t0 W, k0 {+ u0 K

  1. 0 }" G% _8 x$ B' y5 }
  2. Sub Sub2()* k- @* p7 z2 }6 Y3 b3 }
  3.     Dim insertionPnt(0 To 2) As Double
    6 w+ {* J, j6 V7 [( X
  4.     Dim blockRefObj As AcadBlockReference
    0 _- W, e8 a3 `% `. `
  5.     insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 07 ~  P3 X- a: ^: f* W3 j+ ^4 c3 `
  6.     Set blockRefObj = InsertBlock(ThisDrawing.ModelSpace, insertionPnt, "d:\drawing8.dwg", 1#, 1#, 1#, 0)! ]  T0 u, y! }
  7.     ZoomAll
    # E9 _6 E9 n4 c9 z3 W7 m. ~
  8. End Sub
    9 p- O: L+ E5 B) C' O" o4 I! F
  9. $ A  @" n/ v$ c
  10. Private Function InsertBlock(ByVal Block As AcadBlock, ByVal InsertionPoint As Variant, _
    9 |: n, I4 u- N  M. h( Y+ F& H
  11. ByVal Name As String, ByVal Xscale As Double, ByVal Yscale As Double, ByVal Zscale As Double, _; }" ?$ m8 P& d
  12. ByVal Rotation As Double) As AcadBlockReference
    ! Y- S( A& u# d/ M0 g& o+ x
  13.     Dim BlockName As String
    # Q2 n, w  O, r$ s, _9 \$ v
  14.     Dim D As New AxDbDocument, E() As AcadEntity, I As Integer, B As AcadBlock, P(2) As Double
    / i, ^, X4 b4 }
  15.    
    & v- [9 f" ?2 U7 B# T: g; E) V
  16.     On Error Resume Next
    ; e: D$ S5 I- @0 p0 h1 q& y: U% I) i
  17.     3 e) r6 O; n! B8 n- `/ C6 W
  18.     BlockName = Right(Name, Len(Name) - InStrRev(Name, ""))
    8 n4 u$ m, S& _- F# {
  19.     BlockName = Left(BlockName, InStrRev(BlockName, ".") - 1). s& v! u# G% y, D$ L
  20.    
    ; w+ [  H8 g# ?' w8 \7 D3 w0 r3 v( O
  21.     Set InsertBlock = Block.InsertBlock(InsertionPoint, BlockName, Xscale, Yscale, Zscale, Rotation)
    : I/ Y, J8 k" Y/ U" L
  22.     ; B0 o) |; c0 X# G
  23.     If Err Then
    0 k$ z( a; Q6 N
  24.         D.Open Name
    - x0 p- u2 [9 H  Y3 @" c" j
  25.         If D.ModelSpace.Count > 0 Then; e* Y4 d3 K% [/ i) Y) T8 x
  26.             ReDim E(D.ModelSpace.Count - 1)4 }2 X) K' t$ Z9 _! d) l' d: R2 J% n+ D
  27.             For I = 0 To D.ModelSpace.Count - 17 B0 {, ^2 J4 ]: S( |/ v0 m! L
  28.                 Set E(I) = D.ModelSpace.Item(I)
    / T8 h3 e/ |4 u. ^# ]
  29.             Next
    9 {1 @: N# J  S/ \. l
  30.             Set B = Block.Document.Blocks.Add(P, BlockName)' q5 l1 h; O  X5 e% D) }% S. r/ n4 g9 j
  31.             D.CopyObjects E, B
    6 V# O) s0 e7 ^. y
  32.         End If
    ! E5 k3 N4 d- R/ C/ q0 j* `
  33.         Set InsertBlock = Block.InsertBlock(InsertionPoint, BlockName, Xscale, Yscale, Zscale, Rotation)$ _, Z! T+ Z( M7 ]1 l6 G  K
  34.     End If
    5 o/ t0 c* b& j: P+ Q% M
  35. End Function* A9 K* b0 K, |! F* {0 ^
复制代码
 楼主| 发表于 2011-8-6 23:47:08 | 显示全部楼层 来自: 中国浙江杭州
斑竹老兄,你太强了,对你的崇拜犹如滔滔江水延绵不绝啊
 楼主| 发表于 2011-8-8 09:20:51 | 显示全部楼层 来自: 中国浙江杭州
数据类型AxDbDocument有提示说用户定义类型未定义' k3 |/ n" {! M/ X: @

/ z5 t3 B4 o) @; H; [, l3 e7 u是不是也要引用ObjectDbx 类库?# b) O6 L1 I6 z3 H4 H9 Q; u
0 }2 K# j% {6 B+ ?6 v- R
还有如何引用ObjectDbx 类库?我在引用列表里没有找到
 楼主| 发表于 2011-8-8 09:31:39 | 显示全部楼层 来自: 中国浙江杭州
通过在开发人员帮助中搜索ObjectDbx找到了( Q: ]/ |; C* g! B! B% K) o0 x9 n
8 C* ?' M# @% u# V' O+ F7 w4 \( A
谢谢斑竹
 楼主| 发表于 2011-8-8 16:33:15 | 显示全部楼层 来自: 中国浙江杭州
在引用类库的过程中出现问题0 H& }5 C' l, i
CAD2006对应的类库版本号为16.0& r3 |% J# a5 S% ]8 u' ~
CAD2008对应的类库版本号为17.0) P0 @) Y4 x! l8 l
CAD2010对应的类库版本号为18.0
" K4 t0 y1 d7 s" W
, @$ D; W  ~4 L9 F# U  a# T- H& q本来应该在低版本CAD中引用低版本类库,然后在高版本CAD中应该自动继承为高版本类库+ L( v, }. m9 n, @) @

+ b# [# T3 h& P  C( ]! ?可实际上并不会自动向前继承
2 l; h; m- w8 h/ E% g0 a8 C+ y7 m2 n! i
请问此问题有没有办法解决呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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