ElementTreeNodeParse.cs 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. 
  2. /* ==============================================================================
  3. * 功能描述:ElementTreeNode的扩展方法
  4. * 创 建 者:SAGACLOUD
  5. * 创建日期:2017/9/17
  6. * ==============================================================================*/
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Text.RegularExpressions;
  10. using System.Xml;
  11. using Autodesk.Revit.DB;
  12. using SAGA.RevitUtils.Extends;
  13. namespace SAGA.RevitUtils.MEP
  14. {
  15. public static class ElementTreeNodeParse
  16. {
  17. /// <summary>
  18. /// ElementTreeNode转化为ElmentsTreeNode
  19. /// </summary>
  20. /// <param name="treeNode"></param>
  21. /// <returns></returns>
  22. public static ElementsTreeNode CreateElementsTree(this ElementTreeNode treeNode)
  23. {
  24. ElementsTreeNode node = new ElementsTreeNode {
  25. Current = new List<Element>()
  26. };
  27. node.Current.Add(treeNode.Current);
  28. node.StartLocation = treeNode.StartLocation;
  29. ElementTreeNode node2 = treeNode;
  30. while (node2.Nodes.Count == 1)
  31. {
  32. node2 = node2.Nodes[0];
  33. node.Current.Add(node2.Current);
  34. }
  35. if (node2.Nodes.Count > 1)
  36. {
  37. foreach (ElementTreeNode node3 in node2.Nodes)
  38. {
  39. ElementsTreeNode node4 = node3.CreateElementsTree();
  40. node4.Parent = node;
  41. node.AddChild(node4);
  42. }
  43. }
  44. return node;
  45. }
  46. /// <summary>
  47. /// 构建ElementsTreeNode
  48. /// </summary>
  49. /// <param name="element"></param>
  50. /// <param name="endCondition">结束条件</param>
  51. /// <param name="connector"></param>
  52. /// <returns></returns>
  53. public static ElementsTreeNode CreateElementsTree(this Element element, Func<Element, bool> endCondition, Connector connector = null)
  54. {
  55. ElementTreeNode treeNode = new ElementTreeNode {
  56. Current = element
  57. };
  58. List<int> handleredIds = new List<int> {
  59. element.Id.IntegerValue
  60. };
  61. treeNode.CreateElementTree(endCondition, handleredIds, connector);
  62. return treeNode.CreateElementsTree();
  63. }
  64. /// <summary>
  65. /// 截取树上的一段
  66. /// </summary>
  67. /// <param name="oriTreeNode"></param>
  68. /// <param name="endCondition"></param>
  69. /// <returns></returns>
  70. public static ElementTreeNode CreateElementTree(this ElementTreeNode oriTreeNode, Func<Element, bool> endCondition)
  71. {
  72. ElementTreeNode node = new ElementTreeNode {
  73. Current = oriTreeNode.Current,
  74. StartLocation = oriTreeNode.StartLocation,
  75. Parent = oriTreeNode.Parent,
  76. Tag = oriTreeNode.Tag
  77. };
  78. if (endCondition == null)
  79. {
  80. return node;
  81. }
  82. Element current = oriTreeNode.Current;
  83. if (endCondition.Invoke(current))
  84. {
  85. return node;
  86. }
  87. ElementTreeNode node2 = null;
  88. foreach (ElementTreeNode node3 in oriTreeNode.Nodes)
  89. {
  90. ElementTreeNode item = node3.CreateElementTree(endCondition);
  91. if (item != null)
  92. {
  93. if (node2 == null)
  94. {
  95. node2 = node;
  96. }
  97. item.Parent = node;
  98. node.Nodes.Add(item);
  99. }
  100. }
  101. return node2;
  102. }
  103. /// <summary>
  104. /// 构建ElementTreeNode
  105. /// </summary>
  106. /// <param name="element"></param>
  107. /// <param name="endCondition"></param>
  108. /// <param name="connector">指定的Connector</param>
  109. /// <param name="domain"></param>
  110. /// <returns></returns>
  111. public static ElementTreeNode CreateElementTree(this Element element, Func<Element, bool> endCondition, Connector connector = null,Domain domain=Domain.DomainPiping)
  112. {
  113. ElementTreeNode treeNode = new ElementTreeNode {
  114. Current = element
  115. };
  116. List<int> handleredIds = new List<int> {
  117. element.Id.IntegerValue
  118. };
  119. if (connector != null)
  120. domain = connector.Domain;
  121. treeNode.CreateElementTree(endCondition, handleredIds, connector, domain);
  122. return treeNode;
  123. }
  124. public static ElementTreeNode CreateElementTree(this ElementTreeNode treeNode, Func<Element, bool> endCondition, List<int> handleredIds, Connector baseConnector = null, Domain domain = Domain.DomainPiping)
  125. {
  126. Element current = treeNode.Current;
  127. ElementTreeNode node = null;
  128. if (endCondition != null)
  129. {
  130. if (endCondition.Invoke(current))
  131. {
  132. return treeNode;
  133. }
  134. }
  135. else
  136. {
  137. node = treeNode;
  138. }
  139. List<Connector> list = (baseConnector == null) ? treeNode.Current.GetConnectors(domain) : new List<Connector> { baseConnector };
  140. foreach (Connector connector in list)
  141. {
  142. if ((connector.ConnectorType != ConnectorType.Logical) && connector.IsConnected)
  143. {
  144. foreach (Connector connector2 in connector.GetReferenceConnectors())
  145. {
  146. Element owner = connector2.Owner;
  147. if (!handleredIds.Contains(owner.Id.IntegerValue))//找到特殊阀门停止
  148. {
  149. handleredIds.Add(owner.Id.IntegerValue);
  150. ElementTreeNode node2 = new ElementTreeNode {
  151. Parent = treeNode,
  152. Current = owner
  153. };
  154. if (connector2.ConnectorType != ConnectorType.Logical)
  155. {
  156. node2.StartLocation = connector2.Origin;
  157. }
  158. ElementTreeNode item = node2.CreateElementTree(endCondition, handleredIds, null,domain);
  159. if (item != null)
  160. {
  161. node = treeNode;
  162. treeNode.Nodes.Add(item);
  163. }
  164. }
  165. }
  166. }
  167. }
  168. return node;
  169. }
  170. /// <summary>
  171. /// 获取Tree上所有的Element
  172. /// </summary>
  173. /// <param name="node"></param>
  174. /// <returns></returns>
  175. public static List<Element> FindAllElements(this ElementTreeNode node)
  176. {
  177. List<ElementTreeNode> list = new List<ElementTreeNode> {
  178. node
  179. };
  180. List<Element> list2 = new List<Element>();
  181. for (int i = 0; i < list.Count; i++)
  182. {
  183. ElementTreeNode node2 = list[i];
  184. if (node2.Current != null)
  185. {
  186. list2.Add(node2.Current);
  187. }
  188. list.AddRange(node2.Nodes);
  189. }
  190. return list2;
  191. }
  192. }
  193. }