SystemGraphUtil.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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="breakCondition">当connector数量不满足,却又想识别成节点的元素控制</param>
  27. /// <returns></returns>
  28. public static SystemGraph CreateGraph(Element startElement,Predicate<Connector> ignoredConnector, Predicate<Element> breakCondition)
  29. {
  30. SystemGraph graph = new SystemGraph();
  31. Queue<JoinElement> joinElements = new Queue<JoinElement>();
  32. joinElements.Enqueue(CreateJoinElement(startElement, ignoredConnector, new List<int>()));
  33. while (joinElements.Any())
  34. {
  35. var current = joinElements.Peek();
  36. var joinItem = current.MoveNext();
  37. if (joinItem == null)
  38. {
  39. joinElements.Dequeue();
  40. continue;
  41. }
  42. var pathElements = joinItem.BaseElement.GetPathElements(joinItem.BaseConnector, breakCondition);
  43. if (pathElements.Count < 2)
  44. {
  45. continue;
  46. }
  47. #region 添加边
  48. var start = pathElements[0];
  49. var end = pathElements[pathElements.Count - 1];
  50. var startVertex = graph.AddVertex(new SystemData(start));
  51. var endVertex = graph.AddVertex(new SystemData(end));
  52. var edge = graph.AddEdge(new SystemEdge(new SystemData(pathElements.GetRange(1, pathElements.Count - 2))));
  53. edge.StartVertex = startVertex.Id;
  54. edge.EndVertex = endVertex.Id;
  55. edge = graph.AddEdge(edge);
  56. #endregion
  57. #region 延伸遍历项
  58. var existJoinElement = joinElements.FirstOrDefault(j => j.Element.Id == end.Id);
  59. if (existJoinElement == null)
  60. {
  61. existJoinElement = CreateJoinElement(startElement, ignoredConnector, new List<int>(){ });
  62. joinElements.Enqueue(existJoinElement);
  63. }
  64. existJoinElement.UsedRefIds.Add(pathElements[pathElements.Count - 2].Id.IntegerValue);
  65. #endregion
  66. }
  67. return graph;
  68. }
  69. #region 辅助类构建
  70. public static JoinElement CreateJoinElement(Element element, Predicate<Connector> ignoredConnector, List<int> usedIds)
  71. {
  72. var joinItems = GetJoinItems(element, ignoredConnector, usedIds);
  73. JoinElement joinElement = new JoinElement(element, joinItems);
  74. return joinElement;
  75. }
  76. public static List<JoinItem> GetJoinItems(Element element, Predicate<Connector> ignoredConnector, List<int> usedIds)
  77. {
  78. List<JoinItem> joinItems = new List<JoinItem>();
  79. var connectors = element.GetAllConnectors();
  80. foreach (var connector in connectors)
  81. {
  82. if (ignoredConnector(connector))
  83. continue;
  84. if (connector.IsConnected)
  85. {
  86. foreach (Connector refConnector in connector.AllRefs)
  87. {
  88. if (refConnector.IsLogical() || refConnector.Owner.Id == element.Id || usedIds.Any(id => refConnector.Owner.Id.IntegerValue == id))
  89. continue;
  90. if (ignoredConnector(refConnector))
  91. continue;
  92. joinItems.Add(new JoinItem(connector, refConnector));
  93. }
  94. }
  95. }
  96. return joinItems;
  97. }
  98. #endregion
  99. }
  100. }