天气与日历 切换到窄版

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

ObjectArx块操作封装

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 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块操作封装

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
 楼主| 发表于 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块操作封装

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
 楼主| 发表于 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块操作封装

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
 楼主| 发表于 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块操作封装

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
 楼主| 发表于 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块操作封装

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
 楼主| 发表于 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块操作封装

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
 楼主| 发表于 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块操作封装

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
 楼主| 发表于 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块操作封装

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
 楼主| 发表于 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块操作封装

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
 楼主| 发表于 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块操作封装
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-1 08:07 , Processed in 0.182216 second(s), 27 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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