QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
14小时前
查看: 3310|回复: 3
收起左侧

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

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

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

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

x
本帖最后由 woaishuijia 于 2010-9-1 20:17 编辑
' A& u% X: b$ p
4 n( L* T* q$ L0 t9 b0 i各位大侠,帮小弟看看这段代码是哪里出问题的。我是参考着书上写的/ F: H1 h( D4 ^0 q+ Z) R# c( D
  1. '查找块6 g2 h1 y, ~; o; w0 \4 i" T
  2. Public Sub FindBlock()5 W3 G" `' e8 I$ D8 o

  3. . S% x- V, ?+ Q0 d; P1 O
  4. Dim Objblock As AcadBlockReference8 k2 t! p/ C% S4 n

  5. - y# i6 a4 i  T  Z5 ?
  6. For Each Objblock In ThisDrawing.ModelSpace     '这句话出错了,说是错误13,类型不匹配6 @: e8 ^  ^$ w3 O  H. B0 k
  7.    If StrComp(Objblock.Name, "属性块") = 0 Then: ?. D  t4 Y  e) ~, c6 C4 Q! V
  8.      MsgBox "存在!"
      j) i' @5 G" K: \* w
  9.   Else
    + j' e6 X$ r. q- i9 I! R5 b; b
  10.      MsgBox "不存在!". a3 d" k) B- r* G* n# O
  11.   End If
    , J1 s$ n* e, f+ L3 ?( H. V+ Z+ b
  12. Next Objblock
    4 ^) n; {' a, y0 n

  13. 8 J# T2 Z( l  I5 H2 V% M
  14. End Sub
复制代码
发表于 2010-9-1 20:47:27 | 显示全部楼层 来自: 中国辽宁
参考下面代码
  1. # j. d' n  B: l* o/ U0 t
  2. Sub A()- ]' n& g& B2 `! F9 ]$ i' V
  3.     Dim E As AcadEntity, BR As AcadBlockReference, B As Boolean0 X& I) u. T+ U" U, ?+ b
  4.     For Each E In ThisDrawing.ModelSpace
    * w* l, J" B8 z' \
  5.         If E.ObjectName = "AcDbBlockReference" Then
    : n' ^, y& H9 Y! Y, E( Y0 ~5 ]1 R! `
  6.             Set BR = E
      ~  k' O$ c7 e$ r  B
  7.             If BR.Name = "属性块" Then
    ) e3 o# _! w6 ?+ Q0 F2 w2 W
  8.                 B = True, o, S9 [$ ~9 d1 m$ }% b& M" a
  9.                 Exit For
    : R- m6 h: U$ k
  10.             End If3 h. o4 U* ]) A1 r) P
  11.         End If
    1 N! M) |9 x; \
  12.     Next
    " B: W! K! u& H9 V. u. l9 I: J
  13.     If B Then, U" ^7 ^2 \- T$ K. m4 s3 S  f. h
  14.         MsgBox "存在"- q( ]! G0 I# B
  15.     Else, ~$ C) ~! c. _7 M( ^! v( K% `
  16.         MsgBox "不存在"
    % g) U2 a' c- h4 K- F+ c2 G
  17.     End If( h8 v' j8 D3 G6 R  Y
  18. End Sub
    ! Q$ `! x7 L$ o# e
复制代码
"For Each XX In ThisDrawing.ModelSpace....Next"是循环遍历模型空间所有图元对象,而你的循环变量声明为块参照对象.假如模型空间只有块参照一种对象,那你的代码就不会出错.如果模型空间中存在多种图元对象,那当然会出现"类型不匹配"错误了.所以,遍历模型空间要使用"AcadEntity"型变量或者"Object"甚至是"Variant".
: h& X9 ~4 p) U: y. A! k5 e9 q$ e1 z上面的代码中用"AcadEntity"型变量做循环变量遍历模型空间,检查每个图元的"ObjectName"属性,当发现"AcDbBlockReference"(块参照)图元时,再进一步检查是否是所要查找的块参照.
发表于 2010-9-1 21:07:20 | 显示全部楼层 来自: 中国辽宁
有个问题:你是要查找名为"属性块"的块参照,还是要查找带有属性的块参照?
$ Q9 I  J( R5 h6 X* F! |0 C/ Q如果是前者,上面的代码就可以了.如果是后者,要用下面的代码

  1. % |( [6 C' c) v0 D  n5 Q* G
  2. Sub A()+ g8 i5 v( k# o. m  j0 G- ~
  3.     Dim E As AcadEntity, BR As AcadBlockReference, B As Boolean, Atts As Variant" j$ x/ Y% d$ T9 ]
  4.     For Each E In ThisDrawing.ModelSpace
    , l0 c4 |7 h/ |
  5.         If E.ObjectName = "AcDbBlockReference" Then. B6 [) U: N! A& D9 e
  6.             Set BR = E0 ^4 u! O2 v1 c/ K7 L! L# `! x
  7.             Atts = BR.GetAttributes
    7 H0 c0 M: {3 E1 Y/ {; C' l& M
  8.             If UBound(Atts) >= 0 Then
    & W" f. u4 k' Y
  9.                 B = True: ^5 C7 z( Y' f9 K6 g( y4 Y% c
  10.                 Exit For
    3 R0 Q5 R8 D2 H! [  `& F- m
  11.             End If" C+ y% p/ P6 a5 y- d) i. @
  12.         End If
    . R0 I- t- A( z* K
  13.     Next
    : Y: u+ W1 I8 ~+ T8 L9 _. U9 y
  14.     If B Then3 {0 ^4 d0 h9 Q  S
  15.         MsgBox "存在"
    7 x5 p( E0 L6 u3 t! |5 @$ b
  16.     Else8 q, F8 L( Y' B7 c8 @1 i4 l
  17.         MsgBox "不存在"
    # |' ]4 V. p% D4 g3 [  D4 l6 b1 v
  18.     End If
    " \% V, `3 `, v: G* V
  19. End Sub- y7 S) Q" s/ {
复制代码
先声明一个变体变量,用块参照对象的"GetAttributes"方法获得块参照对象的属性数组并存放在这个变体变量中,再检查这个数组的下标,如果是-1则说明数组为空,该块参照对象没有属性;如果数组下标大于或等于0,则说明该块参照有属性.
 楼主| 发表于 2010-9-2 09:15:41 | 显示全部楼层 来自: 德国
3# woaishuijia : Q+ G; B0 T, y) Z: q

! A; L  F' @: F% c8 S我是想查找名字为“属性块”的块。谢谢老大的支持,小弟感激万分。
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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