Тема: Как вывести список имён ВСЕХ Entity имеющихся в чертеже?

Возможно тема навязла в зубах но не могу найти ничего нужного в FAQ и
прошу помочь, тем более подозреваю что задача простая.
базу читать умею, но в остальном - сделал вот такой код (см ниже);
код возвращает далеко не все Entity, кроме того я не знаю как получить
их имена.
Ещё - довольно слабо представляю какие там таблицы для чего используются.
Все примеры что сумел найти, "заточены" на создание собственных объектов
и не дают того что мне нужно.
Если кто-нибудь сумеет "на пальцах" объяснить или кусочек кода нужного дать - буду сильно благодарен. :)
Спасибо.
    AcDbDatabase* pDb = curDoc()->database();
    pDb->getBlockTable(tblBlock, AcDb::OpenMode::kForRead);
    es = tblBlock->newIterator(pBlockIter, true, m_bSkipDeleted);
    while(!pBlockIter->done()){
        es = pBlockIter->getRecord(pBTR, AcDb::kForRead, m_bSkipDeleted);
        // Check if it as a regular block def and has attributes
        if((!pBTR->isFromExternalReference()) && (pBTR->hasAttributeDefinitions()) && (!pBTR->isLayout()))
        {
            es = pBTR->newIterator(pRecIterator, true, m_bSkipDeleted);
            while (!pRecIterator->done()){
                es = pRecIterator->getEntity(pEntity, AcDb::kForRead, !m_bSkipDeleted);
    ReportEntity(pEntity);
                        iEntCount++;
                pEntity->close();
                pRecIterator->step();
            }
            delete pRecIterator;
        }
        pBTR->close();
        pBlockIter->step();
    }

Re: Как вывести список имён ВСЕХ Entity имеющихся в чертеже?

> Max
Тема действительно "навязла на зубах" по большому счету от неполноты постановки задачи и незнания AutoCAD.
I. Что такое "все Entity имеющиеся в чертеже"? - если поймешь это, то остальное будет сделать очень просто. Под "всеми" можно понять:
1) непосредственно вставленные в Модель и/или Лист (Листы)
2) пункт 1) + все содержащиеся во всех вставленных блоках (как будто их всех расчленили)
3) пункт 2) + все содержащиеся во внешних ссылках
Еще вопрос считать ли отдельно атрибуты блоков и вершины полилиний?
II. Что ты понимаешь под именем entity? Т.е. что нужно печатать? Имя класса примитива entity (типа AcDbLine для отрезка), DXF имя (типа LINE), метку примитива и т.д.?
Вот когда поймешь точно что тебе нужно, тогда и сможешь получить ответ. Возможно даже самостоятельно. :)

Re: Как вывести список имён ВСЕХ Entity имеющихся в чертеже?

Признавая глубокую и принципиальную правоту Александра Ривилиса, не могу удержаться от некоторого снижения темы. Вот пример отлавливания всех примитивов типа AcadEntity в ModelSpace:
Для того чтобы упомянутое снижение было еще нагляднее, использую VBA (тем более, что ObjectARX'ом не владею, да и нужен ли он здесь?):

Sub M_Space_Entity()
    Dim MSpace As AcadModelSpace
    Set MSpace = ThisDrawing.ModelSpace
    Dim vEntity As AcadEntity
    Dim EntityType As String
    On Error Resume Next
    For Each vEntity In MSpace
        EntityType = vEntity.ObjectName
        MsgBox EntityType
    Next vEntity
 End Sub

Re: Как вывести список имён ВСЕХ Entity имеющихся в чертеже?

> Александр Ривилис
> I. Что такое "все Entity имеющиеся в чертеже"? — если поймешь это, то остальное будет сделать очень просто.
угу... Осталось только понять. :) Мелочь такая. ;))  Спасибо за ответы, в любом случае!
И тем не менее, ещё...
> и/или Лист (Листы)
Когда имеется объект AcDbDatabase* pDb  - то как с его помощью получить эти самые листы?
> ...во всех вставленных блоках
Это AcDbBlockReference?
> ...во внешних ссылках
Каким образом получить то что находится во внешних ссылках?
> Еще вопрос считать ли отдельно атрибуты блоков
да
> и вершины полилиний?
нет
> Что ты понимаешь под именем entity?
метку примитива
И последнее. В чертеже я вижу (автокадом) МНОГО каких-то объектов типа AcDbBlockReference
Однако когда я выполняю приведенных выше код (анализируя типы объектов внутри функции ReportEntity(pEntity) ),
то там этих AcDbBlockReference - всего несколько штук (3 или 4).
В чём дело? Подозреваю что доступ к ним организуется через какую-то другую таблицу а не через getBlockTable. Так это или нет? Если нет то какая таблица мне нужна для этого? И какие вообще таблицы я должен анализировать?
Спасибо.

Re: Как вывести список имён ВСЕХ Entity имеющихся в чертеже?

> Max
Когда имеется объект AcDbDatabase* pDb  — то как с его помощью получить эти самые листы?
Очень просто. В твоем коде есть pBTR->isLayout()) - вот если это условие выполняется, то это и есть блок листа.
Это AcDbBlockReference?
Именно.
Каким образом получить то что находится во внешних ссылках?
Если условие pBTR->isFromExternalReference() выполнено, то этот блок и есть внешняя ссылка.
метку примитива
Понятно. Ну если ты знаешь имя примитива (AcDbObjectId), то получить ее метку (AcDbHandle) не представляет труда (поищи по форуму мои примеры).
И последнее. В чертеже я вижу (автокадом) МНОГО каких-то объектов типа AcDbBlockReference
Однако когда я выполняю приведенных выше код (анализируя типы объектов внутри функции ReportEntity(pEntity) ),
то там этих AcDbBlockReference — всего несколько штук (3 или 4).
В чём дело?

Дело в том, что ты отсек условием (!pBTR->isLayout())) все листы и модель. А тебе именно они и нужны. Имеенно то, что находится в них ты и видешь в модели/листах. А то, что у тебя напечаталось в ReportEntity - это вложенные блоки.

Re: Как вывести список имён ВСЕХ Entity имеющихся в чертеже?

2 Александр Ривилис (2006-07-05 00:06:26)
>Дело в том, что ты отсек условием (!pBTR->isLayout())) все листы и модель.
O!!!!!
Спасибо огромное!!!  Вот что такое тырить код из примеров не делая пометок. Когда вставил его и творчески перерабатывал - думал что надо проверить что происходит в этом условии. Ну и успешно об этом позабыл.
А автокада я не знаю, не вопрос. Задачу повесили по принципу "похороны назначены на завтра, крутись как хочешь.." - кручусь.
Спасибо.

Re: Как вывести список имён ВСЕХ Entity имеющихся в чертеже?

> Max
Пожалуйста! Надеюсь, что дату похорон перенесут. :)