QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 157787698 于 2011-8-5 12:11 编辑
3 T- Z, X* ?0 f
7 Z: }/ N9 ?1 \! N% I  {; G) ^用insertblock向图纸中插入块,代码如下:2 |) [( m( v& O. n' m
  1. ! \0 G4 a" T- W8 f4 D! n$ l
  2.     Dim insertionPnt(0 To 2) As Double6 @) z4 a* g* H( j2 S+ H* l
  3.     Dim blockRefObj As AcadBlockReference& x/ z: |5 O* U# m0 E2 ?0 h
  4.     insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 0
    ( X) ]7 M6 G. N
  5.     Set blockRefObj = ThisDrawing.ModelSpace.InsertBlock(insertionPnt, "d:\drawing8.dwg", 1#, 1#, 1#, 0)
    * m9 d2 v# _" |
  6.     ZoomAll
    * {6 w9 x; }6 i9 G' y1 F
复制代码

; \3 m2 Y, P$ V: S  C5 D) b$ Z, m. n
在CAD2006中没有问题,但是一旦拿到CAD2010中就有问题:5 |$ b! }0 ~$ Z6 p, K4 S) A+ K
当在第一次使用的图纸中重复使用时,没有问题;
( @  l+ j# s9 n# N9 ]2 B0 \但是一旦关掉第一次使用的那张图纸,在新建的图纸中使用的时候就会跳错,提示如下:# M5 y3 Y: q7 y  t& X
  R. e; X! a# k* W
请大虾们帮助解决,或提供其他思路,非常感谢。
未命名.JPG

Drawing8.dwg

47.01 KB, 下载次数: 10

 楼主| 发表于 2011-8-5 10:13:26 | 显示全部楼层 来自: 中国浙江杭州
其实图纸内容是神马都无所谓的,一样会跳错
 楼主| 发表于 2011-8-5 10:17:53 | 显示全部楼层 来自: 中国浙江杭州
难道是因为CAD2010中的thisdrawing需要重新激活?
8 K  P, t, P3 l- r, c; }+ ~
$ k" I% [. C' J. B+ S但为神马其他方法方法没有问题?只发现了insertblock有问题
发表于 2011-8-6 06:51:03 | 显示全部楼层 来自: 中国辽宁
貌似这是 ACAD 高版本 ActiveX 的一个BUG,到目前为止我们似乎还只能绕开它. $ V, W- [; J2 o- N: |7 l  G
可用的方法大体上有下面几种:   ^  p/ t( l( T( k' d
一.使用 Document 对象的 SendCommand 方法
6 D' s' X# c: r) L2 h' G$ W; ~0 _& n
  1. 5 U' X6 Y$ i1 n" S! o" R0 C
  2. ThisDrawing.SendCommand "-insert d:\drawing8.dwg" & vbCr & "2,2,0 1 1 0 " 6 }# V+ f+ J  p6 H  [
复制代码
- x( Y, e' T$ u  V" H
二.首先创建一个用于过渡(中间?辅助?)的新文档,并做为全局变量,用 InsertBlock 方法插入外部块参照.当其它文档需要插入该外部块参照时,从这个过渡(中间?辅助?)文档中拷贝过来,而不再使用 InsertBlock 方法; e1 b, C8 R: k1 e
下面两段代码中都引用了 ObjectDbx 类库,目的是在后台运行这个过渡(中间?辅助?)文档,以免它在前台添乱.运行下面两段代码前应引用 ObjectDbx 类库
) ]" v9 W# F( H

  1. 4 @" N( Z+ c3 X- H
  2. Dim AxDbDoc As New AxDbDocument, Objs(0) As AcadBlockReference, Inserted As Boolean
    ) A& y5 f. m% e  e1 k2 Q2 ?
  3.    
      ?/ S3 Y+ I$ K# R$ I/ f
  4. Sub Sub1()- g) n/ {6 w; b7 Q1 U7 X
  5.     Dim insertionPnt(0 To 2) As Double6 h( L) f0 I" ~- I9 G
  6.     Dim blockRefObj As AcadBlockReference- K3 a/ B9 Z8 Q6 N* g) K
  7.     Dim V As Variant, P(2) As Double
    2 U  g9 O( e- t% U# j6 P0 Y* m  e
  8.    
    " V. ]: s  ]; G/ z
  9.     If Not Inserted Then+ D8 X2 g- }( E# ]* Q+ J4 Y
  10.         Set Objs(0) = AxDbDoc.ModelSpace.InsertBlock(P, "d:\drawing8.dwg", 1, 1, 1, 0)! U1 h7 R2 B9 P5 e7 o
  11.         Inserted = True: U3 _0 A! {+ y9 ~/ K
  12.     End If' d5 `# A, t  D7 I* j* z
  13.    
    # N7 I- h- ]1 c4 l
  14.     V = AxDbDoc.CopyObjects(Objs, ThisDrawing.ModelSpace)- R6 T, u- i/ U  A
  15.     Set blockRefObj = V(0)
    3 o# k7 M* W* J8 M, o0 z
  16.     insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 0# t; c( C0 v3 i$ b0 E+ @
  17.     blockRefObj.Move P, insertionPnt7 d+ M+ F7 G9 t* p5 A  W
  18.     " C) }0 B' B- K: b
  19.     ZoomAll
    & {4 `" {7 Q6 r/ s; O, D7 a1 X+ ~
  20. End Sub; ?- G$ |: s# ?
复制代码

8 v) Y( v, i% m- `: M0 ?1 K三.自己编写一段插入外部块的函数,代替 InsertBlock 方法插入外部块
3 |+ ~( e) b! J3 @" h3 A2 H

  1. $ W# `6 n$ r& _$ f& ]9 M$ o2 V3 U
  2. Sub Sub2()/ A, \, i: ]1 G! }- }" a9 Y/ W: k
  3.     Dim insertionPnt(0 To 2) As Double
    ! E5 x* {/ w& p
  4.     Dim blockRefObj As AcadBlockReference
    ; P1 D3 s8 Z5 s  a
  5.     insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 0
    ' Z% C4 e5 P, T  I
  6.     Set blockRefObj = InsertBlock(ThisDrawing.ModelSpace, insertionPnt, "d:\drawing8.dwg", 1#, 1#, 1#, 0)
    9 B$ `8 Z2 D: K1 n/ k9 g# l8 |; ]
  7.     ZoomAll3 c5 Q8 _& ~( S% F
  8. End Sub
    1 ]$ S* o1 s! f3 @. C2 T' ]* P
  9. * h+ @2 F% G$ s" J0 Y0 v# j
  10. Private Function InsertBlock(ByVal Block As AcadBlock, ByVal InsertionPoint As Variant, _" D3 }8 i& |0 {
  11. ByVal Name As String, ByVal Xscale As Double, ByVal Yscale As Double, ByVal Zscale As Double, _, o6 m0 |0 P4 d
  12. ByVal Rotation As Double) As AcadBlockReference* [6 k3 Q& S# l5 S  ]9 J) g
  13.     Dim BlockName As String
      J) `# S" i# b, _
  14.     Dim D As New AxDbDocument, E() As AcadEntity, I As Integer, B As AcadBlock, P(2) As Double
    6 ]' C% `2 E; `; \3 e
  15.    
    ; I6 @# X* q& u# A
  16.     On Error Resume Next5 C/ {$ M0 b  V
  17.    
    " _4 \0 s* d1 ~# I  R
  18.     BlockName = Right(Name, Len(Name) - InStrRev(Name, ""))
    9 P; m% ?! r1 G
  19.     BlockName = Left(BlockName, InStrRev(BlockName, ".") - 1)
    / l; X, G. W! H* e
  20.     , H7 E% N+ H! Q  D' j- H. {5 p: U
  21.     Set InsertBlock = Block.InsertBlock(InsertionPoint, BlockName, Xscale, Yscale, Zscale, Rotation)
    3 F+ U8 y; N+ s
  22.     " u& o3 m. B5 ?0 ?6 s: c
  23.     If Err Then' S# B! ~& U" F
  24.         D.Open Name
    " Z6 q, m- Z* D. S  P0 ?$ R
  25.         If D.ModelSpace.Count > 0 Then
    6 x: u9 i+ J6 ?% W: V4 m# k  a0 ]
  26.             ReDim E(D.ModelSpace.Count - 1)
    . ], f$ }; e' s. B, Q
  27.             For I = 0 To D.ModelSpace.Count - 11 t2 `7 ^1 W; Q
  28.                 Set E(I) = D.ModelSpace.Item(I)( Z+ U8 z. p  B$ q) ~- ]
  29.             Next% m, T8 W5 R, J$ \0 F3 t
  30.             Set B = Block.Document.Blocks.Add(P, BlockName)
    ) R- x; N6 h5 e* y0 ]2 l6 G
  31.             D.CopyObjects E, B
    * ]' B  O8 |6 q
  32.         End If
    , }3 I! W2 P2 {0 Q& A! S
  33.         Set InsertBlock = Block.InsertBlock(InsertionPoint, BlockName, Xscale, Yscale, Zscale, Rotation)( S( I' l# n6 j9 v% W
  34.     End If- R4 c! I0 V6 e' I
  35. End Function
    & Q% n+ Q, Z  b* M
复制代码
 楼主| 发表于 2011-8-6 23:47:08 | 显示全部楼层 来自: 中国浙江杭州
斑竹老兄,你太强了,对你的崇拜犹如滔滔江水延绵不绝啊
 楼主| 发表于 2011-8-8 09:20:51 | 显示全部楼层 来自: 中国浙江杭州
数据类型AxDbDocument有提示说用户定义类型未定义
4 E% a0 ^( [: f! r( m0 `7 P
* J8 f. K- b1 Y7 J  H- ]是不是也要引用ObjectDbx 类库?
, \8 x+ s/ \+ h# [+ M) A' D
% J( n+ {6 v: a# S4 R4 g6 l2 s还有如何引用ObjectDbx 类库?我在引用列表里没有找到
 楼主| 发表于 2011-8-8 09:31:39 | 显示全部楼层 来自: 中国浙江杭州
通过在开发人员帮助中搜索ObjectDbx找到了8 t9 o. h- _7 s0 c% ]9 g3 M
; Z" n5 w3 `5 s
谢谢斑竹
 楼主| 发表于 2011-8-8 16:33:15 | 显示全部楼层 来自: 中国浙江杭州
在引用类库的过程中出现问题
  f0 z2 y7 k3 z  G) oCAD2006对应的类库版本号为16.0
( N7 e* b; \- @4 `$ n3 ^5 M1 lCAD2008对应的类库版本号为17.0
. I: p, I8 z3 M  O. ECAD2010对应的类库版本号为18.05 ?0 l- Z( I! A! l

! V; N5 p: ?) w0 L4 F$ T( r本来应该在低版本CAD中引用低版本类库,然后在高版本CAD中应该自动继承为高版本类库
7 @; y; x8 s. s: D) g) U7 T
0 ]; I5 ^+ ~7 K可实际上并不会自动向前继承
* u! V* H, ^: s1 a2 w' W
8 g' k8 n' I  m& Q请问此问题有没有办法解决呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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