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实例化时报错。