admin 发表于 2024-7-24 22:30:20

AcDbText

AcDbObjectId GetTextstyleId(CString sTextstylename)

{

AcDbTextStyleTable *pTable;

AcDbObjectId textstyleId = AcDbObjectId::kNull;

Acad::ErrorStatus es = Acad::eOk;

if ((es = acdbHostApplicationServices()->workingDatabase()->getTextStyleTable(pTable, AcDb::kForRead)) == Acad::eOk){

if ((es =pTable->getAt(sTextstylename, textstyleId, Adesk::kFalse)) != Acad::eOk){

textstyleId =AcDbObjectId::kNull;

}

pTable->close();

}

return textstyleId;

}


double GetTextWidth(CString sText, CString sTextStyle, double dTextHeight)
{
AcDbObjectId idTextStyle = GetTextstyleId(sTextStyle);
AcGiTextStyle giTextStyle;
fromAcDbTextStyle(giTextStyle, idTextStyle);
giTextStyle.setTextSize(dTextHeight);

AcGePoint2d ptExt = giTextStyle.extents(sText.GetBuffer(), Adesk::kFalse, sText.GetLength(), Adesk::kFalse);
return ptExt.x;
}


OR


double GetTextWidth(AcDbObjectId idText)
{
ads_point ptLowerLeft, ptUpperRight;
ads_name ent;
struct resbuf * textent;
acdbGetAdsName(ent, idText);
textent = acdbEntGet(ent);
acedTextBox(textent, ptLowerLeft, ptUpperRight);

//acutPrintf("\nHeight: %.2f, Width: %.2f", ptUpperRight - ptLowerLeft, ptUpperRight - ptLowerLeft);
return ptUpperRight - ptLowerLeft;
}

admin 发表于 2024-7-24 22:35:29


AcDbText 对齐 setHsorizontalMode和setVerticalMode setAlignmentPoint 所有对其
在AutoCAD的对象ARX开发中,AcDbText对象提供了多种方法来设置文本的对齐方式。

水平对齐方式设置:

AcDbText::setHoleizontalMode(AcDb::TextHorzMode mode)
此函数用于设置文本的水平对齐方式,参数mode可以是以下值:

AcDb::kTextLeft:左对齐

AcDb::kTextCenter:居中对齐

AcDb::kTextRight:右对齐

AcDb::kTextAligned:与对齐点对齐

AcDb::kTextMid:居中对齐,与对齐点垂直居中对齐

AcDb::kTextFit:文字宽度调整模式

垂直对齐方式设置:

AcDbText::setVerticalMode(AcDb::TextVertMode mode)
此函数用于设置文本的垂直对齐方式,参数mode可以是以下值:

AcDb::kTextBottom:底部对齐

AcDb::kTextBaseline:基线对齐

AcDb::kTextTop:顶部对齐

AcDb::kTextMiddle:居中对齐

AcDb::kTextBottomBaseline:底部与基线对齐

AcDb::kTextTopBaseline:顶部与基线对齐

设置对齐点:

AcDbText::setAlignmentPoint(const AcGePoint3d& point)
此函数用于设置文本的对齐点,文本将根据设置的对齐方式相对于这个点进行对齐。

以下是一个简单的示例,演示如何创建一个AcDbText对象并设置其对齐方式:

#include "dbtext.h"

AcDbText* createAndSetTextAlignment(const AcGePoint3d& position, const AcGeVector3d& xAxis, const AcGeVector3d& yAxis) {
    // 创建一个新的文本对象
    AcDbText* text = new AcDbText();

    // 设置文本内容
    text->setContents(_T("Hello, World!"));

    // 设置文本对齐点
    text->setAlignmentPoint(position);

    // 设置文本的水平对齐方式为居中
    text->setHoleizontalMode(AcDb::kTextCenter);

    // 设置文本的垂直对齐方式为居中
    text->setVerticalMode(AcDb::kTextMiddle);

    // 设置文本的旋转(可选,根据需要设置)
    text->setRotation(acos(xAxis * yAxis) / M_PI * 180.0);

    // 返回设置好的文本对象
    return text;
}
在这个例子中,我们创建了一个新的AcDbText对象,并设置了它的内容、对齐点、水平和垂直对齐方式以及旋转角度。然后返回这个设置好的文本对象。在实际使用时,你需要将此函数调用放在你的ARX应用程序中合适的位置,并处理好对象的追加和清理。

admin 发表于 2024-7-24 22:38:41

AcGeVector3d Tnor = pText->normal();
AcGeVector3d xdir = Tnor.perpVector();
xdir.rotateBy(pText->rotation(), Tnor);
AcGeVector3d ydir = Tnor.crossProduct(vx);
页: [1]
查看完整版本: AcDbText