IfcOpenShell : Hackez le BIM avec Python

Le format IFC est lourd et complexe. Python est léger et agile. Apprenez à dompter la bête.
Intermédiaire
50 min
IfcOpenShell, Pandas, Trimesh
"Un fichier IFC n'est pas juste un modèle 3D. C'est sa base de données relationnelle complexe orientée objet (EXPRESS). Naviguer dedans sans outil, c'est comme lire la Matrice en binaire."

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.

hierarchy_walker.py
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)
Pro Tip: Utilisez 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.

bim_pandas.py
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).

geom_engine.py
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
Warning: La tessellation est lourde. Évitez de tesselliser tout le projet si vous n'avez besoin que des métadonnées. L'empreinte mémoire explose vite.

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.

bim_writer.py
# 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)