db的层架:
AcDbDatabase(获得块表pOutDatabase->getBlockTable(pBlockTable, AcDb::kForRead);)
AcDbBlockTable(块表下可能有块记录或者其他的实体 通过这个遍历块表:AcDbBlockTableIterator *pIterator = NULL;)
AcDbBlockTableRecord(块记录可以是内部块或者外部块(pRecord->isFromExternalReference()) 块记录下面可能有块引用(外部块引用、内部块引用)或者其它的实体 通过这个遍历 AcDbBlockTableRecordIterator *pIterator = NULL;)
// 生成内部块引用
AcadEntityTool::BuildBlockReference(crossSectionSymbol, strBlockFile, L"剖切符号", pDb);
// 生成外部块引用
AcadEntityTool::BuildXRefDefBlockReference(this, strFilePath, strBlockName, pDb);
// db下有块表=》块表(AcDbBlockTable)下有多张块表记录=》遍历块表记录(AcDbBlockTableRecord)可以拿到所有的实体(pIter->getEntity(pEntity, AcDb::kForWrite);)
// 块表记录可以是内部块也可以是外部块
AcDbObjectId tableId = NULL;
AcDbBlockTable *pTable = NULL;
Acad::ErrorStatus es = pDb->getBlockTable(pTable, AcDb::kForRead);
if (Acad::eOk != es || pTable == NULL)
return NULL;
AcDbBlockTableRecord* pBlock = NULL;
pTable->getAt(_arrTablesInfo[flag].strBlockName, pBlock, kForWrite);
tableId = AcDbObjectId(pBlock->id());
pBlock->close();
pTable->close();;
return tableId;
// 删除dwg图纸快表记录的所有内容
AcDbBlockTableRecordIterator* pIter = NULL;
pBlock->newIterator(pIter);
while (!pIter->done())
{
AcDbEntity* pEntity = NULL;
pIter->getEntity(pEntity, AcDb::kForWrite);
if (NULL == pEntity)
{
pIter->step();
continue;
}
pEntity->erase();
pEntity->close();
pIter->step();
}
delete pIter;
pBlock->close();
AcStringArray attachBlks; // 需要Bind的外部块参照
AcStringArray detachBlks; // 需要拆离的外部参照数组
AcDbBlockTable *pBlockTable = NULL;
// 获得图例目录
CString strDbFileDir = pInDatabase->originalFileName();
strDbFileDir = CFileToolkit::GetFileDirectory(strDbFileDir);
// 获得块表
Acad::ErrorStatus es = pOutDatabase->getBlockTable(pBlockTable, AcDb::kForRead);
if (Acad::eOk != es || pBlockTable == NULL)
return;
AcDbBlockTableIterator *pIterator = NULL;
pBlockTable->newIterator(pIterator);
pBlockTable->close();
for (pIterator->start(); !pIterator->done(); pIterator->step())
{
AcDbBlockTableRecord *pRecord = NULL;
es = pIterator->getRecord(pRecord, AcDb::kForWrite);
if (Acad::eOk != es || pRecord == NULL)
continue;
// 处理外部块参照的块定义
if (pRecord->isFromExternalReference())
{
// 则把相对路径转成绝对路径
const ACHAR *pPath = NULL;
pRecord->pathName(pPath);
CString strFullFile;
LPTSTR lpXrefFile = strFullFile.GetBuffer(MAX_PATH * 2);
PathCombine(lpXrefFile, strDbFileDir, pPath);
strFullFile.ReleaseBuffer();
pRecord->setPathName(strFullFile);
// 块定义名称
AcString blockName;
pRecord->getName(blockName);
// 应用该块定义的外部块参照id
AcDbObjectIdArray objectArray;
pRecord->getBlockReferenceIds(objectArray);
// 有外部块参照的块定义需要重新加载图纸文件,否则从db中分离丢弃
if (!objectArray.isEmpty())
attachBlks.append(blockName);
else
detachBlks.append(blockName);
}
pRecord->close();
}
delete pIterator;