namespace Yw.WpfUI.Hydro { /// /// 抽象网格线辅助类 /// internal class LogicalGridLineHelper { /// /// /// public LogicalGridLineHelper(HelixViewport3D viewport) { _viewport = viewport; _gridLines = CreateGridLinesVisual3D(); _viewport.CameraChanged += Viewport_CameraChanged; } private readonly HelixViewport3D _viewport = null;//三维组件 private readonly GridLinesVisual3D _gridLines = null;//网格线 /// /// 显示网格线 /// public void Show() { var gridLines = _viewport.Children.OfType().FirstOrDefault(); if (gridLines == null) { _gridLines.Visible = true; _viewport.Children.Add(_gridLines); UpdateGridLinesVisual3D(); } else { gridLines.Visible = true; } } /// /// 隐藏网格线 /// public void Hide() { var gridLines = _viewport.Children.OfType().FirstOrDefault(); if (gridLines != null) { gridLines.Visible = false; } } /// /// 可见性 /// public bool Visible { get { var gridLines = _viewport.Children.OfType().FirstOrDefault(); if (gridLines == null) { return false; } if (!gridLines.Visible) { return false; } return true; } set { if (value) { Show(); } else { Hide(); } } } //创建网格线 private GridLinesVisual3D CreateGridLinesVisual3D() { var gridLines = new GridLinesVisual3D(); gridLines.Thickness = 0.05; gridLines.MajorDistance = 5; gridLines.MinorDistance = 1; gridLines.Fill = Brushes.Black; return gridLines; } //相机改变 private void Viewport_CameraChanged(object sender, RoutedEventArgs e) { UpdateGridLinesVisual3D(); } // 更新网格大小的方法 private void UpdateGridLinesVisual3D() { var gridLines = _viewport.Children.OfType().FirstOrDefault(); if (gridLines == null) { return; } if (!gridLines.Visible) { return; } Rect3D bounds = Rect3D.Empty; foreach (Visual3D child in _viewport.Children.OfType()) { if (!(child is IBoundsIgnoredVisual3D)) { Rect3D rect = child.FindBounds(Transform3D.Identity); bounds.Union(rect); } } if (!bounds.IsEmpty) { // 计算最大尺寸并增加20%边距 double maxSize = Math.Max(bounds.SizeX, Math.Max(bounds.SizeY, bounds.SizeZ)) * 1.5; if (maxSize < 100) { maxSize = 100; } // 设置网格大小 gridLines.Width = maxSize; gridLines.Length = maxSize; // 保持网格居中 gridLines.Center = new Point3D( bounds.X + bounds.SizeX / 2, bounds.Y + bounds.SizeY / 2, 0); // 根据尺寸自动调整网格密度 gridLines.MinorDistance = Math.Max(1, maxSize / 20d); gridLines.MajorDistance = gridLines.MinorDistance * 5; } else { // 默认大小(当场景为空时) gridLines.Width = 100; gridLines.Length = 100; gridLines.Center = new Point3D(0, 0, 0); } } } }