视频连接v.bimcc.com/course/35/tasks
常用过滤器:过滤器、选择过滤器
一、过滤器
建立一个简单的过滤器实例。
在之前的类库中新建Class3.cs
1.前期的初始化,如图。

2.常用的东西

第一个是过滤后的元素收集器。
第二个是基于Class的过滤器。(class指的是C#中class的概念,如FamilyInstance、Family、FamilySymbol、Wall、Hosts等)
第三个是基于Category的属性的过滤器。
3.在API文档中可以看到收集器的使用方法

第一个是全文件搜索,第二个是全文件的可见元素搜索,第三个是在文档的ICollection集合中搜索。
这里一般用第一个构造方法。
FilteredElementCollector columCollection = new FilteredElementCollector(doc);
4.在API文档中看到过滤器的使用方法

这里用第一个构造方法。
通过查找api,可以看到BuiltInCategory是一个枚举类型,其中每一个Member对应了一种Category。

那怎么把Member和Category对应起来呢?
通过 lookup中的Snoop Current Selection

查看当前选中的FamilyInstance的Category属性。
其中Built-in category属性即为所要的值。
将其复制到代码中:
ElementCategoryFilter columFilter = new ElementCategoryFilter(BuiltInCategory.OST_StructuralColumns);
那么ClassFiter也是类似的方法
ElementClassFilter familyInstanceFilter = new ElementClassFilter(typeof(FamilyInstance));
这里为什么要 CategoryFilter和ClassFilter同时使用呢?
我们最后再讲。
5.将过滤器用到收集器上
columCollection.WherePasses(columFilter).WherePasses(familyInstanceFilter);
//还有一种简便的操作 columCollection.OfCategory(BuiltInCategory.OST_StructuralColumns); 这样不用定义categoryfilter
6.选中的操作
前面添加using Autodesk.Revit.UI.Selection;
//将过滤得到的图元转化为Id
IList<ElementId>elId = new List<ElementId>();
foreach (Element el in columCollection)
{
elId.Add(el.Id);
}
//将图元设置为选中状态
uidoc.Selection.SetElementIds(elId);
最后生成的插件效果

回到前面的问题
为什么要 CategoryFilter和ClassFilter同时使用
以图中的混凝土柱400x400为例。

在模型中 混凝土柱familyInstance的BuiltInCategory 为OST_StructuralColumns
而项目浏览器中 400x400这个familysymbol的BuiltInCategory 同样为OST_StructuralColumns
而再上层 混凝土柱这个family familycategory中的BuiltInCategory也是 OST_StructuralColumns
所以 图中有8个familyInstance柱子 , 1个familysymbol ,1个family ,只用CategoryFilter过滤器的话会得到10个结果
可以添加测试代码如图


可以看到结果果然是10个。
二、逻辑过滤器
ElementLogicalFilter
其中包括两个过滤器 and和or
LogicalAndFilter
LogicalOrFilter
用法很简单,以and的构造为例
LogicalAndFilter doorInstancesFilter = new LogicalAndFilter(familyInstanceFilter, doorsCategoryfilter);//这里将两个过滤后的集合合并
将两个过滤器写在参数列表里就行了,其他的用法和过滤器相同。
逻辑过滤器用于提高效率,减少wherepasses次数。
三、快/慢速过滤器 ElementQuickFilter/ElementSlowFilter


Revit为了性能考虑只将一部分属性加载进内存。
过滤在内存中这部分属性的是快速过滤器,过滤其他属性的是慢速过滤器。
一般优先用快速过滤器,如果一定要用到慢速,则可以先用快速过滤器缩小过滤范围。
四、选择过滤器
在执行命令的过程中,让用户自行选择构件或构建集。
//创建 WallSelectionFilter 继承自ISelectionFilter 生成默认函数
//AllowElement函数中,添加选择判断部分

主函数部分如图,只有两行

插件运行结果如图。可以看到只能框选到"400x400"的FamilyInstance

网友评论