Merge pull request #14526 from Ultimaker/CURA-10183_gcode_reader_wont_load_files

[CURA-10183] Catch error when loading gcode with more extruders than the current machine
This commit is contained in:
Casper Lamboo 2023-02-10 16:21:48 +01:00 committed by GitHub
commit f8d33d839b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -32,6 +32,7 @@ class FlavorParser:
"""This parser is intended to interpret the common firmware codes among all the different flavors""" """This parser is intended to interpret the common firmware codes among all the different flavors"""
MAX_EXTRUDER_COUNT = 16 MAX_EXTRUDER_COUNT = 16
DEFAULT_FILAMENT_DIAMETER = 2.85
def __init__(self) -> None: def __init__(self) -> None:
CuraApplication.getInstance().hideMessageSignal.connect(self._onHideMessage) CuraApplication.getInstance().hideMessageSignal.connect(self._onHideMessage)
@ -48,7 +49,7 @@ class FlavorParser:
self._is_layers_in_file = False # Does the Gcode have the layers comment? self._is_layers_in_file = False # Does the Gcode have the layers comment?
self._extruder_offsets = {} # type: Dict[int, List[float]] # Offsets for multi extruders. key is index, value is [x-offset, y-offset] self._extruder_offsets = {} # type: Dict[int, List[float]] # Offsets for multi extruders. key is index, value is [x-offset, y-offset]
self._current_layer_thickness = 0.2 # default self._current_layer_thickness = 0.2 # default
self._filament_diameter = 2.85 # default self._current_filament_diameter = 2.85 # default
self._previous_extrusion_value = 0.0 # keep track of the filament retractions self._previous_extrusion_value = 0.0 # keep track of the filament retractions
CuraApplication.getInstance().getPreferences().addPreference("gcodereader/show_caution", True) CuraApplication.getInstance().getPreferences().addPreference("gcodereader/show_caution", True)
@ -152,7 +153,7 @@ class FlavorParser:
def _calculateLineWidth(self, current_point: Position, previous_point: Position, current_extrusion: float, previous_extrusion: float, layer_thickness: float) -> float: def _calculateLineWidth(self, current_point: Position, previous_point: Position, current_extrusion: float, previous_extrusion: float, layer_thickness: float) -> float:
# Area of the filament # Area of the filament
Af = (self._filament_diameter / 2) ** 2 * numpy.pi Af = (self._current_filament_diameter / 2) ** 2 * numpy.pi
# Length of the extruded filament # Length of the extruded filament
de = current_extrusion - previous_extrusion de = current_extrusion - previous_extrusion
# Volume of the extruded filament # Volume of the extruded filament
@ -287,7 +288,11 @@ class FlavorParser:
def processTCode(self, global_stack, T: int, line: str, position: Position, path: List[List[Union[float, int]]]) -> Position: def processTCode(self, global_stack, T: int, line: str, position: Position, path: List[List[Union[float, int]]]) -> Position:
self._extruder_number = T self._extruder_number = T
self._filament_diameter = global_stack.extruderList[self._extruder_number].getProperty("material_diameter", "value") try:
self._current_filament_diameter = global_stack.extruderList[self._extruder_number].getProperty("material_diameter", "value")
except IndexError:
self._current_filament_diameter = self.DEFAULT_FILAMENT_DIAMETER
if self._extruder_number + 1 > len(position.e): if self._extruder_number + 1 > len(position.e):
self._extrusion_length_offset.extend([0] * (self._extruder_number - len(position.e) + 1)) self._extrusion_length_offset.extend([0] * (self._extruder_number - len(position.e) + 1))
position.e.extend([0] * (self._extruder_number - len(position.e) + 1)) position.e.extend([0] * (self._extruder_number - len(position.e) + 1))
@ -323,7 +328,7 @@ class FlavorParser:
if not global_stack: if not global_stack:
return None return None
self._filament_diameter = global_stack.extruderList[self._extruder_number].getProperty("material_diameter", "value") self._current_filament_diameter = global_stack.extruderList[self._extruder_number].getProperty("material_diameter", "value")
scene_node = CuraSceneNode() scene_node = CuraSceneNode()