删除具有匹配属性/图层/视觉状态的动态块的选择集
本人';我有一些代码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
你能做的唯一一件事就是过滤BlockName和*UXXX“;命名块。这将消除所有其他非动态块和动态特性未被改变的动态块。 我有点担心我的选择会非常有限 ;谢谢,杰夫。
好的……快速提问 ;代码2将为我提供注释性块名,我将使用什么来获得有效名称 ;有号码吗 ;如果是,是什么 
(2 . "*U256") 不,有效名称没有DXF代码。因此,过滤器必须获取所有匿名块,然后在循环SS时检查有效名称
因此,滤波器的一部分将是:strdynblname&"'*“U*”
请注意第一个*之前的单引号
正是我所想的…只是需要确认一下 *
脚踢地面*
页:
[1]