Как получить иерархическую пространственную структуру и содержащиеся в ней продукты из модели IFC? - PullRequest
0 голосов
/ 30 октября 2018

В настоящее время я работаю над проектом для извлечения всех деталей, таких как IfcBuilding, IfcDistributionControlElement и т. Д., Из файла IFC, хранящегося в OpenSource BIMserver. Используя клиентскую библиотеку 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 голосов
/ 30 октября 2018

Начиная со списка IfcBuildingStorey сущностей, вам придется пройти по пространственной иерархии, как описано в Документации IFC . Имейте в виду, что у вас не обязательно есть простая двухуровневая структура IfcBuildingStorey и IfcSpace, но дерево агрегации может содержать до трех уровней иерархии этажей и пробелов:

  1. групп этажей / помещений (составной тип COMPLEX), состоящий из
  2. элементы этажа / пространства (составType ELEMENT), состоящие из
  3. этажные / космические части (CompeType 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
    }
  }
}
...