QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
9天前
查看: 3339|回复: 3
收起左侧

[已答复] VBA 查找属性块代码是这么写的吗?

[复制链接]
发表于 2010-9-1 19:07:40 | 显示全部楼层 |阅读模式 来自: 中国北京

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

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

x
本帖最后由 woaishuijia 于 2010-9-1 20:17 编辑
) I( b2 X2 t6 R& j8 x3 S. ~8 K3 ?5 S) s
各位大侠,帮小弟看看这段代码是哪里出问题的。我是参考着书上写的: p8 _$ a) C$ u$ _6 V" o: W, s  ~
  1. '查找块
    " F4 f1 P& c6 N0 d) {; z
  2. Public Sub FindBlock()9 f5 ^6 y5 R( v1 N  M6 E6 P% Z
  3. 1 N% y" R( V5 B  L: I) j9 b
  4. Dim Objblock As AcadBlockReference
    0 _7 W: Y! C$ M2 e/ |( h

  5. 7 G) p4 S- D4 S0 ^' y+ }
  6. For Each Objblock In ThisDrawing.ModelSpace     '这句话出错了,说是错误13,类型不匹配
    ) z9 J, }' f& P1 M0 d* {( |2 h
  7.    If StrComp(Objblock.Name, "属性块") = 0 Then
    : {0 K: K! i* `
  8.      MsgBox "存在!"
    . o0 Z1 y3 ]! O- T* i3 D
  9.   Else$ m  ?% `% `/ V* w  ~9 @/ J3 q
  10.      MsgBox "不存在!"; L8 U4 o5 x$ c& |1 W" C6 b
  11.   End If
    % e: j4 `% C% t2 A% i) h
  12. Next Objblock
    $ a) d) L/ {+ d+ x: ^8 H; b1 F
  13. , k7 n- n# @% d* }9 L
  14. End Sub
复制代码
发表于 2010-9-1 20:47:27 | 显示全部楼层 来自: 中国辽宁
参考下面代码
  1. 5 p3 {# F7 ^1 T( |& S, `( ^6 D+ R
  2. Sub A()8 {& [" ~. @5 ?% }
  3.     Dim E As AcadEntity, BR As AcadBlockReference, B As Boolean
    - X2 w* w8 F! V* v! K# G8 ]% S
  4.     For Each E In ThisDrawing.ModelSpace
    . A- D& g" J' y- R0 j& s
  5.         If E.ObjectName = "AcDbBlockReference" Then
    , r, n$ Z7 x: X. F7 g: l
  6.             Set BR = E
    1 L. U$ T# z% B8 i
  7.             If BR.Name = "属性块" Then
    * @3 j. s  K2 s/ ~- A
  8.                 B = True
    * ^3 r5 ?6 P) d' U$ J. `
  9.                 Exit For
    8 `% ?8 `1 _( w0 N
  10.             End If
    + i  O6 F4 ]$ b
  11.         End If5 [0 F4 i. C0 z2 m! a: t
  12.     Next0 u. \5 ?$ h# K0 f
  13.     If B Then
    ( Z! _* r9 h& T5 Y+ ~& G6 q7 I
  14.         MsgBox "存在"
    . v0 W! W2 L$ \; ^. i
  15.     Else7 |% X6 v( l) r) S
  16.         MsgBox "不存在"
    / K7 E9 G4 j* G" g  z
  17.     End If& X2 O! D$ C: }
  18. End Sub
    3 H! W& L3 g' Y$ ]
复制代码
"For Each XX In ThisDrawing.ModelSpace....Next"是循环遍历模型空间所有图元对象,而你的循环变量声明为块参照对象.假如模型空间只有块参照一种对象,那你的代码就不会出错.如果模型空间中存在多种图元对象,那当然会出现"类型不匹配"错误了.所以,遍历模型空间要使用"AcadEntity"型变量或者"Object"甚至是"Variant"., c/ B9 Q+ x8 `, s* \# m+ i, O5 J: e
上面的代码中用"AcadEntity"型变量做循环变量遍历模型空间,检查每个图元的"ObjectName"属性,当发现"AcDbBlockReference"(块参照)图元时,再进一步检查是否是所要查找的块参照.
发表于 2010-9-1 21:07:20 | 显示全部楼层 来自: 中国辽宁
有个问题:你是要查找名为"属性块"的块参照,还是要查找带有属性的块参照?
3 F. M* s# Y% |' i4 \* i- X如果是前者,上面的代码就可以了.如果是后者,要用下面的代码

  1. 0 J" S& k4 F/ i; `4 P8 N
  2. Sub A()
    & H, `% W& ~& Y5 |. s
  3.     Dim E As AcadEntity, BR As AcadBlockReference, B As Boolean, Atts As Variant7 u; r, X+ w* q  y& N
  4.     For Each E In ThisDrawing.ModelSpace, A$ `8 {$ ]  I
  5.         If E.ObjectName = "AcDbBlockReference" Then
    5 j2 Z! l+ d& ~* a- E5 V: P% j
  6.             Set BR = E
    , K' W% J# W2 ^  J, f/ Z
  7.             Atts = BR.GetAttributes4 d9 o' p3 N2 X4 u2 J: O. ?
  8.             If UBound(Atts) >= 0 Then
    9 R- ^/ y# q' Y7 U; _. ^" I* T
  9.                 B = True
    " y% A6 ]7 V/ f3 Y
  10.                 Exit For! L; o+ H0 o2 U9 P
  11.             End If- {: h6 i5 D4 n
  12.         End If, x/ H: Y2 h; ^2 A$ I' s
  13.     Next- A3 e3 `  y2 J, ^5 U$ V
  14.     If B Then
    * z4 {! ~& I" \* ~4 ~( V# `
  15.         MsgBox "存在": W! r# g. W; L8 h* g
  16.     Else' T' A$ ?4 @% s5 K+ c
  17.         MsgBox "不存在"
    3 j5 A  t' A6 `6 x0 g0 L. _2 g" ]
  18.     End If2 n, `& f3 d  Z
  19. End Sub
    ) @( a- a( J6 q, v; c
复制代码
先声明一个变体变量,用块参照对象的"GetAttributes"方法获得块参照对象的属性数组并存放在这个变体变量中,再检查这个数组的下标,如果是-1则说明数组为空,该块参照对象没有属性;如果数组下标大于或等于0,则说明该块参照有属性.
 楼主| 发表于 2010-9-2 09:15:41 | 显示全部楼层 来自: 德国
3# woaishuijia
# D: T* S' _& r- v+ B
$ @8 S1 L. M% C8 N% f- I3 N, r我是想查找名字为“属性块”的块。谢谢老大的支持,小弟感激万分。
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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