IfcOpenShell : Hackez le BIM avec Python
1. La Hiérarchie Spatiale IFC
Contrairement à un FBX ou OBJ plat, un IFC est un arbre strict. Pour trouver un mur, vous ne cherchez pas
juste "Wall". Vous devez souvent traverser : IfcProject -> IfcSite ->
IfcBuilding -> IfcBuildingStorey -> IfcWall.
import ifcopenshell
model = ifcopenshell.open("model.ifc")
project = model.by_type("IfcProject")[0]
def print_hierarchy(object, indent=0):
print(" " * indent + f"-> {object.Name} ({object.is_a()})")
# Relations de décomposition (Spatiale)
if hasattr(object, "IsDecomposedBy"):
for rel in object.IsDecomposedBy:
for related_obj in rel.RelatedObjects:
print_hierarchy(related_obj, indent+1)
print_hierarchy(project)
ifcopenshell.util.element.get_psets(element) pour récupérer toutes
les propriétés d'un objet sous forme de dictionnaire Python propre, sans parser les relations
IfcRelDefinesByProperties manuellement.
2. Data Mining : Extraire les Quantitatifs
Le BIM, c'est de l'Information. Extrayons un Bill of Quantities (BoQ) automatique pour tous les murs en béton.
import pandas as pd
import ifcopenshell.util.element
data = []
walls = model.by_type("IfcWall")
for w in walls:
psets = ifcopenshell.util.element.get_psets(w)
# On cherche les Quantities communes (Qto_WallBaseQuantities)
qto = psets.get("Qto_WallBaseQuantities", {})
data.append({
"GlobalId": w.GlobalId,
"Name": w.Name,
"Volume": qto.get("NetVolume", 0.0),
"Area": qto.get("NetSideArea", 0.0)
})
df = pd.DataFrame(data)
print(df.groupby("Name")["Volume"].sum())
En 10 lignes, vous avez remplacé un plugin Revit payant.
3. Géométrie : De l'Implicite au Mesh
L'IFC stocke souvent la géométrie de manière paramétrique (Extrusion d'un Rectangle 2D le long d'un axe Z). Pour visualiser cela dans un moteur de jeu ou faire du calcul de collision, il faut "tesselliser" (convertir en triangles).
import ifcopenshell.geom
settings = ifcopenshell.geom.settings()
settings.set(settings.USE_WORLD_COORDS, True)
for wall in walls:
shape = ifcopenshell.geom.create_shape(settings, wall)
verts = shape.geometry.verts # Flat list X,Y,Z...
faces = shape.geometry.faces # Indices triangles
# Conversion vers Trimesh ou Open3D ici pour visualisation
4. Modifier et Écrire
IfcOpenShell n'est pas qu'un lecteur. Il peut modifier le fichier. Ajoutons une propriété "Status: Checked" à tous nos murs.
# Création d'un nouveau Property Set custom
owner_history = model.by_type("IfcOwnerHistory")[0]
for wall in walls:
# ... logique complexe de création de relation IfcRelDefinesByProperties ...
# Heureusement, l'API utilitaire nous sauve encore :
ifcopenshell.api.run("pset.edit_pset", model,
product=wall,
pset_name="Pset_QualityControl",
properties={"Status": "Checked", "Date": "2026-01-10"})
model.write("model_checked.ifc")
🐍 Python pour le BIM Managers
Ne soyez plus esclave de votre logiciel BIM. Apprenez à scripter vos audits et vos exports avec notre module "BIM Automation".
Rejoindre l'Elite (120h)