|
块定义(即为:块表记录,模型空间,图纸空间)。
块参照(即为块引用),块参照(块引用) 存在于模型空间或者布局空间。
块参照是块定义中的一组对象,通过修改块定义可以对块参照进行操作。
主要思路是:
锁定文档
获得当前图形数据库的块表。
创建新的块表记录。
设置块表记录的名称。
将块表记录添加到块表中。
向块表中添加块定义。
查找用户指定的块定义是否存在。
获得用户指定的块表记录。
向用户指定的块表记录中的块参照(即为块引用)进行添加、修改、删除等操作。
解锁文档。
修改块定义后,刷新块参照显示。
代码示例如下:
1.创建块参照
/************************************************************************/
/*-------------------------InsertDwgBlockRef------------------------------------------*/
/*****日期:2020-11-19**************************************************/
/*****作者:zhaoanan****************************************************/
/*****函数功能:插入块引用******************************************/
/*****输入参数:dwgFileName********************************************************/
/*****输入参数:blkName********************************************************/
/*****输入参数:pDb********************************************************/
/*****输出参数:void**********************************************************************/
/*****返回值: 无*******************************************************************/
/************************************************************************/
AcDbObjectId CBlockUtil::InsertDwgBlockRef( const TCHAR* dwgFileName, const TCHAR* blkName, bool bOverwriteIfExist,
AcDbDatabase *pDb )
{
// 是否包含指定名称的块定义
AcDbObjectId pBlkTblRcdId = GetBlkDefId(blkName, pDb);
if (pBlkTblRcdId.isNull() || bOverwriteIfExist)
{
if (_taccess(dwgFileName, 0) != -1)
{
AcDbDatabase *pBlkDb = new AcDbDatabase(false);
Acad::ErrorStatus es = pBlkDb->readDwgFile(dwgFileName, _SH_DENYNO);
if (es == Acad::eOk)
{
es = pDb->insert(pBlkTblRcdId, blkName, pBlkDb);
acutPrintf(_T("\n 插入块表记录pBlkTblRcdId = %p"), pBlkTblRcdId);
if (es == Acad::eOk)
{
AcDbBlockReference* pBlkRef = new AcDbBlockReference();
pBlkRef->setDatabaseDefaults();
pBlkRef->setBlockTableRecord(pBlkTblRcdId);
// 判断指定的块表记录是否包含属性定义
AcDbObject *pObt = NULL;
if (acdbOpenObject(pObt, pBlkTblRcdId, AcDb::kForRead) == Acad::eOk)
{
if(pObt->isKindOf(AcDbBlockTableRecord::desc()))
{
AcDbBlockTableRecord* pBlkTblRcd = AcDbBlockTableRecord::cast(pObt);
pBlkTblRcd->upgradeOpen();
// 将实体添加到模型空间的块表记录
Acad::ErrorStatus es = pBlkTblRcd->appendAcDbEntity(pBlkRef);
pBlkTblRcd->downgradeOpen();
if (es != Acad::eOk)
{
pBlkTblRcd->close();
delete pBlkRef; // 添加失败时,要delete
pBlkRef = NULL;
return AcDbObjectId::kNull;
}
else if(es == Acad::eOk)
{
acutPrintf(_T("\n添加块引用&BlockReference.id = %p"), pBlkRef->id());
}
pBlkTblRcd->close();
}
}
if (pObt!=nullptr)
{
pObt->close();
}
if (pBlkRef!=nullptr)
{
pBlkRef->close();
}
}
else if (es != Acad::eOk)
{
CString strMsg;
strMsg.Format(TEXT("CBlockUtil::InsertDwgBlockDef函数, insert失败:%d."), (int)es);
AfxMessageBox(strMsg);
}
}
else
{
CString strMsg;
strMsg.Format(TEXT("CBlockUtil::InsertDwgBlockDef函数, readDwgFile失败:%d."), (int)es);
AfxMessageBox(strMsg);
}
delete pBlkDb;
}
else
{
AfxMessageBox(TEXT("CBlockUtil::InsertDwgBlockDef函数, 未找到指定的图块文件."));
}
}
return pBlkTblRcdId;
}
// 获得指定名称的块定义
AcDbObjectId CBlockUtil::GetBlkDefId( const TCHAR* blkDefName, AcDbDatabase *pDb )
{
AcDbBlockTable* pBlockTable = NULL;
Acad::ErrorStatus es = pDb->getBlockTable(pBlockTable, AcDb::kForRead);
AcDbObjectId blkDefId;
es = pBlockTable->getAt(blkDefName, blkDefId);
pBlockTable->close();
if (es == Acad::eOk)
{
return blkDefId;
}
else
{
return AcDbObjectId::kNull;
}
}
2.删除块参照
/************************************************************************/
/*-------------------------DelDwgBlockRef------------------------------------------*/
/*****日期:2020-11-19**************************************************/
/*****作者:zhaoanan****************************************************/
/*****函数功能:删除块参照******************************************/
/*****输入参数:dwgFileName********************************************************/
/*****输入参数:blkName********************************************************/
/*****输入参数:pDb********************************************************/
/*****输出参数:void**********************************************************************/
/*****返回值: 无*******************************************************************/
/************************************************************************/
void CBlockUtil::DelDwgBlockRef( const TCHAR* dwgFileName, const TCHAR* blkName, AcDbDatabase *pDb )
{
// 是否包含指定名称的块定义
AcDbObjectId pBlkTblRcdId = GetBlkDefId(blkName, pDb);
if (!pBlkTblRcdId.isNull())
{
acutPrintf(_T("\n 删除块表记录pBlkTblRcdId = %p"), pBlkTblRcdId);
if (_taccess(dwgFileName, 0) != -1)
{
AcDbDatabase *pBlkDb = new AcDbDatabase(false);
Acad::ErrorStatus es = pBlkDb->readDwgFile(dwgFileName, _SH_DENYNO);
if (es == Acad::eOk)
{
// 判断指定的块表记录是否包含属性定义
AcDbObject *pObt = NULL;
if (acdbOpenObject(pObt, pBlkTblRcdId, AcDb::kForRead) == Acad::eOk)
{
if(pObt->isKindOf(AcDbBlockTableRecord::desc()))
{
AcDbBlockTableRecord* pBlkTblRcd = AcDbBlockTableRecord::cast(pObt);
AcDbBlockTableRecordIterator *pIte = NULL;
pBlkTblRcd->newIterator(pIte);
AcDbEntity *pEnt = NULL;
for(pIte->start(); !pIte->done(); pIte->step())
{
pIte->getEntity(pEnt,AcDb::kForRead);
//获取实体类型
CString pEntName = pEnt->isA()->name();
//acutPrintf(_T("\n实体类型:%s"), pEntName);
if (pEnt->isKindOf(AcDbBlockReference::desc()))
{
AcDbBlockReference* pBlkRef = AcDbBlockReference::cast(pEnt);
acutPrintf(_T("\n删除块引用&BlockReference.id = %p"), pBlkRef->id());
pBlkRef->upgradeOpen();
pBlkRef->erase();
pBlkRef->downgradeOpen();
pBlkRef->close();
}
if (pEnt!=nullptr)
{
pEnt->close();
}
}
delete pIte;
pBlkTblRcd->upgradeOpen();
pBlkTblRcd->erase();
pBlkTblRcd->downgradeOpen();
pBlkTblRcd->close();
}
}
if (pObt!=nullptr)
{
pObt->close();
}
}
else
{
CString strMsg;
strMsg.Format(TEXT("CBlockUtil::DelDwgBlockDef函数, DelDwgBlockDef失败:%d."), (int)es);
AfxMessageBox(strMsg);
}
delete pBlkDb;
}
}
else
{
AfxMessageBox(TEXT("CBlockUtil::DelDwgBlockDef函数, 未找到指定的图块文件."));
}
}
//刷新块参照显示
void refreshBlockReference(AcDbBlockReference * pBlkRef)
{
if (pBlkRef == NULL)
{
return;
}
pBlkRef->recordGraphicsModified(true);
actrTransactionManager->queueForGraphicsFlush();
actrTransactionManager->flushGraphics();
acedUpdateDisplay();
} |
|