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