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