当前位置: 首页 > 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):# 获取所有横…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点&#xff1a; 多级缓存&#xff0c;先查本地缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

Python 实现 Web 静态服务器(HTTP 协议)

目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1&#xff09;下载安装包2&#xff09;配置环境变量3&#xff09;安装镜像4&#xff09;node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1&#xff09;使用 http-server2&#xff09;详解 …...