From a234486afe7d632b46cd65fa2cffbd07d93d4285 Mon Sep 17 00:00:00 2001
From: lixiaojun <1287241240@qq.com>
Date: 星期一, 10 二月 2025 13:49:02 +0800
Subject: [PATCH] 并联曲线bug修复及单泵性能曲线编辑功能优化

---
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/05-extensions/HydroModelInfoExtensions.cs |  284 +++++++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 229 insertions(+), 55 deletions(-)

diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/05-extensions/HydroModelInfoExtensions.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/05-extensions/HydroModelInfoExtensions.cs
index 284709d..0cedecf 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/05-extensions/HydroModelInfoExtensions.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/05-extensions/HydroModelInfoExtensions.cs
@@ -1,6 +1,4 @@
-锘縰sing DevExpress.Drawing.Internal.Interop;
-using Yw.EPAnet;
-using Yw.Hydro;
+锘縰sing Yw.Hydro;
 using Yw.Model;
 
 namespace Yw.WinFrmUI
@@ -13,16 +11,23 @@
 
         #region 淇鍙傛暟
 
-        private const double _pipe_diameter_default = 500;//绠¢亾榛樿鐩村緞
         private const double _pipe_roughness_default = 110;//绠¢亾榛樿绮楃硻绯绘暟
-        private const double _pipe_minorloss_default = 0.1;//绠¢亾榛樿绮楃硻绯绘暟
+        private const double _translation_roughness_default = 120;//杩囨浮浠堕粯璁ょ矖绯欑郴鏁�
+        private const double _translation_minorloss_default = 0.3;//杩囨浮浠堕粯璁ゅ眬闃荤郴鏁�
         private const double _valve_minorloss_default = 0.3d; //闃�闂ㄩ粯璁ゅ眬闃荤郴鏁�
         private const double _resistance_minorloss_default = 9d;//闃讳欢榛樿灞�闃荤郴鏁�
+        private const double _blunthead_minorloss_default = 0.1d;//闂峰ご灞�閮ㄩ樆鍔涚郴鏁�
+        private const double _cooling_coefficient_default = 100000d;//鍐峰嵈濉旀祦閲忕郴鏁�
 
         /// <summary>
         /// 淇鍙傛暟
         /// </summary>
-        public static void RepairParas(this Yw.Model.HydroModelInfo hydroInfo, out string msg)
+        public static void RepairParas
+            (
+                this Yw.Model.HydroModelInfo hydroInfo,
+                HydroPropStatusHelper propStatusHelper,
+                out string msg
+            )
         {
             msg = string.Empty;
             if (hydroInfo == null)
@@ -34,24 +39,14 @@
             var allLinks = hydroInfo.GetAllLinks();
 
             //绠¢亾
-            if (hydroInfo.Pipes != null && hydroInfo.Pumps.Count > 0)
+            if (hydroInfo.Pipes != null && hydroInfo.Pipes.Count > 0)
             {
                 foreach (var pipe in hydroInfo.Pipes)
                 {
-                    if (pipe.Diameter <= 0)
-                    {
-                        pipe.Diameter = _pipe_diameter_default;
-                        pipe.UpdatePropStatus(nameof(pipe.Diameter), ePropStatus.Lack, $"鐩村緞缂虹渷锛屼娇鐢ㄩ粯璁ゅ�笺�恵_pipe_diameter_default}mm銆戜慨澶�");
-                    }
                     if (pipe.Roughness <= 0)
                     {
                         pipe.Roughness = _pipe_roughness_default;
-                        pipe.UpdatePropStatus(nameof(pipe.Roughness), ePropStatus.Lack, $"绮楃硻绯绘暟缂虹渷锛屼娇鐢ㄩ粯璁ゅ�笺�恵_pipe_roughness_default}銆戜慨澶�");
-                    }
-                    if (pipe.MinorLoss <= 0)
-                    {
-                        pipe.MinorLoss = _pipe_minorloss_default;
-                        pipe.UpdatePropStatus(nameof(pipe.MinorLoss), ePropStatus.Lack, $"绮楃硻绯绘暟缂虹渷锛屼娇鐢ㄩ粯璁ゅ�笺�恵_pipe_minorloss_default}銆戜慨澶�");
+                        propStatusHelper.UpdatePropStatus(pipe, nameof(pipe.Roughness), ePropStatus.Abnormal, "銆愮矖绯欑郴鏁般�戞暟鎹紓甯�");
                     }
                 }
             }
@@ -61,30 +56,12 @@
             {
                 foreach (var translation in hydroInfo.Translations)
                 {
-                    if (translation.Diameter <= 0)
-                    {
-                        translation.Diameter = _pipe_diameter_default;
-                        translation.UpdatePropStatus(nameof(translation.Diameter), ePropStatus.Lack, $"鐩村緞缂虹渷锛屼娇鐢ㄩ粯璁ゅ�笺�恵_pipe_diameter_default}mm銆戜慨澶�");
-                    }
-                    if (translation.Roughness <= 0)
-                    {
-                        translation.Roughness = _pipe_roughness_default;
-                        translation.UpdatePropStatus(nameof(translation.Roughness), ePropStatus.Lack, $"绮楃硻绯绘暟缂虹渷锛屼娇鐢ㄩ粯璁ゅ�笺�恵_pipe_roughness_default}銆戜慨澶�");
-                    }
-                    if (translation.MinorLoss <= 0)
-                    {
-                        translation.MinorLoss = _pipe_minorloss_default;
-                        translation.UpdatePropStatus(nameof(translation.MinorLoss), ePropStatus.Lack, $"绮楃硻绯绘暟缂虹渷锛屼娇鐢ㄩ粯璁ゅ�笺�恵_pipe_minorloss_default}銆戜慨澶�");
-                    }
-                }
-
-                foreach (var translation in hydroInfo.Translations)
-                {
                     double? tempDiameter = null;
                     var startNode = allNodes.Find(x => x.Code == translation.StartCode);
                     if (startNode != null)
                     {
-                        var startLink = allLinks.Find(x => (x.StartCode == startNode.Code || x.EndCode == startNode.Code) && x.Code != translation.Code);
+                        var startLink = allLinks
+                            .Find(x => (x.StartCode == startNode.Code || x.EndCode == startNode.Code) && x.Code != translation.Code);
                         if (startLink != null)
                         {
                             var startPipe = startLink as Yw.Model.HydroPipeInfo;
@@ -94,7 +71,6 @@
                                 if (translation.StartDiameter != startPipe.Diameter)
                                 {
                                     translation.StartDiameter = startPipe.Diameter;
-                                    translation.UpdatePropStatus(nameof(translation.StartDiameter), ePropStatus.Lack, $"涓婃父鐩村緞缂虹渷锛屼娇鐢ㄤ笂娓哥閬撱�恵startPipe.Code}銆戜慨澶�");
                                 }
                             }
                         }
@@ -103,7 +79,8 @@
                     var endNode = allNodes.Find(x => x.Code == translation.EndCode);
                     if (endNode != null)
                     {
-                        var endLink = allLinks.Find(x => (x.StartCode == endNode.Code || x.EndCode == endNode.Code) && x.Code != translation.Code);
+                        var endLink = allLinks
+                            .Find(x => (x.StartCode == endNode.Code || x.EndCode == endNode.Code) && x.Code != translation.Code);
                         if (endLink != null)
                         {
                             var endPipe = endLink as Yw.Model.HydroPipeInfo;
@@ -113,7 +90,6 @@
                                 {
                                     tempDiameter = endPipe.Diameter;
                                     translation.EndDiameter = endPipe.Diameter;
-                                    translation.UpdatePropStatus(nameof(translation.EndDiameter), ePropStatus.Lack, $"涓嬫父鐩村緞缂虹渷锛屼娇鐢ㄤ笅娓哥閬撱�恵endPipe.Code}銆戜慨澶�");
                                 }
                             }
                         }
@@ -144,29 +120,30 @@
                     if (valve.MinorLoss <= 0)
                     {
                         valve.MinorLoss = _valve_minorloss_default;
-                        valve.UpdatePropStatus(nameof(valve.MinorLoss), ePropStatus.Lack, $"灞�闃荤郴鏁扮己鐪侊紝浣跨敤榛樿鍊笺�恵_valve_minorloss_default}銆戜慨澶�");
                     }
                     if (valve.Diameter <= 0)
                     {
                         var startNode = allNodes.Find(x => x.Code == valve.StartCode);
                         if (startNode != null)
                         {
-                            var startPipe = allLinks.Find(x => x.EndCode == startNode.Code) as Yw.Model.HydroPipeInfo;
+                            var startPipe = allLinks
+                                .Find(x => (x.StartCode == startNode.Code || x.EndCode == startNode.Code) && x.Code != valve.Code)
+                                as Yw.Model.HydroPipeInfo;
                             if (startPipe != null)
                             {
                                 valve.Diameter = startPipe.Diameter;
-                                valve.UpdatePropStatus(nameof(valve.Diameter), ePropStatus.Lack, $"鐩村緞缂虹渷锛屼娇鐢ㄤ笂娓哥閬撱�恵startPipe.Code}銆戜慨澶�");
                             }
                             else
                             {
                                 var endNode = allNodes.Find(x => x.Code == valve.EndCode);
                                 if (endNode != null)
                                 {
-                                    var endPipe = allLinks.Find(x => x.StartCode == endNode.Code) as Yw.Model.HydroPipeInfo;
+                                    var endPipe = allLinks
+                                        .Find(x => (x.StartCode == endNode.Code || x.EndCode == endNode.Code) && x.Code != valve.Code)
+                                        as Yw.Model.HydroPipeInfo;
                                     if (endPipe != null)
                                     {
                                         valve.Diameter = endPipe.Diameter;
-                                        valve.UpdatePropStatus(nameof(valve.Diameter), ePropStatus.Lack, $"鐩村緞缂虹渷锛屼娇鐢ㄤ笅娓哥閬撱�恵endPipe.Code}銆戜慨澶�");
                                     }
                                 }
                             }
@@ -184,33 +161,140 @@
                     if (resistance.MinorLoss <= 0)
                     {
                         resistance.MinorLoss = _resistance_minorloss_default;
-                        resistance.UpdatePropStatus(nameof(resistance.MinorLoss), ePropStatus.Lack, $"灞�闃荤郴鏁扮己鐪侊紝浣跨敤榛樿鍊笺�恵_resistance_minorloss_default}銆戜慨澶�");
                     }
                     var startNode = allNodes.Find(x => x.Code == resistance.StartCode);
                     if (startNode != null)
                     {
-                        var startPipe = allLinks.Find(x => x.EndCode == startNode.Code) as Yw.Model.HydroPipeInfo;
+                        var startPipe = allLinks
+                            .Find(x => (x.StartCode == startNode.Code || x.EndCode == startNode.Code) && x.Code != resistance.Code)
+                                as Yw.Model.HydroPipeInfo;
                         if (startPipe != null)
                         {
                             resistance.Diameter = startPipe.Diameter;
-                            resistance.UpdatePropStatus(nameof(resistance.Diameter), ePropStatus.Lack, $"鐩村緞浣跨敤涓婃父绠¢亾銆恵startPipe.Code}銆戜慨澶�");
                         }
                         else
                         {
                             var endNode = allNodes.Find(x => x.Code == resistance.EndCode);
                             if (endNode != null)
                             {
-                                var endPipe = allLinks.Find(x => x.StartCode == endNode.Code) as Yw.Model.HydroPipeInfo;
+                                var endPipe = allLinks
+                                    .Find(x => (x.StartCode == endNode.Code || x.EndCode == endNode.Code) && x.Code != resistance.Code)
+                                     as Yw.Model.HydroPipeInfo;
                                 if (endPipe != null)
                                 {
                                     resistance.Diameter = endPipe.Diameter;
-                                    resistance.UpdatePropStatus(nameof(resistance.Diameter), ePropStatus.Lack, $"鐩村緞浣跨敤涓嬫父绠¢亾銆恵endPipe.Code}銆戜慨澶�");
                                 }
                             }
                         }
                     }
                 }
             }
+
+            //闂峰ご
+            if (hydroInfo.Bluntheads != null && hydroInfo.Bluntheads.Count > 0)
+            {
+                foreach (var visual in hydroInfo.Bluntheads)
+                {
+                    if (visual.MinorLoss <= 0)
+                    {
+                        visual.MinorLoss = _blunthead_minorloss_default;
+                    }
+                    if (visual.Caliber < 1)
+                    {
+                        var link = allLinks.Find(x => x.StartCode == visual.Code || x.EndCode == visual.Code);
+                        if (link != null)
+                        {
+                            if (link is HydroResistanceInfo resistance)
+                            {
+                                visual.Caliber = resistance.Diameter;
+                            }
+                            else if (link is HydroValveInfo valve)
+                            {
+                                visual.Caliber = valve.Diameter;
+                            }
+                            else if (link is HydroTranslationInfo translation)
+                            {
+
+                            }
+                            else if (link is HydroPipeInfo pipe)
+                            {
+                                visual.Caliber = pipe.Diameter;
+                            }
+                        }
+                    }
+
+                }
+            }
+
+            #region 寮ご
+
+            if (hydroInfo.Elbows != null && hydroInfo.Elbows.Count > 0)
+            {
+                foreach (var visual in hydroInfo.Elbows)
+                {
+                    if (visual.MinorLoss <= 0)
+                    {
+                        visual.MinorLoss = _blunthead_minorloss_default;
+                    }
+                    if (visual.Caliber < 1)
+                    {
+                        var link = allLinks.Find(x => x.StartCode == visual.Code || x.EndCode == visual.Code);
+                        if (link != null)
+                        {
+                            if (link is HydroResistanceInfo resistance)
+                            {
+                                visual.Caliber = resistance.Diameter;
+                            }
+                            else if (link is HydroValveInfo valve)
+                            {
+                                visual.Caliber = valve.Diameter;
+                            }
+                            else if (link is HydroTranslationInfo translation)
+                            {
+
+                            }
+                            else if (link is HydroPipeInfo pipe)
+                            {
+                                visual.Caliber = pipe.Diameter;
+                            }
+                        }
+                    }
+
+                }
+            }
+
+            #endregion
+
+            #region 鍐峰嵈濉�
+
+            if (hydroInfo.Coolings != null && hydroInfo.Coolings.Count > 0)
+            {
+                foreach (var cooling in hydroInfo.Coolings)
+                {
+                    if (cooling.Coefficient < 1)
+                    {
+                        cooling.Coefficient = _cooling_coefficient_default;
+                        propStatusHelper.UpdatePropStatus(cooling.Code, nameof(cooling.Coefficient), ePropStatus.Abnormal, $"銆愭祦閲忕郴鏁般�戞暟鎹紓甯革紝浣跨敤榛樿鍊糩{_cooling_coefficient_default}]淇");
+                    }
+                    if (cooling.Caliber < 1)
+                    {
+                        var link = allLinks.Find(x => x.StartCode == cooling.Code || x.EndCode == cooling.Code);
+                        if (link != null)
+                        {
+                            if (link is HydroPipeInfo pipe)
+                            {
+                                if (pipe.Diameter > 0)
+                                {
+                                    cooling.Caliber = pipe.Diameter;
+                                    propStatusHelper.UpdatePropStatus(cooling.Code, nameof(cooling.Caliber), ePropStatus.Abnormal, $"銆愬彛寰勩�戞暟鎹紓甯革紝浣跨敤鐩搁偦绠¢亾淇");
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+
+            #endregion
 
         }
 
@@ -220,9 +304,9 @@
         #region 瑁呯疆璁$畻
 
         /// <summary>
-        /// 鑾峰彇鎵▼
+        /// 鑾峰彇寮�濮嬪帇鍔�(m)
         /// </summary>
-        public static double GetHead(this Yw.Model.HydroModelInfo hydroInfo)
+        public static double GetStartHead(this Yw.Model.HydroModelInfo hydroInfo)
         {
             if (hydroInfo == null)
             {
@@ -254,7 +338,18 @@
                     }
                 }
             }
+            return startHeadValue;
+        }
 
+        /// <summary>
+        /// 鑾峰彇缁撴潫鍘嬪姏(m)
+        /// </summary>
+        public static double GetEndHead(this Yw.Model.HydroModelInfo hydroInfo)
+        {
+            if (hydroInfo == null)
+            {
+                return default;
+            }
             double endHeadValue = 0;
             var allNodeList = hydroInfo.GetAllNodes();
             if (allNodeList != null && allNodeList.Count > 0)
@@ -267,7 +362,7 @@
                 });
                 if (endSource == null)
                 {
-                    endSource = allSourceList.Matching(new List<string>()
+                    endSource = allNodeList.Matching(new List<string>()
                     {
                         Yw.Hydro.Flags.姘存簮,
                         Yw.Hydro.Flags.鏈
@@ -285,7 +380,20 @@
                     }
                 }
             }
+            return endHeadValue;
+        }
 
+        /// <summary>
+        /// 鑾峰彇鎵▼
+        /// </summary>
+        public static double GetHead(this Yw.Model.HydroModelInfo hydroInfo)
+        {
+            if (hydroInfo == null)
+            {
+                return default;
+            }
+            var startHeadValue = GetStartHead(hydroInfo);
+            var endHeadValue = GetEndHead(hydroInfo);
             return endHeadValue - startHeadValue;
         }
 
@@ -348,6 +456,64 @@
         }
 
         /// <summary>
+        /// 鑾峰彇鎬荤缁撴潫鍘嬪姏锛堢粷瀵瑰帇鍔涳級
+        /// </summary>
+        public static double? GetPipeEndHead(this Yw.Model.HydroModelInfo hydroInfo, Dictionary<string, HydroCalcuVisualResult> allCalcuVisualDict)
+        {
+            if (hydroInfo == null)
+            {
+                return default;
+            }
+            if (allCalcuVisualDict == null || allCalcuVisualDict.Count < 1)
+            {
+                return default;
+            }
+            var allNodeList = hydroInfo.GetAllNodes();
+            if (allNodeList == null || allNodeList.Count < 1)
+            {
+                return default;
+            }
+            var node = allNodeList.Matching(new List<string>()
+            {
+                Yw.Hydro.Flags.鎬荤,
+                Yw.Hydro.Flags.鍑哄彛,
+                Yw.Hydro.Flags.榛樿
+            });
+            if (node == null)
+            {
+                node = allNodeList.Matching(new List<string>()
+                {
+                    Yw.Hydro.Flags.鎬荤,
+                    Yw.Hydro.Flags.鍑哄彛
+                });
+            }
+            if (node == null)
+            {
+                return default;
+            }
+
+            var calcuVisualResult = allCalcuVisualDict.GetValue(node.Code);
+            if (calcuVisualResult == null)
+            {
+                return default;
+            }
+            var calcuValue = calcuVisualResult.GetCalcuValue(Yw.Hydro.VisualCalcuProp.CalcuHead);
+            if (calcuValue == null)
+            {
+                return default;
+            }
+            return Math.Round(calcuValue.Value, 2);
+        }
+
+        /// <summary>
+        /// 鑾峰彇鎬荤缁撴潫鍘嬪姏锛堢粷瀵瑰帇鍔涳級
+        /// </summary>
+        public static double? GetPipeEndHead(this Yw.Model.HydroModelInfo hydroInfo, HydroCalcuResult calcuResult)
+        {
+            return GetPipeEndHead(hydroInfo, calcuResult?.GetVisualDict());
+        }
+
+        /// <summary>
         /// 鑾峰彇鎬荤鍘嬪姏锛堢粷瀵瑰帇鍔涳級
         /// </summary>
         public static double? GetPipeHead(this Yw.Model.HydroModelInfo hydroInfo, HydroCalcuResult calcuResult)
@@ -402,10 +568,18 @@
             {
                 return default;
             }
-            return Math.Round(calcuValue.Value, 2);
+            var endHeadValue = calcuValue.Value;
+            var startHeadValue = GetStartHead(hydroInfo);
+            return Math.Round(endHeadValue - startHeadValue, 2);
         }
 
         #endregion
 
+        #region 璁$畻缁撴灉
+
+
+
+        #endregion
+
     }
 }

--
Gitblit v1.9.3