From 6d2fe70b3508c69df25fab896c1a11c513354681 Mon Sep 17 00:00:00 2001 From: sunhonglei Date: Sat, 18 Jan 2025 16:56:06 +0800 Subject: [PATCH] =?UTF-8?q?fix=EF=BC=9A=E7=BD=91=E6=A0=BC=E7=BA=BF?= =?UTF-8?q?=E8=B0=83=E8=AF=95=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Views/UserControl/Viewport3D.xaml.cs | 12 ++-- .../Helper/LineCalculationHelper.cs | 11 ++-- .../ViewportData/Helper/ViewportHelperPro.cs | 58 ++++++++++++------- .../ViewportData/Helper/ViewportManager.cs | 54 ++++++++++++----- 4 files changed, 91 insertions(+), 44 deletions(-) diff --git a/Views/UserControl/Viewport3D.xaml.cs b/Views/UserControl/Viewport3D.xaml.cs index 3e6dc03..b9555de 100644 --- a/Views/UserControl/Viewport3D.xaml.cs +++ b/Views/UserControl/Viewport3D.xaml.cs @@ -418,10 +418,14 @@ public partial class Viewport3D 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); + var Position = camera.Position; + var LookDirection = camera.LookDirection; + bool isCrown = false; + if(camera.LookDirection.Y >= 0 && camera.UpDirection.Y<=0) + { + isCrown = true; + } + ViewportManager.ShowMeshLines(checkResult, isCrown); //camera.LookDirection = new Vector3D(center.X - camera.Position.X, center.Y - camera.Position.Y, center.Z - camera.Position.Z); 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..b63b99c 100644 --- a/Views/UserControl/ViewportData/Helper/ViewportHelperPro.cs +++ b/Views/UserControl/ViewportData/Helper/ViewportHelperPro.cs @@ -1279,11 +1279,15 @@ 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(); 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(); @@ -1299,63 +1303,73 @@ public class ViewportHelperPro { r = (float)(v*0.501); } - 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); @@ -1482,9 +1496,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); 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