Тема: Как записать Fitertype и Filterdata для SelectionSet?

Мне нужно получить SelectionSet всех линий пересекающихся в двух данных точках (LinObj.StartPoint и LinObj.EndPoint), но в SelectionSet я хочу получить все линии кроме LinObj. Я написал так, но это не срабатывает. В чём ошибка?
ReDim filtertype(0 To 7) As Integer
ReDim filterdata(0 To 7) As Variant
     filtertype(0) = -4: filterdata(0) = "<AND":
     filtertype(1) = -4: filterdata(1) = "<NOT":
     filtertype(2) = 5: filterdata(2) = LinObj.Handle:
     filtertype(3) = -4: filterdata(3) = "NOT>":
     filtertype(4) = -4: filterdata(4) = "AND>":
     filtertype(5) = -4: filterdata(5) = "<AND":
     filtertype(6) = 0: filterdata(6) = "Line":
     filtertype(7) = -4: filterdata(7) = "AND>":
ssLineIntersectWith.Select acSelectionSetCrossing, LinObj.StartPoint, LinObj.EndPoint, filtertype, filterdata

Re: Как записать Fitertype и Filterdata для SelectionSet?

А не проще сначла создть  SelectionSet всех объектов

ssLineIntersectWith.Select acSelectionSetCrossing, LinObj.StartPoint, LinObj.EndPoint

А отом удалить из набора линию

Dim removeObjects(0) As AcadEntity
Set removeObjects(0) =  LinObj
ssLineIntersectWith.RemoveItems removeObjects

Re: Как записать Fitertype и Filterdata для SelectionSet?

Оно, то может быть и проще, но количество entity у меня в обрабатываемом чертеже достигает 45 тысяч. Так, что времени это займёт немеряно, да и неэлегантно как то.

Re: Как записать Fitertype и Filterdata для SelectionSet?

Оно, то может быть и проще, но количество entity у меня в обрабатываемом чертеже достигает 45 тысяч. Так, что времени это займёт немеряно, да и неэлегантно как то.

В таком случае зачем использовать acSelectionSetCrossing, может лучьше SelectByPolygon (Fence)

Re: Как записать Fitertype и Filterdata для SelectionSet?

> Arkady
Пробовал. В VBA он почему-то не срабатывает правильно. Да и мне всё равно по этой записи я получаю всего три линии одна из которых мне уже известна. Т.е. после каждого срабатывания Selectionset-а я должен буду проверять составляющие его entity и не работать с уже известной мне линией, а это замедляет работу. Применив Filtertype и Filterdata так как я написал в Selectionset я буду получать всего лишь две линии мне неизвестные, таким образом не отвлекаясь на проверку и сэкономлю много времени. Но с синтаксисом, что-то у меня не получается.

Re: Как записать Fitertype и Filterdata для SelectionSet?

filtertype(2) = 5: filterdata(2) = LinObj.Handle:

По моему эта строка работать не может.
Цитата из HELP:

The ssget function recognizes all group codes except entity names (group -1), handles (group 5), ...

Re: Как записать Fitertype и Filterdata для SelectionSet?

Из хелпа

...
Dim gpCode(0) As Integer
Dim dataValue(0) As Variant
gpCode(0) = 0
dataValue(0) = "Circle"
Dim groupCode As Variant, dataCode As Variant
groupCode = gpCode
dataCode = dataValue
ssetObj.Select mode, corner1, corner2, groupCode, dataCode
...

То есть filtertype и filterdata - as Variant
А вообще SelectionSet работает как-то не стабильно :(

Re: Как записать Fitertype и Filterdata для SelectionSet?

Ты не можеш делать SelSet по Handle
Выбери все линии, а затем SelSet.RemoveItems(array of objects)
Дешево и сердито

Re: Как записать Fitertype и Filterdata для SelectionSet?

> cadhelp
Действительно по Handle невозможно взять SelectionSet. Самое обидное, что в VB SelectionSet по Handle прекрасно работает.

Re: Как записать Fitertype и Filterdata для SelectionSet?

> ALL
Сделал всё как в самой первой реплике, но у меня не работает:(. Вот код:

Option Base 0
Sub Example_SelectOnScreen()
    ' Create the selection set
    Dim ssetObj As AcadSelectionSet
    For Each ssetObj In ActiveDocument.SelectionSets
      If ssetObj.Name = "TEST_SSET" Then
        ActiveDocument.SelectionSets.Item("TEST_SSET").Delete
        Exit For
      End If
    Next ssetObj
    Set ssetObj = ThisDrawing.SelectionSets.Add("TEST_SSET")
    [b]Dim gpCode(4) As Integer
    Dim dataValue(4) As Variant
    gpCode(0) = -4: dataValue(0) = "<AND"
    gpCode(1) = 0: dataValue(1) = "INSERT"
    gpCode(2) = 2: dataValue(2) = "MY_BLOCK_NAME" 'you may setup the block name here
    gpCode(3) = -4: dataValue(3) = "AND>"[/b]
    Dim groupCode As Variant, dataCode As Variant
    groupCode = gpCode
    dataCode = dataValue
    ' Add objects to a selection set by prompting user to select on the screen
    ssetObj.SelectOnScreen groupCode, dataCode
    MsgBox ssetObj.Count & " items selected"
    ThisDrawing.SelectionSets.Item("TEST_SSET").Delete
    Set ssetObj = Nothing
End Sub

Причём если оставить только gpCode(0) = 2: dataValue(0) = "MY_BLOCK_NAME", то всё выбирается нормально. А по AND - нет... :(((

Re: Как записать Fitertype и Filterdata для SelectionSet?

> ALL
Так почему не работает ?

Re: Как записать Fitertype и Filterdata для SelectionSet?

Ну почему же не работает, все работает.
В руках дело, в руках.

    [b]Option Base 0[/b]
    [b]Dim gpCode(4) As Integer
    Dim dataValue(4) As Variant[/b]
    gpCode(0) = -4: dataValue(0) = "<AND"
    gpCode(1) = 0: dataValue(1) = "INSERT"
    gpCode(2) = 2: dataValue(2) = "MY_BLOCK_NAME" 'you may setup the block name here
    gpCode(3) = -4: dataValue(3) = "AND>"
    [b]gpCode(4) = ?: dataValue(4) = ?[/b]

Re: Как записать Fitertype и Filterdata для SelectionSet?

> БП
О, тут обнаружился зияющий пробел в моих познаниях !
Я-то не раз просмотрел код, и был уверен, что число в скобках при объявлении массива - это число его элементов, а не верхняя граница, как оказалось в действительности! Спасибо!