QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 157787698 于 2011-8-5 12:11 编辑 : c3 f" `8 T1 _5 w
7 `+ E8 v, a! j' c
用insertblock向图纸中插入块,代码如下:7 q' c7 H% c) B/ s% f! M, R

  1. / C3 B: }8 q/ K3 Z' k9 Y3 H
  2.     Dim insertionPnt(0 To 2) As Double4 K3 ?) U5 i8 a& L& n
  3.     Dim blockRefObj As AcadBlockReference) }8 m9 B( k! j  ^* N+ k
  4.     insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 0
    & w: G7 o7 n) f! ]
  5.     Set blockRefObj = ThisDrawing.ModelSpace.InsertBlock(insertionPnt, "d:\drawing8.dwg", 1#, 1#, 1#, 0)
    . d- Z) M. L0 B0 ^# ~- m) `$ G
  6.     ZoomAll
    ) B8 S9 ?  Y  i9 r- }
复制代码

$ ]; Z/ z+ q# {% E' A' f6 ~: i* Z+ T% V! a: V" K) B* V+ v- ]
在CAD2006中没有问题,但是一旦拿到CAD2010中就有问题:5 e$ w& X- {% K7 s
当在第一次使用的图纸中重复使用时,没有问题;
: |" c/ m4 `! B4 H% S但是一旦关掉第一次使用的那张图纸,在新建的图纸中使用的时候就会跳错,提示如下:
1 \5 n- K9 w: h6 b( x" D# r. q  b8 K8 Z7 o! a" \% u5 T
请大虾们帮助解决,或提供其他思路,非常感谢。
未命名.JPG

Drawing8.dwg

47.01 KB, 下载次数: 10

 楼主| 发表于 2011-8-5 10:13:26 | 显示全部楼层
其实图纸内容是神马都无所谓的,一样会跳错
 楼主| 发表于 2011-8-5 10:17:53 | 显示全部楼层
难道是因为CAD2010中的thisdrawing需要重新激活?
1 i; Z% D. _- `
. V# i1 }) ^' q! d& n但为神马其他方法方法没有问题?只发现了insertblock有问题
发表于 2011-8-6 06:51:03 | 显示全部楼层
貌似这是 ACAD 高版本 ActiveX 的一个BUG,到目前为止我们似乎还只能绕开它. 7 ]: [- }* D( ~& J$ b
可用的方法大体上有下面几种:
# b6 f$ ^! Q# }8 g一.使用 Document 对象的 SendCommand 方法
. E# i! r; i+ z+ J9 g% N

  1. $ y- J9 E3 S( F, k( r; l. q
  2. ThisDrawing.SendCommand "-insert d:\drawing8.dwg" & vbCr & "2,2,0 1 1 0 " 5 V1 J! A, h* H5 t  r$ b0 o5 V
复制代码
* k; o2 ?' q* S; w( [! H* H+ j
二.首先创建一个用于过渡(中间?辅助?)的新文档,并做为全局变量,用 InsertBlock 方法插入外部块参照.当其它文档需要插入该外部块参照时,从这个过渡(中间?辅助?)文档中拷贝过来,而不再使用 InsertBlock 方法8 J0 W8 i  J+ d! A! {1 y0 n
下面两段代码中都引用了 ObjectDbx 类库,目的是在后台运行这个过渡(中间?辅助?)文档,以免它在前台添乱.运行下面两段代码前应引用 ObjectDbx 类库1 Q- h1 W* V7 A( s& }8 ~  O
  1. * }/ e( j" j; s6 h6 s! Q" w
  2. Dim AxDbDoc As New AxDbDocument, Objs(0) As AcadBlockReference, Inserted As Boolean
    7 x% a  A, b# T( ~
  3.    
    9 h) ^! ~! @& ?! Y+ w5 r( T8 ^
  4. Sub Sub1()
    3 k0 n2 u# ]( Q6 r! o
  5.     Dim insertionPnt(0 To 2) As Double" z" c/ @$ |% L# k8 u
  6.     Dim blockRefObj As AcadBlockReference
    ; B2 J1 J  l5 m! S& h2 N7 e
  7.     Dim V As Variant, P(2) As Double
    ; u! I- E1 F) E' l: E0 E/ L
  8.     ( C) w- O! R: I9 f/ P& ^
  9.     If Not Inserted Then4 F6 e/ O5 ~% |/ k. {3 s: `; Q, g
  10.         Set Objs(0) = AxDbDoc.ModelSpace.InsertBlock(P, "d:\drawing8.dwg", 1, 1, 1, 0)1 Z" q. I3 m% \$ E
  11.         Inserted = True2 |; m) _$ p0 ~$ z" {1 q2 ?
  12.     End If# b6 _. d5 U3 P' z% J* g3 g
  13.     2 }* G4 u- E/ {% C& z
  14.     V = AxDbDoc.CopyObjects(Objs, ThisDrawing.ModelSpace); |* p9 M+ E+ G& J6 |. S4 m
  15.     Set blockRefObj = V(0)
    6 Q* a; B* V7 d* c4 v* |: y8 o
  16.     insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 0. v; o7 \, D1 W0 y7 m
  17.     blockRefObj.Move P, insertionPnt3 i$ @% e) _6 j! M; P5 l5 b& U4 G
  18.    
    ' g8 n: G6 S& ?" X) O7 B+ J: A
  19.     ZoomAll
    + \$ I3 k1 c2 W9 O
  20. End Sub
    / u5 W# P: M4 q! I" z2 A
复制代码

; m3 P& t9 }( X( Z5 [+ O7 Z' Z三.自己编写一段插入外部块的函数,代替 InsertBlock 方法插入外部块0 @! M" X! A1 B4 P# R- y+ }9 g
  1. 8 G/ M# Y/ ]' }# L9 `! F
  2. Sub Sub2()5 y% k/ s6 g7 s& y/ l, n
  3.     Dim insertionPnt(0 To 2) As Double1 w' t- I% D  u: {- [& I
  4.     Dim blockRefObj As AcadBlockReference# [9 P+ B8 F( h  g/ m$ a% G' p
  5.     insertionPnt(0) = 2#: insertionPnt(1) = 2#: insertionPnt(2) = 0
    6 o$ h+ ^7 E0 T3 o
  6.     Set blockRefObj = InsertBlock(ThisDrawing.ModelSpace, insertionPnt, "d:\drawing8.dwg", 1#, 1#, 1#, 0); _0 J' G: B$ Z1 w
  7.     ZoomAll
    . [9 I) f: U& z6 G$ D
  8. End Sub% y) g+ A0 j( t6 v! K( f. n5 C$ l
  9.   e- d' A8 m6 u3 q9 P
  10. Private Function InsertBlock(ByVal Block As AcadBlock, ByVal InsertionPoint As Variant, _
    2 J, @7 [+ [; T% Q# {
  11. ByVal Name As String, ByVal Xscale As Double, ByVal Yscale As Double, ByVal Zscale As Double, _
    ) d9 A( \- f8 f' h2 c) D
  12. ByVal Rotation As Double) As AcadBlockReference$ o. Q# h" N  k9 q' Z
  13.     Dim BlockName As String/ g  q) y$ d3 v# H+ n9 I
  14.     Dim D As New AxDbDocument, E() As AcadEntity, I As Integer, B As AcadBlock, P(2) As Double
    0 ?# a1 x9 u# |1 f3 v; o
  15.     6 |  Y  e  n  X* [
  16.     On Error Resume Next
    + k5 u1 S) r( }! N* t$ E9 u' c
  17.       O' u7 n9 p! v7 `5 H
  18.     BlockName = Right(Name, Len(Name) - InStrRev(Name, ""))
    + ]( e8 N2 |1 [  q: o( @! t1 m# w* W
  19.     BlockName = Left(BlockName, InStrRev(BlockName, ".") - 1)
    9 P, G0 i: b# c
  20.     8 H- e9 C/ }7 \" D2 {  h8 z9 g+ b
  21.     Set InsertBlock = Block.InsertBlock(InsertionPoint, BlockName, Xscale, Yscale, Zscale, Rotation)
    1 l) S8 y, _' f4 `9 ^$ {- `# v; _2 A
  22.    
    1 y+ }' T, ~% X- @$ V; I1 ~  A
  23.     If Err Then5 D2 d* p2 @. Z4 V/ O2 T* H
  24.         D.Open Name
    & g+ N$ |: D2 G) r! \/ _5 ~
  25.         If D.ModelSpace.Count > 0 Then$ Q% v# k$ j6 f% q3 X" O
  26.             ReDim E(D.ModelSpace.Count - 1)' `% O/ Y. d. e4 b3 z  |- \4 @
  27.             For I = 0 To D.ModelSpace.Count - 1
    7 }! F# w/ U$ m3 Z2 u- r2 J/ C
  28.                 Set E(I) = D.ModelSpace.Item(I)
    $ p- P8 T+ W( _1 c- w$ n' c" m* \
  29.             Next
    4 Z/ q9 K. |" l# m# \) M
  30.             Set B = Block.Document.Blocks.Add(P, BlockName)
    % @1 E2 B& ~) W1 w$ B8 [( O
  31.             D.CopyObjects E, B
    % Q1 l& Y$ ?5 M; V: b
  32.         End If
    0 u* o# R  X1 k/ i
  33.         Set InsertBlock = Block.InsertBlock(InsertionPoint, BlockName, Xscale, Yscale, Zscale, Rotation)4 `9 R0 U) Q' ?0 r
  34.     End If
    * }$ S4 Q- K0 M: V5 Y
  35. End Function2 B( x+ Z. n: o
复制代码
 楼主| 发表于 2011-8-6 23:47:08 | 显示全部楼层
斑竹老兄,你太强了,对你的崇拜犹如滔滔江水延绵不绝啊
 楼主| 发表于 2011-8-8 09:20:51 | 显示全部楼层
数据类型AxDbDocument有提示说用户定义类型未定义
! X0 s% ^/ X& d* l0 z$ z5 e) A2 B5 A* \- E  {
是不是也要引用ObjectDbx 类库?
! I6 R0 k- o, Z3 \& y; E1 |, e. z; w; L
还有如何引用ObjectDbx 类库?我在引用列表里没有找到
 楼主| 发表于 2011-8-8 09:31:39 | 显示全部楼层
通过在开发人员帮助中搜索ObjectDbx找到了2 C2 U6 `: ~3 m1 i# _
6 Q  }4 E% x. F7 w* x7 s" Y
谢谢斑竹
 楼主| 发表于 2011-8-8 16:33:15 | 显示全部楼层
在引用类库的过程中出现问题
, ?) W( \/ _1 SCAD2006对应的类库版本号为16.0" J5 Z5 T4 f, h5 K
CAD2008对应的类库版本号为17.0
3 m* s# F4 k! ?/ v4 f% bCAD2010对应的类库版本号为18.0
8 ^! l) t+ ?& N0 K; }
; {& u7 K( Q2 a9 Y) Y5 U本来应该在低版本CAD中引用低版本类库,然后在高版本CAD中应该自动继承为高版本类库7 s$ n) g" P, b

) W* O/ J5 G5 j( b& C) f+ {' y% W可实际上并不会自动向前继承
8 a0 r. U$ X1 p) h: K- j) ^5 m% G/ H' \# Y( p. \. }
请问此问题有没有办法解决呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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