我目前正在一个项目中,以从存储在开源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
答案 0 :(得分:1)
从IfcBuildingStorey
实体列表开始,您将必须按照IFC Documentation中所述的方式遍历空间层次结构。请注意,您不一定具有IfcBuildingStorey
和IfcSpace
的简单两级结构,但是聚合树最多可以包含三个层级的层以及空间:
您通过对象化的聚合关系达到各自的下一个级别:
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
}
}
}