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