gcode: Don't apply the SET_GCODE_OFFSET to the next g-code command

The SET_GCODE_OFFSET command could cause unwanted behavior when an
offset is applied to the following g-code command.  (In particular,
when the following command is an extrude only move - as in
issue #1289.)

Don't apply the offset immediately.  Instead, add support for a MOVE=1
parameter which will schedule a move to apply the given offset.

Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
This commit is contained in:
Kevin O'Connor 2019-05-20 22:36:57 -04:00
parent 500f37821d
commit d6b69938ab
3 changed files with 32 additions and 10 deletions

View file

@ -601,6 +601,7 @@ class GCodeParser:
self.extrude_factor = new_extrude_factor
cmd_SET_GCODE_OFFSET_help = "Set a virtual offset to g-code positions"
def cmd_SET_GCODE_OFFSET(self, params):
move_delta = [0., 0., 0., 0.]
for axis, pos in self.axis2pos.items():
if axis in params:
offset = self.get_float(axis, params)
@ -610,9 +611,19 @@ class GCodeParser:
else:
continue
delta = offset - self.homing_position[pos]
self.last_position[pos] += delta
move_delta[pos] = delta
self.base_position[pos] += delta
self.homing_position[pos] = offset
# Move the toolhead the given offset if requested
if self.get_int('MOVE', params, 0):
speed = self.get_float('MOVE_SPEED', params,
self.speed * self.speed_factor, above=0.)
for pos, delta in enumerate(move_delta):
self.last_position[pos] += delta
try:
self.move_with_transform(self.last_position, speed)
except homing.EndstopError as e:
raise error(str(e))
def cmd_M206(self, params):
# Offset axes
offsets = { self.axis2pos[a]: self.get_float(a, params)