找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[每日一码] 让AcDbText的Normal方向正确

[复制链接]

1

主题

0

回帖

33

积分

管理员

积分
33
发表于 2024-3-14 20:53:21 | 显示全部楼层 |阅读模式
  1. void FlipText()
  2. {
  3.         ads采用point    pt;
  4.         ads采用name     ent;
  5.         AcDbObjectId objId;
  6.         if (acedEntSel(采用T("\nSelect text"), ent, pt) != RTNORM)
  7.                 return;
  8.         if (acdbGetObjectId(objId, ent) != Acad::eOk)
  9.                 return;
  10.         // Get the current viewdir
  11.         struct resbuf var;
  12.         acedGetVar(采用T("VIEWDIR"), &var);
  13.         AcGeVector3d viewdir;
  14.         acdbUcs2Wcs(var.resval.rpoint, asDblArray(viewdir), true);
  15.         Acad::ErrorStatus es;
  16.         AcDbText *text;
  17.         if ((es = acdbOpenObject(text, objId, AcDb::kForRead)) == Acad::eOk)
  18.         {
  19.                 AcGeVector3d normal(text->normal());
  20.                 double dp = normal.dotProduct(viewdir);
  21.                 if (dp < 0.0) // if <0 we look at the text from the wrong side. Flip it.
  22.                 {
  23.                         es = text->upgradeOpen();
  24.                         if (!es)
  25.                         {
  26.                                 // Flip the normal but keep the insertion/aligment point
  27.                                 AcDb::TextHorzMode h = text->horizontalMode();
  28.                                 AcDb::TextVertMode v = text->verticalMode();
  29.                                 bool bUsePos=((h==AcDb::kTextLeft)&&(v==AcDb::kTextBase));
  30.                                 AcGePoint3d pt(bUsePos? text->position() : text->alignmentPoint());
  31.                                 text->setNormal(-normal); // flip the normal
  32.                                 if (bUsePos)
  33.                                         es = text->setPosition(pt);                 
  34.                                 else
  35.                                         es = text->setAlignmentPoint(pt);
  36.                         }
  37.                 }
  38.                 text->close();
  39.         }
  40. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-29 21:32 , Processed in 0.127878 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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