diff --git a/Views/UserControl/Viewport3D.xaml.cs b/Views/UserControl/Viewport3D.xaml.cs index 3e6dc03..8038817 100644 --- a/Views/UserControl/Viewport3D.xaml.cs +++ b/Views/UserControl/Viewport3D.xaml.cs @@ -129,7 +129,7 @@ public partial class Viewport3D var maxDimension = ViewportManager.ModelBounds.Size.Length(); var distance = maxDimension *1.2; // 调整相机到模型的距离,保证视野范围内 // 获取当前相机 - var camera = Viewport3Dx.Camera as HelixToolkit.Wpf.SharpDX.PerspectiveCamera; + var camera = Viewport3Dx.Camera as HelixToolkit.Wpf.SharpDX.OrthographicCamera; switch (directionName) { @@ -187,7 +187,7 @@ public partial class Viewport3D var center = ViewportManager.ModelBounds.Center; var maxDimension = ViewportManager.ModelBounds.Size.Length(); var distance = maxDimension *1.2; // 调整相机到模型的距离,保证视野范围内 - var camera = Viewport3Dx.Camera as HelixToolkit.Wpf.SharpDX.PerspectiveCamera; + var camera = Viewport3Dx.Camera as HelixToolkit.Wpf.SharpDX.OrthographicCamera; camera.Position = new Point3D(center.X, center.Y, center.Z + distance); // 从前面看,Z轴正方向 camera.UpDirection = new Vector3D(0, -1, 0); camera.LookDirection = new Vector3D(center.X - camera.Position.X, center.Y - camera.Position.Y, center.Z - camera.Position.Z); @@ -211,7 +211,7 @@ public partial class Viewport3D var directionValue = (int)TbCustomizeRevolve.Value; // 旋转角度(单位:度) // 获取当前相机和模型中心 - var camera = Viewport3Dx.Camera as HelixToolkit.Wpf.SharpDX.PerspectiveCamera; + var camera = Viewport3Dx.Camera as HelixToolkit.Wpf.SharpDX.OrthographicCamera; if (camera == null) return; var modelCenter = ViewportManager.CenterVector; // 模型中心 @@ -413,17 +413,7 @@ public partial class Viewport3D ViewportManager.ResetChooseAddModels(); break; case "ViewportRightMenuShowMeshLines": - var center = ViewportManager.ModelBounds.Center; - var maxDimension = ViewportManager.ModelBounds.Size.Length(); - var distance = maxDimension * 1.2; // 调整相机到模型的距离,保证视野范围内 - // 获取当前相机 - var camera = Viewport3Dx.Camera as HelixToolkit.Wpf.SharpDX.PerspectiveCamera; - camera.Position = new Point3D(center.X, center.Y - distance, center.Z); // 从底部看,Y轴负方向 - camera.UpDirection = new Vector3D(0, 0, -1); - camera.LookDirection = new Vector3D(center.X - camera.Position.X, center.Y - camera.Position.Y, center.Z - camera.Position.Z); - ViewportManager.ShowMeshLines(checkResult); - //camera.LookDirection = new Vector3D(center.X - camera.Position.X, center.Y - camera.Position.Y, center.Z - camera.Position.Z); - + ViewportManager.ShowMeshLines(checkResult, ViewportHelperPro.IsCrown()); break; } } diff --git a/Views/UserControl/ViewportData/Helper/LineCalculationHelper.cs b/Views/UserControl/ViewportData/Helper/LineCalculationHelper.cs index 7789ba1..af1c288 100644 --- a/Views/UserControl/ViewportData/Helper/LineCalculationHelper.cs +++ b/Views/UserControl/ViewportData/Helper/LineCalculationHelper.cs @@ -10,7 +10,7 @@ namespace SparkClient.Views.UserControl.ViewportData.Helper { internal class LineCalculationHelper { - private readonly float Y = -0.01F; + private float Y = -0.01F; private Vector3 point1; private Vector3 center; /// @@ -24,6 +24,7 @@ namespace SparkClient.Views.UserControl.ViewportData.Helper public LineCalculationHelper(Vector3 point1, Vector3 center) { this.point1 = point1; this.center = center; + this.Y = center.Y; this.a = calA(point1, center); this.b = calB(point1, a); } @@ -54,7 +55,7 @@ namespace SparkClient.Views.UserControl.ViewportData.Helper var x1 = twoPoint.p1.X; var z1 = twoPoint.p1.Y; var x2 = twoPoint.p2.X; - var z2 = twoPoint.p2.X; + var z2 = twoPoint.p2.Y; return new Tuple(new Vector3(x1, Y, z1), new Vector3(x2, Y, z2)); } public Tuple calYline(float length) @@ -63,7 +64,7 @@ namespace SparkClient.Views.UserControl.ViewportData.Helper var x1 = twoPoint.p1.X; var z1 = twoPoint.p1.Y; var x2 = twoPoint.p2.X; - var z2 = twoPoint.p2.X; + var z2 = twoPoint.p2.Y; return new Tuple(new Vector3(x1, Y, z1), new Vector3(x2, Y, z2)); } @@ -120,8 +121,8 @@ namespace SparkClient.Views.UserControl.ViewportData.Helper float t2 = (float)(-B - Math.Sqrt(discriminant)) / (2 * A); // 计算两点坐标 - var p1 = (X: t1, Y: k * t1 + b); - var p2 = (X: t2, Y: k * t2 + b); + var p1 = (X: t1, Y: (k * t1) + b); + var p2 = (X: t2, Y: (k * t2) + b); return (p1, p2); } diff --git a/Views/UserControl/ViewportData/Helper/ViewportHelperPro.cs b/Views/UserControl/ViewportData/Helper/ViewportHelperPro.cs index 48d063d..f4e2248 100644 --- a/Views/UserControl/ViewportData/Helper/ViewportHelperPro.cs +++ b/Views/UserControl/ViewportData/Helper/ViewportHelperPro.cs @@ -19,6 +19,8 @@ using PerspectiveCamera = HelixToolkit.Wpf.SharpDX.PerspectiveCamera; using System.Windows.Controls; using HelixToolkit.Wpf; using MeshBuilder = HelixToolkit.Wpf.SharpDX.MeshBuilder; +using OrthographicCamera = HelixToolkit.Wpf.SharpDX.OrthographicCamera; +using System.Windows.Input; namespace SparkClient.Views.UserControl.ViewportData.Helper; @@ -1010,7 +1012,7 @@ public class ViewportHelperPro /// /// /// - public static HelixToolkit.Wpf.SharpDX.PerspectiveCamera CalculateCamera(Vector3 positiveDirection, BoundingBox boundingBox, double fieldOfView = 45, double aspectRatio = 16.0 / 9.0) + public static HelixToolkit.Wpf.SharpDX.OrthographicCamera CalculateCamera(Vector3 positiveDirection, BoundingBox boundingBox, double fieldOfView = 45, double aspectRatio = 16.0 / 9.0) { // 单位化正方向 var normalizedDirection = Vector3.Normalize(positiveDirection); @@ -1028,15 +1030,16 @@ public class ViewportHelperPro // 相机位置和朝向 var cameraPosition = center - normalizedDirection * (float)distance; // 沿正方向放置相机 var lookDirection = center - cameraPosition; // 朝向模型中心 - + // 创建并返回相机 - return new HelixToolkit.Wpf.SharpDX.PerspectiveCamera + return new HelixToolkit.Wpf.SharpDX.OrthographicCamera { Position = cameraPosition.ToPoint3D(), LookDirection = lookDirection.ToVector3D(), UpDirection = new Vector3D(0, 1, 0), // 默认全局 Y 轴为上方向 - FieldOfView = fieldOfView, + NearPlaneDistance = 0.1f, + FarPlaneDistance=1000 }; } @@ -1279,11 +1282,18 @@ public class ViewportHelperPro /// /// /// - public static List ShowMeshLines(List entities, double thickness = 1.0) + public static List ShowMeshLines(List entities, bool isCrown = true, double thickness = 1.0) { - moveLines = new(); + if (isCrown) + { + moveLines = new(); + } List lines = new(); var Y = -0.01F; + if (!isCrown) + { + Y = ViewportManager.ModelBounds.Maximum.Y + 0.01f; + } var center = ViewportManager.CenterVector; center.Y = Y; Viewport3DTriangleEntity firstPoint = entities.Where(x => x.PlaneType == PlaneType.TableFacet).FirstOrDefault(); @@ -1297,65 +1307,75 @@ public class ViewportHelperPro float r =5; if(double.TryParse(ViewportManager.DiamondData["M2"].ToString(), out var v)) { - r = (float)(v*0.501); + r = (float)(v*0.51); } - var x1 = r; - var z1 = lineCal.calZ(x1); - var x2 = -r; - var z2 = lineCal.calZ(x2); - edgeLines.Add(new Tuple(new Vector3(x1, Y, z1), new Vector3(x2, Y, z2))); + //var x1 = r; + //var z1 = lineCal.calZ(x1); + //var x2 = -r; + //var z2 = lineCal.calZ(x2); + //edgeLines.Add(new Tuple(new Vector3(x1, Y, z1), new Vector3(x2, Y, z2))); + //lines.Add(DisplayLineModel3D(edgeLines, XlineColor)); + + edgeLines = new List>(); + var XLine = lineCal.calXline(r); + edgeLines.Add(XLine); lines.Add(DisplayLineModel3D(edgeLines, XlineColor)); edgeLines = new List>(); - edgeLines.Add(lineCal.calLineOfOffset(new Tuple(new Vector3(x1, Y, z1), new Vector3(x2, Y, z2)),2)); + edgeLines.Add(lineCal.calLineOfOffset(XLine, 2)); var lineA = DisplayLineModel3D(edgeLines, XlineColor); lines.Add(lineA); edgeLines = new List>(); - edgeLines.Add(lineCal.calLineOfOffset(new Tuple(new Vector3(x1, Y, z1), new Vector3(x2, Y, z2)), -2)); + edgeLines.Add(lineCal.calLineOfOffset(XLine, -2)); var lineB = DisplayLineModel3D(edgeLines, XlineColor); lines.Add(lineB); bindingMoveLine(lineA, lineB); edgeLines = new List>(); - edgeLines.Add(lineCal.calLineOfOffset(new Tuple(new Vector3(x1, Y, z1), new Vector3(x2, Y, z2)), 4)); + edgeLines.Add(lineCal.calLineOfOffset(XLine, 4)); var lineE = DisplayLineModel3D(edgeLines, XlineColor); lines.Add(lineE); edgeLines = new List>(); - edgeLines.Add(lineCal.calLineOfOffset(new Tuple(new Vector3(x1, Y, z1), new Vector3(x2, Y, z2)), -4)); + edgeLines.Add(lineCal.calLineOfOffset(XLine, -4)); var lineF = DisplayLineModel3D(edgeLines, XlineColor); lines.Add(lineF); bindingMoveLine(lineE, lineF); Color4 YlineColor = new Color4(0F, 80f, 0f, 1f); - var x3 = r; - var z3 = lineCal.calZVertical(x3); - var x4 = -r; - var z4 = lineCal.calZVertical(x4); + //var x3 = r; + //var z3 = lineCal.calZVertical(x3); + //var x4 = -r; + //var z4 = lineCal.calZVertical(x4); + + //edgeLines = new List>(); + //edgeLines.Add(new Tuple(new Vector3(x3, Y, z3), new Vector3(x4, Y, z4))); + //lines.Add(DisplayLineModel3D(edgeLines, YlineColor)); edgeLines = new List>(); - edgeLines.Add(new Tuple(new Vector3(x3, Y, z3), new Vector3(x4, Y, z4))); + var YLine = lineCal.calYline(r); + edgeLines.Add(YLine); lines.Add(DisplayLineModel3D(edgeLines, YlineColor)); edgeLines = new List>(); - edgeLines.Add(lineCal.calLineOfOffset(new Tuple(new Vector3(x3, Y, z3), new Vector3(x4, Y, z4)), 2)); + edgeLines.Add(lineCal.calLineOfOffset(YLine, 2)); var lineC = DisplayLineModel3D(edgeLines, YlineColor); lines.Add(lineC); edgeLines = new List>(); - edgeLines.Add(lineCal.calLineOfOffset(new Tuple(new Vector3(x3, Y, z3), new Vector3(x4, Y, z4)), -2)); + edgeLines.Add(lineCal.calLineOfOffset(YLine, -2)); var lineD = DisplayLineModel3D(edgeLines, YlineColor); lines.Add(lineD); bindingMoveLine(lineC, lineD); edgeLines = new List>(); - edgeLines.Add(lineCal.calLineOfOffset(new Tuple(new Vector3(x3, Y, z3), new Vector3(x4, Y, z4)), 4)); + edgeLines.Add(lineCal.calLineOfOffset(YLine, 4)); var lineG = DisplayLineModel3D(edgeLines, YlineColor); lines.Add(lineG); edgeLines = new List>(); - edgeLines.Add(lineCal.calLineOfOffset(new Tuple(new Vector3(x3, Y, z3), new Vector3(x4, Y, z4)), -4)); + edgeLines.Add(lineCal.calLineOfOffset(YLine, -4)); var lineH = DisplayLineModel3D(edgeLines, YlineColor); lines.Add(lineH); bindingMoveLine(lineG, lineH); @@ -1431,12 +1451,16 @@ public class ViewportHelperPro private static void LineA_MouseUp3D(object sender, RoutedEventArgs e) { isDrawing = false; + var Viewport = ViewportManager.GetViewport3D(); + Viewport.Cursor = Cursors.Arrow; } private static void LineA_MouseDown3D(object sender, RoutedEventArgs e) { isDrawing = true; if(e is HelixToolkit.Wpf.SharpDX.MouseDown3DEventArgs ev){ + var Viewport = ViewportManager.GetViewport3D(); + Viewport.Cursor = Cursors.SizeAll; // 获取鼠标点击的位置 var mousePosition = ev.Position; previousMousePosition = Get3DPointFromMouse(mousePosition); @@ -1446,7 +1470,7 @@ public class ViewportHelperPro { // 使用 HelixToolkit 的 Ray3D 和 Plane3D var Viewport = ViewportManager.GetViewport3D(); - var camera = Viewport.Camera as PerspectiveCamera; + var camera = Viewport.Camera as OrthographicCamera; // 创建射线 var ray = new Ray3D( @@ -1482,9 +1506,13 @@ public class ViewportHelperPro /// /// /// - public static LineGeometryModel3D ShowCircleLine(double radius = 1.0, double thickness = 1.0) + public static LineGeometryModel3D ShowCircleLine(bool isCrown = true, double radius = 1.0, double thickness = 1.0) { var Y = -0.01F; + if (!isCrown) + { + Y = ViewportManager.ModelBounds.Maximum.Y + 0.01f; + } var center = ViewportManager.CenterVector; center.Y = Y; return UpdateCircleGeometry(center, initialRadius); @@ -1532,6 +1560,10 @@ public class ViewportHelperPro // 现在鼠标对于3d模型的位置 var mousePosition = ev.Position; var Y = -0.01F; + if (!IsCrown()) + { + Y = ViewportManager.ModelBounds.Maximum.Y + 0.01F; + } var center = ViewportManager.CenterVector; center.Y = Y; @@ -1582,6 +1614,7 @@ public class ViewportHelperPro { isDrawing = false; var Viewport = ViewportManager.GetViewport3D(); + Viewport.Cursor = Cursors.Arrow; initialRadius = endRadius; initDistance = endDistance; // 释放鼠标捕获 @@ -1599,14 +1632,29 @@ public class ViewportHelperPro dragStartPoint = ev.Position; Point3D mouseWorldPosition = Get3DPointFromMouse(dragStartPoint); var Y = -0.01F; + if(!IsCrown()) + { + Y = ViewportManager.ModelBounds.Maximum.Y + 0.01F; + } var center = ViewportManager.CenterVector; center.Y = Y; initDistance = CalculateDistance(mouseWorldPosition, center.ToPoint3D()); var Viewport = ViewportManager.GetViewport3D(); + Viewport.Cursor = Cursors.SizeAll; // 捕获鼠标 Viewport.CaptureMouse(); } } + public static bool IsCrown() + { + bool isCrown = false; + var camera = ViewportManager.GetViewport3D().Camera; + if (camera.LookDirection.Y >= 0 && camera.UpDirection.Y <= 0) + { + isCrown = true; + } + return isCrown; + } #region 私有方法 /// diff --git a/Views/UserControl/ViewportData/Helper/ViewportManager.cs b/Views/UserControl/ViewportData/Helper/ViewportManager.cs index 94ef6db..8628ad2 100644 --- a/Views/UserControl/ViewportData/Helper/ViewportManager.cs +++ b/Views/UserControl/ViewportData/Helper/ViewportManager.cs @@ -50,11 +50,19 @@ public class ViewportManager /// /// 网格线 /// - public static List MainModelMeshLines = new List(); + public static List MainModelMeshLines_C = new List(); /// /// 网格线(圈) /// - public static LineGeometryModel3D MainModelCircleLine = new LineGeometryModel3D(); + public static LineGeometryModel3D MainModelCircleLine_C = new LineGeometryModel3D(); + /// + /// 网格线 + /// + public static List MainModelMeshLines_P = new List(); + /// + /// 网格线(圈) + /// + public static LineGeometryModel3D MainModelCircleLine_P = new LineGeometryModel3D(); /// /// 腰垂直线 /// @@ -278,9 +286,12 @@ public class ViewportManager _viewport.Camera.UpDirection = new Vector3D(0, -1, 0); _viewport.RenderHost.MSAA = MSAALevel.Maximum; // TODO: - MainModelMeshLines.Clear(); - MainModelMeshLines.AddRange(ViewportHelperPro.ShowMeshLines(entities)); - MainModelCircleLine = ViewportHelperPro.ShowCircleLine(); + MainModelMeshLines_C.Clear(); + MainModelMeshLines_C.AddRange(ViewportHelperPro.ShowMeshLines(entities)); + MainModelCircleLine_C = ViewportHelperPro.ShowCircleLine(); + MainModelMeshLines_P.Clear(); + MainModelMeshLines_P.AddRange(ViewportHelperPro.ShowMeshLines(entities, false)); + MainModelCircleLine_P = ViewportHelperPro.ShowCircleLine(false); } /// @@ -422,24 +433,37 @@ public class ViewportManager } } - public static void ShowMeshLines(bool isShow) { + public static void ShowMeshLines(bool isShow,bool isCrown) { if (_viewport == null) return; if (isShow) { - MainModelMeshLines.ForEach(e => + if (isCrown) { + MainModelMeshLines_C.ForEach(e => + { + if (!_viewport.Items.Contains(e)) + _viewport.Items.Add(e); + }); + if (!_viewport.Items.Contains(MainModelCircleLine_C)) + _viewport.Items.Add(MainModelCircleLine_C); + } + else { - if (!_viewport.Items.Contains(e)) - _viewport.Items.Add(e); - }); - if (!_viewport.Items.Contains(MainModelCircleLine)) - _viewport.Items.Add(MainModelCircleLine); - + MainModelMeshLines_P.ForEach(e => + { + if (!_viewport.Items.Contains(e)) + _viewport.Items.Add(e); + }); + if (!_viewport.Items.Contains(MainModelCircleLine_P)) + _viewport.Items.Add(MainModelCircleLine_P); + } } else { - MainModelMeshLines.ForEach(e => _viewport.Items.Remove(e)); - _viewport.Items.Remove(MainModelCircleLine); + MainModelMeshLines_C.ForEach(e => _viewport.Items.Remove(e)); + _viewport.Items.Remove(MainModelCircleLine_C); + MainModelMeshLines_P.ForEach(e => _viewport.Items.Remove(e)); + _viewport.Items.Remove(MainModelCircleLine_P); } } #endregion