按名称选择动态块的设置过滤器
这是一个AutoCAD 2007问题我已升级(?)一些块从标准块到动态块,现在我发现我的一些代码无法按名称找到这些块,因为动态块被分配了匿名名称。(*U??)
有一个新的blockreference属性,.EffectiveName,我可以使用它来构建选择集,但我更希望用户在选择过程中看到筛选的选择,而不是在选择之后。此外,我还有其他依赖于块名过滤的函数,我不想重写它们
有没有办法构建一个选择集过滤器来查找DXF子类标记
例如:
0=“插入”
2=“s_elev*”
1001=“AcDbDynamicBlockTrueName”
或是否有其他方法
**** Hidden Message ***** 这是一个变通的办法。你从一个函数中得到一串名字,然后把它用于你的过滤器。
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
Bryco,
非常感谢您出色的解决方案。
它做我想做的事情。
我曾尝试过类似的东西,但不知道`字符。 很高兴它起作用了,我也不得不问一下这个角色,因为维度块也需要它,所以清除子角色很方便。
页:
[1]