Тема: Объекты блока

Здравствуйте! Подскажите, плз., как получить AcDbObjectId объектов, входящих в состав блока. Заранее благодарен.

Re: Объекты блока

1. Начнём с терминологии. Что понимаешь под блоком? Запись таблицы блоков (AcDbBlockTableRecord) или вставка блока (AcDbBlockReference)?
2. Если имеется в виду AcDbBlockTableRecord, то создаёшь итератор и проходишься им.
Вот пример, как установить атрибут видимости для всех примитивов в блоке:

    AcDbObjectPointer<AcDbBlockTableRecord> pCurSpace(acdbCurDwg()->currentSpaceId(),AcDb::kForRead);
    if (pCurSpace.openStatus() == Acad::eOk) {
      AcDbBlockTableRecordIterator *pIter = 0;   pCurSpace->newIterator(pIter);
      if (pIter) {
        for ( ; !pIter->done(); pIter->step()) {
          AcDbObjectId eId; pIter->getEntityId(eId);
          AcDbObjectPointer<AcDbEntity> pEnt(eId,AcDb::kForWrite);
          if (pEnt.openStatus() == Acad::eOk) {
            pEnt->setVisibility(AcDb::kVisible,true);
          }
        }
        delete pIter;
      }
    }

Re: Объекты блока

Нет. Это я знаю. Я имел ввиду AcDbBlockReference. Задача такова: нарисован блок (например круг+прямоугольник). Надо определить AcDbObjectId круга и прямоугольника. Я это делал при помощи acedNEntSel. работает. Но нужен автомат. Пробежался по базе - нашел вхождение блока (ну это как в Вашем примере), потом в найденый блок заглянул... и вот задача: узнать, из чего он состоит.

(изменено: Александр Ривилис, 21 февраля 2012г. 17:48:35)

Re: Объекты блока

Alex Alex пишет:

Нет. Это я знаю. Я имел ввиду AcDbBlockReference. Задача такова: нарисован блок (например круг+прямоугольник). Надо определить AcDbObjectId круга и прямоугольника.

Круг и прямоугольник - примитивы внутри AcDbBlockTableRecord. Так что с терминологией у тебя плохо.
Что ты об этом блоке знаешь? Его имя? Его AcDbObjectId?

// Массив AcDbObjectId из блока по его (т.е. AcDbBlockTableRecord) AcDbObjectId 
Acad::ErrorStatus ObjectIdArrayFromBlock(AcDbObjectId idBTR, AcDbObjectIdArray &ids)
{
    Acad::ErrorStatus es;
    AcDbBlockTableRecordPointer pBTR(idBTR,AcDb::kForRead);
    if ((es = pBTR.openStatus()) != Acad::eOk) return es;
    AcDbBlockTableRecordIterator *iter = NULL;  
    if ((es = pBTR->newIterator(iter)) != Acad::eOk) return es;
    if (iter) {
        AcDbObjectId eId;
        for (;!iter->done(); iter->step()) {
            if (iter->getEntityId(eId) == Acad::eOk) ids.append(eId);
        }
        delete iter;
    }
    return Acad::eOk;
}
// Массив AcDbObjectId из блока по его имени
Acad::ErrorStatus ObjectIdArrayFromBlock(ACHAR *blockName, AcDbObjectIdArray &ids)
{
    Acad::ErrorStatus es;
    AcDbBlockTableRecordPointer pBTR(blockName,acdbCurDwg(),AcDb::kForRead);
    if ((es = pBTR.openStatus()) != Acad::eOk) return es;
    AcDbBlockTableRecordIterator *iter = NULL;  
    if ((es = pBTR->newIterator(iter)) != Acad::eOk) return es;
    if (iter) {
        AcDbObjectId eId;
        for (;!iter->done(); iter->step()) {
            if (iter->getEntityId(eId) == Acad::eOk) ids.append(eId);
        }
        delete iter;
    }
    return Acad::eOk;
}

Re: Объекты блока

Спасибо! Это было именно то, чего мне не хватало.

Re: Объекты блока

А что если изначально была вставка блока AcDbBlockReference. Как перейти к блоку (AcDbBlockTableRecord) и по нему итерироваться?

Re: Объекты блока

у каждого экземпляра блока есть ссылка на главную таблицу:
AcDbBlockReference::blockTableRecord()

Re: Объекты блока

Dima пишет:

А что если изначально была вставка блока AcDbBlockReference. Как перейти к блоку (AcDbBlockTableRecord) и по нему итерироваться?

Возможно такой код будет интересен: Получение имени блока в ARX

Re: Объекты блока

Спасибо большое!!!
Вы мне очень помогли.