From 0329c48a57f33a4c94e44c5e4d3d3c116184986f Mon Sep 17 00:00:00 2001 From: lixiaojun <1287241240@qq.com> Date: 星期二, 22 四月 2025 15:51:43 +0800 Subject: [PATCH] 优化HelixToolkit的方法,增加水流方向功能,进一步封装Winform控件 --- Yw.WpfUI.Hydro.L3d.Core/03-logical/08-manager/LogicalManager.cs | 459 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 453 insertions(+), 6 deletions(-) diff --git a/Yw.WpfUI.Hydro.L3d.Core/03-logical/08-manager/LogicalManager.cs b/Yw.WpfUI.Hydro.L3d.Core/03-logical/08-manager/LogicalManager.cs index 78b9027..a580a1c 100644 --- a/Yw.WpfUI.Hydro.L3d.Core/03-logical/08-manager/LogicalManager.cs +++ b/Yw.WpfUI.Hydro.L3d.Core/03-logical/08-manager/LogicalManager.cs @@ -1,6 +1,4 @@ -锘縰sing System.Net; - -namespace Yw.WpfUI.Hydro +锘縩amespace Yw.WpfUI.Hydro { /// <summary> /// 鎶借薄绠$悊鍣� @@ -15,10 +13,14 @@ _overrideColorHelper = new LogicalOverrideColorHelper(); _overrideOpacityHelper = new LogicalOverrideOpacityHelper(); _overrideVisibleHelper = new LogicalOverrideVisibleHelper(); + _backgroundHelper = new LogicalBackgroudHelper(_viewport); + _gridLinesHelper = new LogicalGridLineHelper(_viewport); _highlightHelper = new LogicalHighlightHelper(_viewport); _selectionHelper = new LogicalSelectionHelper(_viewport); _zoomHelper = new LogicalZoomHelper(_viewport); _billboardTextHelper = new LogicalBillboardTextHelper(_viewport); + _cameraHelper = new LogicalCameraHelper(_viewport); + _flowDirectionHelper = new LogicalFlowDirectionHelper(_viewport, _materialHelper); } #region 浜嬩欢闆嗗悎 @@ -38,10 +40,14 @@ protected readonly LogicalOverrideColorHelper _overrideColorHelper = null;//瑕嗙洊棰滆壊杈呭姪绫� protected readonly LogicalOverrideOpacityHelper _overrideOpacityHelper = null;//瑕嗙洊閫忔槑搴﹁緟鍔╃被 protected readonly LogicalOverrideVisibleHelper _overrideVisibleHelper = null;//瑕嗙洊鍙鎬ц緟鍔╃被 + protected readonly LogicalBackgroudHelper _backgroundHelper = null;//鑳屾櫙杈呭姪绫� + protected readonly LogicalGridLineHelper _gridLinesHelper = null;//缃戞牸绾胯緟鍔╃被 protected readonly LogicalHighlightHelper _highlightHelper = null;//楂樹寒杈呭姪绫� protected readonly LogicalSelectionHelper _selectionHelper = null;//閫夋嫨杈呭姪绫� protected readonly LogicalZoomHelper _zoomHelper = null;//缂╂斁杈呭姪绫� protected readonly LogicalBillboardTextHelper _billboardTextHelper = null;//鍏憡鐗堟枃瀛楄緟鍔╃被 + protected readonly LogicalCameraHelper _cameraHelper = null;//鐩告満杈呭姪绫� + protected readonly LogicalFlowDirectionHelper _flowDirectionHelper = null;//姘存祦鏂瑰悜杈呭姪绫� #endregion @@ -210,9 +216,14 @@ return; } _viewport.Children.Clear(); - _viewport.Children.Add(new DefaultLights()); + _viewport.Children.Add(new SunLight()); _allVisualLogicalDict?.Values.ToList().ForEach(x => _viewport.Children.Add(x)); _viewport.ZoomExtents(); + if (_nw.DefaultCamera != null) + { + _cameraHelper.SetDefault(_nw.DefaultCamera); + _cameraHelper.ApplyDefault(); + } } @@ -364,6 +375,10 @@ _selectionHelper.StateChangedEvent += SelectionHelper_StateChangedEvent; _selectionHelper.SelectionChangedEvent += SelectionHelper_SelectionChangedEvent; } + if (_cameraHelper != null) + { + _cameraHelper.SaveDefaultCameraEvent += CameraHelper_SaveDefaultCameraEvent; + } } //楂樹寒鐘舵�佹敼鍙樹簨浠� @@ -409,8 +424,54 @@ this.SelectionChangedEvent?.Invoke(visuals); } + //榛樿鐩告満淇濆瓨浜嬩欢 + private void CameraHelper_SaveDefaultCameraEvent(LogicalCamera3D logicalCamera) + { + var camera = logicalCamera.ToCameraL3d(); + _nw.DefaultCamera = camera; + } + #endregion + + #endregion + + #region 蹇嵎鏂规硶 + + //鑾峰彇Visual3D + protected virtual LogicalVisual3D GetVisual3D(string Id) + { + if (!Initialized) + { + return default; + } + var id = Id?.Trim(); + if (string.IsNullOrEmpty(id)) + { + return default; + } + if (_allVisualL3dDict.ContainsKey(id)) + { + var visual = _allVisualL3dDict[Id]; + if (_allVisualLogicalDict.ContainsKey(visual)) + { + var visual3d = _allVisualLogicalDict[visual]; + return visual3d; + } + } + return default; + } + + //鑾峰彇Visual3D + protected virtual List<LogicalVisual3D> GetVisual3D(List<string> Ids) + { + if (!Initialized) + { + return default; + } + var list = Ids?.Select(x => GetVisual3D(x)).Where(x => x != null).ToList(); + return list; + } #endregion @@ -458,7 +519,6 @@ _viewport.FitView(lookDirection, upDirection); } - /// <summary> /// 璁剧疆鍙宠鍥� /// </summary> @@ -501,15 +561,298 @@ _viewport.FitView(lookDirection, upDirection); } + /// <summary> + /// 瑗垮崡瑙嗚 + /// 浠庣墿浣撶殑宸﹀墠涓嬫柟瑙傚療 + /// </summary> + public virtual void SetSouthWestView() + { + if (!Initialized) + { + return; + } + var lookDirection = new Vector3D(1, 1, -1); + var upDirection = new Vector3D(0, 0, 1); + _viewport.FitView(lookDirection, upDirection); + } + + /// <summary> + /// 涓滃崡瑙嗚 + /// 浠庣墿浣撶殑鍙冲墠涓嬫柟瑙傚療 + /// </summary> + public virtual void SetSouthEastView() + { + if (!Initialized) + { + return; + } + var lookDirection = new Vector3D(-1, 1, -1); + var upDirection = new Vector3D(0, 0, 1); + _viewport.FitView(lookDirection, upDirection); + } + + /// <summary> + /// 涓滃寳瑙嗚 + /// 浠庣墿浣撶殑鍙冲悗涓婃柟瑙傚療 + /// </summary> + public virtual void SetNorthEastView() + { + if (!Initialized) + { + return; + } + var lookDirection = new Vector3D(-1, -1, -1); + var upDirection = new Vector3D(0, 0, 1); + _viewport.FitView(lookDirection, upDirection); + } + + /// <summary> + /// 瑗垮寳瑙嗚 + /// 浠庣墿浣撶殑宸﹀悗涓婃柟瑙傚療 + /// </summary> + public virtual void SetNorthWestView() + { + if (!Initialized) + { + return; + } + var lookDirection = new Vector3D(1, -1, -1); + var upDirection = new Vector3D(0, 0, 1); + _viewport.FitView(lookDirection, upDirection); + } + #endregion + #region 鑳屾櫙 + + /// <summary> + /// 鏄剧ず鑳屾櫙 + /// </summary> + public virtual void ShowBackgroud() + { + if (!Initialized) + { + return; + } + _backgroundHelper.Show(); + } + + /// <summary> + /// 闅愯棌鑳屾櫙 + /// </summary> + public virtual void HideBackgroud() + { + if (!Initialized) + { + return; + } + _backgroundHelper.Hide(); + } + + /// <summary> + /// 鑳屾櫙鍙鎬� + /// </summary> + public virtual bool BackgroudVisible + { + get + { + if (!Initialized) + { + return false; + } + return _backgroundHelper.Visible; + } + set + { + if (!Initialized) + { + return; + } + _backgroundHelper.Visible = value; + } + } + + /// <summary> + /// 璁剧疆鑳屾櫙 + /// </summary> + public virtual void SetBackgroud(string url) + { + if (!Initialized) + { + return; + } + _backgroundHelper.Set(url); + } + + /// <summary> + /// 璁剧疆鑳屾櫙 + /// </summary> + public virtual void SetBackgroud(string url, double width, double height) + { + if (!Initialized) + { + return; + } + _backgroundHelper.Set(url, width, height); + } + + #endregion + + #region 缃戞牸绾� + + /// <summary> + /// 鏄剧ず缃戞牸绾� + /// </summary> + public virtual void ShowGridLines() + { + if (!Initialized) + { + return; + } + _gridLinesHelper.Show(); + } + + /// <summary> + /// 闅愯棌缃戞牸绾� + /// </summary> + public virtual void HideGridLines() + { + if (!Initialized) + { + return; + } + _gridLinesHelper.Hide(); + } + + /// <summary> + /// 缃戞牸绾垮彲瑙佹�� + /// </summary> + public virtual bool GridLinesVisible + { + get + { + if (!Initialized) + { + return false; + } + return _gridLinesHelper.Visible; + } + set + { + if (!Initialized) + { + return; + } + _gridLinesHelper.Visible = value; + } + } + + #endregion + + #region 缂╂斁 + + /// <summary> + /// 缂╂斁鑷冲彲瑙佹瀯浠� + /// </summary> + public virtual void ZoomToVisual(string Id) + { + if (!Initialized) + { + return; + } + var visual3d = GetVisual3D(Id); + if (visual3d != null) + { + _zoomHelper.ZoomToVisual(visual3d); + } + } + + /// <summary> + /// 缂╂斁鑷冲彲瑙佹瀯浠� + /// </summary> + public virtual void ZoomToVisual(List<string> Ids) + { + if (!Initialized) + { + return; + } + var visual3ds = GetVisual3D(Ids); + if (visual3ds != null && visual3ds.Count > 0) + { + _zoomHelper.ZoomToVisual(visual3ds); + } + } + + #endregion + + #region 閫夋嫨 + + /// <summary> + /// 閫夋嫨鍙鏋勪欢 + /// </summary> + public virtual void SelectVisual(string Id) + { + if (!Initialized) + { + return; + } + var visual3d = GetVisual3D(Id); + _selectionHelper.SelectVisual(visual3d); + } + + /// <summary> + /// 閫夋嫨鍙鏋勪欢 + /// </summary> + public virtual void SelectVisual(List<string> Ids) + { + if (!Initialized) + { + return; + } + var visual3ds = GetVisual3D(Ids); + _selectionHelper.SelectVisual(visual3ds); + } + + #endregion + + #region 缂╂斁骞堕�夋嫨 + + /// <summary> + /// 缂╂斁骞堕�夋嫨鍙鏋勪欢 + /// </summary> + public virtual void ZoomAndSelectVisual(string Id) + { + if (!Initialized) + { + return; + } + var visual3d = GetVisual3D(Id); + _zoomHelper.ZoomToVisual(visual3d); + _selectionHelper.SelectVisual(visual3d); + } + + /// <summary> + /// 缂╂斁骞堕�夋嫨鍙鏋勪欢 + /// </summary> + public virtual void ZoomAndSelectVisual(List<string> Ids) + { + if (!Initialized) + { + return; + } + var visual3ds = GetVisual3D(Ids); + _zoomHelper.ZoomToVisual(visual3ds); + _selectionHelper.SelectVisual(visual3ds); + } + + #endregion #region 鍏憡鏉挎枃鏈� /// <summary> /// 璁剧疆鍏憡鏉挎枃鏈� /// </summary> - public virtual void SetBillboardText(List<LogicalBillboardText> items) + public virtual void SetBillboardText(List<TextL3d> items) { if (!Initialized) { @@ -518,13 +861,117 @@ _billboardTextHelper.Set(items); } + /// <summary> + /// 鏇存柊鍏憡鏉挎枃鏈� + /// </summary> + public virtual void UpdateBillboardText(TextL3d item) + { + if (!Initialized) + { + return; + } + _billboardTextHelper.Update(item); + } + + /// <summary> + /// 鏇存柊鍏憡鏉挎枃鏈� + /// </summary> + public virtual void UpdateBillboardText(List<TextL3d> items) + { + if (!Initialized) + { + return; + } + _billboardTextHelper.Update(items); + } + + /// <summary> + /// 娓呯悊鍏憡鏉挎枃鏈� + /// </summary> + public virtual void ClearBillboardText() + { + if (!Initialized) + { + return; + } + _billboardTextHelper.Clear(); + } #endregion + #region 鐩告満 + /// <summary> + /// 淇濆瓨榛樿鐩告満 + /// </summary> + public void SaveDefaultCamera() + { + if (!Initialized) + { + return; + } + _cameraHelper.SaveDefault(); + } + /// <summary> + /// 搴旂敤榛樿鐩告満 + /// </summary> + public void ApplyDefaultCamera() + { + if (!Initialized) + { + return; + } + _cameraHelper.ApplyDefault(); + } + #endregion + + #region 姘存祦鏂瑰悜 + + /// <summary> + /// 鏄剧ず姘存祦鏂瑰悜 + /// </summary> + public void ShowFlowDirection() + { + var allLinkList = _allVisualLogicalDict.Values.Where(x => x is LogicalLink3D).Select(x => x as LogicalLink3D).ToList(); + _flowDirectionHelper.Set(allLinkList); + } + + /// <summary> + /// 璁剧疆姘存祦鏂瑰悜 + /// </summary> + public void SetFlowDirection(List<FlowDirectionL3d> list) + { + var dict = new Dictionary<LogicalLink3D, bool>(); + list?.ForEach(x => + { + if (_allVisualL3dDict.ContainsKey(x.Id)) + { + var visual = _allVisualL3dDict[x.Id]; + if (_allVisualLogicalDict.ContainsKey(visual)) + { + var visual3d = _allVisualLogicalDict[visual]; + if (visual3d is LogicalLink3D link3d) + { + dict.Add(link3d, x.Positive); + } + } + } + }); + _flowDirectionHelper.Set(dict); + } + + /// <summary> + /// 娓呴櫎姘存祦鏂瑰悜 + /// </summary> + public void ClearFlowDirection() + { + _flowDirectionHelper.Clear(); + } + + #endregion } -- Gitblit v1.9.3