zeng29 发表于 2003-10-31 08:40:00

请单独试试下面的代码:
Sub SelOnScrLayerPick()
    Dim ssetObj As AcadSelectionSet
    Dim FilterType(0) As Integer
    Dim FilterData(0) As Variant
    Set ssetObj = ThisDrawing.PickfirstSelectionSet
    ssetObj.Clear
    FilterType(0) = 8
    FilterData(0) = "图层1"
    ssetObj.SelectOnScreen FilterType, FilterData
    Debug.Print ssetObj.Count
End Sub
这段代码我在几台机械上试过(2002,2004)均没有问题,证明是正确的;由于手头上没有2000,所以不能确定是否是2000版的原因.
如果在 ssetObj.SelectOnScreen FilterType, FilterData 没有出错,表示你的系统没有问题,如果还是出错,肯定是你的CAD系统的问题,建议卸载重装,若仍不能解决问题建议升级到2002或2004.

dazhangyu 发表于 2003-10-31 09:01:00

该图层既没冻结,也没关闭,而且还是当前图层。
我用ssetobj.select acSelectionSetAll方法试了一下,功能实现了。我现在就更不明白了,为什么这个方法的功能就可以实现,用selectonscreen就出错呢?
我衷心地感谢你们各位版主对我的帮助,真不好意思还得跟你们再讨教。
经过这几次的刀光剑影,dazhangyu更想知道问题出在哪里了!!
各位版主一定要对小弟我帮到底呀,拜托拜托!!

efan2000 发表于 2003-10-31 11:47:00

SelectOnScreen需要自己手动在屏幕上选择,如果能够选中,那么会出现高亮状态,同时在命令行上显示选中多少,过滤多少。仔细检查一下是否有选中实体。

dazhangyu 发表于 2003-11-3 10:44:00

没有这些提示信息
是不是我的ACAD2000有问题呀?在哪儿能下载这个软件呢?或更高版本的也行呀

bluemoon 发表于 2003-11-3 16:06:00

我测试了一下dazhangyu的程序,稍做修改,程序如下:
Sub ce()
    Dim ssetobj As AcadSelectionSet '设置选择对象
    On Error Resume Next
    Set ssetobj = ThisDrawing.SelectionSets.Add("pmbj_sset")
    If Err Then
      Err.Clear
      Set ssetobj = ThisDrawing.SelectionSets.Item("pmbj_sset")
    End If
    ssetobj.Clear
    MsgBox "ssetobj的名字是:" & ssetobj.Name
    MsgBox "当前图层是:" & ThisDrawing.ActiveLayer.Name '当前图层就是pmbj
    Dim stype(0) As Integer
    Dim sdata(0) As Variant
    stype(0) = 8
    sdata(0) = "pmbj"
    ssetobj.SelectOnScreen stype, sdata '当程序执行到这儿时,提示手动选择对象

    ssetobj.Update
   Dim entry As AcadEntity
For Each entry In ssetobj
   entry.Color = 5
Next entry
End Sub
我的CAD也是2000 但是没有出现错误啊
我想dazhengyu的意思是不是要求自动选择某个图层的所有实体啊?
如果是这样 我想用selectonscreen 可能不能满足你的要求啊

bluemoon 发表于 2003-11-3 16:13:00

这样做你看是否能满足你的要求
'***********声明公用变量*************
Public Sset As AcadSelectionSet
'*****************建立选择集***************
Function CreatSSet()   
    Dim ss As AcadSelectionSet
    On Error Resume Next
    Set ss = ThisDrawing.SelectionSets.Add("bluemoon")
    If Err Then
      Err.Clear
      Set ss = ThisDrawing.SelectionSets("bluemoon")
      ss.Clear
    End If
    Set CreatSSet = ss
End Function


'***************得到某图层的所有实体并把其放入选择集中**********
'***************以图层名称作为参数***********
Public Sub GetLayerEntity(NameString As String)
    Dim FType(0) As Integer
    Dim FData(0) As Variant
    FType(0) = 8
    FData(0) = NameString
    Set Sset = CreatSSet
    Sset.Select acSelectionSetAll, , , FType, FData
End Sub
这样就可以把名为NameString的图层中的所有实体放入选择集Sset中 然后你在调用这两个函数就应该能完成你的操作了
只要知道图层名称就可以 不用在手动选择啊
多用函数 好处多多啊

dazhangyu 发表于 2003-11-4 11:35:00

楼上仁兄的高见让我五体投地,我对你的敬仰如滔滔江水,奔流不息。。。。。
啊?都知道哇?那我就不说了
我的目的达到了!
如果各位高手还能忍耐我的恒心的话,如果再给我一次机会 ,那么我想说:为什么15楼的方法不好使,而16楼的方法咋就那么好使呢?

bluemoon 发表于 2003-11-5 10:23:00

select 方法的功能是“选取对象的同时将对象放入选择集中”
selectonscreen方法的功能是“提示用户从屏幕点选对象”
两者功能不同 效果也就不一样
不知道这是不是你要的答案
仁兄的学习精神让小生佩服万分

dazhangyu 发表于 2003-11-5 17:43:00

谢谢
但是selectonscreen后面带参数的意思不就是自动选取指定图层的所有实体吗?

mccad 发表于 2003-11-5 19:26:00

你还是不明白。
Sset.Select acSelectionSetAll, , , FType, FData
这一句指的是选择图形中所有符合过滤器条件的图元。
而 Sset.SelectOnScreen stype, sdata
指的是让用户选择屏幕上的对象并用过滤器的条件进行过滤。
页: 1 [2] 3
查看完整版本: SelectOnScreen的问题