- 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.
91 lines
3.4 KiB
TypeScript
91 lines
3.4 KiB
TypeScript
export type RunMode = 'const_height' | 'cloud_compare';
|
|
|
|
export type CloudRole = 'unique' | 'top' | 'bottom';
|
|
|
|
/** Mirroir des strategies de remplissage de cellules vides de CloudCompare (-EMPTY_FILL). */
|
|
export type EmptyCellStrategy = 'leave_empty' | 'min_height' | 'max_height' | 'custom_height' | 'interpolate' | 'kriging';
|
|
|
|
/** Mirroir de -PROJ (type de projection par cellule). INV_VAR omis (necessite un champ scalaire dedie, non applicable ici). */
|
|
export type ProjectionType = 'avg' | 'min' | 'max' | 'med';
|
|
|
|
/** Mirroir de -VERT_DIR : 0=X, 1=Y, 2=Z. */
|
|
export type VertDir = 0 | 1 | 2;
|
|
|
|
export interface LevelCloudInfo {
|
|
role: CloudRole;
|
|
spatialStep: number | null; // null pour le niveau 0 (nuage complet, non decime)
|
|
pointCount: number;
|
|
pointRatio: number; // vs le niveau 0 du meme role
|
|
binFile: string | null; // chemin relatif au dossier du run (nuage brut, non rempli)
|
|
}
|
|
|
|
export interface LevelResult {
|
|
level: number;
|
|
gridStep: number | null; // grille de calcul du volume a CE niveau (adaptee dynamiquement, voir CLAUDE.md)
|
|
maxEdgeLength: number | null; // limite de remplissage des trous (Delaunay) a CE niveau, si strategie = interpolate
|
|
clouds: LevelCloudInfo[]; // 1 element en mode const_height, 2 (top puis bottom) en mode cloud_compare
|
|
volume: number | null;
|
|
surface: number | null;
|
|
addedVolume: number | null;
|
|
removedVolume: number | null;
|
|
matchingCellsPct: number | null;
|
|
groundNonMatchingPct: number | null;
|
|
ceilNonMatchingPct: number | null;
|
|
diffMapImage: string | null; // chemin relatif au dossier du run : carte de comparaison unique (bleu->rouge)
|
|
warn: boolean;
|
|
status: 'ok' | 'skipped' | 'error';
|
|
message?: string;
|
|
computeTimeMs: number;
|
|
}
|
|
|
|
export interface RunParamsInput {
|
|
mode: RunMode;
|
|
zrefOverride?: number; // mode const_height uniquement
|
|
initialStepOverride?: number;
|
|
gridStepMultiplierOverride?: number;
|
|
maxEdgeLengthOverride?: number;
|
|
emptyCellStrategy?: EmptyCellStrategy; // defaut 'interpolate'
|
|
customHeightValue?: number; // requis si emptyCellStrategy = 'custom_height'
|
|
krigingKnn?: number; // requis si emptyCellStrategy = 'kriging'
|
|
projectionType?: ProjectionType; // defaut 'avg'
|
|
vertDir?: VertDir; // defaut 2 (Z)
|
|
}
|
|
|
|
export interface RunReport {
|
|
runId: string;
|
|
mode: RunMode;
|
|
originalFilename: string; // fichier unique (const_height) ou nom du nuage du haut (cloud_compare)
|
|
originalFilenameBottom: string | null; // mode cloud_compare uniquement
|
|
createdAt: string;
|
|
params: {
|
|
zref: number | null; // mode const_height uniquement
|
|
zrefSource: 'override' | 'auto' | null;
|
|
initialStep: number;
|
|
initialStepSource: 'override' | 'auto';
|
|
gridStepMultiplier: number;
|
|
gridStepMultiplierSource: 'override' | 'auto';
|
|
maxEdgeLengthMultiplier: number;
|
|
maxEdgeLengthSource: 'override' | 'auto';
|
|
emptyCellStrategy: EmptyCellStrategy;
|
|
customHeightValue: number | null;
|
|
krigingKnn: number | null;
|
|
projectionType: ProjectionType;
|
|
vertDir: VertDir;
|
|
factor: number;
|
|
steps: number;
|
|
densityMatch: {
|
|
topSpacing: number;
|
|
bottomSpacing: number;
|
|
matchedSpacing: number;
|
|
preDecimatedRole: 'top' | 'bottom' | 'none';
|
|
} | null; // mode cloud_compare uniquement
|
|
sampleStats: {
|
|
sampleCount: number;
|
|
meanNn: number;
|
|
medianNn: number;
|
|
bboxApprox: { xmin: number; xmax: number; ymin: number; ymax: number; zmin: number; zmax: number };
|
|
};
|
|
};
|
|
levels: LevelResult[];
|
|
mergedBinFile: string | null;
|
|
}
|