明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索

一个选择集的增强类,刚写好,大家提提意见

  [复制链接]
发表于 2004-11-16 09:45:00 | 显示全部楼层
不愧是班主啊
发表于 2004-11-19 21:03:00 | 显示全部楼层
还有一个建议,我最讨厌ActiveX中,有时只需要一个对象,但去还要去建一个一个元素的数组来放这么一个对象,太烦了。
所以最好在添加对象到选择集中或从选择集中去除对象能够做到单个对象和多个对象兼容。
 楼主| 发表于 2004-11-20 09:25:00 | 显示全部楼层
Add和AddItems函数,Remove和RemoveItems函数是处理这种情况的


老大的意思是不是把它们合并?


如果在.Net或C++里有函数重载好办,


VBA里如果强行做在一起,我的感觉是不太好
发表于 2004-11-20 21:08:00 | 显示全部楼层
记住这种操作在AutoCAD对象模型的某个方法是有用过,在Excel中用得比较多吧。
就象这样:
  1. Sub ss()
  2.        Dim SSet As AcadSelectionSet
  3.        Set SSet = PickFirstSSet
  4.        Dim pnt, ent As AcadEntity
  5.        ThisDrawing.Utility.GetEntity ent, pnt
  6.        AddItems SSet, ent
  7.        SSet.Highlight True
  8.        MsgBox "显示刚选择并添加新对象的选择集"
  9.        SSet.Highlight False
  10. End Sub
  11. Function PickFirstSSet() As AcadSelectionSet
  12.        On Error Resume Next
  13.        ThisDrawing.SelectionSets("PICKFIRST").Delete
  14.        Set PickFirstSSet = ThisDrawing.PickfirstSelectionSet
  15.        If PickFirstSSet.Count = 0 Then PickFirstSSet.SelectOnScreen
  16. End Function
  17. [b]Sub AddItems(SSet As AcadSelectionSet, Entitys As Variant)
  18.        If IsArray(Entitys) Then
  19.                SSet.AddItems Entitys
  20.        ElseIf IsObject(Entitys) Then
  21.                Dim Entity(0) As AcadEntity
  22.                Set Entity(0) = Entitys
  23.                SSet.AddItems Entity
  24.        End If
  25. End Sub[/b]
 楼主| 发表于 2004-11-23 13:31:00 | 显示全部楼层
那就改成这样吧 Public Sub AddItems(ByVal objs)
'向选择集加入实体
On Error Resume Next

If IsArray(objs) Then
oSel.AddItems objs
ElseIf IsObject(objs) Then
Dim ents(0) As AcadEntity
Set ents(0) = objs
oSel.AddItems ents
End If

End Sub Public Sub RemoveItems(ByVal objs)
'在选择集中移除实体
On Error Resume Next

If IsArray(objs) Then
oSel.RemoveItems objs
ElseIf IsObject(objs) Then
Dim ents(0) As AcadEntity
Set ents(0) = objs
oSel.RemoveItems ents
End If

End Sub
我顺便把实用函数的BuildFilter加进来了,:) Public Sub SetFilter(ParamArray Filter())
'设置过滤器
On Error Resume Next

Dim i
Dim n As Integer
Dim nCount As Integer
nCount = (UBound(Filter) + 1) / 2 - 1

Dim ft() As Integer, fd()
ReDim ft(nCount), fd(nCount)

For i = 0 To nCount
n = i * 2
ft(i) = Filter(n)
fd(i) = Filter(n + 1)
Next i

TlsFt = ft
TlsFd = fd End Sub
发表于 2004-11-24 13:02:00 | 显示全部楼层
两位真是高手,就这样说着说着,又解决了cad的一个麻烦
发表于 2004-11-26 20:38:00 | 显示全部楼层
good
发表于 2004-11-26 21:09:00 | 显示全部楼层
再提个要求吧:
把选择集的并集和差集也写到AddItems和RemoveItems中吧。
 楼主| 发表于 2004-11-26 22:36:00 | 显示全部楼层
可以这样:
ss1.additems ss2.toarray ss1.removeitems ss2.toarray
发表于 2005-1-30 00:06:00 | 显示全部楼层
牛人,解决了选择集方面的大问题,太感谢了.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-23 02:32 , Processed in 0.169252 second(s), 16 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表