mohnston 发表于 2006-10-30 18:51:02

按名称为动态块选择集过滤器

这是AutoCAD 2007版本
我已经升级了(?)一些块从标准块到动态块,现在我发现我的一些代码无法按名称找到这些块,因为动态块被分配了匿名名称。(*U??)
有一个新的blockreference属性EffectiveName,我可以用它来构建选择集,但我更希望用户在选择过程中看到过滤的选择,而不是在选择之后。此外,我还有其他依赖于块名过滤的函数,我不'我不想重写它们
有没有办法建立一个选择集过滤器来查找DXF子类标记
例如:
0="插入“
2=;s_elev*“
1001=;AcDbDynamicBlockTrueName“
1000=;s_elev*“
或者还有别的办法吗

Bryco 发表于 2006-10-31 07:34:16

这是一种变通方法。从函数中获得一个名称字符串,然后将其用于过滤器
Function SelectDynamicByName(sName As String) As String
    Dim sArray As String
    Dim oBref As AcadBlockReference
    Dim SS As AcadSelectionSet
    sArray = sName
    Set SS = sset(2, "`*U*") 'Use a selectionset function
    For Each oBref In SS
      If oBref.IsDynamicBlock Then
            If oBref.EffectiveName = sName Then
                sArray = sArray & ",`" & oBref.Name
            End If
      End If
    Next
    SelectDynamicByName = sArray
End Function
Sub Test()
    Dim SS As AcadSelectionSet
    Set SS = sset(2, SelectDynamicByName("Door - Imperial"))
    Debug.Print SS.count
End Sub
Public Function sset(FilterType, FilterData As Variant, Optional ssName As String = "SS") As AcadSelectionSet
   
    Dim oSSets As AcadSelectionSets
    Set oSSets = ThisDrawing.SelectionSets
    For Each sset In oSSets
      If sset.Name = ssName Then
            sset.Delete
            Exit For
      End If
    Next
    Dim FType() As Integer
    Dim FData() As Variant
    Dim i As Integer
    If IsArray(FilterType) = False Then
      If IsArray(FilterData) = False Then
            ReDim FType(0)
            ReDim FData(0)
            FType(0) = FilterType
            FData(0) = FilterData
      Else
            Exit Function
      End If
    Else
      If UBound(FilterType)UBound(FilterData) Then
            Exit Function 'They must be pairs
      End If
      
      ReDim FType(UBound(FilterType))
      ReDim FData(UBound(FilterType))
      For i = 0 To UBound(FilterType)
            FType(i) = FilterType(i)
            FData(i) = FilterData(i)
      Next
    End If
   
    Set sset = ThisDrawing.SelectionSets.Add(ssName)
    sset.Select 5, FilterType:=FType, FilterData:=FData
    'To use this function for single filter
    'Set SS = SSet(0, "insert")
    'For multiple filter
    'Set SS = SSet(array(0,2),array("insert",oBlock.name)) 'must be pairs
   
End Function
End Sub

mohnston 发表于 2006-10-31 12:43:03

Bryco,非常感谢你的出色工作
它做我想要的
我试过那样的东西,但没有;我不知道这个角色。

Bryco 发表于 2006-10-31 17:18:39

很高兴它成功了,我也不得不询问这个角色,它'因为尺寸块也需要吹扫接头,所以吹扫接头很方便。
页: [1]
查看完整版本: 按名称为动态块选择集过滤器