Revit获取元素的嵌套族

Revit获取元素的嵌套族

前言

在Revit插件开发过程中,有时有获取元素的嵌套族的需要,这里记录一下开发过程中,遇到的关于嵌套族获取方面问题和处理方法。


获取元素嵌套族

使用类方法获取

首先我们知道,嵌套族只在FamilyInstance类型元素中才存在。

通过查看Revit API,可以发现该类下有个获取族子组件的方法。

// FamilyInstance.GetSubComponentIds Method 
public ICollection<ElementId> GetSubComponentIds()

同时,通过插件RevitLookup,也能直观的看到元素的组成情况。

说到这里,就有问题了。

开发过程中,发现这样获取到的不全,部分元素的嵌套族没有全部获取到。

检查发现:只有当被引用嵌套的族存在于项目项目浏览器族列表中时,该族才能通过GetSubComponentIds方法获取到。

进入族编辑态检索

通常情况下,上面的那种方法已经够用了,但有时就是需要所有嵌套族都要拿到。这时就需要采用另一种方法了

进入族的编辑态,检索FamilyInstance类型元素。

// 伪代码
Document familyDoc = document.EditFamily(familyInstance.Symbol.Family);  // 进入元素族编辑态

FilteredElementCollector collector = new FilteredElementCollector(familyDoc);  // 过滤器

List<FamilyInstance> instances = collector.OfClass(typeof(FamilyInstance)).Cast<FamilyInstance>().ToList();

当前文档是不是族文档,可以通过属性IsFamilyDocument判断。

当然了,被嵌套族可能本身也含有嵌套族,若是需要,采用递归还是迭代方式获取就看个人喜好了。

有何不同

既然存在这两种方法,那么有问题了,这两种方法有什么不同呢?

这就得提到Revit中的几种族了:系统族,可载入族,内建族。

系统族:就是一些基本建筑图元(不懂,问号脸),从开发角度看,就是有专属类的元素,如WallColumnDuct等等。

可载入族:就是FamilyInstance这一类,需要用户自个儿建的,可以到处放的。族实例嘛,重点在实例,导入到项目里,可以在项目文档中找到,也就是像上面说的“存在于项目的项目浏览器族列表中”。

内建族:其实就是特殊的FamilyInstance,只存在于族文档中。从项目文档的层面看,这玩意儿就是目标实例本身的一部分,所以使用获取子组件方法获取当然找不到。

之前还在Revit社区说到获取嵌套族这个问题,写这篇记录时才发现回答得有问题,回头就去给删咯...


总结

使用类方法获取嵌套族就够了,进入族编辑态找嵌套族,属于是特殊需求下的特殊处理方式。

posted @ 2024-03-19 00:56  杂鱼Tong  阅读(26)  评论(0编辑  收藏  举报