删除块定义以及删除块参照
void CTest5::deleteAcDbBlockReference(CString& strBlockName)
{
// 获得当前图形数据库的块表
AcDbBlockTable *pBlkTbl;
acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlkTbl, AcDb::kForWrite);
// 创建新的块表记录
AcDbBlockTableRecord *pBlkTblRcd = NULL;
pBlkTbl->getAt(ACDB_MODEL_SPACE, pBlkTblRcd, kForRead);
pBlkTbl->close();
AcDbBlockTableRecordIterator *pIte = NULL;
Acad::ErrorStatus es;
es = pBlkTblRcd->newIterator(pIte);
AcDbEntity *pEnt = NULL;
for (pIte->start(); !pIte->done(); pIte->step())
{
pIte->getEntity(pEnt, AcDb::kForWrite);
if (pEnt->isKindOf(AcDbBlockReference::desc()))
{
AcDbBlockReference *pdBlkRec = AcDbBlockReference::cast(pEnt);
AcDbObjectId id = pdBlkRec->blockTableRecord();
AcDbBlockTableRecord *acdbBTR = NULL;
if (acdbOpenObject(acdbBTR, id, AcDb::kForRead) != eOk)
{
if (pdBlkRec)
pdBlkRec->close();
continue;
}
ACHAR* blockname;
acdbBTR->getName(blockname);
if (strBlockName.Compare(blockname) == 0)
pEnt->erase();
if (acdbBTR)
acdbBTR->close();
if (pdBlkRec)
pdBlkRec->close();
}
if (pEnt)
pEnt->close();
}
delete pIte;
pBlkTblRcd->close();
}
void CTest5::deleteAcDbBlockTableRecord(CString& strBlockName)
{
//获取当前图形数据库
AcDbBlockTable* pBlkTbl = NULL;
acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlkTbl, AcDb::kForWrite);
//查询块是否已存在
if (!pBlkTbl->has(strBlockName))
return;
//获取块的插入点
AcGePoint3d ptInsert(0, 0, 0);
//获取块表记录
AcDbObjectId blkDefId;
pBlkTbl->getAt(strBlockName, blkDefId);
pBlkTbl->close();
AcDbBlockTableRecord *pDBlkRe = NULL;
if (acdbOpenObject(pDBlkRe, blkDefId, AcDb::kForWrite) != eOk)
return;
ACHAR *name;
pDBlkRe->getName(name);
if (strBlockName.Compare(name) == 0)
pDBlkRe->erase();
if (pDBlkRe)
pDBlkRe->close();
}
test:
TCHAR str[255];
acedGetString(0, _T("块定义名称:"), str);
CString name = str;
CTest5::deleteAcDbBlockReference(name);
CTest5::deleteAcDbBlockTableRecord(name);