乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 57|回复: 3

按名称选择动态块的设置过滤器

[复制链接]

12

主题

64

帖子

3

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
112
发表于 2006-10-30 18:51:02 | 显示全部楼层 |阅读模式
这是一个AutoCAD 2007问题
我已升级(?)一些块从标准块到动态块,现在我发现我的一些代码无法按名称找到这些块,因为动态块被分配了匿名名称。(*U??)
有一个新的blockreference属性,.EffectiveName,我可以使用它来构建选择集,但我更希望用户在选择过程中看到筛选的选择,而不是在选择之后。此外,我还有其他依赖于块名过滤的函数,我不想重写它们
有没有办法构建一个选择集过滤器来查找DXF子类标记
例如:
0=“插入”
2=“s_elev*”
1001=“AcDbDynamicBlockTrueName”
或是否有其他方法

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2006-10-31 07:34:16 | 显示全部楼层
这是一个变通的办法。你从一个函数中得到一串名字,然后把它用于你的过滤器。
  1. Function SelectDynamicByName(sName As String) As String
  2.     Dim sArray As String
  3.     Dim oBref As AcadBlockReference
  4.     Dim SS As AcadSelectionSet
  5.     sArray = sName
  6.     Set SS = sset(2, "`*U*") 'Use a selectionset function
  7.     For Each oBref In SS
  8.         If oBref.IsDynamicBlock Then
  9.             If oBref.EffectiveName = sName Then
  10.                 sArray = sArray & ",`" & oBref.Name
  11.             End If
  12.         End If
  13.     Next
  14.     SelectDynamicByName = sArray
  15. End Function
  16. Sub Test()
  17.     Dim SS As AcadSelectionSet
  18.     Set SS = sset(2, SelectDynamicByName("Door - Imperial"))
  19.     Debug.Print SS.count
  20. End Sub
  21. Public Function sset(FilterType, FilterData As Variant, Optional ssName As String = "SS") As AcadSelectionSet
  22.    
  23.     Dim oSSets As AcadSelectionSets
  24.     Set oSSets = ThisDrawing.SelectionSets
  25.     For Each sset In oSSets
  26.         If sset.Name = ssName Then
  27.             sset.Delete
  28.             Exit For
  29.         End If
  30.     Next
  31.     Dim FType() As Integer
  32.     Dim FData() As Variant
  33.     Dim i As Integer
  34.     If IsArray(FilterType) = False Then
  35.         If IsArray(FilterData) = False Then
  36.             ReDim FType(0)
  37.             ReDim FData(0)
  38.             FType(0) = FilterType
  39.             FData(0) = FilterData
  40.         Else
  41.             Exit Function
  42.         End If
  43.     Else
  44.         If UBound(FilterType)  UBound(FilterData) Then
  45.             Exit Function 'They must be pairs
  46.         End If
  47.         
  48.         ReDim FType(UBound(FilterType))
  49.         ReDim FData(UBound(FilterType))
  50.         For i = 0 To UBound(FilterType)
  51.             FType(i) = FilterType(i)
  52.             FData(i) = FilterData(i)
  53.         Next
  54.     End If
  55.    
  56.     Set sset = ThisDrawing.SelectionSets.Add(ssName)
  57.     sset.Select 5, FilterType:=FType, FilterData:=FData
  58.     'To use this function for single filter
  59.     'Set SS = SSet(0, "insert")
  60.     'For multiple filter
  61.     'Set SS = SSet(array(0,2),array("insert",oBlock.name)) 'must be pairs
  62.    
  63. End Function
  64. End Sub

回复

使用道具 举报

12

主题

64

帖子

3

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
112
发表于 2006-10-31 12:43:03 | 显示全部楼层
Bryco,
非常感谢您出色的解决方案。
它做我想做的事情。
我曾尝试过类似的东西,但不知道`字符。
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2006-10-31 17:18:39 | 显示全部楼层
很高兴它起作用了,我也不得不问一下这个角色,因为维度块也需要它,所以清除子角色很方便。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-7-6 20:10 , Processed in 0.647387 second(s), 60 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表