[Revit二次开发] 使用过滤器时,可能存在的坑:FilteredElementCollector.MoveNext()报错

发布时间 2023-11-24 15:40:42作者: 乐观的咸鱼

1.问题描述

  在使用FilteredElementCollector时,如果涉及到需要对collector进行多次过滤处理,可能会出现MoveNext的报错。

  问题代码如下:

1 var collector = new FilteredElementCollector(doc);
2 collector.OfClass(typeof(FamilyInstance));
3 
4 collector.WherePasses(new BoundingBoxIntersectsFilter(new Outline(new XYZ(), new XYZ(10, 10, 10))));
5 
6 collector.WherePasses(new BoundingBoxIntersectsFilter(new Outline(new XYZ(), new XYZ(5, 5, 5))));
7 
8 collector.GetElementCount();

 

  报错截图:

 

 2.解决方案

  这可能时因为多次对collector进行过滤操作后,其内部指针出现混乱,导致遍历操作出现报错。

  我们可以通过过滤后得到的elementIds重新创建一个collector来规避这个bug,代码如下:

 1 var collector = new FilteredElementCollector(doc);
 2 collector.OfClass(typeof(FamilyInstance));
 3 
 4 collector.WherePasses(new BoundingBoxIntersectsFilter(new Outline(new XYZ(), new XYZ(10, 10, 10))));
 5 
 6 var afterFilterIds1 = collector.ToElementIds();
 7 collector = new FilteredElementCollector(doc, afterFilterIds1).OfClass(typeof(FamilyInstance));
 8 
 9 
10 collector.WherePasses(new BoundingBoxIntersectsFilter(new Outline(new XYZ(), new XYZ(5, 5, 5))));
11 
12 collector.GetElementCount();

  当然,上述代码没有对ids进行判断,请务必判断ids中元素个数是否为0,否则可能导致collector实例化时报错。