QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
goto3d 说: 此次SW竞赛获奖名单公布如下,抱歉晚了,版主最近太忙:一等奖:塔山817;二等奖:a9041、飞鱼;三等奖:wx_dfA5IKla、xwj960414、bzlgl、hklecon;请以上各位和版主联系,领取奖金!!!
2022-03-11
全站
goto3d 说: 在线网校新上线表哥同事(Mastercam2022)+虞为民版大(inventor2022)的最新课程,来围观吧!
2021-06-26
查看: 4921|回复: 7
收起左侧

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

[复制链接]
发表于 2011-8-5 10:10:56 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 157787698 于 2011-8-5 12:11 编辑 * T0 o! l0 c9 r' ^' t9 J

# w6 \; [8 Z1 j* F用insertblock向图纸中插入块,代码如下:" ]( e; G0 \6 L% v

  1. 2 W5 H, u8 A5 ?' |  U; _( r2 d
  2.     Dim insertionPnt(0 To 2) As Double
    + @' B  A$ I! B3 g/ p. b" w2 z
  3.     Dim blockRefObj As AcadBlockReference' Q/ x1 z2 v: B* r: \3 q
  4.     insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 07 i: B7 O, B4 {2 d2 D3 {, k
  5.     Set blockRefObj = ThisDrawing.ModelSpace.InsertBlock(insertionPnt, "d:\drawing8.dwg", 1#, 1#, 1#, 0)
    - e! ~( e8 @. ], T3 X3 Y' ^" D% k; H/ z& G3 K
  6.     ZoomAll% k' b7 e" ~$ N5 G0 `5 k6 E
复制代码

; P# q7 a" f# w6 N# i0 D* j5 a7 D/ n3 ?4 g4 ?, Z
在CAD2006中没有问题,但是一旦拿到CAD2010中就有问题:/ o% h# W# L5 Y/ p2 C
当在第一次使用的图纸中重复使用时,没有问题;
, O2 f( a' f( x: ^3 @但是一旦关掉第一次使用的那张图纸,在新建的图纸中使用的时候就会跳错,提示如下:% H7 O* v0 }8 _) t7 v" [0 _
$ ^: J+ L( |1 b: ^3 i& |2 g
请大虾们帮助解决,或提供其他思路,非常感谢。
未命名.JPG

Drawing8.dwg

47.01 KB, 下载次数: 10

 楼主| 发表于 2011-8-5 10:13:26 | 显示全部楼层
其实图纸内容是神马都无所谓的,一样会跳错
 楼主| 发表于 2011-8-5 10:17:53 | 显示全部楼层
难道是因为CAD2010中的thisdrawing需要重新激活?
) c, [5 p5 M# B9 k
0 i4 |; ~5 g6 x$ l. o但为神马其他方法方法没有问题?只发现了insertblock有问题
发表于 2011-8-6 06:51:03 | 显示全部楼层
貌似这是 ACAD 高版本 ActiveX 的一个BUG,到目前为止我们似乎还只能绕开它.
3 U: \# H0 A9 m8 i9 H' g可用的方法大体上有下面几种:
/ l5 `% n' O# b! F, _: u" W! |一.使用 Document 对象的 SendCommand 方法( w! X/ k# i$ f9 x  {% G% w

  1. / ]" r0 z' Y; q" {3 `
  2. ThisDrawing.SendCommand "-insert d:\drawing8.dwg" & vbCr & "2,2,0 1 1 0 "
    4 d9 q! i# l: d# P" R# E
复制代码
& {; A; }' r  r6 u" s9 j- k
二.首先创建一个用于过渡(中间?辅助?)的新文档,并做为全局变量,用 InsertBlock 方法插入外部块参照.当其它文档需要插入该外部块参照时,从这个过渡(中间?辅助?)文档中拷贝过来,而不再使用 InsertBlock 方法
; A0 g$ g1 t5 x, O9 \下面两段代码中都引用了 ObjectDbx 类库,目的是在后台运行这个过渡(中间?辅助?)文档,以免它在前台添乱.运行下面两段代码前应引用 ObjectDbx 类库
, _1 y0 ]1 o7 Q3 f

  1. * {* [/ m1 Q  X3 n- ?
  2. Dim AxDbDoc As New AxDbDocument, Objs(0) As AcadBlockReference, Inserted As Boolean' @1 n/ }9 i5 |
  3.     9 M- G8 @' E* m- `
  4. Sub Sub1(), P" j# @( d  ~
  5.     Dim insertionPnt(0 To 2) As Double
    6 W- w: \& @9 }% W. z" l8 t( Y
  6.     Dim blockRefObj As AcadBlockReference
    . M# W! ]  w, G- B
  7.     Dim V As Variant, P(2) As Double* O" F, u3 l. Y8 h1 y6 k) a
  8.     ( F# F3 F# r) U, j
  9.     If Not Inserted Then
    / O- q% S6 y* X- x  Z7 Z
  10.         Set Objs(0) = AxDbDoc.ModelSpace.InsertBlock(P, "d:\drawing8.dwg", 1, 1, 1, 0)% b' Y$ r! r, V2 V3 G% s
  11.         Inserted = True9 q! ?- `0 O. Q' T
  12.     End If6 @) k# ]1 o. a7 s5 V8 ?
  13.    
    6 h% F( n6 t/ i( W# C
  14.     V = AxDbDoc.CopyObjects(Objs, ThisDrawing.ModelSpace)
    : q7 j- i0 Z9 ?: @
  15.     Set blockRefObj = V(0)
    , f, D4 M% Y3 _$ |
  16.     insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 0  ]: d: z* d* }  H$ C
  17.     blockRefObj.Move P, insertionPnt9 t& I; N( C( r, q4 g9 W
  18.    
    / i1 B5 `7 S, S# T  n% y4 E
  19.     ZoomAll
    - U# m; Q8 I; K4 w- u) s/ a3 X; Y
  20. End Sub
    ) A" N% r/ }4 @. c
复制代码
" ^' m8 P& ~: o& G9 F4 K
三.自己编写一段插入外部块的函数,代替 InsertBlock 方法插入外部块
0 r, p4 a2 H$ G3 D

  1. ' `0 C* U, b' U7 c6 x* ^
  2. Sub Sub2()
    $ x) P$ P0 b4 [9 Z6 w7 }
  3.     Dim insertionPnt(0 To 2) As Double
    ) ~1 h/ a6 t5 B  C6 t9 p
  4.     Dim blockRefObj As AcadBlockReference
    ( I6 p% Q" I3 x: N2 |
  5.     insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 0
    $ m/ j0 P: t" O* ]0 u4 S
  6.     Set blockRefObj = InsertBlock(ThisDrawing.ModelSpace, insertionPnt, "d:\drawing8.dwg", 1#, 1#, 1#, 0)
    ) x  _6 v7 @, U$ i3 O! J
  7.     ZoomAll3 \4 F. Y0 J- p& b
  8. End Sub
    ' I, C# q- `2 {. D, F

  9. 9 V) j; b3 q8 s1 n8 j1 g: Q
  10. Private Function InsertBlock(ByVal Block As AcadBlock, ByVal InsertionPoint As Variant, _1 i4 i4 I$ U0 t5 k$ s" }. }% j
  11. ByVal Name As String, ByVal Xscale As Double, ByVal Yscale As Double, ByVal Zscale As Double, _
    8 x  X# x( w' l" x
  12. ByVal Rotation As Double) As AcadBlockReference
    % ^! C# o- W/ x( i/ i
  13.     Dim BlockName As String) K* q( {$ L3 c
  14.     Dim D As New AxDbDocument, E() As AcadEntity, I As Integer, B As AcadBlock, P(2) As Double
    . c# `6 ^* Z1 T' A( K: |/ ^
  15.     8 X6 ]' P8 M9 e9 w  x0 |$ F
  16.     On Error Resume Next
    0 ]7 A: r5 H2 z+ k
  17.    
    . S& k4 p2 Y' V
  18.     BlockName = Right(Name, Len(Name) - InStrRev(Name, ""))
    ) I, ]: z) F  Y" `. ^
  19.     BlockName = Left(BlockName, InStrRev(BlockName, ".") - 1)6 j1 m1 K3 D4 O, z( q
  20.    
    & {0 l! p+ l7 L( f
  21.     Set InsertBlock = Block.InsertBlock(InsertionPoint, BlockName, Xscale, Yscale, Zscale, Rotation)
    8 i% x9 F  I9 t3 T* h
  22.    
    ! B9 W) V, h) `) g1 n
  23.     If Err Then( i0 H* U$ m* J; D
  24.         D.Open Name8 h& G0 K, o8 d7 @/ d7 e0 ~9 Z% o
  25.         If D.ModelSpace.Count > 0 Then
    " {( W) D/ o- _0 d
  26.             ReDim E(D.ModelSpace.Count - 1)
    2 b. R9 A/ k! A& [; h1 w7 G7 o1 i
  27.             For I = 0 To D.ModelSpace.Count - 1
      V4 |% A9 I1 ~; ]% Z. Q' e
  28.                 Set E(I) = D.ModelSpace.Item(I)
    1 |4 c) Q: m( c: l/ g! |! h1 T, A
  29.             Next/ p; m7 ^# U  k; f% c! k* X/ [
  30.             Set B = Block.Document.Blocks.Add(P, BlockName)* N( g( W3 H% a0 {2 U
  31.             D.CopyObjects E, B
    6 e( K: @7 L% y/ V+ Q" ~$ V% l
  32.         End If
    5 q& v+ @* [3 J3 ^" P( T
  33.         Set InsertBlock = Block.InsertBlock(InsertionPoint, BlockName, Xscale, Yscale, Zscale, Rotation)
    % A/ g* K; v/ O/ m
  34.     End If3 z3 H% ^; c0 T/ Q- n' _3 y
  35. End Function" n8 [, V8 |# J: Y
复制代码
 楼主| 发表于 2011-8-6 23:47:08 | 显示全部楼层
斑竹老兄,你太强了,对你的崇拜犹如滔滔江水延绵不绝啊
 楼主| 发表于 2011-8-8 09:20:51 | 显示全部楼层
数据类型AxDbDocument有提示说用户定义类型未定义+ P0 j1 c" z' _( n$ P! C
6 Q$ q& J/ |) K" d% a- C- `$ J! l7 J
是不是也要引用ObjectDbx 类库?
% s- l$ v2 P4 X  Y+ S$ }' y
' g* K2 ?. Y" f  h% u6 D  x还有如何引用ObjectDbx 类库?我在引用列表里没有找到
 楼主| 发表于 2011-8-8 09:31:39 | 显示全部楼层
通过在开发人员帮助中搜索ObjectDbx找到了
+ p3 F5 `. S) D) `% c6 R( J. X9 \! i1 I$ d9 G" {) t
谢谢斑竹
 楼主| 发表于 2011-8-8 16:33:15 | 显示全部楼层
在引用类库的过程中出现问题; }- J& H  J: I) \% g2 ^
CAD2006对应的类库版本号为16.09 D* x+ ]( j) d6 `. S
CAD2008对应的类库版本号为17.0% m5 r! j% j9 w4 ]8 A* X# X9 w+ O
CAD2010对应的类库版本号为18.0. C( t/ `2 ~1 w; a) J
# y" C' \, ?3 ~4 U7 G
本来应该在低版本CAD中引用低版本类库,然后在高版本CAD中应该自动继承为高版本类库
# X. m# U4 g9 r+ d8 U5 c  V3 U
4 P" @4 V4 ^- q7 j3 ?* {可实际上并不会自动向前继承4 o9 L7 d; A! Y6 l$ ]$ {

4 V' V$ }. F# f; d3 O请问此问题有没有办法解决呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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