Тема: AcDbBlockReference. Как получить примитивы блока?
Работаю с ARX всего пару дней. В данный момент неясно как получить примитивы блока. Если кто-то может подсказать, буду рад.
Заранее спасибо!
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → ObjectARX → AcDbBlockReference. Как получить примитивы блока?
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Работаю с ARX всего пару дней. В данный момент неясно как получить примитивы блока. Если кто-то может подсказать, буду рад.
Заранее спасибо!
вам нужно получить AcDbBlockTableRecord и путем прохождения итератором по BlockTableRecord вы получите все примитивы
Ну я так примерно и делал. Код представлен ниже.
Проблема в том что 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(); } }
> 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)); } } }
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → ObjectARX → AcDbBlockReference. Как получить примитивы блока?
Форум работает на PunBB, при поддержке Informer Technologies, Inc