Тема: Select. Фильтр блоков с атрибутом на нужном слое, и с нужным значением. Реально?

Привет,
Ну это как максимум ))).
А минимум - только блоки. Т.е. фильтр по "INSERT", но без Xref'ов и "мульти"-блоков(AcadMInsertBlock), ну и еще что.
Просто интересно.
Можно и перебором отфильтровать конечно.

Re: Select. Фильтр блоков с атрибутом на нужном слое, и с нужным значением. Реально?

Ась?
А чего невозможного-то? Это даже qselect умеет, что касается минимума.

Re: Select. Фильтр блоков с атрибутом на нужном слое, и с нужным значением. Реально?

Qselect? Через SendCommand?
Я имел ввиду метод Select в Selection Set, с заданными фильтрами.
Не найду как отфильтровать только блоки. Просто через 0."insert", попадаются Xref'ы и эти МН-блоки.

Re: Select. Фильтр блоков с атрибутом на нужном слое, и с нужным значением. Реально?

Вот небольшой эксперимент, думаю что все понятно:

Command: insert
Command: (entget(entlast))
((-1 . <Entity name: 7efc04d0>) (0 . "INSERT") (330 . <Entity name: 7efbec10>)
(5 . "10A") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") [b](100 .
"AcDbBlockReference") (66 . 1)[/b] (2 . "Q-11") (10 14431.9 6792.11 0.0) (41 .
10.0) (42 . 10.0) (43 . 10.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 .
0.0) (210 0.0 0.0 1.0))
*******************************************************************************************
Command: _xattach
Attach Xref "05-05-3": F:\DWG-Samples\05-05-3.dwg
"05-05-3" loaded.
Xref "+3.90": C:\MyProj\2005\????05-05\ARCH\work\+3.90.dwg
"+3.90" is unloaded.
Command: (entget(entlast))
((-1 . <Entity name: 7efc0708>) (0 . "INSERT") (330 . <Entity name: 7efbec10>)
(5 . "151") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") [b](100 .
"AcDbBlockReference")[/b] (2 . "05-05-3") (10 0.0 0.0 0.0) (41 . 10.0) (42 . 10.0)
(43 . 10.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0
1.0))
*******************************************************************************************
Command: minsert
Enter block name or [?] <A$C12485B9F>: Q-11
Units: Unitless   Conversion:   10.0000
Specify insertion point or [Basepoint/Scale/X/Y/Z/Rotate]:
Enter X scale factor, specify opposite corner, or [Corner/XYZ] <1>:
Enter Y scale factor <use X scale factor>:
Specify rotation angle <0>:
Enter number of rows (---) <1>: 10
Enter number of columns (|||) <1>: 10
Enter distance between rows or specify unit cell (---): 10
Specify distance between columns (|||): 10
Enter attribute values
enter o.k.:
Command: (entget(entlast))
((-1 . <Entity name: 7efc0710>) (0 . "INSERT") (330 . <Entity name: 7efbec10>)
(5 . "152") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") [b](100 .
"AcDbMInsertBlock") (66 . 1)[/b] (2 . "Q-11") (10 14582.3 7115.69 0.0) (41 . 10.0)
(42 . 10.0) (43 . 10.0) (50 . 0.0) (70 . 10) (71 . 10) (44 . 10.0) (45 . 10.0)
(210 0.0 0.0 1.0))

Re: Select. Фильтр блоков с атрибутом на нужном слое, и с нужным значением. Реально?

Завтра попробую.
Вызывают подозрение две точечные пары с кодом 100.
LeonidSN, спасибо за подробный ответ.

Re: Select. Фильтр блоков с атрибутом на нужном слое, и с нужным значением. Реально?

По поводу кода 100 в расшифровке сказано:
"Маркер данных подкласса...Требуется для всех классов примитивов ... производных от других классов."
Видимо, класс AcDbBlockReference является производным от класса AcDbEntity, который в свою очередь тоже кем-то (или чем-то) порожден.

Re: Select. Фильтр блоков с атрибутом на нужном слое, и с нужным значением. Реально?

Не, по 100 не канает. Пофиг что туда вводить, выбираются все Insert'ы.

Re: Select. Фильтр блоков с атрибутом на нужном слое, и с нужным значением. Реально?

VBA такой VBA...

Re: Select. Фильтр блоков с атрибутом на нужном слое, и с нужным значением. Реально?

Sub Test_Select()
    On Error Resume Next
    Dim ssetObj As AcadSelectionSet
    ThisDrawing.SelectionSets("SSET").Delete
    Set ssetObj = ThisDrawing.SelectionSets.Add("SSET")
    Dim gpCode(0 To 5) As Integer
    Dim dataValue(0 To 5) As Variant
    Dim mode As Integer
    mode = acSelectionSetAll
    gpCode(0) = -4: dataValue(0) = "<AND"
    gpCode(1) = 0: dataValue(1) = "INSERT"
    gpCode(2) = 66: dataValue(2) = 1
    gpCode(3) = 100: dataValue(3) = "AcDbEntity"
    gpCode(4) = 100: dataValue(4) = "AcDbBlockReference"
    gpCode(5) = -4: dataValue(5) = "AND>"
    Dim groupCode As Variant, dataCode As Variant
    groupCode = gpCode
    dataCode = dataValue
    ssetObj.Select mode, , , groupCode, dataCode
End Sub

Re: Select. Фильтр блоков с атрибутом на нужном слое, и с нужным значением. Реально?

Если блоки без атрибутов, то фиг.
Я не придираюсь. Просто думал так, что если в dxf все прописывается через эти коды, хотя не уверен, не щупал, то и в dwg их все можно цепануть, и что не все коды в справке прописаны.

Re: Select. Фильтр блоков с атрибутом на нужном слое, и с нужным значением. Реально?

> LeonidSN
По группе 100 фильтровать нельзя.

Re: Select. Фильтр блоков с атрибутом на нужном слое, и с нужным значением. Реально?

> Vildar
Не понял, что ты хотел сказать?
Я предлагаю схему, метод. А доводить до рабочего уровня - твоя задача.
Если блоки без атрибутов, то фиг - ничего не фиг. Построй такую логическую конструкцию которая проверяет код 66 на пустую строку...а не на конкретное значение.

> Александр Ривилис
В каком смысле?
Я ведь выложенный код протестировал, он работает.

Re: Select. Фильтр блоков с атрибутом на нужном слое, и с нужным значением. Реально?

LeonidSN пишет:

Я ведь выложенный код протестировал, он работает.

    gpCode(0) = -4: dataValue(0) = "<AND"
    gpCode(1) = 0: dataValue(1) = "INSERT"
    gpCode(2) = 66: dataValue(2) = 1
    gpCode(3) = 100: dataValue(3) = "AcDbEntity"
    gpCode(4) = 100: dataValue(4) = "AcDbBlockReference"
    gpCode(5) = -4: dataValue(5) = "AND>"

А че бы ему не работать? Он и вот так будет работать, без 100-ой группы.

    gpCode(0) = -4: dataValue(0) = "<AND"
    gpCode(1) = 0: dataValue(1) = "INSERT"
    gpCode(2) = 66: dataValue(2) = 1
    gpCode(3) = -4: dataValue(3)= "AND>"

А вот так будет?

    gpCode(0) = -4: dataValue(0) = "<AND"
    gpCode(1) = 66: dataValue(1) = 1
    gpCode(2) = 100: dataValue(2) = "AcDbEntity"
    gpCode(3) = 100: dataValue(3) = "AcDbBlockReference"
    gpCode(4) = -4: dataValue(4) = "AND>"

Re: Select. Фильтр блоков с атрибутом на нужном слое, и с нужным значением. Реально?

Проверил повторно.
Да по группе 100 - фильтр не катит. Видимо принял за за закономерность случайный результат.

Re: Select. Фильтр блоков с атрибутом на нужном слое, и с нужным значением. Реально?

> LeonidSN
Ну это тот самый случай про который ShaggyDoc в "САПР на базе AutoCAD..." написал:

Появление ADS и ARX дало возможность разрабатывать очень мощные приложения к AutoCAD, такие Autodesk Architectural Desktop (ADT), но разрушило стройную и красивую систему внутреннего представления данных примитивов AutoCAD в виде ассоциированных списков. Списки-то остались, но С-программисты испортили всю логику, сделав допустимыми совпадающие ключи.

Re: Select. Фильтр блоков с атрибутом на нужном слое, и с нужным значением. Реально?

Не знаю как Вам, а мне понравился вот такой способ.
Вполне универсальный и гибкий способ фильтрации выбранных  объектов.
Данный код привожу как пример, без проверки на работоспособность.

Sub a_101()
    Dim ssetObj As AcadSelectionSet
    Dim ssetObj_temp As New Collection
    'Обработчик ошибок
    On Error Resume Next
'Создание объекта выборки и сама выборка блоков
    Set ssetObj = ThisDrawing.SelectionSets("Boxa")
    If Err <> 0 Then
        Err.Clear
        Set ssetObj = ThisDrawing.SelectionSets.Add("Boxa")
    End If
    ssetObj.Clear
    ssetObj.SelectOnScreen
'Обработчик ошибок
    On Error GoTo error_
    For Each item In ssetObj 'Вычищаем выборку от всего кроме Блоков
    'И фильтруем эти блоки по каком то параметру из атрибутов
        If item.ObjectName = "AcDbBlockReference" Then
            Attributes = item.GetAttributes
            If Attributes(0).TextString = "255" Then ssetObj_temp.Add item
            'Если условие удовлетворяется
            'Перекладываю объект в новую коллекцию и в
            'последствии работаю только с ней.
        End If
    Next
error_:
If Err <> 0 Then MsgBox "Ошибочка была"
'Просто отладочнаЯ строка
    da = da + 1
'Завершение программы и закрытие всех объектов.
    ssetObj.Clear
    ssetObj.Delete
End Sub

Re: Select. Фильтр блоков с атрибутом на нужном слое, и с нужным значением. Реально?

> Boxa
А зачем вот это надо

If item.ObjectName = "AcDbBlockReference" Then

если можно сразу получить только вхождения блоков (а не блоки, кстати)? Ну и дальше уже "развлекаться".

Re: Select. Фильтр блоков с атрибутом на нужном слое, и с нужным значением. Реально?

Если вы заметили то выбираются все объекты.
и потом из них выбираются необходимые.
То что Вы выделили это сравнение имени объекта в выборке и названием того что необходимо перенести в другую коллекцию.
Я не спорю, можно сразу воспользоваться фильтрами и "получить только вхождения блоков", но мне проще так. Нагляднее что ли.
При тех системных требованиях к Акаду которые сейчас есть, один цакл, пусть и длинный (500...1000 объектов), погоды не делает.

Re: Select. Фильтр блоков с атрибутом на нужном слое, и с нужным значением. Реально?

> Boxa
Вполне универсальный и гибкий способ
Когда-то на форуме поднималась тема создания типовых библиотек VBA.
Имелась в виду разработка специализированных модулей (наборов процедур) для выполнения тех или иных действий. В данном случае могли быть использованы два вида - модуль получения наборов примитивов и модуль по обработке наборов, например, фильтрацией.
Я это к тому, что специализация, а не универсализация решений (кода) это наиболее перспективный и гибкий путь.

Re: Select. Фильтр блоков с атрибутом на нужном слое, и с нужным значением. Реально?

Если вы заметили то выбираются все объекты.
и потом из них выбираются необходимые.

Да заметил, заметил.

При тех системных требованиях к Акаду которые сейчас есть, один цакл, пусть и длинный (500...1000 объектов), погоды не делает.

Вот об этом речь. На 1000 объектов может и не делает. А на 10000? А на 100000? Не могу, к сожалению, найти ссылку, в которой сравнивается скорость обработки в обоих случаях. Если правильно помню, несколько порядков на паре десятков тысяч объектов.

Re: Select. Фильтр блоков с атрибутом на нужном слое, и с нужным значением. Реально?

И как часто вы обрабатываете десятки тысяч объектов? Я еще ни разу в своих чертежах не сталкивался с такой ситуацией. К тому же меня не очень расстроит если компьютер будет думать не 1, а 10 секунд...
Я согласен что при очень большом наборе объектов предложенное мной решение медленнее вашего, но свое дело оно делает, а значит имеет право на существование.