理解Revit中“Category、Family、 Familysymbol、 FamilyInstance”四者之间的关系与区别

Revit中的Category、Family、FamilySymbol与FamilyInstance

在Revit中除了Category这个概念以外,还有Family、FamilySymbol、FamilyInstance这三个相关的概念。这里通过一张图来说明我对这四个概念的理解:



又如风管类别里面四者的关系:
风管 - 类别(Category)
圆形风管 - 族(Family)
T形三通 - 族类型(FamilySymbol)
画出来的图元 - 族实例(FamilyInstance)

在Revit二次开发中,可以用FilteredElementCollector、OfClass、OfCategory等方法来获取族实例、族类型,如
FilteredElementCollector collector = new FilteredElementCollector(m_document.Document);
                //获取门实例
                collector.OfCategory(BuiltInCategory.OST_Doors).OfClass(typeof(FamilyInstance));
                IList<Element> instancelists = collector.ToElements();
                //获取门类型
                collector.OfCategory(BuiltInCategory.OST_Doors).OfClass(typeof(FamilySymbol));
                IList<Element> symbollists = collector.ToElements();
                //获取门族
                collector.OfCategory(BuiltInCategory.OST_Doors).OfClass(typeof(Family));
                IList<Element> Familylists = collector.ToElements();

同时,在Revit二次开发中,类别、族、族类型和族实例也可以相互获取

例如,从族实例获取族类型:

 FamilyInstance familyInstance = item as FamilyInstance;
                    FamilySymbol familysymbol=familyInstance.Symbol;

从族类型获取族的方式如下:

 Family family=familysymbol.Family;




### 关于Revit API中`FamilyInstance`和`Element` #### `Element` 类概述 在Revit环境中,几乎所有的图形对象都继承自基类`Element`[^2]。此基类提供了基本属性和方法来操作这些对象,例如获取元素ID、名称以及删除元素等功能。 对于开发者而言,理解`Element`的重要性在于它是所有可见建筑构件的基础——墙壁、门窗、梁柱等均属于此类别下的具体实现形式之一。由于其核心地位,在进行任何深入的应用程序接口(API)编程之前掌握有关它的基础知识至关重要。 ```csharp // 获取当前文档中的所有元素 var collector = new FilteredElementCollector(doc); IList<Element> elements = collector.Cast<Element>().ToList(); ``` #### `FamilyInstance` 继承关系及其特性 特别地提到`FamilyInstance`,这是从`Element`派生出来的一个特定类别,用来描述放置在一个模型内的单个族实例化版本[^1]。这意味着每当用户向设计图纸上添加像家具这样的组件时,实际上就是在创建一个新的`FamilyInstance`对象;而这个对象又会关联到定义该物件外观特征的模板(`Family`)其具体的变体规格(`FamilySymbol`)。 值得注意的是,虽然两者之间存在紧密联系,但是区分清楚什么是家族本身(即原型),什么又是实际存在于场景里的个体表现非常重要: - **Family**: 定义了一组具有相似几何形状或功能特性的物体集合; - **FamilySymbol (ElementType)**: 表示上述集合内某一成员的具体配置参数集; - **FamilyInstance**: 是指基于某个给定类型的实体副本,并且可以拥有自己独特的定位和其他局部调整。 因此,在编写涉及修改现有布局或是新增装饰品之类的脚本时,通常需要先找到合适的`FamilySymbol`再据此生成新的`FamilyInstance`。 ```csharp // 创建新 FamilyInstance 的例子 LocationPoint location = ...; // 设置位置点 XYZ normal = XYZ.BasisZ; // 正常方向,默认为 Z 轴向上 View view = doc.ActiveView; using (Transaction trans = new Transaction(doc)) { trans.Start("Add New Instance"); FamilySymbol symbol = GetSelectedFamilySymbol(); // 假设有一个函数能返回选定的 FamilySymbol if (!symbol.IsActive) symbol.Activate(); FamilyInstance instance = doc.Create.NewFamilyInstance(location.Point, symbol, view); trans.Commit(); } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值