diff --git a/plugins/GCodeReader/GCodeReader.py b/plugins/GCodeReader/GCodeReader.py index 2a7e29e370..d37769ec3a 100755 --- a/plugins/GCodeReader/GCodeReader.py +++ b/plugins/GCodeReader/GCodeReader.py @@ -143,6 +143,11 @@ class GCodeReader(MeshReader): this_layer.polygons.append(this_poly) return True + def _createEmptyLayer(self, layer_number): + self._layer_data_builder.addLayer(layer_number) + self._layer_data_builder.setLayerHeight(layer_number, 0) + self._layer_data_builder.setLayerThickness(layer_number, 0) + def _calculateLineWidth(self, current_point, previous_point, current_extrusion, previous_extrusion, layer_thickness): # Area of the filament Af = (self._filament_diameter / 2) ** 2 * numpy.pi @@ -322,6 +327,9 @@ class GCodeReader(MeshReader): current_position = self._position(0, 0, 0, 0, [0]) current_path = [] + min_layer_number = 0 + negative_layers = 0 + previous_layer = 0 for line in file: if self._cancelled: @@ -359,7 +367,23 @@ class GCodeReader(MeshReader): layer_number = int(line[len(self._layer_keyword):]) self._createPolygon(self._current_layer_thickness, current_path, self._extruder_offsets.get(self._extruder_number, [0, 0])) current_path.clear() + + # When using a raft, the raft layers are stored as layers < 0, it mimics the same behavior + # as in ProcessSlicedLayersJob + if layer_number < min_layer_number: + min_layer_number = layer_number + if layer_number < 0: + layer_number += abs(min_layer_number) + negative_layers += 1 + else: + layer_number += negative_layers + + # In case there is a gap in the layer count, empty layers are created + for empty_layer in range(previous_layer + 1, layer_number): + self._createEmptyLayer(empty_layer) + self._layer_number = layer_number + previous_layer = layer_number except: pass