问题是我想单击即可选择彼此重合的梁。我有一个代码检查它们是否已连接。在下面找到代码
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;
}
答案 0 :(得分:0)
使用这一行代码
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) ;
}
}
答案 1 :(得分:0)
The Building Coder反复讨论了如何检索连接的元素。也许Filtering for Touching Beams Using Solid Intersection上的文章可以很好地满足您的需求。