QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

查看: 3415|回复: 3
收起左侧

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

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

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

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

x
本帖最后由 woaishuijia 于 2010-9-1 20:17 编辑 0 t5 \' ~5 ~& a3 e0 f3 h  ~
! k: Y3 A/ C( ^+ Y3 {
各位大侠,帮小弟看看这段代码是哪里出问题的。我是参考着书上写的5 X* k- d# j! N; ]; R2 s. Y% X
  1. '查找块* s" _; P# q. R; j; n/ L1 P4 n
  2. Public Sub FindBlock()
    1 b) b3 Y9 i6 }+ d$ H3 ]

  3. : l' I  O; m/ B# e# V
  4. Dim Objblock As AcadBlockReference' c/ {; C  B1 q7 V: N. L
  5. + d  Y7 O7 {  E& O+ s
  6. For Each Objblock In ThisDrawing.ModelSpace     '这句话出错了,说是错误13,类型不匹配
    & F3 u* Y- Z# C8 l& w) b; \
  7.    If StrComp(Objblock.Name, "属性块") = 0 Then5 E, P. B  G# ~- j/ C
  8.      MsgBox "存在!"! L& M% U% ~# J
  9.   Else
    ; M6 y" [8 H. J
  10.      MsgBox "不存在!"
    & f4 G% B, B( U+ f
  11.   End If
    2 w* K" x9 ~  @5 C; Z7 I5 t
  12. Next Objblock; f  R5 r8 N! _7 g. ?

  13. * u6 U2 I8 k/ ~& D4 _2 T
  14. End Sub
复制代码
发表于 2010-9-1 20:47:27 | 显示全部楼层 来自: 中国辽宁
参考下面代码
  1. 8 X9 U1 I8 T1 d% }1 Q1 L
  2. Sub A()% K- D2 F4 [8 t2 m7 O1 [
  3.     Dim E As AcadEntity, BR As AcadBlockReference, B As Boolean
    , f6 \! F# y1 n3 Z
  4.     For Each E In ThisDrawing.ModelSpace
    ; J& z) v. l! Q3 n
  5.         If E.ObjectName = "AcDbBlockReference" Then
    . T1 {. M0 l! D. [
  6.             Set BR = E9 G" S3 G. t# @7 b6 q
  7.             If BR.Name = "属性块" Then
    . @7 i8 U- s0 v
  8.                 B = True
    / r. d$ k. `+ E' v! L7 C- Q
  9.                 Exit For
    , B  Y* @  t) {0 Q, B
  10.             End If
    6 b  F: i: @/ v* a" X+ g, p
  11.         End If
    8 j/ P# S0 e% ?% C
  12.     Next! Q% J1 e: G5 v
  13.     If B Then' w* J6 O% k0 Q' b5 u) a
  14.         MsgBox "存在"
    + o' ~6 X2 K7 F4 Q9 w+ g& w
  15.     Else& _) b! T) m* R, [. S- E7 Y
  16.         MsgBox "不存在"9 H$ [8 r6 X" M  |1 h; F
  17.     End If( T& z) d4 V2 O/ j7 L
  18. End Sub
    9 \1 r* @( [9 u
复制代码
"For Each XX In ThisDrawing.ModelSpace....Next"是循环遍历模型空间所有图元对象,而你的循环变量声明为块参照对象.假如模型空间只有块参照一种对象,那你的代码就不会出错.如果模型空间中存在多种图元对象,那当然会出现"类型不匹配"错误了.所以,遍历模型空间要使用"AcadEntity"型变量或者"Object"甚至是"Variant".
  z) Z. ]) G; x1 T0 D上面的代码中用"AcadEntity"型变量做循环变量遍历模型空间,检查每个图元的"ObjectName"属性,当发现"AcDbBlockReference"(块参照)图元时,再进一步检查是否是所要查找的块参照.
发表于 2010-9-1 21:07:20 | 显示全部楼层 来自: 中国辽宁
有个问题:你是要查找名为"属性块"的块参照,还是要查找带有属性的块参照?2 M( ~2 u. s( E& {$ u0 |$ y
如果是前者,上面的代码就可以了.如果是后者,要用下面的代码
  1. ) y0 L' {5 [7 ~1 i2 ]
  2. Sub A(); F6 e9 T& x# f7 ]1 F, \
  3.     Dim E As AcadEntity, BR As AcadBlockReference, B As Boolean, Atts As Variant
    " p. y7 J* E1 u$ G+ l# J  l
  4.     For Each E In ThisDrawing.ModelSpace. j. e( A% N; O9 A# F
  5.         If E.ObjectName = "AcDbBlockReference" Then# B9 H. X4 S# @$ L
  6.             Set BR = E% M1 |. R* ?8 [9 c6 X2 g4 L
  7.             Atts = BR.GetAttributes% R6 ?' ]; Y% b
  8.             If UBound(Atts) >= 0 Then! k: h4 |$ N% K! H9 e
  9.                 B = True/ R9 G6 y! b2 t: x$ C1 Z
  10.                 Exit For9 ]8 K2 q% v+ b
  11.             End If: M+ k% P# T5 L. H, E6 a" \
  12.         End If& m$ ^1 ^, l2 L9 [! }
  13.     Next; O- T1 f4 I) d) J5 k$ z5 ^6 k! b
  14.     If B Then) e; R! Z' M6 C$ j! e
  15.         MsgBox "存在"
    . t, M8 u: w7 @+ R1 K
  16.     Else6 L" j( N/ U3 J1 p3 r6 l% j
  17.         MsgBox "不存在"
      c, t4 z, b2 d2 O+ T
  18.     End If; c- V, F$ A4 e7 a1 m
  19. End Sub
    * _) V$ ?9 r  y0 T3 T
复制代码
先声明一个变体变量,用块参照对象的"GetAttributes"方法获得块参照对象的属性数组并存放在这个变体变量中,再检查这个数组的下标,如果是-1则说明数组为空,该块参照对象没有属性;如果数组下标大于或等于0,则说明该块参照有属性.
 楼主| 发表于 2010-9-2 09:15:41 | 显示全部楼层 来自: 德国
3# woaishuijia 4 I( R# O1 s7 \3 G# ?2 A
: m- }$ w1 L$ N, K5 j6 p
我是想查找名字为“属性块”的块。谢谢老大的支持,小弟感激万分。
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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