|
@@ -35,41 +35,47 @@ namespace SAGA.GplotRelationComputerManage
|
|
/// </summary>
|
|
/// </summary>
|
|
/// <param name="startElement"></param>
|
|
/// <param name="startElement"></param>
|
|
/// <param name="startConnector"></param>
|
|
/// <param name="startConnector"></param>
|
|
- /// <param name="predicateEnd"></param>
|
|
|
|
|
|
+ /// <param name="predicateEnd">遍历节点满足条件,则不再往下遍历,但使用当前对象</param>
|
|
/// <returns></returns>
|
|
/// <returns></returns>
|
|
public static ElementTreeNode CreateTreeNode(Element startElement, Connector startConnector,
|
|
public static ElementTreeNode CreateTreeNode(Element startElement, Connector startConnector,
|
|
Predicate<Element> predicateEnd)
|
|
Predicate<Element> predicateEnd)
|
|
{
|
|
{
|
|
|
|
+ HashSet<int> handled = new HashSet<int>();
|
|
ElementTreeNode node = new ElementTreeNode();
|
|
ElementTreeNode node = new ElementTreeNode();
|
|
node.Current = startElement;
|
|
node.Current = startElement;
|
|
- List<ElementTreeNode> reference = new List<ElementTreeNode>();
|
|
|
|
- reference.Add(node);
|
|
|
|
- for (int i = 0; i < reference.Count; i++)
|
|
|
|
|
|
+ Queue<ElementTreeNode> queue = new Queue<ElementTreeNode>();
|
|
|
|
+ queue.Enqueue(node);
|
|
|
|
+ handled.Add(startElement.Id.IntegerValue);
|
|
|
|
+ bool isStart = true;
|
|
|
|
+ while (queue.Count != 0)
|
|
{
|
|
{
|
|
- var baseNode = reference[i];
|
|
|
|
|
|
+ var baseNode = queue.Dequeue();
|
|
List<Connector> connectors;
|
|
List<Connector> connectors;
|
|
- if (i == 0 && startConnector != null)
|
|
|
|
|
|
+ if (isStart && startConnector != null)
|
|
{
|
|
{
|
|
- connectors = new List<Connector> { startConnector };
|
|
|
|
|
|
+ connectors = new List<Connector> { startConnector };
|
|
}
|
|
}
|
|
else
|
|
else
|
|
{
|
|
{
|
|
connectors = baseNode.Current.GetAllConnectors().ToList();
|
|
connectors = baseNode.Current.GetAllConnectors().ToList();
|
|
}
|
|
}
|
|
|
|
+ if (isStart)
|
|
|
|
+ {
|
|
|
|
+ isStart = false;
|
|
|
|
+ }
|
|
foreach (var connector in connectors)
|
|
foreach (var connector in connectors)
|
|
{
|
|
{
|
|
if (connector.Searchable())
|
|
if (connector.Searchable())
|
|
{
|
|
{
|
|
- var refConnectors = connector.GetReferenceConnectors()
|
|
|
|
- .Where(c => ConnectorType.Physical.HasFlag(c.ConnectorType)).ToList();
|
|
|
|
|
|
+ var refConnectors = connector.GetPhysicalConnectors();
|
|
foreach (var refConnector in refConnectors)
|
|
foreach (var refConnector in refConnectors)
|
|
{
|
|
{
|
|
var refElement = refConnector.Owner;
|
|
var refElement = refConnector.Owner;
|
|
- if (reference.Reverse<ElementTreeNode>().Any(e => e.Current.Id.IntegerValue == refElement.Id.IntegerValue))
|
|
|
|
|
|
+ if (handled.Contains(refElement.Id.IntegerValue))
|
|
{
|
|
{
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+ handled.Add(refElement.Id.IntegerValue);
|
|
ElementTreeNode refNode = new ElementTreeNode();
|
|
ElementTreeNode refNode = new ElementTreeNode();
|
|
refNode.Current = refElement;
|
|
refNode.Current = refElement;
|
|
refNode.StartLocation = refConnector.Origin;
|
|
refNode.StartLocation = refConnector.Origin;
|
|
@@ -78,14 +84,11 @@ namespace SAGA.GplotRelationComputerManage
|
|
{
|
|
{
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
- //if (reference.All(e => e.Current.Id.IntegerValue != refElement.Id.IntegerValue))
|
|
|
|
- //{
|
|
|
|
- reference.Add(refNode);
|
|
|
|
- //}
|
|
|
|
|
|
+ queue.Enqueue(refNode);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- }
|
|
|
|
|
|
+ }
|
|
return node;
|
|
return node;
|
|
}
|
|
}
|
|
#endregion
|
|
#endregion
|
|
@@ -97,9 +100,9 @@ namespace SAGA.GplotRelationComputerManage
|
|
/// <param name="domain"></param>
|
|
/// <param name="domain"></param>
|
|
/// <param name="endConditon">遍历中断条件,遇到指定条件的管道则停止遍历</param>
|
|
/// <param name="endConditon">遍历中断条件,遇到指定条件的管道则停止遍历</param>
|
|
/// <returns>树形节点中包好的Id信息</returns>
|
|
/// <returns>树形节点中包好的Id信息</returns>
|
|
- public static List<int> BuildSystemNode(ElementTreeNode etn, Domain domain, Func<MEPCurve, bool> endConditon)
|
|
|
|
|
|
+ public static HashSet<int> BuildSystemNode(ElementTreeNode etn, Domain domain, Func<MEPCurve, bool> endConditon)
|
|
{
|
|
{
|
|
- List<int> useIds = new List<int>();
|
|
|
|
|
|
+ HashSet<int> useIds = new HashSet<int>();
|
|
etn.GetAllNodes().ForEach(n =>
|
|
etn.GetAllNodes().ForEach(n =>
|
|
{
|
|
{
|
|
if (!n.IsLeaf&&n.Current != null)
|
|
if (!n.IsLeaf&&n.Current != null)
|
|
@@ -114,7 +117,7 @@ namespace SAGA.GplotRelationComputerManage
|
|
}
|
|
}
|
|
return useIds;
|
|
return useIds;
|
|
}
|
|
}
|
|
- private static void BuildSystemNode(ElementTreeNode etn, Domain domain, List<int> useIds, Func<MEPCurve, bool> endConditon)
|
|
|
|
|
|
+ private static void BuildSystemNode(ElementTreeNode etn, Domain domain, HashSet<int> useIds, Func<MEPCurve, bool> endConditon)
|
|
{
|
|
{
|
|
var useElement = etn.Current;
|
|
var useElement = etn.Current;
|
|
#region 预判退出
|
|
#region 预判退出
|
|
@@ -122,28 +125,21 @@ namespace SAGA.GplotRelationComputerManage
|
|
{
|
|
{
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
- if (useIds.Any(id => id == useElement.Id.IntegerValue))
|
|
|
|
|
|
+ if (useIds.Contains(useElement.Id.IntegerValue))
|
|
{
|
|
{
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
#endregion
|
|
#endregion
|
|
-
|
|
|
|
useIds.Add(useElement.Id.IntegerValue);
|
|
useIds.Add(useElement.Id.IntegerValue);
|
|
var connectors = useElement.GetConnectors(domain);
|
|
var connectors = useElement.GetConnectors(domain);
|
|
foreach (var baseConnector in connectors)
|
|
foreach (var baseConnector in connectors)
|
|
{
|
|
{
|
|
if (!baseConnector.Searchable())
|
|
if (!baseConnector.Searchable())
|
|
continue;
|
|
continue;
|
|
- var refConnectors = baseConnector.GetReferenceConnectors()
|
|
|
|
- .Where(c => ConnectorType.Physical.HasFlag(c.ConnectorType)).ToList();
|
|
|
|
|
|
+ var refConnectors = baseConnector.GetPhysicalConnectors();
|
|
foreach (var refConnector in refConnectors)
|
|
foreach (var refConnector in refConnectors)
|
|
{
|
|
{
|
|
- var refElement = refConnector.Owner;
|
|
|
|
- //逻辑变更,如果存在,不继续遍历。但要完成本次操作;移动到最后
|
|
|
|
- //if (useIds.Any(id => id == refElement.Id.IntegerValue))
|
|
|
|
- //{
|
|
|
|
- // continue;
|
|
|
|
- //}
|
|
|
|
|
|
+ var refElement = refConnector.Owner;
|
|
//初始化当前节点,未必一定加入集合,为了下面代码书写方便,先进性初始化
|
|
//初始化当前节点,未必一定加入集合,为了下面代码书写方便,先进性初始化
|
|
ElementTreeNode currentNode = new ElementTreeNode()
|
|
ElementTreeNode currentNode = new ElementTreeNode()
|
|
{
|
|
{
|
|
@@ -153,7 +149,6 @@ namespace SAGA.GplotRelationComputerManage
|
|
if (refElement is MEPCurve mepCurve)
|
|
if (refElement is MEPCurve mepCurve)
|
|
{
|
|
{
|
|
//优先判定系统,再进行立管相关逻辑的处理;如果系统不兼容则直接退出遍历
|
|
//优先判定系统,再进行立管相关逻辑的处理;如果系统不兼容则直接退出遍历
|
|
- //var systemName=mepCurve.GetSystemTypeName();
|
|
|
|
if (endConditon != null && endConditon(mepCurve))
|
|
if (endConditon != null && endConditon(mepCurve))
|
|
{
|
|
{
|
|
continue;
|
|
continue;
|
|
@@ -178,7 +173,7 @@ namespace SAGA.GplotRelationComputerManage
|
|
}
|
|
}
|
|
}
|
|
}
|
|
//useIds的控制:跳出时,直接加入UseIds。继续遍历的,在遍历函数中加入
|
|
//useIds的控制:跳出时,直接加入UseIds。继续遍历的,在遍历函数中加入
|
|
- if (useIds.Any(id => id == refElement.Id.IntegerValue))
|
|
|
|
|
|
+ if (useIds.Contains(refElement.Id.IntegerValue))
|
|
{
|
|
{
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|