Тема: AcDbBlockReference. Как получить примитивы блока?

Работаю с ARX всего пару дней. В данный момент неясно как получить примитивы блока. Если кто-то может подсказать, буду рад.
Заранее спасибо!

Re: AcDbBlockReference. Как получить примитивы блока?

вам нужно получить AcDbBlockTableRecord и путем прохождения итератором по BlockTableRecord вы получите все примитивы

Re: AcDbBlockReference. Как получить примитивы блока?

Ну я так примерно и делал. Код представлен ниже.
Проблема в том что getEntity() мне снова возвращает указатель на AcDbBlockReference причем тотже.

CString name;
name=pEnt->isA()->name();
AcDbBlockReference* tmpRef;
if((tmpRef=AcDbBlockReference::cast(pEnt))!=NULL){
   //This function returns the object ID of the AcDbBlockTableRecord
   //referenced by the block reference.
   AcDbObjectId tmpId=tmpRef->blockTableRecord();
   AcDbObject* tmpObj;
   acdbOpenObject(tmpObj,tmpId,AcDb::kForRead);
   CString name;
   name=tmpObj->isA()->name();
   AcDbBlockTableRecord *tmpRecord;
   tmpRecord=AcDbBlockTableRecord::cast(tmpObj);
   AcDbBlockTableRecordIterator *pBtrIterTmp ;
   if ( (es =tmpRecord->newIterator (pBtrIterTmp) ) != Acad::eOk ) {
      acutPrintf ("\nCouldn't create Model Space iterator.") ;
      tmpRecord->close () ;
      return ;
   }
   AcDbEntity *tmpPEnt;
   for ( pBtrIterTmp->start (); !pBtrIterTmp->done () ; pBtrIterTmp->step () ) {
     if ( (es =pBtrIter->getEntity (tmpPEnt, AcDb::kForRead)) != Acad::eOk )
         acutPrintf ("\nCouldn't open entity.");
     continue ;
     }
     name=tmpPEnt->isA()->name();
   }
}

Re: AcDbBlockReference. Как получить примитивы блока?

> Serhiy
Посмотри этот пример получения информации из блока:

static void BlockRefIterate(void)
{
  ads_name en;
  ads_point p;
  Acad::ErrorStatus es;
  if (acedEntSel("\nУкажите блок для получения информации: ",en,p) == RTNORM) {
    AcDbObjectId objId; acdbGetObjectId(objId,en);
    AcDbObjectPointer<AcDbBlockReference> pEnt(objId,AcDb::kForRead);
    if ((es = pEnt.openStatus()) == Acad::eOk) {
      AcDbObjectId objBTRId = pEnt->blockTableRecord();
      AcDbObjectPointer<AcDbBlockTableRecord> pBTR(objBTRId,AcDb::kForRead);
      if ((es = pBTR.openStatus()) == Acad::eOk) {
        AcDbBlockTableRecordIterator *pIterBTR = NULL;
        if ((es = pBTR->newIterator(pIterBTR)) == Acad::eOk) {
          for (;!pIterBTR->done();pIterBTR->step()) {
            AcDbObjectId objSubId;
            if ((es = pIterBTR->getEntityId(objSubId)) == Acad::eOk) {
              AcDbObjectPointer<AcDbEntity> pSubEnt(objSubId,AcDb::kForRead);
              if ((es = pSubEnt.openStatus()) == Acad::eOk) {
                //
                // Здесь можно работать с примитивами в блоке
                //
                acutPrintf("\nПримитив: %s",pSubEnt->isA()->name());
                AcDbAttributeDefinition *pAttdef = AcDbAttributeDefinition::cast(pSubEnt.object());
                //
                // Если это определение атрибута сделаем отдельную обработку
                //
                if (pAttdef) {
                  acutPrintf("-> Tag=%s Value=%s IsConst=%s IsPreset=%s IsInvisible=%s isVerifiable=%s",
                              pAttdef->tagConst(), pAttdef->textStringConst(),
                              (pAttdef->isConstant()?"Yes":"No"),
                              (pAttdef->isPreset()?"Yes":"No"),
                              (pAttdef->isInvisible()?"Yes":"No"),
                              (pAttdef->isVerifiable()?"Yes":"No")
                  );
                }
              } else {
                acutPrintf("\nНе удалось открыть примитив в блоке! Ошибка: %s",
                           acadErrorStatusText(es));
              }
            } else {
              acutPrintf("\nНе удалось получить AcDbObjectId примитва в блоке! Ошибка: %s",
                         acadErrorStatusText(es));
            }
          }
        } else {
          acutPrintf("\nНе удалось создать итератор для записи таблицы блоков! Ошибка: %s", acadErrorStatusText(es));
        }
      } else {
        acutPrintf("\nНе удалось открыть запись таблицы блоков! Ошибка: %s", acadErrorStatusText(es));
      }
      //
      //  Получаем информацию о неконстантных атрибутах в блоке
      //
      AcDbObjectIterator *pAttrIter = pEnt->attributeIterator();
      if (pAttrIter) {
        for (pAttrIter->start();!pAttrIter->done();pAttrIter->step()) {
          AcDbObjectId objAttrId = pAttrIter->objectId();
          AcDbObjectPointer<AcDbAttribute> pAttr(objAttrId,AcDb::kForRead);
          if ((es = pAttr.openStatus()) == Acad::eOk) {
            //
            // Здесь можно получить информацию об атрибуте
            //
            acutPrintf("\nАтрибут: Tag=%s Value=%s IsConst=%s IsPreset=%s IsInvisible=%s isVerifiable=%s",
                       pAttr->tagConst(), pAttr->textStringConst(),
                      (pAttr->isConstant()?"Yes":"No"),
                      (pAttr->isPreset()?"Yes":"No"),
                      (pAttr->isInvisible()?"Yes":"No"),
                      (pAttr->isVerifiable()?"Yes":"No")
            );
          } else {
            acutPrintf("\nНе удалось открыть атрибут блока! Ошибка: %s", acadErrorStatusText(es));
          }
        }
      }
    } else if (es == Acad::eNotThatKindOfClass) {
      acutPrintf("\nЭто не блок!");
    } else {
      acutPrintf("\nНе удалось открыть блок! Ошибка: %s", acadErrorStatusText(es));
    }
  }
}