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中的几种族了:系统族,可载入族,内建族。
系统族:就是一些基本建筑图元(不懂,问号脸),从开发角度看,就是有专属类的元素,如
Wall
、Column
、Duct
等等。可载入族:就是
FamilyInstance
这一类,需要用户自个儿建的,可以到处放的。族实例嘛,重点在实例
,导入到项目里,可以在项目文档
中找到,也就是像上面说的“存在于项目的项目浏览器族列表中”。内建族:其实就是特殊的
FamilyInstance
,只存在于族文档
中。从项目文档的层面看,这玩意儿就是目标实例本身的一部分,所以使用获取子组件方法获取当然找不到。
之前还在Revit社区说到获取嵌套族这个问题,写这篇记录时才发现回答得有问题,回头就去给删咯...
总结
使用类方法
获取嵌套族就够了,进入族编辑态找嵌套族,属于是特殊需求下的特殊处理方式。