QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 157787698 于 2011-8-5 12:11 编辑
2 t2 ]+ _8 i. O. d
1 G9 ?* I- \6 x! M用insertblock向图纸中插入块,代码如下:# j  E# v( E3 j

  1. ; O" O! G+ _! ]
  2.     Dim insertionPnt(0 To 2) As Double
    $ u; }% ]/ F0 U* Y4 l7 F
  3.     Dim blockRefObj As AcadBlockReference2 ~7 N# V: j% X7 v$ U5 P
  4.     insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 0; P  m/ X* _$ X! O
  5.     Set blockRefObj = ThisDrawing.ModelSpace.InsertBlock(insertionPnt, "d:\drawing8.dwg", 1#, 1#, 1#, 0)
    & C& g' ]* b" w5 v1 I9 a
  6.     ZoomAll) T% \. d7 Y6 C, G, J9 W% R' t. ^
复制代码

) k2 P2 C0 ^- T. Q. A' u) {/ [" l5 N, {- a
在CAD2006中没有问题,但是一旦拿到CAD2010中就有问题:4 O  A+ e9 ]6 X8 ~5 I1 E7 }
当在第一次使用的图纸中重复使用时,没有问题;
. _3 o: ]& W5 X- @但是一旦关掉第一次使用的那张图纸,在新建的图纸中使用的时候就会跳错,提示如下:' p" {8 @* b! ~1 a+ Y) U
& T4 `" l; B- r2 ?0 S+ \
请大虾们帮助解决,或提供其他思路,非常感谢。
未命名.JPG

Drawing8.dwg

47.01 KB, 下载次数: 10

 楼主| 发表于 2011-8-5 10:13:26 | 显示全部楼层 来自: 中国浙江杭州
其实图纸内容是神马都无所谓的,一样会跳错
 楼主| 发表于 2011-8-5 10:17:53 | 显示全部楼层 来自: 中国浙江杭州
难道是因为CAD2010中的thisdrawing需要重新激活?$ d* J$ b! k2 I3 R: t8 ?5 s) }

1 e$ ?# r  k0 j$ f0 f! W但为神马其他方法方法没有问题?只发现了insertblock有问题
发表于 2011-8-6 06:51:03 | 显示全部楼层 来自: 中国辽宁
貌似这是 ACAD 高版本 ActiveX 的一个BUG,到目前为止我们似乎还只能绕开它.
2 y7 v- z  e4 @4 H( I. f可用的方法大体上有下面几种:
3 J. m3 t9 l% h! k' ?/ R一.使用 Document 对象的 SendCommand 方法2 i5 _2 x1 B0 U, C6 A
  1. - r' p* e% X! [" |
  2. ThisDrawing.SendCommand "-insert d:\drawing8.dwg" & vbCr & "2,2,0 1 1 0 "
    - c# y7 w) a/ R" q& v
复制代码

$ S+ c+ V+ s$ U) Z! U' U二.首先创建一个用于过渡(中间?辅助?)的新文档,并做为全局变量,用 InsertBlock 方法插入外部块参照.当其它文档需要插入该外部块参照时,从这个过渡(中间?辅助?)文档中拷贝过来,而不再使用 InsertBlock 方法
1 h% `. b9 `) o4 e- S) d9 }2 x下面两段代码中都引用了 ObjectDbx 类库,目的是在后台运行这个过渡(中间?辅助?)文档,以免它在前台添乱.运行下面两段代码前应引用 ObjectDbx 类库
* h. i+ Q" w9 b4 @  e, V$ R3 e
  1. : |  n# Y- M) Q
  2. Dim AxDbDoc As New AxDbDocument, Objs(0) As AcadBlockReference, Inserted As Boolean% o% R6 F9 G1 T
  3.     4 E1 r7 s; {/ V( z- {4 F
  4. Sub Sub1(). x- [. u2 L  l' ?
  5.     Dim insertionPnt(0 To 2) As Double
    1 b5 ?! X3 U, e" |" l3 n3 I
  6.     Dim blockRefObj As AcadBlockReference: I: m8 ^- [* `, s. y8 a5 ]
  7.     Dim V As Variant, P(2) As Double
    7 y5 q- I5 W9 J, H0 s( q5 e% q
  8.    
    9 u3 D+ U4 U& i" q% _- s
  9.     If Not Inserted Then
    / @2 {+ p6 w. Y3 H2 i& H7 D
  10.         Set Objs(0) = AxDbDoc.ModelSpace.InsertBlock(P, "d:\drawing8.dwg", 1, 1, 1, 0)
    5 h$ @! A; }1 k
  11.         Inserted = True
    ! s6 L. [1 \, B! T$ U# g
  12.     End If
    : x; G; C2 o  e" x9 u
  13.    
    2 X4 \+ @$ z3 w
  14.     V = AxDbDoc.CopyObjects(Objs, ThisDrawing.ModelSpace)
    ' o# d# Q: P& y) a' r8 b
  15.     Set blockRefObj = V(0)
    $ b' I7 T3 t) d
  16.     insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 09 {8 k$ s- S  G: a7 j
  17.     blockRefObj.Move P, insertionPnt, T! B) y, `7 C# N7 @
  18.    
    , z- T" [3 G& g2 e+ j# |
  19.     ZoomAll  N; L' r: @, F; c% S* {3 f
  20. End Sub7 M- I& V0 X6 v( s( K
复制代码
( k: W9 X  A! `2 x# Y
三.自己编写一段插入外部块的函数,代替 InsertBlock 方法插入外部块) w: T# j; B& s4 a
  1. 8 r. K# o$ y9 u  A
  2. Sub Sub2()* s' r0 ?  ~/ \1 c
  3.     Dim insertionPnt(0 To 2) As Double2 G6 N% o5 g$ R+ u4 D, ^. P
  4.     Dim blockRefObj As AcadBlockReference! ]% p! x6 @, V( I
  5.     insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 0$ E4 d7 }, j' L
  6.     Set blockRefObj = InsertBlock(ThisDrawing.ModelSpace, insertionPnt, "d:\drawing8.dwg", 1#, 1#, 1#, 0)
    * `0 C9 Z0 I+ y* `. y$ q( f# F
  7.     ZoomAll
      X% E$ W0 |9 ]5 H; f+ Q$ I$ l+ b4 N
  8. End Sub
    % D( v: H7 I) F% u1 W

  9. / N, k2 t! c& m6 c4 Q
  10. Private Function InsertBlock(ByVal Block As AcadBlock, ByVal InsertionPoint As Variant, _+ @# ]+ Y8 h& ?8 @- I! T0 o. F
  11. ByVal Name As String, ByVal Xscale As Double, ByVal Yscale As Double, ByVal Zscale As Double, _) v6 h% P3 Q0 v2 b9 W
  12. ByVal Rotation As Double) As AcadBlockReference& G  i$ x6 Y/ ?
  13.     Dim BlockName As String
    $ g" p; x0 _. e; W5 I  T
  14.     Dim D As New AxDbDocument, E() As AcadEntity, I As Integer, B As AcadBlock, P(2) As Double9 s- ?4 e9 Z" l% q( N
  15.     - }' h/ Z3 d2 e8 f# B
  16.     On Error Resume Next
    5 b, p+ T! W' Q- T) s3 r" ^8 o1 x
  17.     , C1 {# @( z' b9 ]. `/ Z7 j" P
  18.     BlockName = Right(Name, Len(Name) - InStrRev(Name, ""))
      q3 `$ p/ [4 |
  19.     BlockName = Left(BlockName, InStrRev(BlockName, ".") - 1)! n  u) E$ u) z* `2 q7 ^
  20.     : x! f& B5 R2 i: [( z- Z  C2 E: [7 p; b
  21.     Set InsertBlock = Block.InsertBlock(InsertionPoint, BlockName, Xscale, Yscale, Zscale, Rotation)
    % l$ m' p3 v3 z8 `
  22.     1 z9 w1 y# E% O6 _7 Y0 d& ~; S
  23.     If Err Then
    ! k5 A8 R0 n% a, X' e3 @
  24.         D.Open Name* r9 r. _) g; l5 \1 f2 s
  25.         If D.ModelSpace.Count > 0 Then
    2 Y  u& c% a% y. P' P/ J0 D6 p
  26.             ReDim E(D.ModelSpace.Count - 1)6 d- D- s- g5 A. S: j' h
  27.             For I = 0 To D.ModelSpace.Count - 1( x0 }# I$ c- S, f$ Q& I' N! t
  28.                 Set E(I) = D.ModelSpace.Item(I)9 k0 L- g# m! H/ ?
  29.             Next; S/ c/ J* o% I0 f+ v
  30.             Set B = Block.Document.Blocks.Add(P, BlockName)# [$ {" u* M8 ~. R. E
  31.             D.CopyObjects E, B
    / O- X, t) I0 a2 {0 e" m5 D
  32.         End If: `- s: {) f, ^7 j9 l5 ~. H
  33.         Set InsertBlock = Block.InsertBlock(InsertionPoint, BlockName, Xscale, Yscale, Zscale, Rotation): D3 v/ ^: W+ j
  34.     End If& S- t8 j! X* [' a; g
  35. End Function
    " I# g4 @% M8 Z$ D. H- M
复制代码
 楼主| 发表于 2011-8-6 23:47:08 | 显示全部楼层 来自: 中国浙江杭州
斑竹老兄,你太强了,对你的崇拜犹如滔滔江水延绵不绝啊
 楼主| 发表于 2011-8-8 09:20:51 | 显示全部楼层 来自: 中国浙江杭州
数据类型AxDbDocument有提示说用户定义类型未定义
( R0 L2 H+ ~: L5 f
$ g; O* K* A$ x6 i7 y7 c: K' X# ?/ E是不是也要引用ObjectDbx 类库?: h. Q1 d7 P7 h3 Q
7 C& A7 B/ h8 @. D! K- }
还有如何引用ObjectDbx 类库?我在引用列表里没有找到
 楼主| 发表于 2011-8-8 09:31:39 | 显示全部楼层 来自: 中国浙江杭州
通过在开发人员帮助中搜索ObjectDbx找到了3 k  m; W* \6 b! p6 ^& G' k% H

5 R4 k3 E1 n4 S谢谢斑竹
 楼主| 发表于 2011-8-8 16:33:15 | 显示全部楼层 来自: 中国浙江杭州
在引用类库的过程中出现问题
' U! y* |, @* I, n9 N2 k( j/ l- N9 D' pCAD2006对应的类库版本号为16.06 g0 L+ Y: W9 D$ ]5 J
CAD2008对应的类库版本号为17.0
8 k; t  a+ h- S* i# a! kCAD2010对应的类库版本号为18.0
, C  g8 X# }8 R. D3 d  @) k" m( `; M, U; X
本来应该在低版本CAD中引用低版本类库,然后在高版本CAD中应该自动继承为高版本类库  R' P7 o& }# F* C: g: l) X
! P$ Q: [3 U6 P# r6 o
可实际上并不会自动向前继承$ e( h- T7 ?* Y' l5 i- {" W

3 {$ C$ A% K/ L9 `% W0 V: A请问此问题有没有办法解决呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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