Auto CAD二次开发——三点创建圆弧对象函数封装
学如逆水行舟,不进则退。 愿自己不忘初心,坚持积累。感谢大家的支持。在上一篇博客中已经实现了三点圆弧对象的创建(Auto CAD二次开发——三点创建圆弧对象-CSDN博客),这篇文章对其进行封装,便于后续的其他绘制圆弧功能的实现。
前文已经实现了对图形对象实体(Entity)的封装(AddEntityToModelSpace),本次依旧会在圆弧封装函数的返回函数中调用。目前不需要对绘制出来的对象进行下一步操作,因此如果只是简单的学习不用管返回值,若后续对创建的对象进行操作,则得到封装函数的返回值就很有必要了。
本次分装一共包括三个函数:
1、判断三点是否在同一条直线上,如果在则不进行圆弧创建;
2、获得点到X轴的弧度值;
3、三点画圆函数封装;
前两个封装函数在第三个封装函数会调用,也是绘制圆弧中常见用一段代码,因此对其进行独立封装。
具体代码:
封装函数:
/// <summary>/// 判断三点是否在同一条直线上/// </summary>/// <param name="firstPoint">第一个点</param>/// <param name="secondPoint">第二个点</param>/// <param name="thirdPoint">第三个点</param>/// <returns></returns>public static bool IsOnOneLine(this Point3d firstPoint, Point3d secondPoint, Point3d thirdPoint){Vector3d v21 = secondPoint.GetVectorTo(firstPoint);Vector3d v23 = secondPoint.GetVectorTo(thirdPoint);if (v21.GetAngleTo(v23) == 0 || v21.GetAngleTo(v23) == Math.PI){return true;}else{return false;}}/// <summary>/// 获得点到X轴的弧度值/// </summary>/// <param name="startPoint">起点</param>/// <param name="endPoint">终点</param>/// <returns></returns>public static double GetAngleToXAxis(this Point3d startPoint, Point3d endPoint){//声明一个与X轴平行的向量Vector3d temp = new Vector3d(1, 0, 0);//获取起点到终点的向量Vector3d VsToe = startPoint.GetVectorTo(endPoint);return VsToe.Y > 0 ? temp.GetAngleTo(VsToe) : -temp.GetAngleTo(VsToe);}public static ObjectId AddArcToModelSpace(this Database db, Point3d startPoint, Point3d pointOnArc, Point3d endPoint){//先判断三点是否在同一条直线上if (startPoint.IsOnOneLine(pointOnArc, endPoint)){return ObjectId.Null;}//创建几何类对象CircularArc3d cArc = new CircularArc3d(startPoint, pointOnArc, endPoint);//通过几何类对象获取其属性//double radius = cArc.Radius; //半径//Point3d center = cArc.Center; //所在圆的圆心//Vector3d cs = center.GetVectorTo(startPoint); //圆心到起点的向量//Vector3d ce = center.GetVectorTo(endPoint); //圆心到终点的向量//Vector3d xVector = new Vector3d(1, 0, 0); //X正方向的向量////圆弧的起始角度//double startAngle = cs.Y > 0 ? xVector.GetAngleTo(cs) : -xVector.GetAngleTo(cs);////圆弧的终止角度//double endAngle = ce.Y > 0 ? xVector.GetAngleTo(ce) : -xVector.GetAngleTo(ce);//创建圆弧对象Arc arc = new Arc(cArc.Center, cArc.Radius, cArc.Center.GetAngleToXAxis(startPoint), cArc.Center.GetAngleToXAxis(endPoint));//加入图形数据库return db.AddEntityToModelSpace(arc);}
函数调用:
//声明图形数据库Database db = HostApplicationServices.WorkingDatabase;Point3d startPoint = new Point3d(100, 100, 0);// 圆弧起点Point3d endPoint = new Point3d(200, 200, 0);// 圆弧终点Point3d pointOnArc = new Point3d(150, 100, 0);// 圆弧上的一个点db.AddArcToModelSpace(startPoint, pointOnArc, endPoint);startPoint = new Point3d(100, 100, 0);// 圆弧起点endPoint = new Point3d(200, 200, 0);// 圆弧终点pointOnArc = new Point3d(150, 150, 0);// 圆弧上的一个点db.AddArcToModelSpace(startPoint, pointOnArc, endPoint);
注意第一段代码三点不共线,可以绘制圆弧,第二段代码,三点共线不绘制圆弧。

