如何从 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 中所述的方式处理空间层次结构。请注意,您不一定具有 IfcBuildingStorey
和 IfcSpace
的简单两级结构,但聚合树可能包含最多三个层级以及 spaces :
- 组storey/space(组合类型复杂)由
组成
- storey/space 个元素(compositionType ELEMENT)组成
- 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
}
}
}
我目前正在开展一个项目,以从存储在 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 中所述的方式处理空间层次结构。请注意,您不一定具有 IfcBuildingStorey
和 IfcSpace
的简单两级结构,但聚合树可能包含最多三个层级以及 spaces :
- 组storey/space(组合类型复杂)由 组成
- storey/space 个元素(compositionType ELEMENT)组成
- 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
}
}
}