BIM・IFCブログに戻る
BIMに関わる開発者なら、遅かれ早かれIFCからデータを取り出す必要に迫られます。数量拾いのための要素の数量、台帳のための分類、品質チェックのルールに使うカスタムプロパティセット。IfcOpenShellは、これをPythonで扱いやすくしてくれるオープンソースのライブラリです。ここでは実践的な道筋として、仕組みを理解するための手作業のやり方と、とにかくデータが欲しいときの1行で済む近道を紹介します。
ファイルを開いて要素を探す
import ifcopenshell
model = ifcopenshell.open("model.ifc")
# All walls in the file
walls = model.by_type("IfcWall")
print(f"{len(walls)} walls")
# A single element by its GlobalId
el = model.by_guid("3LYa_FRDj3zhLfyYoQv6Jr")
手作業のやり方(構造を理解する)
プロパティセットは要素に直接格納されているわけではなく、リレーションシップを介して要素にぶら下がっています。要素のIsDefinedByにはIfcRelDefinesByPropertiesのリレーションが入っており、それぞれがプロパティセット(RelatingPropertyDefinition)を指しています。セットの中ではHasPropertiesが個々のプロパティを列挙しており、その多くはNameとNominalValueを持つIfcPropertySingleValueです。
wall = walls[0]
for rel in wall.IsDefinedBy:
if rel.is_a("IfcRelDefinesByProperties"):
pset = rel.RelatingPropertyDefinition
if pset.is_a("IfcPropertySet"):
print(pset.Name) # e.g. "Pset_WallCommon"
for prop in pset.HasProperties:
if prop.is_a("IfcPropertySingleValue") and prop.NominalValue:
print(f" {prop.Name} = {prop.NominalValue.wrappedValue}")
近道:get_psets()
手作業でのたどり方は一度理解しておく価値がありますが、実務ではユーティリティを使いましょう。ifcopenshell.util.element.get_psets()は、要素のすべてのプロパティセットを、Pset名をキー、プロパティの辞書を値とするシンプルな辞書として返します。リレーションシップを自分でたどるよりも、はるかにミスが起きにくい方法です。
import ifcopenshell.util.element as ue
psets = ue.get_psets(wall)
# {'Pset_WallCommon': {'IsExternal': True, 'FireRating': 'REI 60', 'id': 1234}, ...}
fire_rating = psets.get("Pset_WallCommon", {}).get("FireRating")
# Quantities only (areas, volumes, lengths)
qtos = ue.get_psets(wall, qtos_only=True)
すべての要素を表にエクスポートする
import csv
import ifcopenshell.util.element as ue
with open("elements.csv", "w", newline="") as f:
writer = csv.writer(f)
writer.writerow(["GlobalId", "Class", "Name", "Pset", "Property", "Value"])
for el in model.by_type("IfcBuildingElement"):
for pset_name, props in ue.get_psets(el).items():
for key, value in props.items():
if key == "id":
continue
writer.writerow([el.GlobalId, el.is_a(), el.Name, pset_name, key, value])
スクリプトで読むか、ビューアーで見るか
Pythonは、パイプラインでの一括抽出や自動化された品質チェックに最適です。しかし、特定の要素のプロパティセットを目で確かめたいとき、あるいはコードを書かない人にファイルを渡すときは、クリックした要素のPsetを表示してくれるビューアーのほうが早道です。両者は互いに補い合います。大量のチェックはスクリプトで行い、例外的なケースは目で確認しましょう。
Psetを目で確認する
デュプレックス住宅のモデルを開いて任意の要素をクリックすると、そのプロパティセットがすべて表示されます。get_psets()が返すのと同じデータを、コードを一行も書かずに確認できます。
IFC2x3 · 2.4 MB
インタラクティブなIFCビューアーを開く
PythonとIfcOpenShellでIFCのプロパティセットを読み取る方法