Revit二次开发之通过过滤器获取元素(第六期)

2022-04-21 12:04:51 浏览数 (1)

上一期我们讲了如何通过UI界面的进行元素的选择,但很多时候我们希望插件能够快速的获取元素并进行相对应的操作,省去人工的麻烦,毕竟我们共同拥有一个毛病——懒,所以这一期我们就讲讲过滤器的用法。(小编码了半天结果被浏览器那好家伙给糟蹋了,可惜了那篇文章。)


有部分粉丝说不是看得很懂,所以小编就想换个方式写文章,把代码拆开讲。

获得元素的办法:

创建一个收集器(Collector)

代码语言:javascript复制
FilteredElementCollector fil = new FilteredElementCollector(doc);

这里举个栗子: 你妈刚从超市买了过年要吃的蚕豆和绿豆,结果被你个混小子打破袋子,全都掉在地上混在一起,你妈要你马上给她整理好,你天资聪慧不想一颗一颗去捡,想了一个好办法就是用筛子筛选出来,那么我们要先把散落在地上的大豆和绿豆用簸箕扫起来,收集器在这里就是簸箕的作用,把散落在doc的构件收集起来装在fil这个容器里。

创建一个过滤器

代码语言:javascript复制
ElementClassFilter el = new ElementClassFilter(typeof(Wall));(类过滤器)

过滤器就是我们的筛子,可以用来筛选蚕豆和绿豆,留下你想要的。当然筛子的种类有多种多样,我们的API同样提供了多种筛子。 ElementCategoryFilter eld = new ElementCategoryFilter(BuiltInCategory.OST_Doors);(类别过滤器) 过滤好了以后,要拿出来你需要的东西,那么我们需要进行获取。 (1)调用 fil.WherePasses( ); fil.WherePasses(el);这样我们就获取了收集器fil中的墙的类型。

fil2.WherePasses(el2);我们获取了收集器fil2里的所有的门。

有些人可能会有疑问,或者会犯这种错误:在同一个收集器里调用两次.WherePasses( ),这会造成一个问题你所取得的构件是0个。因为收集器你筛选一遍获得墙之后,你再去筛选就只剩下墙了,你不可能再去筛选出来门。可你能从墙里再筛选出来叠层墙。这就像你在猪圈里能找到猪,在猪里能找到小黑猪,但你肯定找不到驴,是一个道理。(可能比喻不够恰当,但就是这个理。)

(2)利用逻辑过滤器

代码语言:javascript复制
  ElementClassFilter el = new ElementClassFilter(typeof(FamilyInstance));(过滤出族实例)
            ElementCategoryFilter eld = new ElementCategoryFilter(BuiltInCategory.OST_Windows);(过滤出窗户)

利用逻辑过滤器来过滤族实例里的窗户:

代码语言:javascript复制
            LogicalAndFilter door = new LogicalAndFilter(el, eld);

(3)of的简便方法

利用of来获取墙:

代码语言:javascript复制
  fil.OfClass(typeof(Wall));

利用of来获取窗户:

代码语言:javascript复制
  fil.OfClass(typeof(FamilyInstance)).OfCategory(BuiltInCategory.OST_Windows);

我们可以发现利用of的简便方法可以很快很简单的取得想要的元素,把好几行代码一下子省略成了一行。所以我推荐大家用of的简便方法来写代码,因为我们都有一个特点——懒。科技之所以会进步是有我们这么一群懒人的存在吧。

代码的运行效果我就不演示啦,小伙伴们自己去尝试吧!


一纸清墨书过往,谁人勘破这离殇。

精讲Revit二次开发,望与君交。

0 人点赞