找回密码
 立即注册

QQ登录

只需一步,快速开始

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

c++ Arx二次开发创建椭圆和样条曲线

[复制链接]

0

主题

0

回帖

26

积分

管理员

积分
26
发表于 2024-7-30 08:30:20 | 显示全部楼层 |阅读模式
  1. 一、本节课程
  2. c++ Arx二次开发创建椭圆和样条曲线
  3. 二、本节要讲解的知识点
  4.    1、如何应用C++ ARX二次开发创建椭圆(对AcDbEllipse类的构造函数的直接封装和根据外接矩形来创建椭圆)
  5.    2、如何应用C++ ARX二次开发创建样条曲线(对AcDbSpline类的构造函数的直接封装)
  6. 三、具体内容
  7. 1、创建椭圆的思路
  8. 有参数构造函数:AcDbEllipse(
  9.     const AcGePoint3d& center,
  10.     const AcGeVector3d& unitNormal,
  11.     const AcGeVector3d& majorAxis,
  12.     double radiusRatio,
  13.     double startAngle = 0.0,
  14.     double endAngle = 6.28318530717958647692
  15. );
  16. (1)AcDbEllipse类的构造函数,给定中心点、所在平面、长轴的一个端点和半径比例来创建椭圆。半径比例是一个用来定义椭圆的短轴相对于长轴的比例的参数。半径比例为1时,椭圆就变为圆。startAngle、endAngle这两个参数的配合使用,可以创建部分椭圆(椭圆弧)。
  17. (2)根据外接矩形来创建椭圆,椭圆的长、短轴的端点就是外接矩形的四条边的中点。因此,只要外接矩形的角点确定,椭圆的大小和形状就能计算出来。
  18. 2、创建椭圆的步骤和代码实现:
  19. AcDbObjectId CEllipseUtil::Add(const AcGePoint3d &ptCenter,const AcGeVector3d & vecNormal,const AcGeVector3d &majorAxis,double ratio)
  20. {
  21.    AcDbEllipse *pEllipse=new AcDbEllipse(ptCenter,vecNormal,majorAxis,ratio);
  22.    return CDwgDatabaseUtil::PostToModelSpace(pEllipse);//将对象添加到模型空间的函数
  23. }
  24. AcDbObjectId CEllipseUtil::Add(const AcGePoint2d &pt1,const AcGePoint2d &pt2)//pt1,pt2位矩形的两个角
  25. {
  26. AcGePoint3d ptCenter;
  27. ptCenter=CGePointUtil::GetMiddlePoint(CConvertUtil::ToPoint3d(pt1),CConvertUtil::ToPoint3d(pt2));
  28. AcGeVector3d vecNormal(0,0,1);
  29. AcGeVector3d majorAxis(fabs(pt1.x-pt2.x)/2,0,0);
  30. double ratio=fabs((pt1.y-pt2.y)/(pt1.x-pt2.x));
  31. return Add(ptCenter,vecNormal,majorAxis,ratio);
  32. }
  33. 3、创建样条曲线的思路
  34. 样条曲线在地形图的等高线经常被定义为样条曲线,创建样条曲线我们是对AcDbSpline类构造函数的封装。
  35. AcDbSpline(
  36.     const AcGePoint3dArray& fitPoints,
  37.     int order = 4,
  38.     double fitTolerance = 0.0
  39. );
  40. int order = 4
  41. Order of the spline to be created (in the range 2 to 26)
  42. double fitTolerance = 0.0
  43. Tolerance to which the spline should approximate fitPoints
  44. points
  45. Array of points (in WCS coordinates) through which to fit the curve
  46. 4、创建样条曲线的步骤和代码实现
  47. AcDbObjectId CSplineUtil::Add(const AcGePoint3dArray &points,int order,double fitTolerance)
  48. {
  49. assert(order>=2&& order<=26);
  50. AcDbSpline *pSpline=new AcDbSpline(points,order,fitTolerance);
  51. AcDbObjectId splineId=CDwgDatabaseUtil::PostToModelSpace(pSpline);
  52. return splineId;
  53. }
  54. 再添加一个创建样条曲线的函数,相比上述创建样条曲线的函数多了两个参数,分别用于指定样条曲线的起点和终点的切向方向。
  55. AcDbObjectId CSplineUtil::Add(const AcGePoint3dArray &points,const AcGeVector3d startTangent,const AcGeVector3d endTangent,   int order,double fitTolerance)
  56. {
  57. assert(order>=2&& order<=26);
  58. AcDbSpline *pSpline=new AcDbSpline(points,startTangent,endTangent,order,fitTolerance);
  59. AcDbObjectId splineId=CDwgDatabaseUtil::PostToModelSpace(pSpline);
  60. return splineId;
  61. }
  62. 5、在acrxEntryPoint里面实现我们的命令(添加椭圆命令):
  63. 命令的定义:ACED_ARXCOMMAND_ENTRY_AUTO(CArxProject1App, YunyouMyGroup,AddEllipse, AddEllipse, ACRX_CMD_MODAL, NULL)
  64. static void YunyouMyGroupAddEllipse()
  65. {
  66. //使用中心点、所在的平面、长轴矢量和短长轴比例来创建椭圆
  67. AcGeVector3d vecNormal(0,0,1);
  68. AcGeVector3d majorAxis(40,0,0);
  69. AcDbObjectId entId;
  70. entId=CEllipseUtil::Add(AcGePoint3d::kOrigin,vecNormal,majorAxis,0.5);
  71. //指定外接矩形来创建椭圆
  72. AcGePoint2d pt1(60,80),pt2(140,120);
  73. CEllipseUtil::Add(pt1,pt2);
  74. }
  75. 6、在acrxEntryPoint里面实现我们的命令(添加样条曲线的命令):
  76. 命令的定义:ACED_ARXCOMMAND_ENTRY_AUTO(CArxProject1App, YunyouMyGroup,AddSpline, AddSpline, ACRX_CMD_MODAL, NULL)
  77. static void YunyouMyGroupAddSpline()
  78. {
  79. //使用样本点直接创建样条曲线
  80. AcGePoint3d pt1(0,0,0),pt2(10,30,0),pt3(60,80,0),pt4(100,100,0);
  81. AcGePoint3dArray points;
  82. points.append(pt1);
  83. points.append(pt2);
  84. points.append(pt3);
  85. points.append(pt4);
  86. CSplineUtil::Add(points);
  87. //指定起始点和终止点的切向方向来创建样条曲线
  88. pt2.set(30,10,0);
  89. pt3.set(80,60,0);
  90. points.removeSubArray(0,3);
  91. points.append(pt1);
  92. points.append(pt2);
  93. points.append(pt3);
  94. points.append(pt4);
  95. AcGeVector3d startTangent(5,1,0);
  96. AcGeVector3d endTangent(5,1,0);
  97. CSplineUtil::Add(points,startTangent,endTangent);
  98. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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