标签:
本例实现删除外部图纸中指定的块定义,在外部图纸当前模型空间中是没有该块定义的块参照存在。
代码如下:
void CBlockUtil::DeleteBlockDefFormOtherDwg(const TCHAR* fileName, const TCHAR* blkDefName) { // 使用_SH_DENYNO参数打开图形(只读打开),允许其它用户读写该文件 AcDbDatabase* pSourceDwg = new AcDbDatabase(Adesk::kFalse); Acad::ErrorStatus es = pSourceDwg->readDwgFile(fileName); if (es != Acad::eOk) { delete pSourceDwg; pSourceDwg = NULL; acutPrintf(TEXT("\n读入dwg图形错误, 图形名称: %s"), fileName); return; } // 打开外部图形数据库的块表,寻找给定名称的块表记录 AcDbBlockTable* pBlkTable = NULL; es = pSourceDwg->getBlockTable(pBlkTable, AcDb::kForWrite); AcDbBlockTableRecord *pBlkTabRcd; CString strBlkDef(blkDefName); if (pBlkTable->has(strBlkDef)) { pBlkTable->getAt(blkDefName, pBlkTabRcd, ZcDb::kForWrite); es = pBlkTabRcd->erase(); } else { acutPrintf(_T("\n在当前文件中不存在该块表!")); pBlkTable->close(); delete pSourceDwg; pSourceDwg = NULL; return; } pBlkTable->close(); pBlkTabRcd->close(); //保存更改后的数据库,这里一定不能少这句 es=pSourceDwg->saveAs(fileName); delete pSourceDwg; pSourceDwg = NULL; }
在上述中我们使用的是saveAs()来保存更改后的数据库,有时还可以使用save()来保存更改,在本例中使用save()会出现错误,具体原因还不清楚,以后多试试就可以了,就是这两种中的一种。
如果要删除当前图形中的块定义就简单多了,我们并不需要保存数据库的更改,代码如下:
AcDbBlockTable *pBlkTab; acdbHostApplicationServices()->workingDatabase() ->getBlockTable(pBlkTab, ZcDb::kForWrite); CString strBlk = _T("as"); AcDbBlockTableRecord *pBlkTabRcd; if (pBlkTab->has(strBlk)) { pBlkTab->getAt(strBlk, pBlkTabRcd, ZcDb::kForWrite); pBlkTabRcd->erase(); } else { return; } pBlkTab->close(); pBlkTabRcd->close();
标签:
原文地址:http://www.cnblogs.com/pengjun-shanghai/p/4895441.html