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());
+ }
}