找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3675|回复: 8

[求助]:怎么提取AcDbMText实体中的文字

[复制链接]
发表于 2002-12-4 00:30:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
AcDbMText实体中包含了很多格式代码,如果我只想读出其中的文字内容该怎么办办,望高手指点
AcDbMText中的函数contents(),帮助文档是这么说的:

char *

contents() const;

Returns a pointer to a dynamically allocated buffer containing a copy of the character contents of the MText object. Formatting data used for word wrap calculations is removed before the string is copied.

也就是说,它返回的应该是其中的文字内容,也就是我需要的,但是,我跟踪了一下,返回的文字里面包含了控制格式的代码:(
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 192个

财富等级: 日进斗金

发表于 2002-12-5 15:15:49 | 显示全部楼层
把控制格式的东西虑掉就行啦
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-12-6 09:31:28 | 显示全部楼层
这样很难!!!我想了很久,给个思路吧!
做一个派生实体。
克隆一个Mtext。
用这个派生实体调用Mtext的explode,返回的entitySet里放的是AcDbText对象指针(多个)。这样就好办了!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-12-6 13:11:24 | 显示全部楼层
去熟悉熟悉一下ASCII编码,过滤控制字符应该不难
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-12-6 16:18:35 | 显示全部楼层
binbin的思路很好, 我在ADN上也提了这个问题,很多人都是这么想的:

可以参考一下下面这段代码:
  1. [font=courier new]
  2. // Append a new entity to the model space
  3. // and close it.
  4. void PostToMs(AcDbEntity *pEnt)
  5. {
  6. AcDbBlockTable *pTable;
  7. AcDbBlockTableRecord *pRecord; acdbCurDwg()->getBlockTable(pTable, AcDb::kForRead);
  8. pTable->getAt(ACDB_MODEL_SPACE, pRecord, AcDb::kForWrite);
  9. pTable->close();
  10. pRecord->appendAcDbEntity(pEnt);
  11. pRecord->close();
  12. pEnt->close();
  13. }// This function creates a new text style
  14. // for an MTEXT fragment.
  15. // NOTE: This function fails when using
  16. //     TrueType fonts (the font and bigfont
  17. //     member contains an empty string).
  18. AcDbObjectId CreateStyle(AcDbMTextFragment *frag)
  19. {
  20. if (!frag)
  21.    return AcDbObjectId::kNull; static int counter = 0;
  22. char buffer[33];
  23. AcDbTextStyleTableRecord *pStyle = new AcDbTextStyleTableRecord; // Create and set name
  24. itoa(counter++, buffer, 10);
  25. pStyle->setName(buffer); // Set parameters
  26. if (frag->font)
  27.    pStyle->setFileName(frag->font);
  28. else
  29.    pStyle->setFileName("txt.shx");
  30. if (frag->bigfont)
  31.    pStyle->setBigFontFileName(frag->bigfont); ads_printf("\nFont: %s", frag->font); // Append the new style to the style table
  32. AcDbObjectId styleId;
  33. AcDbTextStyleTable *pTable; acdbCurDwg()->getTextStyleTable(pTable, AcDb::kForWrite);
  34. pTable->add(styleId, pStyle);
  35. pTable->close();
  36. pStyle->close(); return styleId;
  37. }// This function is the callback function for
  38. // explodeFragments(). Here you will get the
  39. // MTEXT fragments
  40. int MTextEnum(AcDbMTextFragment *frag, void *param)
  41. {
  42. AcDbText *pText = new AcDbText;
  43. AcDbObjectId styleId = CreateStyle(frag); if (styleId == AcDbObjectId::kNull)
  44.    return 1; pText->setTextString(frag->text);
  45. pText->setPosition(frag->location);
  46. pText->setNormal(frag->normal);
  47. pText->setOblique(frag->obliqueAngle);
  48. pText->setWidthFactor(frag->widthFactor);
  49. pText->setColorIndex(frag->colorIndex);
  50. pText->setHeight(frag->capsHeight);
  51. pText->setTextStyle(styleId); PostToMs(pText); return 1;
  52. }void expmtext()
  53. {
  54. // Let the user select an MTEXT entity ads_name ename;
  55. ads_point pt; if (RTNORM != acedEntSel("\nSelect a mtext entity: ", ename, pt))
  56.    return; AcDbObjectId objId;
  57. AcDbEntity *pEnt; acdbGetObjectId(objId, ename);
  58. if (Acad::eOk != acdbOpenAcDbEntity(pEnt, objId, AcDb::kForRead)) {
  59.    ads_printf("\nCannot open selected entity.");
  60.    return;
  61. } if (!pEnt->isKindOf(AcDbMText::desc())) {
  62.    ads_printf("\nSelected entity is not a mtext entity.");
  63.    pEnt->close();
  64.    return;
  65. } AcDbMText *pMText = (AcDbMText*) pEnt; // Get every MTEXT fragment
  66. pMText->explodeFragments(MTextEnum, NULL); pMText->close();
  67. }
  68. [/font]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-12-6 16:25:25 | 显示全部楼层
最初由 binbin 发布
[B]这样很难!!!我想了很久,给个思路吧!
做一个派生实体。
克隆一个Mtext。
用这个派生实体调用Mtext的explode,返回的entitySet里放的是AcDbText对象指针(多个)。这样就好办了! [/B]


不用派生,克隆吧,直接explode 就可以了,生成临时的AcDbText 得到后,释放掉就可以了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-12-11 00:58:53 | 显示全部楼层
太复杂了,不明白
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2009-10-7 01:58:09 | 显示全部楼层
呵呵,学习了。。。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2009-11-4 15:44:47 | 显示全部楼层
看看
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-5-3 17:20 , Processed in 0.325866 second(s), 47 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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