diff --git a/lib/Slic3r/Fill.pm b/lib/Slic3r/Fill.pm index 39959374..da82ec6d 100644 --- a/lib/Slic3r/Fill.pm +++ b/lib/Slic3r/Fill.pm @@ -244,9 +244,9 @@ sub make_fill { } # add thin fill regions - if ($layerm->thin_fills->count > 0) { - push @fills, Slic3r::ExtrusionPath::Collection->new(@{$layerm->thin_fills}); - push @fills_ordering_points, $fills[-1]->first_point; + foreach my $thin_fill (@{$layerm->thin_fills}) { + push @fills, Slic3r::ExtrusionPath::Collection->new($thin_fill); + push @fills_ordering_points, $thin_fill->first_point; } # organize infill paths using a nearest-neighbor search diff --git a/lib/Slic3r/Test.pm b/lib/Slic3r/Test.pm index f87d4212..7d8ce663 100644 --- a/lib/Slic3r/Test.pm +++ b/lib/Slic3r/Test.pm @@ -97,6 +97,13 @@ sub mesh { $facets = [ [0,1,2],[0,3,4],[3,1,4],[1,3,2],[3,0,2],[4,1,0], ]; + } elsif ($name eq 'two_hollow_squares') { + $vertices = [ + [66.7133483886719,104.286666870117,0],[66.7133483886719,95.7133331298828,0],[65.6666870117188,94.6666717529297,0],[75.2866821289062,95.7133331298828,0],[76.3333435058594,105.333335876465,0],[76.3333435058594,94.6666717529297,0],[65.6666870117188,105.33332824707,0],[75.2866821289062,104.286666870117,0],[71.1066818237305,104.58666229248,2.79999995231628],[66.4133529663086,104.58666229248,2.79999995231628],[75.5866851806641,104.58666229248,2.79999995231628],[66.4133529663086,99.8933334350586,2.79999995231628],[66.4133529663086,95.4133377075195,2.79999995231628],[71.1066818237305,95.4133377075195,2.79999995231628],[75.5866851806641,95.4133377075195,2.79999995231628],[75.5866851806641,100.106666564941,2.79999995231628],[74.5400161743164,103.540000915527,2.79999995231628],[70.0320129394531,103.540000915527,2.79999995231628],[67.4600067138672,103.540000915527,2.79999995231628],[67.4600067138672,100.968002319336,2.79999995231628],[67.4600067138672,96.4599990844727,2.79999995231628],[74.5400161743164,99.0319976806641,2.79999995231628],[74.5400161743164,96.4599990844727,2.79999995231628],[70.0320129394531,96.4599990844727,2.79999995231628],[123.666717529297,94.6666717529297,0],[134.333312988281,94.6666717529297,0],[124.413360595703,95.4133377075195,2.79999995231628],[129.106674194336,95.4133377075195,2.79999995231628],[133.586669921875,95.4133377075195,2.79999995231628],[123.666717529297,105.33332824707,0],[124.413360595703,104.58666229248,2.79999995231628],[124.413360595703,99.8933334350586,2.79999995231628],[134.333312988281,105.33332824707,0],[129.106674194336,104.58666229248,2.79999995231628],[133.586669921875,104.58666229248,2.79999995231628],[133.586669921875,100.106666564941,2.79999995231628],[124.713317871094,104.286666870117,0],[124.713317871094,95.7133331298828,0],[133.286712646484,95.7133331298828,0],[133.286712646484,104.286666870117,0],[132.540023803711,103.540000915527,2.79999995231628],[128.032028198242,103.540008544922,2.79999995231628],[125.460006713867,103.540000915527,2.79999995231628],[125.460006713867,100.968002319336,2.79999995231628],[125.460006713867,96.4599990844727,2.79999995231628],[132.540023803711,99.0319976806641,2.79999995231628],[132.540023803711,96.4599990844727,2.79999995231628],[128.032028198242,96.4599990844727,2.79999995231628], + ]; + $facets = [ + [0,1,2],[3,4,5],[6,4,0],[6,0,2],[2,1,5],[7,4,3],[1,3,5],[0,4,7],[4,6,8],[6,9,8],[4,8,10],[6,2,9],[2,11,9],[2,12,11],[2,5,12],[5,13,12],[5,14,13],[4,10,15],[5,4,14],[4,15,14],[7,16,17],[0,7,18],[7,17,18],[1,19,20],[1,0,19],[0,18,19],[7,3,21],[3,22,21],[7,21,16],[3,23,22],[3,1,23],[1,20,23],[24,25,26],[25,27,26],[25,28,27],[29,24,30],[24,31,30],[24,26,31],[32,29,33],[29,30,33],[32,33,34],[32,34,35],[25,32,28],[32,35,28],[36,37,24],[38,32,25],[29,32,36],[29,36,24],[24,37,25],[39,32,38],[37,38,25],[36,32,39],[39,40,41],[36,39,42],[39,41,42],[37,43,44],[37,36,43],[36,42,43],[39,38,45],[38,46,45],[39,45,40],[38,47,46],[38,37,47],[37,44,47],[16,8,9],[16,10,8],[10,16,15],[15,16,21],[22,15,21],[15,22,14],[22,23,14],[23,20,14],[17,16,9],[18,17,9],[19,18,9],[19,9,11],[19,11,20],[13,14,20],[20,11,12],[13,20,12],[41,40,30],[42,41,30],[43,42,30],[43,30,31],[43,31,44],[27,28,44],[44,31,26],[27,44,26],[40,33,30],[40,34,33],[34,40,35],[35,40,45],[46,35,45],[35,46,28],[46,47,28],[47,44,28], + ]; } else { return undef; } diff --git a/t/gaps.t b/t/gaps.t new file mode 100644 index 00000000..16baa036 --- /dev/null +++ b/t/gaps.t @@ -0,0 +1,60 @@ +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::Flow ':roles'; +use Slic3r::Geometry qw(PI scale unscale convex_hull); +use Slic3r::Geometry::Clipper qw(); +use Slic3r::Surface ':types'; +use Slic3r::Test; + +{ + my $config = Slic3r::Config->new_from_defaults; + $config->set('skirts', 0); + $config->set('perimeter_speed', 66); + $config->set('external_perimeter_speed', 66); + $config->set('small_perimeter_speed', 66); + $config->set('gap_fill_speed', 99); + $config->set('perimeters', 1); + $config->set('cooling', 0); # to prevent speeds from being altered + $config->set('first_layer_speed', '100%'); # to prevent speeds from being altered + $config->set('perimeter_extrusion_width', 0.35); + $config->set('first_layer_extrusion_width', 0.35); + + my $print = Slic3r::Test::init_print('two_hollow_squares', config => $config); + my @perimeter_points = (); + my $last = ''; # perimeter | gap + my $gap_fills_outside_last_perimeters = 0; + Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub { + my ($self, $cmd, $args, $info) = @_; + + if ($info->{extruding} && $info->{dist_XY} > 0) { + my $F = $args->{F} // $self->F; + my $point = Slic3r::Point->new_scale($info->{new_X}, $info->{new_Y}); + if ($F == $config->perimeter_speed*60) { + if ($last eq 'gap') { + @perimeter_points = (); + } + push @perimeter_points, $point; + $last = 'perimeter'; + } elsif ($F == $config->gap_fill_speed*60) { + my $convex_hull = convex_hull(\@perimeter_points); + if (!$convex_hull->contains_point($point)) { + $gap_fills_outside_last_perimeters++; + } + + $last = 'gap'; + } + } + }); + is $gap_fills_outside_last_perimeters, 0, 'gap fills are printed before leaving islands'; +} + +__END__