删除外部dwg中指定的块定义

本例实现删除外部图纸中指定的块定义,在外部图纸当前模型空间中是没有该块定义的块参照存在。

代码如下:

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

 

posted on 2015-10-20 17:27  !!-阳光-!!  阅读(674)  评论(0编辑  收藏  举报

导航