找回密码
 立即注册

QQ登录

只需一步,快速开始

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

AcDbText

[复制链接]

0

主题

0

回帖

26

积分

管理员

积分
26
发表于 2024-7-24 22:30:20 | 显示全部楼层 |阅读模式
  1. AcDbObjectId GetTextstyleId(CString sTextstylename)
  2. {
  3. AcDbTextStyleTable *pTable;
  4. AcDbObjectId textstyleId = AcDbObjectId::kNull;
  5. Acad::ErrorStatus es = Acad::eOk;
  6. if ((es = acdbHostApplicationServices()->workingDatabase()->getTextStyleTable(pTable, AcDb::kForRead)) == Acad::eOk){
  7. if ((es =pTable->getAt(sTextstylename, textstyleId, Adesk::kFalse)) != Acad::eOk){
  8. textstyleId =AcDbObjectId::kNull;
  9. }
  10. pTable->close();
  11. }
  12. return textstyleId;
  13. }
  14. double GetTextWidth(CString sText, CString sTextStyle, double dTextHeight)
  15. {
  16. AcDbObjectId idTextStyle = GetTextstyleId(sTextStyle);
  17. AcGiTextStyle giTextStyle;
  18. fromAcDbTextStyle(giTextStyle, idTextStyle);
  19. giTextStyle.setTextSize(dTextHeight);
  20. AcGePoint2d ptExt = giTextStyle.extents(sText.GetBuffer(), Adesk::kFalse, sText.GetLength(), Adesk::kFalse);
  21. return ptExt.x;
  22. }
  23. OR
  24. double GetTextWidth(AcDbObjectId idText)
  25. {
  26. ads_point ptLowerLeft, ptUpperRight;
  27. ads_name ent;
  28. struct resbuf * textent;
  29. acdbGetAdsName(ent, idText);
  30. textent = acdbEntGet(ent);
  31. acedTextBox(textent, ptLowerLeft, ptUpperRight);
  32. //acutPrintf("\nHeight: %.2f, Width: %.2f", ptUpperRight - ptLowerLeft, ptUpperRight - ptLowerLeft);
  33. return ptUpperRight - ptLowerLeft;
  34. }
复制代码

0

主题

0

回帖

26

积分

管理员

积分
26
 楼主| 发表于 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应用程序中合适的位置,并处理好对象的追加和清理。

0

主题

0

回帖

26

积分

管理员

积分
26
 楼主| 发表于 2024-7-24 22:38:41 | 显示全部楼层
  1. AcGeVector3d Tnor = pText->normal();
  2. AcGeVector3d xdir = Tnor.perpVector();
  3. xdir.rotateBy(pText->rotation(), Tnor);
  4. AcGeVector3d ydir = Tnor.crossProduct(vx);
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-27 21:36 , Processed in 0.162913 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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