¶Ô±ÈÐÂÎļþ |
| | |
| | | using Yw.Hydro; |
| | | using Yw.Model; |
| | | |
| | | namespace Yw.WinFrmUI |
| | | { |
| | | /// <summary> |
| | | /// æ°´åä¿¡æ¯æå± |
| | | /// </summary> |
| | | public static class HydroModelInfoExtensions |
| | | { |
| | | |
| | | #region ä¿®å¤åæ° |
| | | |
| | | private const double _pipe_roughness_default = 110;//管éé»è®¤ç²ç³ç³»æ° |
| | | 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, |
| | | HydroPropStatusHelper propStatusHelper, |
| | | out string msg |
| | | ) |
| | | { |
| | | msg = string.Empty; |
| | | if (hydroInfo == null) |
| | | { |
| | | return; |
| | | } |
| | | |
| | | var allNodes = hydroInfo.GetAllNodes(); |
| | | var allLinks = hydroInfo.GetAllLinks(); |
| | | |
| | | //管é |
| | | if (hydroInfo.Pipes != null && hydroInfo.Pipes.Count > 0) |
| | | { |
| | | foreach (var pipe in hydroInfo.Pipes) |
| | | { |
| | | if (pipe.Roughness <= 0) |
| | | { |
| | | pipe.Roughness = _pipe_roughness_default; |
| | | propStatusHelper.UpdatePropStatus(pipe, nameof(pipe.Roughness), ePropStatus.Abnormal, "ãç²ç³ç³»æ°ãæ°æ®å¼å¸¸"); |
| | | } |
| | | } |
| | | } |
| | | |
| | | //è¿æ¸¡ä»¶ |
| | | if (hydroInfo.Translations != null && hydroInfo.Translations.Count > 0) |
| | | { |
| | | 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); |
| | | if (startLink != null) |
| | | { |
| | | var startPipe = startLink as Yw.Model.HydroPipeInfo; |
| | | if (startPipe != null) |
| | | { |
| | | tempDiameter = startPipe.Diameter; |
| | | if (translation.StartDiameter != startPipe.Diameter) |
| | | { |
| | | translation.StartDiameter = startPipe.Diameter; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | 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); |
| | | if (endLink != null) |
| | | { |
| | | var endPipe = endLink as Yw.Model.HydroPipeInfo; |
| | | if (endPipe != null) |
| | | { |
| | | if (translation.EndDiameter != endPipe.Diameter) |
| | | { |
| | | tempDiameter = endPipe.Diameter; |
| | | translation.EndDiameter = endPipe.Diameter; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | if (translation.StartDiameter <= 0) |
| | | { |
| | | if (tempDiameter.HasValue) |
| | | { |
| | | translation.StartDiameter = tempDiameter.Value; |
| | | } |
| | | } |
| | | if (translation.EndDiameter <= 0) |
| | | { |
| | | if (tempDiameter.HasValue) |
| | | { |
| | | translation.EndDiameter = tempDiameter.Value; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | //éé¨ |
| | | if (hydroInfo.Valves != null && hydroInfo.Valves.Count > 0) |
| | | { |
| | | foreach (var valve in hydroInfo.Valves) |
| | | { |
| | | if (valve.MinorLoss <= 0) |
| | | { |
| | | valve.MinorLoss = _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.StartCode == startNode.Code || x.EndCode == startNode.Code) && x.Code != valve.Code) |
| | | as Yw.Model.HydroPipeInfo; |
| | | if (startPipe != null) |
| | | { |
| | | valve.Diameter = startPipe.Diameter; |
| | | } |
| | | else |
| | | { |
| | | var endNode = allNodes.Find(x => x.Code == valve.EndCode); |
| | | if (endNode != null) |
| | | { |
| | | 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; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | //é»ä»¶ |
| | | var allResistanceList = hydroInfo.GetAllResistances(); |
| | | if (allResistanceList != null && allResistanceList.Count > 0) |
| | | { |
| | | foreach (var resistance in allResistanceList) |
| | | { |
| | | if (resistance.MinorLoss <= 0) |
| | | { |
| | | resistance.MinorLoss = _resistance_minorloss_default; |
| | | } |
| | | var startNode = allNodes.Find(x => x.Code == resistance.StartCode); |
| | | if (startNode != null) |
| | | { |
| | | 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; |
| | | } |
| | | else |
| | | { |
| | | var endNode = allNodes.Find(x => x.Code == resistance.EndCode); |
| | | if (endNode != null) |
| | | { |
| | | 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; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | //é·å¤´ |
| | | 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 |
| | | |
| | | } |
| | | |
| | | |
| | | #endregion |
| | | |
| | | #region è£
ç½®è®¡ç® |
| | | |
| | | /// <summary> |
| | | /// è·åå¼å§åå(m) |
| | | /// </summary> |
| | | public static double GetStartHead(this Yw.Model.HydroModelInfo hydroInfo) |
| | | { |
| | | if (hydroInfo == null) |
| | | { |
| | | return default; |
| | | } |
| | | double startHeadValue = 0; |
| | | var allSourceList = hydroInfo.GetAllSources(); |
| | | if (allSourceList != null && allSourceList.Count > 0) |
| | | { |
| | | var startSource = allSourceList.Matching(new List<string>() |
| | | { |
| | | Yw.Hydro.Flags.æ°´æº, |
| | | Yw.Hydro.Flags.å§ç«¯, |
| | | Yw.Hydro.Flags.é»è®¤ |
| | | }); |
| | | if (startSource == null) |
| | | { |
| | | startSource = allSourceList.Matching(new List<string>() |
| | | { |
| | | Yw.Hydro.Flags.æ°´æº, |
| | | Yw.Hydro.Flags.å§ç«¯ |
| | | }); |
| | | } |
| | | if (startSource != null) |
| | | { |
| | | if (startSource is HydroTankInfo tank) |
| | | { |
| | | startHeadValue = tank.PoolElev + tank.InitLevel; |
| | | } |
| | | } |
| | | } |
| | | 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) |
| | | { |
| | | var endSource = allNodeList.Matching(new List<string>() |
| | | { |
| | | Yw.Hydro.Flags.æ°´æº, |
| | | Yw.Hydro.Flags.æ«ç«¯, |
| | | Yw.Hydro.Flags.é»è®¤ |
| | | }); |
| | | if (endSource == null) |
| | | { |
| | | endSource = allNodeList.Matching(new List<string>() |
| | | { |
| | | Yw.Hydro.Flags.æ°´æº, |
| | | Yw.Hydro.Flags.æ«ç«¯ |
| | | }); |
| | | } |
| | | if (endSource != null) |
| | | { |
| | | if (endSource is HydroTankInfo tank) |
| | | { |
| | | endHeadValue = tank.PoolElev + tank.InitLevel; |
| | | } |
| | | else if (endSource is HydroEmitterInfo emitter) |
| | | { |
| | | endHeadValue = emitter.Elev; |
| | | } |
| | | } |
| | | } |
| | | 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; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è·åæ»ç®¡æµé |
| | | /// </summary> |
| | | public static double? GetPipeQ(this Yw.Model.HydroModelInfo hydroInfo, HydroCalcuResult calcuResult) |
| | | { |
| | | return GetPipeQ(hydroInfo, calcuResult?.GetVisualDict()); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è·åæ»ç®¡æµé |
| | | /// </summary> |
| | | public static double? GetPipeQ(this Yw.Model.HydroModelInfo hydroInfo, Dictionary<string, HydroCalcuVisualResult> allCalcuVisualDict) |
| | | { |
| | | if (hydroInfo == null) |
| | | { |
| | | return default; |
| | | } |
| | | if (allCalcuVisualDict == null || allCalcuVisualDict.Count < 1) |
| | | { |
| | | return default; |
| | | } |
| | | var allLinkList = hydroInfo.GetAllLinks(); |
| | | if (allLinkList == null || allLinkList.Count < 1) |
| | | { |
| | | return default; |
| | | } |
| | | var link = allLinkList.Matching(new List<string>() |
| | | { |
| | | Yw.Hydro.Flags.æ»ç®¡, |
| | | Yw.Hydro.Flags.åºå£, |
| | | Yw.Hydro.Flags.é»è®¤ |
| | | }); |
| | | if (link == null) |
| | | { |
| | | link = allLinkList.Matching(new List<string>() |
| | | { |
| | | Yw.Hydro.Flags.æ»ç®¡, |
| | | Yw.Hydro.Flags.åºå£ |
| | | }); |
| | | } |
| | | if (link == null) |
| | | { |
| | | return default; |
| | | } |
| | | |
| | | var calcuVisualResult = allCalcuVisualDict.GetValue(link.Code); |
| | | if (calcuVisualResult == null) |
| | | { |
| | | return default; |
| | | } |
| | | var calcuValue = calcuVisualResult.GetCalcuValue(Yw.Hydro.VisualCalcuProp.CalcuFlow); |
| | | if (calcuValue == null) |
| | | { |
| | | return default; |
| | | } |
| | | return Math.Round(Math.Abs(calcuValue.Value), 1); |
| | | } |
| | | |
| | | /// <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) |
| | | { |
| | | return GetPipeHead(hydroInfo, calcuResult?.GetVisualDict()); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è·åæ»ç®¡ååï¼ç»å¯¹ååï¼ |
| | | /// </summary> |
| | | public static double? GetPipeHead(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; |
| | | } |
| | | var endHeadValue = calcuValue.Value; |
| | | var startHeadValue = GetStartHead(hydroInfo); |
| | | return Math.Round(endHeadValue - startHeadValue, 2); |
| | | } |
| | | |
| | | #endregion |
| | | |
| | | #region 计ç®ç»æ |
| | | |
| | | |
| | | |
| | | #endregion |
| | | |
| | | } |
| | | } |