乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 23|回复: 1

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

[复制链接]

36

主题

128

帖子

5

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
272
发表于 2014-12-22 12:24:00 | 显示全部楼层 |阅读模式
以下是自己写的一个文字样式替换函数,个人感觉存在以下几个问题:
1、有时候会不彻底,
2、有时候会埋下崩溃的隐患
3、有待精简
4、有待提高效率
希望各位前辈指教点评,希望说得越详细越好,我可以好好学学!
谢谢!
  1. void CTextUtil::SetStyle(AcDbObjectId entId, AcDbObjectId styleId, std::vector 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 textStyle() == escStyleIds[i])
  13.         {
  14.           //acutPrintf(TEXT("\n*** 这个块外单行文字的文字样式在免替换列表中"));
  15.           pText->close();
  16.           return;
  17.         }
  18.       }
  19.     }
  20.     pText->setTextStyle(styleId);
  21.     pText->close();
  22.     //acutPrintf(TEXT("\n*** 块外单行文字OK"));
  23.   }
  24.   else if (Acad::eOk == acdbOpenObject(pMText, entId, AcDb::kForWrite))
  25.   {
  26.     if (escStyleIds.size() > 0)
  27.     {
  28.       for (int i = 0; i textStyle() == escStyleIds[i])
  29.         {
  30.           //acutPrintf(TEXT("\n*** 这个块外多行文字的文字样式在免替换列表中"));
  31.           pMText->close();
  32.           return;
  33.         }
  34.       }
  35.     }
  36.     pMText->setTextStyle(styleId);
  37.     pMText->close();
  38.     //acutPrintf(TEXT("\n*** 块外多行文字OK"));
  39.   }
  40.   else if (Acad::eOk == acdbOpenObject(pDim, entId, AcDb::kForWrite))
  41.   {
  42.     if (escStyleIds.size() > 0)
  43.     {
  44.       for (int i = 0; i dimtxsty() == escStyleIds[i])
  45.         {
  46.           //acutPrintf(TEXT("\n*** 这个块外标注的文字样式在免替换列表中"));
  47.           pDim->close();
  48.           return;
  49.         }
  50.       }
  51.     }
  52.     pDim->setDimtxsty(styleId);
  53.     pDim->close();
  54.     //acutPrintf(TEXT("\n*** 块外标注OK"));
  55.   }
  56.   else if (Acad::eOk == acdbOpenObject(pAtt, entId, AcDb::kForWrite))
  57.   {
  58.     if (escStyleIds.size() > 0)
  59.     {
  60.       for (int i = 0; i textStyle() == escStyleIds[i])
  61.         {
  62.           //acutPrintf(TEXT("\n*** 这个块外属性的文字样式在免替换列表中"));
  63.           pAtt->close();
  64.           return;
  65.         }
  66.       }
  67.     }
  68.     pAtt->setTextStyle(styleId);
  69.     pAtt->close();
  70.     //acutPrintf(TEXT("\n*** 块外属性OK"));
  71.   }
  72.   else if (Acad::eOk == acdbOpenObject(pBlkRef, entId, AcDb::kForRead))
  73.   {
  74.     //acutPrintf(TEXT("\n*** 找到一个块参照"));
  75.     AcDbBlockTableRecord *pBlkTblRcd = NULL;
  76.     if (Acad::eOk == acdbOpenObject(pBlkTblRcd, pBlkRef->blockTableRecord(), AcDb::kForRead))
  77.     {
  78.       if (pBlkTblRcd->hasAttributeDefinitions())
  79.       {
  80.         AcDbObjectIterator *pAttIt = NULL;
  81.         pAttIt = pBlkRef->attributeIterator();
  82.         for (pAttIt->start(); !pAttIt->done(); pAttIt->step())
  83.         {
  84.           AcDbAttribute *pAtt = NULL;
  85.           if (pBlkRef->openAttribute(pAtt, pAttIt->objectId(), AcDb::kForWrite))
  86.           {
  87.             pAtt->setTextStyle(styleId);
  88.             pAtt->close();
  89.           }
  90.         }
  91.       }
  92.       AcDbBlockTableRecordIterator *pIt = NULL;
  93.       pBlkTblRcd->newIterator(pIt);
  94.       for (pIt->start(); !pIt->done(); pIt->step())
  95.       {
  96.         AcDbObjectId subEntId = NULL;
  97.         if (Acad::eOk == pIt->getEntityId(subEntId))
  98.         {
  99.           CTextUtil::SetStyle(subEntId, styleId, escStyleIds);
  100.         }
  101.       }
  102.       pBlkTblRcd->close();
  103.     }
  104.     pBlkRef->close();
  105.   }
  106.   return;
  107. }
回复

使用道具 举报

11

主题

29

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
73
发表于 2014-12-30 21:46:00 | 显示全部楼层
学习arx没那么好的气氛,只能多看书,张帆的不错,还有samples里面的例子也不错。如果有C++基础,arx就比较简单。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-2-5 03:53 , Processed in 0.190938 second(s), 56 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表