From dde7dfcc80931965db63193b422f350d1e81bf3a Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Thu, 16 Mar 2023 17:54:30 +0100 Subject: [PATCH 1/3] Option to skip griffin header validation. Files generated by the command line interface of CuraEngine are output in serial mode, meaning the header has to be printed before the print-time and material estimates are known. This will be needed for command-line tools we used to benchmark the engine with in the nightlies. part ofCURA-9495 --- Charon/filetypes/GCodeFile.py | 46 ++++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/Charon/filetypes/GCodeFile.py b/Charon/filetypes/GCodeFile.py index 7c995ef..5412b24 100644 --- a/Charon/filetypes/GCodeFile.py +++ b/Charon/filetypes/GCodeFile.py @@ -22,6 +22,7 @@ class GCodeFile(FileInterface): mime_type = "text/x-gcode" MaximumHeaderLength = 100 + SkipHeaderValidation = False def __init__(self) -> None: self.__stream = None # type: Optional[IO[bytes]] @@ -68,9 +69,13 @@ def parseHeader(stream: IO[bytes], *, prefix: str = "") -> Dict[str, Any]: flavor = metadata.get("flavor", None) if flavor == "Griffin": - if metadata["header_version"] != "0.1": + if metadata["header_version"] != "0.1" and not SkipHeaderValidation: raise InvalidHeaderException("Unsupported Griffin header version: {0}".format(metadata["header_version"])) - GCodeFile.__validateGriffinHeader(metadata) + try: + GCodeFile.__validateGriffinHeader(metadata) + except InvalidHeaderException as ex: + if not GCodeFile.SkipHeaderValidation: + raise ex GCodeFile.__cleanGriffinHeader(metadata) elif flavor == "UltiGCode": metadata["machine_type"] = "ultimaker2" @@ -195,7 +200,25 @@ def __validateGriffinHeader(metadata: Dict[str, Any]) -> None: raise InvalidHeaderException("PRINT.SIZE.MIN.[x,y,z] must be set. Ensure all three are defined.") if not GCodeFile.__isAvailable(metadata, ["print", "size", "max", ["x", "y", "z"]]): raise InvalidHeaderException("PRINT.SIZE.MAX.[x,y,z] must be set. Ensure all three are defined.") - + + # Validate extruder train, part I + for index in range(0, 15): + index_str = str(index) + if GCodeFile.__isAvailable(metadata, ["extruder_train", index_str]): + + if not GCodeFile.__isAvailable(metadata, ["extruder_train", index_str, "nozzle", "diameter"]) or \ + not isAPositiveNumber(metadata["extruder_train"][index_str]["nozzle"]["diameter"]): + raise InvalidHeaderException( + "extruder_train.{}.nozzle.diameter must be defined and be a positive real".format(index)) + + if not GCodeFile.__isAvailable(metadata, ["extruder_train", index_str, "initial_temperature"]) or \ + not isAPositiveNumber(metadata["extruder_train"][index_str]["initial_temperature"]): + raise InvalidHeaderException( + "extruder_train.{}.initial_temperature must be defined and positive".format(index)) + + # Put those closest to 'optional' interpretation last, + # so most of the meta-data is still processed when SkipHeaderValidation is on. + # Validate print time print_time = -1 @@ -208,27 +231,16 @@ def __validateGriffinHeader(metadata: Dict[str, Any]) -> None: if print_time < 0: raise InvalidHeaderException("Print Time should be a positive integer") - - # Validate extruder train - for index in range(0, 10): + + # Validate extruder train, part II + for index in range(0, 15): index_str = str(index) if GCodeFile.__isAvailable(metadata, ["extruder_train", index_str]): - - if not GCodeFile.__isAvailable(metadata, ["extruder_train", index_str, "nozzle", "diameter"]) or \ - not isAPositiveNumber(metadata["extruder_train"][index_str]["nozzle"]["diameter"]): - raise InvalidHeaderException( - "extruder_train.{}.nozzle.diameter must be defined and be a positive real".format(index)) - if not GCodeFile.__isAvailable(metadata, ["extruder_train", index_str, "material", "volume_used"]) or \ not isAPositiveNumber(metadata["extruder_train"][index_str]["material"]["volume_used"]): raise InvalidHeaderException( "extruder_train.{}.material.volume_used must be defined and positive".format(index)) - if not GCodeFile.__isAvailable(metadata, ["extruder_train", index_str, "initial_temperature"]) or \ - not isAPositiveNumber(metadata["extruder_train"][index_str]["initial_temperature"]): - raise InvalidHeaderException( - "extruder_train.{}.initial_temperature must be defined and positive".format(index)) - def getStream(self, virtual_path: str) -> IO[bytes]: assert self.__stream is not None From 0a5d864a19e59efd738a01c5cc7c76c109c86a60 Mon Sep 17 00:00:00 2001 From: Remco Burema <41987080+rburema@users.noreply.github.com> Date: Tue, 21 Mar 2023 10:38:39 +0100 Subject: [PATCH 2/3] More readable according to reviewer. done as part of CURA-9495 Co-authored-by: Casper Lamboo --- Charon/filetypes/GCodeFile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Charon/filetypes/GCodeFile.py b/Charon/filetypes/GCodeFile.py index 5412b24..67deef0 100644 --- a/Charon/filetypes/GCodeFile.py +++ b/Charon/filetypes/GCodeFile.py @@ -69,7 +69,7 @@ def parseHeader(stream: IO[bytes], *, prefix: str = "") -> Dict[str, Any]: flavor = metadata.get("flavor", None) if flavor == "Griffin": - if metadata["header_version"] != "0.1" and not SkipHeaderValidation: + if not SkipHeaderValidation and metadata["header_version"] != "0.1": raise InvalidHeaderException("Unsupported Griffin header version: {0}".format(metadata["header_version"])) try: GCodeFile.__validateGriffinHeader(metadata) From fb361dd3cf2cc93a6c64a7c88079d27577d7decb Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Tue, 21 Mar 2023 10:58:40 +0100 Subject: [PATCH 3/3] Static variable must have class name. part of CURA-9495 --- Charon/filetypes/GCodeFile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Charon/filetypes/GCodeFile.py b/Charon/filetypes/GCodeFile.py index 67deef0..93dd795 100644 --- a/Charon/filetypes/GCodeFile.py +++ b/Charon/filetypes/GCodeFile.py @@ -69,7 +69,7 @@ def parseHeader(stream: IO[bytes], *, prefix: str = "") -> Dict[str, Any]: flavor = metadata.get("flavor", None) if flavor == "Griffin": - if not SkipHeaderValidation and metadata["header_version"] != "0.1": + if not GCodeFile.SkipHeaderValidation and metadata["header_version"] != "0.1": raise InvalidHeaderException("Unsupported Griffin header version: {0}".format(metadata["header_version"])) try: GCodeFile.__validateGriffinHeader(metadata)