yangyin
2024-08-20 98e49c0dd42840a094837f7acae532bc237a719a
Hydro/Yw.EPAnet.Calcu.Core/02-check/NetworkCheckExtensions.cs
@@ -157,32 +157,121 @@
                            FailReason = "属性设置错误,管道长度必须大于0"
                        });
                    }
                    if (pipe.Roughness <= 0.1 || pipe.Roughness > 10000)
                    if (pipe.Roughness <= 5 || pipe.Roughness > 10000)
                    {
                        result.Succeed = false;
                        result.FailedList.Add(new CheckFailed()
                        {
                            ParterId = pipe.Id,
                            FailType = eCheckFailType.PropSetError,
                            FailReason = "属性设置错误,粗糙系数区间(0.1,10000】"
                            FailReason = "属性设置错误,粗糙系数区间(5,10000】"
                        });
                    }
                    if (pipe.Diameter <= 0.1 || pipe.Diameter > 10000)
                    if (pipe.Diameter <= 10 || pipe.Diameter > 10000)
                    {
                        result.Succeed = false;
                        result.FailedList.Add(new CheckFailed()
                        {
                            ParterId = pipe.Id,
                            FailType = eCheckFailType.PropSetError,
                            FailReason = "属性设置错误,管径区间(0.1,10000】"
                            FailReason = "属性设置错误,管径区间(10,10000】"
                        });
                    }
                }
            }
            //验证连通性
            var objs = network.GetAllLinks().Select(o => o as ILink).ToList();
            objs = objs.Distinct().ToList();
            var visitedNodes = new HashSet<INode>();
            var FindObjs = new HashSet<IParter>();
            var resultObjs = new List<List<IParter>>();
            objs.ForEach(o =>
            {
                //如果o的两个端点都已经被访问过,则不再访问
                if (visitedNodes.Contains(o.StartNode) && visitedNodes.Contains(o.EndNode))
                    return;
                var list=TraversePipeNetworkALL(o, visitedNodes, FindObjs);
                if (list.Count > 0)
                    resultObjs.Add(list);
            });
            int NumErrRegion = 0;
            resultObjs.ForEach(o =>
            {
                //验证o中是否包含水池或者水库,如果不包含不通过
                if (o.Exists(x => x is Reservoir || x is Tank)) return;
                NumErrRegion++;
            });
            if (NumErrRegion > 0)
            {
                result.Succeed = false;
                result.FailedList.Add(new CheckFailed()
                {
                    ParterId = string.Empty,
                    FailType = eCheckFailType.Disconnected,
                    FailReason = $"管网中有{resultObjs.Count}个独立连通性区域,其中{NumErrRegion}个没有包含水池或水库"
                });
            }
            return result;
        }
        /// <summary>
        /// 遍历管网
        /// </summary>
        private static List<IParter> TraversePipeNetworkALL(ILink startLink, HashSet<INode> visitedNodes , HashSet<IParter> FindObjs)
        {
            List<IParter> result=new List<IParter>();
            Queue<ILink> queue = new Queue<ILink>();
            queue.Enqueue(startLink);
            if (visitedNodes == null)
                visitedNodes = new HashSet<INode>();
            //visitedNodes.Add(startLink.StartNode);
            //visitedNodes.Add(startLink.EndNode);
            while (queue.Count > 0)
            {
                ILink currentLink = queue.Dequeue();
                //Console.WriteLine("Traversing Link: " + currentLink.ID);
                foreach (var node in new INode[] { currentLink.StartNode, currentLink.EndNode })
                {
                    if (visitedNodes.Contains(node))
                    {
                        result.Add(node);
                    }
                    if (node != null && !visitedNodes.Contains(node))
                    {
                        visitedNodes.Add(node);
                        result.Add(node);
                        if (!FindObjs.Contains(node)) FindObjs.Add(node);
                        foreach (var link in node.Links)
                        {
                            if (!visitedNodes.Contains(link.StartNode) || !visitedNodes.Contains(link.EndNode))
                            {
                                if (!FindObjs.Contains(link)) FindObjs.Add(link);
                                queue.Enqueue(link);
                                result.Add(link);
                            }
                        }
                    }
                }
            }
            return result;
        }
    }
}