淘宝做网站设计,北京网站建设兼职,在网站上做外贸,cae毕业设计代做网站13. Revit API: Filter#xff08;过滤器#xff09;
前言
在讲Selection之前#xff0c;还是有必要先了解一下的过滤器的。
对了#xff0c;关于查找一些比较偏的功能或者API的用法#xff0c;可以这样查找 关键词 site:https://thebuildingcoder.typepad.com/ site是…13. Revit API: Filter过滤器
前言
在讲Selection之前还是有必要先了解一下的过滤器的。
对了关于查找一些比较偏的功能或者API的用法可以这样查找 关键词 site:https://thebuildingcoder.typepad.com/ site是高级搜索指令表示从目标网址查找不同的浏览器都有各自的指令但部分是通用的。 网站thebuildingcoder里有许多关于Revit的有用的信息。
回到主题这篇来讲一讲Filter。 一、Filter是什么
如其意Filter就是过滤器用来过滤/查找我们需要的元素满足条件的留下就和用筛子筛豆子一样。当然我们可以遍历检索但效率低。为了解决效率问题Revit内置了一些Filter我们可以直接使用。
在Revit中Filter相关的类可以划分为3块
收集器Collector用来执行过滤器返回过滤结果且内部封装有过滤器的简单调用方法。过滤器xxFilter具体的过滤器按特定的规则进行过滤。过滤规则FilterRule一些规则可以有限的影响过滤操作。 下面分别对这3块内容进行讲解。
更具体的类图如下。FilteredWorksetCollector此篇不涉及我目前还不知道Workset是个什么东西。 二、ElementFilter
先看ElementFilter它是一众过滤器的基类并直接派生出3种过滤器。 按照其功能或特性分别为
ElementLogicalFilter逻辑过滤器用来对多种过滤器进行组合ElementQuickFilter快过滤器采用一个叫ElementRecord的低内存类进行检索相当于一个包含少量的必要的信息的记录/映射。ElementSlowFilter慢过滤器慢是相对于快过滤器的作用于已展开的Element上也就是读的信息更多可以执行更细致的过滤。在使用时通常会先使用快过滤器缩小范围以提高效率。
先看看基类ElementFilter吧。
类成员描述Inverted { get; }表示是否反转过滤True则改为保留不满足条件的。反转过滤需要在构造函数上传参确定。PassesFilter(..)验证给定元素是否可以通过验证
2.1. ElementLogicalFilter逻辑过滤器
逻辑过滤器ElementLogicalFilter是用来组合一系列具体的过滤器的。
它本身未公开构造函数只能通过其派生出的2个子类来构建。
子类名称很直观
逻辑与LogicalAndFilter完成全部过滤器验证才能保留下来逻辑或LogicalOrFilter完成任意过滤器验证就可以保留下来
下面的例子使用了类型过滤器检测地板类型和类过滤器检测Wall类。并使用收集器执行与结果输出。
private ListElementId TestLogicalFilter(Document document)
{// 1.collectorFilteredElementCollector collector new FilteredElementCollector(document);// 2.FilterElementCategoryFilter categoryFilter new ElementCategoryFilter(BuiltInCategory.OST_Floors);ElementClassFilter classFilter new ElementClassFilter(typeof(Wall));// logical ANDLogicalAndFilter logicalAndFilter new LogicalAndFilter(categoryFilter, classFilter);// logical ORLogicalOrFilter logicalOrFilter new LogicalOrFilter(categoryFilter, categoryFilter);// 3.wherePassescollector.WherePasses(logicalAndFilter);//collector.WherePasses(logicalOrFilter);// 4.collectreturn collector.ToElementIds().ToList();
}3.2. ElementQuickFilter快过滤器
快过滤器ElementQuickFilter由于只拿到Element的一点点信息所以其子类的过滤规则都比较简单。 都过滤些什么呢类、类型、包围盒之类的基本是。具体就不列了看上面的图片或者翻看文档都可以。
有几个特别的简单提一下。
ElementMulti...Filter一次塞入多个类/类型ExclusionFilter排除过滤器比如进行“查找所有未选中的墙体”这个操作。ExtensibleStorageFilter扩展存储过滤器如果用了扩展存储那这个就很有用。
至于使用上就按照上面的示例代码那样
创一个收集器New一些过滤器让收集器WherePasses过滤器从收集器上拿到元素ID集合。
对于包围盒过滤器存在的问题看Revit获取元素Solid和计算包围盒。 简单来说就是Element.BoundingBox的问题它会将非几何结构也计入到元素范围中这当然是合理的但是“反直觉”。
3.3. ElementSlowFilter慢过滤器
慢过滤器ElementSlowFilter检索了更多的元素信息相较于快过滤器慢一些相对的慢过滤器上的规则就更多样。
同样的不一一列出各个过滤器。比较常用的就FamilyInstanceFilter吧。
还有一个最特殊的元素参数过滤器ElementParameterFilter因为这是唯一用到FilterRule的过滤器了。这在后面过滤器规则那段一起讲。 三、FilteredElementCollector
看到这儿我们已经对收集器FilteredElementCollector有所了解。 先创建收集器再创建过滤器然后进行运用最后拿到结果。 流程很丝滑但不够简洁。对此收集器本身封装了常用过滤器的创建方法并可采用链式结构调用这样就极大的简化了过滤操作。
同样的对于上面的代码示例我们可以这样进行简写。
FilteredElementCollector collector new FilteredElementCollector(document);
var ids collector.OfCategory(BuiltInCategory.OST_Floors).OfClass(typeof(Wall)).ToElementIds().ToList();通过这种方式就能将一些单条件的过滤器快速运用到收集器上。
构造函数
ConstructorsDescriptionFilteredElementCollector(Document)目标元素为整个文档FilteredElementCollector(Document, ViewId)目标元素为指定视图种可见的元素FilteredElementCollector(Document, List)目标元素为传入的元素
方法
MethodsDescriptionToElementIdsToElements获取过滤后的元素ID集合获取过滤后的元素集合WherePasses应用过滤器UnionWith和另一个收集器的结果合并OfClassOfCategory(/Id)应用类过滤器ElementClassFilter应用类型过滤器ElementCategoryFilterOwnedByView应用当前视图过滤器ElementOwnerViewFilterExcluding应用排除过滤器ExclusionFilterWhereElementIsCurveDrivenWhereElementIs(/Not)ElementTypeWhereElementIsViewIndependent应用曲线驱动验证过滤器ElementIsCurveDrivenFilter应用元素验证过滤器ElementIsElementTypeFilter应用ElementOwnerViewFilterContainedInDesignOption应用ElementDesignOptionFilter 四、FilterRule
过滤规则FilterRule允许开发者自定义一些过滤条件。
前面也说了元素参数过滤器ElementParameterFilter是唯一和FilterRule够上的过滤器它是一个慢过滤器毕竟涉及到元素的参数信息了它的构造函数要求传入FilterRule。
但元素参数过滤器并不是RevitAPI种唯一使用过滤规则的类还有一个非常有迷惑性的类叫ParameterFilterElement参数过滤器元素。 ParameterFilterElement一个类似Collector的东西里面封装了并提供了一些过滤规则相关的方法。 4.1. FilterRule的派生类
看下图最上方大图的一部分
FilterCategoryRule定义类型过滤规则相当于一个慢速的类型过滤器FilterInverseRule定义反转过滤规则效果用反转过滤器FilterValueRule定义值过滤规则。SharedParameterApplicableRule定义共享参数过滤规则 这里有个叫FilterCategoryRule的规则效果上完全就是一个慢速版的类型过滤器。
关于这部分运用主要是在 值过滤规则 上我们来看看。
4.2. FilterValueRule值过滤规则
要定义值过滤规则需要有两个东西
值的来源ParameterValueProvider值的验证比较方式RuleEvaluator
4.2.1. ParameterValueProvider值提供者
我们先来看看值的获取。
好吧看文档有点迷惑直接看例子
// 获取元素的“面积”参数
ElementId areaParamId new ElementId(BuiltInParameter.HOST_AREA_COMPUTED);
ParameterValueProvider doubleValueProvider new ParameterValueProvider(areaParamId);4.2.2. RuleEvaluator验证器
不同类型的值有不同的比较方式。
a) 字符串FilterStringRuleEvaluator
FilterStringBeginsWith开始于FilterStringEndsWith结束于FilterStringContains包含FilterStringGreater(/OrEqual)排序在后或等于FilterStringLess(/OrEqual)排序在前或等于
b) 数字FilterNumericRuleEvaluator
FilterNumericEquals等于FilterNumericGreater(/OrEqual)大于或等于FilterNumericLess(/OrEqual)小于或等于
4.2.3. 代码示例
结合一个代码示例来看看吧。
以下代码检索结构用途为“非承重”、面积大于等于1000平方英尺的墙体。
private ListElementId TestParameterFilter(Document document)
{// 1. collectorFilteredElementCollector collector new FilteredElementCollector(document);// 2. rule// 2.1. category ruleFilterCategoryRule filterCategoryRule new FilterCategoryRule([new ElementId(BuiltInCategory.OST_Walls)]); // 墙// 2.2. value rule stringParameterValueProvider stringValueProvider new ParameterValueProvider(new ElementId(BuiltInParameter.WALL_STRUCTURAL_USAGE_PARAM)); // 结构用途FilterStringRuleEvaluator stringEvaluator new FilterStringEquals(); // 等于FilterStringRule stringRule new FilterStringRule(stringValueProvider, stringEvaluator, 非承重, false);// 2.3. value rule number doubleElementId areaParamId new ElementId(BuiltInParameter.HOST_AREA_COMPUTED);ParameterValueProvider doubleValueProvider new ParameterValueProvider(areaParamId); FilterNumericRuleEvaluator doubleEvaluator new FilterNumericGreaterOrEqual(); // 大于等于FilterDoubleRule doubleRule new FilterDoubleRule(doubleValueProvider, doubleEvaluator, 1000, 10e-3);// 3. filterElementParameterFilter elementParameterFilter new ElementParameterFilter([filterCategoryRule, stringRule, doubleRule]);// 4. resultreturn collector.WherePasses(elementParameterFilter).ToElementIds().ToList();
}使用Revit自带的项目“Technical_school-current_m.rvt”进行验证。
将上面检索到的墙体放入选择列表中效果如下图 总结
这篇讲解了过滤器相关的API以及使用方法我觉得还是比较全面的。
这篇又提到了哪些本篇范围外的呢参数Parameter平方英尺/单位Unit放入选择列表Selection。
下一篇就写Selection命名空间下的那几个了。