将互相连接的管道构成树
主函数
//worksetElemsfounds是图中所有的管道
var treeList = new List<ElementTree>();
while (worksetElemsfounds.Count != 0) {
var copy = worksetElemsfounds.ToArray().ToList();
var tree = new ElementTree(copy,copy[0]);
tree.Construct();
foreach (var item in tree.UsedElements) {
if (worksetElemsfounds.Contains(item)) {
worksetElemsfounds.Remove(item);
}
}
treeList.Add(tree);
}
节点类 和树类 以及添加子节点的方法
class ElementTree
{
public ElementTree(List<Element> elements, Element startElement)
{
TreeElements = elements;
StartNode = new ElementNode() { Parent = null, Elem = startElement, Childrens = new List<ElementNode>() };
UsedElements = new List<Element>();
UsedElements.Add(startElement);
breakElems = new List<Element>();
UnconnectedElems = new List<Element>();
}
public List<Element> TreeElements { get; set; }
public List<Element> UsedElements { get; set; }
public ElementNode StartNode { get; set; }
public List<Element> UnconnectedElems { get; set; }
public List<Element> breakElems { get; set; }
//无参构建
public void Construct()
{
AppendChildren(StartNode);
foreach (var node in StartNode.Childrens) {
Construct(node);
}
}
//有参构建(被递归调用)
public void Construct(ElementNode node) {
AppendChildren(node);
foreach (var node1 in node.Childrens) {
Construct(node1);
}
}
//添加子节点
public void AppendChildren(ElementNode node)
{
var copy = TreeElements.ToArray().ToList();
foreach (var item in UsedElements)
{
if (copy.Contains(item))
{
copy.Remove(item);
}
}
var connectors = node.Elem.GetConnectors();
if (connectors == null)
{
UnconnectedElems.Add(node.Elem);
UsedElements.Add(node.Elem);
}
else {
foreach(Connector conn in connectors) {
if (!conn.IsConnected) {
continue;
}
var connectedconn=GetConnectedConnector(conn);
var conncectedElem = copy.Find(x => x.Id.IntegerValue == connectedconn.Owner.Id.IntegerValue);
if (conncectedElem!=null&&conncectedElem.GetString("是否间断点")!=string.Empty) {
if (conncectedElem.GetString("是否间断点") == "是") {
breakElems.Add(conncectedElem);
UsedElements.Add(conncectedElem);
}
if (conncectedElem.GetString("是否间断点") == "否")
{
node.Childrens.Add(new ElementNode() { Parent = node, Elem = conncectedElem, Childrens = new List<ElementNode>() });
UsedElements.Add(conncectedElem);
}
}
}
}
}
//获得相连接的连接器
private Connector GetConnectedConnector(Connector connector)
{
Connector connectedConnector = null;
var allRefs = connector.AllRefs;
foreach (Connector conn in allRefs)
{
// 相关连接件的图元是同一个 conn.ConnectorType != ConnectorType.End ||
if (conn.ConnectorType != ConnectorType.End
|| conn.Owner.Id.IntegerValue.Equals(connector.Owner.Id.IntegerValue))
{
continue;
}
connectedConnector = conn;
break;
}
return connectedConnector;
}
}
class ElementNode
{
public ElementNode Parent { get; set; }
public Element Elem { get; set; }
public List<ElementNode> Childrens { get; set; }
}