从IFC文件中提取几何

时间:2013-02-25 20:32:27

标签: java ifc bim

我必须在JAVA中提取ifc文件的几何。我的问题是,我不知道该怎么做。

我尝试使用openifctools,但文档非常糟糕。现在我加载了ifc文件,但我无法从模型中获取几何图形。

有没有人有ifc模型加载的经验?

提前致谢。

编辑:这是我到目前为止所做的

try {
    IfcModel ifcModel = new IfcModel();
    ifcModel.readStepFile(new File("my-project.ifc"));
    Collection<IfcClass> ifcObjects = ifcModel.getIfcObjects();
    System.out.println(ifcObjects.iterator().next());
} catch (Exception e) {
    e.printStackTrace();
}

这正确加载ifc文件。但我不知道如何处理这些信息。

我也尝试使用IfcOpenShell,但提供的jar容器也没有用。目前我尝试自己构建IfcOpenShell。

我有点绝望,因为一切都没有记录,我真的需要加载和解析ifc几何。

1 个答案:

答案 0 :(得分:4)

根据您对几何图形的要求,您希望深入研究IFC标准的深度以及解决方案所需的性能,您有两种不同的选择:

  1. 自行提取隐式几何体
  2. 使用外部几何引擎
  3. 如果您选择第一个选项,则必须集中研究IFC schema。您只对IFCProducts感兴趣,因为只有那些可以有几何。使用OpenIfcTools可以执行以下操作:

    Collection<IfcProduct> products = model.getCollection(IfcProduct.class);
    for(IfcProduct product: products){
        List<IfcRepresentation> representations = product.getRepresentation().getRepresentations();
        assert ! representations.isEmpty();
        assert representations.get(0) instanceof IfcShapeRepresentation:
        Collection<IfcRepresentationItem> repr = representations.get(0).getItems();
        assert !repr.isEmpty();
        IfcRepresentationItem representationItem = repr.iterator().next();
        assert representationItem instanceof IfcFacetedBrep;
        for(IfcFace face: ((IfcFacetedBrep)representationItem).getOuter().getCfsFaces()){
            for(IfcFaceBound faceBound: face.getBounds()){
                IfcLoop loop = faceBound.getBound();
                assert loop instanceof IfcPolyLoop;
                for(IfcCartesianPoint point: ((IfcPolyLoop) loop).getPolygon()){
                    point.getCoordinates();
                }
            }
        }
    }
    

    但是,有很多不同的GeometryRepresentations,你必须要覆盖它们,可能需要自己进行三角测量和填充。我已经展示了一个特例,并做了很多断言。你必须摆弄坐标转换,因为它们可以递归嵌套。

    如果你选择第二个选项,我所知道的几何引擎都是用C / C ++(IfcopenshellRDF IfcEngine)编写的,所以你必须应对本机库集成。随IFCOpenshell提供的jar包旨在用作Bimserver插件。没有相应依赖关系的人不能使用它们。但是,您可以从此包中获取本机二进制文件。为了使用引擎,你可以从Bimserver plugin source中汲取灵感。你要使用的关键原生方法是

    • boolean setIfcData(byte[] ifc)解析ifc数据
    • IfcGeomObject getGeometry()连续访问提取的几何体。