QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
7天前
全站
goto3d 说: 版主微信号:caivin811031;还未入三维微信群的小伙伴,速度加
2022-07-04
查看: 2908|回复: 7
收起左侧

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

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

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

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

x
本帖最后由 upc1999 于 2014-7-4 16:24 编辑 9 A5 ?$ W% L7 t* ]8 R5 y2 @' @3 M

. u+ l+ Z$ E+ b* b- b! X$ q) I3 k我需要筛选特定的块名,比如图框A1,但是如果有插入过又删掉的块,还保留在块列表里,就需要判断这个块是不是在图形中使用。
. Q9 L/ m1 J+ u( h我搜索到的代码都是先历遍实体,再判断是否为块,效率太低,有没有办法先列举块名称,再判断是不是在图行中使用?
0 ^: b0 K, R: c6 f7 \
& a$ d  {3 O1 ^3 z2 M: yDim entry As AcadEntity, blk1 As AcadBlockReference. ^7 k/ v, M2 y0 T
    For Each entry In activeDoc.ModelSpace
1 }# u* k; N# e0 S* |; |2 x          If entry.ObjectName = "AcDbBlockReference" Then6 H% p/ L* q/ {* F
          Set blk1 = entry
; \5 e4 Q) z( h& a          if blk1.name="块名称" then

8 Y( h; q0 r9 T2 F9 [4 A……
- c) Z( q# v3 r   next      
; i% s, B  k1 m               
发表于 2014-7-4 22:10:02 | 显示全部楼层
未学VBA , 此是 Lisp 语句
; {% @( h  T& p+ V# O(ssget "X" '((0 . "INSERT") (2 . "A1")))
! K% e) N4 q: @# x: K" N& K! Q6 b, W6 B+ V* h( B2 \  O
插入过又删掉的话 返回值为 nil2 h' l' i  ^5 H; h, d  [4 L5 j; k0 c
 楼主| 发表于 2014-7-5 09:42:44 | 显示全部楼层
谢谢沙发,我用另一种方法解决了这个困扰我很久的问题,先清理块,这样块集合里就只有在图形里使用的块了,再筛选块名称。
, Z4 D8 o9 ^7 h. m! n  C. N6 \清理块代码7 I+ z4 \! s" J+ r$ E# G7 x
ThisDrawing.SendCommand "-purge" & vbCr & "B" & vbCr & vbCr & "N" & vbCr
5 n' C" ?  X7 h5 k筛选块代码
% u2 }. s' [; h5 b% n: ofor each blk1 in thisdrawing.blocks* ?9 H' b/ r, ^# T* p
if bkl1.name="GB_A1" then
, s2 W3 W2 j0 T" H7 q1 C  ^……4 E9 Q6 Q5 {$ v6 j( r
end if
" {; p/ w& Y3 }, I" b
% z* |+ T/ Y* m, M  d
发表于 2014-7-5 13:50:06 | 显示全部楼层
为什么不用选择集?
  1.     Dim SS As AcadSelectionSet, FT(1) As Integer, FD(1) As Variant
    ; [# W3 }. h9 r! @1 Q6 ^, T
  2.     FT(0) = 0: FD(0) = "INSERT"
    0 @8 `0 T) ]6 e- Z
  3.     FT(1) = 2: FD(1) = "块名称"8 V1 j) h$ n5 d/ F" i: l
  4.     Set SS = ThisDrawing.SelectionSets.Add("SSS")8 P% G: V% r2 N! m
  5.     SS.Select acSelectionSetAll, , , FT, FD
    / T& W3 R2 x: m' p  c2 h
  6.     MsgBox "图形中包含有名为" & Chr(34) & "块名称" & Chr(34) & "的块参照" & SS.Count & "个", vbOKOnly
    6 n: ?: C; G( M& a! X
  7.     SS.Delete
复制代码
 楼主| 发表于 2014-7-5 14:48:46 | 显示全部楼层
本帖最后由 upc1999 于 2014-7-5 15:26 编辑 # b! m( T3 X; {; Z
" X" T3 G) \7 `+ C* ^
版主厉害,代码测试成功。3 p0 |: w' V  `
再请教版主,块名称有十几种,开头都是GB,比如GBA1、GBA2、GBA3,图中可能有其中的一种或者多种,我要统计图里这样的块分别有多少个,只用选择集能实现吗?
发表于 2014-7-5 19:07:17 | 显示全部楼层
upc1999 发表于 2014-7-5 14:48 static/image/common/back.gif
+ t4 R% J0 l% X4 _版主厉害,代码测试成功。4 T; |0 ~& q' q+ b' B
再请教版主,块名称有十几种,开头都是GB,比如GBA1、GBA2、GBA3,图中可能有其 ...
  1.     Dim SS As AcadSelectionSet, FT(5) As Integer, FD(5) As Variant2 C; ?: }: {7 g* m$ X
  2.     FT(0) = 0: FD(0) = "INSERT"
    5 g- y  U7 z! f  E4 _
  3.     FT(1) = -4: FD(1) = "<or"1 p& U: C# ]% A6 n+ E
  4.     FT(2) = 2: FD(2) = "块名称1"
    ' B# G/ `& ~( }3 x; y8 t
  5.     FT(3) = 2: FD(3) = "块名称2"$ L( ]! y' d# q# H
  6.     FT(4) = 2: FD(4) = "块名称3": {# a# S7 K, I, W# V' ?' ~0 Z
  7.     FT(5) = -4: FD(5) = "or>". ~- H! Q; P0 I% @  D
  8.     Set SS = ThisDrawing.SelectionSets.Add("SSS")
    1 W! h+ d4 |/ P9 a- @  o+ W7 X
  9.     SS.Select acSelectionSetAll, , , FT, FD: k3 @2 i/ }! F0 W  q
  10.     MsgBox "图形中包含有名为" & Chr(34) & "块名称1" & Chr(34) & "或" & Chr(34) & "块名称2" & Chr(34) & "或" & Chr(34) & "块名称3" & Chr(34) & "的块参照共" & SS.Count & "个", vbOKOnly2 P2 s# m( P% k1 z% G0 r
  11.     SS.Delete- v& m2 o* r* u& i* R  d
复制代码
 楼主| 发表于 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 )

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