QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
goto3d 说: 版主微信号:caivin811031;还未入三维微信群的小伙伴,速度加
2022-07-04
全站
goto3d 说: 此次SW竞赛获奖名单公布如下,抱歉晚了,版主最近太忙:一等奖:塔山817;二等奖:a9041、飞鱼;三等奖:wx_dfA5IKla、xwj960414、bzlgl、hklecon;请以上各位和版主联系,领取奖金!!!
2022-03-11
查看: 3188|回复: 7
收起左侧

[已答复] 求助,怎样列举只存在于图形中的块名称?

[复制链接]
发表于 2014-7-4 16:10:36 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 upc1999 于 2014-7-4 16:24 编辑 ' W. [. z2 B  r: Z5 b+ B
$ D7 i  P2 _9 t" S7 @" W* g1 a4 F
我需要筛选特定的块名,比如图框A1,但是如果有插入过又删掉的块,还保留在块列表里,就需要判断这个块是不是在图形中使用。
/ z. U9 }; B* U8 O, M+ E9 X$ x我搜索到的代码都是先历遍实体,再判断是否为块,效率太低,有没有办法先列举块名称,再判断是不是在图行中使用?
8 L# j  g8 z6 t5 a# s6 o! K
5 D8 v/ d  V+ d' RDim entry As AcadEntity, blk1 As AcadBlockReference
/ d/ [% B1 N) w& n$ Y/ k+ }+ a& \5 {
    For Each entry In activeDoc.ModelSpace; K" T8 d  {# j6 ^. W* L& ?" Q
          If entry.ObjectName = "AcDbBlockReference" Then4 H, v$ Z/ v, `  @" Y  m: w
          Set blk1 = entry
; M1 c7 S% w! I. x, I          if blk1.name="块名称" then
) j0 Z$ Y; Z0 |, Q5 x# a% w3 }5 L
……
7 G/ v) O, A4 p   next       # Y& r8 n+ F; N/ H
               
发表于 2014-7-4 22:10:02 | 显示全部楼层
未学VBA , 此是 Lisp 语句
! j9 D# }4 Z9 Q0 v9 L(ssget "X" '((0 . "INSERT") (2 . "A1")))
( c  Z" L( r# x% b! m6 c/ [$ i& h( r
插入过又删掉的话 返回值为 nil% y. f% a6 V" w7 g; d. {
 楼主| 发表于 2014-7-5 09:42:44 | 显示全部楼层
谢谢沙发,我用另一种方法解决了这个困扰我很久的问题,先清理块,这样块集合里就只有在图形里使用的块了,再筛选块名称。$ F4 d! ?9 e' ~9 l( a; G
清理块代码# T% W4 j, h5 ^6 i
ThisDrawing.SendCommand "-purge" & vbCr & "B" & vbCr & vbCr & "N" & vbCr
# p6 _8 `' V6 |/ j筛选块代码8 F% [, D, c1 f! ], a5 M- D
for each blk1 in thisdrawing.blocks
$ m; v4 i" J9 `& i( J9 X2 Xif bkl1.name="GB_A1" then
( [3 A% r# x+ ?; X……) B8 x- Z5 Q' H
end if
5 |' W# B) P2 Z8 Q2 j5 Z" i& T6 b' R; P& |8 \' n. z
发表于 2014-7-5 13:50:06 | 显示全部楼层
为什么不用选择集?
  1.     Dim SS As AcadSelectionSet, FT(1) As Integer, FD(1) As Variant
    ; q, O- d' M: R
  2.     FT(0) = 0: FD(0) = "INSERT"
    ( W+ I- t' u/ l0 w8 I$ g
  3.     FT(1) = 2: FD(1) = "块名称"
    * s+ z* u6 j$ R! |
  4.     Set SS = ThisDrawing.SelectionSets.Add("SSS")' x) k; P4 I' y/ P) Y
  5.     SS.Select acSelectionSetAll, , , FT, FD2 M# X3 o1 d; p% C3 v8 W1 g7 S
  6.     MsgBox "图形中包含有名为" & Chr(34) & "块名称" & Chr(34) & "的块参照" & SS.Count & "个", vbOKOnly
    ( F9 V& @/ g2 e& M9 Q1 i
  7.     SS.Delete
复制代码
 楼主| 发表于 2014-7-5 14:48:46 | 显示全部楼层
本帖最后由 upc1999 于 2014-7-5 15:26 编辑 ' _5 h! a% v* p0 ]/ A
# {% T% N* b: B1 S; K. \  l/ X
版主厉害,代码测试成功。
+ a- ~1 P5 E$ D再请教版主,块名称有十几种,开头都是GB,比如GBA1、GBA2、GBA3,图中可能有其中的一种或者多种,我要统计图里这样的块分别有多少个,只用选择集能实现吗?
发表于 2014-7-5 19:07:17 | 显示全部楼层
upc1999 发表于 2014-7-5 14:48 static/image/common/back.gif
( d8 K. t: |5 h/ ?5 ~版主厉害,代码测试成功。: S: h) S7 w3 X8 M* L1 D
再请教版主,块名称有十几种,开头都是GB,比如GBA1、GBA2、GBA3,图中可能有其 ...
  1.     Dim SS As AcadSelectionSet, FT(5) As Integer, FD(5) As Variant
    1 V; f5 j; h3 Q0 n% b  ]# t% X. d/ ?7 c
  2.     FT(0) = 0: FD(0) = "INSERT"# z6 T" q7 S, k8 V8 D" X  M
  3.     FT(1) = -4: FD(1) = "<or"
    " D0 {- s- U; O+ V5 ^
  4.     FT(2) = 2: FD(2) = "块名称1"
    8 b! R" A0 {9 D  g
  5.     FT(3) = 2: FD(3) = "块名称2"7 ]2 e2 G# F- d" Q* |9 Y  h
  6.     FT(4) = 2: FD(4) = "块名称3"9 i3 }  D) r/ L/ ]' I% i
  7.     FT(5) = -4: FD(5) = "or>"
    # W8 c/ L' r% \3 g# `- x
  8.     Set SS = ThisDrawing.SelectionSets.Add("SSS")
    + M5 n, M& S4 R/ |. [! n) Q
  9.     SS.Select acSelectionSetAll, , , FT, FD
    $ W5 b3 o) ]6 a2 M" V
  10.     MsgBox "图形中包含有名为" & Chr(34) & "块名称1" & Chr(34) & "或" & Chr(34) & "块名称2" & Chr(34) & "或" & Chr(34) & "块名称3" & Chr(34) & "的块参照共" & SS.Count & "个", vbOKOnly
    , ]% l  U4 T: o" j) o& N$ ^- i
  11.     SS.Delete+ D4 I9 ]) B2 N. }* D& d- H
复制代码
 楼主| 发表于 2014-7-6 12:01:50 | 显示全部楼层
再次感谢版主,我今年才开始学习cad开发,还得多学习。
发表于 2019-12-29 16:45:27 | 显示全部楼层
高手多!
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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