0. 引言
在了解了如何进行封装后,我们需要将CAD中涉及的一些常用图形都封装好,比如:直线、圆弧、圆、多段线、椭圆等,以后需要就直接拿出来用就好了。
在这之前还是再次回顾一下CAD中类的继承关系是怎样的:
可以看到Line(直线)、Arc(圆弧)、Circle(圆)、Polyline(多段线)、Ellipse(椭圆)这些类都是继承于Curve(曲线)类,而曲线类又继承于Entity类。
捋清楚这个关系后就容易多了!
1. 圆弧封装
首先是Arc(圆弧)类,我们F12跟踪一下它:
跟直线一样,可以看到Arc类也是存在于命名空间Autodesk.AutoCAD.DatabaseServices中
Arc类存在三个构造函数,里面的参数就是字面意思了,就不再详细解释
public Arc();
public Arc(Point3d center, double radius, double startAngle, double endAngle);
public Arc(Point3d center, Vector3d normal, double radius, double startAngle, double endAngle);
下面的一些属性如Center,StartAngle,EndAngle等都是字面意思,绘制圆弧的时候需要的一些属性,在CAD里面画一下就明白了。
public double TotalAngle { get; }
public double Length { get; }
public Vector3d Normal { get; set; }
public double Thickness { get; set; }
public double EndAngle { get; set; }
public double StartAngle { get; set; } // 起始角度
public double Radius { get; set; } // 半径
public Point3d Center { get; set; } // 中心
之后的图形都大同小异,按这个去分析就好了,就不做一一解释了,后面直接给出每种图形的封装
圆弧基本绘制方法封装
三点画圆弧方法封装
里面涉及到的判断起点和终点是否在同一直线上的IsOnOneLine已经封装在基本工具类BaseTools类中,下载源码后将这个类添加进来就可以,你也可以自己写一个。
测试
2. 圆的封装
圆的基本绘制方法封装
两点绘制圆方法封装
同样里面的基本工具GetCenterPointBetweenTwoPoint函数已经封装在BaseTools类中,用于获取两点中心。
三点绘制圆方法封装
测试
3. 多段线封装
多段线
矩形
正多边形
测试
4. 椭圆封装
三点绘制椭圆
GetDistanceBetweenTwoPoint() 用于获取两点间距离,已经封装好,在BaseTools中。
两点绘制椭圆
测试
5. 结语
上面的基本图形就已经封装完毕了,以后需要进一步开发的时候可以拿出来用
还有我为什么选择截图,不用代码段添加,还是希望大家可以多敲,而不是"Ctrl+C" "Ctrl+V"。
还有基本工具类BaseTools.cs懒得下载可以复制粘贴:
using Autodesk.AutoCAD.Geometry;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _02图形创建
{
public static partial class BaseTool
{
/// <summary>
/// 角度转化为弧度
/// </summary>
/// <param name="degree">角度值</param>
/// <returns></returns>
public static double DegreeToAngle(this Double degree)
{
return degree * Math.PI / 180;
}
/// <summary>
/// 弧度转换角度
/// </summary>
/// <param name="angle">弧度制</param>
/// <returns></returns>
public static double AngleToDegree(this Double angle)
{
return angle * 180 / Math.PI;
}
/// <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;
}
}
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 double GetDistanceBetweenTwoPoint(this Point3d point1, Point3d point2)
{
return (Math.Sqrt(Math.Pow((point1.X - point2.X), 2) + Math.Pow((point1.Y - point2.Y), 2) + Math.Pow((point1.Z + point2.Z), 2)));
}
/// <summary>
/// 获取两点的中心点
/// </summary>
/// <param name="point1">第一个点</param>
/// <param name="point2">第二个点</param>
/// <returns></returns>
public static Point3d GetCenterPointBetweenTwoPoint(this Point3d point1, Point3d point2)
{
return new Point3d((point1.X + point2.X) / 2, (point1.Y + point2.Y) / 2, (point1.Z + point2.Z) / 2);
}
}
}
完整代码地址:
https://gitee.com/yuzhaokai/cad_secondary_development_code.git
有帮助的话关注,共同进步!
不折腾会死!Peace!