今天我们来聊聊 Revit 元素这点事,不仅仅是在 Dynamo Python 之中涉及,我们在日常使用 Revit 的时候,也涉及这个问题,只是对我们日常画图没什么影响,所以很多人并没太在意这块。
Revit Elements 分为六个组:
-
-
- 模型元素 :代表建筑项目中存在的物理项。“模型元素” 组中的元素可以细分为以下内容:
-
-
-
-
- 族实例:包含族实例对象。您可以将族对象加载到项目中,或从族模板创建它们;
- 主体元素:包含可以包含其他模型元素(例如,墙,屋顶,天花板和地板)的系统族对象;
- 结构元素:包含仅在 Revit Structure 中使用的元素。
-
-
-
-
- 草图元素 :代表用于 2D/3D 草图的临时项目:
-
-
-
-
- 草图平面
- 草图
- 3D 路径
-
-
-
-
- 视图元素:表示您在 Revit 中查看和与其他对象交互的方式。
- 组元素:代表 Revit 中的辅助图元,例如数组和组对象。
- 注释和数据元素:包含可见的非物理项。
- 信息元素:包含用于存储项目和应用程序数据的非物理不可见项:
-
-
-
-
- 项目基准图元
-
-
每个组包含相关的元素及其对应的符号。
图元也按以下分类:
-
-
- 类别
- 族
- 符号
- 实例
-
那我们 Dynamo Python 涉及到的呢,主要有一下几个应用:
从实例上移到类别:
instanceElement = UnwrapElement(IN[0])
OUT = instanceElement.Symbol, instanceElement.Symbol.Family, instanceElement.Symbol.Category.Name
要选择所有族类型,我们可以使用 FilteredElementCollector.ToElements() 检索 Revit 元素:
collector = FilteredElementCollector(doc).OfClass(FamilySymbol)
OUT = collector.ToElements()
要在给定类别 ID 的情况下选择类别的所有族类型:
collector = FilteredElementCollector(doc)
bic = System.Enum.ToObject(BuiltInCategory, -2001320)
collector.OfCategory(bic)
OUT = collector.ToElements()
等效于:
collector = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Walls).ToElements()
如果只想选择实例,则需要添加 WhereElementIsNotElementType():
collector = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Walls).WhereElementIsNotElementType().ToElements()
要从 “族类型” 中选择所有元素,我们需要:
-
-
- 查找 “家庭类型” 所属的类别 ID
- 选择该类别的所有元素[collector.OfCategory(bic)]
- 寻找与家庭类型具有相同 TypeId 的元素
-
doc = DocumentManager.Instance.CurrentDBDocument
famtypes = UnwrapElement(IN[0])
elementlist = list()
for ft in famtypes:collector = FilteredElementCollector(doc)bic = System.Enum.ToObject(BuiltInCategory, ft.Category.Id.IntegerValue)collector.OfCategory(bic)for item in collector.ToElements():if item.GetTypeId().IntegerValue == ft.Id.IntegerValue:elementlist.append(item)#elementlist.append(ftlist)
OUT = elementlist