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));
}
}
}