分析

相关信息

  • 绿色建筑工作室API

Pages in this section 本节中的页面

  • 能量数据
  • 分析可视化
  • 概念能量分析
  • 详细的能源分析模型

能量数据

EnergyDataSettings对象包含gbXML导出和热负荷和冷负荷计算的设置以及概念能量分析的项目级别设置。

EnergyDataSettings对象是从Element基对象派生的。它在每个项目中都是唯一的,类似于ProjectInformation。虽然EnergyDataSettings是Element类的子类,但从Element继承的大多数成员都返回null或空集,但Name、Id、UniqueId和Parameters除外。

下面的代码示例使用EnergyDataSettings类。调用命令后,结果将显示在TaskDialog中。

代码区域28-7:使用EnergyDataSettings类

1
2
3
4
5
6
7
8
9
10
11
public void GetInfo_EnergyData(Document document)
{
EnergyDataSettings energyData = EnergyDataSettings.GetFromDocument(document);

if (null != energyData)
{
string message = "energyData : ";
message += "\nBuildingType : " + energyData.BuildingType;
TaskDialog.Show("Revit", message);
}
}

分析可视化

Revit API提供了一种机制,使外部分析应用程序可以在Revit模型中轻松显示其计算结果。SpatialFieldManager类是将分析结果传回Revit的主要类。它用于创建、删除和修改存储分析结果的“容器”。AnalysisResultSchema类包含有关一个分析结果的所有信息,例如用于结果可视化的所有单位的描述和名称及乘数。可以向SpatialFieldManager注册多个AnalysisResultSchemas。

然后可以使用AnalysisDisplayStyle类控制结果的外观。从插件创建和修改AnalysisDisplayStyle是可选的;最终用户可以通过Revit UI对分析结果的显示进行相同的控制。

Revit API支持的数据模型要求在某组点处指定分析结果,并且在每个点处计算一个或多个不同的数字(“测量值”)。所有模型点的测量次数必须相同。结果数据是暂时的;它只存储在模型中,直到文档关闭。如果模型已保存、关闭并重新打开,则分析结果将不显示。

本节中的页面

  • 分析结果管理
  • 创建分析结果数据
  • 分析结果显示
  • 更新分析结果

分析结果管理

新的SpatialFieldManager可以使用静态SpatialFieldManager. stateSpatialFieldManager()方法添加到视图中。一个视图只能关联一个管理器。如果视图已经有SpatialFieldManager,则可以使用静态方法GetSpatialFieldManager()检索它。

SpatialFieldManager()接受一个参数,表示将为每个点计算的测量数。此数字定义了与计算结果的每个点相关联的结果值的数量。例如,如果计算一年中每个月的平均太阳辐射,则每个点将有12个相应的值。

要将分析结果添加到视图中,请调用AddSpatialFieldPrimitive()以创建新的分析结果容器。存在此方法的四个重载以创建与以下项关联的基元:

  • 引用(曲线或面)
  • 曲线与变换
  • 一个面和一个变换
  • 无Revit几何图形-为了在创建与Revit几何图形无关的多个数据点时提高性能,建议创建多个基本体,每个基本体的点不超过500个,而不是创建一个包含所有点的大型基本体。

变换重载的一个典型用途是定位结果数据与Revit模型中几何图形的偏移,例如,楼板上方3英尺。

AddSpatialFieldPrimitive()方法返回SpatialFieldManager中图元的唯一整数标识符,该标识符稍后可用于标识图元以将其移除(RemoveSpatialFieldPrimitive())或修改图元(UpdateSpatialFieldPrimitive())。

注意,AddSpatialFieldPrimitive()方法创建了一个空的分析结果原语。必须调用UpdateSpatialFieldPrimitive()才能使用点和值填充分析结果数据,如创建分析结果数据部分所示。

UpdateSpatialFieldPrimitive()方法需要已向SpatialFieldManager注册的AnalysisResultSchema的唯一索引。AnalysisResultSchema保存有关分析结果的信息,例如名称、描述以及用于结果可视化的所有单元的名称和乘数。下面的示例演示如何创建新的AnalysisResultSchema并设置其单位。

代码区域:分析结果架构

1
2
3
4
5
6
7
8
9
10
IList unitNames = new List();
unitNames.Add("Feet");
unitNames.Add("Inches");
IList multipliers = new List();
multipliers.Add(1);
multipliers.Add(12);

AnalysisResultSchema resultSchema = new AnalysisResultSchema("Schema Name", "Description");

resultSchema.SetUnits(unitNames, multipliers);

一旦配置了AnalysisResultschema,就需要使用SpatialFieldManager.RegisterResult()方法注册它,该方法将返回结果的唯一索引。使用此唯一索引的GetResultSchema()和SetResultSchema()可在注册结果后获取和更改结果。

创建分析结果数据

将基元添加到SpatialFieldManager后,可以使用UpdateSpatialFieldPrimitive()方法创建分析结果并将其添加到分析结果容器。此方法采用一组计算结果的域点(FieldDomainPoints)和每个点的一组值(FieldValues)。FieldValues的数量必须与域点的数量相对应。然而,每个域点可以具有值阵列,每个值用于该点处的单独测量。

下面的示例在用户选择的元素面上创建一组简单的分析结果。SDK示例SpatialFieldGradient演示了一个更复杂的用例,其中每个点都有多个关联值。

代码区域27-1:创建分析结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Document doc = commandData.Application.ActiveUIDocument.Document;
UIDocument uiDoc = commandData.Application.ActiveUIDocument;

SpatialFieldManager sfm = SpatialFieldManager.GetSpatialFieldManager(doc.ActiveView);
if (null == sfm)
{
sfm = SpatialFieldManager.CreateSpatialFieldManager(doc.ActiveView, 1);
}

Reference reference = uiDoc.Selection.PickObject(ObjectType.Face, "Select a face");
int idx = sfm.AddSpatialFieldPrimitive(reference);

Face face = doc.GetElement(reference).GetGeometryObjectFromReference(reference) as Face;

IList uvPts = new List();
BoundingBoxUV bb = face.GetBoundingBox();
UV min = bb.Min;
UV max = bb.Max;
uvPts.Add(new UV(min.U,min.V));
uvPts.Add(new UV(max.U,max.V));

FieldDomainPointsByUV pnts = new FieldDomainPointsByUV(uvPts);

List doubleList = new List();
IList valList = new List();
doubleList.Add(0);
valList.Add(new ValueAtPoint(doubleList));
doubleList.Clear();
doubleList.Add(10);
valList.Add(new ValueAtPoint(doubleList));

FieldValues vals = new FieldValues(valList);

AnalysisResultSchema resultSchema = new AnalysisResultSchema("Schema Name", "Description");
int schemaIndex = sfm.RegisterResult(resultSchema);
sfm.UpdateSpatialFieldPrimitive(idx, pnts, vals, schemaIndex);

分析结果显示

AnalysisDisplayStyle类可用于控制分析结果在视图中的显示方式。这个静态的函数AnalysisDisplayStyle()方法可以创建一个彩色的表面显示样式,一个带有文本样式的标记,一个变形的形状样式,图表样式或者矢量样式。对于任何样式,也可以设置颜色和图例设置。

创建新的AnalysisDisplayStyle后,使用View.AnalysisDisplayStyleId将样式指定给视图。虽然分析结果不与文档一起保存,但分析显示样式及其对视图的指定与模型一起保存。

下面的示例创建一个新的彩色曲面分析显示样式(如果在文档中尚未找到),然后将其指定给当前视图。

代码区域27-2:设置视图的分析显示样式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
Document doc = commandData.Application.ActiveUIDocument.Document;

AnalysisDisplayStyle analysisDisplayStyle = null;
// Look for an existing analysis display style with a specific name
FilteredElementCollector collector1 = new FilteredElementCollector(doc);
ICollection collection = collector1.OfClass(typeof(AnalysisDisplayStyle)).ToElements();
var displayStyle = from element in collection
where element.Name == "Display Style 1"
select element;

// If display style does not already exist in the document, create it
if (displayStyle.Count() == 0)
{
AnalysisDisplayColoredSurfaceSettings coloredSurfaceSettings = new AnalysisDisplayColoredSurfaceSettings();
coloredSurfaceSettings.ShowGridLines = true;

AnalysisDisplayColorSettings colorSettings = new AnalysisDisplayColorSettings();
Color orange = new Color(255, 205, 0);
Color purple = new Color(200, 0, 200);
colorSettings.MaxColor = orange;
colorSettings.MinColor = purple;

AnalysisDisplayLegendSettings legendSettings = new AnalysisDisplayLegendSettings();
legendSettings.NumberOfSteps = 10;
legendSettings.Rounding = 0.05;
legendSettings.ShowDataDescription = false;
legendSettings.ShowLegend = true;

FilteredElementCollector collector2 = new FilteredElementCollector(doc);
ICollection elementCollection = collector2.OfClass(typeof(TextNoteType)).ToElements();
var textElements = from element in collector2
where element.Name == "LegendText"
select element;
// if LegendText exists, use it for this Display Style
if (textElements.Count() > 0)
{
TextNoteType textType =
textElements.Cast().ElementAt(0);
legendSettings.SetTextTypeId(textType.Id, doc);
}
analysisDisplayStyle = AnalysisDisplayStyle.CreateAnalysisDisplayStyle(doc, "Display Style 1", coloredSurfaceSettings, colorSettings, legendSettings);
}
else
{
analysisDisplayStyle =
displayStyle.Cast().ElementAt(0);
}
// now assign the display style to the view
doc.ActiveView.AnalysisDisplayStyleId = analysisDisplayStyle.Id;

更新分析结果

Revit分析框架不会自动更新结果,对Revit模型的任何更改都可能使结果无效。

为了使结果保持最新,API开发人员应使用“动态模型更新”触发器或订阅DocumentChanged事件,以便在Revit模型发生更改且以前计算的结果可能无效并需要重新计算时收到通知。有关显示动态模型更新和分析可视化的示例,请参见Revit SDK中的DistanceToSurfaces示例。

概念能量分析

通过Revit API可以访问由Revit创建的图元和对象,以便对概念设计模型执行能量分析。以下类允许您使用此数据:

  • MassEnergyAnalyticalModel - 将体量实例与能量分析模型数据和几何图形相关联。
  • MassLevelData - 概念建筑模型中可占用楼层(体量楼层)的概念表示。
  • MassSurfaceData - 在MassEnergyAnalyticalModel元素中保存面的属性和其他数据
  • MassZone - 建筑的单独加热和冷却子体积的概念表达。
  • ConceptualConstructionType - 以Revit BIM模型和绿色Building Studio/绿色Building XML都能理解的方式描述概念物理、构造和能量属性。
  • ConceptualSurfaceType -表示要指定给体量几何图形中的面的概念BIM对象类别。

除了这些类之外,还有一个Document.Export()重载,它采用MassGBXMLExportOptions参数,该参数导出仅包含概念能量分析元素(体量元素)的gBXML文件。

质量能量分析模型

与概念能量分析关联的主类是MassEnergyAnalyticalModel。此类将体量实例与能量分析模型数据和几何图形相关联。几何图形开始时是其关联体量实例几何图形的副本,并根据能量分析模型的要求进行修改。静态方法MassEnergyAnalyticalModel。GetMassEnergyAnalyticalModelIdForMassInstance()将返回给定体量实例的MassEnergyAnalyticalModel的ElementId。

MassLevelData

MassLevelData是通过将特定标高与Revit项目中的特定体量元素相关联来定义的。这可以使用MassInstanceUtils.AddMassLevelDataToMassInstance()方法完成。MassLevelData报告与概念空间规划相关的度量,如楼层面积。MassLevelData包含用作“概念能量分析”模型一部分的信息,例如ConceptualConstructionType。通过将体量的所有几何图形合并为单个几何图形,然后获取与MassLevelData的标高相交的区域,可以确定MassLevel数据几何图形。

Masszone

通过将与体量族实例关联的体量级别数据与和同一体量族实例关联的体量能量分析模型的几何图形相交,将体量能量分析模型分割为多个部分,从而创建体量分区。可以使用GetMassZoneIds()方法检索与MassEnergyAnalyticalModel关联的MassZones的ElementIds。

MassSurfaceData

从MassEnergyAnalyticalModel中,可以获取对其有意义的所有面的引用。使用这些引用,可以使用GetMassSurfaceDataIdForReference()方法获取与每个面关联的MassSurfaceData。MassSurfaceData保存有关MassEnergyAnalyticalModel元素中的面的属性和其他数据,例如材质值和自动生成的元素的尺寸(例如窗台高度和天窗宽度)。

MassSurfaceData还保存与参考曲面关联的ConceptualConstructionType的ID。ConceptualConstructionType以Revit BIM模型和绿色Building Studio/绿色Building XML都能理解的方式描述概念物理、构造和能量属性。这个类有许多静态方法来获取给定文档中建筑物不同方面(如墙和窗)的ConceptualConstructionType的ElementId。

MassSurfaceData的另一个属性是CategoryIdForConceptualSurfaceType,它提供用于其ConceptualSurfaceType的体量子类别ElementId。ConceptualSurfaceType表示要分配给体量几何图形中的面的概念性BIM对象类别。每个体量曲面子类别都有一个ConceptualSurfaceType元素。使用静态方法ConceptualSurfaceType.GetByMassSubCategoryId(),可以从体量子类别ID中获取MassSurfaceData的ConceptualSurfaceType。

在Revit项目中启用“概念能量分析”后,体量面将指定给与这些ConceptualSurfaceType关联的Mass类别的子类别。默认的ConceptualConstructionType与ConceptualSurfaceType相关联。此默认ConceptualConstructionType指定给具有相应子类别的体量面。更改与ConceptualSurfaceType关联的默认ConceptualConstructionType将更新该子类别的所有体量面的ConceptualConstruction类型,用户尚未为其专门提供替代值。

MassInstanceUtils

MassInstancesUtils实用程序类提供静态方法来获取有关体量实例的信息(例如体量实例表示的总可占用楼层面积或总建筑体积),以及创建MassLevelData(体量楼层)以将标高与体量实例关联(如上所述)。

详细的能源分析模型

Autodesk.Revit.DB.Analysis命名空间包含多个类,用于获取和分析项目详细能量分析模型的内容。

The Export to gbXML and the Heating and Cooling Loads features produce an analytical thermal model from the physical model of a building. The analytical thermal model is composed of spaces, zones and planar surfaces that represent the actual volumetric elements of the building.
“导出到gbXML”和“热负荷和冷负荷”功能可从建筑的物理模型生成分析热模型。分析热模型由空间、分区和平面组成,它们表示建筑的实际体积元素。

与详细能量分析模型相关的类包括:

  • EnergyAnalysisDetailModel
  • EnergyAnalysisDetailModelOptions
  • EnergyAnalysisOpening
  • EnergyAnalysisSpace
  • EnergyAnalysisSurface
  • Polyloop

能量分析模型创建

使用静态方法EnergyAnalysisDetailModel.Create()创建并填充能量分析模型。EnergyAnalysisDetailModel作为图元存储在Revit模型中,因此EnergyAnalysisDetailModel.Create()方法要求存在打开的事务。生成的模型总是以世界坐标返回,但方法TransformModel()根据地平面、共享坐标和真北变换模型中的所有曲面。

如果已创建能量分析模型,则静态方法EnergyAnalysisDetailModel.GetMainEnergyAnalysisDetailModel()返回给定文档中包含的主EnergyAnalysisDetailModel(如果尚未创建任何模型,则返回null)。能量分析详图模型可以显示在关联视图中。

使用EnergyAnalysisDetailModelOptions类设置适当的选项。

创建能量分析详图模型时可用的选项包括:

  • 能量分析模型的计算级别- NotComputed、FirstLevelBoundary(表示分析空间和分区)、SecondLevelBoundary(表示分析表面)或Final(表示构造、明细表和非图形数据
  • 能源模型是否基于房间/空间或建筑元素
  • 竖梃是否应导出为着色表面
  • 是否包括遮光表面
  • 是否简化幕墙系统-为true时,将为幕墙/系统导出单个大窗/洞口,而不考虑系统中的嵌板数量

EnergyAnalysisDetailModelOptions.EnergyModelType属性可以设置为SpatialElement(其中能量模型基于房间或空间)或BuildingElement(其中能量模型基于建筑图元体积的分析)。但是,请注意,生成的能量模型还受EnergyDataSettings中的设置(包括EnergyDataSettings.AnalysisType属性)的影响。如果将此属性设置为AnalysisMode.ConceptualMassesAndBuildingElements,则EnergyAnalysisDetailModel将使用概念体量和建筑图元的组合。

以下示例从物理模型创建新的能量分析详细模型,然后显示模型中每个空间的每个曲面的原始图元。

代码区域:能量分析详图模型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Collect space and surface data from the building's analytical thermal model
EnergyAnalysisDetailModelOptions options = new EnergyAnalysisDetailModelOptions();
options.Tier = EnergyAnalysisDetailModelTier.Final; // include constructions, schedules, and non-graphical data in the computation of the energy analysis model
options.EnergyModelType = EnergyModelType.SpatialElement; // Energy model based on rooms or spaces

EnergyAnalysisDetailModel eadm = EnergyAnalysisDetailModel.Create(doc, options); // Create a new energy analysis detailed model from the physical model
IList spaces = eadm.GetAnalyticalSpaces();
StringBuilder builder = new StringBuilder();
builder.AppendLine("Spaces: " + spaces.Count);
foreach (EnergyAnalysisSpace space in spaces)
{
SpatialElement spatialElement = doc.GetElement(space.CADObjectUniqueId) as SpatialElement;
ElementId spatialElementId = spatialElement == null ? ElementId.InvalidElementId : spatialElement.Id;
builder.AppendLine(" >>> " + space.SpaceName + " related to " + spatialElementId);
IList surfaces = space.GetAnalyticalSurfaces();
builder.AppendLine(" has " + surfaces.Count + " surfaces.");
foreach (EnergyAnalysisSurface surface in surfaces)
{
builder.AppendLine(" +++ Surface from " + surface.OriginatingElementDescription);
}
}
TaskDialog.Show("EAM", builder.ToString());

创建EnergyAnalysisDetailModel后,可以使用GetAnalyticalOpenings()、GetAnalyticalSpaces()、GetAnalyticalShadingSurfaces()和GetAnalyticalSurfaces()方法检索与其关联的空间、洞口和曲面。 建议应用程序在访问完数据后创建的EnergyAnalysisDetailModel元素上调用Document.Delete(),但在保存或同步文档之前,将自动删除在主能源模型之后创建的任何能源模型。

EnergyAnalysisSpace

从EnergyAnalysisSpace中,可以检索EnergyAnalysisSurfaces的集合,这些曲面定义由墙的中心平面以及屋顶和楼板的顶平面限定边界的封闭体积。或者,GetClosedShell()检索Polyloops(平面多边形)的集合,这些多边形定义由内部边界曲面测量的封闭体积。对于二维,请使用GetBoundary(),它返回表示空间的2D边界的多边形环集合,该空间定义了由内部边界曲面测量的封闭区域。 EnergyAnalysisSpace类还具有许多用于访问有关分析空间的信息的属性,例如AnalyticalVolume、SpaceName和Area。 #能量分析Surface 从EnergyAnalysisSpace中,可以检索与曲面关联的主分析空间以及次相邻分析空间。GetAnalyticalOpenings()方法将检索曲面中所有分析洞口的集合。GetPolyloop()方法获取描述gbXML中描述的曲面几何的平面多边形。 EnergyAnalysisSurface类具有许多属性,可提供有关分析曲面的更多信息,例如“高度”、“宽度”、“角点”(从外部查看的分析矩形几何图形的左下坐标)和原始图元描述。 曲面类型可以作为EnergyAnalysisSurfaceType或gbXMLSurfaceType提供。gbXML表面类型属性由源元素和空间邻接数确定。可能的类型有:

Type 类型 Source element and space adjacencies 源元素和空间邻接
Shade 没有关联的源元素和空间邻接关系
Air 没有关联的源元素且至少有一个空间邻接
ExteriorWall 源图元是一面墙或一面幕墙,有一个空间相邻
InteriorWall 源图元是墙或幕墙,并且:存在两个空间邻接关系,或者类型函数参数设置为“Interior”或“CoreShaft”
UndergroundWall 源图元是墙或幕墙,并且存在一个空间邻接关系,如果该空间邻接关系低于坡率
SlabOnGrade 源元素是一个Floor,并且存在一个空间邻接
RaisedFloor 源元素是一个地板,有一个空间邻接,并且位于地面上方
UndergroundSlab 源元素是一个地板,有一个空间邻接,并且它位于地面以下
InteriorFloor 源图元为楼板,并且:存在两个空间邻接关系或类型函数参数设置为“Interior
Roof 源元素是屋顶或天花板,并且有一个空间相邻关系
UndergroundCeiling 源图元是屋顶或天花板,并且存在一个空间邻接关系,且该空间邻接关系位于地面以下
Ceiling 源图元是Roof或Ceiling,并且存在两个空间邻接关系

EnergyAnalysisOpening

从EnergyAnalysisOpening可以检索关联的父分析曲面元素。GetPolyloop()方法将洞口几何图形作为平面多边形返回。

有许多特性可用于获取有关分析洞口的信息,例如“高度”、“宽度”、“角点”和“洞口名称”。与分析曲面类似,分析洞口类型可以作为简单的EnergyAnalysisOpeningType枚举或gbXMLOpeningType属性获得。洞口的类型取决于洞口的族类别及其包含的图元,如下表所示:

Type 类型 Family Category or containing element 家庭类别或包含元素
OperableWindow 窗口
NonSlidingDoor
FixedSkylight 屋顶中包含的洞口
FixedWindow 幕墙嵌板中包含的洞口
Air Opening of the category Openings

注:翻译自Revit API Developers Guide