IfcOpenShellでMergeProject

IfcOpenShellIfcPatchを使って,複数のIFCファイルを統合する方法を説明します.
IfcOpenShellの説明はこのあたりが詳しいので割愛します.要所要所で困ったらページを起こします.

Ifcpatchとは

IFCを操作するためのパッケージ化されたスクリプトを実行するユーティリティ https://github.com/IfcOpenShell/IfcOpenShell/tree/v0.7.0#contents

らしいですが,まだ詳しいことは勉強中です.
公式のドキュメントに書かれている例題だと,ExtractElementsを使って,IfcWallを取得するコードが書かれていますが,これだけなら他の方法(例えば,walls = model.by_type('IfcWall'))もあるので,使い分けがよくわかっていません.

MergeProjectの方法

本題です.

importできるようにする前処理

  • IfcOpenShellから一通りリポジトリをクローンします.
  • その中からsrc/ifcpatch/ifcpatchsite-packages/直下に置きます.
    • venvを使っているようであれば,例えば,./venv/lib/python3.10/site-packages/に置きます.
  • 終わりです.

公式で説明されている方法

公式のドキュメントだと,こう書かれています.

ifcpatch.execute({"input": model, "recipe": "MergeProject", "arguments": ["/path/to/model2.ifc"]})

ただ,この通り実行すると,私の環境では下記のようなエラーが出ました.

File "your/environment/venv/lib/python3.10/site-packages/ifcpatch/__init__.py", line 76, in execute
patcher = recipe.Patcher(args["input"], args["file"], logger, *args["arguments"])
KeyError: 'file'

動く方法

結果的には下記のように,fileをキーにして統合元のモデルを渡せば動きます.

ifcpatch.execute({"input": model, "file": ifcopenshell.open(model), "recipe": "MergeProject", "arguments": ["/path/to/model2.ifc"]})

ここで,fileとして与えているものは,ifcopenshell.file.fileのことのようで,IFCファイルのパスを渡してはいけないようです.ifcopenshell.open()で読み込んだものを渡す必要があります.
このあたりの情報がドキュメントの例題ベースだと分かりにくい印象です.

蛇足と覚書

ドキュメントに書かれている通り,下記に注意します.

2つのIfcProject要素を1つにまとめる以外、それ以上の処理は行われないことに注意してください。つまり、空間階層が重複してしまう可能性があります(例:2つのサイト、2つのビルなど)。

つまり,IfcSiteIfcBuilding要素は重複してしまうので,何らかの方法で統合する必要があります.本来的にはモデル作成時点で,同じ建物には同じGUIDを与えて,GUIDを頼りに統合出来れば良いのでしょうが,現実的にはそういう作られ方をしているデータは少ないのかなと思います.

以上です.

2023-03-22 第一稿
2023-05-31 第二稿 レイアウト修正

index pageへ戻る