因为想解析把Element的CategoryId跟FamilySymbolId解析并存下来,这样就可以还原Revit中项目浏览器,里面的族的结构层次了。
参考:Revit中“Category、Family、 Familysymbol、 FamilyInstance”之间的关系
但是对于wall和floor等无法通过以下方法获取FamilySymbolId
if (element is FamilyInstance)
{
FamilyInstance f = element as FamilyInstance;
if (f.Symbol != null)
{
strFamily = f.Symbol.FamilyName;
familyId= f.Symbol.Id.IntegerValue;
}
}
查了下才知道对于wall、floor等有自己的walltype、floortype等,这些个type是和familysymbol一个级别的。再查了下revit的api文档,发现他们这些个都是继承自HostObjAttributes,是系统族;而familysymbol继承自InsertableObject,是标准族。
可参考:BKM • Revit二次开发04—Revit二次开发的简单说明 - 知乎
但是系统族和标准族都继承自ElementType,因此需要用ElementType来读取数据。
ElementType familySymbol = document.GetElement(element.GetTypeId()) as ElementType;
if (familySymbol != null)
{
strFamily = familySymbol.FamilyName;
familyId = familySymbol.Id.IntegerValue;
}
试了一下,都顺利读出来了。