QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

查看: 5311|回复: 7
收起左侧

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

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

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

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

x
本帖最后由 157787698 于 2011-8-5 12:11 编辑 % o# D& j9 x* F: c/ `* B" n

: N# ~- j1 R* X5 L8 `: r9 q, `用insertblock向图纸中插入块,代码如下:
2 o6 h1 Y' {- ~2 m+ \) Q$ W- g9 [

  1. ; v8 b6 l9 I! w$ v; @5 c6 M4 ?
  2.     Dim insertionPnt(0 To 2) As Double
    # D* `; p- f* l: S) q& {& j
  3.     Dim blockRefObj As AcadBlockReference2 P% C; G8 D$ u) [) L; Q7 J
  4.     insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 05 u; l+ {% h2 D0 b6 \2 p; g
  5.     Set blockRefObj = ThisDrawing.ModelSpace.InsertBlock(insertionPnt, "d:\drawing8.dwg", 1#, 1#, 1#, 0)
    / x$ y' I  v7 P1 n. o; x; h, p4 Z6 l
  6.     ZoomAll# W8 q; K4 E- m7 P6 r# t6 m4 v0 ]( U
复制代码

  k3 _! F' b' T7 s
9 b  O# G. V3 O3 F0 C在CAD2006中没有问题,但是一旦拿到CAD2010中就有问题:* ]' s; _9 P7 f. x  W. y7 @
当在第一次使用的图纸中重复使用时,没有问题;
. E4 e: H" s$ G% x但是一旦关掉第一次使用的那张图纸,在新建的图纸中使用的时候就会跳错,提示如下:$ R) b6 @1 v3 ]5 F. g

: h6 o+ p5 e8 j$ o9 \/ E8 s请大虾们帮助解决,或提供其他思路,非常感谢。
未命名.JPG

Drawing8.dwg

47.01 KB, 下载次数: 11

 楼主| 发表于 2011-8-5 10:13:26 | 显示全部楼层 来自: 中国浙江杭州
其实图纸内容是神马都无所谓的,一样会跳错
 楼主| 发表于 2011-8-5 10:17:53 | 显示全部楼层 来自: 中国浙江杭州
难道是因为CAD2010中的thisdrawing需要重新激活?
8 }6 z8 I9 h7 Y( x0 }( U/ {
9 E; l7 y7 w% t# p( E8 G但为神马其他方法方法没有问题?只发现了insertblock有问题
发表于 2011-8-6 06:51:03 | 显示全部楼层 来自: 中国辽宁
貌似这是 ACAD 高版本 ActiveX 的一个BUG,到目前为止我们似乎还只能绕开它. $ b/ j8 n$ i- X) T) B4 ~3 d  s
可用的方法大体上有下面几种:
. ?* G6 D: f% B0 x" H) [4 r# {一.使用 Document 对象的 SendCommand 方法
! K7 q9 H5 o! U0 y

  1. # P/ r& z+ v7 i. g# v. E
  2. ThisDrawing.SendCommand "-insert d:\drawing8.dwg" & vbCr & "2,2,0 1 1 0 " # D! u" m' h+ a% T+ h
复制代码
! A$ e& A! D* m6 u  S
二.首先创建一个用于过渡(中间?辅助?)的新文档,并做为全局变量,用 InsertBlock 方法插入外部块参照.当其它文档需要插入该外部块参照时,从这个过渡(中间?辅助?)文档中拷贝过来,而不再使用 InsertBlock 方法
* _% ~# k8 H% y( p4 x2 i下面两段代码中都引用了 ObjectDbx 类库,目的是在后台运行这个过渡(中间?辅助?)文档,以免它在前台添乱.运行下面两段代码前应引用 ObjectDbx 类库1 a( m5 p5 `5 v( ?1 t, Y2 h! \5 m
  1. 5 S1 h3 F0 o  B+ c! Y
  2. Dim AxDbDoc As New AxDbDocument, Objs(0) As AcadBlockReference, Inserted As Boolean
    & T6 y1 f6 ~0 H  W; E+ T
  3.     4 x0 i( [7 A% M, g# @
  4. Sub Sub1()
    ' b4 t1 U* T# K- V
  5.     Dim insertionPnt(0 To 2) As Double
    ( |* y5 ^& j) D5 G- |8 F$ z* @
  6.     Dim blockRefObj As AcadBlockReference
    $ w% a/ T% b  L* o
  7.     Dim V As Variant, P(2) As Double
    ; F2 l- f7 j9 B; B
  8.    
    - F4 b; I$ A  \$ w
  9.     If Not Inserted Then4 H' |& u0 Z0 P; r1 `5 _
  10.         Set Objs(0) = AxDbDoc.ModelSpace.InsertBlock(P, "d:\drawing8.dwg", 1, 1, 1, 0)- f0 g  X! z  j7 p$ U( b
  11.         Inserted = True0 c$ B# G( X. W3 q; y/ A
  12.     End If! a( W( R7 Y+ Y" l* {2 f* z) k: y
  13.     ) s- r3 u& V- L. B' ?3 u1 \3 [6 C
  14.     V = AxDbDoc.CopyObjects(Objs, ThisDrawing.ModelSpace)
    & q( n( B$ q6 ~  ~3 J) E. H
  15.     Set blockRefObj = V(0)
    ( b" c7 e1 W& k* F9 O
  16.     insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 0
    . k' g% `: h9 |0 t
  17.     blockRefObj.Move P, insertionPnt
    1 |* Z( N- {3 {. {5 J6 f' s9 N
  18.     7 j: A, L5 ?+ y
  19.     ZoomAll
    4 Q2 _+ |; B# b9 K& K
  20. End Sub
    7 g! c9 H, l! s8 ~8 F- Q
复制代码
* }- G, I8 F. ?( E& ^/ h3 n, O4 P0 j
三.自己编写一段插入外部块的函数,代替 InsertBlock 方法插入外部块
2 W5 E8 }+ }) @5 Z( S
  1. * }8 w6 m$ Y$ T& v8 F
  2. Sub Sub2()& u4 p& e" E; r% I
  3.     Dim insertionPnt(0 To 2) As Double
    - l7 Q9 ]# s0 j8 y9 q+ z
  4.     Dim blockRefObj As AcadBlockReference
    * D8 t+ G4 \' U4 A+ _7 r: f  H
  5.     insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 0
    * O2 O- d% n. t5 n2 d
  6.     Set blockRefObj = InsertBlock(ThisDrawing.ModelSpace, insertionPnt, "d:\drawing8.dwg", 1#, 1#, 1#, 0)3 [+ Y- z6 O! ~. t* ?# p7 a
  7.     ZoomAll
    : t/ O2 ~5 |: e% g. P# n
  8. End Sub; ?: d) L7 u# h+ L4 W% t9 Z
  9. . z: X2 p$ q# N) H( I
  10. Private Function InsertBlock(ByVal Block As AcadBlock, ByVal InsertionPoint As Variant, _
    ; ~2 i0 v' A7 \6 Z" Y2 B9 y, _# j
  11. ByVal Name As String, ByVal Xscale As Double, ByVal Yscale As Double, ByVal Zscale As Double, _
    % e7 Q; E- M/ \  j- K
  12. ByVal Rotation As Double) As AcadBlockReference9 R6 c9 N. k/ a  g
  13.     Dim BlockName As String
    6 D* E6 @4 ^2 i: h5 B
  14.     Dim D As New AxDbDocument, E() As AcadEntity, I As Integer, B As AcadBlock, P(2) As Double
    - y8 j' c5 B" Q. |' r: c$ n
  15.     8 y- c5 A% C8 y9 a. V' a
  16.     On Error Resume Next
    ( Z$ J% G) l8 M. e! C
  17.    
    8 u* R; ?/ C! ?) B6 q* g' u0 P8 P
  18.     BlockName = Right(Name, Len(Name) - InStrRev(Name, ""))2 |5 |8 t( {# ?7 D
  19.     BlockName = Left(BlockName, InStrRev(BlockName, ".") - 1)
    7 }- f& K1 v+ z
  20.    
    - L) s1 Q! z9 O8 ]7 b
  21.     Set InsertBlock = Block.InsertBlock(InsertionPoint, BlockName, Xscale, Yscale, Zscale, Rotation)3 b  k$ s- `9 ?2 A% I8 h  ^
  22.     . I2 x" i5 K  e9 G0 o( i3 k$ V# w
  23.     If Err Then6 @4 b* b5 E; E! a, j
  24.         D.Open Name
    2 d. q  k3 G8 \3 }! L
  25.         If D.ModelSpace.Count > 0 Then5 w  `% V! |) _
  26.             ReDim E(D.ModelSpace.Count - 1)5 }& [9 I! n) y% X
  27.             For I = 0 To D.ModelSpace.Count - 1" _1 m9 X! f( E$ a
  28.                 Set E(I) = D.ModelSpace.Item(I)
    ; |% a; P5 c$ t+ H8 r' F* T
  29.             Next
    : N+ Z* b  i  j. G! o
  30.             Set B = Block.Document.Blocks.Add(P, BlockName)* s+ }' ]& M4 K+ w
  31.             D.CopyObjects E, B
    ! P9 y8 v9 g% O
  32.         End If
    / `2 \6 N- w# B% }9 q
  33.         Set InsertBlock = Block.InsertBlock(InsertionPoint, BlockName, Xscale, Yscale, Zscale, Rotation)
    7 Z2 O( ~4 R) y3 I7 w. ]0 R
  34.     End If
    4 Z( D* c) ?# a4 P
  35. End Function
    3 @6 U! e3 Z0 Z
复制代码
 楼主| 发表于 2011-8-6 23:47:08 | 显示全部楼层 来自: 中国浙江杭州
斑竹老兄,你太强了,对你的崇拜犹如滔滔江水延绵不绝啊
 楼主| 发表于 2011-8-8 09:20:51 | 显示全部楼层 来自: 中国浙江杭州
数据类型AxDbDocument有提示说用户定义类型未定义8 b9 h/ ?. U9 y: @' J
  w2 c+ W1 s% ~" e+ B4 A' t* p
是不是也要引用ObjectDbx 类库?/ P0 ?# I: }) U) i- F4 X2 g

2 Y- q4 g- y: R( y还有如何引用ObjectDbx 类库?我在引用列表里没有找到
 楼主| 发表于 2011-8-8 09:31:39 | 显示全部楼层 来自: 中国浙江杭州
通过在开发人员帮助中搜索ObjectDbx找到了  O* m8 B2 Y) t/ Z3 Y4 X

/ w9 D4 ~. t/ d+ I谢谢斑竹
 楼主| 发表于 2011-8-8 16:33:15 | 显示全部楼层 来自: 中国浙江杭州
在引用类库的过程中出现问题
) V5 E. f$ [) `& UCAD2006对应的类库版本号为16.0
' I3 g4 Z3 s5 y* j$ q; G& G% ~" fCAD2008对应的类库版本号为17.0
0 z+ ?- r" V/ z# V9 s- ~' R6 l2 ~2 BCAD2010对应的类库版本号为18.04 `1 }  g$ s/ o( l9 A  r3 h
1 f  h2 M6 H3 a( S0 J4 X) ]5 x
本来应该在低版本CAD中引用低版本类库,然后在高版本CAD中应该自动继承为高版本类库
1 y) s# x. C9 u1 K8 f6 T2 C
: {% g, m$ o- k- y" s可实际上并不会自动向前继承
6 d( P2 E* J! U: ]: l6 Q7 E' p7 z$ Z, Z0 b) ]# y
请问此问题有没有办法解决呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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