From d145442d4b6b99859bde3aa5c4ceeaeb36a248e1 Mon Sep 17 00:00:00 2001 From: th33xitus Date: Mon, 27 Dec 2021 23:05:48 +0100 Subject: [PATCH] metadata.py: add parsing of filament type This commit will add parsing of optional filament type metadata for: - PrusaSlicer and it's derivatives - Cura - IdeaMaker For Cura and IdeaMaker it is necessary to add a custom start g-code comment. Cura: ;Filament type = {material_type} IdeaMaker: ;Filament type = {filament_name_abbreviation1} Signed-off-by: Dominik Willner --- moonraker/components/file_manager/metadata.py | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/moonraker/components/file_manager/metadata.py b/moonraker/components/file_manager/metadata.py index 09f84d5..3cf65f3 100644 --- a/moonraker/components/file_manager/metadata.py +++ b/moonraker/components/file_manager/metadata.py @@ -26,6 +26,7 @@ from typing import ( Dict, List, Type, + Union ) if TYPE_CHECKING: pass @@ -83,6 +84,12 @@ def _regex_find_first(pattern: str, data: str) -> Optional[float]: return None return val +def _regex_find_string(pattern: str, data: str) -> Optional[str]: + match = re.search(pattern, data) + if match: + return match.group(1) + return None + # Slicer parsing implementations class BaseSlicer(object): def __init__(self, file_path: str) -> None: @@ -172,6 +179,9 @@ class BaseSlicer(object): def parse_filament_weight_total(self) -> Optional[float]: return None + def parse_filament_type(self) -> Optional[str]: + return None + def parse_estimated_time(self) -> Optional[float]: return None @@ -336,6 +346,10 @@ class PrusaSlicer(BaseSlicer): return _regex_find_first( r"total\sfilament\sused\s\[g\]\s=\s(\d+\.\d*)", self.footer_data) + def parse_filament_type(self) -> Optional[str]: + return _regex_find_string( + r";\sfilament_type\s=\s(.*)", self.footer_data) + def parse_estimated_time(self) -> Optional[float]: time_match = re.search( r';\sestimated\sprinting\stime.*', self.footer_data) @@ -453,6 +467,10 @@ class Cura(BaseSlicer): return _regex_find_first( r";Filament\sweight\s=\s.(\d+\.\d+).", self.header_data) + def parse_filament_type(self) -> Optional[str]: + return _regex_find_string( + r";Filament\stype\s=\s(.*)", self.header_data) + def parse_estimated_time(self) -> Optional[float]: return self._parse_max_float(r";TIME:.*", self.header_data) @@ -671,6 +689,10 @@ class IdeaMaker(BaseSlicer): return sum(filament) return None + def parse_filament_type(self) -> Optional[str]: + return _regex_find_string( + r";Filament\stype\s=\s(.*)", self.header_data) + def parse_filament_weight_total(self) -> Optional[float]: pi = 3.141592653589793 length = _regex_find_floats( @@ -751,6 +773,7 @@ SUPPORTED_DATA = [ 'first_layer_bed_temp', 'filament_total', 'filament_weight_total', + 'filament_type', 'thumbnails'] def process_objects(file_path: str) -> None: