IfcOpenShellのIfcPatchを使って,複数のIFCファイルを統合する方法を説明します.
IfcOpenShellの説明はこのあたりが詳しいので割愛します.要所要所で困ったらページを起こします.
IFCを操作するためのパッケージ化されたスクリプトを実行するユーティリティ https://github.com/IfcOpenShell/IfcOpenShell/tree/v0.7.0#contents
らしいですが,まだ詳しいことは勉強中です.
公式のドキュメントに書かれている例題だと,ExtractElements
を使って,IfcWall
を取得するコードが書かれていますが,これだけなら他の方法(例えば,walls = model.by_type('IfcWall')
)もあるので,使い分けがよくわかっていません.
本題です.
src/ifcpatch/ifcpatch
をsite-packages/
直下に置きます.
./venv/lib/python3.10/site-packages/
に置きます.公式のドキュメントだと,こう書かれています.
"input": model, "recipe": "MergeProject", "arguments": ["/path/to/model2.ifc"]}) ifcpatch.execute({
ただ,この通り実行すると,私の環境では下記のようなエラーが出ました.
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
をキーにして統合元のモデルを渡せば動きます.
"input": model, "file": ifcopenshell.open(model), "recipe": "MergeProject", "arguments": ["/path/to/model2.ifc"]}) ifcpatch.execute({
ここで,file
として与えているものは,ifcopenshell.file.fileのことのようで,IFCファイルのパスを渡してはいけないようです.ifcopenshell.open()
で読み込んだものを渡す必要があります.
このあたりの情報がドキュメントの例題ベースだと分かりにくい印象です.
ドキュメントに書かれている通り,下記に注意します.
2つのIfcProject要素を1つにまとめる以外、それ以上の処理は行われないことに注意してください。つまり、空間階層が重複してしまう可能性があります(例:2つのサイト、2つのビルなど)。
つまり,IfcSite
やIfcBuilding
要素は重複してしまうので,何らかの方法で統合する必要があります.本来的にはモデル作成時点で,同じ建物には同じGUIDを与えて,GUIDを頼りに統合出来れば良いのでしょうが,現実的にはそういう作られ方をしているデータは少ないのかなと思います.
以上です.
2023-03-22 第一稿 2023-05-31 第二稿 レイアウト修正 |