namespace Yw.WpfUI.Hydro
|
{
|
/// <summary>
|
/// 抽象网格线辅助类
|
/// </summary>
|
internal class LogicalGridLineHelper
|
{
|
/// <summary>
|
///
|
/// </summary>
|
public LogicalGridLineHelper(HelixViewport3D viewport)
|
{
|
_viewport = viewport;
|
_gridLines = CreateGridLinesVisual3D();
|
_viewport.CameraChanged += Viewport_CameraChanged;
|
}
|
|
private readonly HelixViewport3D _viewport = null;//三维组件
|
private readonly GridLinesVisual3D _gridLines = null;//网格线
|
|
/// <summary>
|
/// 显示网格线
|
/// </summary>
|
public void Show()
|
{
|
var gridLines = _viewport.Children.OfType<GridLinesVisual3D>().FirstOrDefault();
|
if (gridLines == null)
|
{
|
_gridLines.Visible = true;
|
_viewport.Children.Add(_gridLines);
|
UpdateGridLinesVisual3D();
|
}
|
else
|
{
|
gridLines.Visible = true;
|
}
|
|
}
|
|
/// <summary>
|
/// 隐藏网格线
|
/// </summary>
|
public void Hide()
|
{
|
var gridLines = _viewport.Children.OfType<GridLinesVisual3D>().FirstOrDefault();
|
if (gridLines != null)
|
{
|
gridLines.Visible = false;
|
}
|
}
|
|
/// <summary>
|
/// 可见性
|
/// </summary>
|
public bool Visible
|
{
|
get
|
{
|
var gridLines = _viewport.Children.OfType<GridLinesVisual3D>().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<GridLinesVisual3D>().FirstOrDefault();
|
if (gridLines == null)
|
{
|
return;
|
}
|
if (!gridLines.Visible)
|
{
|
return;
|
}
|
|
Rect3D bounds = Rect3D.Empty;
|
foreach (Visual3D child in _viewport.Children.OfType<LogicalVisual3D>())
|
{
|
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;
|
|
// 设置网格大小
|
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);
|
}
|
|
}
|
|
|
|
|
|
|
|
|
}
|
}
|