FilteredElementCollector
步骤:1.var wallTypeCollector1 = new FilteredElementCollector(_doc); 2.wallType.WherePasses(new ElementClassFilter(typeof(WallType))); 3.IList<Element> wallTypes1 = wallTypeCollector1.ToElement();
确定过滤范围:
1. FilteredElementCollector(Document) 对一个文档中进行过滤
2. FilteredElementCollector(Document, ElementId)只对给定视图中可见的对象过滤
3. FilteredElementCollector(Document, ICollection<Of<ElementId>>)对一个对象集合进行过滤
FilteredElementCollector的快捷过滤方式:
OfClass(Type)、OfCategory(BuildlnCategory)、OfCatoryId(ElementId)、OwnedByView()
ContainedInDesignOption(ElementId designOptionId) ...
举例:FilteredElementCollector collector = new FilteredElementCollector(document);
ICollection<Element> levels = collector.OfClass(typeof(level)).ToElements(); //level 楼层 .OfClass(XXX).OfCategory().XXX 可以并联
FilteredElementCollector.WherePasses(ElementFilter)
举例:ElementClassFilter familyInstanceFilter = new ElementClassFilter(typeof(FamilyInstance)); ElementCategoryFilter doorsCategoryfilter = new ElementCategoryFilter(BuiltInCategory.OST_Doors); LogicalAndFilter doorInstancesFilter = new LogicalAndFilter(familyInstanceFilter, doorsCategoryfilter); FilteredElementCollector collector.WherePasses(doorInstancesFilter ).ToElement();
FilteredElementCollector.FirstElement()返回第一个对象 FilteredElementCollector.FirstElementId()返回第一个对象的Id
获得遍历器来访问全部的对象:
GetElementIdIterator/GetElementIterator
举例:FilteredElementCollector roomIdItr = collector.GetElementIdIterator();
roomIdItr.Reset();
while(roomIdItr.MoveNext())
{
ElementId roomId = roomIdItr.Current;
Room room = document.get_Element(roomId) as Room;
}
直接获得结果列表:
ToElementIds()/ToElements()
doorInstancesFilter 实现了IEnumerable接口,可以用ForEach来遍历。
获取选择集:
sel = app.ActiveUIDocument.Selection;
sel.Elements.Clear();
foreach(Element elem in collector)
sel.Elements.Add(elem)
.NET LINQ:对集合类进行过滤
//LINQ query
var wallTypeElems1 = from element in wallTypeCollector1 where element.Name.Equals(wallTypeName) select element;
快速过滤条件: ElementClassFilter、ElementCategoryFilter
慢速过滤条件:FamilyInstanceFilter、AreaFilter
逻辑过滤条件,组合多个过滤条件:LogicalAndFilter 逻辑与 、 LogicalOrFilter 逻辑或
均用WherePasses添加。
过滤类:
空间过滤方式:
1.过滤与对象相交的其他对象:FilteredElementCollector collector = new FilteredElementCollector(doc);
ElementIntersectsElementFilter elementFilter = new ElementIntersectsElementFilter(column,false);
collector.WherePasses(elementFilter);
2.过滤与solid相交的对象: FilteredElementCollector collector = new FilteredElementCollector(doc);
ElementIntersectsSolidFilter solidFilter = new ElementIntersectsSolidFilter(solid);
collector.WherePasses(solidFilter);