QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 woaishuijia 于 2010-9-1 20:17 编辑 6 G8 R+ ^+ h' S* o( X: J/ [

+ b: c, {' q+ ~, R9 V6 @3 g+ q各位大侠,帮小弟看看这段代码是哪里出问题的。我是参考着书上写的
- k" I% U# ]: {9 ^3 G8 _
  1. '查找块
    8 s3 o- l! h9 d, c1 u$ e
  2. Public Sub FindBlock()7 X" O$ A: f  }. V
  3. " K. @8 y8 n5 |9 m3 i/ p# i
  4. Dim Objblock As AcadBlockReference  N+ n- p# T) @$ Q  H

  5. 9 n/ l6 Q+ U; w- L5 f% x
  6. For Each Objblock In ThisDrawing.ModelSpace     '这句话出错了,说是错误13,类型不匹配9 N! j  K& I, ]' f" ^
  7.    If StrComp(Objblock.Name, "属性块") = 0 Then( J, u- G3 b% w
  8.      MsgBox "存在!"% |; t( g: Q" ?
  9.   Else
    1 H; u+ S2 p7 o) W7 m! e
  10.      MsgBox "不存在!"
    8 {: I1 ~/ Q  w3 `8 J- o
  11.   End If
    : k7 |/ [  v9 V. b: l2 D
  12. Next Objblock& T4 |$ j" W  w' F9 N; `! S
  13. ; }2 q1 ?2 ?* k; l( l8 S/ m
  14. End Sub
复制代码
发表于 2010-9-1 20:47:27 | 显示全部楼层 来自: 中国辽宁
参考下面代码

  1. 8 F' G1 D7 R3 |- O1 ^8 g
  2. Sub A()8 J" B3 ?1 B9 Z! i$ t
  3.     Dim E As AcadEntity, BR As AcadBlockReference, B As Boolean
    * D' G% P, \1 B8 Y9 i8 T" I6 Z
  4.     For Each E In ThisDrawing.ModelSpace# M1 p: r/ w7 S; C, e
  5.         If E.ObjectName = "AcDbBlockReference" Then
    ! s. B  K7 [  `  A! [0 S
  6.             Set BR = E! h* a1 I- d& n- O4 i, e( t
  7.             If BR.Name = "属性块" Then3 A& `6 Z, i% U$ P* L
  8.                 B = True
    + k  i" f0 Z4 c% F/ B
  9.                 Exit For9 J. E: u1 W" c* X2 W+ ?) ~
  10.             End If. G" t: m5 L6 z8 i8 F
  11.         End If
    - R: L) o0 C. \$ q( P! V' f: P
  12.     Next. l# w# R  G& c( v
  13.     If B Then1 D$ @7 R; ^" _% z) u
  14.         MsgBox "存在"
    $ ~5 P5 W! `2 R* Q' a& Y" f
  15.     Else
    - W+ f; C0 \0 \6 J8 }
  16.         MsgBox "不存在"- E$ a7 p0 r+ d8 f  X
  17.     End If
    ( W+ \- V4 G" C5 ^2 D$ h1 B
  18. End Sub
    7 ?. N8 ^1 |% v
复制代码
"For Each XX In ThisDrawing.ModelSpace....Next"是循环遍历模型空间所有图元对象,而你的循环变量声明为块参照对象.假如模型空间只有块参照一种对象,那你的代码就不会出错.如果模型空间中存在多种图元对象,那当然会出现"类型不匹配"错误了.所以,遍历模型空间要使用"AcadEntity"型变量或者"Object"甚至是"Variant".
- a& t* g! F: j" g( E上面的代码中用"AcadEntity"型变量做循环变量遍历模型空间,检查每个图元的"ObjectName"属性,当发现"AcDbBlockReference"(块参照)图元时,再进一步检查是否是所要查找的块参照.
发表于 2010-9-1 21:07:20 | 显示全部楼层 来自: 中国辽宁
有个问题:你是要查找名为"属性块"的块参照,还是要查找带有属性的块参照?
( F* }6 j5 @0 F  P4 L如果是前者,上面的代码就可以了.如果是后者,要用下面的代码
  1. ' N( c' _! U7 x6 ~
  2. Sub A()( [' ^& f2 B8 \" ?/ ~* F
  3.     Dim E As AcadEntity, BR As AcadBlockReference, B As Boolean, Atts As Variant) t7 G/ M0 J$ g  f4 ^3 y* H( v5 P
  4.     For Each E In ThisDrawing.ModelSpace2 u3 ]  {% e: r0 f
  5.         If E.ObjectName = "AcDbBlockReference" Then+ d4 A" `: p, A; T, |# g. N
  6.             Set BR = E8 k! x" R3 V9 Q9 `
  7.             Atts = BR.GetAttributes8 W$ h6 T7 ?+ P
  8.             If UBound(Atts) >= 0 Then' s1 o7 m  ^0 a; N
  9.                 B = True
    ; {( l5 t6 G- e0 d0 f0 X9 `
  10.                 Exit For; Z5 h1 k6 k7 d6 Z  F8 \, U
  11.             End If! B. v# D8 k# x9 \3 p
  12.         End If5 }4 v# [2 }, c5 }& {
  13.     Next
    2 ^, o1 y  D& B0 }3 e
  14.     If B Then* i8 x4 w3 ~/ l! Q0 \; w+ Q
  15.         MsgBox "存在"
    ; R4 Y2 l# t- m& ]: o
  16.     Else* P' G; }+ o8 u4 a
  17.         MsgBox "不存在"
    7 ~+ E' Q1 i, u7 j( N/ D, e2 j
  18.     End If
    ) N7 a9 S+ _& c6 ]) o2 V
  19. End Sub7 D' i$ O  R3 m9 d
复制代码
先声明一个变体变量,用块参照对象的"GetAttributes"方法获得块参照对象的属性数组并存放在这个变体变量中,再检查这个数组的下标,如果是-1则说明数组为空,该块参照对象没有属性;如果数组下标大于或等于0,则说明该块参照有属性.
 楼主| 发表于 2010-9-2 09:15:41 | 显示全部楼层 来自: 德国
3# woaishuijia
1 \; N! f5 O$ D1 y) v
2 I( Z. D/ \# P  p1 ]5 |我是想查找名字为“属性块”的块。谢谢老大的支持,小弟感激万分。
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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