Matt__W 发表于 2008-9-30 11:15:27

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

本人'我有一些代码I'我一直在研究(见下文)允许用户选择动态块 然后,程序获取块的有效名称、可见性状态、属性(如果有)和层 我希望从那里创建一组具有相同特征的区块选择集 现在,我'到目前为止,我们将创建一个具有相同层名称的块选择集 我想知道是否有#039;这是一种使用过滤器(类似于下面)来设置可见性状态、有效名称和属性的方法,而不是遍历选择集中的所有对象并测试它们是否具有这些特征
FilterType(0) = 0
FilterData(0) = "Insert"
FilterType(1) = 8
FilterData(1) = strBlkLayerName
                        
Set sset = vbdPowerSet("BlockCountBySelection")
sset.Select acSelectionSetAll, , , FilterType, FilterData
完整代码…
Option Explicit
Public Sub Main()
    Dim sset As AcadSelectionSet
    Dim Entity As AcadEntity
    Dim Point As Variant
    Dim objDynBlk As AcadBlockReference
    Dim vDynProps As Variant
    Dim oDynProp As AcadDynamicBlockReferenceProperty
    Dim i As Integer
    Dim strVisState As String
    Dim varAtts() As AcadAttributeReference
    Dim intAttVal As Integer
    Dim strAttValue As String
    Dim retVal As Long
    Dim strDynBlkName As String
    Dim FilterType(1) As Integer
    Dim FilterData(1) As Variant
    Dim strBlkLayerName As String
   
    ThisDrawing.Utility.GetEntity Entity, Point, "Select a block: "
    If TypeOf Entity Is AcadBlockReference Then
      Set objDynBlk = Entity
      If objDynBlk.IsDynamicBlock = True Then
            strBlkLayerName = objDynBlk.Layer
            If objDynBlk.EffectiveName Like "MY_DB_*" Then
                strDynBlkName = objDynBlk.EffectiveName
                vDynProps = objDynBlk.GetDynamicBlockProperties
                For i = 0 To UBound(vDynProps)
                  Set oDynProp = vDynProps(i)
                  If oDynProp.PropertyName = "Visibility" Then
                        strVisState = oDynProp.Value
                  End If
                Next i
                If objDynBlk.HasAttributes = True Then
                  varAtts = objDynBlk.GetAttributes
                  For intAttVal = 0 To UBound(varAtts)
                        If UCase(varAtts(intAttVal).TagString) = "DATATYPE" Then
                            strAttValue = varAtts(intAttVal).TextString
                        Else
                            strAttValue = Null
                        End If
                  Next intAttVal
                End If
                retVal = MsgBox("Do you want to continue and delete all blocks with the following characteristics?" & vbCrLf & _
                            vbCrLf & _
                            "Block Name: " & strDynBlkName & vbCrLf & _
                            "Visibility State: " & strVisState & vbCrLf & _
                            "Attribute: " & strAttValue & vbCrLf & _
                            "Layer Name: " & strBlkLayerName, vbQuestion + vbYesNo, "Continue...")
                Select Case retVal
                  Case Is = vbNo
                        Exit Sub
                  Case Is = vbYes
                        FilterType(0) = 0
                        FilterData(0) = "Insert"
                        FilterType(1) = 8
                        FilterData(1) = strBlkLayerName
                        
                        Set sset = vbdPowerSet("BlockCountBySelection")
                        sset.Select acSelectionSetAll, , , FilterType, FilterData
                        
                End Select
            Else
                MsgBox "NOT a dynamic block!"
            End If
      End If
    Else
      MsgBox "The selected object is NOT a block."
    End If
End Sub
Public Function vbdPowerSet(strName As String) As AcadSelectionSet
    Dim objSelSet As AcadSelectionSet
    Dim objSelCol As AcadSelectionSets
   
    Set objSelCol = ThisDrawing.SelectionSets
    For Each objSelSet In objSelCol
      If objSelSet.Name = strName Then
            objSelSet.Delete
            Exit For
      End If
    Next
    Set objSelSet = ThisDrawing.SelectionSets.Add(strName)
    Set vbdPowerSet = objSelSet
End Function

Jeff_M 发表于 2008-9-30 13:06:13

你能做的唯一一件事就是过滤BlockName和*UXXX“;命名块。这将消除所有其他非动态块和动态特性未被改变的动态块。

Matt__W 发表于 2008-9-30 13:14:02

我有点担心我的选择会非常有限 谢谢,杰夫。

Matt__W 发表于 2008-9-30 13:42:50


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

Jeff_M 发表于 2008-9-30 14:34:50

不,有效名称没有DXF代码。因此,过滤器必须获取所有匿名块,然后在循环SS时检查有效名称
因此,滤波器的一部分将是:strdynblname&amp&quot'*“U*”
请注意第一个*之前的单引号

Matt__W 发表于 2008-9-30 14:38:22

正是我所想的…只是需要确认一下&nbsp*
脚踢地面*
页: [1]
查看完整版本: 删除具有匹配属性/图层/视觉状态的动态块的选择集