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命名空间下的那几个了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/368096.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

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. 数组做…

react ts 封装3D柱状图,支持渐变

留档&#xff0c;以防忘记 bar3D.tsx import React, { useEffect, useRef, useState } from react; import * as echarts from echarts; import echarts/lib/chart/bar; import echarts/lib/chart/pictorialBar; import echarts/lib/component/grid; import echarts/lib/comp…

Centos7 安装老版本的chrome

查看自己linux是哪个centos版本 使用以下命令&#xff1a; cat /etc/centos-release我这里是centOS 7。然后在安装最新版的google-chrome时&#xff0c;总是会报错显示存在依赖环境的问题&#xff0c;使得无法安装成功chrome。 Package: google-chrome-stable (/google-chro…

使用 Rustup 管理 Rust 版本

文章目录 安装 Rustup配置镜像源安装 Rustup 安装 RustVS Code插件创建项目代码示例 Rust 官网&#xff1a;https://www.rust-lang.org/zh-CN/Crates 包管理&#xff1a;https://crates.io/Rust 程序设计语言&#xff1a;https://kaisery.github.io/trpl-zh-cn/通过例子学 Rust…

如何对低代码平台进行分类?

现在市面上的低代码平台就像雨后春笋一样冒出来&#xff0c;而且源源不绝&#xff0c;但总结下来&#xff0c;大致的也就以下三类。 一、 aPaaS多引擎类&#xff08;有很多成熟引擎、做好东西要一起用&#xff09; 这类产品包括&#xff1a;织信Informat&#xff08;国内&…

使用 Smart-doc 记录 Spring REST API

如果您正在使用 Spring Boot 开发 RESTful API&#xff0c;您希望让其他开发人员尽可能容易地理解和使用您的 API。文档是必不可少的&#xff0c;因为它为将来的更新提供了参考&#xff0c;并帮助其他开发人员与您的 API 集成。很长一段时间以来&#xff0c;记录 REST API 的方…

uni-app上传失败超出文件限制解决方法-分包处理-预加载

分包背景 当你的上传出现一下错误&#xff1a; Error: 系统错误&#xff0c;错误码&#xff1a;80051,source size 2089KB exceed max limit 2MB [20240703 10:53:06][wxbf93dfb6cb3eb8af] [1.06.2405010][win32-x64] 说明你主包太大需要处理了&#xff0c;一下两种方法可以…

REGX52.H报错

keil cannot open source input file "REGX52.H": No such file or directory 选择下面这个目录 Keil\C51\INC\Atmel

SpringCloudAlibaba基础四 微服务调用组件OpenFeign

JAVA 项目中如何实现接口调用&#xff1f; 1&#xff09;Httpclient HttpClient 是 Apache Jakarta Common 下的子项目&#xff0c;用来提供高效的、最新的、功能丰富的支持 Http 协议的客户端编程工具包&#xff0c;并且它支持 HTTP 协议最新版本和建议。HttpClient 相比传统 …

C语言中的文件操作

1. 为什么使⽤⽂件 如果没有文件&#xff0c;我们写的程序的数据是存储在电脑内存中的&#xff0c;如果程序退出&#xff0c;内存回收&#xff0c;数据就丢失了&#xff0c;要将数据进行持久化的保存&#xff0c;我们可以使用文件。 2. 什么是⽂件 磁盘&#xff08;硬盘&#…

springboot双学位招生管理系统-计算机毕业设计源码93054

摘 要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实运用中&#xff0c;应用软件的工作…

golang写的自动更新器

文件自动更新器&#xff0c;这个很多端游和软件都有用到的。 golang的rpc通信&#xff0c;是非常好用的一个东西&#xff0c;可以跟调用本地函数一样&#xff0c;调用远程服务端的函数&#xff0c;直接从远程服务端上拉取数据下来&#xff0c;简单便捷。 唯一的遗憾就是&#x…

(九)绘制彩色三角形

前面的学习中并未涉及到颜色&#xff0c;现在打算写一个例子&#xff0c;在顶点着色器和片元着色器中加入颜色&#xff0c;绘制有颜色的三角形。 #include <glad/glad.h>//glad必须在glfw头文件之前包含 #include <GLFW/glfw3.h> #include <iostream>void …

【DataSophon】DataSophon1.2.1服务组件开启 kerberos

目录 一、DataSophon是什么 1.1 DataSophon概述 1.2 架构概览 1.3 设计思想 二、集成组件 三、环境准备 四、安装kerberos服务 4.1 Zookeeper 4.2 HDFS 4.3 HBase 4.4 YARN 4.5 hive 【DataSophon】大数据管理平台DataSophon-1.2.1安装部署详细流程-CSDN博客 【Da…

NAT地址转换实验,实验超简单

实验拓扑 实验目的 将内网区域&#xff08;灰色区域&#xff09;的地址转换为172.16.1.0 实验过程 配置静态NAT&#xff08;基于接口的静态NAT&#xff09; R1配置 <Huawei>sys Enter system view, return user view with CtrlZ. [Huawei]sysname R1 [R1]un in en I…

从传统仓储到智能WMS:物流管理的变革

在现代经济中&#xff0c;物流管理是企业运营的关键组成部分。随着全球化和电子商务的迅猛发展&#xff0c;仓储管理的重要性愈发突出。传统的仓储管理方式已经无法满足高效、精确和快速响应的需求。为了应对这一挑战&#xff0c;智能仓储管理系统&#xff08;WMS, Warehouse M…

微软关闭中国所有线下店,并不影响全球第一

​关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 微软没有被时代淘汰&#xff0c;时代也没有告别微软!中国市场对微软可有可无&#xff0c;即便没有中国市场&#xff0c;微软市值也在全球前三&#xff0c;这是事实!a 5月中旬&#xff0c;微软azure解散中国分部…

Linux 搭建 Kafka 环境 - 详细教程

目录 一. Kafka介绍 1. 应用场景 2. 版本对比 二. Kafka安装 1. 前置环境 &#xff08;1&#xff09;安装JDK 2. 软件安装 &#xff08;3&#xff09;环境变量配置 &#xff08;3&#xff09;服务启动 三. Console测试 基础命令 &#xff08;1&#xff09;列出Kafk…

最近,被“AI”狠狠刷屏了......

最近&#xff0c;被“AI”狠狠刷屏了。 作为时下最热门的话题&#xff0c;AI画图、AI配音、AI写文案、AI做视频......AI在最近两年可谓是火遍全球。ChatGPT、Midjourney和SORA等技术不断涌现&#xff0c;不仅深刻改变着我们的生活方式&#xff0c;也推动了AI技术的飞速发展。 …

白杨SEO:打粉是啥?打粉引流怎么做?打粉引流犯法吗?小红书代发效果好吗?

文章大纲&#xff1a; 1、打粉是什么意思&#xff1f; 2、打粉有哪些方法&#xff1f; 3、打粉一般怎么变现&#xff1f; 4、打粉引流是违法犯罪吗&#xff1f; 5、小红书代发是啥&#xff1f; 6、小红书批量代发效果好吗&#xff1f; 打粉是什么意思&#xff1f; 打粉这…