namespace Yw.WpfUI.Hydro
{
///
/// 绘制选择辅助类
///
internal class DrawSelectionHelper : IDisposable
{
///
///
///
public DrawSelectionHelper
(
HelixViewport3D viewport,
DrawInitialHelper initialHelper
)
{
_viewport = viewport;
_initialHelper = initialHelper;
Attach();
}
///
/// 选择改变事件
///
public event Action> SelectionChangedEvent;
private readonly HelixViewport3D _viewport = null;//三维组件
private readonly DrawInitialHelper _initialHelper = null;//初始化辅助类
private VisualStateObject _stateObject = null;//状态对象
private List _selection = new();//选择集合
///
/// 选择集合
///
public List Selection
{
get { return _selection; }
private set { _selection = value; }
}
///
/// 是否启用
///
public bool Enabled
{
get { return _enabled; }
set { _enabled = value; }
}
private bool _enabled = true;
///
/// 是否初始化
///
public bool Initialized
{
get { return _initialized; }
private set { _initialized = value; }
}
private bool _initialized = false;
//初始化
private void Initialize()
{
if (!_initialHelper.Initialized)
{
return;
}
if (_stateObject == null)
{
_stateObject = new VisualStateObject();
_stateObject.HtmlColor = Yw.Settings.HydroL3dParasHelper.HydroL3d.Selection.HtmlColor;
_stateObject.Opacity = Yw.Settings.HydroL3dParasHelper.HydroL3d.Selection.Opacity;
_stateObject.Scale = Yw.Settings.HydroL3dParasHelper.HydroL3d.Selection.Scale;
_stateObject.Visible = Yw.Settings.HydroL3dParasHelper.HydroL3d.Selection.Visible;
}
_initialized = true;
}
//处理初始化完成
private void OnInitialCompleted()
{
Initialize();
}
//处理鼠标弹起
private void OnMouseUp(object sender, MouseButtonEventArgs e)
{
if (e.ChangedButton == MouseButton.Left)
{
var pt = e.GetPosition(_viewport);
Handle(pt);
}
}
#region 内部实现
//添加选择
private void AddToSelection(VisualDraw3D visual3d)
{
if (_selection.Contains(visual3d))
{
return;
}
_selection.Add(visual3d);
visual3d.LoadState(eVisualState.Selection, _stateObject);
visual3d.UpdateVisual3D();
}
//从选择中移除
private void RemoveFromSelection(VisualDraw3D visual3d)
{
if (!_selection.Contains(visual3d))
{
return;
}
_selection.Remove(visual3d);
visual3d.UnloadState(eVisualState.Selection);
visual3d.UpdateVisual3D();
}
//清理选择
private void ClearSelection()
{
if (_selection.Count < 1)
{
return;
}
_selection.ForEach(x =>
{
x.UnloadState(eVisualState.Selection);
x.UpdateVisual3D();
});
_selection.Clear();
}
#endregion
#region 选择处理
//处理
private void Handle(Point pt)
{
if (!Initialized)
{
return;
}
if (!Enabled)
{
return;
}
var visual3d = _viewport.FindNearestVisual(pt) as VisualDraw3D;
if (visual3d == null)
{
if (_selection.Count > 0)
{
ClearSelection();
this.SelectionChangedEvent?.Invoke(null);
}
return;
}
if (_selection.Count == 1 && _selection[0] == visual3d)
{
return;
}
ClearSelection();
AddToSelection(visual3d);
this.SelectionChangedEvent?.Invoke(_selection);
}
//附加
private void Append(Point pt)
{
if (!Initialized)
{
return;
}
if (!Enabled)
{
return;
}
var visual3d = _viewport.FindNearestVisual(pt) as VisualDraw3D;
if (visual3d == null)
{
return;
}
if (_selection.Contains(visual3d))
{
return;
}
AddToSelection(visual3d);
this.SelectionChangedEvent?.Invoke(_selection);
}
#endregion
#region 外部选择
///
/// 选择Visual
/// 不触发选择改变事件
///
public void SelectVisual(VisualDraw3D visual)
{
ClearSelection();
if (visual == null)
{
return;
}
AddToSelection(visual);
}
///
/// 选择Visuals
///
public void SelectVisual(List visuals)
{
ClearSelection();
if (visuals == null || visuals.Count < 1)
{
return;
}
visuals.ForEach(AddToSelection);
}
#endregion
//附加
private void Attach()
{
_viewport.MouseUp += OnMouseUp;
_initialHelper.InitialCompletedEvent += OnInitialCompleted;
}
//分离
private void Detach()
{
_viewport.MouseUp -= OnMouseUp;
_initialHelper.InitialCompletedEvent -= OnInitialCompleted;
}
///
/// 释放
///
public void Dispose()
{
Detach();
}
}
}