明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1605|回复: 1

求指教求点评——自己写的一个文字样式替换函数

[复制链接]
发表于 2014-12-22 12:24:25 | 显示全部楼层 |阅读模式
本帖最后由 张和平 于 2014-12-22 12:26 编辑

以下是自己写的一个文字样式替换函数,个人感觉存在以下几个问题:
1、有时候会不彻底,
2、有时候会埋下崩溃的隐患
3、有待精简
4、有待提高效率
希望各位前辈指教点评,希望说得越详细越好,我可以好好学学!
谢谢!
  1. void CTextUtil::SetStyle(AcDbObjectId entId, AcDbObjectId styleId, std::vector<AcDbObjectId> escStyleIds)
  2. {
  3.   AcDbText *pText = NULL;  //单行文字
  4.   AcDbMText *pMText = NULL;  //多行文字
  5.   AcDbDimension *pDim = NULL;  //标注
  6.   AcDbAttributeDefinition *pAtt = NULL;  //属性
  7.   AcDbBlockReference *pBlkRef = NULL;  //块参照

  8.   if (Acad::eOk == acdbOpenObject(pText, entId, AcDb::kForWrite))
  9.   {
  10.     if (escStyleIds.size() > 0)
  11.     {
  12.       for (int i = 0; i < escStyleIds.size(); i++)
  13.       {
  14.         if (pText->textStyle() == escStyleIds[i])
  15.         {
  16.           //acutPrintf(TEXT("\n*** 这个块外单行文字的文字样式在免替换列表中"));
  17.           pText->close();
  18.           return;
  19.         }
  20.       }
  21.     }
  22.     pText->setTextStyle(styleId);
  23.     pText->close();
  24.     //acutPrintf(TEXT("\n*** 块外单行文字OK"));
  25.   }
  26.   else if (Acad::eOk == acdbOpenObject(pMText, entId, AcDb::kForWrite))
  27.   {
  28.     if (escStyleIds.size() > 0)
  29.     {
  30.       for (int i = 0; i < escStyleIds.size(); i++)
  31.       {
  32.         if (pMText->textStyle() == escStyleIds[i])
  33.         {
  34.           //acutPrintf(TEXT("\n*** 这个块外多行文字的文字样式在免替换列表中"));
  35.           pMText->close();
  36.           return;
  37.         }
  38.       }
  39.     }
  40.     pMText->setTextStyle(styleId);
  41.     pMText->close();
  42.     //acutPrintf(TEXT("\n*** 块外多行文字OK"));
  43.   }
  44.   else if (Acad::eOk == acdbOpenObject(pDim, entId, AcDb::kForWrite))
  45.   {
  46.     if (escStyleIds.size() > 0)
  47.     {
  48.       for (int i = 0; i < escStyleIds.size(); i++)
  49.       {
  50.         if (pDim->dimtxsty() == escStyleIds[i])
  51.         {
  52.           //acutPrintf(TEXT("\n*** 这个块外标注的文字样式在免替换列表中"));
  53.           pDim->close();
  54.           return;
  55.         }
  56.       }
  57.     }
  58.     pDim->setDimtxsty(styleId);
  59.     pDim->close();
  60.     //acutPrintf(TEXT("\n*** 块外标注OK"));
  61.   }
  62.   else if (Acad::eOk == acdbOpenObject(pAtt, entId, AcDb::kForWrite))
  63.   {
  64.     if (escStyleIds.size() > 0)
  65.     {
  66.       for (int i = 0; i < escStyleIds.size(); i++)
  67.       {
  68.         if (pAtt->textStyle() == escStyleIds[i])
  69.         {
  70.           //acutPrintf(TEXT("\n*** 这个块外属性的文字样式在免替换列表中"));
  71.           pAtt->close();
  72.           return;
  73.         }
  74.       }
  75.     }
  76.     pAtt->setTextStyle(styleId);
  77.     pAtt->close();
  78.     //acutPrintf(TEXT("\n*** 块外属性OK"));
  79.   }
  80.   else if (Acad::eOk == acdbOpenObject(pBlkRef, entId, AcDb::kForRead))
  81.   {
  82.     //acutPrintf(TEXT("\n*** 找到一个块参照"));
  83.     AcDbBlockTableRecord *pBlkTblRcd = NULL;
  84.     if (Acad::eOk == acdbOpenObject(pBlkTblRcd, pBlkRef->blockTableRecord(), AcDb::kForRead))
  85.     {
  86.       if (pBlkTblRcd->hasAttributeDefinitions())
  87.       {
  88.         AcDbObjectIterator *pAttIt = NULL;
  89.         pAttIt = pBlkRef->attributeIterator();
  90.         for (pAttIt->start(); !pAttIt->done(); pAttIt->step())
  91.         {
  92.           AcDbAttribute *pAtt = NULL;
  93.           if (pBlkRef->openAttribute(pAtt, pAttIt->objectId(), AcDb::kForWrite))
  94.           {
  95.             pAtt->setTextStyle(styleId);
  96.             pAtt->close();
  97.           }
  98.         }
  99.       }
  100.       AcDbBlockTableRecordIterator *pIt = NULL;
  101.       pBlkTblRcd->newIterator(pIt);
  102.       for (pIt->start(); !pIt->done(); pIt->step())
  103.       {
  104.         AcDbObjectId subEntId = NULL;
  105.         if (Acad::eOk == pIt->getEntityId(subEntId))
  106.         {
  107.           CTextUtil::SetStyle(subEntId, styleId, escStyleIds);
  108.         }
  109.       }
  110.       pBlkTblRcd->close();
  111.     }
  112.     pBlkRef->close();
  113.   }
  114.   return;
  115. }
发表于 2014-12-30 21:46:21 | 显示全部楼层
学习arx没那么好的气氛,只能多看书,张帆的不错,还有samples里面的例子也不错。如果有C++基础,arx就比较简单。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 07:14 , Processed in 0.166997 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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