天气与日历 切换到窄版

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

ObjectArx块操作封装

[复制链接]
  • TA的每日心情
    开心
    2024-5-11 06:18
  • 签到天数: 49 天

    [LV.5]常住居民I

    185

    主题

    150

    回帖

    1695

    积分

    管理员

    积分
    1695
    发表于 2024-5-4 10:45:06 | 显示全部楼层 |阅读模式
    得到块定义中的所有实体id(通过块名和数据库指针)
    1. //************************************
    2. // Summary:  得到块定义中的所有实体id(通过块名和数据库指针)
    3. // Parameter:
    4. //      arrid -    输出块定义中所有实体id集合
    5. //      szBlkTblRcdName -    输入块表记录名(块定义名、块名)(模型空间的名字是:ACDB_MODEL_SPACE)
    6. //      pDb -    输入块定义所在数据库指针
    7. // Return:       
    8. // Update Time: 2021-7-16 16:06:42    peihaodong
    9. //************************************
    10. bool PhdArxBlock::GetAllEntId(AcDbObjectIdArray& arrid, LPCTSTR szBlkTblRcdName, AcDbDatabase* pDb /*= acdbCurDwg()*/) const
    11. {
    12.         AcDbBlockTableRecordPointer pBlkTblRcd(szBlkTblRcdName, pDb, AcDb::kForRead);
    13.         if (pBlkTblRcd.openStatus() != Acad::eOk)
    14.                 return false;

    15.         AcDbBlockTableRecordIterator* pBTRIter = NULL;
    16.         Acad::ErrorStatus es = pBlkTblRcd->newIterator(pBTRIter);
    17.         if (Acad::eOk != es)
    18.                 return false;
    19.         //绑定智能指针
    20.         std::unique_ptr<AcDbBlockTableRecordIterator> apBTRIter(pBTRIter);

    21.         for (apBTRIter->start(); !apBTRIter->done(); apBTRIter->step())
    22.         {
    23.                 AcDbEntity* pTempEnt = NULL;
    24.                 es = apBTRIter->getEntity(pTempEnt, AcDb::kForRead);
    25.                 if (Acad::eOk != es)
    26.                         continue;
    27.                 arrid.append(pTempEnt->objectId());
    28.                 pTempEnt->close();
    29.         }

    30.         return true;
    31. }
    复制代码

     

     

     

     

    ObjectArx块操作封装
    哎...膜结构车棚,签到来了1...
  • TA的每日心情
    开心
    2024-5-11 06:18
  • 签到天数: 49 天

    [LV.5]常住居民I

    185

    主题

    150

    回帖

    1695

    积分

    管理员

    积分
    1695
     楼主| 发表于 2024-5-4 10:45:22 | 显示全部楼层
    2、得到块定义中的所有实体id(通过块定义id)
    1. //************************************
    2. // Summary:  得到块定义中的所有实体id(通过块定义id)
    3. // Parameter:
    4. //      arrid -    输出块定义中所有实体id集合
    5. //      idBlkTblRcd -    输入块表记录id
    6. // Return:       
    7. // Update Time: 2021-7-16 16:08:35    peihaodong
    8. //************************************
    9. bool PhdArxBlock::GetAllEntId(AcDbObjectIdArray& arrid, const AcDbObjectId& idBlkTblRcd) const
    10. {
    11.         AcDbBlockTableRecordPointer pBlkTblRcd(idBlkTblRcd, AcDb::kForRead);
    12.         Acad::ErrorStatus es = pBlkTblRcd.openStatus();
    13.         if (es != Acad::eOk)
    14.                 return false;

    15.         AcDbBlockTableRecordIterator* pBTRIter = NULL;
    16.         es = pBlkTblRcd->newIterator(pBTRIter);
    17.         if (Acad::eOk != es)
    18.                 return false;
    19.         //绑定智能指针
    20.         std::unique_ptr<AcDbBlockTableRecordIterator> apBTRIter(pBTRIter);

    21.         for (apBTRIter->start(); !apBTRIter->done(); apBTRIter->step())
    22.         {
    23.                 AcDbEntity* pTempEnt = NULL;
    24.                 es = apBTRIter->getEntity(pTempEnt, AcDb::kForRead);
    25.                 if (Acad::eOk != es)
    26.                         continue;
    27.                 arrid.append(pTempEnt->objectId());
    28.                 pTempEnt->close();
    29.         }

    30.         return true;
    31. }
    复制代码

     

     

     

     

    ObjectArx块操作封装
    哎...膜结构车棚,签到来了1...
  • TA的每日心情
    开心
    2024-5-11 06:18
  • 签到天数: 49 天

    [LV.5]常住居民I

    185

    主题

    150

    回帖

    1695

    积分

    管理员

    积分
    1695
     楼主| 发表于 2024-5-4 10:45:36 | 显示全部楼层
    3、得到块定义id(通过块名和数据库指针)
    1. //************************************
    2. // Summary:  得到块定义id(通过块名和数据库指针)
    3. // Parameter:
    4. //      idBlkDef -    输出块定义id
    5. //      szBlkName -    输入块名
    6. //      pDb -    输入该块所在的数据库指针
    7. // Return:       
    8. // Update Time: 2021-7-16 16:20:52    peihaodong
    9. //************************************
    10. bool PhdArxBlock::GetBlkDefId(AcDbObjectId& idBlkDef, LPCTSTR szBlkName, AcDbDatabase* pDb /*= acdbCurDwg()*/) const
    11. {
    12.         AcDbBlockTableRecordPointer pBlkTblRec(szBlkName, pDb, AcDb::kForRead);
    13.         if (Acad::eOk != pBlkTblRec.openStatus())
    14.                 return false;

    15.         idBlkDef = pBlkTblRec->objectId();
    16.         return true;
    17. }
    复制代码

     

     

     

     

    ObjectArx块操作封装
    哎...膜结构车棚,签到来了1...
  • TA的每日心情
    开心
    2024-5-11 06:18
  • 签到天数: 49 天

    [LV.5]常住居民I

    185

    主题

    150

    回帖

    1695

    积分

    管理员

    积分
    1695
     楼主| 发表于 2024-5-4 10:45:50 | 显示全部楼层
    得到块定义id(通过块参照id)
    1. bool PhdArxBlock::GetBlkDefId(AcDbObjectId& idBlkDef, const AcDbObjectId& idBlkRef) const
    2. {
    3.         AcDbObjectPointer<AcDbBlockReference> pRef(idBlkRef, AcDb::kForRead);
    4.         if (Acad::eOk != pRef.openStatus())
    5.                 return false;

    6.         idBlkDef = pRef->blockTableRecord();
    7.         return true;
    8. }
    复制代码

     

     

     

     

    ObjectArx块操作封装
    哎...膜结构车棚,签到来了1...
  • TA的每日心情
    开心
    2024-5-11 06:18
  • 签到天数: 49 天

    [LV.5]常住居民I

    185

    主题

    150

    回帖

    1695

    积分

    管理员

    积分
    1695
     楼主| 发表于 2024-5-4 10:46:04 | 显示全部楼层
    得到块定义id(通过图纸、块名和数据库指针;如果数据库中没有该块定义,就从目标图纸中拷贝到指定数据库中)
    1. bool PhdArxBlock::GetBlkDefId(AcDbObjectId& idBlkDef, LPCTSTR szDwgPath, LPCTSTR szBlkName, AcDbDatabase* pDb /*= acdbCurDwg()*/) const
    2. {
    3.         AcDbBlockTableRecordPointer pInsertBlkTblRcd(szBlkName, pDb, AcDb::kForRead);
    4.         if (Acad::eOk == pInsertBlkTblRcd.openStatus())
    5.         {
    6.                 idBlkDef = pInsertBlkTblRcd->objectId();//当前数据库存在该块,返回该块定义id
    7.                 return true;
    8.         }

    9.         //打开图纸
    10.         AcDbDatabase* pDbDwg = new AcDbDatabase(false);
    11.         std::unique_ptr<AcDbDatabase> apDbDwg(pDbDwg);
    12.         //Acad::ErrorStatus es = apDbDwg->readDwgFile(szDwgPath, _SH_DENYNO);//zrx2010
    13.         Acad::ErrorStatus es = apDbDwg->readDwgFile(szDwgPath, AcDbDatabase::kForReadAndAllShare);//arx2017
    14.         if (Acad::eOk != es)
    15.                 return false;
    16.        
    17.         //从图纸数据库得到块定义id
    18.         AcDbObjectId idTempBlkDef = AcDbObjectId::kNull;
    19.         if (!GetBlkDefId(idTempBlkDef, szBlkName, apDbDwg.get()))
    20.                 return false;

    21.         //将图纸数据库中的块定义拷贝到pDb数据库中
    22.         if (!g_ArxDatabase->DbCopyOfBlock(apDbDwg.get(), idTempBlkDef, pDb, szBlkName, idBlkDef))
    23.                 return false;

    24.         return true;
    25. }
    复制代码

     

     

     

     

    ObjectArx块操作封装
    哎...膜结构车棚,签到来了1...
  • TA的每日心情
    开心
    2024-5-11 06:18
  • 签到天数: 49 天

    [LV.5]常住居民I

    185

    主题

    150

    回帖

    1695

    积分

    管理员

    积分
    1695
     楼主| 发表于 2024-5-4 10:46:18 | 显示全部楼层
    、得到所有的块定义名(得到数据库中所有的块名)
    1. bool PhdArxBlock::GetAllBlkDefName(AcArray<CString>& arrBlkDefName, AcDbDatabase* pDb /*= acdbCurDwg()*/) const
    2. {
    3.         AcDbBlockTablePointer pBlkTbl(pDb, AcDb::kForRead);
    4.         if (Acad::eOk != pBlkTbl.openStatus())
    5.                 return false;
    6.         AcDbBlockTableIterator* pIt = NULL;
    7.         Acad::ErrorStatus es = pBlkTbl->newIterator(pIt);
    8.         if (Acad::eOk != es)
    9.                 return false;
    10.         std::unique_ptr<AcDbBlockTableIterator> apIt(pIt);

    11.         for (apIt->start(); !apIt->done(); apIt->step())
    12.         {
    13.                 AcDbBlockTableRecord* pBTRecord = NULL;
    14.                 if (apIt->getRecord(pBTRecord, AcDb::kForRead) == Acad::eOk)
    15.                 {
    16.                         TCHAR* szName = NULL;
    17.                         pBTRecord->getName(szName);
    18.                         CString BlockName = szName;
    19.                         if (_tcslen(szName) > 0)//过滤掉名称为空的块表;
    20.                         {
    21.                                 if (BlockName.Find(_T("Model_Space")) == -1 && BlockName.Find(_T("Paper_Space")) == -1)
    22.                                         arrBlkDefName.append(BlockName);
    23.                         }
    24.                         acutDelString(szName);//必须清除动态字符串;
    25.                         pBTRecord->close();
    26.                 }
    27.         }

    28.         return true;
    29. }
    复制代码

     

     

     

     

    ObjectArx块操作封装
    哎...膜结构车棚,签到来了1...
  • TA的每日心情
    开心
    2024-5-11 06:18
  • 签到天数: 49 天

    [LV.5]常住居民I

    185

    主题

    150

    回帖

    1695

    积分

    管理员

    积分
    1695
     楼主| 发表于 2024-5-4 10:46:34 | 显示全部楼层
    7、得到所有的块定义id(得到数据库中所有的块定义id)
    1. bool PhdArxBlock::GetAllBlkDefId(AcDbObjectIdArray& arridBlkDef, AcDbDatabase* pDb /*= acdbCurDwg()*/) const
    2. {
    3.         AcDbBlockTablePointer pBlkTbl(pDb, AcDb::kForRead);
    4.         if (Acad::eOk != pBlkTbl.openStatus())
    5.                 return false;
    6.         AcDbBlockTableIterator* pIt = NULL;
    7.         Acad::ErrorStatus es = pBlkTbl->newIterator(pIt);
    8.         if (Acad::eOk != es)
    9.                 return false;
    10.         std::unique_ptr<AcDbBlockTableIterator> apIt(pIt);

    11.         for (apIt->start(); !apIt->done(); apIt->step())
    12.         {
    13.                 AcDbBlockTableRecord* pBTRecord = NULL;
    14.                 if (apIt->getRecord(pBTRecord, AcDb::kForRead) == Acad::eOk)
    15.                 {
    16.                         TCHAR* szName = NULL;
    17.                         pBTRecord->getName(szName);
    18.                         CString BlockName = szName;
    19.                         if (_tcslen(szName) > 0)//过滤掉名称为空的块表;
    20.                         {
    21.                                 if (BlockName.Find(_T("Model_Space")) == -1 && BlockName.Find(_T("Paper_Space")) == -1)
    22.                                         arridBlkDef.append(pBTRecord->objectId());
    23.                         }
    24.                         acutDelString(szName);//必须清除动态字符串;
    25.                         pBTRecord->close();
    26.                 }
    27.         }

    28.         return true;
    29. }
    复制代码

     

     

     

     

    ObjectArx块操作封装
    哎...膜结构车棚,签到来了1...
  • TA的每日心情
    开心
    2024-5-11 06:18
  • 签到天数: 49 天

    [LV.5]常住居民I

    185

    主题

    150

    回帖

    1695

    积分

    管理员

    积分
    1695
     楼主| 发表于 2024-5-4 10:47:57 | 显示全部楼层
    objectARX 定义块、删除定义块或快参照
    1. 1. 如何定义块

    2. 2. 根据定义删除块(块参照)

    3. 第一步:通过块定义名称找到实体idlist

    4. 当前图形数据库-->块表-->检查该块定义是否在块表存在-->存在,则通过定义名称,找到实体idlist

    5. 第二步:遍历块表的实体id,若属于某定义块idlist且存在块参照,则设置实体为不透明;

    6. setColorIndex //对于单色OLED,此函数功能为是否显示对象。可以理解为透明还是不透明。对于有灰度值的屏幕则是一个灰度值,此函数功能为设置实体的颜色
    7. 1)方法定义

    8.    u8g.setColorIndex(uint8_t color_index)   
    9. 2)参数
    10. color_index:
    11. ①1:表示显示,不透明

    12. ②0:表示不显示,透明。

    13. pBlkTblRcd->newIterator(pIte)  遍历

    14. pEnt->isKindOf(AcDbBlockReference::desc())   

    15. ::desc() 返回调用该函数的对象类型;

    16. ClassA调用isKindOf(classB) 若ClassA与ClassB一致,或者递归ClassA父类,存在ClassA是ClassB的派生类,则为true

    17. void CArrowsBlock::DeleteBlockRefByBlockName( CString& strBlockName )
    18. {
    19.         AcDbObjectId objId;
    20.         bool bBlock = CArrowsBlock::IsBlock(strBlockName,objId);

    21.         acutPrintf(_T("\n bBlock = %d"),bBlock);

    22.         // 获得当前图形数据库的块表
    23.         AcDbBlockTable *pBlkTbl;
    24.         acdbHostApplicationServices()->workingDatabase() ->getBlockTable(pBlkTbl, AcDb::kForWrite);   

    25.         // 创建新的块表记录
    26.         AcDbBlockTableRecord *pBlkTblRcd = NULL;
    27.         pBlkTbl->getAt(ACDB_MODEL_SPACE,pBlkTblRcd,kForRead);
    28.         pBlkTbl->close();

    29.         AcDbBlockTableRecordIterator *pIte = NULL;
    30.        
    31.         Acad::ErrorStatus es;
    32.         es = pBlkTblRcd->newIterator(pIte);
    33.         AcDbEntity *pEnt = NULL;
    34.         int i = 0;
    35.         for(pIte->start(); !pIte->done(); pIte->step())
    36.         {
    37.                 i++;
    38.                 acutPrintf(_T("\n i = %d"),i);
    39.                 pIte->getEntity(pEnt,AcDb::kForWrite);

    40.                 if (pEnt->id() == objId)
    41.                 {
    42.                         bool dd = pEnt->isKindOf(AcDbBlockReference::desc());
    43.                         acutPrintf(_T("\n 块参照 = %d"),dd);
    44.                         if (dd)
    45.                         {
    46.                                 es = pEnt->setColorIndex(1);
    47.                         }
    48.                 }
    49.                
    50.                 pEnt->close();
    51.         }
    52.         delete pIte;
    53.         pBlkTblRcd->close();
    54. }

    55. bool CArrowsBlock::IsBlock(const CString& strBlkName,AcDbObjectId& blkDefId)
    56. {
    57.         // 获得块定义名称  
    58.         CString strBlkDef = strBlkName;

    59.         // 获得当前数据库的块表
    60.         AcDbBlockTable *pBlkTbl;
    61.         acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlkTbl, AcDb::kForWrite);

    62.         // 查找用户指定的块定义是否存在
    63.         if (!pBlkTbl->has(strBlkDef))  
    64.         {
    65.                 acutPrintf(_T("\n 当前图形中未包含指定名称的块定义!"));
    66.                 pBlkTbl->close();  

    67.                 return false;  
    68.         }
    69.         else
    70.         {
    71.                 acutPrintf(_T("\n 当前图形中找到!"));
    72.                 // 获得用户指定的块表记录      
    73.                 pBlkTbl->getAt(strBlkDef, blkDefId);
    74.                 acutPrintf(_T("\n ID = %x!"),blkDefId);
    75.                 pBlkTbl->close();
    76.                 return true;
    77.         }
    78. }
    复制代码

     

     

     

     

    ObjectArx块操作封装
    哎...膜结构车棚,签到来了1...
  • TA的每日心情
    开心
    2024-5-11 06:18
  • 签到天数: 49 天

    [LV.5]常住居民I

    185

    主题

    150

    回帖

    1695

    积分

    管理员

    积分
    1695
     楼主| 发表于 2024-5-4 10:49:14 | 显示全部楼层
    ObjectARX 得到快参照名称、插入图块
    1. //功能:得到快参照名称
    2. CString GetBlkName(AcDbEntity* pEnt);

    3. CString CZzzBlock::GetBlkName(AcDbEntity* pEnt)
    4. {
    5.         CString strBlkName;
    6.         AcDbBlockReference* pBlock = AcDbBlockReference::cast(pEnt);
    7.         AcDbObjectId idBlkDef = pBlock->blockTableRecord();

    8.         AcDbBlockTableRecordPointer pBlkTblRcd(idBlkDef, AcDb::kForRead);
    9.         if (Acad::eOk != pBlkTblRcd.openStatus())
    10.                 return strBlkName;
    11.         TCHAR* szName = NULL;
    12.         pBlkTblRcd->getName(szName);
    13.         strBlkName = szName;

    14.         return strBlkName;
    15. }
    复制代码

     

     

     

     

    ObjectArx块操作封装
    哎...膜结构车棚,签到来了1...
  • TA的每日心情
    开心
    2024-5-11 06:18
  • 签到天数: 49 天

    [LV.5]常住居民I

    185

    主题

    150

    回帖

    1695

    积分

    管理员

    积分
    1695
     楼主| 发表于 2024-5-4 10:49:30 | 显示全部楼层
    //功能: 插入图块
    1. AcDbObjectId InsertBlock(LPCTSTR blockName, AcGePoint3d ptInsert, bool bExpolor = false);

    2. AcDbObjectId CZzzBlock::InsertBlock(LPCTSTR blockName, AcGePoint3d ptInsert, bool bExpolor /*= false*/)
    3. {
    4.         AcDbDatabase* pDb = acdbCurDwg();
    5.         AcDbBlockTable* pBlkTable;
    6.         AcDbObjectId blockId;
    7.         pDb->getBlockTable(pBlkTable, AcDb::kForRead);
    8.         if (pBlkTable->has(blockName))
    9.         {
    10.                 pBlkTable->getAt(blockName, blockId);
    11.                 //ads_point pt;
    12.                 //int rc = acedGetPoint(NULL, _T("\n请选择插入点"),pt);
    13.                 AcDbBlockReference* pBlkRef = new AcDbBlockReference(ptInsert, blockId);

    14.                 //获得模型空间块表记录
    15.                 AcDbBlockTable* pBlockTable;
    16.                 acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable, AcDb::kForRead);
    17.                 AcDbBlockTableRecord* pBlockTableRecord;
    18.                 pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);
    19.                 pBlockTable->close();
    20.                 pBlockTableRecord->appendAcDbEntity(blockId, pBlkRef);
    21.                 pBlockTableRecord->close();

    22.                 if (bExpolor)
    23.                 {
    24.                         pBlkRef->explodeToOwnerSpace();//插入图块时分解块。(必须在添加模型空间块表记录并关闭后再执行)
    25.                 }
    26.                 pBlkRef->close();
    27.         }
    28.         pBlkTable->close();
    29.         return blockId;
    30. }
    复制代码

     

     

     

     

    ObjectArx块操作封装
    哎...膜结构车棚,签到来了1...
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|中国膜结构网_中国空间膜结构协会

    GMT+8, 2024-5-19 02:58 , Processed in 0.070272 second(s), 23 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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