删除块定义以及指定的块中块(结合上一章)

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();
else
{
//cycleProcessing(pEnt, strBlockName);
_cycleProcessing(pEnt, strBlockName);
}
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();
}

void CTest5::cycleProcessing(AcDbEntity *pEnt, CString& deletBlockName)
{
AcDbVoidPtrArray pExps;
AcDbEntity *pExpEnt = NULL;

if (pEnt->explode(pExps) == Acad::eOk)
{
for (int i = 0; i < pExps.length(); i++)
{
pExpEnt = (AcDbEntity*)pExps[i];
if (pExpEnt->isKindOf(AcDbBlockReference::desc()))
{
AcDbBlockReference *pdBlkRec = AcDbBlockReference::cast(pExpEnt);
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 (deletBlockName.Compare(blockname) == 0)
{
pExpEnt->erase();
}
else
{
cycleProcessing(pExpEnt, deletBlockName);

}

if (acdbBTR)
acdbBTR->close();
if (pdBlkRec)
pdBlkRec->close();
}

if(pExpEnt)
pExpEnt->close();
}
}
}

void CTest5::_cycleProcessing(AcDbEntity *pEnt, CString& deletBlockName)
{
if (pEnt->isKindOf(AcDbBlockReference::desc()))
{
AcDbBlockReference *pBlkRef = AcDbBlockReference::cast(pEnt);
AcGeMatrix3d mat = pBlkRef->blockTransform();

AcDbBlockTableRecordPointer BlkTBRec_Ptr(pBlkRef->blockTableRecord(), AcDb::kForRead);
if (Acad::eOk == BlkTBRec_Ptr.openStatus())
{
AcDbBlockTableRecordIterator *pIt = NULL;
BlkTBRec_Ptr->newIterator(pIt);
for (pIt->start(); !pIt->done(); pIt->step())
{
AcDbEntity *pEntItem = NULL;
pIt->getEntity(pEntItem, AcDb::kForWrite);
if (pEntItem->isKindOf(AcDbBlockReference::desc()))
{
AcDbBlockReference *pdBlkRecf = AcDbBlockReference::cast(pEntItem);
AcDbObjectId id = pdBlkRecf->blockTableRecord();

AcDbBlockTableRecord *acdbBTR = NULL;
if (acdbOpenObject(acdbBTR, id, AcDb::kForRead) != eOk)
{
if (pdBlkRecf)
pdBlkRecf->close();
if (pEntItem)
pEntItem->close();
continue;
}
ACHAR* blockname;
acdbBTR->getName(blockname);

if (deletBlockName.Compare(blockname) == 0)
{
pEntItem->erase();
}
else
{
_cycleProcessing(pEntItem, deletBlockName);
}

if (acdbBTR)
acdbBTR->close();
if (pdBlkRecf)
pdBlkRecf->close();
}

if (pEntItem)
pEntItem->close();
}
delete pIt;
}
}

if (pEnt)
pEnt->close();
}

void CTest5::Start()
{
/*AcDbObjectIdArray entIds;
if (!CTest5::PromptSelectEnts(_T("请选择实体"), AcDbEntity::desc(), entIds))
return;

if (entIds.length() <= 0)
return;*/

TCHAR str[255];
acedGetString(0, _T("块定义名称:"), str);

CString name = str;
CTest5::deleteAcDbBlockReference(name);
CTest5::deleteAcDbBlockTableRecord(name);
}

posted @ 2020-03-10 16:04  久龄  阅读(54)  评论(0编辑  收藏  举报