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

How to fetch hierachical spatial structure and contained products from an IFC model?

我目前正在开展一个项目,以从存储在 Opensource 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 层,获取位于该层的所有 rooms,然后是 IfcProduct 类型的所有 entities,例如火灾探测器,以分层方式位于这些房间内。

预期输出:

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

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

  1. 组storey/space(组合类型复杂)由
  2. 组成
  3. storey/space 个元素(compositionType ELEMENT)组成
  4. storey/space 部分(组合类型部分)。

您通过物化聚合关系到达相应的下一级:

  • 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级别,使用空间包含关系获取space中包含的每个产品:

  • 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
    }
  }
}