乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 63|回复: 5

删除具有匹配属性/图层/视觉状态的动态块的选择集

[复制链接]

86

主题

744

帖子

6

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1092
发表于 2008-9-30 11:15:27 | 显示全部楼层 |阅读模式
本人'我有一些代码I'我一直在研究(见下文)允许用户选择动态块 然后,程序获取块的有效名称、可见性状态、属性(如果有)和层 我希望从那里创建一组具有相同特征的区块选择集 现在,我'到目前为止,我们将创建一个具有相同层名称的块选择集 我想知道是否有#039;这是一种使用过滤器(类似于下面)来设置可见性状态、有效名称和属性的方法,而不是遍历选择集中的所有对象并测试它们是否具有这些特征
  1. FilterType(0) = 0
  2. FilterData(0) = "Insert"
  3. FilterType(1) = 8
  4. FilterData(1) = strBlkLayerName
  5.                         
  6. Set sset = vbdPowerSet("BlockCountBySelection")
  7. sset.Select acSelectionSetAll, , , FilterType, FilterData

完整代码…
  1. Option Explicit
  2. Public Sub Main()
  3.     Dim sset As AcadSelectionSet
  4.     Dim Entity As AcadEntity
  5.     Dim Point As Variant
  6.     Dim objDynBlk As AcadBlockReference
  7.     Dim vDynProps As Variant
  8.     Dim oDynProp As AcadDynamicBlockReferenceProperty
  9.     Dim i As Integer
  10.     Dim strVisState As String
  11.     Dim varAtts() As AcadAttributeReference
  12.     Dim intAttVal As Integer
  13.     Dim strAttValue As String
  14.     Dim retVal As Long
  15.     Dim strDynBlkName As String
  16.     Dim FilterType(1) As Integer
  17.     Dim FilterData(1) As Variant
  18.     Dim strBlkLayerName As String
  19.    
  20.     ThisDrawing.Utility.GetEntity Entity, Point, "Select a block: "
  21.     If TypeOf Entity Is AcadBlockReference Then
  22.         Set objDynBlk = Entity
  23.         If objDynBlk.IsDynamicBlock = True Then
  24.             strBlkLayerName = objDynBlk.Layer
  25.             If objDynBlk.EffectiveName Like "MY_DB_*" Then
  26.                 strDynBlkName = objDynBlk.EffectiveName
  27.                 vDynProps = objDynBlk.GetDynamicBlockProperties
  28.                 For i = 0 To UBound(vDynProps)
  29.                     Set oDynProp = vDynProps(i)
  30.                     If oDynProp.PropertyName = "Visibility" Then
  31.                         strVisState = oDynProp.Value
  32.                     End If
  33.                 Next i
  34.                 If objDynBlk.HasAttributes = True Then
  35.                     varAtts = objDynBlk.GetAttributes
  36.                     For intAttVal = 0 To UBound(varAtts)
  37.                         If UCase(varAtts(intAttVal).TagString) = "DATATYPE" Then
  38.                             strAttValue = varAtts(intAttVal).TextString
  39.                         Else
  40.                             strAttValue = Null
  41.                         End If
  42.                     Next intAttVal
  43.                 End If
  44.                 retVal = MsgBox("Do you want to continue and delete all blocks with the following characteristics?" & vbCrLf & _
  45.                             vbCrLf & _
  46.                             "Block Name: " & strDynBlkName & vbCrLf & _
  47.                             "Visibility State: " & strVisState & vbCrLf & _
  48.                             "Attribute: " & strAttValue & vbCrLf & _
  49.                             "Layer Name: " & strBlkLayerName, vbQuestion + vbYesNo, "Continue...")
  50.                 Select Case retVal
  51.                     Case Is = vbNo
  52.                         Exit Sub
  53.                     Case Is = vbYes
  54.                         FilterType(0) = 0
  55.                         FilterData(0) = "Insert"
  56.                         FilterType(1) = 8
  57.                         FilterData(1) = strBlkLayerName
  58.                         
  59.                         Set sset = vbdPowerSet("BlockCountBySelection")
  60.                         sset.Select acSelectionSetAll, , , FilterType, FilterData
  61.                         
  62.                 End Select
  63.             Else
  64.                 MsgBox "NOT a dynamic block!"
  65.             End If
  66.         End If
  67.     Else
  68.         MsgBox "The selected object is NOT a block."
  69.     End If
  70. End Sub
  71. Public Function vbdPowerSet(strName As String) As AcadSelectionSet
  72.     Dim objSelSet As AcadSelectionSet
  73.     Dim objSelCol As AcadSelectionSets
  74.    
  75.     Set objSelCol = ThisDrawing.SelectionSets
  76.     For Each objSelSet In objSelCol
  77.         If objSelSet.Name = strName Then
  78.             objSelSet.Delete
  79.             Exit For
  80.         End If
  81.     Next
  82.     Set objSelSet = ThisDrawing.SelectionSets.Add(strName)
  83.     Set vbdPowerSet = objSelSet
  84. End Function

回复

使用道具 举报

71

主题

928

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1230
发表于 2008-9-30 13:06:13 | 显示全部楼层
你能做的唯一一件事就是过滤BlockName和*UXXX“;命名块。这将消除所有其他非动态块和动态特性未被改变的动态块。
回复

使用道具 举报

86

主题

744

帖子

6

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1092
发表于 2008-9-30 13:14:02 | 显示全部楼层
我有点担心我的选择会非常有限 谢谢,杰夫。
回复

使用道具 举报

86

主题

744

帖子

6

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1092
发表于 2008-9-30 13:42:50 | 显示全部楼层

好的……快速提问 代码2将为我提供注释性块名,我将使用什么来获得有效名称 有号码吗 如果是,是什么&nbsp
  1. (2 . "*U256")
回复

使用道具 举报

71

主题

928

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1230
发表于 2008-9-30 14:34:50 | 显示全部楼层
不,有效名称没有DXF代码。因此,过滤器必须获取所有匿名块,然后在循环SS时检查有效名称
因此,滤波器的一部分将是:strdynblname&amp&quot'*“U*”
请注意第一个*之前的单引号
回复

使用道具 举报

86

主题

744

帖子

6

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1092
发表于 2008-9-30 14:38:22 | 显示全部楼层
正是我所想的…只是需要确认一下&nbsp*
脚踢地面*
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-7-4 02:08 , Processed in 0.705521 second(s), 65 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表