我使用 Revit API 使用 PyRevit 创建了一个插件,以获取模型中使用的层中的材料及其厚度,但是来自 API 的结果与我给材料作为厚度的结果不同。
例如我试过这段代码:
# Create the dict for JSON
components = {
"wall": [],
}
# Select all walls
walls = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Walls).ToElements()
# Get the outer wall
outer_wall = None
for item in walls:
if isinstance(item, Wall):
el = doc.GetElement(item.Id)
if el.Name == "Aussenwand":
outer_wall = doc.GetElement(el.Id)
# Get the material and width of each layer of outer wall and add to components
if outer_wall is not None:
wall_type = doc.GetElement(outer_wall.GetTypeId())
compound_structure = wall_type.GetCompoundStructure()
for layer_index in range(compound_structure.LayerCount):
layer_width = compound_structure.GetLayerWidth(layer_index)
material_id = compound_structure.GetMaterialId(layer_index)
if material_id.IntegerValue != -1:
material = doc.GetElement(material_id)
components["wall"].append({material.MaterialCategory: layer_width})
所以这里是例如这段代码的结果:
{
'wall':
[{'Gipsputz': 0.049212598425196846},
{'Mauerwerk': 0.5741469816272966},
{'Isolierung': 0.45931758530183725},
{'Gipsputz': 0.049212598425196846}]
}
但是我在 Revit 中给这种材料的厚度是另外一回事,例如第一个元素应该有 15 毫米的厚度
我觉得材料可能有一些默认厚度,Revit 正在获取它们。 有没有人知道如何解决它?
更新:
在与此代码冲突数小时后,我意识到我这边有一个错误。 Revit API 为我提供了英制单位,我需要将它们更改为公制。
有 2 个解决方案,我选择使用 Revit API 和 UnitTypeId 和 UnitUtils:
# Get the material and width of each layer of outer wall and add to components
if outer_wall is not None:
wall_type = doc.GetElement(outer_wall.GetTypeId())
compound_structure = wall_type.GetCompoundStructure()
for layer_index in range(compound_structure.LayerCount):
layer_width_feet = compound_structure.GetLayerWidth(layer_index)
layer_width_mm = UnitUtils.ConvertFromInternalUnits(layer_width_feet, UnitTypeId.Millimeters)
material_id = compound_structure.GetMaterialId(layer_index)
material = doc.GetElement(material_id)
components["wall"].append({material.MaterialCategory: round(layer_width_mm)})
另一种解决方案是仅通过代码更改它,而不是使用 Revit API。例如,每 1 英尺是 304.8 毫米。