删除块定义以及删除块参照

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);

posted @ 2020-03-10 14:51  久龄  阅读(44)  评论(0编辑  收藏  举报