123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744 |
- using System;
- using System.Collections.Generic;
- using System.Collections.ObjectModel;
- using System.Linq;
- using Autodesk.Revit.DB;
- using SAGA.RevitUtils;
- namespace SAGA.RevitUtils
- {
- /// <summary>
- /// 边集数组的形式存储边的集合
- /// </summary>
- public class ElementEdgesArray
- {
- public ElementEdgesArray()
- {
- m_Vertexes = new List<ElementsVertex>();
- Vertexes = new ReadOnlyCollection<ElementsVertex>(m_Vertexes);
- m_Edges = new List<ElementsEdge>();
- Edges = new ReadOnlyCollection<ElementsEdge>(m_Edges);
- VERelations = new Dictionary<string, List<string>>();
- }
- #region 编号系统
- private int m_CurrentIndex;
- /// <summary>
- /// 生成节点索引
- /// </summary>
- /// <returns></returns>
- private string GenerateVertexIndex()
- {
- return "V" + (++m_CurrentIndex);
- }
- /// <summary>
- /// 生成节点索引
- /// </summary>
- /// <returns></returns>
- private string GenerateEdgeIndex()
- {
- return "E" + (++m_CurrentIndex);
- }
- #endregion
- /// <summary>
- /// 根据条件获当前可用的点
- /// </summary>
- /// <param name="predicate"></param>
- /// <returns></returns>
- public List<ElementsVertex> GetAvailableVertexes(Predicate<ElementsVertex> predicate)
- {
- return Vertexes.Where(v =>
- {
- if (!IsAvailable(v))
- return false;
- if (predicate != null)
- {
- return predicate(v);
- }
- return true;
- }
- ).ToList();
- }
- /// <summary>
- /// 根据条件获取当前可用的边 [为空的话则不做限制]
- /// </summary>
- /// <param name="predicate"></param>
- /// <returns></returns>
- public List<ElementsEdge> GetAvailableEdges(Predicate<ElementsEdge> predicate)
- {
- return Edges.Where(e =>
- {
- if (!IsAvailable(e))
- return false;
- if (predicate != null)
- {
- return predicate(e);
- }
- return true;
- }
- ).ToList();
- }
- /// <summary>
- /// 判断节点是否可用
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="node"></param>
- /// <returns></returns>
- public bool IsAvailable<T>(GraphNode<T> node) where T: GraphNode<T>
- {
- if (node.Parent != null)
- return false;
- return true;
- }
- public ElementsVertex GetVertexById(string eId)
- { return this.Vertexes.FirstOrDefault(c => c.Id == eId); }
- public ElementsEdge GetEdgeById(string eId)
- {
- return this.Edges.FirstOrDefault(c => c.Id == eId);
- }
- #region 点处理
- /*
- * 增加一个点和边的关联关系,便于以后的查找速度
- */
- private Dictionary<string, List<string>> VERelations { get; set; }
- /// <summary>
- /// 增加点与边的关联关系
- /// </summary>
- /// <param name="vId"></param>
- /// <param name="eId"></param>
- private void AddVERelation(string vId, string eId)
- {
- if (!VERelations.TryGetValue(vId, out List<string> list))
- {
- list = new List<string>();
- VERelations.Add(vId,list);
- }
- if (list.Any(c => c == eId))
- return;
- list.Add(eId);
- }
- /// <summary>
- /// 移除点与边的关系
- /// </summary>
- /// <param name="vId"></param>
- /// <param name="eId"></param>
- private void RemoveVERelation(string vId, string eId)
- {
- if (!VERelations.TryGetValue(vId, out List<string> list))
- {
- return;
- }
- list.Remove(eId);
- }
- /// <summary>
- /// 指点边关联的信息
- /// </summary>
- /// <param name="eId"></param>
- private void RemoveERelation( string eId)
- {
- foreach (var relation in VERelations)
- {
- if (relation.Value != null)
- {
- relation.Value.Remove(eId);
- }
- }
- }
- /// <summary>
- /// 移除点关联的所有边的信息
- /// </summary>
- /// <param name="vId"></param>
- private void RemoveVRelation(string vId)
- {
- VERelations.Remove(vId);
- }
- /// <summary>
- /// 获取点与边的关联关系
- /// </summary>
- /// <param name="vId"></param>
- /// <returns></returns>
- private List<string> GetVERelation(string vId)
- {
- VERelations.TryGetValue(vId, out List<string> list);
- return new List<string>(list ?? new List<string>());
- }
- public List<ElementsVertex> m_Vertexes;
- /// <summary>
- /// 点的集合信息
- /// </summary>
- public ReadOnlyCollection<ElementsVertex> Vertexes { get; private set; }
- /// <summary>
- /// 增加节点
- /// </summary>
- /// <param name="vertex"></param>
- /// <returns></returns>
- public ElementsVertex AddVertex(ElementsVertex vertex)
- {
- if (vertex == null)
- return vertex;
- //这里是否要自主合并,如果出现兼容点直接进行合并
- var existVertexes = this.GetAvailableVertexes(v =>(!string.IsNullOrEmpty(vertex.Id)&&v.Id==vertex.Id)|| v.IsMatch(vertex)).ToList();
- if (!existVertexes.Any())
- {
- m_Vertexes.Add((vertex));
- //点名称赋值
- vertex.Id = GenerateVertexIndex();
- }
- else if (existVertexes.Count == 1)
- {
- var exist = existVertexes[0];
- exist.ExtendRefElements(vertex);
- return exist;
- }
- else
- {
- //将多关联的信息维护到点中【原始边中的点】
- var newVertex= CombineVertex(existVertexes,vertex.RefData.ToList());
- return newVertex;
- }
- return vertex;
- }
- #endregion
- #region 删除节点
- /*
- * 删除节点右两种操作
- * 1、删除节点,把连带的边也删掉
- * 2、删除节点,将连带的边删除掉,给指点的点创建新边。
- * 新包含删除的的节点为边集合信息
- */
- /// <summary>
- /// 删除指定Id的节点
- /// </summary>
- /// <param name="id"></param>
- public void DeleteVertex(string id)
- {
- List<string> edgeIds = GetVERelation(id);
- RemoveVRelation(id);
- edgeIds.ForEach(e => {
- RemoveERelation(e);
- this.m_Edges.RemoveAll(ie=>ie.Id==e);
- });
- }
- /// <summary>
- /// 删除指定Id的节点,并把该节点关联的点直连成新的边
- /// </summary>
- /// <param name="id"></param>
- /// <param name="predicate">重新连接的点</param>
- public void DeleteVertex(string id,Predicate<string> predicate)
- {
- List<string> edgeIds = GetVERelation(id);
- var baseVertex = GetVertexById(id);
- if (baseVertex == null)
- return;
- List<Tuple<ElementsVertex, ElementsEdge>> tupleList = new List<Tuple<ElementsVertex, ElementsEdge>>();
- foreach (var edgeId in edgeIds)
- {
- var elementEdge = GetEdgeById(edgeId);
- if (elementEdge == null)
- continue;
- var otherVertex = elementEdge.GetAnotherVertex(id);
- if (otherVertex == null)
- continue;
- if (predicate != null && !predicate(otherVertex.Id))
- continue;
- tupleList.Add(new Tuple<ElementsVertex, ElementsEdge>(otherVertex, elementEdge));
- }
- for (int i = 0; i < tupleList.Count; i++)
- {
- var start = tupleList[i].Item1;
- var startElements = tupleList[i].Item2.RefData.ToList();
- for (int j = i+1; j < tupleList.Count; j++)
- {
- var end = tupleList[j].Item1;
- var endElements = tupleList[j].Item2.RefData.ToList();
- var newPathElments = new List<Element>(startElements);
- newPathElments.AddRange(baseVertex.RefData);
- newPathElments.AddRange(endElements);
- this.AddEdge(new ElementsEdge(newPathElments) { Start = start, End = end });
- }
- }
- DeleteVertex(id);
- }
- #endregion
- #region 合并点
- #endregion
- #region 边处理
- private List<ElementsEdge> m_Edges;
- /// <summary>
- /// 边的集合信息
- /// </summary>
- public ReadOnlyCollection<ElementsEdge> Edges { get; private set; }
- /// <summary>
- /// 增加边信息
- /// </summary>
- /// <param name="edge"></param>
- /// <returns></returns>
- public void AddEdge(ElementsEdge edge)
- {
- if (edge?.Start == null || edge.End==null)
- throw new ArgumentNullException(nameof(edge)+"及其关联开始结束点信息不能为null");
- edge.Id = GenerateEdgeIndex();
- edge.Start = AddVertex(edge.Start);
- edge.End = AddVertex(edge.End);
- AddVERelation(edge.Start.Id, edge.Id);
- AddVERelation(edge.End.Id, edge.Id);
- this.m_Edges.Add(edge);
- }
-
- #endregion
- private ElementsVertex CombineVertex(List<ElementsVertex> vertexs,List<Element> elements)
- {
- var refElements = vertexs.SelectMany(c => c.RefData).ToList();
- if (elements != null)
- {
- refElements.AddRange(elements);
- }
- refElements= refElements.Distinct(new ElementEqualityComparer()).ToList();
- ElementsVertex combineVertex = new ElementsVertex(refElements);
- this.m_Vertexes.Add(combineVertex);
- combineVertex.Id = GenerateVertexIndex();
- combineVertex.Children.AddRange(vertexs);
- foreach (var elementsVertex in vertexs)
- {
- var list = GetVERelation(elementsVertex.Id);
- list.ForEach(eid=>AddVERelation(combineVertex.Id,eid));
- }
- return combineVertex;
- }
- #region 点关联信息
- /// <summary>
- /// 获取点的连接关系
- /// </summary>
- /// <param name="baseVertex"></param>
- /// <param name="preVertexes"></param>
- /// <returns></returns>
- public List<Tuple<ElementsVertex, ElementsEdge>> GetNextVertexes(ElementsVertex baseVertex,
- List<ElementsVertex> preVertexes)
- {
- List<Tuple<ElementsVertex, ElementsEdge>> tuples=new List<Tuple<ElementsVertex, ElementsEdge>>();
- string baseVertexId = baseVertex.Id;
- var listEdges = GetVERelation(baseVertexId);
- var edges = this.GetAvailableEdges(e => listEdges.Any(id => id == e.Id));
- foreach (var edge in edges)
- {
- ElementsVertex useVertex = null;
- if (edge.RealStart.Id == baseVertexId)
- {
- useVertex = edge.RealEnd;
- }
- else if (edge.RealEnd.Id == baseVertexId)
- {
- useVertex = edge.RealStart;
- }
- if (useVertex == null || preVertexes.Any(v => v.Id == useVertex.Id))
- continue;
- tuples.Add(new Tuple<ElementsVertex, ElementsEdge>(useVertex,edge));
- }
- return tuples;
- }
- /// <summary>
- /// 获取与点关联的点
- /// </summary>
- /// <param name="baseVertex"></param>
- /// <param name="predicate"></param>
- /// <returns></returns>
- public List<ElementsVertex> GetRefVertexes(ElementsVertex baseVertex,
- Predicate<ElementsVertex> predicate)
- {
- //如果判断方向的话,在这里加一些标志,遍历过程中,和返回
- List<ElementsVertex> vertexes = new List<ElementsVertex>();
- List<ElementsVertex> opVertexes = new List<ElementsVertex>() { baseVertex };
- for (int i = 0; i < opVertexes.Count; i++)
- {
- var currentVertex = opVertexes[i];
- string baseVertexId = currentVertex.Id;
- var listEdges = GetVERelation(baseVertexId);
- var edges = this.Edges.Where(e => e.Children.Count==0&&listEdges.Any(id => id == e.Id));
- foreach (var edge in edges)
- {
- ElementsVertex useVertex = null;
- if (edge.RealStart.Id == baseVertexId)
- {
- useVertex = edge.RealEnd;
- }
- else if (edge.RealEnd.Id == baseVertexId)
- {
- useVertex = edge.RealStart;
- }
- if (useVertex == null)
- continue;
- if (vertexes.Any(v => v.Id == useVertex.Id) || opVertexes.Any(v => v.Id == useVertex.Id))
- continue;
- if (predicate == null || predicate(useVertex))
- {
- vertexes.Add(useVertex);
- }
- else
- {
- opVertexes.Add(useVertex);
- }
- }
- }
-
- return vertexes;
- }
- /// <summary>
- /// 获取到指定点的路径信息
- /// </summary>
- /// <param name="baseVertex"></param>
- /// <param name="predicate"></param>
- /// <returns></returns>
- public List<Tuple<ElementsVertex, List<ElementsVertex>>> GetRefVertexPaths(ElementsVertex baseVertex,
- Predicate<ElementsVertex> predicate)
- {
- List<Tuple<ElementsVertex, List<ElementsVertex>>> paths = new List<Tuple<ElementsVertex, List<ElementsVertex>>>();
- paths = GetRefVertexPaths(baseVertex, predicate, new List<ElementsVertex>());
- return paths;
- }
- private List<Tuple<ElementsVertex, List<ElementsVertex>>> GetRefVertexPaths(ElementsVertex baseVertex, Predicate<ElementsVertex> predicate,List<ElementsVertex> pathVertexes)
- {
- List<Tuple<ElementsVertex, List<ElementsVertex>>> result = new List<Tuple<ElementsVertex, List<ElementsVertex>>>();
- //路径算法总结
-
- var refVertexes = GetRefVertexes(baseVertex,null);
- var newPath = new List<ElementsVertex>(pathVertexes);
- newPath.Add(baseVertex);
- foreach (ElementsVertex vertex in refVertexes)
- {
- //pathVertexes使用新的path,避免出现环路错误
- if ( newPath.Any(v=>v.Id==vertex.Id))
- continue;
- if (predicate == null || predicate(vertex))
- {
- //结束遍历;去除第一个基础点,基础点是为了遍历控制
- result.Add(new Tuple<ElementsVertex, List<ElementsVertex>>(vertex, new List<ElementsVertex>(newPath.GetRange(1, newPath.Count-1))));
- }
- else
- {
- //调整path
- var tranPath = new List<ElementsVertex>(newPath);
- // tranPath.Add(vertex);
- result.AddRange(GetRefVertexPaths(vertex, predicate, tranPath));
- }
-
- }
- return result;
- }
- #endregion
- #region 边操作
- /// <summary>
- /// 移除指定边
- /// </summary>
- /// <param name="edge"></param>
- /// <returns></returns>
- public bool RemoveEdge(ElementsEdge edge)
- {
- RemoveVERelation(edge.RealStart.Id, edge.Id);
- RemoveVERelation(edge.RealEnd.Id, edge.Id);
- //this.m_Edges.RemoveAll(e => e.Id == edge.Id);
- return this.m_Edges.Remove(edge);
- }
- public List<string> GetEdgeIds(string vId1, string vId2)
- {
- var list1 = GetVERelation(vId1);
- var list2 = GetVERelation(vId2);
- List<string> result=new List<string>();
- foreach (string strId1 in list1)
- {
- foreach (string strId2 in list2)
- {
- if (strId1 == strId2)
- {
- result.Add(strId1);
- }
- }
- }
- if (result.Any())
- {
- result = result.Distinct().ToList();
- }
- return result;
- }
- /// <summary>
- /// 获取两点之间的点
- /// </summary>
- /// <param name="vId1"></param>
- /// <param name="vId2"></param>
- /// <returns></returns>
- public List<ElementsEdge> GetEdges(string vId1, string vId2)
- {
- List<ElementsEdge> edges=new List<ElementsEdge>();
- var ids = GetEdgeIds(vId1, vId2);
- edges.AddRange(this.GetAvailableEdges(e => ids.Any(id => id == e.Id)));
- return edges;
- }
- /// <summary>
- /// 获取指定点关联的边信息
- /// </summary>
- /// <param name="vId"></param>
- /// <returns></returns>
- public List<ElementsEdge> GetEdges(string vId)
- {
- List<ElementsEdge> edges = new List<ElementsEdge>();
- var ids = GetVERelation(vId);
- edges.AddRange(this.GetAvailableEdges(e => ids.Any(id => id == e.Id)));
- return edges;
- }
- /// <summary>
- /// 取指定条件的父边
- /// </summary>
- /// <param name="baseEdge"></param>
- /// <param name="predicate"></param>
- /// <returns></returns>
- public List<ElementsEdge> GetParentEdges(ElementsEdge baseEdge, Predicate<ElementsEdge> predicate)
- {
- List<ElementsEdge> edges = new List<ElementsEdge>();
- var parent = baseEdge.Parent;
- while(parent!=null)
- {
- if (predicate == null || predicate(parent))
- {
- edges.Add(parent);
- }
- else
- {
- break;
- }
- parent = parent.Parent;
- }
- return edges;
- }
- #endregion
- /// <summary>
- /// 整理节点连接值
- /// </summary>
- public void ArrangeVertex()
- {
- var availableEdges = this.GetAvailableEdges(null);
- foreach (var availableEdge in availableEdges)
- {
- availableEdge.ArrangeChildrenVertex();
- }
- }
- #region 逻辑处理
- /*
- * 先串联再并联,
- * 循环操作
- */
- /// <summary>
- /// 并联处理
- /// </summary>
- /// <param name="edgeArray"></param>
- /// <returns></returns>
- private static ElementEdgesArray ParallelHandle(ElementEdgesArray edgeArray)
- {
- var originEdges = edgeArray.GetAvailableEdges(null);
- HandledMap map = new HandledMap();
- for (int i = 0; i < originEdges.Count; i++)
- {
- ElementsEdge baseElementsEdge = originEdges[i];
- if (map.GetHandled(baseElementsEdge))
- continue;
- var refEdges = edgeArray.GetEdges(baseElementsEdge.RealStart.Id, baseElementsEdge.RealEnd.Id);
- if (refEdges.Count > 1)
- {
- ElementsEdge edge = new ElementsEdge(new List<Element>());
- edge.Start = baseElementsEdge.RealStart;
- edge.End = baseElementsEdge.RealEnd;
- edge.Children.AddRange(refEdges);
- edge.EdgeType = EdgeType.Parallel;
- edgeArray.AddEdge(edge);
- refEdges.ForEach(e => map.SetHandled(e.Id, true));
- }
- }
- return edgeArray;
- }
- /// <summary>
- /// 串联处理
- /// </summary>
- /// <param name="edgeArray"></param>
- /// <returns></returns>
- private static ElementEdgesArray SeriesHandle(ElementEdgesArray edgeArray)
- {
- //节点处只有一个关联变,则表示串联
- var originEdges = edgeArray.GetAvailableEdges(null);
- HandledMap map = new HandledMap();
- for (int i = 0; i < originEdges.Count; i++)
- {
- ElementsEdge baseElementsEdge = originEdges[i];
- if (map.GetHandled(baseElementsEdge))
- continue;
- var oriRefEdges = edgeArray.GetEdges(baseElementsEdge.RealStart.Id, baseElementsEdge.RealEnd.Id);
- if (oriRefEdges.Count > 1)
- continue;
- //在这个没有多个边的基础上,下面的next方法才有意义
- List<ElementsVertex> searchVertexes = new List<ElementsVertex>() { baseElementsEdge.RealStart, baseElementsEdge.RealEnd };
- List<ElementsEdge> useEdges = new List<ElementsEdge>() { baseElementsEdge };
- List<ElementsVertex> ends = new List<ElementsVertex>();//端点信息
- for (int j = 0; j < searchVertexes.Count; j++)
- {
- ElementsVertex baseVertex = searchVertexes[j];
- ElementsVertex preVertex = searchVertexes[(j + 1) % 2];
- var refEdges = edgeArray.GetNextVertexes(baseVertex, new List<ElementsVertex>() { preVertex });
- while (refEdges.Count == 1)
- {
- var tempEdge = refEdges[0].Item2;
- //判处已经存在的边
- if (tempEdge==null||map.GetHandled(tempEdge)||useEdges.Any(d=>d.Id==tempEdge.Id))
- break;
- if (j == 0)
- {
- useEdges.Insert(0, tempEdge);
- }
- else
- {
- useEdges.Add(tempEdge);
- }
- map.SetHandled(tempEdge, true);
- preVertex = baseVertex;// refEdges[0].Item2.GetAnotherVertex(baseVertex);
- //迭代基础点,不能放在上面一句
- baseVertex = refEdges[0].Item1;
- refEdges = edgeArray.GetNextVertexes(refEdges[0].Item1, new List<ElementsVertex>() { preVertex });
- }
- ends.Add(baseVertex);
- }
- if (useEdges.Count != 1)
- {
- ElementsEdge edge = new ElementsEdge(new List<Element>());
- edge.Start = ends[0];
- edge.End = ends[1];
- edge.Children.AddRange(useEdges);
- edge.EdgeType = EdgeType.Series;
- edgeArray.AddEdge(edge);
- }
- }
- return edgeArray;
- }
- /// <summary>
- /// 整理图形信息
- /// </summary>
- /// <param name="edgeArray"></param>
- /// <returns></returns>
- public static ElementEdgesArray ArrangeHandle(ElementEdgesArray edgeArray)
- {
- var preCount = edgeArray.GetAvailableEdges(null).Count;
- do
- {
- edgeArray = SeriesHandle(edgeArray);
- var current = edgeArray.GetAvailableEdges(null).Count;
- if (current == 1)
- break;
- edgeArray = ParallelHandle(edgeArray);
- current = edgeArray.GetAvailableEdges(null).Count;
- if (current == 1)
- break;
- if (current == preCount)
- break;
- preCount = current;
- } while (true);
- return edgeArray;
- }
- #endregion
- #region 获取关联元素
- /// <summary>
- /// 获取数组包含的element集合
- /// </summary>
- /// <returns></returns>
- public List<Element> GetRefElements()
- {
- List<Element> result = new List<Element>();
- result.AddRange(this.m_Vertexes.SelectMany(v => v.RefData));
- result.AddRange(this.m_Edges.SelectMany(e => e.RefData));
- return result.Distinct(new ElementEqualComparer()).ToList();
- }
- #endregion
- #region 获取路径
- /// <summary>
- /// 获取以指定元素开始到结尾的路径
- /// </summary>
- /// <param name="elementsVertex"></param>
- /// <returns></returns>
- public List<List<ElementsVertex>> GetRouted(ElementsVertex elementsVertex)
- {
- //遍历队列中如果出现已经存在的点,则视为这是一条回路,则放弃该路径
- List<List<ElementsVertex>> routeds =new List<List<ElementsVertex>>();
- var baseVertex = elementsVertex;
- List<ElementsVertex> newRouted = new List<ElementsVertex>();
- GetRouted(newRouted, baseVertex, ref routeds);
- return routeds;
- }
- private void GetRouted(List<ElementsVertex> routed,ElementsVertex elementsVertex,ref List<List<ElementsVertex>> allRouteds)
- {
- List<List<ElementsVertex>> routeds =allRouteds;
- var baseVertex = elementsVertex;
- //发现环路则退出
- if (routed.Any(c => c.Id == baseVertex.Id))
- {
- return;
- }
- var preVextex = routed.LastOrDefault();
- var refVertexes = GetRefVertexes(baseVertex, null);
- if (preVextex != null)
- {
- refVertexes.RemoveAll(v => v.Id == preVextex.Id);
- }
- var newRouted = new List<ElementsVertex>(routed);
- newRouted.Add(baseVertex);
- if (!refVertexes.Any())
- {
- routeds.Add(newRouted);
- }
- else
- {
- foreach (var refVertex in refVertexes)
- {
- GetRouted(newRouted, refVertex, ref routeds);
- }
- }
- }
- #endregion
- }
- }
|