Извлечение геометрии из файла IFC
Я должен извлечь геометрию файла ifc в JAVA. Моя проблема в том, что я не знаю, как это сделать.
Я пытался использовать http://www.openifctools.org/, но документация действительно плохая. На данный момент у меня загружен файл 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 ответ
В зависимости от того, что вы хотите сделать с геометрией, насколько глубоко вы хотите вникнуть в стандарт IFC и какую производительность вам нужно для своего решения, у вас есть два разных варианта:
- Извлекайте неявную геометрию самостоятельно
- Используйте внешний геометрический движок
Если вы выберете первый вариант, вам придется интенсивно изучать схему 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();
}
}
}
}
Тем не менее, существует множество различных представлений GeometryRepretations, которые вы должны охватить, вероятно, выполняя триангуляцию и все прочее. Я показал один особый случай и сделал много утверждений. И вам придется возиться с преобразованиями координат, потому что они могут быть вложенными рекурсивно.
Если вы выберете второй вариант, все известные мне геометрические движки написаны на C/C++ ( http://ifcopenshell.org/, RDF IfcEngine), поэтому вам придется справиться с интеграцией нативных библиотек. Пакет jar, поставляемый с IFCOpenshell, предназначен для использования в качестве плагина Bimserver. Те, что вы не можете использовать его без соответствующих зависимостей. Однако вы можете взять нативные двоичные файлы из этого пакета. Чтобы использовать движок, вы можете черпать вдохновение из источника плагинов Bimserver. Ключевые нативные методы, которые вы собираетесь использовать:
boolean setIfcData(byte[] ifc)
проанализировать данные ifcIfcGeomObject getGeometry()
чтобы получить доступ к извлеченной геометрии последовательно.