Тема: Прямой доступ ко всем вхождениям блоков

Можно ли его получить для работы в цикле. Т.е.
For blockref in thisdrawing.modelspase ' что-то на подобе
next
Данная конструкция работае только если нет других объектов автокада в модели.
Сдалать выборку селектом не получитсья .т.к. сама задача в точтобы нати все вхождения блоков с данными именами и удалить их а потом и удалить сами блоки.
Если есть другие варианты буду только признателен.
Заранее спасибо

Re: Прямой доступ ко всем вхождениям блоков

Option Explicit
Const MY_BLOCK As String = "Q-11"
Sub AccessToInsert()
    On Error Resume Next
    ' Create the selection set
    Dim ssetObj As AcadSelectionSet
    Set ssetObj = ThisDrawing.SelectionSets.Add("SSET")
    Dim gpCode(0) As Integer
    Dim dataValue(0) As Variant
    gpCode(0) = 0
    dataValue(0) = "INSERT"
    Dim mode As Integer
    mode = acSelectionSetAll
    Dim groupCode As Variant, dataCode As Variant
    groupCode = gpCode
    dataCode = dataValue
    ssetObj.Select mode, , , groupCode, dataCode
    Dim br As AcadBlockReference
    For Each br In ssetObj
        If (br.Name = MY_BLOCK) Then
            br.Delete
        End If
    Next br
End Sub

Re: Прямой доступ ко всем вхождениям блоков

Я позволил себе немного  дополнить...

Option Explicit
Public Sub AccessToInsert()
    On Error Resume Next
    ' Create the selection set
    Dim ssetObj As AcadSelectionSet
    Dim objSSS As AcadSelectionSets
    Set objSSS = ThisDrawing.SelectionSets
    For Each ssetObj In objSSS
        If ssetObj.Name = "SSET" Then
            ThisDrawing.SelectionSets.Item("SSET").Delete
        Exit For
        End If
    Next
    Set ssetObj = ThisDrawing.SelectionSets.Add("SSET")
    Dim gpCode(0) As Integer
    Dim dataValue(0) As Variant
    gpCode(0) = 0
    dataValue(0) = "INSERT"
    Dim mode As Integer
    mode = acSelectionSetAll
    Dim groupCode As Variant, dataCode As Variant
    groupCode = gpCode
    dataCode = dataValue
    ssetObj.Select mode, , , groupCode, dataCode
    Dim br As AcadBlockReference
     For i = 1 To UserForm1.TextBox4.value
        For j = 1 To 100
            For Each br In ssetObj
                If br.Name = "Marki" + CStr(i) + "." + CStr(j) Then
                    br.Delete
                End If
            Next br
        Next j
    Next i
End Sub

К сожалению ошибка таже. подозреваю все дело в циклах. Зашел с другой стороны

For i = 1 To UserForm1.TextBox4.value
       For j = 1 To 100
            For Each obj In ThisDrawing.ModelSpace
                If TypeOf obj Is AcadBlockReference Then
                    If obj.Name = "Marki" + CStr(i) + "." + CStr(j) Then
                        obj.Delete
                    End If
                End If
            Next
         Next j
    Next i

Работает так как надо но слишком долго (относительно на данно стадии (до 500 итемов)). Хотелось бы заранее это обойти более быстрым вариантом. Вот пока не получается.

Re: Прямой доступ ко всем вхождениям блоков

Давайте попробуем по порядку:
1. Сдалать выборку селектом не получитсья
Вроде бы получилось?
2. сама задача в точтобы нати все вхождения блоков с данными именами и удалить их а потом и удалить сами блоки.
Имеется в виду удаление блоков из базы данных чертежа?
3.К сожалению ошибка таже.
В чем ошибка-то? По-конкретнее, пожалуйста.
4.Работает так как надо но слишком долго
Ну так а что вы хотите - двойной цикл с перебором всех объектов  ModelSpace,
с двойной проверкой условий (в том числе сравнение строк на языке высокого уровня абстракции - VB). Кроме того, не показано объявление переменной obj, и я подозреваю что-то вроде: Dim obj as AcadObject, а значит используется механизм позднего связывания при распознавании объекта. Можно сказать, что в этом примере собраны все способы замедления работы кода. Да и еще - VBA не компилирует код, работает интерпретатор.
Но главное непонятное - что именно не катит при использовании:
ssetObj.Select mode, , , groupCode, dataCode?

Re: Прямой доступ ко всем вхождениям блоков

1. Создали выбоку.
2. Проверили имя "Marki1.1"
3. Удалили вхождение (блок)
4. Следующее имя "Marki1.2"
5. Ошибка: из селета уже удален один объект, а сама выборка опредлена за всеми циклами т.е. у цикла  For Each br In ssetObj переменная граница видимо поэтому.

Re: Прямой доступ ко всем вхождениям блоков

> Judas
Попробуй проходить sset не с начала, а с конца.

Re: Прямой доступ ко всем вхождениям блоков

> Judas
т.е. у цикла For Each br In ssetObj переменная граница видимо поэтому.

Для цикла For Each (для каждого) это не имеет значения.
Кстати, проверил код закомментировав ' On Error Resume Next. Все работает и никаких ошибок не наблюдается.

Re: Прямой доступ ко всем вхождениям блоков

Странно сегодня опять сел за автокад все заработало...))). Спасибо LeonidSN &  Anatoly/