👋
IfcOpenShellで階情報を取得する
対象
Pythonのごく初歩的な知識があること。
この記事でできること
IFCデータ内に含まれる階情報(階名称、レベル)を取得する
環境
- Python 3.10.6
- ifcopenshell 0.7.0
- ifcファイルは2x3を使用
- 今回はSolibriのサンプルファイル(Solibriビル.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