|
[code]1. 说明
与上一节创建圆的函数相对应,本节将要实现用
法1: “圆心、半径、圆弧所在的平面、起点角度和终点角度”、
法2: 位于 XOY 平面上的圆弧 “圆心、半径、起点角度和终点角度”、
法3: 弧上三点法、“起点、中间点、终点”
法4: 圆心三点法、“起点、圆心、终点”
法5: 两点一角 “起点、圆心、圆弧角度”
五种方法来创建圆弧。
2. 思路
在 ObjectARX 中, AcDbArc 类被用来表示圆弧,该类有三个构造函数:
第二个构造函数接受最多的参数,因此首先对该函数进行封装,其他几个函数均以封装后的函数为基础。
//中心点、半径、起始角度、终止角度
AcDbArc(
const AcGePoint3d& center,
double radius,
double startAngle,
double endAngle);
//中心点、平面向量、半径、起始角度、终止角度
AcDbArc(
const AcGePoint3d& center,
const AcGeVector3d& normal,
double radius,
double startAngle,
double endAngle);
AcDbArc();
//第二个构造函数接受最多的参数,因此首先对该函数进行封装,
//其他几个函数均以封装后的函数为基础。
3. 步骤
(1)在CGeometryOper类中:增加一个新的函数 Pt2dTo3d
AcGePoint3d Pt2dTo3d(AcGePoint2d pt);
//或
//AcGePoint3d Pt2dTo3d(AcGePoint2d pt, double z = 0);
//二维点转三维点
AcGePoint3d CGeometryOper::Pt2dTo3d(AcGePoint2d pt)
{
AcGePoint3d ptTemp(pt.x, pt.y, 0);
return ptTemp;
}
//或
//(二维点转三维点)
AcGePoint3d CGeometryOper::Pt2dTo3d(AcGePoint2d pt, double z = 0)
{
return AcGePoint3d(pt.x, pt.y, z);
}
(2)在CCreateEnt类中:添加一个函数 CreateArc,用于向模型空间添加一个圆弧
法1:中心点、平面向量、半径、起始角度、终止角度
static AcDbObjectId CreateArc(AcGePoint3d ptCenter, AcGeVector3d vec,
double radius, double startAngle, double endAngle); //创建圆弧(中心点、平面向量、半径、起始角度、终止角度)
AcDbObjectId CCreateEnt::CreateArc(AcGePoint3d ptCenter, AcGeVector3d vec,
double radius, double startAngle, double endAngle)
{
AcDbArc *pArc = new AcDbArc(ptCenter, vec, radius, startAngle, endAngle);
AcDbObjectId arcId;
arcId = CCreateEnt::PostToModelSpace(pArc);
return arcId;
}
法2:添加一个创建位于 XOY 平面上的圆弧的函数
//中心点、半径、起始角度、终止角度
//中心点、半径、起始角度、终止角度
AcDbObjectId CreateArc(AcGePoint2d ptCenter, double radius, double startAngle, double endAngle);
//创建圆弧:添加一个创建位于 XOY 平面上的圆弧的函数中心点、半径、起始角度、终止角度
AcDbObjectId CCreateEnt::CreateArc(AcGePoint2d ptCenter, double radius, double startAngle, double endAngle)
{
CGeometryOper m_geometryOper;
AcGeVector3d vec(0, 0, 1);
return CCreateEnt::CreateArc(m_geometryOper.Pt2dTo3d(ptCenter), vec, radius, startAngle, endAngle);
}
法3: 三点法创建圆弧
AcDbObjectId CreateArc(AcGePoint2d ptStart, AcGePoint2d ptOnArc,
AcGePoint2d ptEnd);
AcDbObjectId CCreateEnt::CreateArc(AcGePoint2d ptStart, AcGePoint2d ptOnArc,
AcGePoint2d ptEnd)
{
// 使用几何类获得圆心、半径
AcGeCircArc2d geArc(ptStart, ptOnArc, ptEnd);
AcGePoint2d ptCenter = geArc.center();
double radius = geArc.radius();
// 计算起始和终止角度
//AcGeVector2d 类用来表示一个二维空间中的矢量, 其成员函数 angle 返回该矢量和 X 轴
//正半轴的角度(用弧度来表示)。
AcGeVector2d vecStart(ptStart.x - ptCenter.x, ptStart.y - ptCenter.y);
AcGeVector2d vecEnd(ptEnd.x - ptCenter.x, ptEnd.y - ptCenter.y);
double startAngle = vecStart.angle();
double endAngle = vecEnd.angle();
return CCreateEnt::CreateArc(ptCenter, radius, startAngle, endAngle);
}
法4:起点、圆心、终点
这个函数的名称不再是 CreateArc ,而是 CreateArcSCE ,这是因为该函数的参数列表、
返回值都与三点法的函数相同,无法实现函数的重载,就只能重新定义一个新的函数名称。
AcDbObjectId CreateArcSCE(AcGePoint2d ptStart, AcGePoint2d ptCenter,
AcGePoint2d ptEnd)
AcDbObjectId CCreateEnt::CreateArcSCE(AcGePoint2d ptStart, AcGePoint2d ptCenter,
AcGePoint2d ptEnd)
{
// 计算半径
double radius = ptCenter.distanceTo(ptStart);
// 计算起、终点角度
AcGeVector2d vecStart(ptStart.x - ptCenter.x, ptStart.y - ptCenter.y);
AcGeVector2d vecEnd(ptEnd.x - ptCenter.x, ptEnd.y - ptCenter.y);
double startAngle = vecStart.angle();
double endAngle = vecEnd.angle();
// 创建圆弧
return CCreateEnt::CreateArc(ptCenter, radius, startAngle, endAngle);
}
法5:起点、圆心、圆弧角度
AcDbObjectId CreateArc(AcGePoint2d ptStart, AcGePoint2d ptCenter,
double angle)
AcDbObjectId CCreateEnt::CreateArc(AcGePoint2d ptStart, AcGePoint2d ptCenter,
double angle)
{
// 计算半径
double radius = ptCenter.distanceTo(ptStart);
// 计算起、终点角度
AcGeVector2d vecStart(ptStart.x - ptCenter.x, ptStart.y - ptCenter.y);
double startAngle = vecStart.angle();
double endAngle = startAngle + angle;
// 创建圆弧
return CCreateEnt::CreateArc(ptCenter, radius, startAngle, endAngle);
}
(3)在CGeometryOper类中:增加一个新的函数 PI,用来计算常量π的值
#include <math.h>
double CGeometryOper::PI()
{
return 4 * atan(1.0);
}
// atan 是一个 C 语言的库函数,用来计算反正切函数的值
(4)在acrxEntryPoint.cpp中添加#include "GeometryOper.h"头文件后添加注册命令
ACED_ARXCOMMAND_ENTRY_AUTO(CArxConfigApp, MidasMyGroup, MyDrawArc, MyDrawArc, ACRX_CMD_MODAL, NULL) //画圆弧
//当前项目中注册一个命令 AddArc
static void MidasMyGroupMyDrawArc()
{
//中心点、平面向量、半径、起始角度、终止角度
CGeometryOper m_geometryOper;
AcGePoint3d ptCenter(0, 0, 0);
AcGeVector3d vec(0, 0, 1);
double radius = 10;
double startAngle = 0;
double endAngle = m_geometryOper.PI();
AcDbObjectId circleId;
circleId = CCreateEnt::CreateArc(ptCenter, vec, radius, startAngle, endAngle);
CModifyEnt m_modifyEnt;
m_modifyEnt.ChangeColor(circleId, 1);
}
原文链接:https://blog.csdn.net/qq_42981953/article/details/121802593[/code] |
|