namespace Yw.WpfUI.Hydro
|
{
|
/// <summary>
|
/// 抽象选择辅助类
|
/// </summary>
|
internal class LogicalSelectionHelper
|
{
|
/// <summary>
|
///
|
/// </summary>
|
public LogicalSelectionHelper(HelixViewport3D viewport)
|
{
|
_viewport = viewport;
|
}
|
|
/// <summary>
|
/// 选择改变事件
|
/// </summary>
|
public event Action<List<LogicalVisual3D>> SelectionChangedEvent;
|
/// <summary>
|
/// 状态改变事件
|
/// </summary>
|
public event Action<LogicalVisual3D, bool> StateChangedEvent;
|
|
private readonly HelixViewport3D _viewport;//三维组件
|
|
/// <summary>
|
/// 选择集合
|
/// </summary>
|
public List<LogicalVisual3D> Selection
|
{
|
get { return _selection; }
|
private set { _selection = value; }
|
}
|
private List<LogicalVisual3D> _selection = new();
|
|
#region 内部实现
|
|
//添加选择
|
private void AddToSelection(LogicalVisual3D visual)
|
{
|
if (_selection.Contains(visual))
|
{
|
return;
|
}
|
_selection.Add(visual);
|
this.StateChangedEvent?.Invoke(visual, true);
|
}
|
|
//从选择中移除
|
private void RemoveFromSelection(LogicalVisual3D visual)
|
{
|
if (!_selection.Contains(visual))
|
{
|
return;
|
}
|
_selection.Remove(visual);
|
this.StateChangedEvent?.Invoke(visual, false);
|
}
|
|
//清理选择
|
private void ClearSelection()
|
{
|
if (_selection.Count < 1)
|
{
|
return;
|
}
|
_selection.ForEach(x => this.StateChangedEvent?.Invoke(x, false));
|
_selection.Clear();
|
}
|
|
#endregion
|
|
/// <summary>
|
/// 处理单个选择
|
/// </summary>
|
public void HandleSingle(Point pt)
|
{
|
var logicalVisual = _viewport.FindNearestVisual(pt) as LogicalVisual3D;
|
if (logicalVisual == null)
|
{
|
if (_selection.Count > 0)
|
{
|
ClearSelection();
|
this.SelectionChangedEvent?.Invoke(null);
|
}
|
return;
|
}
|
if (_selection.Count == 1 && _selection[0] == logicalVisual)
|
{
|
return;
|
}
|
ClearSelection();
|
AddToSelection(logicalVisual);
|
this.SelectionChangedEvent?.Invoke(_selection);
|
}
|
|
/// <summary>
|
/// 处理多个选择
|
/// </summary>
|
public void HandleMulti(Point pt)
|
{
|
var logicalVisual = _viewport.FindNearestVisual(pt) as LogicalVisual3D;
|
if (logicalVisual == null)
|
{
|
return;
|
}
|
if (_selection.Contains(logicalVisual))
|
{
|
return;
|
}
|
AddToSelection(logicalVisual);
|
this.SelectionChangedEvent?.Invoke(_selection);
|
}
|
|
/// <summary>
|
/// 选择Visual
|
/// 不触发选择改变事件
|
/// </summary>
|
public void SelectVisual(LogicalVisual3D visual)
|
{
|
ClearSelection();
|
if (visual == null)
|
{
|
return;
|
}
|
AddToSelection(visual);
|
}
|
|
/// <summary>
|
/// 选择Visuals
|
/// </summary>
|
public void SelectVisual(List<LogicalVisual3D> visuals)
|
{
|
ClearSelection();
|
if (visuals == null || visuals.Count < 1)
|
{
|
return;
|
}
|
visuals.ForEach(AddToSelection);
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
}
|