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._center_is_zero = False
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
def _getValue(line, code):
@ -180,11 +181,11 @@ class GCodeReader(MeshReader):
f = params.f if params.f is not None else f
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]:
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:
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
# 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])
return self._position(x, y, z, f, e)
# G0 and G1 should be handled exactly the same.
_gCode1 = _gCode0
@ -204,6 +206,7 @@ class GCodeReader(MeshReader):
return self._position(
params.x if params.x is not None else position.x,
params.y if params.y is not None else position.y,
0,
position.f,
position.e)
@ -266,6 +269,14 @@ class GCodeReader(MeshReader):
position.e.extend([0] * (self._extruder_number - len(position.e) + 1))
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:"
_layer_keyword = ";LAYER:"
@ -383,6 +394,10 @@ class GCodeReader(MeshReader):
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
if len(current_path) > 1:
if self._createPolygon(self._current_layer_thickness, current_path, self._extruder_offsets.get(self._extruder_number, [0, 0])):