From 2e5c42b3839289915754845102c8a908c64ac51f Mon Sep 17 00:00:00 2001 From: maziggy Date: Thu, 11 Dec 2025 12:32:18 +0100 Subject: [PATCH] For multi plates files, archive card now shows cover image of printed plate --- backend/app/services/archive.py | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/backend/app/services/archive.py b/backend/app/services/archive.py index fa9d98474..1e7993beb 100644 --- a/backend/app/services/archive.py +++ b/backend/app/services/archive.py @@ -1,5 +1,6 @@ import hashlib import json +import re import zipfile import shutil from datetime import datetime @@ -18,8 +19,9 @@ from backend.app.models.filament import Filament class ThreeMFParser: """Parser for Bambu Lab 3MF files.""" - def __init__(self, file_path: Path): + def __init__(self, file_path: Path, plate_number: int | None = None): self.file_path = file_path + self.plate_number = plate_number # Which plate was printed (1, 2, 3, etc.) self.metadata: dict = {} def parse(self) -> dict: @@ -285,12 +287,23 @@ class ThreeMFParser: pass def _extract_thumbnail(self, zf: zipfile.ZipFile): - """Extract thumbnail image from 3MF.""" - thumbnail_paths = [ + """Extract thumbnail image from 3MF. + + If a plate_number was specified, try to use that plate's thumbnail first. + """ + thumbnail_paths = [] + + # If a specific plate was printed, try that thumbnail first + if self.plate_number: + thumbnail_paths.append(f"Metadata/plate_{self.plate_number}.png") + + # Fallback to default paths + thumbnail_paths.extend([ "Metadata/plate_1.png", "Metadata/thumbnail.png", "Metadata/model_thumbnail.png", - ] + ]) + for thumb_path in thumbnail_paths: if thumb_path in zf.namelist(): self.metadata["_thumbnail_data"] = zf.read(thumb_path) @@ -631,8 +644,16 @@ class ArchiveService: # Compute content hash for duplicate detection content_hash = self.compute_file_hash(dest_file) + # Extract plate number from filename (e.g., "plate_5" from "/data/Metadata/plate_5.gcode") + plate_number = None + if print_data: + filename = print_data.get("filename", "") + match = re.search(r'plate_(\d+)', filename) + if match: + plate_number = int(match.group(1)) + # Parse 3MF metadata - parser = ThreeMFParser(dest_file) + parser = ThreeMFParser(dest_file, plate_number=plate_number) metadata = parser.parse() # Save thumbnail if present