| | |
| | | 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; |
| | | |
| | | |
| | | } |
| | | |
| | | |
| | | } |
| | | } |