本代码实现以下功能:
在dwg文件中,要求选中图元颜色是100的所有图元,并且选中图层颜色为100且此图层中图元颜色为200的所有图元。
编程思路:
一、
用dxf组码过滤器ftype fdata,第一层嵌套为<or (图元颜色为100) (第二层:图层颜色为100) or>。
第二层嵌套为<and 图层颜色为100且图元颜色为200 and>。
二、
由于我们不知道有多少个这样的图层,因此需要用到for循环。图层颜色为100的图层数量for循环可以计算出来,我们用i来代替数量,图层名写入str中,通过for循环统计所有图层名:str=str & lay.name &"," 然后用split函数分割写入数组中,接下来写出完整代码:
(split函数及数组应用具体可参考本博主另一篇博文
vba 中split函数及数组搭配for循环的应用-优快云博客 https://blog.youkuaiyun.com/yongshiqq/article/details/134861519?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22134861519%22%2C%22source%22%3A%22yongshiqq%22%7D)
Ftype(0) = -4: Fdata(0) = "<or"
Ftype(1) = 62: Fdata(1) = 100
For j = 1 To i
ftype(j * 4 - 2) = -4: Fdata(j * 4 - 2) = "<and"
ftype(j * 4 - 1) = 8:Fdata(j * 4 - 1) = arr(i-1)
ftype(j * 4) = 62:Fdata(j * 4) = 200
ftype(j * 4 + 1) = -4:Fdata(j * 4 + 1) ="and>"
Next j
ftype(i) = -4: Fdata(i) = "or>"
sel.Select acSelectionSetAll, , , ftype,fdata
搞定!本文重点为for循环的算法嵌套入过滤器当中,数学编程不分家,我们需要通过类举法找到规律后再实现算法。
下个例子,选择图中所有半径大于5 的圆
Sub FilterRelational()
Dim sset As AcadSelectionSet
Dim FilterType(2) As Integer
Dim FilterData(2) As Variant
Set sset = ThisDrawing.SelectionSets.Add("SS21")
FilterType(0) = 0: FilterData(0) = "Circle"
FilterType(1) = -4: FilterData(1) = ">="
FilterType(2) = 40: FilterData(2) = 5#
sset.SelectOnScreen FilterType, FilterData
MsgBox "Number of objects selected: " & sset.Count
' 终止前删除选择集 Remove the selection set at the end
sset.Delete
End Sub