From beb88684cb04617a582fbe7ba062fb2a78df4297 Mon Sep 17 00:00:00 2001 From: Jacquin Antoine Date: Sun, 10 May 2026 12:02:32 +0200 Subject: [PATCH] Fix basename: retirer .copc.laz au lieu de .laz seul Les fichiers LiDAR HD IGN ont l'extension .copc.laz (double extension). Path.stem ne retire que .laz, laissant .copc dans le basename. Ajout de _file_basename() qui retire les extensions connues dans l'ordre: .copc.laz, .copc.las, .laz, .las. Co-Authored-By: Claude Opus 4.6 --- lidar_pipeline/dtm.py | 9 ++++++++- lidar_pipeline/pipeline.py | 18 ++++++++++++++++-- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/lidar_pipeline/dtm.py b/lidar_pipeline/dtm.py index 4464b8b..a1196e2 100644 --- a/lidar_pipeline/dtm.py +++ b/lidar_pipeline/dtm.py @@ -218,7 +218,14 @@ def classify_ground(laz_file, temp_dir, method='auto', force=False): else: logger.info(f" Classification sol: {method.upper()} (forcé)") - output_las = temp_dir / f"{laz_file.stem}_ground_{method}.las" + # Strip all known LiDAR extensions (.copc.laz, .laz, .las) + laz_base = laz_file.name + for ext in ['.copc.laz', '.copc.las', '.laz', '.las']: + if laz_base.lower().endswith(ext): + laz_base = laz_base[:-len(ext)] + break + + output_las = temp_dir / f"{laz_base}_ground_{method}.las" if output_las.exists() and not force: logger.info(f" Classification {method.upper()} déjà effectuée — fichier existant réutilisé") diff --git a/lidar_pipeline/pipeline.py b/lidar_pipeline/pipeline.py index 96d4b96..c0a419f 100644 --- a/lidar_pipeline/pipeline.py +++ b/lidar_pipeline/pipeline.py @@ -24,6 +24,20 @@ except RuntimeError: logger = logging.getLogger("lidar") +def _file_basename(path): + """Extract base name from a LAZ/LAS file, removing all known extensions. + + Handles double extensions like .copc.laz correctly: + 'file.copc.laz' -> 'file', not 'file.copc' + """ + name = Path(path).name + # Remove known LiDAR extensions (order matters: longest first) + for ext in ['.copc.laz', '.copc.las', '.laz', '.las']: + if name.lower().endswith(ext): + return name[:-len(ext)] + return Path(path).stem + + class FilePrefixFilter(logging.Filter): """Adds a file prefix to log messages when processing a specific file.""" def __init__(self): @@ -208,7 +222,7 @@ class LidarArchaeoPipeline: def process_file(self, laz_file): """Process a single LAZ file through the full pipeline.""" - basename = laz_file.stem + basename = _file_basename(laz_file) _file_filter.basename = basename t_start = time.time() @@ -358,7 +372,7 @@ def _process_file_standalone(laz_file_str, input_dir, output_dir, resolution, fo worker_logger.addFilter(_file_filter) pipeline = LidarArchaeoPipeline(input_dir, output_dir, resolution=resolution, workers=1, force=force, ground_method=ground_method, force_classify=force_classify) - basename = Path(laz_file_str).stem + basename = _file_basename(laz_file_str) pipeline.temp_dir = pipeline.output_dir / f"temp_{basename}" pipeline.temp_dir.mkdir(exist_ok=True) laz_file = Path(laz_file_str)