{"description":"Scène décrite en JSON, coordonnées plan (x,y) en millimètres, hauteurs en millimètres. Repère : x = droite, y = profondeur, z = hauteur verticale.","workflow_agent":"1) lire ce schéma  2) composer la scène  3) POST /cao/verifier (gratuit, sans clé)  4) corriger alertes critiques (intégrité.correctifs / POST /cao/integrite appliquer:true)  5) /cao/rendu puis /cao/pdf ou /cao/dxf, OU /cao/visite/plan puis Visite 4K. Ne livrez pas planche ni visite avec alertes critiques.","champs":{"murs":{"type":"liste d'objets","requis":false,"note":"MULTI-ÉTAGES : `z` (base du mur, défaut 0) EMPILE des étages — un R+1 = les mêmes murs répétés avec z = hauteur du RDC (ex. 2600). Posez `toitures` au sommet.","objet":{"x1":"nombre (mm) — requis","y1":"nombre (mm) — requis","x2":"nombre (mm) — requis","y2":"nombre (mm) — requis","hauteur":"nombre (mm) — optionnel, défaut 2500","epaisseur":"nombre (mm) — optionnel, défaut 200","z":"nombre (mm) — optionnel, défaut 0 — altitude de la BASE du mur (multi-étages)"}},"escaliers":{"type":"liste d'objets","requis":false,"note":"Escalier droit dimensionné selon la LOI DE BLONDEL (2×hauteur de marche + giron ≈ 630 mm) : donnez le dénivelé `hauteur` d'étage, le nombre de marches se calcule seul (~17,5 cm/marche). Rendu DXF/aperçu/PDF ; métrés indiquent la conformité.","objet":{"x":"nombre (mm) — requis — départ de la volée (pied de l'escalier)","y":"nombre (mm) — requis","hauteur":"nombre (mm) — optionnel, défaut 2600 — dénivelé total à monter (hauteur d'étage)","largeur":"nombre (mm) — optionnel, défaut 1000 — emmarchement","rotation":"degrés — optionnel, défaut 0 — direction de la montée","finition":"texte — optionnel, défaut chene — aspect 3D : acier, beton, bois_clair, chene, chene_clair, frene, hetre, marbre, metal_noir, noyer, pierre, pin","finition_rampe":"texte — optionnel — finition du garde-corps rampant (mêmes valeurs que garde_corps.finition) ; par défaut assortie à la volée : escalier bois → rampe du même bois, béton/métal → noir mat","giron":"nombre (mm) — optionnel — profondeur de marche (défaut : Blondel)","nb_marches":"entier — optionnel — sinon calculé (~17,5 cm/marche)","z":"nombre (mm) — optionnel, défaut 0 — altitude du pied (multi-étages)"}},"garde_corps":{"type":"liste d'objets","requis":false,"note":"Garde-corps le long d'un segment, à PLAT. NF P01-012 : ≥1000 mm (plan), ≥900 mm au nez de CHAQUE marche (`/cao/integrite` le propose en correctif). Rendu DXF/PDF/IFC.","objet":{"x1":"nombre (mm) — requis","y1":"nombre (mm) — requis","x2":"nombre (mm) — requis","y2":"nombre (mm) — requis","hauteur":"nombre (mm) — optionnel, défaut 1000 — ≥900 le long d'une volée (voir note)","z":"nombre (mm) — optionnel, défaut 0 — altitude de la base de ce segment","finition":"texte — optionnel, défaut noir_mat — aspect 3D : acier_brut, anthracite, blanc, bois_chene, bois_clair, bois_hetre, bronze, galva, gris_sable, inox, laiton, noir_mat, noyer, verre, verre_depoli, verre_feuillete"}},"ascenseurs":{"type":"liste d'objets","requis":false,"note":"Ascenseur = gaine (4 parois, avant ouvert = porte) + cabine, desservant plusieurs `niveaux` empilés. Défauts ACCESSIBILITÉ NF EN 81-70 (cabine 1100×1400 mm, porte 900 mm). Rendu DXF/aperçu/PDF (symbole ASC), métrés signalent la conformité PMR. Placez la cabine à côté de la cage d'escalier pour une circulation complète.","objet":{"x":"nombre (mm) — requis — centre de la cabine","y":"nombre (mm) — requis","largeur":"nombre (mm) — optionnel, défaut 1100 (cabine, axe x local)","profondeur":"nombre (mm) — optionnel, défaut 1400 (cabine, axe y local)","hauteur":"nombre (mm) — optionnel, défaut 2600 — hauteur desservie PAR niveau","niveaux":"entier — optionnel, défaut 2 — nombre de niveaux desservis (gaine = hauteur × (niveaux-1))","porte":"nombre (mm) — optionnel, défaut 900 (≥ 800 = PMR)","rotation":"degrés — optionnel, défaut 0 — orientation (la porte donne côté +y local)","z":"nombre (mm) — optionnel, défaut 0 — altitude de la base (niveau le plus bas desservi)"}},"boites":{"type":"liste d'objets","requis":false,"objet":{"x":"nombre (mm, centre) — requis","y":"nombre (mm, centre) — requis","l":"nombre (mm, longueur) — requis","p":"nombre (mm, profondeur) — requis","h":"nombre (mm, hauteur) — requis","z":"nombre (mm, altitude de la base) — optionnel, défaut 0","rotation":"nombre (degrés, autour de l'axe vertical) — optionnel, défaut 0"}},"plan":{"type":"liste d'objets","requis":false,"objet":{"x1":"mm","y1":"mm","x2":"mm","y2":"mm"}},"cercles":{"type":"liste d'objets","requis":false,"objet":{"x":"mm","y":"mm","r":"mm"}},"ouvertures":{"type":"liste d'objets","requis":false,"note":"Portes/fenêtres incrustées sur un mur — rendues par /cao/pdf (élévations + vue axonométrique), la Visite 4K / visite virtuelle (baies réellement percées) et /cao/ifc (IfcDoor/IfcWindow). Sans effet sur dxf/metres.","objet":{"mur":"entier — requis — index du mur porteur dans murs[] (0 = premier)","position":"nombre (mm) — requis — distance depuis le début du mur (x1,y1)","largeur":"nombre (mm) — requis","hauteur":"nombre (mm) — requis","z":"nombre (mm, allège RELATIVE à la base du mur) — optionnel, défaut 900 (fenêtre) ou 0 (porte). Sur un mur R+1 (z=2700), z:900 place le bas de l'ouvrant à 3600 mm du sol.","type":"'fenetre' | 'porte' — optionnel, défaut 'fenetre'"}},"toitures":{"type":"liste d'objets","requis":false,"note":"Rendues par /cao/pdf, la Visite 4K / visite virtuelle et /cao/ifc. SANS ce champ : un toit plat est auto-généré sur l'emprise de TOUS les murs (comportement historique). AVEC ce champ : composez librement (plusieurs entrées = plusieurs pans, ex. un bâtiment en L ou une lucarne en plus du toit principal).","types":["chien_assis","conique","deux_pans","dome","personnalise","plat","quatre_pans"],"objet_commun":{"type":"un des types ci-dessus — optionnel, défaut 'plat'","murs":"liste d'index dans murs[] — optionnel — limite l'emprise auto à ces murs (sinon : tous les murs). Ignoré si `polygone` fourni.","polygone":"liste de points {x,y} (mm) — optionnel — emprise personnalisée explicite, remplace le rectangle auto-calculé (tout type sauf 'chien_assis')","z":"nombre (mm) — optionnel — altitude de la base (défaut : sommet des murs concernés)","debord":"nombre (mm) — optionnel, défaut 200 — débord de toit sur l'emprise auto","epaisseur":"nombre (mm) — optionnel, défaut 180 — épaisseur de dalle ('plat' uniquement)","hauteur_faitage":"nombre (mm) — optionnel, défaut 1200 (600 pour 'chien_assis') — hauteur du faîtage/sommet/dôme au-dessus de z","rotation":"degrés — optionnel, défaut 0 — orientation du faîtage ('deux_pans' uniquement ; 0 = faîtage parallèle à l'axe X)","rayon":"nombre (mm) — optionnel — rayon de base ('conique'/'dome' ; défaut déduit de l'emprise)","segments":"entier — optionnel, défaut 16 — nombre de facettes ('conique'/'dome')","apex":"{x,y,[z]} (mm) — optionnel ('personnalise') — sommet à une position libre (défaut : centroïde de `polygone` + hauteur_faitage). Sans apex, 'personnalise' se comporte comme 'plat'."},"objet_chien_assis":{"type":"'chien_assis'","x":"nombre (mm) — centre","y":"nombre (mm) — centre","z":"nombre (mm) — base — À POSITIONNER sur le pan du toit porteur","largeur":"nombre (mm), défaut 1000","profondeur":"nombre (mm), défaut 800","hauteur":"nombre (mm), défaut 900 — hauteur de la façade avant","hauteur_faitage":"nombre (mm), défaut 600 — au-dessus de `hauteur`"}},"electricite":{"type":"liste d'objets","requis":false,"note":"Symboles électricité. PRÉSENT dans TOUS les rendus : calque `ELEC` du DXF (cercle + repère), aperçu `render` (SVG/PNG), plan technique et métrés de la planche `/cao/pdf`, et comptage par type dans `/cao/metres`. Position : attaché à un mur (`mur`+`position`, comme les ouvertures) ou libre (`x`,`y`).","types":["detecteur_fumee","differentiel","interrupteur","luminaire","prise","prise_rj45","prise_spe","tableau_electrique","va_et_vient","vmc"],"objet":{"type":"un des types ci-dessus — optionnel, défaut 'prise'","mur":"entier — optionnel — index dans murs[] (position par mur)","position":"nombre (mm) — avec `mur` — distance depuis (x1,y1)","x":"nombre (mm) — sans `mur` — position libre","y":"nombre (mm)","z":"nombre (mm) — optionnel — défaut selon le type (NF C 15-100 : prises 30 cm, interrupteurs 110 cm ; luminaire/detecteur_fumee/vmc = plafond)"}},"mobilier":{"type":"liste d'objets","requis":false,"note":"MEUBLES ET DÉCORATION — de vrais objets (parasol, arbre, clôture, WC, canapé, tapis, plante…), pas des boîtes : un parasol a un mât, une toile à pans et un socle. Rendu en VISITE 4K, planche PDF, DXF et métrés. N'utilisez `boites[]` que pour un volume générique. Catalogue + cotes par défaut (gratuit, sans clé) : GET /api/v1/cao/mobilier.","types":["abri_jardin","arbre","arbre_conifere","armoire","baignoire","banc_jardin","barbecue","bassin","berline","bibliotheque","bureau","cadre_mural","canape","canape_angle","chaise","citadine","cloture_bois","cloture_fer","cloture_grillage","commode","cuisine","douche","evier","fauteuil","figurant","figurant_assis","four","haie","hotte","jardiniere","lampadaire","lavabo","lave_linge","linge_lit","lit","livres","luminaire","meuble_tv","miroir","parasol","pergola","plante_interieur","plaque_cuisson","portail","porte_manteau","refrigerateur","rideaux","salon_jardin","suv","table","table_basse","table_chevet","tapis","television","terrasse","transat","utilitaire","vaisselle","wc"],"objet":{"type":"un des types du catalogue — REQUIS","x":"nombre (mm, centre) — requis","y":"nombre (mm, centre) — requis","z":"nombre (mm, altitude du SOL sous l'objet) — optionnel, défaut 0","rotation":"degrés — optionnel, défaut 0","l, p, h, d":"nombres (mm) — optionnels : dimensions sur mesure. Par défaut, cotes courantes du catalogue (canapé 3 places 2100×950, lit double 2000×1600, parasol Ø3000…)","materiau":"texte — optionnel — force la matière (bois_chene, tissu_gris…)","label":"texte — optionnel — nom affiché"}},"plomberie":{"type":"liste d'objets","requis":false,"note":"Appareils sanitaires. PRÉSENT dans le DXF (calque `PLOMB`, empreinte + repère), l'aperçu `render` (SVG/PNG), la planche `/cao/pdf` et le comptage par type de `/cao/metres`. Les types qui ont un modèle 3D (wc, lavabo, douche, baignoire, evier) sont DÉSORMAIS aussi posés en volume dans la Visite 4K — une salle de bain n'est plus vide. Même positionnement que electricite (mur+position ou x,y).","types":["baignoire","chauffe_eau","compteur_eau","douche","evier","lavabo","radiateur","wc"],"objet":{"type":"un des types ci-dessus — optionnel, défaut 'evier'","mur":"entier — optionnel","position":"nombre (mm) — avec `mur`","x":"nombre (mm)","y":"nombre (mm)","z, l, p, h":"nombres (mm) — optionnels, défauts selon le type (dimensions commerciales usuelles)","rotation":"degrés — optionnel, défaut 0"}},"reseaux":{"type":"liste d'objets","requis":false,"note":"Canalisations de plomberie. PRÉSENT dans le DXF (calque `PLOMB_RESEAUX`, polylignes + repère de type), l'aperçu `render` (SVG/PNG), la planche `/cao/pdf` et les mètres linéaires par type de `/cao/metres`.","types":["chauffage","ec","ef","ep","eu","ev"],"objet":{"type":"un des types ci-dessus — optionnel, défaut 'ef'","diametre":"nombre (mm) — optionnel — défaut selon le type","trace":"liste d'au moins 2 points {x,y} (mm) — tracé libre. Alias segment droit : x1/y1/x2/y2 (mm), comme murs/plan/garde_corps."}},"sols":{"type":"liste d'objets","requis":false,"note":"Matériau de sol par pièce — un point {x,y} DANS la pièce (détectée auto). Sans marqueur : défaut selon l'usage (carrelage sdb/WC/cuisine, parquet clair sinon). Rendu en 3D + /cao/metres ; hors contrôles de chevauchement mobilier.","types":["beton","carrelage","exterieur_terrasse","moquette","parquet_chene","parquet_clair"],"objet":{"x":"nombre (mm) — requis","y":"nombre (mm) — requis","type":"un des types ci-dessus — requis","z":"nombre (mm) — optionnel, déduit des murs proches si absent"}},"decoration":{"type":"liste d'objets","requis":false,"note":"Finitions déco/peinture par mur — colore les élévations (face 'exterieur') et la vue axonométrique (face détectée automatiquement selon l'orientation par rapport au centre du bâtiment). Métrés : m² par (type, couleur) + litres de peinture estimés (2 couches, 5 m²/L).","types":["beton_cire","carrelage_mural","enduit","lambris","papier_peint","peinture"],"objet":{"mur":"entier — requis — index dans murs[]","face":"'interieur' | 'exterieur' — optionnel, défaut 'interieur'","type":"un des types ci-dessus — optionnel, défaut 'peinture'","couleur":"couleur hexadécimale (ex. « #e2e0d5 ») — optionnel, défaut selon le type","finition":"'mat' | 'satin' | 'brillant' | 'structure' — optionnel, défaut mat — pilote la RUGOSITÉ en 3D : « brillant » renvoie un reflet net dans la Visite 4K et en visite virtuelle, « mat » aucun"}}},"regle":"Au moins un des champs (murs, boites, plan, cercles, toitures, electricite, plomberie, reseaux, decoration, escaliers, garde_corps, ascenseurs) doit contenir au moins un élément.","exemple_piece_simple":{"murs":[{"x1":0,"y1":0,"x2":4000,"y2":0,"hauteur":2500,"epaisseur":200},{"x1":4000,"y1":0,"x2":4000,"y2":3000,"hauteur":2500,"epaisseur":200},{"x1":4000,"y1":3000,"x2":0,"y2":3000,"hauteur":2500,"epaisseur":200},{"x1":0,"y1":3000,"x2":0,"y2":0,"hauteur":2500,"epaisseur":200}],"boites":[{"x":1000,"y":1500,"l":1600,"p":800,"h":750,"rotation":0}],"ouvertures":[{"mur":0,"position":1500,"largeur":900,"hauteur":2100,"type":"porte"}]},"exemple_toiture_4_pans":{"toitures":[{"type":"quatre_pans","hauteur_faitage":1500}]},"exemple_toiture_2_pans":{"toitures":[{"type":"deux_pans","hauteur_faitage":1500,"rotation":0}]},"exemple_toiture_composee_batiment_en_L":{"note":"2 entrées, chacune limitée à ses propres murs (`murs:[indices]`) — pour un bâtiment dont le contour n'est pas un simple rectangle.","toitures":[{"type":"quatre_pans","murs":[0,1],"hauteur_faitage":1200},{"type":"deux_pans","murs":[2,3],"hauteur_faitage":1400}]},"exemple_toiture_personnalisee":{"toitures":[{"type":"personnalise","polygone":[{"x":0,"y":0},{"x":6000,"y":0},{"x":3000,"y":5000}],"apex":{"x":3000,"y":2000,"z":2200}}]},"exemple_chien_assis":{"note":"S'ajoute à un toit existant — pensez à POSITIONNER x/y/z sur le pan porteur.","toitures":[{"type":"deux_pans","hauteur_faitage":1500},{"type":"chien_assis","x":3000,"y":0,"z":2900,"largeur":1300,"profondeur":900,"hauteur":900,"hauteur_faitage":600}]},"exemple_electricite_plomberie":{"note":"Rendu sur une planche à part (« Plan technique ») dans /cao/pdf, avec légende et métrés (nombre de points par type, mètres linéaires de réseaux par type).","electricite":[{"type":"prise","mur":0,"position":1000},{"type":"interrupteur","mur":3,"position":300},{"type":"luminaire","x":3000,"y":2000}],"plomberie":[{"type":"evier","x":1000,"y":500}],"reseaux":[{"type":"ef","trace":[{"x":0,"y":500},{"x":1000,"y":500}]}]},"exemple_decoration":{"decoration":[{"mur":0,"face":"interieur","type":"peinture","couleur":"#d1e8d5","finition":"satin"},{"mur":0,"face":"exterieur","type":"enduit","couleur":"#e8e4d8"}]},"exemple_multi_etages":{"_commentaire":"Maison R+2 : mêmes 4 murs répétés à z=0, 2600 et 5200, un escalier par niveau ADESSÉ À UN MUR (pas devant la porte), un garde-corps de trémie à chaque arrivée (NF P01-012), et une toiture 4 pans posée AU SOMMET (z = 7800). Ajoutez autant de niveaux que voulu en répétant les murs.","murs":[{"x1":0,"y1":0,"x2":8000,"y2":0,"z":0,"hauteur":2600},{"x1":8000,"y1":0,"x2":8000,"y2":6000,"z":0,"hauteur":2600},{"x1":8000,"y1":6000,"x2":0,"y2":6000,"z":0,"hauteur":2600},{"x1":0,"y1":6000,"x2":0,"y2":0,"z":0,"hauteur":2600},{"x1":0,"y1":0,"x2":8000,"y2":0,"z":2600,"hauteur":2600},{"x1":8000,"y1":0,"x2":8000,"y2":6000,"z":2600,"hauteur":2600},{"x1":8000,"y1":6000,"x2":0,"y2":6000,"z":2600,"hauteur":2600},{"x1":0,"y1":6000,"x2":0,"y2":0,"z":2600,"hauteur":2600},{"x1":0,"y1":0,"x2":8000,"y2":0,"z":5200,"hauteur":2600},{"x1":8000,"y1":0,"x2":8000,"y2":6000,"z":5200,"hauteur":2600},{"x1":8000,"y1":6000,"x2":0,"y2":6000,"z":5200,"hauteur":2600},{"x1":0,"y1":6000,"x2":0,"y2":0,"z":5200,"hauteur":2600}],"ouvertures":[{"mur":0,"position":3500,"largeur":1000,"hauteur":2100,"type":"porte"},{"mur":1,"position":2000,"largeur":1200,"hauteur":1400,"z":900,"type":"fenetre"},{"mur":2,"position":2500,"largeur":1200,"hauteur":1400,"z":900,"type":"fenetre"},{"mur":5,"position":2000,"largeur":1200,"hauteur":1400,"z":900,"type":"fenetre"},{"mur":6,"position":2500,"largeur":1200,"hauteur":1400,"z":900,"type":"fenetre"},{"mur":9,"position":2000,"largeur":1200,"hauteur":1400,"z":900,"type":"fenetre"},{"mur":10,"position":2500,"largeur":1200,"hauteur":1400,"z":900,"type":"fenetre"}],"escaliers":[{"x":700,"y":1500,"hauteur":2600,"largeur":1000,"rotation":90,"z":0},{"x":700,"y":1500,"hauteur":2600,"largeur":1000,"rotation":90,"z":2600}],"garde_corps":[{"x1":0,"y1":5945,"x2":1400,"y2":5945,"hauteur":1000,"z":2600},{"x1":0,"y1":5945,"x2":1400,"y2":5945,"hauteur":1000,"z":5200}],"toitures":[{"type":"quatre_pans","z":7800,"hauteur_faitage":2200,"debord":400}]},"endpoints":{"POST /api/v1/cao/verifier":"GRATUIT, sans clé — audit géométrique (alertes lucarnes flottantes, allège absolue, étage sans fenêtres…). Appelez AVANT pdf/dxf. MCP : cao_verifier","POST /api/v1/cao/dxf":"scène → fichier DXF (AutoCAD, LibreCAD, BricsCAD…) — calques MURS/OBJETS/PLAN/ELEC/PLOMB/PLOMB_RESEAUX/ESCALIER/GARDE_CORPS/ASCENSEUR. format=json inclut le champ alertes[]","POST /api/v1/cao/ifc":"scène → fichier IFC4 (BIM — Revit, ArchiCAD, Solibri…), GUID réel par élément, matériaux avec masse volumique/conductivité thermique. Ouvertures IfcDoor/IfcWindow qui percent réellement le mur (IfcOpeningElement + IfcRelVoidsElement/IfcRelFillsElement). format=json → {ifc, elements, unites}. MCP : cao_generer_ifc","POST /api/v1/cao/metres":"scène → métrés chiffrés (ml, m², m³, comptages électricité/plomberie, escaliers + conformité Blondel, garde-corps ml) + alertes[] — alias : /cao/quantites","POST /api/v1/cao/render":"scène → aperçu visuel simple (SVG par défaut, ou PNG via body.format)","POST /api/v1/cao/rendu-photo":"scène → studio PHOTO path-tracé 4K (/cao/visite-photo : Three r163 + three-gpu-pathtracer). Visite/XR restent sur le rastériseur r128. Fallback : url_photo_raster. GET explique l'endpoint.","POST /api/v1/cao/rendu-photo/cadrage":"PNG → recadrage 16:9 + relight (PIL). Optionnel. Jamais à la place de POST /cao/verifier. CAO_PHOTO_IA_URL = webhook si présent.","POST /api/v1/cao/pdf":"scène → PLANCHE complète (dessus + face + côté + vue axonométrique ombrée + plan technique électricité/plomberie, cotes, métrés) en PDF (ou HTML via body.format ; format=json → {html, alertes}). Bandeau d'alertes injecté si problèmes détectés.","POST /api/v1/cao/visite/plan":"PLAN DE TOURNAGE de la visite vidéo 4K : objectif (focale en mm, équivalent 24×36) + chemin de caméra (mm, même repère que la scène) + temps de pose par pièce. Body scène + duree_s + objectif{} + cadence{} + chemin[] optionnel (le vôtre, vérifié). MCP : cao_visite_plan. Le RENDU est fait par le GPU du navigateur — éditeur CAO → bouton « Visite 4K » (y coller le plan) ou CAD_startCinematicTour({plan}) : il n'y a plus de rendu vidéo côté serveur, un seul moteur pour une seule qualité.","GET /api/v1/cao/visite/objectifs":"GRATUIT, sans clé — catalogue des focales (14–85 mm) avec champ de vision en 16:9 et usage conseillé. Repères : 20 mm intérieur, 35 mm extérieur, 50 mm clôture."},"authentification":"X-API-Key requis pour dxf/metres/render/pdf, /cao/visite/plan et /cao/rendu-photo (pas pour /cao/schema, /cao/verifier, /cao/visite/objectifs ni /cao/rendu-photo/cadrage). Clé : https://synergieloc.fr/api-ia","export_pbr":"GLB (glTF 2.0 PBR) depuis le studio (bouton) ou l'éditeur CAO — import Twinmotion / D5. Pas d'export Datasmith natif : le GLB est le format d'échange.","promo":"🎁 CAO GRATUITE jusqu'au 2026-12-31 : les endpoints /api/v1/cao/* ne consomment aucune unité (toutes clés, tous plans). Après cette date, 2 unités par appel."}