lixiaojun
2024-12-03 4da9b8277d8ef7567dfc9ca47f1251849b7234de
WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/05-extensions/HydroModelInfoExtensions.cs
@@ -5,10 +5,12 @@
namespace Yw.WinFrmUI
{
    /// <summary>
    ///
    /// 水力信息拓展
    /// </summary>
    public static class HydroModelInfoExtensions
    {
        #region 可见字典
        /// <summary>
        /// 获取可见字典
        /// </summary>
@@ -22,10 +24,14 @@
            return allVisualList?.ToDictionary(x => x.Code);
        }
        #endregion
        #region 修复管网方向
        /// <summary>
        /// 修复
        /// 修复管网方向
        /// </summary>
        public static bool Repair(this Yw.Model.HydroModelInfo hydroInfo, out string msg)
        public static bool RepairLinksDirection(this Yw.Model.HydroModelInfo hydroInfo, out string msg)
        {
            msg = string.Empty;
            if (hydroInfo == null)
@@ -79,6 +85,174 @@
            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;
        /// <summary>
        /// 修复参数
        /// </summary>
        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
    }
}