SystemGraphUtil.cs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. /*-------------------------------------------------------------------------
  2. * 功能描述:SystemGraphUtil
  3. * 作者:xulisong
  4. * 创建时间: 2019/2/14 10:28:28
  5. * 版本号:v1.0
  6. * -------------------------------------------------------------------------*/
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Linq;
  10. using Autodesk.Revit.DB;
  11. using SAGA.RevitUtils;
  12. using SAGA.RevitUtils.Data.Graph;
  13. using SAGA.RevitUtils.MEP;
  14. namespace SAGA.GplotRelationComputerManage
  15. {
  16. /// <summary>
  17. /// 系统图使用单元
  18. /// </summary>
  19. public static class SystemGraphUtil
  20. {
  21. /// <summary>
  22. /// 根据起点创建系统图
  23. /// </summary>
  24. /// <param name="startElement"></param>
  25. /// <param name="ignoredConnector">忽略的Connector</param>
  26. /// <param name="ignoredElement">忽略的Connector</param>
  27. /// <param name="breakCondition">当connector数量不满足,却又想识别成节点的元素控制</param>
  28. /// <returns></returns>
  29. public static SystemGraph CreateGraph(Element startElement,Predicate<Connector> ignoredConnector, Predicate<Element> ignoredElement,Predicate<Element> breakCondition)
  30. {
  31. SystemGraph graph = new SystemGraph();
  32. Queue<JoinElement> joinElements = new Queue<JoinElement>();
  33. joinElements.Enqueue(CreateJoinElement(startElement, ignoredConnector, new List<int>()));
  34. while (joinElements.Any())
  35. {
  36. var current = joinElements.Peek();
  37. var joinItem = current.MoveNext();
  38. if (joinItem == null)
  39. {
  40. joinElements.Dequeue();
  41. continue;
  42. }
  43. var pathElements = joinItem.BaseElement.GetPathElements(joinItem.BaseConnector, ignoredElement, breakCondition);
  44. if (pathElements.Count < 2)
  45. {
  46. continue;
  47. }
  48. #region 添加边
  49. var start = pathElements[0];
  50. var end = pathElements[pathElements.Count - 1];
  51. var startVertex = graph.AddVertex(new SystemData(start));
  52. var endVertex = graph.AddVertex(new SystemData(end));
  53. var edge = new SystemEdge(new SystemData(pathElements.GetRange(1, pathElements.Count - 2)));
  54. edge.StartVertex = startVertex.Id;
  55. edge.EndVertex = endVertex.Id;
  56. edge = graph.AddEdge(edge);
  57. #endregion
  58. #region 延伸遍历项
  59. var existJoinElement = joinElements.FirstOrDefault(j => j.Element.Id == end.Id);
  60. if (existJoinElement == null)
  61. {
  62. existJoinElement = CreateJoinElement(end, ignoredConnector, new List<int>(){ });
  63. joinElements.Enqueue(existJoinElement);
  64. }
  65. existJoinElement.UsedRefIds.Add(pathElements[pathElements.Count - 2].Id.IntegerValue);
  66. #endregion
  67. }
  68. return graph;
  69. }
  70. #region 辅助类构建
  71. public static JoinElement CreateJoinElement(Element element, Predicate<Connector> ignoredConnector, List<int> usedIds)
  72. {
  73. var joinItems = GetJoinItems(element, ignoredConnector, usedIds);
  74. JoinElement joinElement = new JoinElement(element, joinItems);
  75. return joinElement;
  76. }
  77. public static List<JoinItem> GetJoinItems(Element element, Predicate<Connector> ignoredConnector, List<int> usedIds)
  78. {
  79. List<JoinItem> joinItems = new List<JoinItem>();
  80. var connectors = element.GetAllConnectors();
  81. foreach (var connector in connectors)
  82. {
  83. if (ignoredConnector(connector))
  84. continue;
  85. if (connector.IsConnected)
  86. {
  87. foreach (Connector refConnector in connector.AllRefs)
  88. {
  89. if (refConnector.IsLogical() || refConnector.Owner.Id == element.Id || usedIds.Any(id => refConnector.Owner.Id.IntegerValue == id))
  90. continue;
  91. if (ignoredConnector(refConnector))
  92. continue;
  93. joinItems.Add(new JoinItem(connector, refConnector));
  94. }
  95. }
  96. }
  97. return joinItems;
  98. }
  99. #endregion
  100. }
  101. }