[每日一码] 让AcDbText的Normal方向正确
void FlipText(){
ads采用point pt;
ads采用name ent;
AcDbObjectId objId;
if (acedEntSel(采用T("\nSelect text"), ent, pt) != RTNORM)
return;
if (acdbGetObjectId(objId, ent) != Acad::eOk)
return;
// Get the current viewdir
struct resbuf var;
acedGetVar(采用T("VIEWDIR"), &var);
AcGeVector3d viewdir;
acdbUcs2Wcs(var.resval.rpoint, asDblArray(viewdir), true);
Acad::ErrorStatus es;
AcDbText *text;
if ((es = acdbOpenObject(text, objId, AcDb::kForRead)) == Acad::eOk)
{
AcGeVector3d normal(text->normal());
double dp = normal.dotProduct(viewdir);
if (dp < 0.0) // if <0 we look at the text from the wrong side. Flip it.
{
es = text->upgradeOpen();
if (!es)
{
// Flip the normal but keep the insertion/aligment point
AcDb::TextHorzMode h = text->horizontalMode();
AcDb::TextVertMode v = text->verticalMode();
bool bUsePos=((h==AcDb::kTextLeft)&&(v==AcDb::kTextBase));
AcGePoint3d pt(bUsePos? text->position() : text->alignmentPoint());
text->setNormal(-normal); // flip the normal
if (bUsePos)
es = text->setPosition(pt);
else
es = text->setAlignmentPoint(pt);
}
}
text->close();
}
}
页:
[1]