CURA-4552 fix support for relative extrusion

This commit is contained in:
Jack Ha 2017-11-23 14:13:18 +01:00
parent f09f73a586
commit 5703f954d4

View File

@ -58,6 +58,7 @@ class GCodeReader(MeshReader):
self._layer_data_builder = LayerDataBuilder.LayerDataBuilder() self._layer_data_builder = LayerDataBuilder.LayerDataBuilder()
self._center_is_zero = False self._center_is_zero = False
self._is_absolute_positioning = True # It can be absolute (G90) or relative (G91) self._is_absolute_positioning = True # It can be absolute (G90) or relative (G91)
self._is_absolute_extrusion = True # It can become absolute (M82, default) or relative (M83)
@staticmethod @staticmethod
def _getValue(line, code): def _getValue(line, code):
@ -180,11 +181,11 @@ class GCodeReader(MeshReader):
f = params.f if params.f is not None else f f = params.f if params.f is not None else f
if params.e is not None: if params.e is not None:
new_extrusion_value = params.e if self._is_absolute_positioning else e[self._extruder_number] + params.e new_extrusion_value = params.e if self._is_absolute_extrusion else e[self._extruder_number] + params.e
if new_extrusion_value > e[self._extruder_number]: if new_extrusion_value > e[self._extruder_number]:
path.append([x, y, z, f, params.e + self._extrusion_length_offset[self._extruder_number], self._layer_type]) # extrusion path.append([x, y, z, f, new_extrusion_value + self._extrusion_length_offset[self._extruder_number], self._layer_type]) # extrusion
else: else:
path.append([x, y, z, f, params.e + self._extrusion_length_offset[self._extruder_number], LayerPolygon.MoveRetractionType]) # retraction path.append([x, y, z, f, new_extrusion_value + self._extrusion_length_offset[self._extruder_number], LayerPolygon.MoveRetractionType]) # retraction
e[self._extruder_number] = new_extrusion_value e[self._extruder_number] = new_extrusion_value
# Only when extruding we can determine the latest known "layer height" which is the difference in height between extrusions # Only when extruding we can determine the latest known "layer height" which is the difference in height between extrusions
@ -196,6 +197,7 @@ class GCodeReader(MeshReader):
path.append([x, y, z, f, e[self._extruder_number] + self._extrusion_length_offset[self._extruder_number], LayerPolygon.MoveCombingType]) path.append([x, y, z, f, e[self._extruder_number] + self._extrusion_length_offset[self._extruder_number], LayerPolygon.MoveCombingType])
return self._position(x, y, z, f, e) return self._position(x, y, z, f, e)
# G0 and G1 should be handled exactly the same. # G0 and G1 should be handled exactly the same.
_gCode1 = _gCode0 _gCode1 = _gCode0
@ -204,6 +206,7 @@ class GCodeReader(MeshReader):
return self._position( return self._position(
params.x if params.x is not None else position.x, params.x if params.x is not None else position.x,
params.y if params.y is not None else position.y, params.y if params.y is not None else position.y,
0, 0,
position.f, position.f,
position.e) position.e)
@ -266,6 +269,14 @@ class GCodeReader(MeshReader):
position.e.extend([0] * (self._extruder_number - len(position.e) + 1)) position.e.extend([0] * (self._extruder_number - len(position.e) + 1))
return position return position
def _processMCode(self, m):
if m == 82:
# Set absolute extrusion mode
self._is_absolute_extrusion = True
elif m == 83:
# Set relative extrusion mode
self._is_absolute_extrusion = False
_type_keyword = ";TYPE:" _type_keyword = ";TYPE:"
_layer_keyword = ";LAYER:" _layer_keyword = ";LAYER:"
@ -383,6 +394,10 @@ class GCodeReader(MeshReader):
current_position = self._processTCode(T, line, current_position, current_path) current_position = self._processTCode(T, line, current_position, current_path)
if line.startswith("M"):
M = self._getInt(line, "M")
self._processMCode(M)
# "Flush" leftovers. Last layer paths are still stored # "Flush" leftovers. Last layer paths are still stored
if len(current_path) > 1: if len(current_path) > 1:
if self._createPolygon(self._current_layer_thickness, current_path, self._extruder_offsets.get(self._extruder_number, [0, 0])): if self._createPolygon(self._current_layer_thickness, current_path, self._extruder_offsets.get(self._extruder_number, [0, 0])):