如何从IFC模型中获取层级空间结构和包含的产品?

时间:2018-10-30 06:04:41

标签: ifc bim

我目前正在一个项目中,以从存储在开源BIMserver中的IFC文件中获取所有详细信息,例如IfcBuilding,IfcDistributionControlElement等。使用Java客户端库,我设法获得了一个楼层列表并打印了它们的名称。

List<IfcBuildingStorey> storeys = model.getAllWithSubTypes(IfcBuildingStorey.class));
for (IfcBuildingStorey storey : storeys) {
    System.out.println(storey.getName());
}

当前输出:

Level 1
Level 2
Level 3
Level 4

我想要的是每个楼层,例如2级,获取位于该楼层的所有房间,然后获取IfcProduct类型的所有实体,例如那些房间内部的火警探测器。

预期输出:

Level 2
  Room 1: entity 1, entity 2, entity 3, entity 4
  Room 2: entity 1, entity 2, entity 3, entity 4
  Room 3: entity 1, entity 2, entity 3, entity 4

1 个答案:

答案 0 :(得分:1)

IfcBuildingStorey实体列表开始,您将必须按照IFC Documentation中所述的方式遍历空间层次结构。请注意,您不一定具有IfcBuildingStoreyIfcSpace的简单两级结构,但是聚合树最多可以包含三个层级的层以及空间:

  1. 由以下组成的楼层/空间组(组成类型COMPLEX)
  2. 楼层/空间元素(compositionType ELEMENT)组成
  3. 楼层/空间部分(compositionType PARTIAL)。

您通过对象化的聚合关系达到各自的下一个级别:

  • IfcSpatialStrutureElement.IsDecomposedBy
  • IfcRelAggregates.RelatedObjects
  • IfcObjectDefinition

然后希望IfcObjectDefinition实例是一种空间结构(应该是,但您永远不会知道)。

在Java中,它可能看起来像这样:

void traverseSpatialStructure(IfcSpatialStructureElement parent){
  for (IfcRelAggregates aggregation: parent.getIsDecomposedBy()){
    for (IfcObjectDefinition child: aggregation.getRelatedObjects()){
      doSomeThingWith(child); // e.g. print name
      assert child instanceof IfcSpatialStructureElement;
      traverseSpatialStructure((IfcSpatialStructureElement) child);
    }
  }
}

最后,一旦您达到IfcSpace级别,就可以使用空间包含关系来掌握空间中包含的每个产品:

  • IfcSpatialStructureElement.ContainsElements
  • IfcRelContainedInSpatialStructure.RelatedElements
  • IfcProduct

再次在Java中:

void doSomethingWith(IfcSpace spatialStructure){
  for(IfcRelContainedInSpatialStructure containment: spatialstructure.getContainsElements()){
    for(IfcProduct product : containment.getRelatedElements()){
      // do something with your product, e.g. fire detector
    }
  }
}