using System.Net;
namespace Yw.WpfUI.Hydro
{
///
/// 抽象管理器
///
internal class LogicalManager
{
public LogicalManager(HelixViewport3D viewport)
{
_viewport = viewport;
_stateHelper = new LogicalStateHelper();
_materialHelper = new LogicalMaterialHelper();
_overrideColorHelper = new LogicalOverrideColorHelper();
_overrideOpacityHelper = new LogicalOverrideOpacityHelper();
_overrideVisibleHelper = new LogicalOverrideVisibleHelper();
_highlightHelper = new LogicalHighlightHelper(_viewport);
_selectionHelper = new LogicalSelectionHelper(_viewport);
_zoomHelper = new LogicalZoomHelper(_viewport);
_billboardTextHelper = new LogicalBillboardTextHelper(_viewport);
}
#region 事件集合
///
/// 选择改变事件
///
public event Action> SelectionChangedEvent;
#endregion
#region 固定资源
protected readonly HelixViewport3D _viewport = null;//三维组件
protected readonly LogicalStateHelper _stateHelper = null;//状态辅助类
protected readonly LogicalMaterialHelper _materialHelper = null;//材质辅助类
protected readonly LogicalOverrideColorHelper _overrideColorHelper = null;//覆盖颜色辅助类
protected readonly LogicalOverrideOpacityHelper _overrideOpacityHelper = null;//覆盖透明度辅助类
protected readonly LogicalOverrideVisibleHelper _overrideVisibleHelper = null;//覆盖可见性辅助类
protected readonly LogicalHighlightHelper _highlightHelper = null;//高亮辅助类
protected readonly LogicalSelectionHelper _selectionHelper = null;//选择辅助类
protected readonly LogicalZoomHelper _zoomHelper = null;//缩放辅助类
protected readonly LogicalBillboardTextHelper _billboardTextHelper = null;//公告版文字辅助类
#endregion
#region 私有字段
protected NetworkL3d _nw = null;
protected Dictionary _allVisualL3dDict;
protected Dictionary _allVisualLogicalDict;
#endregion
#region 判断字段
///
/// 是否启用缩放
///
public virtual bool IsZoomEnabled
{
get { return _viewport.IsZoomEnabled; }
set { _viewport.IsZoomEnabled = value; }
}
///
/// 是否启用平移
///
public virtual bool IsPanEnabled
{
get { return _viewport.IsPanEnabled; }
set { _viewport.IsPanEnabled = value; }
}
///
/// 是否启用旋转
///
public virtual bool IsRotationEnabled
{
get { return _viewport.IsRotationEnabled; }
set { _viewport.IsRotationEnabled = value; }
}
///
/// 是否启用高亮
///
public virtual bool IsHighlightEnabled
{
get { return _isHighlightEnabled; }
set { _isHighlightEnabled = value; }
}
protected bool _isHighlightEnabled = true;
///
/// 是否启用选择
///
public virtual bool IsSelectionEnabled
{
get => _isSelectionEnabled;
set => _isSelectionEnabled = value;
}
protected bool _isSelectionEnabled = true;
///
/// 是否启用缩放适应
///
public virtual bool IsZoomExtentsEnabled
{
get => _isZoomExtentsEnabled;
set => _isZoomExtentsEnabled = value;
}
protected bool _isZoomExtentsEnabled = true;
#endregion
#region 初始化
///
/// 是否初始化
///
public virtual bool Initialized
{
get
{
if (_nw == null)
{
return false;
}
if (_allVisualL3dDict == null)
{
return false;
}
if (_allVisualLogicalDict == null)
{
return false;
}
return true;
}
}
///
/// 初始化
///
public virtual void Initial(NetworkL3d nw)
{
_nw = nw;
InitialNetwork();
InitialViewport();
RegisterEvents();
}
//加载管网
protected virtual void InitialNetwork()
{
if (_nw == null)
{
return;
}
_allVisualL3dDict = _nw.Visuals.ToDictionary(keySelector: x => x.Id);
_allVisualLogicalDict = new Dictionary();
_nw.Visuals?.ForEach(x =>
{
var logicalVisual = LogicalCreateHelper.Create(x, _stateHelper, _materialHelper, _overrideColorHelper, _overrideOpacityHelper, _overrideVisibleHelper);
if (logicalVisual != null)
{
_allVisualLogicalDict.Add(x, logicalVisual);
}
});
}
//初始化Vieport
protected virtual void InitialViewport()
{
InitialViewportInput();
InitialViewportCube();
InitialViewportData();
}
//初始化Viewport立方体
protected virtual void InitialViewportCube()
{
if (_viewport == null)
{
return;
}
_viewport.ViewCubeBackText = "后";
_viewport.ViewCubeBottomText = "下";
_viewport.ViewCubeFrontText = "前";
_viewport.ViewCubeLeftText = "左";
_viewport.ViewCubeRightText = "右";
_viewport.ViewCubeTopText = "上";
}
//初始化Viewport交互
protected virtual void InitialViewportInput()
{
if (_viewport == null)
{
return;
}
//当前操作不做任何处理,是为了避免鼠标操作冲突
}
//初始化Viewport数据
protected virtual void InitialViewportData()
{
if (_viewport == null)
{
return;
}
_viewport.Children.Clear();
_viewport.Children.Add(new DefaultLights());
_allVisualLogicalDict?.Values.ToList().ForEach(x => _viewport.Children.Add(x));
_viewport.ZoomExtents();
}
#endregion
#region 事件注册
//注册事件
protected virtual void RegisterEvents()
{
RegisterViewportEvents();
RegisterOperationEvents();
}
#region Viewport
//注册事件
protected virtual void RegisterViewportEvents()
{
if (_viewport == null)
{
return;
}
_viewport.MouseDown += Viewport_MouseDown;
_viewport.MouseUp += Viewport_MouseUp;
_viewport.MouseMove += Viewport_MouseMove;
_viewport.MouseWheel += Viewport_MouseWheel;
_viewport.MouseDoubleClick += Viewport_MouseDoubleClick;
_viewport.MouseLeftButtonDown += Viewport_MouseLeftButtonDown;
_viewport.PreviewMouseDown += _viewport_PreviewMouseDown;
}
private void _viewport_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
OnPreviewMouseDown(e);
}
//鼠标按下
private void Viewport_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
OnMouseDown(e);
}
//鼠标弹起
private void Viewport_MouseUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
OnMouseUp(e);
}
//鼠标移动
private void Viewport_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
{
OnMouseMove(e);
}
//鼠标滚轮
private void Viewport_MouseWheel(object sender, System.Windows.Input.MouseWheelEventArgs e)
{
OnMouseWheel(e);
}
//鼠标双击
private void Viewport_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
OnMouseDoubleClick(e);
}
//鼠标左键按下
private void Viewport_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
OnMouseLeftButtonDown(e);
}
//处理鼠标按下事件
protected virtual void OnMouseDown(System.Windows.Input.MouseButtonEventArgs e)
{
}
//处理鼠标弹起事件
protected virtual void OnMouseUp(System.Windows.Input.MouseButtonEventArgs e)
{
if (!Initialized)
{
return;
}
if (this.IsSelectionEnabled)
{
_selectionHelper.HandleSingle(e.GetPosition(_viewport));
}
}
//处理鼠标移动事件
protected virtual void OnMouseMove(System.Windows.Input.MouseEventArgs e)
{
if (!Initialized)
{
return;
}
if (this.IsHighlightEnabled)
{
_highlightHelper.Highlight(e.GetPosition(_viewport));
}
}
//处理鼠标滚轮事件
protected virtual void OnMouseWheel(System.Windows.Input.MouseWheelEventArgs e)
{
}
//处理鼠标双击事件
protected virtual void OnMouseDoubleClick(System.Windows.Input.MouseButtonEventArgs e)
{
if (!Initialized)
{
return;
}
if (this.IsZoomExtentsEnabled)
{
_viewport.ZoomExtents();
}
}
//处理鼠标
protected virtual void OnMouseLeftButtonDown(MouseButtonEventArgs e)
{
}
protected virtual void OnPreviewMouseDown(MouseButtonEventArgs e)
{
}
#endregion
#region Operation
//注册操作事件
protected virtual void RegisterOperationEvents()
{
if (_highlightHelper != null)
{
_highlightHelper.StateChangedEvent += HighlightHelper_StateChangedEvent;
}
if (_selectionHelper != null)
{
_selectionHelper.StateChangedEvent += SelectionHelper_StateChangedEvent;
_selectionHelper.SelectionChangedEvent += SelectionHelper_SelectionChangedEvent;
}
}
//高亮状态改变事件
private void HighlightHelper_StateChangedEvent(LogicalVisual3D logicalVisual, bool operation)
{
if (logicalVisual == null)
{
return;
}
if (operation)
{
_stateHelper.LoadState(logicalVisual.Vmo, eLogicalState.Highlight);
}
else
{
_stateHelper.UnloadState(logicalVisual.Vmo, eLogicalState.Highlight);
}
logicalVisual.UpdateVisual();
}
//选择状态改变事件
private void SelectionHelper_StateChangedEvent(LogicalVisual3D logicalVisual, bool operation)
{
if (logicalVisual == null)
{
return;
}
if (operation)
{
_stateHelper.LoadState(logicalVisual.Vmo, eLogicalState.Selection);
}
else
{
_stateHelper.UnloadState(logicalVisual.Vmo, eLogicalState.Selection);
}
logicalVisual.UpdateVisual();
}
//选择改变事件
private void SelectionHelper_SelectionChangedEvent(List obj)
{
var visuals = obj?.Select(x => x.Vmo).ToList();
this.SelectionChangedEvent?.Invoke(visuals);
}
#endregion
#endregion
#region 视角
///
/// 设置上视图
///
public virtual void SetTopView()
{
if (!Initialized)
{
return;
}
var lookDirection = new Vector3D(0, 0, -1); // 向下看
var upDirection = new Vector3D(0, 1, 0);// Y轴朝上
_viewport.FitView(lookDirection, upDirection);
}
///
/// 设置下视图
///
public virtual void SetBottomView()
{
if (!Initialized)
{
return;
}
var lookDirection = new Vector3D(0, 0, 1); // 向上看
var upDirection = new Vector3D(0, 1, 0);// Y轴朝上
_viewport.FitView(lookDirection, upDirection);
}
///
/// 设置左视图
///
public virtual void SetLeftView()
{
if (!Initialized)
{
return;
}
var lookDirection = new Vector3D(1, 0, 0); // 向右看
var upDirection = new Vector3D(0, 0, 1);// Z轴朝上
_viewport.FitView(lookDirection, upDirection);
}
///
/// 设置右视图
///
public virtual void SetRightView()
{
if (!Initialized)
{
return;
}
var lookDirection = new Vector3D(-1, 0, 0); // 向左看
var upDirection = new Vector3D(0, 0, 1);// Z轴朝上
_viewport.FitView(lookDirection, upDirection);
}
///
/// 设置前视图
///
public virtual void SetFrontView()
{
if (!Initialized)
{
return;
}
var lookDirection = new Vector3D(0, 1, 0); // 向后看
var upDirection = new Vector3D(0, 0, 1);// Z轴朝上
_viewport.FitView(lookDirection, upDirection);
}
///
/// 设置后视图
///
public virtual void SetBackView()
{
if (!Initialized)
{
return;
}
var lookDirection = new Vector3D(0, -1, 0); // 向前看
var upDirection = new Vector3D(0, 0, 1);// Z轴朝上
_viewport.FitView(lookDirection, upDirection);
}
#endregion
#region 公告板文本
///
/// 设置公告板文本
///
public virtual void SetBillboardText(List items)
{
if (!Initialized)
{
return;
}
_billboardTextHelper.Set(items);
}
#endregion
}
}