From f3f39b7ab056431570c995d530ffae1c02cd95a5 Mon Sep 17 00:00:00 2001 From: Eric Callahan Date: Mon, 28 Nov 2022 10:31:15 -0500 Subject: [PATCH] metadata: handle object processing identity This allows object processing for slicers with aliases. Signed-off-by: Eric Callahan --- moonraker/components/file_manager/metadata.py | 40 ++++++++++++++++--- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/moonraker/components/file_manager/metadata.py b/moonraker/components/file_manager/metadata.py index 4eede96..546bd33 100644 --- a/moonraker/components/file_manager/metadata.py +++ b/moonraker/components/file_manager/metadata.py @@ -101,6 +101,7 @@ class BaseSlicer(object): self.header_data: str = "" self.footer_data: str = "" self.layer_height: Optional[float] = None + self.has_m486_objects: bool = False def set_data(self, header_data: str, @@ -146,6 +147,7 @@ class BaseSlicer(object): patterns.append(pattern) for regex in patterns: if re.search(regex, data) is not None: + self.has_m486_objects = regex == r"\nM486" return True return False @@ -921,19 +923,46 @@ SUPPORTED_DATA = [ 'filament_weight_total', 'thumbnails'] -def process_objects(file_path: str) -> bool: +def process_objects(file_path: str, slicer: BaseSlicer, name: str) -> bool: try: - from preprocess_cancellation import preprocessor + from preprocess_cancellation import ( + preprocess_slicer, + preprocess_cura, + preprocess_ideamaker, + preprocess_m486 + ) except ImportError: log_to_stderr("Module 'preprocess-cancellation' failed to load") return False fname = os.path.basename(file_path) - log_to_stderr(f"Performing Object Processing on file: {fname}") + log_to_stderr( + f"Performing Object Processing on file: {fname}, " + f"sliced by {name}" + ) with tempfile.TemporaryDirectory() as tmp_dir_name: tmp_file = os.path.join(tmp_dir_name, fname) with open(file_path, 'r') as in_file: with open(tmp_file, 'w') as out_file: - preprocessor(in_file, out_file) + try: + if slicer.has_m486_objects: + processor = preprocess_m486 + elif isinstance(slicer, PrusaSlicer): + processor = preprocess_slicer + elif isinstance(slicer, Cura): + processor = preprocess_cura + elif isinstance(slicer, IdeaMaker): + processor = preprocess_ideamaker + else: + log_to_stderr( + f"Object Processing Failed, slicer {name}" + "not supported" + ) + return False + for line in processor(in_file): + out_file.write(line) + except Exception as e: + log_to_stderr(f"Object processing failed: {e}") + return False shutil.move(tmp_file, file_path) return True @@ -972,7 +1001,8 @@ def extract_metadata( metadata: Dict[str, Any] = {} slicer, ident = get_slicer(file_path) if check_objects and slicer.has_objects(): - if process_objects(file_path): + name = ident.get("slicer", "unknown") + if process_objects(file_path, slicer, name): slicer, ident = get_slicer(file_path) metadata['size'] = os.path.getsize(file_path) metadata['modified'] = os.path.getmtime(file_path)