找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 160|回复: 0

AcDbText原地反向

[复制链接]

0

主题

0

回帖

26

积分

管理员

积分
26
发表于 2024-3-4 08:51:29 | 显示全部楼层 |阅读模式
  1. Acad::ErrorStatus setAlignmentPoint(AcDbText &text, const AcGePoint3d &pt)
  2. {
  3.         if (!text.isWriteEnabled())
  4.                 return Acad::eNotOpenForWrite;
  5.         AcDb::TextHorzMode hmode = text.horizontalMode();
  6.         AcDb::TextVertMode vmode = text.verticalMode();
  7.         if ((hmode == AcDb::kTextLeft) && (vmode == AcDb::kTextBase))
  8.                 return text.setPosition(pt);                // only here position() is relevant and alignmentPoint() not
  9.         else
  10.                 return text.setAlignmentPoint(pt);        // here alignmentPoint() is relevant
  11. }
  12. AcGePoint3d getAlignmentPoint(const AcDbText &text)
  13. {
  14.         AcDb::TextHorzMode hmode = text.horizontalMode();
  15.         AcDb::TextVertMode vmode = text.verticalMode();
  16.         if ((hmode == AcDb::kTextLeft) && (vmode == AcDb::kTextBase))
  17.                 return text.position();                  // only here position() is relevant and alignmentPoint() not
  18.         else
  19.                 return text.alignmentPoint(); // here alignmentPoint() is relevant
  20. }
  21. void cmdTestText()
  22. {
  23.         ads采用point    pt;
  24.         ads采用name     ent;
  25.         AcDbObjectId objId;
  26.         if (acedEntSel(采用T("\nSelect Text: "), ent, pt) != RTNORM)
  27.                 return;
  28.         if (acdbGetObjectId(objId, ent) != Acad::eOk) //ads采用name-->AcDbObjectId
  29.                 return;
  30.         Acad::ErrorStatus es;
  31.         AcDbText *pText = NULL;
  32.         AcDbText *pText2 = NULL;
  33.         AcGePoint3d     ptAlign;
  34.         AcGeVector3d        vNormal;
  35.         double          rot = 0.0;
  36.         Adesk::Boolean bMirrX=false, bMirrY=false;
  37.         if ( (es=acdbOpenObject(pText, objId, AcDb::kForRead)) == Acad::eOk )
  38.         {
  39.                 pText2 = AcDbText::cast(pText->clone()); // Create a clone
  40.                 pText2->setDatabaseDefaults();
  41.                 pText2->setColorIndex(1); //red
  42.                 pText2->mirrorInX(false);
  43.                 pText2->mirrorInY(false);
  44.                 ptAlign = getAlignmentPoint(*pText);
  45.                 vNormal = pText->normal();
  46.                 rot = pText->rotation();
  47.                 bMirrX = pText->isMirroredInX();
  48.                 bMirrY = pText->isMirroredInY();
  49.                 pText->close();               
  50.         }
  51.         AcGeVector3d vx, vy, vz(vNormal);
  52.         vx = vz.perpVector();
  53.         vy = (vz.crossProduct(vx)).normalize();
  54.         AcGeVector3d vxRot(vx);
  55.         vxRot.rotateBy(rot, vz); // The rotated x-Axis
  56.         AcGeMatrix3d mat;
  57.         mat.setCoordSystem(ptAlign, vx, vy, vz);
  58.         bool bNeedZMirror = false;
  59.         if (bMirrX)
  60.         {
  61.                 bNeedZMirror = !bNeedZMirror;
  62.                 AcGePlane planeXZ(ptAlign, AcGeVector3d::kYAxis);
  63.                 AcGeMatrix3d matMirrY;
  64.                 matMirrY.setToMirroring(planeXZ);
  65.                 mat.preMultBy(matMirrY);
  66.         }
  67.         if (bMirrY)
  68.         {
  69.                 bNeedZMirror = !bNeedZMirror;
  70.                 AcGePlane plane(ptAlign, AcGeVector3d::kXAxis);
  71.                 AcGeMatrix3d matMirr;
  72.                 matMirr.setToMirroring(plane);
  73.                 mat.preMultBy(matMirr);
  74.         }
  75.         if (bNeedZMirror)
  76.         {
  77.                 // Make sure that mat is not mirroring
  78.                 AcGePlane plane(AcGePoint3d::kOrigin, AcGeVector3d::kZAxis);
  79.                 AcGeMatrix3d matMirr;
  80.                 matMirr.setToMirroring(plane);
  81.                 mat.preMultBy(matMirr);
  82.         }
  83.         AcGeVector3d vx2, vy2, vz2;
  84.         AcGePoint3d origin;
  85.         mat.getCoordSystem(origin, vx2, vy2, vz2);
  86.         // Calculate rotation value of vxRot with respect to vx2 and vz2
  87.         double rot2 = vx2.angleTo(vxRot, vz2);
  88.         // Create a second Text entity without mirroring
  89.         pText2->setNormal(vz2);
  90.         pText2->setRotation(rot2);
  91.         postToDb(pText2);
  92.         es = setAlignmentPoint(*pText2, ptAlign);
  93.         es = pText2->adjustAlignment();
  94.         pText2->close();
  95. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-28 14:41 , Processed in 0.116050 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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