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;