前言
这个例子介绍了如何分类统计材质的和面积。用到的接口是 Element 的:
// 返回 Element 中用到的材质
ICollection<ElementId> GetMaterialIds(bool returnPaintMaterials);
// Element 获取某材质的体积
double GetMaterialVolume(ElementId materialId);
// Element 获取某材质的面积
double GetMaterialArea(ElementId materialId, bool usePaintMaterial);
相对于其它例子,在统计不同类型的元素的时候,在技术上使用了模板来对代码进行了简化。
内容
本例子内容简单明了。重点看一下这个模板。
- 计算屋顶、墙、楼板的材质面积和体积
- 使用了模板方法void ExecuteCalculationsWith() where T : MaterialQuantityCalculator, new(),要求T继承或者实现MaterialQuantityCalculator,并带有无参构造函数
- 对屋顶、墙、楼板分别调用ExecuteCalculationsWith,传入的类不同:
ExecuteCalculationsWith();
ExecuteCalculationsWith();
ExecuteCalculationsWith(); - RoofMaterialQuantityCalculator、WallMaterialQuantityCalculator、FloorMaterialQuantityCalculator 的不同在于过滤出了不同构件
- MaterialQuantityCalculator 作为父类,它的核心逻辑是计算材质的净体积和毛体积。计算净体积的时候会过滤掉所有的附加构件,例如门窗造成的洞口;计算毛体积则不考虑这些剔除。
- 最终都会调用Element.GetMaterialVolume 和 Element.GetMaterialArea。
总结
Revit API 中的 Element 提供了一系列和材质相关的 API,有些零碎。虽然这些 API 对于 Element 是必须的,但确实导致了接口数量的增加。如果进行大规模的二次开发,可以考虑在它的接口的基础之上进行二次封装。