From bfe4a91eb3eb4dbe3018514551411e3a972c7164 Mon Sep 17 00:00:00 2001 From: giteezxk <9063830+giteezxk@user.noreply.gitee.com> Date: Tue, 8 Jun 2021 20:17:24 +0800 Subject: [PATCH 1/7] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=8C=E3=80=81?= =?UTF-8?q?=E4=B8=89=E7=BB=B4=E7=82=B9=E8=BD=AC=E6=8D=A2=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/IFoxCAD.Cad/ExtensionMethod/GeometryEx.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/IFoxCAD.Cad/ExtensionMethod/GeometryEx.cs b/src/IFoxCAD.Cad/ExtensionMethod/GeometryEx.cs index 93742f0..af9ea7f 100644 --- a/src/IFoxCAD.Cad/ExtensionMethod/GeometryEx.cs +++ b/src/IFoxCAD.Cad/ExtensionMethod/GeometryEx.cs @@ -670,6 +670,16 @@ public static Point2d Point2d(this Point3d pt) return new Point2d(pt.X, pt.Y); } + /// + /// 将二维点转换为三维点 + /// + /// 二维点 + /// 三维点 + public static Point3d Point3d(this Point2d pt) + { + return new Point3d(pt.X, pt.Y, 0); + } + public static IEnumerable Point2d(this IEnumerable pts) { return pts.Select(pt => pt.Point2d()); -- Gitee From dc761f9cec01009d9070a2470c8d5bdf67b17816 Mon Sep 17 00:00:00 2001 From: giteezxk <9063830+giteezxk@user.noreply.gitee.com> Date: Tue, 8 Jun 2021 20:18:04 +0800 Subject: [PATCH 2/7] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=89=E7=A7=8D?= =?UTF-8?q?=E7=94=BB=E5=BC=A7=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/IFoxCAD.Cad/ExtensionMethod/CurveEx.cs | 56 ++++++++++++++++++++++ tests/DBTrans.test/Test.cs | 8 ++++ 2 files changed, 64 insertions(+) diff --git a/src/IFoxCAD.Cad/ExtensionMethod/CurveEx.cs b/src/IFoxCAD.Cad/ExtensionMethod/CurveEx.cs index ba8f5d1..b8831bc 100644 --- a/src/IFoxCAD.Cad/ExtensionMethod/CurveEx.cs +++ b/src/IFoxCAD.Cad/ExtensionMethod/CurveEx.cs @@ -646,6 +646,62 @@ public static NurbCurve3d ToNurbCurve3d(this Arc arc) return new NurbCurve3d(ToEllipticalArc3d(arc)); } + /// + /// 根据圆心、起点和终点来创建圆弧(二维) + /// + /// 圆弧对象 + /// 起点 + /// 圆心 + /// 终点 + public static Arc CreateArcSCE(Point3d startPoint, Point3d centerPoint, Point3d endPoint) + { + Arc arc = new(); + arc.Center = centerPoint; + arc.Radius = centerPoint.DistanceTo(startPoint); + Vector2d startVector = new(startPoint.X - centerPoint.X, startPoint.Y - centerPoint.Y); + Vector2d endVector = new(endPoint.X - centerPoint.X, endPoint.Y - centerPoint.Y); + //计算起始和终止角度 + arc.StartAngle = startVector.Angle; + arc.EndAngle = endVector.Angle; + return arc; + } + /// + /// 三点法创建圆弧(二维)(有问题) + /// + /// 圆弧对象 + /// 起点 + /// 圆弧上的点 + /// 终点 + public static Arc CreateArc(Point3d startPoint, Point3d pointOnArc, Point3d endPoint) + { + //创建一个几何类的圆弧对象 + CircularArc3d geArc = new(startPoint, pointOnArc, endPoint); + //将几何类圆弧对象的圆心和半径赋值给圆弧 +#if ac2009 + return geArc.ToArc(); +#elif ac2013 + return (Arc)Curve.CreateFromGeCurve(geArc); +#endif + } + + /// + /// 根据起点、圆心和圆弧角度创建圆弧(二维) + /// + /// 圆弧对象 + /// 起点 + /// 圆心 + /// 圆弧角度 + public static Arc CreateArc(Point3d startPoint, Point3d centerPoint, double angle) + { + Arc arc = new(); + arc.Center = centerPoint; + arc.Radius = centerPoint.DistanceTo(startPoint); + Vector2d startVector = new(startPoint.X - centerPoint.X, startPoint.Y - centerPoint.Y); + arc.StartAngle = startVector.Angle; + arc.EndAngle = startVector.Angle + angle; + return arc; + } + #endregion Arc #region Ellipse diff --git a/tests/DBTrans.test/Test.cs b/tests/DBTrans.test/Test.cs index ae6e9b8..dcad7aa 100644 --- a/tests/DBTrans.test/Test.cs +++ b/tests/DBTrans.test/Test.cs @@ -70,6 +70,14 @@ public void drawarc() { using var tr = new DBTrans(); tr.CurrentSpace.AddArc(new Point3d(0, 0, 0), new Point3d(1, 1, 0), new Point3d(2, 0, 0)); + Arc arc1 = CurveEx.CreateArcSCE(new Point3d(2, 0, 0), new Point3d(0, 0, 0), new Point3d(0, 2, 0)); + Arc arc2 = CurveEx.CreateArcSCE(new Point3d(0, 3, 0), new Point3d(0, 0, 0), new Point3d(3, 0, 0)); + tr.CurrentSpace.AddEntity(arc1, arc2); + Arc arc3 = CurveEx.CreateArc(new Point3d(4, 0, 0), new Point3d(0, 0, 0), Math.PI / 2); + tr.CurrentSpace.AddEntity(arc3); + Arc arc4 =CurveEx.CreateArcSCE(new Point3d(1, 0, 0), new Point3d(0, 0, 0), new Point3d(0, 1, 0)); + tr.CurrentSpace.AddEntity(arc4); + } [CommandMethod("layertest")] -- Gitee From 924633108fcc16c0c17957cd1c3ac85fa40afcd9 Mon Sep 17 00:00:00 2001 From: giteezxk <9063830+giteezxk@user.noreply.gitee.com> Date: Tue, 8 Jun 2021 20:41:15 +0800 Subject: [PATCH 3/7] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=9C=86=E5=BC=A7=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/IFoxCAD.Cad/ExtensionMethod/CurveEx.cs | 2 +- .../ExtensionMethod/SymbolTableRecordEx.cs | 9 ++------- tests/DBTrans.test/Test.cs | 14 +++++--------- 3 files changed, 8 insertions(+), 17 deletions(-) diff --git a/src/IFoxCAD.Cad/ExtensionMethod/CurveEx.cs b/src/IFoxCAD.Cad/ExtensionMethod/CurveEx.cs index b8831bc..8a2c900 100644 --- a/src/IFoxCAD.Cad/ExtensionMethod/CurveEx.cs +++ b/src/IFoxCAD.Cad/ExtensionMethod/CurveEx.cs @@ -666,7 +666,7 @@ public static Arc CreateArcSCE(Point3d startPoint, Point3d centerPoint, Point3d return arc; } /// - /// 三点法创建圆弧(二维)(有问题) + /// 三点法创建圆弧(二维) /// /// 圆弧对象 /// 起点 diff --git a/src/IFoxCAD.Cad/ExtensionMethod/SymbolTableRecordEx.cs b/src/IFoxCAD.Cad/ExtensionMethod/SymbolTableRecordEx.cs index b3b9890..1bb6492 100644 --- a/src/IFoxCAD.Cad/ExtensionMethod/SymbolTableRecordEx.cs +++ b/src/IFoxCAD.Cad/ExtensionMethod/SymbolTableRecordEx.cs @@ -181,13 +181,8 @@ public static ObjectId AddPline(this BlockTableRecord btr, List pts, Li /// 圆弧id public static ObjectId AddArc(this BlockTableRecord btr, Point3d startPoint, Point3d pointOnArc, Point3d endPoint, Action action = default, Transaction trans = default) { - - var arc = new CircularArc3d(startPoint, pointOnArc, endPoint); -#if ac2009 - return btr.AddEnt(arc.ToArc(), action, trans); -#elif ac2013 - return btr.AddEnt(Curve.CreateFromGeCurve(arc) as Arc, action, trans); -#endif + var arc = CurveEx.CreateArc(startPoint, pointOnArc, endPoint); + return btr.AddEnt(arc, action, trans); } #endregion diff --git a/tests/DBTrans.test/Test.cs b/tests/DBTrans.test/Test.cs index dcad7aa..0acd175 100644 --- a/tests/DBTrans.test/Test.cs +++ b/tests/DBTrans.test/Test.cs @@ -69,15 +69,11 @@ public void Addent() public void drawarc() { using var tr = new DBTrans(); - tr.CurrentSpace.AddArc(new Point3d(0, 0, 0), new Point3d(1, 1, 0), new Point3d(2, 0, 0)); - Arc arc1 = CurveEx.CreateArcSCE(new Point3d(2, 0, 0), new Point3d(0, 0, 0), new Point3d(0, 2, 0)); - Arc arc2 = CurveEx.CreateArcSCE(new Point3d(0, 3, 0), new Point3d(0, 0, 0), new Point3d(3, 0, 0)); - tr.CurrentSpace.AddEntity(arc1, arc2); - Arc arc3 = CurveEx.CreateArc(new Point3d(4, 0, 0), new Point3d(0, 0, 0), Math.PI / 2); - tr.CurrentSpace.AddEntity(arc3); - Arc arc4 =CurveEx.CreateArcSCE(new Point3d(1, 0, 0), new Point3d(0, 0, 0), new Point3d(0, 1, 0)); - tr.CurrentSpace.AddEntity(arc4); - + Arc arc1 = CurveEx.CreateArcSCE(new Point3d(2, 0, 0), new Point3d(0, 0, 0), new Point3d(0, 2, 0));//起点,圆心,终点 + Arc arc2 = CurveEx.CreateArc(new Point3d(4, 0, 0), new Point3d(0, 0, 0), Math.PI / 2);//起点,圆心,弧度 + Arc arc3 = CurveEx.CreateArc(new Point3d(1, 0, 0), new Point3d(0, 0, 0), new Point3d(0, 1, 0));//起点,圆上一点,终点 + tr.CurrentSpace.AddEntity(arc1, arc2, arc3); + tr.CurrentSpace.AddArc(new Point3d(0, 0, 0), new Point3d(1, 1, 0), new Point3d(2, 0, 0));//起点,圆上一点,终点 } [CommandMethod("layertest")] -- Gitee From f54fe35393927b95e79c75f7a3963732fe83e00f Mon Sep 17 00:00:00 2001 From: giteezxk <9063830+giteezxk@user.noreply.gitee.com> Date: Tue, 8 Jun 2021 22:59:14 +0800 Subject: [PATCH 4/7] =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E5=9C=86=E5=BC=A7=E6=96=B9=E6=B3=95=E4=BD=8D=E7=BD=AE=20?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=88=9B=E5=BB=BA=E5=9C=86=E6=96=B9=E6=B3=95?= =?UTF-8?q?=20=E5=A2=9E=E5=8A=A0=E8=8E=B7=E5=8F=96=E4=B8=AD=E7=82=B9?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/IFoxCAD.Cad/ExtensionMethod/CurveEx.cs | 58 +-------- src/IFoxCAD.Cad/ExtensionMethod/EntityEx.cs | 110 ++++++++++++++++++ src/IFoxCAD.Cad/ExtensionMethod/GeometryEx.cs | 13 ++- .../ExtensionMethod/SymbolTableRecordEx.cs | 25 ++-- tests/DBTrans.test/Test.cs | 19 ++- 5 files changed, 148 insertions(+), 77 deletions(-) diff --git a/src/IFoxCAD.Cad/ExtensionMethod/CurveEx.cs b/src/IFoxCAD.Cad/ExtensionMethod/CurveEx.cs index 8a2c900..fd3bf83 100644 --- a/src/IFoxCAD.Cad/ExtensionMethod/CurveEx.cs +++ b/src/IFoxCAD.Cad/ExtensionMethod/CurveEx.cs @@ -644,63 +644,7 @@ public static EllipticalArc3d ToEllipticalArc3d(this Arc arc) public static NurbCurve3d ToNurbCurve3d(this Arc arc) { return new NurbCurve3d(ToEllipticalArc3d(arc)); - } - - /// - /// 根据圆心、起点和终点来创建圆弧(二维) - /// - /// 圆弧对象 - /// 起点 - /// 圆心 - /// 终点 - public static Arc CreateArcSCE(Point3d startPoint, Point3d centerPoint, Point3d endPoint) - { - Arc arc = new(); - arc.Center = centerPoint; - arc.Radius = centerPoint.DistanceTo(startPoint); - Vector2d startVector = new(startPoint.X - centerPoint.X, startPoint.Y - centerPoint.Y); - Vector2d endVector = new(endPoint.X - centerPoint.X, endPoint.Y - centerPoint.Y); - //计算起始和终止角度 - arc.StartAngle = startVector.Angle; - arc.EndAngle = endVector.Angle; - return arc; - } - /// - /// 三点法创建圆弧(二维) - /// - /// 圆弧对象 - /// 起点 - /// 圆弧上的点 - /// 终点 - public static Arc CreateArc(Point3d startPoint, Point3d pointOnArc, Point3d endPoint) - { - //创建一个几何类的圆弧对象 - CircularArc3d geArc = new(startPoint, pointOnArc, endPoint); - //将几何类圆弧对象的圆心和半径赋值给圆弧 -#if ac2009 - return geArc.ToArc(); -#elif ac2013 - return (Arc)Curve.CreateFromGeCurve(geArc); -#endif - } - - /// - /// 根据起点、圆心和圆弧角度创建圆弧(二维) - /// - /// 圆弧对象 - /// 起点 - /// 圆心 - /// 圆弧角度 - public static Arc CreateArc(Point3d startPoint, Point3d centerPoint, double angle) - { - Arc arc = new(); - arc.Center = centerPoint; - arc.Radius = centerPoint.DistanceTo(startPoint); - Vector2d startVector = new(startPoint.X - centerPoint.X, startPoint.Y - centerPoint.Y); - arc.StartAngle = startVector.Angle; - arc.EndAngle = startVector.Angle + angle; - return arc; - } + } #endregion Arc diff --git a/src/IFoxCAD.Cad/ExtensionMethod/EntityEx.cs b/src/IFoxCAD.Cad/ExtensionMethod/EntityEx.cs index 38efca4..20fa082 100644 --- a/src/IFoxCAD.Cad/ExtensionMethod/EntityEx.cs +++ b/src/IFoxCAD.Cad/ExtensionMethod/EntityEx.cs @@ -232,5 +232,115 @@ public static string GetUnFormatString(this MText mt) return string.Join("", strs.ToArray()); } #endregion + + #region 圆弧 + + /// + /// 根据圆心、起点和终点来创建圆弧(二维) + /// + /// 圆弧对象 + /// 起点 + /// 圆心 + /// 终点 + /// 圆弧 + public static Arc CreateArcSCE(Point3d startPoint, Point3d centerPoint, Point3d endPoint) + { + Arc arc = new(); + arc.Center = centerPoint; + arc.Radius = centerPoint.DistanceTo(startPoint); + Vector2d startVector = new(startPoint.X - centerPoint.X, startPoint.Y - centerPoint.Y); + Vector2d endVector = new(endPoint.X - centerPoint.X, endPoint.Y - centerPoint.Y); + //计算起始和终止角度 + arc.StartAngle = startVector.Angle; + arc.EndAngle = endVector.Angle; + return arc; + } + /// + /// 三点法创建圆弧(二维) + /// + /// 圆弧对象 + /// 起点 + /// 圆弧上的点 + /// 终点 + /// 圆弧 + public static Arc CreateArc(Point3d startPoint, Point3d pointOnArc, Point3d endPoint) + { + //创建一个几何类的圆弧对象 + CircularArc3d geArc = new(startPoint, pointOnArc, endPoint); + //将几何类圆弧对象的圆心和半径赋值给圆弧 +#if ac2009 + return geArc.ToArc(); +#elif ac2013 + return (Arc)Curve.CreateFromGeCurve(geArc); +#endif + } + + /// + /// 根据起点、圆心和圆弧角度创建圆弧(二维) + /// + /// 圆弧对象 + /// 起点 + /// 圆心 + /// 圆弧角度 + /// 圆弧 + public static Arc CreateArc(Point3d startPoint, Point3d centerPoint, double angle) + { + Arc arc = new(); + arc.Center = centerPoint; + arc.Radius = centerPoint.DistanceTo(startPoint); + Vector2d startVector = new(startPoint.X - centerPoint.X, startPoint.Y - centerPoint.Y); + arc.StartAngle = startVector.Angle; + arc.EndAngle = startVector.Angle + angle; + return arc; + } + + #endregion + + #region 圆 + + /// + /// 两点创建圆(两点中点为圆心) + /// + /// 起点 + /// 终点 + /// + public static Circle CreateCircle(Point3d startPoint, Point3d endPoint) + { + Circle circle = new(); + circle.Center = GeometryEx.MidPoint(startPoint, endPoint); + circle.Radius = startPoint.DistanceTo(endPoint) * 0.5; + return circle; + } + + /// + /// 三点法创建圆 + /// + /// 第一点 + /// 第二点 + /// 第三点 + /// 若成功创建圆,则输出true,否则输出false + /// + public static Circle CreateCircle(Point3d pt1, Point3d pt2, Point3d pt3, out bool bl) + { + //先判断三点是否共线,得到pt1点指向pt2、pt2点的矢量 + Vector3d va = pt1.GetVectorTo(pt2); + Vector3d vb = pt1.GetVectorTo(pt3); + //如两矢量夹角为0或180度(π弧度),则三点共线. + if (va.GetAngleTo(vb) == 0 | va.GetAngleTo(vb) == Math.PI) + { + bl = false; + return new Circle(); + } + else + { + //创建一个几何类的圆弧对象 + CircularArc3d geArc = new(pt1, pt2, pt3); + geArc.ToCircle(); + bl = true; + return geArc.ToCircle(); + } + } + + #endregion } } diff --git a/src/IFoxCAD.Cad/ExtensionMethod/GeometryEx.cs b/src/IFoxCAD.Cad/ExtensionMethod/GeometryEx.cs index 8d76ce1..deb4655 100644 --- a/src/IFoxCAD.Cad/ExtensionMethod/GeometryEx.cs +++ b/src/IFoxCAD.Cad/ExtensionMethod/GeometryEx.cs @@ -58,7 +58,7 @@ public enum PointOnRegionType /// public static class GeometryEx { - + #region Point&Circle /// @@ -729,6 +729,17 @@ public static Point3d Point3d(this Point2d pt) return new Point3d(pt.X, pt.Y, 0); } + /// + /// 获取两个点之间的中点 + /// + /// 第一点 + /// 第二点 + /// 返回两个点之间的中点 + public static Point3d MidPoint(Point3d pt1, Point3d pt2) + { + return new Point3d((pt1.X + pt2.X) * 0.5, (pt1.Y + pt2.Y) * 0.5, (pt1.Z + pt2.Z) * 0.5); + } + public static IEnumerable Point2d(this IEnumerable pts) { return pts.Select(pt => pt.Point2d()); diff --git a/src/IFoxCAD.Cad/ExtensionMethod/SymbolTableRecordEx.cs b/src/IFoxCAD.Cad/ExtensionMethod/SymbolTableRecordEx.cs index 1bb6492..7ccaff8 100644 --- a/src/IFoxCAD.Cad/ExtensionMethod/SymbolTableRecordEx.cs +++ b/src/IFoxCAD.Cad/ExtensionMethod/SymbolTableRecordEx.cs @@ -125,25 +125,18 @@ public static ObjectId AddCircle(this BlockTableRecord btr, Point3d center, doub /// 圆属性设置委托 /// 事务管理器 /// 三点有外接圆则返回圆的id,否则返回ObjectId.Null - public static ObjectId AddCircle(this BlockTableRecord btr, Point3d p0, Point3d p1, Point3d p2, Action action = default, Transaction trans = default) + public static ObjectId AddCircle(this BlockTableRecord btr, Point3d p0, Point3d p1, Point3d p2, + Action action = default, Transaction trans = default) { - var dx1 = p1.X - p0.X; - var dy1 = p1.Y - p0.Y; - var dx2 = p2.X - p0.X; - var dy2 = p2.Y - p0.Y; - - var d = dx1 * dy2 - dx2 * dy1; - - if (d != 0.0) + Circle circle = EntityEx.CreateCircle(p0, p1, p2, out bool pl); + if (pl) { - var d2 = d * 2; - var c1 = (p0.X + p1.X) * dx1 + (p0.Y + p1.Y) * dy1; - var c2 = (p0.X + p2.X) * dx2 + (p0.Y + p2.Y) * dy2; - var ce = new Point3d((c1 * dy2 - c2 * dy1) / d2, (c2 * dx1 - c1 * dx2) / d2, 0); - var circle = new Circle(ce, Vector3d.ZAxis, p0.DistanceTo(ce)); return btr.AddEnt(circle, action, trans); } - return ObjectId.Null; + else + { + return ObjectId.Null; + } } /// /// 在指定的绘图空间添加轻多段线 @@ -181,7 +174,7 @@ public static ObjectId AddPline(this BlockTableRecord btr, List pts, Li /// 圆弧id public static ObjectId AddArc(this BlockTableRecord btr, Point3d startPoint, Point3d pointOnArc, Point3d endPoint, Action action = default, Transaction trans = default) { - var arc = CurveEx.CreateArc(startPoint, pointOnArc, endPoint); + var arc = EntityEx.CreateArc(startPoint, pointOnArc, endPoint); return btr.AddEnt(arc, action, trans); } #endregion diff --git a/tests/DBTrans.test/Test.cs b/tests/DBTrans.test/Test.cs index 0acd175..8f48561 100644 --- a/tests/DBTrans.test/Test.cs +++ b/tests/DBTrans.test/Test.cs @@ -69,13 +69,26 @@ public void Addent() public void drawarc() { using var tr = new DBTrans(); - Arc arc1 = CurveEx.CreateArcSCE(new Point3d(2, 0, 0), new Point3d(0, 0, 0), new Point3d(0, 2, 0));//起点,圆心,终点 - Arc arc2 = CurveEx.CreateArc(new Point3d(4, 0, 0), new Point3d(0, 0, 0), Math.PI / 2);//起点,圆心,弧度 - Arc arc3 = CurveEx.CreateArc(new Point3d(1, 0, 0), new Point3d(0, 0, 0), new Point3d(0, 1, 0));//起点,圆上一点,终点 + Arc arc1 = EntityEx.CreateArcSCE(new Point3d(2, 0, 0), new Point3d(0, 0, 0), new Point3d(0, 2, 0));//起点,圆心,终点 + Arc arc2 = EntityEx.CreateArc(new Point3d(4, 0, 0), new Point3d(0, 0, 0), Math.PI / 2);//起点,圆心,弧度 + Arc arc3 = EntityEx.CreateArc(new Point3d(1, 0, 0), new Point3d(0, 0, 0), new Point3d(0, 1, 0));//起点,圆上一点,终点 tr.CurrentSpace.AddEntity(arc1, arc2, arc3); tr.CurrentSpace.AddArc(new Point3d(0, 0, 0), new Point3d(1, 1, 0), new Point3d(2, 0, 0));//起点,圆上一点,终点 } + [CommandMethod("drawcircle")] + public void draCircle() + { + using var tr = new DBTrans(); + Circle circle1 = EntityEx.CreateCircle(new Point3d(0, 0, 0), new Point3d(1, 0, 0));//起点,终点 + Circle circle2 = EntityEx.CreateCircle(new Point3d(-2, 0, 0), new Point3d(2, 0, 0), new Point3d(0, 2, 0), out bool bl1);//三点画圆,成功 + Circle circle3 = EntityEx.CreateCircle(new Point3d(-2, 0, 0), new Point3d(0, 0, 0), new Point3d(2, 0, 0), out bool bl2);//起点,圆心,终点,失败 + tr.CurrentSpace.AddEntity(circle1, circle2, circle3); + tr.Editor.WriteMessage(bl1.ToString() + "\n" + bl2.ToString()); + tr.CurrentSpace.AddCircle(new Point3d(0, 0, 0), new Point3d(1, 1, 0), new Point3d(2, 0, 0));//三点画圆,成功 + tr.CurrentSpace.AddCircle(new Point3d(0, 0, 0), new Point3d(1, 1, 0), new Point3d(2, 2, 0));//起点,圆上一点,终点(共线) + } + [CommandMethod("layertest")] public void Layertest() { -- Gitee From d07a148000870445c1ad17884ed742c540dd9e23 Mon Sep 17 00:00:00 2001 From: giteezxk <9063830+giteezxk@user.noreply.gitee.com> Date: Tue, 8 Jun 2021 23:29:58 +0800 Subject: [PATCH 5/7] =?UTF-8?q?=E4=BF=AE=E6=94=B9MidPoint=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E4=B8=BAGetMidPointTo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/IFoxCAD.Cad/ExtensionMethod/EntityEx.cs | 2 +- src/IFoxCAD.Cad/ExtensionMethod/GeometryEx.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/IFoxCAD.Cad/ExtensionMethod/EntityEx.cs b/src/IFoxCAD.Cad/ExtensionMethod/EntityEx.cs index 20fa082..dcdaf67 100644 --- a/src/IFoxCAD.Cad/ExtensionMethod/EntityEx.cs +++ b/src/IFoxCAD.Cad/ExtensionMethod/EntityEx.cs @@ -307,7 +307,7 @@ public static Arc CreateArc(Point3d startPoint, Point3d centerPoint, double angl public static Circle CreateCircle(Point3d startPoint, Point3d endPoint) { Circle circle = new(); - circle.Center = GeometryEx.MidPoint(startPoint, endPoint); + circle.Center = startPoint.GetMidPointTo(endPoint); circle.Radius = startPoint.DistanceTo(endPoint) * 0.5; return circle; } diff --git a/src/IFoxCAD.Cad/ExtensionMethod/GeometryEx.cs b/src/IFoxCAD.Cad/ExtensionMethod/GeometryEx.cs index deb4655..1f15466 100644 --- a/src/IFoxCAD.Cad/ExtensionMethod/GeometryEx.cs +++ b/src/IFoxCAD.Cad/ExtensionMethod/GeometryEx.cs @@ -735,7 +735,7 @@ public static Point3d Point3d(this Point2d pt) /// 第一点 /// 第二点 /// 返回两个点之间的中点 - public static Point3d MidPoint(Point3d pt1, Point3d pt2) + public static Point3d GetMidPointTo(this Point3d pt1, Point3d pt2) { return new Point3d((pt1.X + pt2.X) * 0.5, (pt1.Y + pt2.Y) * 0.5, (pt1.Z + pt2.Z) * 0.5); } -- Gitee From 15c30220c33f624ee96dc0a1c767a511b3144898 Mon Sep 17 00:00:00 2001 From: giteezxk <9063830+giteezxk@user.noreply.gitee.com> Date: Wed, 9 Jun 2021 00:23:45 +0800 Subject: [PATCH 6/7] =?UTF-8?q?=E4=BF=AE=E6=94=B9CreateCircle?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/IFoxCAD.Cad/ExtensionMethod/EntityEx.cs | 9 +++------ .../ExtensionMethod/SymbolTableRecordEx.cs | 11 ++--------- tests/DBTrans.test/Test.cs | 16 ++++++++++++---- 3 files changed, 17 insertions(+), 19 deletions(-) diff --git a/src/IFoxCAD.Cad/ExtensionMethod/EntityEx.cs b/src/IFoxCAD.Cad/ExtensionMethod/EntityEx.cs index dcdaf67..90e0dbb 100644 --- a/src/IFoxCAD.Cad/ExtensionMethod/EntityEx.cs +++ b/src/IFoxCAD.Cad/ExtensionMethod/EntityEx.cs @@ -313,14 +313,13 @@ public static Circle CreateCircle(Point3d startPoint, Point3d endPoint) } /// - /// 三点法创建圆 + /// 三点法创建圆(失败则返回Null) /// /// 第一点 /// 第二点 /// 第三点 - /// 若成功创建圆,则输出true,否则输出false /// - public static Circle CreateCircle(Point3d pt1, Point3d pt2, Point3d pt3, out bool bl) + public static Circle CreateCircle(Point3d pt1, Point3d pt2, Point3d pt3) { //先判断三点是否共线,得到pt1点指向pt2、pt2点的矢量 Vector3d va = pt1.GetVectorTo(pt2); @@ -328,15 +327,13 @@ public static Circle CreateCircle(Point3d pt1, Point3d pt2, Point3d pt3, out boo //如两矢量夹角为0或180度(π弧度),则三点共线. if (va.GetAngleTo(vb) == 0 | va.GetAngleTo(vb) == Math.PI) { - bl = false; - return new Circle(); + return null; } else { //创建一个几何类的圆弧对象 CircularArc3d geArc = new(pt1, pt2, pt3); geArc.ToCircle(); - bl = true; return geArc.ToCircle(); } } diff --git a/src/IFoxCAD.Cad/ExtensionMethod/SymbolTableRecordEx.cs b/src/IFoxCAD.Cad/ExtensionMethod/SymbolTableRecordEx.cs index 7ccaff8..d6b5233 100644 --- a/src/IFoxCAD.Cad/ExtensionMethod/SymbolTableRecordEx.cs +++ b/src/IFoxCAD.Cad/ExtensionMethod/SymbolTableRecordEx.cs @@ -128,15 +128,8 @@ public static ObjectId AddCircle(this BlockTableRecord btr, Point3d center, doub public static ObjectId AddCircle(this BlockTableRecord btr, Point3d p0, Point3d p1, Point3d p2, Action action = default, Transaction trans = default) { - Circle circle = EntityEx.CreateCircle(p0, p1, p2, out bool pl); - if (pl) - { - return btr.AddEnt(circle, action, trans); - } - else - { - return ObjectId.Null; - } + Circle circle = EntityEx.CreateCircle(p0, p1, p2); + return circle is not null ? btr.AddEnt(circle, action, trans) : throw new System.Exception("实体为Null"); } /// /// 在指定的绘图空间添加轻多段线 diff --git a/tests/DBTrans.test/Test.cs b/tests/DBTrans.test/Test.cs index 8f48561..14e956b 100644 --- a/tests/DBTrans.test/Test.cs +++ b/tests/DBTrans.test/Test.cs @@ -81,10 +81,18 @@ public void draCircle() { using var tr = new DBTrans(); Circle circle1 = EntityEx.CreateCircle(new Point3d(0, 0, 0), new Point3d(1, 0, 0));//起点,终点 - Circle circle2 = EntityEx.CreateCircle(new Point3d(-2, 0, 0), new Point3d(2, 0, 0), new Point3d(0, 2, 0), out bool bl1);//三点画圆,成功 - Circle circle3 = EntityEx.CreateCircle(new Point3d(-2, 0, 0), new Point3d(0, 0, 0), new Point3d(2, 0, 0), out bool bl2);//起点,圆心,终点,失败 - tr.CurrentSpace.AddEntity(circle1, circle2, circle3); - tr.Editor.WriteMessage(bl1.ToString() + "\n" + bl2.ToString()); + Circle circle2 = EntityEx.CreateCircle(new Point3d(-2, 0, 0), new Point3d(2, 0, 0), new Point3d(0, 2, 0));//三点画圆,成功 + Circle circle3 = EntityEx.CreateCircle(new Point3d(-2, 0, 0), new Point3d(0, 0, 0), new Point3d(2, 0, 0));//起点,圆心,终点,失败 + tr.CurrentSpace.AddEntity(circle1, circle2); + if (circle3 is not null) + { + tr.CurrentSpace.AddEntity(circle3); + } + else + { + tr.Editor.WriteMessage("三点画圆失败"); + } + tr.CurrentSpace.AddEntity(circle3); tr.CurrentSpace.AddCircle(new Point3d(0, 0, 0), new Point3d(1, 1, 0), new Point3d(2, 0, 0));//三点画圆,成功 tr.CurrentSpace.AddCircle(new Point3d(0, 0, 0), new Point3d(1, 1, 0), new Point3d(2, 2, 0));//起点,圆上一点,终点(共线) } -- Gitee From 6241ce78016e484bb3be16b89492fffd400f6b33 Mon Sep 17 00:00:00 2001 From: giteezxk <9063830+giteezxk@user.noreply.gitee.com> Date: Wed, 9 Jun 2021 00:28:56 +0800 Subject: [PATCH 7/7] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/IFoxCAD.Cad/ExtensionMethod/SymbolTableRecordEx.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/IFoxCAD.Cad/ExtensionMethod/SymbolTableRecordEx.cs b/src/IFoxCAD.Cad/ExtensionMethod/SymbolTableRecordEx.cs index d6b5233..2c87411 100644 --- a/src/IFoxCAD.Cad/ExtensionMethod/SymbolTableRecordEx.cs +++ b/src/IFoxCAD.Cad/ExtensionMethod/SymbolTableRecordEx.cs @@ -129,7 +129,7 @@ public static ObjectId AddCircle(this BlockTableRecord btr, Point3d p0, Point3d Action action = default, Transaction trans = default) { Circle circle = EntityEx.CreateCircle(p0, p1, p2); - return circle is not null ? btr.AddEnt(circle, action, trans) : throw new System.Exception("实体为Null"); + return circle is not null ? btr.AddEnt(circle, action, trans) : throw new ArgumentNullException(nameof(circle), "对象为 null"); } /// /// 在指定的绘图空间添加轻多段线 -- Gitee