13族实例
族实例
在本节中,您将了解以下内容:
- 族与族实例的关系
- 族和族实例特征
- 如何载入或创建族和族实例特征
- 族实例与族符号的关系
本节中的页面
- Identifying Elements 识别元素
- FamilyInstances 族实例
- Code Samples 代码示例
- FamilySymbol 族符号
- Family 族
识别元素
在Revit中,判断元素是否为FamilyInstance的最简单方法是使用属性对话框。
- 如果族名称以“系统族”开头,并且禁用了“载入”按钮,则该族属于“系统族”。
图41:系统族
- 属于构件族的常规FamilyInstance不以System Family开头。
- 例如,在下图中,桌子家具的族名为Desk。此外,还启用了“加载”按钮。
图42:组件族
有一些例外,例如:体量和内建成员。“族”和“类型”字段为空。
图43:体量或内建构件示例
Revit Platform API中的族由三个对象表示:
- Family
- FamilySymbol
- FamilyInstance
每件对象在族结构中都起着重要的作用。
“族”对象表示整个族,例如单平面门。例如,“单面齐平门族”对应于“单面齐平.rfa”文件。Family对象包含多个FamilySymbols,用于获取所有族符号,以便于将实例从一个符号切换到另一个符号。
FamilySymbol对象表示与Revit UI中的“类型”(例如34”×80”)相对应的一组特定族设置。
FamilyInstance对象表示Revit项目中的实际Type(FamilySymbol)实例。例如,在下图中,FamilyInstance是项目中的一扇门。
- 每个FamilyInstance都有一个FamilySymbol。门是一个34”×80”的实例。
- 每个FamilySymbol都属于一个Family。34”×80”符号属于单齐平系列。
- 每个族都包含一个或多个族符号。单齐平系列包含34”×80”符号、34”×84”符号、36”×84”等。
注意:虽然大多数组件元素都是通过API类FamilySymbol和FamilyInstance公开的,但也有一些是用特定的API类包装的。例如,AnnotationSymbolType包装FamilySymbol,AnnotationSymbol包装FamilyInstance。
族实例
FamilyInstance对象包括梁、支撑、柱、家具、体量等。FamilyInstance对象提供了更详细的属性,以便可以更改项目中的族实例类型和外观。
位置相关属性
与位置相关的属性显示FamilyInstance对象的物理和几何特征,如方向、旋转和位置。
Orientation 朝向
对于某些FamilyInstance对象,可以更改面方向或手方向。例如,门可以面向房间或墙壁的外部或内部,并且可以将把手放置在左侧或右侧。下表比较了门、窗和桌子族实例。
表29:比较族实例
Boolean Property 布尔属性 | Door 门 | **Window (Fixed: 36”w × 72”h) ** | Desk 书桌 |
---|---|---|---|
CanFlipFacing | True | True | False |
CanFlipHand | True | False | False |
如果CanFlipFacing或CanFlipHand为true,则可以分别调用flipFacing()或flipHand()方法。这些方法可以分别改变面向方向或手方向。否则,这些方法不执行任何操作并返回False。修改方向时,请记住某些类型的窗可以同时修改手方向和面方向,例如带Trim的3x3平开窗族。门有四种不同的朝向和手方向组合。请参见下图中的组合,下表中列出了相应的布尔值。
图44:具有不同面方向和手方向的门
表30:相同类型的不同饰面
Boolean Property 布尔属性 | **Door 1 ** | **Door 2 ** | **Door 3 ** | **Door 4 ** |
---|---|---|---|---|
FacingFlipped | False | True | False | True |
HandFlipped | False | True | True | False |
Orientation - Work Plane 方位-工作平面
也可以更改FamilyInstance的工作平面方向。如果CanFlipWorkPlane为true,则可以设置IsWorkPlaneFlipped属性。尝试为不允许翻转工作平面的FamilyInstance设置此属性将导致异常。
Rotation - Mirrored 旋转-镜像
镜像属性指示FamilyInstance对象是否已镜像。
表31:门镜像属性
Boolean Property 布尔属性 | **Door 1 ** | **Door 2 ** | **Door 3 ** | **Door 4 ** |
---|---|---|---|---|
Mirrored | False | False | True | True |
在前面的门示例中,Door 1和Door 2的Mirror属性为False,而Door 3和Door 4的Mirror属性均为True。这是因为在Revit项目中创建门时,默认结果为“门1”或“门2”。要创建类似“门3”或“门4”的门,必须分别翻转“门1”和“门2”的方向。翻转操作类似于镜像变换,这就是为什么“门3”和“门4”镜像属性为True。 有关在Revit中使用Mirror()方法的详细信息,请参阅“编辑图元”一章。 #### Rotation - CanRotate和rotate() 族实例布尔CanRotate属性用于测试族实例是否可以旋转180度。这取决于实例所属的族。例如,在下面的图片中,Window 1(Casement 3×3 with Trim:36”×72”)和Door 1(Double-Glass 2:72”×82”)的CanRotate属性为true,而Window 2(Fixed:36“w × 72“h)的CanRotate属性为false。
图45:旋转后的变化
如果CanRotate为true,则可以调用族实例rotate()方法,该方法将族实例翻转180度。否则,该方法不执行任何操作并返回False。上图还显示了执行rotate()方法后的Window 1和Door 1状态。 回想一下本文档前面的旋转图元部分,可以使用ElementTransformUtils.RotateElement()和ElementTransformUtils.RotateElements()将族实例(和其他图元)旋转用户指定的角度。
位置 Location属性确定实例在项目中的物理位置。实例可以具有点位置或线位置。 以下特征适用于位置:
点位置是LocationPoint类对象-基础、门或桌子都有点位置
线位置是LocationCurve类对象-梁具有线位置。 * 它们都是Location类的子类。 有关位置的详细信息,请参阅编辑元素。
Host和HostFace Host和HostFace都是FamilyInstance属性。
Host FamilyInstance对象有一个返回其宿主元素的Host属性。 某些FamilyInstance对象没有宿主元素,如Tables和其他家具,因此Host属性不返回任何内容,因为没有创建主体元素。但是,其他对象(如门和窗)必须具有宿主图元。在这种情况下,Host属性返回窗或门所在的墙元素。请参见下图。
图46:以墙为主体的门和窗
HostFace HostFace属性获取对族实例的宿主面的参照,或者如果实例放置在工作平面上,则获取对工作平面下面的几何图形面的参照。如果工作平面未参照其他几何图形,或者实例未以面或工作平面为宿主,则此属性将返回空参照。
子组件和超级组件 FamilyInstance. GetSubmenentIds()方法返回加载到该族中的族实例的ElementIds。将“Table-Dining Round w Chairs.rfa”的实例放置在项目中时,GetSubmenuentIds()方法将返回椅子集的ElementIds。 SuperComponent属性返回族实例的父构件。在“Table-Dining Round w Chairs. rfa”中,每个嵌套椅子的族实例超级组件都是“Table-Dining Round w Chairs. rfa”的实例。
代码区域12-1:从FamilyInstance获取子组件和超级组件
1 | public void GetSubAndSuperComponents(FamilyInstance familyInstance) |
几何
有时,FamilyInstance对象的几何图形会通过连接、剪切、顶盖、延伸或其他在Revit中进行的后期处理进行修改。FamilyInstance.HasModifiedGeometry()方法标识此FamilyInstance的几何图形是否已从自动生成的默认值修改。GetOriginalGeometry()方法将返回实例的原始几何体,该几何体在可能发生任何修改之前。若要获取实例的当前几何体,请使用从Element类继承的Geometry属性。
空间元素计算点
FamilyInstance具有多个成员,用于直接从族实例中阅读有关空间计算点的信息。HasSpatialElementCalculationPoint属性标识此实例是否有一个SpatialElementCalculationPoint用作Revit的搜索点,以标识实例是否位于房间或空间内。如果为true,GetSpatialElementCalculationPoint()方法将返回此实例的计算点的位置作为XYZ点。
HasSpatialElementFromToCalculationPoints属性标识此实例是否具有一对SpatialElementCalculationPoints,它们用作Revit的搜索点,以标识实例是否位于最多两个房间或空间之间。对于连接两个房间或空间(如门或窗)的族实例,这些点确定哪个房间或空间被视为“从”,哪个被视为“到”。当此属性为true时,GetSpatialElementFromToCalculationPoints()方法将此实例的计算点的位置作为XYZ点的列表返回。
其它属性
本部分中的属性特定于Revit的建筑和结构工程功能。它们在各自的章节中都有详细介绍。
房间信息
FamilyInstance属性包括Room、FromRoom和ToRoom。有关房间的详细信息,请参阅建筑。
空间信息
FamilyInstance有一个Space属性,用于标识MEP中保存实例的空间。
结构分析模型
GetAnalyticalModel()方法检索族实例结构分析模型。
有关分析模型的详细信息,请参阅结构工程。
创建FamilyInstance对象
通常,FamilyInstance对象是使用Autodesk.Revit.Creation.Document的12种重载方法之一NewFamilyInstance()创建的。选择使用哪个重载不仅取决于实例的类别,还取决于放置的其他特征,例如是否应将其作为主体、相对于参照标高放置或直接放置在特定面上。详细信息包含在下面的表32 -使用NewFamilyInstance()创建实例的选项中。
某些FamilyInstance对象需要创建多个位置。在这些情况下,使用此对象提供的更详细的创建方法更合适(请参见表33 -使用其他方法创建实例的选项)。如果未创建实例,则会引发异常。在调用该方法之前,必须将使用的类型/符号加载到项目中。
检查NewFamilyInstance()的所有重载以确保输入FamilySymbol处于活动状态(FamilySymbol.IsActive)。如果输入FamilySymbol处于非活动状态,则该方法将抛出ArgumentException。文档中未使用的符号可能会被停用,以节省内存和再生时间。当符号处于非活动状态时,其几何图形为空,无法访问。为了访问文档中未激活的符号的几何图形,应首先通过调用FamilySymbol.Activate()来激活该符号。
表32 -使用NewFamilyInstance()创建实例的选项
Category 类别 | NewFamilyInstance() parameters NewFamilyInstance()参数 | Comments注解 |
---|---|---|
Air Terminals Boundary Conditions Casework Communication Devices Data Devices Electrical Equipment Electrical Fixtures Entourage Fire Alarm Devices Furniture Furniture Systems Generic Models Lighting Devices Lighting Fixtures Mass Mechanical Equipment Nurse Call Devices Parking Planting Plumbing Fixtures Security Devices Site Specialty Equipment Sprinklers Structural Connections Structural Foundations Structural Stiffeners Telephone Devices | XYZ, FamilySymbol, StructuralType | 在任意位置创建实例,而不参照标高或宿主元素。 |
XYZ, FamilySymbol, Element, StructuralType | 如果要在墙壁、地板或天花板上承载 | |
XYZ, FamilySymbol, XYZ, Element, StructuralType | 如果要以墙、楼板或天花板为主体,并且需要以非默认方向, | |
XYZ, FamilySymbol, Element, Level, StructuralType | 如果要以墙、楼板或天花板为宿主并与参照标高关联, | |
XYZ, FamilySymbol, Level, StructuralType | 如果要将其关联到参考标高 | |
Face, XYZ, XYZ, FamilySymbol XYZ, | 如果它是基于面的并且需要以非默认方向, | |
Reference, XYZ, XYZ, FamilySymbol | 如果它是基于面的,并且需要以非默认方向,则接受对面的引用,而不是对Face | |
Face, Line, FamilySymbol | 如果它是基于面和线的 | |
Reference, Line, FamilySymbol | 如果它是基于面和线的,但接受对面的引用,而不是面 | |
Columns Structural Columns | XYZ, FamilySymbol, Level, StructuralType | 创建柱,使其底部位于参照标高上。柱将延伸到模型中的下一个可用标高,或者如果参照标高之上没有合适的标高,则将延伸默认柱高。 |
Doors Windows | XYZ, FamilySymbol, Element, StructuralType | 门和窗必须以墙为宿主。如果可以使用默认方向放置它们,请使用此方法。 |
XYZ, FamilySymbol, XYZ, Element, StructuralType | 如果创建的实例需要以非默认方向 | |
XYZ, FamilySymbol, Element, Level, StructuralType | 如果实例需要关联到参照标高 | |
Structural Framing (Beams, Braces) | Curve, FamilySymbol, Level, StructuralType | 根据其曲线创建基于标高的支撑或梁。这是创建梁和支撑的推荐方法 |
XYZ, FamilySymbol, StructuralType | 在任意位置创建实例 | |
XYZ, FamilySymbol, Element, Level, StructuralType | 如果它位于图元(地板等)上,并与参考标高相关联 | |
XYZ, FamilySymbol, Level, StructuralType | 如果它与参考标高相关联, | |
XYZ, FamilySymbol, Element, StructuralType | 如果它位于图元(地板等)上 | |
Detail Component | Line, FamilySymbol, View | 仅限于基于二维族线的详图符号 |
Generic Annotations | XYZ, FamilySymbol, View | 仅显示为二维族符号 |
结构实例在创建后长度为零。通过使用LocationCurve.Curve属性设置其曲线(FamilyInstance.Location为LocationCurve)来扩展它。
通过使用Document.NewFamilyList()一次创建多个族实例,可以简化代码并提高性能。此方法有一个参数,该参数是描述要创建的族实例的FamilyInstanceCreationData对象的列表。
代码区域12-2:批量创建族实例
1 | ICollection BatchCreateColumns(Autodesk.Revit.DB.Document document, Level level) |
某些族类型的实例最好通过Autodesk.Revit.Creation.Document.NewFamilyInstance()以外的方法创建。这些列于下表。
表33 -使用其他方法创建实例的选项
Category 类别 | Creation method 创建方法 | Comments |
---|---|---|
Air Terminal Tags Area Load Tags Area Tags Casework Tags Ceiling Tags Communication Device Tags Curtain Panel Tags Data Device Tags Detail Item Tags Door Tags Duct Accessory Tags Duct Fitting Tags Duct Tags Electrical Equipment Tags Electrical Fixture Tags Fire Alarm Device Tags Flex Duct Tags Flex Pipe Tags Floor Tags Furniture System Tags Furniture Tags Generic Model Tags Internal Area Load Tags Internal Line Load Tags Internal Point Load Tags Keynote Tags Lighting Device Tags Lighting Fixture Tags Line Load Tags Mass Floor Tags Mass Tags Mechanical Equipment Tags Nurse Call Device Tags Parking Tags Pipe Accessory Tags Pipe Fitting Tags Pipe Tags Planting Tags Plumbing Fixture Tags Point Load Tags Property Line Segment Tags Property Tags Railing Tags Revision Cloud Tags Roof Tags Room Tags Security Device Tags Site Tags Space Tags Specialty Equipment Tags Spinkler Tags Stair Tags Structural Area Reinforcement Tags Structural Beam System Tags Structural Column Tags Structural Connection Tags Structural Foundation Tags Structural Framing Tags Structural Path Reinforcement Tags Structural Rebar Tags Structural Stiffener Tags Structural Truss Tags Telephone Device Tags Wall Tags Window Tags Wire Tag Zone Tags on Tags Structural Foundation Tags Structural Framing Tags Structural Path Reinforcement Tags Structural Rebar Tags Structural Truss Tags Telephone Device Tags Wall Tags Window Tags Wire Tag Zone | IndependentTag.Create(Document, ElementId, Reference, Boolean, TagMode, TagOrientation, XYZ) | TagMode should be TM_ADDBY_CATEGORY and there should be a related tag loaded when try to create a tag,otherwise exception will be thrown(当尝试创建一个标记时,应该有一个相关的标签载入家庭) |
Material Tags | IndependentTag.Create(Document, ElementId, Reference, Boolean, TagMode, TagOrientation, XYZ) | TagMode应为TM_ADDBY_MATERIAL,并且应加载材质标签族,否则将引发异常 |
Multi-Category Tags | IndependentTag.Create(Document, ElementId, Reference, Boolean, TagMode, TagOrientation, XYZ) | TagMode应为TM_ADDBY_MULTICATEGORY,并且应加载多类别标记族,否则将抛出异常 |
Title Blocks | ViewSheet.Create(Document, ElementId) | 标题栏将添加到新创建的图纸中。 |
使用Document.LoadFamily()或Document.LoadFamilySymbol()方法加载族和族符号。某些族(如梁)具有多个端点,插入方式与插入单个点实例的方式相同。插入线性族实例后,可以使用Element.Location属性更改其端点。有关详细信息,请参阅代码示例。
代码示例
用于使用Family Data的代码示例。
有关使用Family Object的详细信息,请查看以下代码示例。请注意,在NewFamilyInstance()方法中,需要StructuralType参数来指定要创建的族实例的类型。以下是一些示例:
表34:NewFamilyInstance()方法中StructuralType参数的值
Type of Family Instance 族实例的类型 | Value of StructuralType StructuralType的值 |
---|---|
Doors, tables, etc. 门、桌子等 | NonStructural 非结构 |
Beams 梁 | Beam 梁 |
Braces 支撑 | Brace 支撑 |
Columns 柱 | Column 柱 |
Footings 基础 | Footing 基础 |
创建桌
以下函数演示了如何将表族加载到Revit项目中,以及如何从该族中的所有符号创建实例。
如果指定的族以前已加载,则LoadFamily()方法返回false。因此,在以下情况下,在调用此函数之前,不加载族Table-Dining Round w Chairs.rfa。在本例中,默认情况下,桌是在标高1创建的。
代码区域12-3:创建桌
1 | void CreateTables(Autodesk.Revit.DB.Document document) |
加载桌族并放置每个FamilySymbol的一个实例的结果:
图47:在Revit项目中加载族并创建表格
创建Beam
在此示例中,加载的是族符号而不是族,因为加载单个FamilySymbol比加载包含许多FamilySymbol的族要快。
代码区域12-4:创建梁
1 | FamilyInstance CreateBeam(Autodesk.Revit.DB.Document document, View view) |
创建门
创建一个长约180’的长墙,并在运行此示例之前选择它。宿主对象必须支持插入实例;否则NewFamilyInstance()方法将失败。如果没有为必须在宿主中创建的实例提供宿主元素,或者无法将实例插入到指定的宿主元素中,则方法NewFamilyInstance()不执行任何操作。
代码区域12-5:创建门
1 | void CreateDoorsInWall(Autodesk.Revit.DB.Document document, Wall wall) |
下图显示了在Revit中执行上述代码的结果。请注意,如果指定的位置不在指定的标高上,NewFamilyInstance()方法将使用位置标高而不是标高。
图48:将门插入墙壁
使用参考方向创建族实例
使用参照方向可在特定方向上插入项目。
代码区域12-6:使用参考方向创建族实例
1 | // Get a floor to place the beds |
上一个代码的结果显示在下图中:
图49:使用不同的参照方向创建族实例
族符号
FamilySymbol类表示族中的单个类型。
每个族可以包含一个或多个族符号。每个FamilyInstance都有一个关联的FamilySymbol,可以从其Symbol属性访问。
热属性
某些类型的族(门、窗和幕墙嵌板)包含下面窗的“类型属性”窗口中所示的热属性。
FamilySymbol的热属性由FamilyThermalProperties类表示,并使用FamilySymbol.GetThermalProperties()方法检索。可以使用SetThermalProperties()设置FamilySymbol的FamilyThermalProperties。FamilyThermalProperties类本身的属性是只读的。
计算值的单位如下表所示。
Property 属性 | Unit 单位 |
---|---|
HeatTransferCoefficient 传热系数 | watts per meter-squared kelvin (W/(m^2K) |
ThermalResistance 热阻 | meter-squared kelvin per watt ((m^2K)/Watt) |
AnalyticConstructionTypeId属性是构造gbXML类型,并返回与Constructions.xml中constructionType节点的“id”属性对应的值。静态FamilyThermalProperties.Find()方法将通过Constructions.xml中constructionType节点的“id”属性查找FamilyThermalProperties。
#FamilyType参数
FamilySymbol的某些参数可以是FamilyType参数。对于这些参数,可以使用Family.GetFamilyTypeParameterValues()方法获取参数的所有适用值。返回的值是与给定参数的定义所指定的类别相匹配的所有族类型的ElementId。这些元素属于类ElementType或NestedFamilyTypeReference。第二种变体适用于嵌套在族中的类型,因此无法以其他方式访问。NestedFamilyTypeReference元素仅存储有关嵌套FamilyType的基本信息,例如Type的名称、Family的名称和Category。这些元素非常低级,因此被标准元素过滤器绕过,因此获取它们的主要方法是通过Family.GetFamilyTypeParameterValues()方法。 以下示例演示如何获取FamilySymbol的FamilyType参数的所有族类型参数值。然后将参数的值更改为另一个值。此更改将影响使用加载的FamilySymbol的所有FamilySymbol。
代码区域:获取嵌套的FamilyTypes
1 | public void GetNestedFamilyTypes(FamilyInstance instance) |
族
“族”类表示整个Revit族。它包含FamilySymbols使用的FamilySymbols。
载入族
Document类包含LoadFamily()和LoadFamilySymbol()方法。
- LoadFamily()将整个族及其所有类型或符号加载到项目中。
- LoadFamilySymbol()仅将指定的族符号从族文件载入到项目中。
注意:要提高应用程序的性能并减少内存使用,请尽可能加载特定的FamilySymbol,而不是整个Family对象。
- 使用Options.Application对象GetLibraryPaths()方法检索族文件路径。
- Options.Application对象是使用Application对象的Options属性检索的。
- 在LoadFamilySymbol()中,输入参数Name与FamilySymbol对象Name属性返回的字符串值相同。
有关详细信息,请参阅代码示例。
类别
FamilyCategory属性指示族的类别,例如柱、家具、结构框架或窗。