找回密码
 立即注册

QQ登录

只需一步,快速开始

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

ObjectARX 创建尺寸标注

[复制链接]

0

主题

0

回帖

26

积分

管理员

积分
26
发表于 2024-3-2 13:30:58 | 显示全部楼层 |阅读模式
  1. 本篇将介绍 12 个用于尺寸标注的函数,包括了转角标注、对齐标注、角度标注、半径标注、直径标注和坐标标注的创建函数。这些函数分别封装了系统提供的一些基本方法,并在实用性上进行了扩充。
  2. 2. 思路
  3. A.       AcDbAlignedDimension 类对应的是对齐标注,该类的构造函数接受 5 个参数:
  4.                 (1)第一条尺寸边界线的起点、 (2)第二条尺寸边界线的起点、
  5.                 (3)通过尺寸线的一点、(4)标注文字、   (5)样式。
  6.         本节创建一个函数,对该类的构造函数直接进行封装,另外创建一个函数,可以在创建标注时修改标注文字的位置。
  7. B.        AcDbRotatedDimension 类对应转角标注,该类的构造函数接受 6 个参数:
  8.         (1)标注的旋转角度、  (2)第一条尺寸边界线的起点、  (3)第二条尺寸边界线的起点、
  9.         (4)通过尺寸线的一点、 (5)标注文字        (6)样式。
  10.         本节创建的函数直接对该函数进行封装。
  11. C.        AcDbRadialDimension 类对应半径标注,该类的构造函数需要输入5 个参数:
  12.         (1)标注曲线的中心点、    (2)引线附着的坐标、    (3)引线长度、
  13.         (4)标注文字        (5)样式        
  14.         本节除了对构造函数进行封装之外,提供了根据 (1)圆心、(2)半径、(3)标注尺寸线旋转角度(4)引线长度   来创建半径标注的函数,其关键点就在于根据已知的参数计算出构造函数需要的参数。
  15. D.        AcDbDiametricDimension 类对应直径标注,其构造函数需要输入5 个参数:
  16.         (1)+(2)标注直径的两个端点、(3)引线长度、
  17.         (4)标注文字(5)样式
  18.         本节除对其构造函数直接封装之外,还提供了根据(1)圆弧的圆心、 (2)半径、
  19. (3)引线放置角度(4)引线长度    创建标注的方法。
  20. E.        AcDb2LineAngularDimension 类对应角度标注,对这个类的构造函数进行封装。
  21. F.        AcDb3PointAngularDimension类对应角度标注,对这个类的构造函数进行封装。
  22. G.        AcDbOrdinateDimension 类对应坐标标注,其构造函数需要输入5 个参数:
  23.         (1)是否是 X 轴标注(布尔类型变量)、 (2)标注箭头的起始位置、
  24.         (3)标注箭头的终止位置、 (4)标注文字   (5)样式
  25.         本篇对该函数封装之后,又创建了两个新函数,能够同时创建 X、Y 两个坐标值,并且根据相对坐标修改引线端点的位置。
  26. 3. 步骤
  27. A.       AcDbAlignedDimension 类对应的是对齐标注,该类的构造函数接受 5 个参数:
  28.                 (1)第一条尺寸边界线的起点、 (2)第二条尺寸边界线的起点、
  29.                 (3)通过尺寸线的一点、(4)标注文字、   (5)样式。
  30.         本节创建一个函数,对该类的构造函数直接进行封装,另外创建一个函数,可以在创建标注时修改标注文字的位置。
  31. (1)创建对齐标注:添加一个新函数 CreateDimAligned
  32. //创建对齐标注
  33. static AcDbObjectId CreateDimAligned(const AcGePoint3d& pt1, const AcGePoint3d& pt2, const AcGePoint3d& ptLine, const char* dimText = NULL, AcDbObjectId dimStyle = AcDbObjectId::kNull);
  34. //创建对齐标注
  35. //(1)第一条尺寸边界线的起点(2)第二条尺寸边界线的起点(3)通过尺寸线的一点(4)标注文字(5)样式。
  36. AcDbObjectId CCreateEnt::CreateDimAligned(const AcGePoint3d& pt1, const AcGePoint3d& pt2, const AcGePoint3d& ptLine, const char* dimText, AcDbObjectId dimStyle)
  37. { AcDbAlignedDimension *pDim = new AcDbAlignedDimension(pt1, pt2, ptLine, dimText, dimStyle); return CCreateEnt::PostToModelSpace(pDim);
  38. }
  39. (2)创建对齐标注:创建一个重载的函数,允许用户输入 vecOffset 作为标注文字位置的偏移量
  40. //创建对齐标注, 创建一个重载的函数,允许用户输入 vecOffset 作为标注文字位置的偏移量static AcDbObjectId CreateDimAligned(const AcGePoint3d& pt1, const AcGePoint3d& pt2, const AcGePoint3d& ptLine, const AcGeVector3d& vecOffset = AcGeVector3d::kIdentity, const TCHAR* dimText = NULL);
  41. //创建对齐标注
  42. //重载函数,允许输入 vecOffset 作为标注文字位置的偏移量
  43. AcDbObjectId CCreateEnt::CreateDimAligned(const AcGePoint3d& pt1, const AcGePoint3d& pt2, const AcGePoint3d& ptLine, const AcGeVector3d& vecOffset, const TCHAR* dimText)
  44. { AcDbAlignedDimension *pDim = new AcDbAlignedDimension(pt1, pt2, ptLine, dimText, AcDbObjectId::kNull);AcDbObjectId dimensionId;dimensionId = CCreateEnt::PostToModelSpace(pDim);// 打开已经创建的标注,对文字的位置进行修改AcDbEntity *pEnt;Acad::ErrorStatus es;es = acdbOpenAcDbEntity(pEnt, dimensionId, AcDb::kForWrite);AcDbAlignedDimension *pDimension = AcDbAlignedDimension::cast(pEnt);if (pDimension != NULL) { // 移动文字位置前,需先指定尺寸线的变化情况(这里指定为:// 尺寸线不动,在文字和尺寸线之间加箭头)pDimension->setDimtmove(1); // 根据偏移向量修正文字插入点的位置AcGePoint3d ptText = pDimension->textPosition(); ptText = ptText + vecOffset; pDimension->setTextPosition(ptText); } pEnt->close(); return dimensionId;
  45. }
  46. B.        AcDbRotatedDimension 类对应转角标注,该类的构造函数接受 6 个参数:
  47.         (1)标注的旋转角度、  (2)第一条尺寸边界线的起点、  (3)第二条尺寸边界线的起点、
  48.         (4)通过尺寸线的一点、 (5)标注文字        (6)样式。
  49.         本节创建的函数直接对该函数进行封装。
  50. (3)创建转角标注:添加一个新函数 CreateDimRotated
  51.     //创建转角标注static AcDbObjectId CreateDimRotated(const AcGePoint3d& pt1, const AcGePoint3d& pt2, const AcGePoint3d& ptLine, double rotation, const TCHAR* dimText = NULL, AcDbObjectId dimStyle = AcDbObjectId::kNull);
  52. //创建转角标注
  53. //(1)标注的旋转角度、(2)第一条尺寸边界线的起点、(3)第二条尺寸边界线的起点、(4)通过尺寸线的一点、(5)标注文字 (6)样式。
  54. AcDbObjectId CCreateEnt::CreateDimRotated(const AcGePoint3d& pt1, const AcGePoint3d& pt2, const AcGePoint3d& ptLine, double rotation, const TCHAR* dimText, AcDbObjectId dimStyle)
  55. { AcDbRotatedDimension *pDim = new AcDbRotatedDimension(rotation, pt1, pt2, ptLine, dimText, dimStyle); return CCreateEnt::PostToModelSpace(pDim);
  56. }
  57. C.        AcDbRadialDimension 类对应半径标注,该类的构造函数需要输入5 个参数:
  58.         (1)标注曲线的中心点、    (2)引线附着的坐标、    (3)引线长度、
  59.         (4)标注文字        (5)样式        
  60.         本节除了对构造函数进行封装之外,提供了根据 (1)圆心、(2)半径、(3)标注尺寸线旋转角度(4)引线长度   来创建半径标注的函数,其关键点就在于根据已知的参数计算出构造函数需要的参数。
  61. (4)创建半径标注:添加一个新函数 CreateDimRadial
  62. //创建半径标注static AcDbObjectId CreateDimRadial(const AcGePoint3d& ptCenter, const AcGePoint3d& ptChord, double leaderLength, const TCHAR* dimText = NULL, AcDbObjectId dimStyle = AcDbObjectId::kNull);
  63. //创建半径标注
  64. //(1)标注曲线的中心点、(2)引线附着的坐标、(3)引线长度、(4)标注文字(5)样式  
  65. AcDbObjectId CCreateEnt::CreateDimRadial(const AcGePoint3d& ptCenter, const AcGePoint3d& ptChord, double leaderLength, const TCHAR* dimText, AcDbObjectId dimStyle)
  66. { AcDbRadialDimension *pDim = new AcDbRadialDimension(ptCenter, ptChord, leaderLength, dimText, dimStyle); return CCreateEnt::PostToModelSpace(pDim);
  67. }  
  68. (5)创建半径标注:创建一个重载的函数,用于根据圆心、半径、标注尺寸线的旋转角度和引线长度来创建半径标注
  69. //创建半径标注
  70. static AcDbObjectId CreateDimRadial(const AcGePoint3d& ptCenter, double radius, double angle, double leaderLength = 5);
  71. //创建半径标注
  72. //重载函数,(圆心、半径、标注尺寸线的旋转角度和引线长度)
  73. AcDbObjectId CCreateEnt::CreateDimRadial(const AcGePoint3d& ptCenter, double radius, double angle, double leaderLength)
  74. { CGeometryOper m采用geometryOper;AcGePoint3d ptChord = m采用geometryOper.PolarPoint(ptCenter, angle, radius); return CCreateEnt::CreateDimRadial(ptCenter, ptChord, leaderLength);
  75. }
  76.         其中,CCalculation::PolarPoint 是一个自定义函数,能够根据相对极坐标来确定一个点的位置:
  77. //根据相对极坐标来确定一个点的位置
  78. AcGePoint3d PolarPoint(const AcGePoint3d& pt, double angle, double distance);
  79. //根据相对极坐标来确定一个点的位置
  80. AcGePoint3d CGeometryOper::PolarPoint(const AcGePoint3d& pt, double angle, double distance)
  81. { ads采用point ptForm, ptTo; ptForm[X] = pt.x; ptForm[Y] = pt.y; ptForm[Z] = pt.z;//acutPolar: 计算某个角度上距离某个点一定距离的点acutPolar(ptForm, angle, distance, ptTo); return asPnt3d(ptTo);
  82. }
  83. D.        AcDbDiametricDimension 类对应直径标注,其构造函数需要输入5 个参数:
  84.         (1)+(2)标注直径的两个端点、(3)引线长度、
  85.         (4)标注文字(5)样式
  86.         本节除对其构造函数直接封装之外,还提供了根据(1)圆弧的圆心、 (2)半径、
  87.                                                         (3)引线放置角度(4)引线长度    创建标注的方法。
  88. (6)创建直径标注:创建一个函数 CreateDimDiametric
  89.     //创建直径标注static AcDbObjectId CreateDimDiametric(const AcGePoint3d& ptChord1, const AcGePoint3d& ptChord2, double leaderLength, const TCHAR* dimText = NULL, AcDbObjectId dimStyle = AcDbObjectId::kNull);
  90. //创建直径标注
  91. //(1)+(2)标注直径的两个端点、(3)引线长度、(4)标注文字(5)样式
  92. AcDbObjectId CCreateEnt::CreateDimDiametric(const AcGePoint3d& ptChord1, const AcGePoint3d& ptChord2, double leaderLength, const TCHAR* dimText, AcDbObjectId dimStyle)
  93. { AcDbDiametricDimension *pDim = new AcDbDiametricDimension(ptChord1, ptChord2, leaderLength, dimText, dimStyle); return CCreateEnt::PostToModelSpace(pDim);
  94. }
  95. (7)创建直径标注:创建一个重载的函数,根据圆心、半径、标注尺寸线的旋转角度和引线长度
  96. //创建直径标注
  97. static AcDbObjectId CreateDimDiametric(const AcGePoint3d& ptCenter, double radius, double angle, double leaderLength = 5);
  98. //创建直径标注
  99. //重载函数,(圆心、半径、标注尺寸线的旋转角度和引线长度)
  100. AcDbObjectId CCreateEnt::CreateDimDiametric(const AcGePoint3d& ptCenter, double radius, double angle, double leaderLength)
  101. { CGeometryOper m采用geometryOper;// 计算标注通过点的位置AcGePoint3d ptChord1, ptChord2; ptChord1 = m采用geometryOper.PolarPoint(ptCenter, angle, radius); ptChord2 = m采用geometryOper.PolarPoint(ptCenter, angle + m采用geometryOper.PI(), radius); return CCreateEnt::CreateDimDiametric(ptChord1, ptChord2, leaderLength);
  102. }
  103. E.        AcDb2LineAngularDimension 类对应角度标注,对这个类的构造函数进行封装。
  104. (8)创建角度标注:根据两条直线的关系创建一个函数
  105.     //创建角度标注static AcDbObjectId CreateDim2LineAngular(const AcGePoint3d& ptStart1, const AcGePoint3d& ptEnd1, const AcGePoint3d& ptStart2, const AcGePoint3d& ptEnd2, const AcGePoint3d& ptArc, const TCHAR* dimText = NULL, AcDbObjectId dimStyle = AcDbObjectId::kNull);
  106. //创建二维角度标注
  107. //根据两条直线的关系创建一个函数
  108. AcDbObjectId CCreateEnt::CreateDim2LineAngular(const AcGePoint3d& ptStart1, const AcGePoint3d& ptEnd1, const AcGePoint3d& ptStart2, const AcGePoint3d& ptEnd2, const AcGePoint3d& ptArc, const TCHAR* dimText, AcDbObjectId dimStyle)
  109. { AcDb2LineAngularDimension *pDim = new AcDb2LineAngularDimension(ptStart1, ptEnd1, ptStart2, ptEnd2, ptArc, dimText, dimStyle); return CCreateEnt::PostToModelSpace(pDim);
  110. }
  111. F.        AcDb3PointAngularDimension类对应角度标注,对这个类的构造函数进行封装。
  112. (9)创建角度标注:创建一个重载的函数,根据顶点、起始点、终止点和标注尺寸线通过点来创建
  113.     //创建三维角度标注static AcDbObjectId CreateDim3PtAngular(const AcGePoint3d& ptCenter, const AcGePoint3d& ptEnd1, const AcGePoint3d& ptEnd2, const AcGePoint3d& ptArc, const TCHAR* dimText = NULL, AcDbObjectId dimStyle = AcDbObjectId::kNull);
  114. //创建三维角度标注
  115. //重载函数,(顶点、起始点、终止点和标注尺寸线通过点)
  116. AcDbObjectId CCreateEnt::CreateDim3PtAngular(const AcGePoint3d& ptCenter, const AcGePoint3d& ptEnd1, const AcGePoint3d& ptEnd2, const AcGePoint3d& ptArc, const TCHAR* dimText, AcDbObjectId dimStyle)
  117. { AcDb3PointAngularDimension *pDim = new AcDb3PointAngularDimension(ptCenter, ptEnd1, ptEnd2, ptArc, dimText, dimStyle); return CCreateEnt::PostToModelSpace(pDim);
  118. }
  119. G.        AcDbOrdinateDimension 类对应坐标标注,其构造函数需要输入5 个参数:
  120.         (1)是否是 X 轴标注(布尔类型变量)、 (2)标注箭头的起始位置、
  121.         (3)标注箭头的终止位置、 (4)标注文字   (5)样式
  122.         本篇对该函数封装之后,又创建了两个新函数,能够同时创建 X、Y 两个坐标值,并且根据相对坐标修改引线端点的位置。
  123. (10)创建坐标标注:创建一个函数 CreateDimOrdinate,直接封装类的构造函数
  124.     //创建坐标标注static AcDbObjectId CreateDimOrdinate(Adesk::Boolean xAxis, const AcGePoint3d& ptStart, const AcGePoint3d& ptEnd, const TCHAR* dimText = NULL, AcDbObjectId dimStyle = AcDbObjectId::kNull);
  125. //创建坐标标注
  126. //(1)是否是 X 轴标注(布尔类型变量)、(2)标注箭头的起始位置、(3)标注箭头的终止位置、(4)标注文字、(5)样式
  127. AcDbObjectId CCreateEnt::CreateDimOrdinate(Adesk::Boolean xAxis, const AcGePoint3d& ptStart, const AcGePoint3d& ptEnd, const TCHAR* dimText, AcDbObjectId dimStyle)
  128. { AcDbOrdinateDimension *pDim = new AcDbOrdinateDimension(xAxis, ptStart, ptEnd, dimText, dimStyle); return CCreateEnt::PostToModelSpace(pDim);
  129. }
  130. (11)创建坐标标注:创建一个重载的函数,能够同时创建一个点的 X、Y 坐标标注
  131. //创建坐标标注
  132. static AcDbObjectIdArray CreateDimOrdinate(const AcGePoint3d& ptDef, const AcGePoint3d& ptTextX, const AcGePoint3d& ptTextY);
  133. //创建坐标标注
  134. //重载函数,能够同时创建一个点的 X、Y 坐标标注
  135. AcDbObjectIdArray CCreateEnt::CreateDimOrdinate(const AcGePoint3d& ptDef, const AcGePoint3d& ptTextX, const AcGePoint3d& ptTextY)
  136. { AcDbObjectId dimId; AcDbObjectIdArray dimIds; dimId = CCreateEnt::CreateDimOrdinate(Adesk::kTrue, ptDef, ptTextX); dimIds.append(dimId); dimId = CCreateEnt::CreateDimOrdinate(Adesk::kFalse, ptDef, ptTextY); dimIds.append(dimId); return dimIds;
  137. }
  138. (12)创建坐标标注:能够根据点的偏移位置来创建坐标标注
  139. //创建坐标标注
  140. static AcDbObjectIdArray CreateDimOrdinate(const AcGePoint3d& ptDef, const AcGeVector3d& vecOffsetX, const AcGeVector3d& vecOffsetY);
  141. //创建坐标标注
  142. //重载函数,能够根据点的偏移位置来创建坐标标注
  143. AcDbObjectIdArray CCreateEnt::CreateDimOrdinate(const AcGePoint3d& ptDef, const AcGeVector3d& vecOffsetX, const AcGeVector3d& vecOffsetY)
  144. { AcGePoint3d ptTextX = ptDef + vecOffsetX; AcGePoint3d ptTextY = ptDef + vecOffsetY; return CCreateEnt::CreateDimOrdinate(ptDef, ptTextX, ptTextY);
  145. }
  146. 4. 实体操作
  147. (1)在 CCalculation 类中增加一个函数 RelativePoint,用于根据相对直角坐标来计算一个点的位置:
  148.     //根据相对直角坐标来计算一个点的位置AcGePoint3d RelativePoint(const AcGePoint3d& pt, double x, double y);
  149. //根据相对直角坐标来计算一个点的位置
  150. AcGePoint3d CGeometryOper::RelativePoint(const AcGePoint3d& pt, double x, double y)
  151. {AcGePoint3d ptReturn(pt.x + x, pt.y + y, pt.z); return ptReturn;
  152. }
  153. 5. 在acrxEntryPoint.cpp中
  154. ACED采用ARXCOMMAND采用ENTRY采用AUTO(CArxConfigApp, MidasMyGroup, MyCreateDimAligned, MyCreateDimAligned, ACRX采用CMD采用MODAL, NULL) 创建对齐标注
  155. //当前项目中注册一个命令 MyCreateDimAlignedstatic void MidasMyGroupMyCreateDimAligned(){CGeometryOper m采用geometryOper;// 指定起始点位置AcGePoint3d pt1(200, 160, 0); AcGePoint3d pt2= m采用geometryOper.RelativePoint(pt1, -40, 0); AcGePoint3d pt3 = m采用geometryOper.PolarPoint(pt2, 7 * m采用geometryOper.PI() / 6, 20); AcGePoint3d pt4 = m采用geometryOper.RelativePoint(pt3, 6, -10); AcGePoint3d pt5 = m采用geometryOper.RelativePoint(pt1, 0, -20); // 绘制外轮廓线CCreateEnt::CreateLine(pt1, pt2); CCreateEnt::CreateLine(pt2, pt3);CCreateEnt::CreateLine(pt3, pt4); CCreateEnt::CreateLine(pt4, pt5); CCreateEnt::CreateLine(pt5, pt1); // 绘制圆形AcGePoint3d ptCenter1, ptCenter2; ptCenter1 = m采用geometryOper.RelativePoint(pt3, 16, 0); ptCenter2 = m采用geometryOper.RelativePoint(ptCenter1, 25, 0); CCreateEnt::CreateCircle(ptCenter1, 3); CCreateEnt::CreateCircle(ptCenter2, 4); AcGePoint3d ptTemp1, ptTemp2; // 水平标注ptTemp1 = m采用geometryOper.RelativePoint(pt1, -20, 3); CCreateEnt::CreateDimRotated(pt1, pt2, ptTemp1, 0); // 垂直标注ptTemp1 = m采用geometryOper.RelativePoint(pt1, 4, 10); CCreateEnt::CreateDimRotated(pt1, pt5, ptTemp1, m采用geometryOper.PI() / 2); // 转角标注ptTemp1 = m采用geometryOper.RelativePoint(pt3, -3, -6); CCreateEnt::CreateDimRotated(pt3, pt4, ptTemp1, 7 * m采用geometryOper.PI() / 4); // 对齐标注ptTemp1 = m采用geometryOper.RelativePoint(pt2, -3, 4); CCreateEnt::CreateDimAligned(pt2, pt3, ptTemp1, AcGeVector3d(4, 10, 0), 采用T("new position")); // 角度标注ptTemp1 = m采用geometryOper.RelativePoint(pt5, -5, 5); CCreateEnt::CreateDim3PtAngular(pt5, pt1, pt4, ptTemp1); // 半径标注ptTemp1 = m采用geometryOper.PolarPoint(ptCenter1, m采用geometryOper.PI() / 4, 3); CCreateEnt::CreateDimRadial(ptCenter1, ptTemp1, -3);// 直径标注ptTemp1 = m采用geometryOper.PolarPoint(ptCenter2, m采用geometryOper.PI() / 4, 4); ptTemp2 = m采用geometryOper.PolarPoint(ptCenter2, m采用geometryOper.PI() / 4, -4); CCreateEnt::CreateDimDiametric(ptTemp1, ptTemp2, 0); // 坐标标注CCreateEnt::CreateDimOrdinate(ptCenter2, AcGeVector3d(0, -10, 0), AcGeVector3d(10, 0, 0)); }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-28 14:36 , Processed in 0.113464 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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