Commit graph

8 commits

Author SHA1 Message Date
dfba8e7897 Reorganise le formulaire de run selon les roles Ceil/Ground de CloudCompare
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>
2026-07-10 18:50:25 +02:00
9d6ebf5177 Fiabilise le pipeline de volume et corrige plusieurs failles de securite
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>
2026-07-10 18:13:27 +02:00
051209b022 Suppression de run, parametres CC exposes, pourcentages vs L0, carte de comparaison unique
- 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.
2026-07-10 17:03:33 +02:00
24aa2e95db Documente le piege $ dans .env pour docker compose (hash bcrypt tronque) 2026-07-10 15:38:37 +02:00
c61a6bfea1 Ajoute .env.example pour la config des variables d'environnement
- .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).
2026-07-10 15:37:29 +02:00
86a75bd47b Mode comparaison a 2 nuages + remplissage de trous + fix critique de parsing
- 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).
2026-07-10 15:21:37 +02:00
7f2e4c323b Auth HTTP Basic + grille de volume adaptative par niveau
- 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.
2026-07-10 14:34:27 +02:00
79daa30a8a Implementation initiale : calcul de volume 2.5D CloudCompare et test de robustesse par decimation spatiale progressive
- Backend NestJS orchestrant CloudCompare CLI (stats, decimation x2 sur 5 etapes, volume, assemblage .bin)
- Scripts Python (laspy, scipy, matplotlib) pour la conversion LAS/LAZ et la generation d'images
- Frontend web simple (Tailwind CDN) avec historique des runs
- Image Docker (debian:trixie-slim + cloudcompare apt + xvfb) prete pour deploiement Coolify
- Lint/typecheck/tests unitaires integres comme portes de qualite au build Docker
- CLAUDE.md documentant les comportements CloudCompare CLI verifies empiriquement
2026-07-10 13:55:25 +02:00