diff --git a/src/IFoxCAD.Cad/ExtensionMethod/Enums.cs b/src/IFoxCAD.Cad/ExtensionMethod/Enums.cs index fc0fbafebdb2cd4a0cebb775ca170be205af787c..acec0262fc2e66b641aa5dfc523b9b8e24715ab8 100644 --- a/src/IFoxCAD.Cad/ExtensionMethod/Enums.cs +++ b/src/IFoxCAD.Cad/ExtensionMethod/Enums.cs @@ -23,7 +23,12 @@ public enum CoordinateSystemCode /// /// 图纸空间坐标系 /// - PDcs + PDcs, + + /// + /// 块空间坐标系 + /// + Dcs } /// diff --git a/src/IFoxCAD.Cad/ExtensionMethod/GeometryEx.cs b/src/IFoxCAD.Cad/ExtensionMethod/GeometryEx.cs index 84b57f7d19dabd27ce64af2a8329fa176dec7526..89347277c01f4dbd86819057d0ebce96e278da8a 100644 --- a/src/IFoxCAD.Cad/ExtensionMethod/GeometryEx.cs +++ b/src/IFoxCAD.Cad/ExtensionMethod/GeometryEx.cs @@ -544,7 +544,28 @@ public static Vector3d Wcs2Dcs(this Vector3d vec, bool atPaperSpace) CoordinateSystemCode.Wcs, atPaperSpace ? CoordinateSystemCode.PDcs : CoordinateSystemCode.MDcs ); } - + /// + /// 某点在块内坐标系统和世界或者用户坐标系统的转换 + /// + /// 要变换的点 + /// 要变换的块 + /// 源坐标系 + /// 目标坐标系 + /// + public static Point3d TransNested(this Point3d pt, List btrList, CoordinateSystemCode from, CoordinateSystemCode to) + { + if (from == CoordinateSystemCode.Ucs) pt = pt.Ucs2Wcs(); + if (from == CoordinateSystemCode.Dcs) btrList.Reverse(); + if (from == CoordinateSystemCode.Dcs || to == CoordinateSystemCode.Dcs) + { + foreach (var btr in btrList) + { + Matrix3d geom = to == CoordinateSystemCode.Dcs ? btr.BlockTransform.Inverse() : btr.BlockTransform; + pt = pt.TransformBy(geom); + } + } + return to == CoordinateSystemCode.Ucs ? pt.Wcs2Ucs() : pt; + } #endregion Ucs diff --git a/tests/Test/testeditor.cs b/tests/Test/testeditor.cs index 9c71a9a7a499202a17b3b9010ce3d7649a340ab4..9e02b0a269440751b06cfe0d446aa2fec9d196cc 100644 --- a/tests/Test/testeditor.cs +++ b/tests/Test/testeditor.cs @@ -51,10 +51,28 @@ public void testzoomextent() [CommandMethod("testssget")] public void testssget() { - var ss = + var ss = Env.Editor.SSGet(":S", messages: new string[2] { "get", "del" }, keywords: new string[2] { "A", "B" }); Env.Print(ss); } + + /// + /// 测试块中坐标和图纸坐标转换 + /// + [CommandMethod("pointtest")] + public static void Testhot() + { + using var tr = new DBTrans(); + Editor ed = Env.Editor; + PromptEntityResult BLK = ed.GetEntity("\n请选择一个图元:"); + if (BLK.Status != PromptStatus.OK) return; + var blk = BLK.ObjectId.GetObject(); + List blklist = new List(); + if (blk == null) return; + blklist.Add(blk); + Point3d p = new Point3d(4454, -1321, 0.0).TransNested(blklist, CoordinateSystemCode.Dcs, CoordinateSystemCode.Ucs); + ed.WriteMessage(p.ToString()); + } }