这篇随笔呢,主要是记录一下工作中经常用到的一些过滤器,给自己总结一下,以便以后更加的灵活运用。
1. 利用FilteredElementCollector
的构造函数初步一个大范围
对一个文档中进行过滤
FilteredElementCollector(Document)
只对给定视图中可见的对象过滤
FilteredElementCollector(Document,
ElementId)
对一个对象集合进行过滤
FilteredElementCollector(Document,
ICollection<(Of <(ElementId>)>))
2. 利用FilteredElementCollector的函数添加快捷过滤条件
? FilteredElementCollector的快捷方法添加过滤条件
?
快捷方法可以并联,连续添加多个条件
? OfClass(Type)
? OfCategory(BuiltInCategory)
? OfCatoryId(ElementId)
? OwnedByView()
? ContainedInDesignOption(ElementId
designOptionId)
? WhereElementIsCurveDriven
?
WhereElementIsElementType
例子:
FilteredElementCollector collector = new FilteredElementCollector(doc);
ICollection<Element> levels = collector.OfClass(typeof(Level)).ToElements();
ElementType wallType = new FilteredElementCollector(doc).WhereElementIsElementType().OfClass(typeof(WallType))
.OfCatory(BulidInCatory.OST_Walls).FirstElement() as ElementType;
3.
通过FilteredElementCollector的WherePasses() 函数添加任意过滤条件
ElementClassFilter instanceFitler = new ElementClassFilter(typeof(FamilyInstance));
ElementClassFilter hostFilter = new ElementClassFilter(typeof(HostObject));
IList<ElementFilter> listFilter = new List<ElementFilter>();
listFilter.Add(instanceFitler);
listFilter.Add(hostFilter);
LogicalOrFilter orFilter = new LogicalOrFilter(listFilter);//逻辑过滤器LogicalOrFilter ,LogicalAndFilter
FilteredElementCollector fec = new FilteredElementCollector(doc);
fec.WherePasses(orFilter);
//遍历过滤器内的实体第一种方法
FilteredElementIterator fei = fec.GetElementIterator();
fei.Reset();//把迭代器设置到起始端
while (fei.MoveNext())
{
//相关操作
}
//遍历过滤器内的实体第二种方法
Selction sel = app.ActiveUIDocument.Selection;
sel.Elements.Clear();
Foreach(Element ele in collector)
{
sel.Elements.Add(ele);
}
4.对象过滤步骤
1. 首先确定你的目标对象的特征?
?
比如:在哪个模型中,是否只在某个视图中的实体
? 多个条件的联合
? 常用条件的快捷方式
?
与其他过滤对象Collector的相交或合并操作
? 需要排除哪些对象
2. 选择用何种方式进行遍历
? 使用遍历器Iterator
?
Element 集合 还是 ElementId 集合
? IEnumerable
3. 获得过滤结果中的对象
?
使用foreach来遍历每一个对象
? LINQ 进一步限制所获得的结果集合
? 只获得第一个对象或对象的ElementId
5.高效对象过滤最佳实践
? 优先使用快速过滤条件
? 慢过滤条件次之
?
使用了内置过滤技术后,考虑使用 LINQ 来更进一步限制.
? 技巧: 使用
FilteredElementCollector的快捷方法Of***()
? 如果你使用快捷方法,实际上是使用了快速过滤。因为慢过滤没有快捷
方法.
Revit二次开发中经常用到的一些过滤器,布布扣,bubuko.com
原文:http://www.cnblogs.com/love-huihui-zhupo/p/3578104.html