AutoCAD .Net 创建圆Circle

来源:互联网 发布:剑3成女捏脸数据 编辑:程序博客网 时间:2024/05/21 11:08

以下代码展示:
往模型空间中添加一个圆。圆心为(100, 100, 0),半径为20,圆所在平面为XOY平面。
设置圆的图层、颜色、线型、线宽请参考文章AutoCAD .Net 创建直线Line

using Autodesk.AutoCAD.Runtime;using Autodesk.AutoCAD.ApplicationServices;using Autodesk.AutoCAD.DatabaseServices;using Autodesk.AutoCAD.Geometry;using Autodesk.AutoCAD.EditorInput;using Autodesk.AutoCAD.Colors;[CommandMethod("NewCircle")]public static void NewCircle(){    Document doc = Application.DocumentManager.MdiActiveDocument;    Database db = doc.Database;    using (Transaction tr = db.TransactionManager.StartTransaction())    {        //-------------------------------        // 获取模型空间        //-------------------------------        BlockTable blockTbl = tr.GetObject(            db.BlockTableId, OpenMode.ForRead) as BlockTable;        BlockTableRecord modelSpace = tr.GetObject(            blockTbl[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;        //-------------------------------        // 创建圆        //-------------------------------        Circle circle = new Circle();        circle.Center = new Point3d(100, 100, 0);        circle.Normal = new Vector3d(0, 0, 1);        circle.Radius = 20;        //-------------------------------        // 添加到模型空间并提交到数据库        //-------------------------------        modelSpace.AppendEntity(circle);        tr.AddNewlyCreatedDBObject(circle, true);        tr.Commit();    }}

Circle.Normal 指定圆所在平面的法向量。

AutoCAD .Net API 中没有提供求过3点圆的方法。
附上在2维平面内求过三点圆的方法

/// <summary>/// 求过平面3点的圆/// (x1, y1) --- 点1/// (x2, y2) --- 点2/// (x3, y3) --- 点3/// (cx, cy) --- 求出的圆心坐标/// radius   --- 求出的圆心半径/// 返回值:///     存在则返回true///     不存在则返回false/// </summary>public static bool CircleFrom3Points(    double x1, double y1,    double x2, double y2,    double x3, double y3,    out double cx, out double cy, out double radius){    double a = x1 - x2;    double b = y1 - y2;    double c = x1 - x3;    double d = y1 - y3;    double e = ((x1 * x1 - x2 * x2) + (y1 * y1 - y2 * y2)) / 2.0;    double f = ((x1 * x1 - x3 * x3) + (y1 * y1 - y3 * y3)) / 2.0;    double det = b * c - a * d;    if (Math.Abs(det) < 1e-5)    {        cx = 0;        cy = 0;        radius = 0;        return false;    }    else    {        cx = -(d * e - b * f) / det;        cy = -(a * f - c * e) / det;        radius = Math.Sqrt(            (x1 - cx) * (x1 - cx) + (y1 - cy) * (y1 - cy));        return true;    }}
原创粉丝点击