明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 601|回复: 3

如何修改嵌套块内的标注文字的颜色

[复制链接]
发表于 2024-11-18 20:16:14 | 显示全部楼层 |阅读模式
求助:
需要将某图层下的图块及图块内的实体改为随层的颜色,但是标注不行,即使改色了,也需要去块内编辑进去才能变色,有什么处理方法?
  1. void GrayEntity::Gray(AcDbDatabase* pDB)
  2. {
  3.     if (nullptr == pDB)
  4.         return;
  5.     //color by layer
  6.     AcCmColor byLayer;
  7.     byLayer.setColorIndex(256);
  8.     AcCmColor grayColor;
  9.     grayColor.setColorIndex(8);
  10.     //color by block
  11.     AcCmColor byBlock;
  12.     byBlock.setColorIndex(0);
  13.     const TCHAR* layerName = _T("T-建筑-底图");
  14.     //解锁该图层
  15.     AcDbLayerTableRecordPointer pLayerTableRecord(layerName, pDB, AcDb::kForWrite);
  16.     if (pLayerTableRecord.openStatus() != Acad::eOk)
  17.         return;
  18.     bool islocked = pLayerTableRecord->isLocked();
  19.     if (islocked)
  20.     {
  21.         pLayerTableRecord->setIsLocked(false);
  22.         pLayerTableRecord->setIsOff(pLayerTableRecord->isOff());
  23.     }
  24.     //设置所有标注样式
  25.     if (true)
  26.     {
  27.         AcDbDimStyleTablePointer pDimTable(pDB, AcDb::kForWrite);
  28.         if (Acad::eOk != pDimTable.openStatus())
  29.             return;
  30.         AcDbDimStyleTableIterator* pIterator = NULL;
  31.         pDimTable->newIterator(pIterator);
  32.         for (; !pIterator->done(); pIterator->step())
  33.         {
  34.             AcDbDimStyleTableRecord* pRecord = NULL;
  35.             if (Acad::eOk != pIterator->getRecord(pRecord, AcDb::kForWrite))
  36.                 continue;
  37.             //尺寸线颜色
  38.             pRecord->setDimclrd(byLayer);
  39.             //尺寸界线颜色
  40.             pRecord->setDimclre(byLayer);
  41.             //尺寸文字颜色
  42.             pRecord->setDimclrt(byLayer);
  43.             pRecord->close();
  44.         }
  45.         delete pIterator;
  46.     }
  47.     std::set<AcDbObjectId> idSet;
  48.     if (nullptr != pDB)
  49.     {
  50.         AcDbBlockTableRecordPointer pRE(ACDB_MODEL_SPACE, pDB, AcDb::kForWrite);
  51.         if (pRE.openStatus() != Acad::eOk)
  52.             return;
  53.         AcDbBlockTableRecordIterator* iter = nullptr;
  54.         Acad::ErrorStatus es = pRE->newIterator(iter);
  55.         for (iter->start(); !iter->done(); iter->step())
  56.         {
  57.             AcDbEntity* pEntity = nullptr;
  58.             es = iter->getEntity(pEntity, AcDb::kForWrite);
  59.             if (es != Acad::eOk)
  60.                 continue;
  61.             if (pEntity->layerId() == pLayerTableRecord->objectId() && pEntity->isKindOf(AcDbBlockReference::desc()))
  62.             {
  63.                 AcDbBlockReference* pRef = AcDbBlockReference::cast(pEntity);
  64.                 if (nullptr == pRef)
  65.                     continue;
  66.                 pRef->setColor(byLayer);
  67.                 AcDbObjectId BRID = pRef->blockTableRecord();
  68.                 idSet.insert(BRID);
  69.             }
  70.             pEntity->recordGraphicsModified();
  71.             pEntity->close();
  72.         }
  73.         delete iter;
  74.         iter = nullptr;
  75.     }
  76.     if (idSet.empty())
  77.     {
  78.         return;
  79.     }
  80.     //查找嵌套块
  81.     std::set<AcDbObjectId> allIDSet(idSet);
  82.     std::set<AcDbObjectId> nextIDSet;
  83.     std::set<AcDbObjectId> dimIDSet;
  84.     while (!idSet.empty())
  85.     {
  86.         for (auto ii = idSet.begin(); ii != idSet.end(); ++ii)
  87.         {
  88.             AcDbObjectId id = *ii;
  89.             AcDbBlockTableRecordPointer pRecord(id, AcDb::kForWrite);
  90.             if (Acad::eOk != pRecord.openStatus())
  91.                 continue;
  92.             //获取块内实体
  93.             AcDbBlockTableRecordIterator* iiter = nullptr;
  94.             Acad::ErrorStatus es = pRecord->newIterator(iiter);
  95.             if (es != Acad::eOk)
  96.                 continue;
  97.             for (iiter->start(); !iiter->done(); iiter->step())
  98.             {
  99.                 AcDbEntity* pEntity = nullptr;
  100.                 es = iiter->getEntity(pEntity, AcDb::kForWrite);
  101.                 if (es != Acad::eOk)
  102.                     continue;
  103.                 //如果是嵌套块
  104.                 if (pEntity->isKindOf(AcDbBlockReference::desc()))
  105.                 {
  106.                     AcDbBlockReference* pRef = AcDbBlockReference::cast(pEntity);
  107.                     AcDbObjectId BRID = pRef->blockTableRecord();
  108.                     if (allIDSet.count(BRID) == 0)
  109.                     {
  110.                         nextIDSet.insert(pRef->blockTableRecord());
  111.                         allIDSet.insert(pRef->blockTableRecord());
  112.                     }
  113.                     //处理属性块
  114.                     AcDbObjectIterator* pIter = pRef->attributeIterator();
  115.                     if (pIter != nullptr)
  116.                     {
  117.                         for (pIter->start(); !pIter->done(); pIter->step())
  118.                         {
  119.                             AcDbObjectId attID = pIter->objectId();
  120.                             AcDbObjectPointer<AcDbAttribute> pAttr(attID, AcDb::kForWrite);
  121.                             if (pAttr.openStatus() == Acad::eOk)
  122.                                 pAttr->setColor(byLayer);
  123.                         }
  124.                         delete pIter;
  125.                         pIter = nullptr;
  126.                     }
  127.                 }
  128.                 else if (pEntity->isKindOf(AcDbDimension::desc()))
  129.                 {
  130.                     AcDbDimension* pDIM = AcDbDimension::cast(pEntity);
  131.                     if (nullptr != pDIM)
  132.                     {
  133.                         pDIM->setDimclrt(byLayer);
  134.                         dimIDSet.insert(pDIM->objectId());
  135.                     }
  136.                 }
  137.                 es = pEntity->setColor(byLayer);
  138.                 pEntity->recordGraphicsModified();
  139.                 pEntity->close();
  140.             }
  141.             delete iiter;
  142.         }
  143.         idSet = nextIDSet;
  144.         nextIDSet.clear();
  145.     }
  146.     for (auto iter = dimIDSet.begin(); iter != dimIDSet.end(); ++iter)
  147.     {
  148.         AcDbObjectPointer<AcDbDimension> pDIM(*iter, AcDb::kForWrite);
  149.         if (pDIM.openStatus() == Acad::eOk)
  150.         {
  151.             pDIM->setDimclrt(byLayer);
  152.             pDIM->setColor(byLayer);
  153.             pDIM->recordGraphicsModified();
  154.         }
  155.     }
  156.     if (islocked)
  157.     {
  158.         pLayerTableRecord->setIsLocked(islocked);
  159.         pLayerTableRecord->setIsOff(pLayerTableRecord->isOff());
  160.     }
  161.     pLayerTableRecord.close();
  162. }
回复

使用道具 举报

发表于 2024-11-18 20:31:50 | 显示全部楼层
标注颜色应该是标注样式决定的,
而且改了样式之后要刷新一下,刷新函数如下:
https://www.cnblogs.com/JJBox/p/11354224.html

但是我记得没错的话,其实我也遍历过标注内部进行改颜色...
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-19 08:50:08 | 显示全部楼层
你有种再说一遍 发表于 2024-11-18 20:31
标注颜色应该是标注样式决定的,
而且改了样式之后要刷新一下,刷新函数如下:
https://www.cnblogs.com/JJB ...
  1. pDIM->recomputeDimBlock();


这个函数起作用了,谢大佬
回复 支持 反对

使用道具 举报

发表于 2024-11-20 15:28:33 | 显示全部楼层
思路,用vla方式历遍块内所有对象x,根据条件修改块内x,如果有块中块,则再调用函数自身处理,也就是递归的方式。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-12-27 11:28 , Processed in 0.233862 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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