Scan-to-BIM Automatique : La Transformation Numérique
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.
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.
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
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.
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.
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)