递归构成树2.0版

将互相连接的管道构成树
在这里插入图片描述
主函数
//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; }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值