Тема: Не могу понять в чем ошибка при получении данных из AutoCAD
Вот такой вот кусок программного кода:
void ReadingDWGBloks(void) { //Подключение к таблице блоков AcDbBlockTable *pBlockTable; if ( (acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable,AcDb::kForRead)!=Acad::eOk) || (!pBlockTable) ){ acutPrintf("Не могу получить доступ к таблице блоков\n"); return; } //Создание итератора AcDbBlockTableIterator *pBlockTableIterator=NULL; if ( (pBlockTable->newIterator(pBlockTableIterator, true)!=Acad::eOk) || (!pBlockTableIterator) ){ acutPrintf("Ошибка создания итератора блоков: не хватает памяти\n"); return; } //Получение первой записи в таблице AcDbBlockTableRecord *pBlockTableRecord=NULL; if ( (pBlockTableIterator->getRecord(pBlockTableRecord,AcDb::kForRead)!=Acad::eOk) || (!pBlockTableRecord) ){ acutPrintf("Не могу получить запись таблицы через итератор блоков\n"); return; } //Печать списка блоков acutPrintf("Блоки текущего документа:\n"); char *BlockName; for(;!pBlockTableIterator->done();pBlockTableIterator->step()) { pBlockTableIterator->getRecord(pBlockTableRecord,AcDb::kForRead); pBlockTableRecord->getName(BlockName); acutPrintf("Блок %s:\n", BlockName); ReadingBlockReference(pBlockTableRecord); ReadingBlockRecordEntity(pBlockTableRecord); pBlockTableRecord->close(); } //Завершение работы закрываем открытые таблицы и удаляем итератор delete pBlockTableIterator; pBlockTable->close(); } void ReadingBlockReference(AcDbBlockTableRecord *pBlockTableRecord) { acutPrintf("Получаем Reference блока\n"); //Получаем содержимое блока AcDbObjectIdArray pObjectIdArray; if ( pBlockTableRecord->getBlockReferenceIds(pObjectIdArray)!=Acad::eOk ){ acutPrintf("Не могу получить доступ к содержимому блока\n"); return; } //Просматриваем все содержимое объекта AcDbBlockReference *pBlockReference; AcGePoint3d BlockPosition; for ( int i=0; i<pObjectIdArray.length(); ++i) { //Для каждого конкретного содержимого просматриваем из чего оно состоит if ( (acdbOpenObject(pBlockReference, pObjectIdArray.at(i), AcDb::kForWrite) == Acad::eOk) || (!pBlockReference) ){ if (pBlockReference->treatAsAcDbBlockRefForExplode()==Adesk::kFalse ) { BlockPosition=pBlockReference->position(); acutPrintf("Позиция: (%f,%f,%f)\n", BlockPosition[0], BlockPosition[1], BlockPosition[2]); } pBlockReference->close(); } } //delete pObjectIdArray; } void ReadingBlockRecordEntity(AcDbBlockTableRecord *pBlockTableRecord) { acutPrintf("Получаем Entity блока\n"); //Создание итератора AcDbBlockTableRecordIterator *pBlockTableRecordIterator=NULL; if ( (pBlockTableRecord->newIterator(pBlockTableRecordIterator, true)!=Acad::eOk) || (!pBlockTableRecordIterator) ){ acutPrintf("Ошибка создания итератора блоков: не хватает памяти\n"); return; } //Получение первой записи в таблице AcDbEntity *pEntity=NULL; if ( (pBlockTableRecordIterator->getEntity(pEntity,AcDb::kForRead)!=Acad::eOk) || (!pEntity) ){ acutPrintf("Не могу получить запись таблицы через итератор блоков\n"); return; } //Печать списка блоков acutPrintf("Содержимое блока текущего документа:\n"); AcDbText *pText=NULL; AcGePoint3d TextPosition; for(;!pBlockTableRecordIterator->done();pBlockTableRecordIterator->step()) { if ( (pBlockTableRecordIterator->getEntity(pEntity,AcDb::kForRead)==Acad::eOk) || !(!pEntity) ){ //AcDbHandle objHandle; //pEntity->getAcDbHandle(objHandle); //char handleStr[20]; //objHandle.getIntoAsciiBuffer(handleStr); if( (!strcmp(pEntity->isA()->name(),"AcDbText")) // || (!strcmp(pEntity->isA()->name(),"AcDbAttribute")) ){ if ((pText = AcDbText::cast(pEntity))!= NULL) { // Можно считывать текстовую информацию из pText: TextPosition=pText->position(); acutPrintf("Text: %s positon(%f,%f,%f)\n", pText->textString(), TextPosition[0], TextPosition[1], TextPosition[2]); } pText->close(); } pEntity->close(); } } //Завершение работы закрываем открытые таблицы и удаляем итератор delete pBlockTableRecordIterator; }
Если я вызываю обе функции (ReadingBlockReference и ReadingBlockRecordEntity), то автокад вылетает. Если же только одну, то все нормально. Может я где-то теряю память или, наоборот, закрываю, что-то лишнее?
Где-то читал, что автокад может глючить при работе с char*. Может из-за этого очень много памяти теряется?