[分享]CAD VBA过滤器、选择集分享
本帖最后由 作者 于 2008-10-30 8:09:57 编辑 <br /><br /> <p>我看到过这个问题有好几次了,当时只是把代码发给了个人,现在把这些代码贴出来,建立一个专题,加以自己的理解进行说明,希望能对大家在工作中遇到选择集和过滤器问题有所帮助以供大家使用。这种方法建立选择集和过滤器我使用过千百遍,未出现过任何异常。</p><p>'——————————————————————————————————<br/>'名称:BuildFilter<br/>'作者:罗简单<br/>'日期:2008-3-11<br/>'功能:创建过滤器<br/>'——————————————————————————————————<br/>Public Sub BuildFilter(TypeArray, DataArray, ParamArray gCodes())<br/> Dim fType() As Integer, fData()<br/> Dim index As Long, i As Long<br/> <br/> index = LBound(gCodes) - 1<br/> For i = LBound(gCodes) To UBound(gCodes) Step 2<br/> index = index + 1<br/> ReDim Preserve fType(0 To index)<br/> ReDim Preserve fData(0 To index)<br/> fType(index) = CInt(gCodes(i))<br/> fData(index) = gCodes(i + 1)<br/> Next<br/> TypeArray = fType: DataArray = fData<br/> <br/>End Sub</p><p>'——————————————————————————————————<br/>'名称:CreateSelectionSet<br/>'作者:罗简单<br/>'日期:2008-3-11<br/>'功能:创建选择集<br/>'——————————————————————————————————<br/>Public Function CreateSelectionSet(Optional ssName As String = "ss") As AcadSelectionSet</p><p> Dim ss As AcadSelectionSet<br/> On Error Resume Next<br/> Set ss = ThisDrawing.SelectionSets(ssName)<br/> If Err Then Set ss = ThisDrawing.SelectionSets.Add(ssName)<br/> ss.Clear<br/> Set CreateSelectionSet = ss</p><p>End Function</p><p></p><p>'创建个过程来调用过滤器和选择集<br/>Sub TestBuildFilterAndCteSset()<br/> '定义过滤器<br/> Dim pType, pData<br/> BuildFilter pType, pData, 0, "LWPOLYLINE", 8, "JZD"<br/> '注意:这里的0与8是通过命令(entget(car(entsel)))获取的对象基本<br/> '特性,例如:<br/> '**********************************************************************************<br/> '((-1 . <图元名: 7ef83b28>) (0 . "LWPOLYLINE") (330 . <图元名:<br/> '7ef81cc0>) (5 . "425") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 .<br/> '"JZD") (6 . "Continuous") (100 . "AcDbPolyline") (90 . 2) (70 . 128) (43 . 0.0)<br/> '(38 . 0.0) (39 . 0.0) (10 92.5011 35.6905) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10<br/> '208.946 102.652) (40 . 0.0) (41 . 0.0) (42 . 0.0) (210 0.0 0.0 1.0))<br/> '**********************************************************************************<br/> '其中比较常用的(0 . "LWPOLYLINE") 表示对象类型;(8 ."JZD")表示对象所在层<br/> '所以还可以扩展或收缩过滤器,如下<br/> 'BuildFilter pType, pData, 0, "LWPOLYLINE":建立图上所有的多段线过滤器<br/> 'BuildFilter pType, pData, 0, "LWPOLYLINE", 8, "JZD":建立图层是JZD的多段线过滤器<br/> 'BuildFilter pType, pData, 0, "LWPOLYLINE", 8, "JZD",62,3:建立图层是JZD、颜色为绿色的多段线过滤器<br/> <br/> '定义选择集<br/> Dim sset As AcadSelectionSet<br/> Set sset = CreateSelectionSet<br/> <br/> '根据以上指定的过滤器建立选择集<br/> sset.Clear<br/> sset.Select acSelectionSetAll, , , pType, pData<br/> '这里可以通过Select、SelectAtPoint、SelectByPolygon、SelectOnScreen等方法<br/> '配合Mode和Point1、Point2建立更加用户化的选择集<br/> <br/>End Sub</p><p>'当在一个过程中连续使用两个以上的选择集时,需要重新定义选择集,如下:<br/>'创建空间选择集的函数2<br/>Public Function CreateSelectionSet2(Optional ssName As String = "ss2") As AcadSelectionSet</p><p> Dim ss2 As AcadSelectionSet<br/> On Error Resume Next<br/> Set ss2 = ThisDrawing.SelectionSets(ssName)<br/> If Err Then Set ss2 = ThisDrawing.SelectionSets.Add(ssName)<br/> ss2.Clear<br/> Set CreateSelectionSet2 = ss2</p><p>End Function<br/></p><p>'创建个过程来调用过滤器和选择集<br/>Sub TestBuildFilterAndCteSset()<br/> '定义过滤器<br/> Dim pType, pData<br/> BuildFilter pType, pData, 0, "LWPOLYLINE", 8, "JZD"<br/> '注意:这里的0与8是通过命令(entget(car(entsel)))获取的对象基本<br/> '特性,例如:<br/> '**********************************************************************************<br/> '((-1 . <图元名: 7ef83b28>) (0 . "LWPOLYLINE") (330 . <图元名:<br/> '7ef81cc0>) (5 . "425") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 .<br/> '"JZD") (6 . "Continuous") (100 . "AcDbPolyline") (90 . 2) (70 . 128) (43 . 0.0)<br/> '(38 . 0.0) (39 . 0.0) (10 92.5011 35.6905) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10<br/> '208.946 102.652) (40 . 0.0) (41 . 0.0) (42 . 0.0) (210 0.0 0.0 1.0))<br/> '**********************************************************************************<br/> '其中比较常用的(0 . "LWPOLYLINE") 表示对象类型;(8 ."JZD")表示对象所在层<br/> '所以还可以扩展或收缩过滤器,如下<br/> 'BuildFilter pType, pData, 0, "LWPOLYLINE":建立图上所有的多段线过滤器<br/> 'BuildFilter pType, pData, 0, "LWPOLYLINE", 8, "JZD":建立图层是JZD的多段线过滤器<br/> 'BuildFilter pType, pData, 0, "LWPOLYLINE", 8, "JZD",62,3:建立图层是JZD、颜色为绿色的多段线过滤器<br/> <br/> '定义选择集<br/> Dim sset As AcadSelectionSet<br/> Set sset = CreateSelectionSet<br/> <br/> '根据以上指定的过滤器建立选择集<br/> sset.Clear<br/> sset.Select acSelectionSetAll, , , pType, pData<br/> '这里可以通过Select、SelectAtPoint、SelectByPolygon、SelectOnScreen等方法<br/> '配合Mode和Point1、Point2建立更加用户化的选择集<br/> <br/> <br/> '再调用Createselectionset2<br/> Dim sset2 As AcadSelectionSet<br/> Set sset2 = CreateSelectionSet2 '注意这里是调用CreateSelectionSet2,依次类推<br/> <br/> sset2.Clear<br/> sset2.SelectOnScreen pType, pData<br/>End Sub</p><p></p><p>罗简单</p><p>QQ:45096732</p><p>欢迎交流</p> 本帖最后由 断箭 于 2018-2-6 15:47 编辑请问高手们,CAD中选择过滤器保存的过滤器列表如何编程的形式变为工具条的形式,需要的时候直接点过滤器的名称即可选择需要的对象??若能提供类似的插件,仅有的几个明经币请拿去:handshake 请问楼主,怎样向已经含有对象的选择集中添加对象呢? 最主要的是dxf码表的选择,这个很关键 走过,路过的朋友请留个言 好东西哦。 好东西应该置顶,呵呵。 呵呵,到第二页了,顶一下,非恶意,这个程序自己觉得挺好,应该拿出来与大家分享。 请问楼主,怎样向已经含有对象的选择集中添加对象呢? <p>楼上可以参考选择集的AddItems方法。</p> 非恶意灌水 不错 <p>好东西噢</p><p>学习下</p>