Scan-to-BIM Automatique : La Transformation Numérique

Du nuage de points brut à la maquette IFC structurée : automatiser le travail du modélisateur.
Avancé
75 min
OpenCV, IfcOpenShell, Shapely
"Le modélisateur BIM passe 70% de son temps à tracer des murs sur des coupes de nuages de points. Notre mission : réduire ce temps à zéro grâce à des algorithmes de vision par ordinateur."

1. La Stratégie de la "Slice" (Coupe)

Détecter des murs directement en 3D est complexe et coûteux. La ruse de l'ingénieur consiste à projeter le problème en 2D. En extrayant une tranche (slice) du bâtiment à une hauteur stratégique (ex: 1.5m, coupant murs et fenêtres), nous transformons un problème 3D en une image 2D binaire.

slicer.py
import numpy as np

def create_floor_slice(pcd, height_min=1.2, height_max=1.8):
    # Filtre Pass-Band sur Z
    points = np.asarray(pcd.points)
    mask = (points[:, 2] > height_min) & (points[:, 2] < height_max)
    slice_pcd = pcd.select_by_index(np.where(mask)[0])
    
    # Projection 2D (écrasement Z)
    grid, transform = points_to_raster(slice_pcd, pixel_size=0.05)
    return grid # Image binaire (0 ou 255)

Cette étape de "Rasterization" est critique. Une résolution de pixel de 5cm est un bon compromis pour détecter l'épaisseur des murs standards.

2. Transformée de Hough : Détecter les Lignes

Une fois en image binaire, nous utilisons la Transformée de Hough Probabiliste (disponible dans OpenCV) pour trouver des segments de ligne alignés.

line_detector.py
import cv2

def find_walls(image_grid):
    lines = cv2.HoughLinesP(
        image_grid, 
        rho=1,              # Résolution distance (1 pixel)
        theta=np.pi/180,    # Résolution angulaire (1 degré)
        threshold=50,       # Vote minimum
        minLineLength=30,   # Longueur min (ex: 1.5m)
        maxLineGap=10       # Gap autorisé pour fusionner
    )
    return lines
Wall Segment A Wall Segment B

3. Reconstruction Topology : De Lignes à Murs

Hough nous donne des segments "spaghettis". Nous devons les nettoyer : fusionner les colinéaires, connecter les coins perpendiculaires et fermer les boucles. C'est ici que la logique géométrique entre en jeu.

Astuce: Utilisez la bibliothèque Shapely pour bufferiser les lignes et faire des opérations booléennes (Union) pour créer des polygones de murs propres.

4. Génération IFC avec IfcOpenShell

Enfin, nous instancions des objets IfcWallStandardCase. Contrairement à un mesh "dumb", un mur IFC possède une sémantique, une épaisseur, une hauteur et une composition de matériaux.

ifc_builder.py
import ifcopenshell
from ifcopenshell.api import run

# Création projet vierge
model = ifcopenshell.file()
project = run("root.create_entity", model, ifc_class="IfcProject", name="AutoBIM")

# Création d'un mur à partir des coords p1, p2
wall = run("root.create_entity", model, ifc_class="IfcWall")
run("geometry.edit_object_placement", model, product=wall)
# ... extrusion profile definition ...

L'API ifcopenshell.api (introduite récemment) simplifie grandement la création d'entités valides par rapport à l'ancienne méthode bas-niveau.

Synthèse : Les Limites de l'Automatisme

Étape Difficulté Taux de Succès Auto
Murs Droits (Manhattan World) Faible 95%
Murs Courbes Moyenne 60%
Ouvertures (Portes/Fenêtres) Haute 40%
Réseaux MEP Extrême 10%

Le Scan-to-BIM automatique n'est pas une boîte noire magique, mais un assistant puissant qui pré-mâche 80% de la géométrie simple.

🏗️ Construisez votre propre logiciel Scan-to-BIM

Dans le cursus Elite, nous codons ensemble un software complet avec Interface Graphique pour automatiser ce processus.

Rejoindre l'Elite (120h)