首先以门为例子说明这四者之间的关系
其实在Revit中有个项目浏览器,里面的族的结构层次就说明这个关系:
至于在代码中如何取到对应的元素中的“Category、Family、 Familysymbol、 FamilyInstance”,首先建议使用Revit中的Lookup插件看一下这个元素属于这四个里面的什么,再使用过滤器去取
实例代码,取出文档中的门
public void GetCategory() { //获取门实例 FilteredElementCollector collecter = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Doors).OfClass(typeof(FamilyInstance)); IEnumerable<Element> eles = collecter.ToElements(); //获取门类型 FilteredElementCollector collecterSymbol = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Doors).OfClass(typeof(FamilySymbol)); IEnumerable<Element> eleS = collecterSymbol.ToList(); //获取门族(有的族可能没有Category,会导致取不到) FilteredElementCollector collecterFamily = new FilteredElementCollector(doc).OfClass(typeof(FamilySymbol)).OfCategory(BuiltInCategory.OST_Doors); IEnumerable<Element> eleF = collecterFamily.ToList(); string strIns=" 实例:"; foreach (var item in collecter) { strIns += item.Name + ","; } string strSym = " 类型:"; foreach (var item in eleS) { strSym += item.Name + ","; } string strFam = " 族:"; HashSet<string> setF = new HashSet<string>(); foreach (var item in eleF) { FamilySymbol symbol = item as FamilySymbol; if(setF.Add(symbol.FamilyName)) strFam += symbol.FamilyName + ","; } TaskDialog.Show("显示", strIns + strSym + strFam); }
在上面的代码其实取出族的时候应该使用过滤
OfClass(typeof(Family))
但是在实际使用中我发现门的Family中Category是null,这就导致了无法根据Category找到门,但是FamilySymbol和Family一定是强关联关系,因此可以通过FamilySymbol找到Family.
补充说明:像墙对象
里面的WallType对应的就是FamilySymbol这两个是属于同级关系,是Revit对墙对象做的代码细化,墙就是没有FamilySymbol这个东西的,只有WallType对象。