Regroupe chaque nuage avec son role dans le calcul de volume (Ceil = surface
superieure, Ground = plan Z constant ou second nuage), cote a cote comme dans
la boite de dialogue "Compute Volume" du GUI, au lieu d'un unique bloc de
parametres partages en dessous des deux fichiers. La hauteur de reference Z
(mode plan constant) est deplacee dans le panneau Ground plutot que noyee dans
les parametres avances.
Garde les reglages de grille/remplissage (grid step, empty fill, cell height,
direction) dans une section UNIQUE et partagee : cote CLI CloudCompare
(-PROJ/-EMPTY_FILL/-VERT_DIR), ce sont des reglages appliques a toute la
grille, pas un parametre par nuage - les dupliquer par role induirait en
erreur sur ce que le backend supporte reellement.
Ajoute un tooltip (title) sur chaque champ expliquant sa correspondance avec
le flag CLI CloudCompare concerne, et des labels reprenant la terminologie
du GUI (Ceil/Ground, Fill empty cells with, Cell height...).
Verifie que toutes les options exposees correspondent a des flags CLI
CloudCompare reellement supportes par le backend (aucune option inventee).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Pipeline: corrige le biais de sous-echantillonnage sur median_nn (facteur
sqrt(total/echantillon), gonflait le pas spatial jusqu'a x20 sur les gros
nuages), applique un decalage global X/Y pour la precision float32 en
coordonnees projetees (Lambert-93), fixe la portee de remplissage des trous
sur la grille du niveau 0 (au lieu de croitre a chaque niveau), utilise un
percentile robuste pour zref au lieu du minimum brut, et filtre plus
precisement le fichier de grille parasite genere par -VOLUME.
Securite: valide l'id de run (uuid) sur toutes les routes avant de construire
un chemin filesystem (traversee de repertoire post-auth via zip/csv/bin/images),
assainit le nom de fichier uploade avant multer, retire enableCors() (surface
inutile), passe le conteneur en utilisateur non-root.
Documente l'ensemble de la methode et ses limites dans CONCEPT.md.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Bouton "Supprimer" sur chaque run (liste + detail), DELETE deja expose cote API.
- Tous les parametres CloudCompare mirroires dans l'UI (mirroir de la boite "Compute Volume" du
GUI) : strategie de remplissage (leave_empty/min/max/custom/interpolate/kriging), hauteur de
cellule (moyenne/min/max/mediane, -PROJ), direction de projection (X/Y/Z, -VERT_DIR),
multiplicateur de grille. Nuage comble desormais exporte en ASCII (pas .bin) : -VOLUME le lit
nativement, evite un aller-retour inutile puisqu'il faut de toute facon un export ASCII pour la
carte de comparaison.
- Tableau : volume/surface/volume ajoute/volume retire avec % absolu et % relatif vs niveau 0.
Matching cells retire du tableau et des graphiques (mais toujours calcule/stocke, juste plus
affiche).
- Carte de comparaison unique par niveau (bleu->rouge façon CloudCompare, colormap jet) a la place
des heightmaps separees par nuage : diff = ceil - ground (ou ceil - plan constant), calculee
nous-memes par binning numpy sur une grille commune.
- README + CLAUDE.md : avertissement explicite sur la persistance Coolify quand le build pack est
"Application"/Dockerfile plutot que "Docker Compose" (docker-compose.yml et son volume nomme sont
alors completement ignores par Coolify, il faut un volume "Storages" configure manuellement).
- Valide en local avec les 2 vrais nuages utilisateur (mode comparaison) : resultats identiques a
avant (14 244 -> 14 722 m3 selon le niveau), cartes de comparaison generees a chaque niveau,
bouton suppression teste via l'UI.
- .env.example committe, documente toutes les variables (auth, uploads, timeouts) avec
instructions pour generer un hash bcrypt.
- .env local (gitignore) pour docker compose : attention, echapper chaque \$ en \$\$ dans le hash
bcrypt sinon docker compose l'interprete comme de la substitution de variable et le tronque
silencieusement (verifie : $2a$10$xxx devenait $2a$10 tronque sans l'echappement).
- Nouveau mode "cloud_compare" (en plus de "const_height") : comparaison entre une surface
superieure et une limite inferieure, avec appariement de densite avant le niveau 0 puis
decimation synchronisee x2 sur 5 etapes. UI : selecteur de mode + upload double avec labels
explicites (surface superieure / limite inferieure).
- Remplissage des trous de scan (interpolation Delaunay bornee par max-edge-length) avant chaque
calcul de volume, dans les deux modes. -VOLUME n'ayant aucune option native pour ca (verifie dans
les sources CloudCompare), on rasterize+comble+exporte en nuage avant de le passer a -VOLUME.
Override utilisateur possible pour la distance max, afin de ne pas combler les parties concaves
du contour de l'objet mesure.
- Fix critique : CloudCompare formate les grands nombres avec une virgule comme separateur de
milliers ("Volume: 14,244.46") ; le parsing tronquait silencieusement a la premiere virgule
(14 244 devenait 14). Trouve en testant avec un vrai nuage industriel.
- Validation avec 2 vrais nuages utilisateur : le mode Z constant donnait ~50m3 (plan de reference
sans rapport avec la base reelle de l'amas, nuage contenant du contexte environnant) ; le nouveau
mode comparaison donne ~14 244m3, stable a +/-4% meme a 16x de decimation.
- CLAUDE.md mis a jour avec tous ces findings (limitation -VOLUME/LEAVE_EMPTY, technique de
contournement, piege du separateur de milliers, architecture du mode 2 nuages).
- Grille de calcul du volume adaptee dynamiquement au pas spatial de chaque niveau (au lieu d'une
grille fixe derivee du niveau 0) : evite l'effondrement artificiel du "matching cells %" observe
des le premier niveau de decimation (99% -> 58% -> 13% -> 3% -> 0.9% -> 0.2%), qui refletait un
desalignement grille/densite plutot qu'une vraie perte d'information.
- Authentification HTTP Basic sur toute l'app (UI + API), identifiants en env (AUTH_USERNAME /
AUTH_PASSWORD_HASH hashe bcrypt), desactivable en dev local si non definis. /health reste public
pour le healthcheck Docker/Coolify.