天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 62|回复: 0

ObjectArxC++操作自定义实体的块参照

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
块定义(即为:块表记录,模型空间,图纸空间)。

块参照(即为块引用),块参照(块引用) 存在于模型空间或者布局空间。

块参照是块定义中的一组对象,通过修改块定义可以对块参照进行操作。

主要思路是:

锁定文档
获得当前图形数据库的块表。
创建新的块表记录。
设置块表记录的名称。
将块表记录添加到块表中。
向块表中添加块定义。
查找用户指定的块定义是否存在。
获得用户指定的块表记录。
向用户指定的块表记录中的块参照(即为块引用)进行添加、修改、删除等操作。
解锁文档。
修改块定义后,刷新块参照显示。
代码示例如下:

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

 

 

 

 

ObjectArxC++操作自定义实体的块参照
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

GMT+8, 2024-11-1 09:33 , Processed in 0.122563 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表