找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 189|回复: 2

[每日一码] (1)AcDbText实体转换成AcDbMtext

[复制链接]

0

主题

0

回帖

26

积分

管理员

积分
26
发表于 2024-2-23 22:17:20 | 显示全部楼层 |阅读模式
  1. //create a new AcDbMtext entity and copy properties from the selected AcDbText
  2. void fTextToMText(AcDbObjectId mTextId)
  3. {
  4.         //open the text entity for read
  5.         AcDbText *pText = NULL;
  6.         acdbOpenObject(pText,mTextId,AcDb::kForWrite);
  7.         if(NULL == pText)
  8.         {
  9.                 acutPrintf("\nERROR: unable to open the text entity for write");
  10.                 return;
  11.         }
  12.         //create a new AcDbMText
  13.         AcDbMText *pMText = new AcDbMText;
  14.         //set Mtext properties
  15.         pMText->setTextHeight(pText->height());
  16.         pMText->mirrorInX(pText->isMirroredInX());
  17.         pMText->mirrorInY(pText->isMirroredInY());
  18.         pMText->setNormal(pText->normal());
  19.         pMText->setOblique(pText->oblique());
  20.         pMText->setRotation(pText->rotation());
  21.         pMText->setContents(pText->textString());
  22.         pMText->setTextStyle(pText->textStyle());
  23.         pMText->setThickness(pText->thickness());
  24.         pMText->setLayer(pText->layerId());
  25.         pMText->setColorIndex(1); //change this later to pText->colorIndex()
  26.         
  27.         //set the attachment point
  28.         pMText->setAttachment(fSelectMtextAlign(pText));
  29.         //set the location of MText
  30.         //get the bounding box of text entity
  31.         AcDbExtents mExtText;
  32.         pText->getGeomExtents(mExtText);
  33.         AcGePoint3d mMtxtInsPt = AcGePoint3d(0,0,0);
  34.         AcDbExtents mExtMText;
  35.         pMText->setLocation(mMtxtInsPt);
  36.         pMText->getGeomExtents(mExtMText);
  37.         mMtxtInsPt = mMtxtInsPt + (mExtText.maxPoint() - mExtMText.maxPoint());
  38.         pMText->setLocation(mMtxtInsPt);
  39.         //append Mtext Object to Database
  40.         AcDbBlockTableRecord *pBTR = NULL;
  41.         acdbOpenObject(pBTR, pText->blockId(), AcDb::kForWrite);
  42.         
  43.         if(NULL == pBTR)
  44.         {
  45.                 acutPrintf("\nERROR: unable to open the block table record");
  46.                 pText->close();
  47.                 delete pMText;
  48.                 return;
  49.         }
  50.         pBTR->appendAcDbEntity(pMText);
  51.         pBTR->close();
  52.         //pText->erase(); //not erasing the AcDbText entity for comparision
  53.         pText->close();
  54.         pMText->close();
  55. }
  56. //function to map the vertical and horizontal mode from AcDbText to AcDbMText
  57. AcDbMText::AttachmentPoint fSelectMtextAlign(AcDbText *pAttTxt)
  58. {
  59.         AcDb::TextVertMode mVertMode;
  60.         AcDb::TextHorzMode mHorzMode;
  61.         mVertMode = pAttTxt->verticalMode();
  62.         mHorzMode = pAttTxt->horizontalMode();
  63.         if (AcDb::kTextBottom == mVertMode)
  64.         {
  65.                 mVertMode = AcDb::kTextBase;
  66.         }
  67.         switch (mHorzMode)
  68.         {
  69.         case AcDb::kTextAlign:
  70.                 return AcDbMText::AttachmentPoint::kBottomLeft;
  71.         case AcDb::kTextMid:
  72.                 return AcDbMText::AttachmentPoint::kMiddleCenter;
  73.                 case AcDb::kTextFit:
  74.                         return AcDbMText::AttachmentPoint::kBottomLeft;
  75.         }
  76.         switch (mVertMode)
  77.         {
  78.                 case AcDb::kTextTop:
  79.                         switch (mHorzMode)
  80.                         {
  81.                                 case AcDb::kTextLeft:
  82.                                         return AcDbMText::AttachmentPoint::kTopLeft;
  83.                                 case AcDb::kTextCenter:
  84.                                         return AcDbMText::AttachmentPoint::kTopCenter;
  85.                                 case AcDb::kTextRight:
  86.                                         return AcDbMText::AttachmentPoint::kTopRight;
  87.                                 break;
  88.                         }        
  89.                 case AcDb::kTextVertMid:
  90.                         switch (mHorzMode)
  91.                         {
  92.                         case AcDb::kTextLeft:
  93.                                 return AcDbMText::AttachmentPoint::kMiddleLeft;
  94.                         case AcDb::kTextCenter:
  95.                                 return AcDbMText::AttachmentPoint::kMiddleCenter;
  96.                         case AcDb::kTextRight:
  97.                                 return AcDbMText::AttachmentPoint::kMiddleRight;
  98.                         }
  99.                 case AcDb::kTextBase:
  100.                         switch (mHorzMode)
  101.                         {
  102.                         case AcDb::kTextLeft:
  103.                                 return AcDbMText::AttachmentPoint::kBottomLeft;
  104.                         case AcDb::kTextCenter:
  105.                                 return AcDbMText::AttachmentPoint::kBottomCenter;
  106.                         case AcDb::kTextRight:
  107.                                 return AcDbMText::AttachmentPoint::kBottomRight;
  108.                                 break;
  109.                         }
  110.         }
  111.         
  112.         return AcDbMText::AttachmentPoint::kTopLeft;
  113. }
复制代码

0

主题

0

回帖

26

积分

管理员

积分
26
 楼主| 发表于 2024-2-23 22:17:33 | 显示全部楼层
pMText->mirrorInX(pText->isMirroredInX());
pMText->mirrorInY(pText->isMirroredInY());
pMText->setOblique(pText->oblique());
pMText->setThickness(pText->thickness());
上述方法在2004以上版本已经没有了,没找到替代方法!

0

主题

0

回帖

26

积分

管理员

积分
26
 楼主| 发表于 2024-2-23 22:18:06 | 显示全部楼层
  1. 添加了写代码,以修正pText->isMirroredInY()和pText->isMirroredInY(),不知道是否适合所有情况,自己测试了下,暂时还没发现问题!
  2. //set the attachment point
  3.          pMText->setAttachment(getMtextAlign(pText));
  4. //以下我代码我添加,用以修正pText->isMirroredInY()和pText->isMirroredInY()
  5.          AcGeVector3d normal =pText->normal();
  6.          AcGeVector3d dirVec = pMText->direction();
  7.          if (pText->isMirroredInX())
  8.          {
  9.                  normal.negate();
  10.                  pMText->setNormal(normal);
  11.                  dirVec.set(-dirVec.x,-dirVec.y,dirVec.z);
  12.                  pMText->setDirection(dirVec);
  13.          }
  14.          if (pText->isMirroredInY())
  15.          {
  16.                  normal.negate();
  17.                  pMText->setNormal(normal);
  18.                  pMText->setRotation(pText->rotation()+Pi);
  19.          }
  20. //以上代码为我添加
  21.          //set the location of MText
  22.          //get the bounding box of text entity
  23.          AcDbExtents mExtText;
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|膜结构网

GMT+8, 2024-12-28 14:38 , Processed in 0.129790 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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