diff --git a/lib/Slic3r/GCode.pm b/lib/Slic3r/GCode.pm index a127c9bfb..994e4fc7f 100644 --- a/lib/Slic3r/GCode.pm +++ b/lib/Slic3r/GCode.pm @@ -53,13 +53,11 @@ my %role_speeds = ( sub change_layer { my $self = shift; - my ($layer, %params) = @_; + my ($layer) = @_; $self->layer($layer); my $gcode = ""; - $gcode .= $self->move_z($layer->print_z) unless $params{dont_move_z}; - $gcode .= $Slic3r::Config->replace_options($Slic3r::Config->layer_gcode) . "\n" if $Slic3r::Config->layer_gcode; @@ -74,9 +72,13 @@ sub move_z { $z = $z * &Slic3r::SCALING_FACTOR; my $gcode = ""; - $gcode .= $self->retract(move_z => $z); - $gcode .= $self->G0(undef, $z, 0, $comment || 'move to next layer (' . $self->layer->id . ')') - if (!defined $self->z || $self->z != $z) && !$self->lifted; + + my $current_z = $self->z; + if (!defined $current_z || $current_z != ($z + $self->lifted)) { + $gcode .= $self->retract(move_z => $z); + $gcode .= $self->G0(undef, $z, 0, $comment || 'move to next layer (' . $self->layer->id . ')') + unless ($current_z // -1) != ($self->z // -1); + } return $gcode; } @@ -226,7 +228,7 @@ sub retract { my $retract = [undef, undef, -$length, $comment]; my $lift = ($self->extruder->retract_lift == 0 || defined $params{move_z}) ? undef - : [undef, $self->z + $self->extruder->retract_lift, 0, 'lift plate during retraction']; + : [undef, $self->z + $self->extruder->retract_lift, 0, 'lift plate during travel']; my $gcode = ""; if (($Slic3r::Config->g0 || $Slic3r::Config->gcode_flavor eq 'mach3') && $params{travel_to}) { diff --git a/lib/Slic3r/Print.pm b/lib/Slic3r/Print.pm index e6a1990e7..94f1d377b 100644 --- a/lib/Slic3r/Print.pm +++ b/lib/Slic3r/Print.pm @@ -737,7 +737,7 @@ sub write_gcode { } # set new layer, but don't move Z as support material interfaces may need an intermediate one - $gcode .= $gcodegen->change_layer($self->objects->[$object_copies->[0][0]]->layers->[$layer_id], dont_move_z => 1); + $gcode .= $gcodegen->change_layer($self->objects->[$object_copies->[0][0]]->layers->[$layer_id]); $gcodegen->elapsed_time(0); # extrude skirt @@ -772,10 +772,6 @@ sub write_gcode { my ($obj_idx, $copy) = @$obj_copy; my $layer = $self->objects->[$obj_idx]->layers->[$layer_id]; - # retract explicitely because changing the shift_[xy] properties below - # won't always trigger the automatic retraction - $gcode .= $gcodegen->retract; - $gcodegen->shift_x($shift[X] + unscale $copy->[X]); $gcodegen->shift_y($shift[Y] + unscale $copy->[Y]); @@ -793,7 +789,7 @@ sub write_gcode { for $layer->support_fills->shortest_path($gcodegen->last_pos); } - # set actual Z + # set actual Z - this will force a retraction $gcode .= $gcodegen->move_z($layer->print_z); foreach my $region_id (0 .. ($self->regions_count-1)) {