惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google Online Security Blog
Google Online Security Blog
博客园_首页
酷 壳 – CoolShell
酷 壳 – CoolShell
Jina AI
Jina AI
博客园 - Franky
大猫的无限游戏
大猫的无限游戏
Hugging Face - Blog
Hugging Face - Blog
博客园 - 司徒正美
V
V2EX
雷峰网
雷峰网
云风的 BLOG
云风的 BLOG
V
Visual Studio Blog
F
Full Disclosure
Y
Y Combinator Blog
V
V2EX - 技术
Attack and Defense Labs
Attack and Defense Labs
S
Security @ Cisco Blogs
Schneier on Security
Schneier on Security
Microsoft Azure Blog
Microsoft Azure Blog
SecWiki News
SecWiki News
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
The GitHub Blog
The GitHub Blog
量子位
PCI Perspectives
PCI Perspectives
S
Secure Thoughts
D
Darknet – Hacking Tools, Hacker News & Cyber Security
AWS News Blog
AWS News Blog
Blog — PlanetScale
Blog — PlanetScale
爱范儿
爱范儿
K
Kaspersky official blog
B
Blog
A
Arctic Wolf
Hacker News: Ask HN
Hacker News: Ask HN
L
LangChain Blog
T
Tor Project blog
P
Privacy & Cybersecurity Law Blog
Recent Announcements
Recent Announcements
宝玉的分享
宝玉的分享
The Register - Security
The Register - Security
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
L
Lohrmann on Cybersecurity
D
Docker
A
About on SuperTechFans
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Google DeepMind News
Google DeepMind News
The Last Watchdog
The Last Watchdog
S
Security Affairs
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
P
Privacy International News Feed
Simon Willison's Weblog
Simon Willison's Weblog

博客园 - 愚

Revit:二开使用Sqlite保存本地数据,并配合EF6等ORM框架 Revity:查找并修改类型参数和实例参数 复习一下UML Revit:ElementFilter过滤器基类 Revit:Element、Reference、ReferenceIntersector、ReferenceWithContext的理解 Revit:使用代码如何发出选点、选对象指令 Revit:Transaction事务 Revit:弄清楚Application、UIApplication、UIDocument 、Document、DocumentSet之间的关系 Revit:IExternalCommand和IExternalApplication的区别 什么是假程序员 若我有一天 聊聊面试官那些事。。分享我的个人看法,认同的顶一顶。。。 提供一个中国身份证号码判断的类 分享一个自己写的取中国农历相关数据的类。包含:农历年月日,生肖,星座,年龄,天干,地支等方法 从结亲网 的架构谈起,谈什么架构, 我理解的架构。我想很多人理解的架构应该可能比较 狭义 面向对象的全套“企业微信”api接口的代码实现,网上太多“面向过程”微信api接口的代码,这个开源给需要的人用 解决:百度编辑器UEditor,怎么将图片保存到图片服务器,或者上传到ftp服务器的问题(如果你正在用UE,这篇文章值得你看下) (原创)面向对象的系统对接接口编写。第5篇(完结) (原创)面向对象的系统对接接口编写。第4篇
Reivt:过滤器FilteredElementIterator,采集器FilteredElementCollector
· 2020-07-21 · via 博客园 - 愚

事先说明,由于本人是刚接触Revit,所有知识点,都是我自己一边研究一边写的。所以,可能是有错误的,若有错误,还望指正和海涵。

题目的这2个东西,如果你懂设计模式的迭代模式的话,是极其容易理解的。

他们分别继承实现了微软框架官方接口:IEnumerator、IEnumerable。

简单说一下迭代模式,它需要声明两种接口,一种接口是表明可以被枚举:IEnumerable,另一种接口是要表明这是一个枚举器。可以被枚举 和 枚举器,是不一样的概念。只要搞清楚这2个概念,那么迭代模式是很简单的。任何一个类,不能同时实现这2个接口,即:任何一个类不能既是可以被枚举,然后又还是枚举器。他们一定是分开的。至于为什么一定是分开的,那么就是你的面向对象的基础问题,这个我就不培训你了。

好了,那么按迭代模式来看Revit这个过滤器和采集器。过滤器FilteredElementIterator就是表明可以被枚举,采集器FilteredElementCollector就是枚举器(或者也叫迭代器)。

他们的源码如下:

从上面的源码中可以看到,这个Revit过滤器是一个很有意思的东西, 

public FilteredElementCollector(Document document);他的构造函数全部都是Document对象。之前文章有说过Document对象可能是最具体的文档对象了,他里面可以访问当前文档的所有选中的元素。

public FilteredElementCollector(Document document, ElementId viewId);同样的,这个构造函数,估计是指选中的视图ViewId下的Document对象。

public FilteredElementCollector(Document document, ICollection<ElementId> elementIds);这个就有点不好理解了,由于我没有写过Revit二开的代码,所以,不好说这2个参数之间是什么关系。你看前者是当前文档选中的元素,后一个参数是元素id的集体,难道是二者的交集,又或者是并集?这可能需要实际在代码里操作一遍看一下结果,才知道二者之间的关系了。 

再看这个过滤器的具体方法,会更有意思,从字面上,我们可以看出来,它还提供了类似OfClass、OfCategory、WhereElementIsElementType、WhereElementIsViewIndependent的二次过滤,然后再返回可枚举的结果集合。

通常,每一个可枚举的对象,都会提供一个GetElementIterator()方法,让你直接得到枚举器对象。实际上这是微软框架接口已经定好必须实现的方法。

 那么好,上面说的是这个过滤器可以枚举,这仅仅是得到了集合结果。我们还需要一个枚举器(迭代器)来访问它,那么就用FilteredElementIterator就可以了。他提供了集合数据的访问操作方式,如MoveNext、Reset等。

枚举器有一个很重要的地方,就是他的构造函数是不可以访问的。那么怎么办呢?通过可枚举的类来调用GetElementIterator()方法得到枚举器即可。