Тема: Не могу справиться с методом AddItem для SelectionSet

Здравствуйте!
Имеются несколько блоков на чертеже (их имена известны). Внутри этих блоков обязательно имеются круги. Требуется эти круги (которые внутри блоков) собрать в набор для дальнейших действий с ними. У меня не получается AddItem. Выдается следующая ошибка: Method 'AddItems' of object 'IAcadSelectionSet' failed. Хэлп смотрел, примеры в этом форуме видел. Заранее спасибо.
Вот код:

Sub MySelect()
Dim SwitchesInDwg As AcadSelectionSet, FilterType(4) As Integer, FilterData(4) As Variant, CirclesInSwitches() As AcadEntity
Dim SubEnt As AcadObject, Counter1 As Integer, Counter2 As Integer, blkName As String, TrimmingCircles As AcadSelectionSet
    With ThisDrawing.SelectionSets
        While .Count > 0
                .Item(0).Delete
        Wend
        Set SwitchesInDwg = .Add("Switches")
        Set TrimmingCircles = .Add("TrimmingCircles")
    End With
   FilterType(0) = -4: FilterData(0) = "<or"
   FilterType(1) = 2:  FilterData(1) = "ИМЯ БЛОКА 1"
   FilterType(2) = 2:  FilterData(2) = "ИМЯ БЛОКА 2"
   FilterType(3) = 2:  FilterData(3) = "ИМЯ БЛОКА 3"
   FilterType(4) = -4: FilterData(4) = "or>"
SwitchesInDwg.Select acSelectionSetAll, , , FilterType, FilterData
ReDim CirclesInSwitches(SwitchesInDwg.Count - 1)
Counter1 = -1
    For Counter2 = 0 To SwitchesInDwg.Count - 1
        blkName = SwitchesInDwg.Item(Counter2).Name
        For Each SubEnt In ThisDrawing.Blocks.Item(blkName)
                If SubEnt.ObjectName = "AcDbCircle" Then
                    Counter1 = Counter1 + 1
                    Set CirclesInSwitches(Counter1) = SubEnt
                End If
        Next
    Next
TrimmingCircles.AddItems CirclesInSwitches ' <-- ошибка в этой строке
End Sub

Re: Не могу справиться с методом AddItem для SelectionSet

Возможно это связано с тем, что окружности уже входят в состав блоков. У меня тоже не получилось создать из них SelectionSet.
В таком случае можно применить для их отбора и группировки и "для дальнейших действий с ними" другую структуру данных - тот же динамический массив или коллекцию:

Option Explicit
Const BLK_1 As String = "block1"
Const BLK_2 As String = "block2"
Const BLK_3 As String = "block3"
Sub MySelect()
    Dim SwitchesInDwg As AcadSelectionSet
    Dim TrimmingCircles As AcadSelectionSet
    On Error Resume Next
    With ThisDrawing.SelectionSets
        .Item("Switches").Delete
        .Item("TrimmingCircles").Delete
        Set SwitchesInDwg = .Add("Switches")
        Set TrimmingCircles = .Add("TrimmingCircles")
    End With
    ThisDrawing.SelectionSets("Switches").Clear
    ThisDrawing.SelectionSets("TrimmingCircles").Clear
    Dim FilterType(4) As Integer
    Dim FilterData(4) As Variant
    FilterType(0) = -4: FilterData(0) = "<or"
    FilterType(1) = 2: FilterData(1) = BLK_1
    FilterType(2) = 2: FilterData(2) = BLK_2
    FilterType(3) = 2: FilterData(3) = BLK_3
    FilterType(4) = -4: FilterData(4) = "or>"
    SwitchesInDwg.Select acSelectionSetAll, , , FilterType, FilterData
    Dim Counter1 As Integer
    Dim I As Integer
    Dim blkName As String
    Dim SubEnt As AcadCircle
    Counter1 = SwitchesInDwg.Count - 1
    Dim CirclesCollection As New Collection
    For I = 0 To Counter1
        blkName = SwitchesInDwg.Item(I).Name
        For Each SubEnt In ThisDrawing.Blocks.Item(blkName)
            If SubEnt.ObjectName = "AcDbCircle" Then
                [b]CirclesCollection[/b].Add SubEnt
            End If
        Next SubEnt
    Next I
    ReDim [b]CirclesInSwitches[/b](CirclesCollection.Count - 1) As AcadCircle
    I = 0
    For Each SubEnt In CirclesCollection
        Set CirclesInSwitches(I) = SubEnt
        I = I + 1
    Next SubEnt
'    Err.Clear
'    TrimmingCircles.AddItems CirclesInSwitches
'    MsgBox Err.Description
End Sub

И вообще - SelectionSet очень специфический и капризный объект.

Re: Не могу справиться с методом AddItem для SelectionSet

Спасибо большое. Будем работать через коллекцию. А вообще, какая разница между коллекцией и набором? Может ее и использовать всегда вместо набора?

Re: Не могу справиться с методом AddItem для SelectionSet

> wl2000
Насчет "использовать всегда" - не стоит.
AcadSelectionSet хорош тем, что встроенные механизмы AutoCAD позволяют производить обработку больших объемов информации очень быстро, практически мгновенно. Но применять AcadSelectionSet приходится строго в предписанных рамках. См. примеры из Help.
Коллекция - универсальная но ресурсоемкая и медлительная в обработке структура. Оправдывает себя при работе со сравнительно набольшим кол-вом элементов, объектов. Или когда скорость обработки не критична.
Я в своих программах, например, использую коллекцию из Handl'ов входящих в блок элементов, например, артибутов. Такой набор можно сохранить любым способом - в оперативной памяти, в файле AutoCAD, в файле на диске. А доступ к объектам осуществляется методом HandleToObject.
Но главное - почитайте книжки, в постах всего не изложишь.

Re: Не могу справиться с методом AddItem для SelectionSet

Спасибо. Только где их найти, эти книжки про ACAD и VBA.

Re: Не могу справиться с методом AddItem для SelectionSet

> wl2000
Могу скинуть кое-что. Куда?

Re: Не могу справиться с методом AddItem для SelectionSet

wl2000@mail.ru Жду с нетерпением

Re: Не могу справиться с методом AddItem для SelectionSet

И мне пожалуйста stas_org@inbox.ru, заранее спасибо.

Re: Не могу справиться с методом AddItem для SelectionSet

может на файлообменник

Re: Не могу справиться с методом AddItem для SelectionSet

> Vildar
Залил на:
http://slil.ru/26184091

Re: Не могу справиться с методом AddItem для SelectionSet

есть. спасибо

Re: Не могу справиться с методом AddItem для SelectionSet

Большое спасибо ЛеонидуСН в за материал!!! То, что надо для начинающего. Вы это сами переводили? Если так, то мегареспект!

Re: Не могу справиться с методом AddItem для SelectionSet

> wl2000
Нет, перевод не мой.
К сожалению, имя переводчика у меня не сохранилось, но весь "мегареспект" ему.