Retour au blog BIM & IFC
Outils & comparatifs · 2026-06-03 · 8 min
Lire les jeux de propriétés IFC en Python avec IfcOpenShell
Vous devez extraire des données de propriétés d'un IFC — quantités, classifications, Pset personnalisés — vers un tableur, une base de données ou un contrôle qualité. IfcOpenShell ramène cela à quelques lignes de Python. Voici le mode d'emploi pratique, y compris le raccourci get_psets que tout le monde regrette de ne pas avoir découvert plus tôt.
Lire les jeux de propriétés IFC en Python avec IfcOpenShell — IFC Viewer Online article cover
Tôt ou tard, tout développeur proche du BIM doit extraire des données d'un IFC : des quantités d'éléments pour un métré, des classifications pour un registre, des jeux de propriétés personnalisés pour une règle de contrôle qualité. IfcOpenShell est la bibliothèque open source qui rend cela praticable en Python. Voici le chemin pratique — la méthode manuelle pour comprendre la structure, et le raccourci en une ligne pour quand vous avez simplement besoin des données.
Ouvrir le fichier et trouver les éléments
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")
La méthode manuelle (comprendre la structure)
Les jeux de propriétés ne sont pas stockés directement sur l'élément — ils s'y rattachent via une relation. La propriété IsDefinedBy d'un élément porte des relations IfcRelDefinesByProperties, chacune pointant vers un jeu de propriétés (le RelatingPropertyDefinition). À l'intérieur du jeu, HasProperties liste les propriétés individuelles, la plupart étant des IfcPropertySingleValue avec un Name et une NominalValue.
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}")
Le raccourci : get_psets()
Le parcours manuel vaut la peine d'être compris une fois, mais pour le travail réel, utilisez l'utilitaire : ifcopenshell.util.element.get_psets() renvoie tous les jeux de propriétés d'un élément sous forme de dictionnaire simple — les noms de Pset comme clés, les dictionnaires de propriétés comme valeurs. C'est bien moins sujet aux erreurs que de parcourir les relations vous-même.
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)
Exporter tous les éléments vers un tableau
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])
Où la lecture s'arrête et où la visualisation commence
Python est idéal pour l'extraction en masse et le contrôle qualité automatisé dans un pipeline. Mais quand vous voulez jeter un œil aux jeux de propriétés d'un élément précis — ou remettre le fichier à quelqu'un qui n'écrit pas de code — une visionneuse qui affiche les Pset par élément au clic est la voie la plus rapide. Les deux se complètent : scriptez les contrôles en masse, inspectez les cas particuliers visuellement.
Inspecter les Pset visuellement
Ouvrez le duplex et cliquez sur n'importe quel élément pour voir l'ensemble de ses jeux de propriétés — les mêmes données que renvoie get_psets(), sans écrire une ligne de code.
IFC2x3 · 2.4 MB
Ouvrir la visionneuse IFC interactive
Lire les jeux de propriétés IFC en Python avec IfcOpenShell