using Yw.EPAnet; using Yw.Hydro; using Yw.Model; namespace Yw.WinFrmUI { /// /// 水力信息拓展 /// public static class HydroModelInfoExtensions { #region 可见字典 /// /// 获取可见字典 /// public static Dictionary GetVisualDict(this Yw.Model.HydroModelInfo hydroInfo) { if (hydroInfo == null) { return default; } var allVisualList = hydroInfo.GetAllVisuals(); return allVisualList?.ToDictionary(x => x.Code); } #endregion #region 修复管网方向 /// /// 修复管网方向 /// public static bool RepairLinksDirection(this Yw.Model.HydroModelInfo hydroInfo, out string msg) { msg = string.Empty; if (hydroInfo == null) { return false; } var checkResult = hydroInfo.Check(); if (!checkResult.Succeed) { msg = "检查失败导致无法进行试算,停止管网修复!"; return false; } var calcuResult = hydroInfo.Calcu(Yw.EPAnet.CalcuMode.Simple); if (!calcuResult.Succeed) { msg = "试算失败,停止管网修复!"; return false; } var allLinkList = hydroInfo.GetAllLinks(); if (allLinkList != null && allLinkList.Count < 1) { msg = "模型中未包含管段信息,停止管网修复!"; return false; } int count = 0; foreach (var link in allLinkList) { var calcuLink = calcuResult.LinkList?.Find(x => x.Code == link.Code); if (calcuLink == null) { continue; } if (!calcuLink.CalcuFlow.HasValue) { continue; } if (calcuLink.CalcuFlow.Value < 0) { var tempCode = link.StartCode; link.StartCode = link.EndCode; link.EndCode = tempCode; count++; } } msg = $"修复完成,共修复管段({count})个!"; return true; } #endregion #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 _valve_minorloss_default = 0.3d; /// /// 修复参数 /// public static void RepairParas(this Yw.Model.HydroModelInfo hydroInfo, out string msg) { msg = string.Empty; if (hydroInfo == null) { return; } var allNodes = hydroInfo.GetAllNodes(); var allLinks = hydroInfo.GetAllLinks(); //管道 if (hydroInfo.Pipes != null && hydroInfo.Pumps.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}】修复"); } } } //过渡件 if (hydroInfo.Translations != null && hydroInfo.Translations.Count > 0) { 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.EndCode == startNode.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; translation.UpdatePropStatus(nameof(translation.StartDiameter), ePropStatus.Lack, $"上游直径缺省,使用上游管道【{startPipe.Code}】修复"); } } } } var endNode = allNodes.Find(x => x.Code == translation.EndCode); if (endNode != null) { var endLink = allLinks.Find(x => x.StartCode == endNode.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; translation.UpdatePropStatus(nameof(translation.EndDiameter), ePropStatus.Lack, $"下游直径缺省,使用下游管道【{endPipe.Code}】修复"); } } } } 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; 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; 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; if (endPipe != null) { valve.Diameter = endPipe.Diameter; valve.UpdatePropStatus(nameof(valve.Diameter), ePropStatus.Lack, $"直径缺省,使用下游管道【{endPipe.Code}】修复"); } } } } } } } } #endregion } }