ifcopenshellのifcPatchを使ってIFCを結合してみた。

# はじめに
自分用のメモとして書きますが、誰かに見ていただけると嬉しいです。
今回は複数のIFCを結合していこうと思います。


## 今回行うこと
ifcOpenShellのgitをクローン
ifcPatchでIFCを結合

の流れで行いたいと思います。

まず、ifcOpenShellのgitのクローンを行う前に[git](https://git-scm.com/)と[Python](https://www.python.org/downloads/windows/)をinstallしておく必要があります。

今回のgitとPythonの各バージョンは以下です。
```
git:2.43.0.windows.1
python:3.10.11
```

## ifcOpenShellのgitをクローン
まず今回[ifcOpenShell](https://www.bing.com/search?q=ifcopenshell&form=ANNTH1&refig=cbb9b0ec8e464a9d9fa408f1623d080f&pc=LCTS)はgitをクローンして環境を作成しようと思います。
任意のディレクトリに移動し、以下のコードをターミナルで打ちます。
```
git clone https://github.com/IfcOpenShell/IfcOpenShell.git
```
以下の画像のようにifcOpenShellの環境が作成されました。
![スクリーンショット 2024-12-22 220441.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720022/b34cfc23-d7e1-7168-4301-ce1e3282d4ba.png)
今回はこのディレクトリ内のifcPatchを使いたいと思います。
以下のコードを打ちifcPatchのディレクトリに移動します。
```
cd IfcOpenShell/src/ifcpatch
```

## ifcPatchでIFCを結合
次にifcPatchを使い、IFC同士を結合させます。今回は橋梁の下部構造と上下部接続部のIFCデータを結合させようと思います。

下部構造のIFCデータ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720022/8880ac6f-19fd-92c0-9acc-ee4924c1f178.png)

上下部接続部のIFCデータ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720022/cbf2e11a-0e93-3691-4a21-3902bc9d133a.png)

では実際にifcPatchを使い、IFCを結合します。
実行するコードは以下です。
```
python -m ifcpatch -i "1つ目のIFCが存在するパス" -r MergeProjects -a "2つ目のIFCが存在するパス" -o "結合されるIFCモデルのパス指定と名前"
```
私は以下のように書き実行しました。（自分が保存しているパスとIFCの名前は書き換えてください。）
```
python -m ifcpatch -i "C:\IFC\substructure.ifc" -r MergeProjects -a "C:\IFC\connection.ifc" -o "C:\IFC\substructure-connection.ifc"
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720022/52cfcd5d-97e8-ae01-031d-af53d5dd37a7.png)


実際に結合されたsubstructure-connection.ifcを開くと以下のようなデータとなりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720022/64edd92d-4261-1c1d-ee9d-47e9491f8995.png)

ここで注目するべきが右のIFCデータの構造です。よく見るとIFCSITEとIFCBUILDINGが2つづつ存在しています、しかしこれはIFCデータの構造として間違っています。
そこでIFCSITEとIFCBUILDINGをそれぞれ1つに統合したいと思います。
substructure-connection.ifcをVScodeで開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720022/bb9356e6-4599-a257-7b75-96c65e7458fc.png)
このようにIFCはコードでも確認することが出来ます。
まずIFCSITEを1つにまとめます。
Ctrl＋FでIFCSITEを検索します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720022/e75e43ff-c449-fda6-b529-4dd0da4d6cfb.png)
するとIFCSITEが2件ヒットします。
1つ目のIFCSITEのOwnerHistory（先頭に付いている#の番号）を一旦メモします。
今回は38です。
そして2つ目のIFCSITEに移動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720022/62a4192a-5686-81be-f38f-47ce578481fc.png)
そして2つ目のIFCSITEのOwnerHistoryの番号をコピーし検索をかけます。今回は#2756の2756です。
すると以下のようにヒットしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720022/fa3bb1e8-e3a8-64c6-e61d-c4345e392c8b.png)
そして検索したOwnerHistoryの番号である2756を1つ目のOwnerHistoryの番号の38に書き換えます。
※今回、書き換える箇所は2つ目のOwnerHistoryです。（IFCSITEを直接参照しているOwnerHistoryを書き換えること）
そして2つ目のIFCSITEの全文を削除します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720022/70965846-21d0-7a4f-972f-c0be6ed60ec2.png)
　↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720022/d32ff53a-d8a4-64c1-033e-23b50af1adad.png)

ここでIFCビューワに戻りデータを確認するとIFCSITEが1つに統一されていることが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720022/1e38e2b6-28ba-b365-55d0-2c5d0c446718.png)

同様にIFCBUILDINGも1つに統一すればIFCの結合は終了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720022/db525a93-0f5f-b150-7932-c127b0dfee62.png)

以上がifcPatchの使用方法でした。