获取全部块定义ID
bool GetBTRIdOnDb(AcDbObjectIdArray& arrBTRId, AcDbDatabase* pDb )
{
AcDbBlockTablePointer pBlkTbl(pDb, AcDb::kForRead);
if (Acad::eOk != pBlkTbl.openStatus())
{
return false;
}
AcDbBlockTableIterator* pIt = NULL;
if (Acad::eOk != pBlkTbl->newIterator(pIt))
{
return false;
}
for (pIt->start(); !pIt->done(); pIt->step())
{
AcDbBlockTableRecord* pBTRecord = NULL;
if (Acad::eOk == pIt->getRecord(pBTRecord, AcDb::kForRead))
{
if (!pBTRecord->isLayout())
{
arrBTRId.append(pBTRecord->objectId());
}
pBTRecord->close();
}
}
DEL(pIt);
return true;
}
获取未使用块定义
bool GetUnusedBTRId(AcDbObjectIdArray& arrUnusedId)
{
AcDbObjectIdArray arrBTRId;
if (!GetBTRIdOnDb(arrBTRId))
{
return false;
}
for (int i = 0; i < arrBTRId.length(); i++)
{
auto id = arrBTRId.at(i);
AcDbBlockTableRecordPointer pBTRecord(id, AcDb::kForRead);
if (Acad::eOk != pBTRecord.openStatus())
{
continue;
}
AcDbObjectIdArray arrBlkRecId;
if (Acad::eOk != pBTRecord->getBlockReferenceIds(arrBlkRecId))
{
continue;
}
if (arrBlkRecId.length() == 0)
{
arrUnusedId.append(id);
}
}
return true;
}
删除未使用块定义
bool Delete()
{
AcDbObjectIdArray arrUnusedId;
do
{
arrUnusedId.removeAll();
if (!GetUnusedBTRId(arrUnusedId))
{
return false;
}
for (int i = 0; i < arrUnusedId.length(); i++)
{
AcDbBlockTableRecordPointer pBlkTblRcd(arrUnusedId.at(i), AcDb::kForWrite);
if (Acad::eOk != pBlkTblRcd.openStatus())
{
continue;
}
pBlkTblRcd->erase();
}
} while (arrUnusedId.length() != 0);
}