- 积分
- 27906
- 明经币
- 个
- 注册时间
- 2007-4-24
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
本帖最后由 gzxl 于 2025-3-13 18:33 编辑
文本盒(好像三种方式)获取,总结 getGeomExtents 比较其他两者范围大些,acedTextBox 和 AcGiTextStyle 差不多。
getGeomExtents 方式
- ads_name eName;
- ads_point pt;
- if (RTNORM != acedEntSel(_T("\n选择一个单行文字画包围盒:"), eName, pt))
- return;
- AcDbObjectId objId;
- acdbGetObjectId(objId, eName);
- AcDbText* pText;
- acdbOpenObject(pText, objId, AcDb::kForRead);
- if (objId == NULL)
- return;
- AcDbExtents ext;
- pText->getGeomExtents(ext);
- AcGePoint2d minPt, maxPt; // 左下角 右上角
- minPt[X] = ext.minPoint().x;
- minPt[Y] = ext.minPoint().y;
- maxPt[X] = ext.maxPoint().x;
- maxPt[Y] = ext.maxPoint().y;
- pText->close();
- // 左上角 右下角
- AcGePoint2d ptLeftTop(minPt.x, maxPt.y);
- AcGePoint2d ptRightBottom(maxPt.x, minPt.y);
- AcDbPolyline *pPoly = new AcDbPolyline(4);
- pPoly->addVertexAt(0, minPt, 0, 0, 0);
- pPoly->addVertexAt(1, ptRightBottom, 0, 0, 0);
- pPoly->addVertexAt(2, maxPt, 0, 0, 0);
- pPoly->addVertexAt(3, ptLeftTop, 0, 0, 0);
- pPoly->setClosed(Adesk::kTrue);
- AcDbBlockTable* pBlockTable;
- acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pBlockTable, AcDb::kForRead);
- AcDbBlockTableRecord* pBlockTableRecord;
- pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);
- AcDbObjectId polyId;
- pBlockTableRecord->appendAcDbEntity(polyId, pPoly);
- pBlockTable->close();
- pBlockTableRecord->close();
- pPoly->close();
复制代码 acedTextBox 方式
- // 结果缓冲区列表中搜索指定类型的组码
- static struct resbuf* EntItem(struct resbuf *rchain, int gcode)
- {
- while ((rchain != NULL) && (rchain->restype != gcode))
- rchain = rchain->rbnext;
- return rchain;
- }
- ads_name tname;
- struct resbuf *textent, *tent;
- ads_point origin, lowleft, upright, p1, p2, p3, p4;
- ads_real rotatn;
- TCHAR rotatstr[15];
- if (acedEntSel(_T("\n选择一个单行文字画包围盒: "), tname, p1) != RTNORM)
- {
- acdbFail(_T("没有选择文本实体\n"));
- return;
- }
- textent = acdbEntGet(tname);
- if (textent == NULL)
- {
- acdbFail(_T("无法检索文本实体\n"));
- return;
- }
- tent = EntItem(textent, 10);
- origin[X] = tent->resval.rpoint[X]; // ECS 坐标
- origin[Y] = tent->resval.rpoint[Y];
- tent = EntItem(textent, 50);
- rotatn = tent->resval.rreal;
- // acdbAngToS() 将弧度转换为度数
- if (acdbAngToS(rotatn, 0, 8, rotatstr) != RTNORM)
- {
- acdbFail(_T("弧度转换为度数失败!\n"));
- acutRelRb(textent);
- return;
- }
- if (acedTextBox(textent, lowleft, upright) != RTNORM)
- {
- acdbFail(_T("无法检索文本框坐标\n"));
- acutRelRb(textent);
- return;
- }
- acutRelRb(textent);
- // 如果当前不在 WCS 中,此时添加
- // 调用 acedTrans() 转换坐标
- // 从 acedTextBox() 中检索
- p1[X] = origin[X] + lowleft[X]; // UCS 坐标
- p1[Y] = origin[Y] + lowleft[Y];
- p2[X] = origin[X] + upright[X];
- p2[Y] = origin[Y] + lowleft[Y];
- p3[X] = origin[X] + upright[X];
- p3[Y] = origin[Y] + upright[Y];
- p4[X] = origin[X] + lowleft[X];
- p4[Y] = origin[Y] + upright[Y];
- AcGePoint2d pt1, pt2, pt3, pt4;
- pt1[X] = p1[X];
- pt1[Y] = p1[Y];
- pt2[X] = p2[X];
- pt2[Y] = p2[Y];
- pt3[X] = p3[X];
- pt3[Y] = p3[Y];
- pt4[X] = p4[X];
- pt4[Y] = p4[Y];
- AcDbPolyline *pPoly = new AcDbPolyline(4);
- pPoly->addVertexAt(0, pt1, 0, 0, 0);
- pPoly->addVertexAt(1, pt2, 0, 0, 0);
- pPoly->addVertexAt(2, pt3, 0, 0, 0);
- pPoly->addVertexAt(3, pt4, 0, 0, 0);
- pPoly->setClosed(Adesk::kTrue);
- AcDbBlockTable* pBlockTable;
- acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pBlockTable, AcDb::kForRead);
- AcDbBlockTableRecord* pBlockTableRecord;
- pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);
- AcDbObjectId polyId;
- pBlockTableRecord->appendAcDbEntity(polyId, pPoly);
- pBlockTable->close();
- pBlockTableRecord->close();
- pPoly->close();
- AcGePoint3d ptBase;
- ptBase.x = origin[X];
- ptBase.y = origin[Y];
- ptBase.z = 0.0;
- AcGeMatrix3d xform;
- AcGeVector3d vec(0, 0, 1);
- xform.setToRotation(rotatn, vec, ptBase);
- AcDbEntity *pEnt = NULL;
- Acad::ErrorStatus es = acdbOpenObject(pEnt, polyId, AcDb::kForWrite, false);
- if (es == Acad::eOk)
- {
- es = pEnt->transformBy(xform);
- pEnt->close();
- }
复制代码
AcGiTextStyle 方式
- Acad::ErrorStatus es = Acad::eOk;
- AcGiTextStyle textStyle;
- AcDbTextStyleTable* pTable = NULL;
- AcDbTextStyleTableRecord* pRecord = NULL;
- acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pTable, AcDb::kForRead);
- const ACHAR* styleName = strFontName;
- es = pTable->getAt(styleName, pRecord, AcDb::kForRead);
- if (es == Acad::eOk)
- {
- fromAcDbTextStyle(textStyle, pRecord->objectId());
- pRecord->close();
- pTable->close();
- textStyle.loadStyleRec();
- textStyle.extentsBox(str, Adesk::kFalse, _tcslen(str), Adesk::kTrue, extMin, extMax);
- }
复制代码
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
x
评分
-
查看全部评分
|