3

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 ジオメトリを読み込んで解析する必要があるため、私はちょっと必死です。

4

1 に答える 1

5

ジオメトリで何をしたいか、IFC 標準をどの程度掘り下げたいか、およびソリューションに必要なパフォーマンスに応じて、2 つの異なるオプションがあります。

  1. 暗黙的なジオメトリを自分で抽出する
  2. 外部ジオメトリ エンジンを使用する

最初のオプションを選択する場合は、IFC スキーマを集中的に学習する必要があります。ジオメトリを持つことができるのはIFCProductsのみであるため、関心があるのは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 があり、それらをカバーする必要があり、おそらく自分で三角形分割などを行う必要があります。私は 1 つの特別なケースを示し、多くの主張をしました。また、再帰的にネストされる可能性があるため、座標変換をいじる必要があります。

2 番目のオプションを選択する場合、私が知っているジオメトリ エンジンはすべて C/C++ ( IfcopenshellRDF IfcEngine ) で記述されているため、ネイティブ ライブラリの統合に対処する必要があります。IFCOpenshell で提供される jar パッケージは、Bimserver プラグインとして使用することを目的としています。それぞれの依存関係なしでは使用できないもの。ただし、このパッケージからネイティブ バイナリを取得できます。エンジンを使用するには、Bimserverプラグイン ソースからインスピレーションを得ることができます。使用する主要なネイティブ メソッドは次のとおりです。

  • boolean setIfcData(byte[] ifc)ifcデータを解析する
  • IfcGeomObject getGeometry()抽出されたジオメトリに連続してアクセスします。
于 2013-09-09T12:49:24.917 に答える