Bugfix: a move below z_offset was performed when retract_lift was enabled and lift amount was less than z_offset. Includes regression test. #2349

This commit is contained in:
Alessandro Ranellucci 2014-11-09 19:24:17 +01:00
parent ee3fb7caa2
commit 6135a9fb8b
4 changed files with 45 additions and 2 deletions

View file

@ -165,6 +165,7 @@ sub thread_cleanup {
no warnings 'redefine';
*Slic3r::Config::DESTROY = sub {};
*Slic3r::Config::Full::DESTROY = sub {};
*Slic3r::Config::GCode::DESTROY = sub {};
*Slic3r::Config::Print::DESTROY = sub {};
*Slic3r::Config::PrintObject::DESTROY = sub {};
*Slic3r::Config::PrintRegion::DESTROY = sub {};

View file

@ -71,6 +71,20 @@ sub init_external_mp {
$self->_external_mp(Slic3r::MotionPlanner->new($islands));
}
sub preamble {
my ($self) = @_;
my $gcode = $self->writer->preamble;
# Perform a *silent* move to z_offset: we need this to initialize the Z
# position of our writer object so that any initial lift taking place
# before the first layer change will raise the extruder from the correct
# initial Z instead of 0.
$self->writer->travel_to_z($self->config->z_offset, '');
return $gcode;
}
sub change_layer {
my ($self, $layer) = @_;

View file

@ -546,7 +546,7 @@ sub write_gcode {
$print_first_layer_temperature->(1);
# set other general things
print $fh $gcodegen->writer->preamble;
print $fh $gcodegen->preamble;
# initialize a motion planner for object-to-object travel moves
if ($self->config->avoid_crossing_perimeters) {

View file

@ -1,4 +1,4 @@
use Test::More tests => 16;
use Test::More tests => 19;
use strict;
use warnings;
@ -41,6 +41,34 @@ use Slic3r::Test;
ok !defined (first { abs($_ - $config->retract_speed->[0]*60) < 5 } @retract_speeds), 'wipe moves don\'t retract faster than configured speed';
}
{
my $config = Slic3r::Config->new_from_defaults;
$config->set('z_offset', 5);
$config->set('start_gcode', '');
my $test = sub {
my ($comment) = @_;
my $print = Slic3r::Test::init_print('20mm_cube', config => $config);
my $moves_below_z_offset = 0;
Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub {
my ($self, $cmd, $args, $info) = @_;
if ($info->{travel} && exists $args->{Z}) {
$moves_below_z_offset++ if $args->{Z} < $config->z_offset;
}
});
is $moves_below_z_offset, 0, "no Z moves below Z offset ($comment)";
};
$test->("no lift");
$config->set('retract_lift', [3]);
$test->("lift < z_offset");
$config->set('retract_lift', [6]);
$test->("lift > z_offset");
}
{
# This tests the following behavior:
# - complete objects does not crash