当前位置: 首页 > news >正文

13. Revit API: Filter(过滤器)

13. Revit API: Filter(过滤器)

前言

在讲Selection之前,还是有必要先了解一下的过滤器的。

对了,关于查找一些比较偏的功能或者API的用法,可以这样查找

关键词 site:https://thebuildingcoder.typepad.com/

site是高级搜索指令,表示从目标网址查找,不同的浏览器都有各自的指令,但部分是通用的。
网站thebuildingcoder里有许多关于Revit的有用的信息。

回到主题,这篇来讲一讲Filter


一、Filter是什么

如其意,Filter就是过滤器,用来过滤/查找我们需要的元素,满足条件的留下,就和用筛子筛豆子一样。当然我们可以遍历检索,但效率低。为了解决效率问题,Revit内置了一些Filter,我们可以直接使用。

在Revit中,Filter相关的类,可以划分为3块

  1. 收集器(Collector),用来执行过滤器,返回过滤结果,且内部封装有过滤器的简单调用方法。
  2. 过滤器(xxFilter),具体的过滤器,按特定的规则进行过滤。
  3. 过滤规则(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 List<ElementId> 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:扩展存储过滤器,如果用了扩展存储,那这个就很有用。

至于使用上,就按照上面的示例代码那样:

  1. 创一个收集器
  2. New一些过滤器
  3. 让收集器WherePasses过滤器
  4. 从收集器上拿到元素(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();

通过这种方式,就能将一些单条件的过滤器快速运用到收集器上。

构造函数:

ConstructorsDescription
FilteredElementCollector(Document)目标元素为整个文档
FilteredElementCollector(Document, ViewId)目标元素为指定视图种可见的元素
FilteredElementCollector(Document, List)目标元素为传入的元素

方法:

MethodsDescription
ToElementIds
ToElements
获取过滤后的元素ID集合
获取过滤后的元素集合
WherePasses应用过滤器
UnionWith和另一个收集器的结果合并
OfClass
OfCategory(/Id)
应用类过滤器(ElementClassFilter)
应用类型过滤器(ElementCategoryFilter)
OwnedByView应用当前视图过滤器(ElementOwnerViewFilter)
Excluding应用排除过滤器(ExclusionFilter)
WhereElementIsCurveDriven
WhereElementIs(/Not)ElementType
WhereElementIsViewIndependent
应用曲线驱动验证过滤器(ElementIsCurveDrivenFilter)
应用元素验证过滤器(ElementIsElementTypeFilter)
应用(ElementOwnerViewFilter)
ContainedInDesignOption应用(ElementDesignOptionFilter)

四、FilterRule

过滤规则(FilterRule)允许开发者自定义一些过滤条件。

前面也说了,元素参数过滤器(ElementParameterFilter)是唯一和FilterRule够上的过滤器,它是一个慢过滤器,毕竟涉及到元素的参数信息了,它的构造函数要求传入FilterRule。

但元素参数过滤器并不是RevitAPI种唯一使用过滤规则的类,还有一个非常有迷惑性的类,叫ParameterFilterElement(参数过滤器元素)。

ParameterFilterElement:一个类似Collector的东西,里面封装了并提供了一些过滤规则相关的方法。

在这里插入图片描述

4.1. FilterRule的派生类

看下图(最上方大图的一部分)

  • FilterCategoryRule:定义类型过滤规则,相当于一个慢速的类型过滤器
  • FilterInverseRule:定义反转过滤规则,效果用反转过滤器
  • FilterValueRule:定义值过滤规则。
  • SharedParameterApplicableRule:定义共享参数过滤规则

在这里插入图片描述

这里有个叫FilterCategoryRule的规则,效果上完全就是一个慢速版的类型过滤器。

关于这部分运用,主要是在 值过滤规则 上,我们来看看。

4.2. FilterValueRule(值过滤规则)

要定义值过滤规则,需要有两个东西:

  1. 值的来源(ParameterValueProvider
  2. 值的验证比较方式(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 List<ElementId> 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命名空间下的那几个了。

相关文章:

13. Revit API: Filter(过滤器)

13. Revit API: Filter&#xff08;过滤器&#xff09; 前言 在讲Selection之前&#xff0c;还是有必要先了解一下的过滤器的。 对了&#xff0c;关于查找一些比较偏的功能或者API的用法&#xff0c;可以这样查找 关键词 site:https://thebuildingcoder.typepad.com/ site是…...

hadoop 3.X 分布式HA集成Kerbos(保姆级教程)

前提&#xff1a;先安装Kerbos 1、创建keytab目录 在每台机器上上提前创建好对应的kertab目录 [hadooptv3-hadoop-01 ~]$ sudo mkdir -p /BigData/run/hadoop/keytab/ [hadooptv3-hadoop-01 ~]$ sudo mkdir -p /opt/security/ [hadooptv3-hadoop-01 ~]$ sudo chown hadoop:had…...

VDS虚拟导播切换台软件

VDS 导播软件是一款功能强大的虚拟导播系统软件&#xff0c;具有全媒体接入、播出内容丰富、调音台、快捷切播与导播键盘、云台控制等特点&#xff0c;同时支持向多个平台直播推流。以下是一些常见的 VDS 导播软件特点&#xff1a; 1. 全媒体接入&#xff1a;支持多种设备和网…...

UE4_材质_使用彩色半透明阴影

学习笔记&#xff0c;不喜勿喷&#xff01;侵权立删&#xff0c;祝愿大美临沂生活越来越好&#xff01; 本教程将介绍如何配置虚幻引擎来投射彩色半透明阴影。 此功能在许多应用中都很有用&#xff0c;常见例子就是透过彩色玻璃窗的彩色光。 一、半透明阴影颜色 阴影在穿过半…...

arthas监控工具笔记(二)monior等

文章目录 monitor/watch/trace 相关monitormonitor例子monitor -c <value>monitor -m <vaule>monitor 条件表达式monitor -b monitor文档(界面描述)monitor文档(help) stack - 输出当前方法被调用的调用路径trace - 方法内部调用路径&#xff0c;并输出方法路径上的…...

【mybatis】mybatis-plus中主键生成策略

1、简介 MyBatis-Plus 中的主键生成策略是一个关键特性&#xff0c;它决定了如何为新插入的行生成唯一标识符&#xff08;即主键&#xff09;。MyBatis-Plus 提供了多种主键生成策略&#xff0c;以满足不同场景下的需求。 2、常见主键生成策略 1. AUTO&#xff08;数据库ID自…...

模型情景制作-如何制作棕榈树

夏天&#xff0c;沙滩&#xff0c;海景&#xff0c;棕榈树&#xff0c;外加美女&#xff0c;想象下热带海滨的样子吧 可是口年的上班族没有多少机会去到海滩&#xff0c;肿么办&#xff1f;我们自己DIY一个海滨情景摆在办公桌上吧~~~ 什么什么&#xff1f;棕榈树不会做&#xf…...

# mysql 中文乱码问题分析

mysql 中文乱码问题分析 一、问题分析&#xff1a; MySQL 中文乱码通常是因为字符集设置不正确导致的。MySQL 有多种字符集&#xff0c;如 latin1、utf8、utf8mb4 等&#xff0c;如果在创建数据库、数据表或者字段时没有指定正确的字符集&#xff0c;或者在插入数据时使用了与…...

[小试牛刀-习题练]《计算机组成原理》之指令系统

一、选择题 0.【指令-课本习题】某计算机按字节编址&#xff0c;指令字长固定且只有两种指令格式&#xff0c;其中三地址指令29条&#xff0c;二地址指令107条&#xff0c;每个地址字段为6位&#xff0c;则指令字长至少应该是&#xff08;A&#xff09; A.24位 B. 26位 C. 28位…...

JAVA 实现拍卖框架及拍卖详情流程介绍(包含代码示咧)

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…...

力扣1177.构建回文串检测

力扣1177.构建回文串检测 因为子串可以重新排序 因此考虑一下什么情况需要替换字母1.当前有一个字母的数量为奇数 需要替换的次数为0 2.当前有二个字母的数量为奇数 需要替换的次数为1 (奇数个a 奇数个b 需要将b -> a) 3.当前有三个字母的数量为奇数 需要替换的次数为1 4.当…...

Vue跨域获取ip和ip位置城市等归属地信息

由于端口设置与查询服务器不一致&#xff0c;所以不能直接从ip138网上抓取&#xff0c;只能跨域查询。实现跨域查询&#xff0c;简单的方法是使用jsonp方式&#xff0c;只支持get请求&#xff0c;同时也需要查询的服务器支持jsonp。这时找到了腾讯位置服务。参考文章&#xff0…...

缺失的第一个正数

给你一个未排序的整数数组 nums &#xff0c;请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,0] 输出&#xff1a;3 解释&#xff1a;范围 [1,2] 中的数字都在数组…...

mac 上 Docker Desktop的免费开源的替代工具Colima

当谈到在macOS上运行容器时&#xff0c;Docker长期以来一直是首选。但是&#xff0c;必须解决使用适用于macOS的Docker Desktop时出现的一些限制&#xff0c;特别是对于大中型公司&#xff0c;最大的问题是需要购买许可证。另外&#xff0c;macOS 版Docker Desktop的性能问题也…...

C语言 -- 函数

C语言 -- 函数 1. 函数的概念2. 库函数2.1 标准库和头文件2.2 库函数的使用方法2.2.1 功能2.2.2 头文件包含2.2.3 实践2.2.4 库函数文档的一般格式 3. 自定义函数3.1 函数的语法形式3.2 函数的举例 4. 形参和实参4.1 实参4.2 形参4.3 实参和形参的关系 5. return 语句6. 数组做…...

Cesium 立式雷达扫描

Cesium 立式雷达扫描 自定义 Primitive 实现支持水平和垂直交替扫描...

Oracle HTTP Server(OHS)与Oracle数据库的紧密绑定

Oracle HTTP Server&#xff08;OHS&#xff09;与Oracle数据库的紧密绑定通常是通过一系列的配置和集成步骤来实现的。以下是这些步骤的详细归纳&#xff0c;包括必要的分点表示和参考信息&#xff1a; 一、安装和配置Oracle HTTP Server 安装OHS&#xff1a; 在安装Oracle…...

mmcv安装失败及解决方案

假如想安装的版本是mmcv1.4.0, 但是pip install mmcv1.4.0总是失败&#xff0c;若是直接pip install mmcv会安装成功&#xff0c;但是安装的就是最新版本&#xff0c;后面代码跑起来还会报错&#xff0c;怎么办呢&#xff1f; 接下来分享一个mmcv指定版本安装的方式。 网页&a…...

国产强大免费WAF, 社区版雷池动态防护介绍

雷池WAF&#xff0c;基于智能语义分析的下一代 Web 应用防火墙 使用情况 我司于2023年4月23日对雷池进行测试&#xff0c;测试一个月后&#xff0c;于2023年5月24日对雷池进行正式切换&#xff0c;此时版本为1.5.1。 里程碑纪念 后续一直跟随雷池进行版本升级&#xff0c;当前…...

【Django】网上蛋糕项目商城-首页

概念 本文在上一文章搭建完数据库&#xff0c;以及创建好项目之后&#xff0c;以及前端静态文件后&#xff0c;对项目的首页功能开发。 后端代码编写 在views.py文件中创建方法&#xff0c;连接数据库&#xff0c;并获取首页需要的数据 def getGoodsList(type):# 获取所有横…...

Vue 父子页面使用指南

Vue3父子页面使用指南 Vue3作为一种现代化的前端框架&#xff0c;提供了强大的组件化功能&#xff0c;使得页面开发更加模块化和可维护。本文将深入探讨Vue3中父子页面的使用方法&#xff0c;包括如何传递参数、父组件如何调用子组件的方法&#xff0c;以及父子页面的加载原理…...

TVBox自定义配置+软件密码版本

apk地址 : https://gitee.com/wheat-wheat/kekeda-duck-apk 1、安装安卓SDK Android SDK Windows 安装及环境配置教程_sdk manager windows-CSDN博客 修改点: 基础配置: java版本:...

Java单体架构项目_云霄外卖-特殊点

项目介绍&#xff1a; 定位&#xff1a; 专门为餐饮企业&#xff08;餐厅、饭店&#xff09;定制的一款软件商品 分为&#xff1a; 管理端&#xff1a;外卖商家使用 用户端&#xff08;微信小程序&#xff09;&#xff1a;点餐用户使用。 功能架构&#xff1a; &#xff08…...

一文搞懂 java 线程池:ScheduledThreadPool 和 WorkStealingPool 原理

你好&#xff0c;我是 shengjk1&#xff0c;多年大厂经验&#xff0c;努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 文章目录 一…...

轮换IP是什么?——深入了解轮换IP的特点

大家在日常上网时&#xff0c;可能听说过“轮换IP”这个词。那么&#xff0c;轮换IP到底是什么&#xff1f;它有哪些特点&#xff1f;今天&#xff0c;我们就来揭开轮换IP的神秘面纱。 什么是轮换IP&#xff1f; 简单来说&#xff0c;轮换IP是指定期更换上网时使用的IP地址。…...

中英双语介绍美国的州:华盛顿州(Washington)

中文版 华盛顿州简介 华盛顿州&#xff08;Washington&#xff09;位于美国太平洋西北地区&#xff0c;以其壮丽的自然景观和蓬勃发展的经济闻名。以下是对华盛顿州的详细介绍&#xff0c;包括其地理位置、人口、经济、教育、文化和主要城市。 地理位置 华盛顿州北接加拿大…...

美工画师必看!AI绘画Stable Diffusion 一键生成 B 端图标教程,轻松制作商业可用的设计图标,从此告别加班!(附安装包)

大家好&#xff0c;我是画画的小强 在日常工作中&#xff0c;设计师在应对运营和UI设计的B端图标时&#xff0c;常常面临大量的构思、制作和渲染等工作&#xff0c;耗时耗力。我们可以利用Stable Diffusion(以下简称SD)结合AI的方式&#xff0c;帮助设计师优化图标的设计流程&…...

使用表单系统快速搭建邀请和签到系统

在组织活动时&#xff0c;邀请和签到环节往往是活动成败的关键之一。传统的纸质邀请和签到方式不仅费时费力&#xff0c;还容易出现各种问题&#xff0c;例如名单遗漏、签到混乱等。而使用TDuckX“搭建邀请和签到系统”将彻底改变这一现状&#xff0c;为活动组织者提供了一种高…...

Vue 3 入门与精通:为初学者打造的全面学习指南

引言&#xff1a; Vue.js&#xff0c;这款由尤雨溪创建的轻量级前端框架&#xff0c;以其简洁的API、双向数据绑定和组件化的开发模式&#xff0c;深受广大开发者喜爱。Vue 3 的发布&#xff0c;带来了更多的性能优化和功能增强&#xff0c;为开发者提供了更广阔的空间。本文旨…...

React+TS前台项目实战(二十四)-- 全局常用绘制组件Qrcode封装

文章目录 前言Qrcode组件1. 功能分析2. 代码详细注释3. 使用方式4. 效果展示(pc端 / 移动端) 总结 前言 今天要封装的Qrcode 组件&#xff0c;是通过传入的信息&#xff0c;绘制在二维码上&#xff0c;可用于很多场景&#xff0c;如区块链项目中的区块显示交易地址时就可以用到…...