using Yw.Hydro; using Yw.Model; namespace Yw.WinFrmUI { /// /// 水力信息拓展 /// 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;//冷却塔流量系数 /// /// 修复参数 /// 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 装置计算 /// /// 获取开始压力(m) /// 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() { Yw.Hydro.Flags.水源, Yw.Hydro.Flags.始端, Yw.Hydro.Flags.默认 }); if (startSource == null) { startSource = allSourceList.Matching(new List() { Yw.Hydro.Flags.水源, Yw.Hydro.Flags.始端 }); } if (startSource != null) { if (startSource is HydroTankInfo tank) { startHeadValue = tank.PoolElev + tank.InitLevel; } } } return startHeadValue; } /// /// 获取结束压力(m) /// 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() { Yw.Hydro.Flags.水源, Yw.Hydro.Flags.末端, Yw.Hydro.Flags.默认 }); if (endSource == null) { endSource = allNodeList.Matching(new List() { 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; } /// /// 获取扬程 /// 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; } /// /// 获取总管流量 /// public static double? GetPipeQ(this Yw.Model.HydroModelInfo hydroInfo, HydroCalcuResult calcuResult) { return GetPipeQ(hydroInfo, calcuResult?.GetVisualDict()); } /// /// 获取总管流量 /// public static double? GetPipeQ(this Yw.Model.HydroModelInfo hydroInfo, Dictionary 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() { Yw.Hydro.Flags.总管, Yw.Hydro.Flags.出口, Yw.Hydro.Flags.默认 }); if (link == null) { link = allLinkList.Matching(new List() { 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); } /// /// 获取总管结束压力(绝对压力) /// public static double? GetPipeEndHead(this Yw.Model.HydroModelInfo hydroInfo, Dictionary 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() { Yw.Hydro.Flags.总管, Yw.Hydro.Flags.出口, Yw.Hydro.Flags.默认 }); if (node == null) { node = allNodeList.Matching(new List() { 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); } /// /// 获取总管结束压力(绝对压力) /// public static double? GetPipeEndHead(this Yw.Model.HydroModelInfo hydroInfo, HydroCalcuResult calcuResult) { return GetPipeEndHead(hydroInfo, calcuResult?.GetVisualDict()); } /// /// 获取总管压力(绝对压力) /// public static double? GetPipeHead(this Yw.Model.HydroModelInfo hydroInfo, HydroCalcuResult calcuResult) { return GetPipeHead(hydroInfo, calcuResult?.GetVisualDict()); } /// /// 获取总管压力(绝对压力) /// public static double? GetPipeHead(this Yw.Model.HydroModelInfo hydroInfo, Dictionary 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() { Yw.Hydro.Flags.总管, Yw.Hydro.Flags.出口, Yw.Hydro.Flags.默认 }); if (node == null) { node = allNodeList.Matching(new List() { 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 } }