👋

IfcOpenShellで階情報を取得する

2023/05/13に公開

対象

Pythonのごく初歩的な知識があること。

この記事でできること

IFCデータ内に含まれる階情報(階名称、レベル)を取得する

環境

下準備

ターミナルから pip install ifcopenshell等でIfcOpenShellライブラリをインストールしておく

コード

IfcStoreyAnalyze.py
import ifcopenshell

ifc_file_name = "Solibriビル.ifc"
ifc = ifcopenshell.open(ifc_file_name)

storeys = ifc.by_type("IFCBUILDINGSTOREY")

for storey in storeys:
    print(storey.Name+" : "+str(storey.Elevation))
実行結果
Ground floor : 0.0
First floor : 3700.0
Second floor : 6750.0
Roof : 9800.0

解説

import ifcopenshell

ifc_file_name = "Solibriビル.ifc"
ifc = ifcopenshell.open(ifc_file_name)

ここでifcファイルを読み込んでいる。

storeys = ifc.by_type("IFCBUILDINGSTOREY")

タイプがIFCBUILDINGSTORYの要素、つまり階情報を取得して変数storeysに代入。
階情報は1階ごとにstoreys[0],storeys[1]...に代入される。

for storey in storeys:
    print(storey.Name+" : "+str(storey.Elevation))

1階ずつ<階名称> : <レベル>を表示する。

ちなみに

print(storeys[0])

とやると

実行結果
#101=IfcBuildingStorey('2r6a0oqyj4yPPPei42ibMm',#15,'Ground floor',$,$,#99,$,'Ground floor',.ELEMENT.,0.)

と表示される。
表示された値から階名称が3番目、レベルが10番目にあることが推測できる。
<階名称> : <レベル>を表示するときは、

for storey in storeys:
    print(storey[2]+" : "+str(storey[9]))

としても良い。(どうやら何番目にどの情報が来るかはIFCの仕様として定義されているみたい)
ただ、いちいち仕様を調べるのも面倒だしコードの可読性が低くなるので、.Name,.Elevationとやったほうが良いと思う。

.Nameの部分に何を指定したら良いかは.get_info()で調べることができる。

print(storeys[0].get_info())
実行結果
{'id': 101, 'type': 'IfcBuildingStorey', 'GlobalId': '2r6a0oqyj4yPPPei42ibMm', 
'OwnerHistory': #15=IfcOwnerHistory(#10,#14,$,.ADDED.,$,$,$,1350476845),
'Name': 'Ground floor', 'Description': None, 
'ObjectType': None, 'ObjectPlacement': #99=IfcLocalPlacement(#84,#98),
'Representation': None, 'LongName': 'Ground floor',
'CompositionType': 'ELEMENT', 'Elevation': 0.0}

例えばグローバルIDを知りたいときは.GlobalIdで取得できることがわかる。

おわりに

意外に日本語で解説された記事が見当たらなかったので素人なりに書いてみました。
ここから参照フロアを変更する方法やフロアを削除する方法を書いていければと思っています。

Discussion