From 7baaf6bf5d3cdf68a877a16d5f27e76f0fbc6e35 Mon Sep 17 00:00:00 2001 From: Alessandro Ranellucci Date: Thu, 30 May 2013 20:06:05 +0200 Subject: [PATCH] Fixed regression causing skirt_height to he honored incorrectly when printing more than one object. Includes regression test #1200 --- MANIFEST | 1 + lib/Slic3r/GCode/Layer.pm | 10 ++++----- lib/Slic3r/GCode/Reader.pm | 2 +- lib/Slic3r/Test.pm | 4 +++- t/skirt_brim.t | 46 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 56 insertions(+), 7 deletions(-) create mode 100644 t/skirt_brim.t diff --git a/MANIFEST b/MANIFEST index a9180a691..45d52d6e6 100644 --- a/MANIFEST +++ b/MANIFEST @@ -78,6 +78,7 @@ t/retraction.t t/serialize.t t/shells.t t/slice.t +t/skirt_brim.t t/support.t t/vibrationlimit.t utils/amf-to-stl.pl diff --git a/lib/Slic3r/GCode/Layer.pm b/lib/Slic3r/GCode/Layer.pm index bb74dcd29..d1716c404 100644 --- a/lib/Slic3r/GCode/Layer.pm +++ b/lib/Slic3r/GCode/Layer.pm @@ -9,7 +9,7 @@ has 'gcodegen' => (is => 'ro', required => 1); has 'shift' => (is => 'ro', required => 1); has 'spiralvase' => (is => 'lazy'); -has 'skirt_done' => (is => 'rw', default => sub {0}); # count of skirt layers done +has 'skirt_done' => (is => 'rw', default => sub { {} }); # print_z => 1 has 'brim_done' => (is => 'rw'); has 'second_layer_things_done' => (is => 'rw'); has '_last_obj_copy' => (is => 'rw'); @@ -48,10 +48,10 @@ sub process_layer { }); # extrude skirt - if ($self->skirt_done < $Slic3r::Config->skirt_height) { + if ((values %{$self->skirt_done}) < $Slic3r::Config->skirt_height && !$self->skirt_done->{$layer->print_z}) { $self->gcodegen->set_shift(@{$self->shift}); $gcode .= $self->gcodegen->set_extruder($self->extruders->[0]); # move_z requires extruder - $gcode .= $self->gcodegen->move_z($self->gcodegen->layer->print_z); + $gcode .= $self->gcodegen->move_z($layer->print_z); # skip skirt if we have a large brim if ($layer->id < $Slic3r::Config->skirt_height) { # distribute skirt loops across all extruders @@ -64,14 +64,14 @@ sub process_layer { $gcode .= $self->gcodegen->extrude_loop($self->print->skirt->[$i], 'skirt'); } } - $self->skirt_done($self->skirt_done + 1); + $self->skirt_done->{$layer->print_z} = 1; $self->gcodegen->straight_once(1); } # extrude brim if (!$self->brim_done) { $gcode .= $self->gcodegen->set_extruder($self->extruders->[$Slic3r::Config->support_material_extruder-1]); # move_z requires extruder - $gcode .= $self->gcodegen->move_z($self->gcodegen->layer->print_z); + $gcode .= $self->gcodegen->move_z($layer->print_z); $self->gcodegen->set_shift(@{$self->shift}); $gcode .= $self->gcodegen->extrude_loop($_, 'brim') for @{$self->print->brim}; $self->brim_done(1); diff --git a/lib/Slic3r/GCode/Reader.pm b/lib/Slic3r/GCode/Reader.pm index 235a0ad74..20a1313b0 100644 --- a/lib/Slic3r/GCode/Reader.pm +++ b/lib/Slic3r/GCode/Reader.pm @@ -26,7 +26,7 @@ sub parse { my ($command, @args) = split /\s+/, $line; my %args = map { /([A-Z])(.*)/; ($1 => $2) } @args; - # check retraction + # check motion if ($command =~ /^G[01]$/) { foreach my $axis (@AXES) { if (exists $args{$axis}) { diff --git a/lib/Slic3r/Test.pm b/lib/Slic3r/Test.pm index 63ee7ac64..46443cc6a 100644 --- a/lib/Slic3r/Test.pm +++ b/lib/Slic3r/Test.pm @@ -44,7 +44,9 @@ sub init_print { $config->set('gcode_comments', 1) if $ENV{SLIC3R_TESTS_GCODE}; my $print = Slic3r::Print->new(config => $config); - $print->add_model(model($model_name)); + + $model_name = [$model_name] if ref($model_name) ne 'ARRAY'; + $print->add_model(model($_)) for @$model_name; $print->validate; return $print; diff --git a/t/skirt_brim.t b/t/skirt_brim.t new file mode 100644 index 000000000..c78bf41e0 --- /dev/null +++ b/t/skirt_brim.t @@ -0,0 +1,46 @@ +use Test::More tests => 1; +use strict; +use warnings; + +BEGIN { + use FindBin; + use lib "$FindBin::Bin/../lib"; +} + +use List::Util qw(first); +use Slic3r; +use Slic3r::Test; + +{ + my $config = Slic3r::Config->new_from_defaults; + $config->set('skirts', 1); + $config->set('skirt_height', 2); + $config->set('perimeters', 0); + $config->set('perimeter_speed', 99); + $config->set('cooling', 0); # to prevent speeds to be altered + $config->set('first_layer_speed', '100%'); # to prevent speeds to be altered + + my $test = sub { + my ($conf) = @_; + $conf ||= $config; + + my $print = Slic3r::Test::init_print(['20mm_cube','20mm_cube'], config => $config); + + my %layers_with_skirt = (); # Z => $count + Slic3r::GCode::Reader->new(gcode => Slic3r::Test::gcode($print))->parse(sub { + my ($self, $cmd, $args, $info) = @_; + + if (defined $self->Z) { + $layers_with_skirt{$self->Z} //= 0; + $layers_with_skirt{$self->Z} = 1 + if $info->{extruding} && ($args->{F} // $self->F) == $config->perimeter_speed*60; + } + }); + fail "wrong number of layers with skirt" + unless (grep $_, values %layers_with_skirt) == $config->skirt_height; + }; + + ok $test->(), "skirt_height is honored when printing multiple objects too"; +} + +__END__