QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

查看: 3730|回复: 7
收起左侧

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

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

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

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

x
本帖最后由 upc1999 于 2014-7-4 16:24 编辑 5 `+ s- S# Z, F

5 a0 h" k3 n8 e" r0 R6 x4 {! ^2 [我需要筛选特定的块名,比如图框A1,但是如果有插入过又删掉的块,还保留在块列表里,就需要判断这个块是不是在图形中使用。7 A, N5 z3 F. r4 [& W
我搜索到的代码都是先历遍实体,再判断是否为块,效率太低,有没有办法先列举块名称,再判断是不是在图行中使用?  A# u) n+ J6 S; O
; p1 F9 U0 E, D* o' X: Z% P, y
Dim entry As AcadEntity, blk1 As AcadBlockReference7 g' y; Y7 K4 w/ p" y
    For Each entry In activeDoc.ModelSpace
" p( w. q. b+ N7 O' L          If entry.ObjectName = "AcDbBlockReference" Then  l* o4 C6 X7 l4 B
          Set blk1 = entry
  i$ J2 ?4 T% L7 z# i8 a) m( j- _          if blk1.name="块名称" then

0 f' L% S" L; K7 R6 b! ~4 ]……/ e$ U- o( q+ ~9 ^$ v" n* K# j
   next       4 [- @6 y/ h7 _2 d- E6 b
               
发表于 2014-7-4 22:10:02 | 显示全部楼层 来自: 中国台湾
未学VBA , 此是 Lisp 语句
2 D/ B; p* Z  o$ T7 Q$ O, ^(ssget "X" '((0 . "INSERT") (2 . "A1")))
4 {6 g8 J  b* b! a4 ]
5 N& ^$ X6 C, |; p% ^7 R# G插入过又删掉的话 返回值为 nil
  w3 ]$ \7 Y' p: S/ B! C% }
 楼主| 发表于 2014-7-5 09:42:44 | 显示全部楼层 来自: 中国山东东营
谢谢沙发,我用另一种方法解决了这个困扰我很久的问题,先清理块,这样块集合里就只有在图形里使用的块了,再筛选块名称。
! b; D' R6 y% m- S清理块代码' J" Y6 h! k7 i6 ]2 b4 N
ThisDrawing.SendCommand "-purge" & vbCr & "B" & vbCr & vbCr & "N" & vbCr0 s. [+ q/ }$ l- f- r2 y
筛选块代码
! w; `# Y9 d3 ]( M' Hfor each blk1 in thisdrawing.blocks
; P+ ?$ y1 F  E2 h9 |; v6 y- G5 X) Y9 Kif bkl1.name="GB_A1" then# I6 s5 @2 j1 C% L  |5 A
……
! r7 p# q- k& `0 _7 ^8 W, Zend if' `) j- Y" _5 s7 @0 o
; b$ }( ~* Q/ @5 ]% B
发表于 2014-7-5 13:50:06 | 显示全部楼层 来自: 中国辽宁抚顺
为什么不用选择集?
  1.     Dim SS As AcadSelectionSet, FT(1) As Integer, FD(1) As Variant
      S! o' D* N  `+ B- q
  2.     FT(0) = 0: FD(0) = "INSERT". M6 _0 R& T7 S6 V  S2 c: R6 k( y4 v& l
  3.     FT(1) = 2: FD(1) = "块名称"
    , q9 v. ^. D% N6 [
  4.     Set SS = ThisDrawing.SelectionSets.Add("SSS")
    3 J; F& {+ V5 x. k7 ?
  5.     SS.Select acSelectionSetAll, , , FT, FD
    2 w+ d# S8 q4 U- H& _- J+ e
  6.     MsgBox "图形中包含有名为" & Chr(34) & "块名称" & Chr(34) & "的块参照" & SS.Count & "个", vbOKOnly
    4 d9 _  w* [/ ]$ `; W9 v
  7.     SS.Delete
复制代码
 楼主| 发表于 2014-7-5 14:48:46 | 显示全部楼层 来自: 中国山东东营
本帖最后由 upc1999 于 2014-7-5 15:26 编辑
$ L, g7 C9 K# x4 C6 @; d& }! o" L- X+ b  @9 l, D) @
版主厉害,代码测试成功。; ^' F, L8 u1 o" A
再请教版主,块名称有十几种,开头都是GB,比如GBA1、GBA2、GBA3,图中可能有其中的一种或者多种,我要统计图里这样的块分别有多少个,只用选择集能实现吗?
发表于 2014-7-5 19:07:17 | 显示全部楼层 来自: 中国辽宁抚顺
upc1999 发表于 2014-7-5 14:48 static/image/common/back.gif
' [1 o( U+ n9 h( I版主厉害,代码测试成功。) z; \! k: n: i/ [
再请教版主,块名称有十几种,开头都是GB,比如GBA1、GBA2、GBA3,图中可能有其 ...
  1.     Dim SS As AcadSelectionSet, FT(5) As Integer, FD(5) As Variant
    7 q, F% K1 a& V7 t
  2.     FT(0) = 0: FD(0) = "INSERT"9 Q" E8 p! ~) R+ Q6 t* V
  3.     FT(1) = -4: FD(1) = "<or": f9 k6 J& D7 j& r+ e8 u% i6 @
  4.     FT(2) = 2: FD(2) = "块名称1"
    : b$ E5 a* @0 Q
  5.     FT(3) = 2: FD(3) = "块名称2"1 N7 E* J. i3 r' |8 N' f
  6.     FT(4) = 2: FD(4) = "块名称3"- W# K8 X+ A& k2 ^) X) E! T* ~
  7.     FT(5) = -4: FD(5) = "or>"
    / m' i2 b# o( x
  8.     Set SS = ThisDrawing.SelectionSets.Add("SSS")) {9 h6 `4 g5 Q, M+ k% F7 o1 z
  9.     SS.Select acSelectionSetAll, , , FT, FD5 n' U9 o' f/ ]6 s, z
  10.     MsgBox "图形中包含有名为" & Chr(34) & "块名称1" & Chr(34) & "或" & Chr(34) & "块名称2" & Chr(34) & "或" & Chr(34) & "块名称3" & Chr(34) & "的块参照共" & SS.Count & "个", vbOKOnly
    * _" P7 `; h) u( R6 E) m
  11.     SS.Delete
    * C* d5 u' ?5 k
复制代码
 楼主| 发表于 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备2023026364号-1 )

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