Как исправить рекурсивный метод, который выбирает элементы из списка

Проблема в том, что я хочу выбрать лучи, совпадающие друг с другом одним щелчком мыши. У меня есть код, который проверяет, подключены ли они. Найдите код ниже

  public bool ElementsConnect(Element firstelement, Element secondelement)
    {
       ElementGeometry geo= new ElementGeometry();
       bool istrue ;
       List<XYZ> firstendpoints = GetEndPoints(firstelement);
       List<XYZ> secondendpoints = GetEndPoints(secondelement); 
       return istrue = firstendpoints.Any(firspoint => secondendpoints.Any
       (secondpoint => secondpoint.X == firspoint.X && secondpoint.Y==firspoint.Y
       && secondpoint.Z==firspoint.Z));
    }

Теперь мне нужен второй метод для рекурсивного цикла по списку, чтобы найти другие, которые присоединены, пока их не будет. Вот и не могу найти решение. Помощь будет принята с благодарностью. Позвольте мне добавить, что этот код никогда не выходит из цикла.

 public List<Element> GetConnectedBeams(Element element, List<Element> elements)
    {
       List<Element> beams = new List<Element>();
       for(int i=0; i < elements.Count();  i++)
       {
          if(ElementsConnect( element,elements[i]))
             beams.Add(elements[i]);
       }    
       List<Element> eles = null;
       foreach (var beam in beams) 
       {
          Element ele= elements.Find(x=> beams.Contains(x));
          eles = elements.Where(x=> x!= ele).ToList();
          beams= GetConnectedBeams(beam,eles) ;                                 
       }                
       return beams;
    }

person Nana Agyemang Ofosu    schedule 02.05.2019    source источник


Ответы (2)


The Building Coder неоднократно обсуждал, как извлекать связанные элементы. Может быть, статья о Фильтрация для Соприкосновение балок с использованием сплошного пересечения вполне удовлетворяет ваши потребности.

person Jeremy Tammik    schedule 02.05.2019
comment
Предлагаемое решение не является последовательным. Поскольку я хочу выбрать совпадающие лучи, я изменил последний бит вашего кода, как показано ниже List<ElementId> groupvisited = visited.Where(X=> geo.IsParallel(doc.GetElement(X),element)).GroupBy(x=> geo.GetYintersect(doc.GetElement(x))).Where(x=> x.Key == geo.GetYintersect(element)).SelectMany(gro=> gro).ToList(); uidoc.Selection.SetElementIds(groupvisited);TaskDialog.Show("Succeeded", Result.Succeeded.ToString()); - person Nana Agyemang Ofosu; 04.05.2019
comment
Спасибо, Джереми, я смог решить проблему на основе вашего кода. - person Nana Agyemang Ofosu; 18.05.2019

С помощью этой строки кода

   for(int i=0; i < elements.Count();  i++)

вы уже перебираете все элементы, потому что написали, что хотите проверять соединения только до тех пор, пока никого не останется.

Или я что-то не так понимаю?

Редактировать:

Как насчет этого?

 while (beams.Any())
 {
    foreach (var beam in beams) 
    {
       Element ele= elements.Find(x=> beams.Contains(x));
       eles = elements.Where(x=> x!= ele).ToList();
       beams= GetConnectedBeams(beam,eles) ;                                 
    }  
 }
person programmer444    schedule 02.05.2019
comment
Мне нужно просмотреть список, чтобы найти элементы, которые связаны с запрошенным элементом. на основе полученного списка найдите другие элементы, которые связаны с результатами в этом порядке, пока не будет ни одного. - person Nana Agyemang Ofosu; 02.05.2019