По имени блока, хочу определить все его Entity, в том числе и его Reference. Для этого испльзую вот такой кусок кода.
void CDWGFunctions::AddBlockEntity(char* BlockName, unsigned short BlockID)
{
//Подключение к таблице блоков
AcDbBlockTable *pBlockTable;
if (
(acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable,AcDb::kForRead)!=Acad::eOk)
|| (!pBlockTable)
){
acutPrintf("Не могу получить доступ к таблице блоков\n");
return;
}
AcDbBlockTableRecord* pBlockTableRecord=NULL;
if (
(pBlockTable->getAt(BlockName, pBlockTableRecord, AcDb::kForRead)!=Acad::eOk)
|| (!pBlockTableRecord)
){
acutPrintf("Блока с именем %s не найдено\n", BlockName);
return;
}
//acutPrintf("Получаем Entity блока\n");
//Создание итератора
AcDbBlockTableRecordIterator *pBlockTableRecordIterator=NULL;
if (
(pBlockTableRecord->newIterator(pBlockTableRecordIterator, true)!=Acad::eOk)
|| (!pBlockTableRecordIterator)
){
acutPrintf("Ошибка создания итератора блоков: не хватает памяти\n");
return;
}
Потом с помощью итератора бегаю по всем Entity:
AcDbEntity *pEntity=NULL;
for(pBlockTableRecordIterator->start();!pBlockTableRecordIterator->done();pBlockTableRecordIterator->step())
{
if (
(pBlockTableRecordIterator->getEntity(pEntity,AcDb::kForRead)==Acad::eOk)
|| !(!pEntity)
){
//Что-то делается
}
}
Далее ищу объекты типа AcDBReference
if (!strcmp(pEntity->isA()->name(),"AcDbBlockReference"))
{
AcDbBlockReference *pBlockReference=NULL;
AcGePoint3d EntityPosition;
if ((pBlockReference = AcDbBlockReference::cast(pEntity))!= NULL) {
// Можно считывать текстовую информацию из pBlockReference:
//acutPrintf("Reference %s\n", BlockName);
EntityPosition=pBlockReference->position();
ACHAR *layer=pBlockReference->layer();
DocVars.docData().TempObjects.AddBlockRef(EntityPosition[0], EntityPosition[1], EntityPosition[2], pBlockReference->rotation(), BlockID, layer);
acutDelString(layer);
}
pBlockReference=NULL;
}
И оказывается, что у объекта *Model_Space множество Reference-ов. А у многих объектом их вообще нет.
Если же мы получим окузатель на запись в таблице блоков pBlockReference>blockTableRecord() и посмотрим имя этой записи, то оказывается, что Reference принадлежит уже не *Model_Space, а правильному блоку.
Если же мы используем pEntity->blockid(), и запросим имя записи, то опять получаем *Model_Space
Вот такая вот особенность.