123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201 |
-
- /* ==============================================================================
- * 功能描述:ElementTreeNode的扩展方法
- * 创 建 者:SAGACLOUD
- * 创建日期:2017/9/17
- * ==============================================================================*/
- using System;
- using System.Collections.Generic;
- using System.Text.RegularExpressions;
- using System.Xml;
- using Autodesk.Revit.DB;
- using SAGA.RevitUtils.Extends;
- namespace SAGA.RevitUtils.MEP
- {
- public static class ElementTreeNodeParse
- {
- /// <summary>
- /// ElementTreeNode转化为ElmentsTreeNode
- /// </summary>
- /// <param name="treeNode"></param>
- /// <returns></returns>
- public static ElementsTreeNode CreateElementsTree(this ElementTreeNode treeNode)
- {
- ElementsTreeNode node = new ElementsTreeNode {
- Current = new List<Element>()
- };
- node.Current.Add(treeNode.Current);
- node.StartLocation = treeNode.StartLocation;
- ElementTreeNode node2 = treeNode;
- while (node2.Nodes.Count == 1)
- {
- node2 = node2.Nodes[0];
- node.Current.Add(node2.Current);
- }
- if (node2.Nodes.Count > 1)
- {
- foreach (ElementTreeNode node3 in node2.Nodes)
- {
- ElementsTreeNode node4 = node3.CreateElementsTree();
- node4.Parent = node;
- node.AddChild(node4);
- }
- }
- return node;
- }
- /// <summary>
- /// 构建ElementsTreeNode
- /// </summary>
- /// <param name="element"></param>
- /// <param name="endCondition">结束条件</param>
- /// <param name="connector"></param>
- /// <returns></returns>
- public static ElementsTreeNode CreateElementsTree(this Element element, Func<Element, bool> endCondition, Connector connector = null)
- {
- ElementTreeNode treeNode = new ElementTreeNode {
- Current = element
- };
- List<int> handleredIds = new List<int> {
- element.Id.IntegerValue
- };
- treeNode.CreateElementTree(endCondition, handleredIds, connector);
- return treeNode.CreateElementsTree();
- }
- /// <summary>
- /// 截取树上的一段
- /// </summary>
- /// <param name="oriTreeNode"></param>
- /// <param name="endCondition"></param>
- /// <returns></returns>
- public static ElementTreeNode CreateElementTree(this ElementTreeNode oriTreeNode, Func<Element, bool> endCondition)
- {
- ElementTreeNode node = new ElementTreeNode {
- Current = oriTreeNode.Current,
- StartLocation = oriTreeNode.StartLocation,
- Parent = oriTreeNode.Parent,
- Tag = oriTreeNode.Tag
- };
- if (endCondition == null)
- {
- return node;
- }
- Element current = oriTreeNode.Current;
- if (endCondition.Invoke(current))
- {
- return node;
- }
- ElementTreeNode node2 = null;
- foreach (ElementTreeNode node3 in oriTreeNode.Nodes)
- {
- ElementTreeNode item = node3.CreateElementTree(endCondition);
- if (item != null)
- {
- if (node2 == null)
- {
- node2 = node;
- }
- item.Parent = node;
- node.Nodes.Add(item);
- }
- }
- return node2;
- }
- /// <summary>
- /// 构建ElementTreeNode
- /// </summary>
- /// <param name="element"></param>
- /// <param name="endCondition"></param>
- /// <param name="connector">指定的Connector</param>
- /// <param name="domain"></param>
- /// <returns></returns>
- public static ElementTreeNode CreateElementTree(this Element element, Func<Element, bool> endCondition, Connector connector = null,Domain domain=Domain.DomainPiping)
- {
- ElementTreeNode treeNode = new ElementTreeNode {
- Current = element
- };
- List<int> handleredIds = new List<int> {
- element.Id.IntegerValue
- };
- if (connector != null)
- domain = connector.Domain;
- treeNode.CreateElementTree(endCondition, handleredIds, connector, domain);
- return treeNode;
- }
- public static ElementTreeNode CreateElementTree(this ElementTreeNode treeNode, Func<Element, bool> endCondition, List<int> handleredIds, Connector baseConnector = null, Domain domain = Domain.DomainPiping)
- {
- Element current = treeNode.Current;
- ElementTreeNode node = null;
- if (endCondition != null)
- {
- if (endCondition.Invoke(current))
- {
- return treeNode;
- }
- }
- else
- {
- node = treeNode;
- }
- List<Connector> list = (baseConnector == null) ? treeNode.Current.GetConnectors(domain) : new List<Connector> { baseConnector };
- foreach (Connector connector in list)
- {
- if ((connector.ConnectorType != ConnectorType.Logical) && connector.IsConnected)
- {
- foreach (Connector connector2 in connector.GetReferenceConnectors())
- {
- Element owner = connector2.Owner;
- if (!handleredIds.Contains(owner.Id.IntegerValue))//找到特殊阀门停止
- {
- handleredIds.Add(owner.Id.IntegerValue);
- ElementTreeNode node2 = new ElementTreeNode {
- Parent = treeNode,
- Current = owner
- };
- if (connector2.ConnectorType != ConnectorType.Logical)
- {
- node2.StartLocation = connector2.Origin;
- }
- ElementTreeNode item = node2.CreateElementTree(endCondition, handleredIds, null,domain);
- if (item != null)
- {
- node = treeNode;
- treeNode.Nodes.Add(item);
- }
- }
- }
- }
- }
- return node;
- }
- /// <summary>
- /// 获取Tree上所有的Element
- /// </summary>
- /// <param name="node"></param>
- /// <returns></returns>
- public static List<Element> FindAllElements(this ElementTreeNode node)
- {
- List<ElementTreeNode> list = new List<ElementTreeNode> {
- node
- };
- List<Element> list2 = new List<Element>();
- for (int i = 0; i < list.Count; i++)
- {
- ElementTreeNode node2 = list[i];
- if (node2.Current != null)
- {
- list2.Add(node2.Current);
- }
- list.AddRange(node2.Nodes);
- }
- return list2;
- }
-
- }
- }
|