Извлечение геометрии из файла IFC

Мне нужно извлечь геометрию файла ifc в JAVA. Моя проблема в том, что я не знаю, как это сделать.

Я пытался использовать 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.


person AlmostBearded    schedule 25.02.2013    source источник
comment
У меня нет опыта работы с файлами IFC, но если это общая проблема с Java, я могу помочь. Вы можете показать нам, что у вас есть на данный момент? Плюс любые ошибки / выходные данные, которые могут у вас возникнуть.   -  person mjshaw    schedule 26.02.2013
comment
java не должно быть проблемой. в любом случае я отредактировал свой вопрос и добавил несколько фрагментов кода, которые загружают файл ifc в память с помощью openifctools.   -  person AlmostBearded    schedule 26.02.2013
comment
Извините, тогда я неправильно понял. Чтобы использовать IfcModel и IfcClass, вам действительно нужен API. В противном случае попробуйте поиграть с ним в среде IDE, которая предлагает автозаполнение, например eclipse. он может дать вам представление о доступных методах, чтобы вы могли понять, как их использовать. Извини, я больше не помогаю.   -  person mjshaw    schedule 26.02.2013
comment
Да, я это уже делал. Без проблем. В любом случае, спасибо ;)   -  person AlmostBearded    schedule 26.02.2013


Ответы (1)


В зависимости от того, что вы хотите сделать с геометрией, насколько глубоко вы хотите вникнуть в стандарт IFC и какая производительность вам нужна для вашего решения, у вас есть два разных варианта:

  1. Извлеките неявную геометрию самостоятельно
  2. Используйте двигатель внешней геометрии

Если вы выберете первый вариант, вам придется изучить Схема IFC интенсивно. Вас будут интересовать только продукты IFCP, потому что только у них может быть геометрия. Используя 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 ++ (Ifcopenshell, RDF IfcEngine), поэтому вам придется справиться с интеграцией собственных библиотек. Пакет jar, поставляемый с IFCOpenshell, предназначен для использования в качестве подключаемого модуля Bimserver. Те, которые вы не можете использовать без соответствующих зависимостей. Однако вы можете получить собственные двоичные файлы из этого пакета. Чтобы использовать движок, вы можете почерпнуть вдохновение из Bimserver исходный код плагина. Ключевые собственные методы, которые вы собираетесь использовать:

  • boolean setIfcData(byte[] ifc) для анализа данных ifc
  • IfcGeomObject getGeometry() для последовательного доступа к извлеченной геометрии.
person hlg    schedule 09.09.2013