diff --git a/lib/Slic3r/Fill.pm b/lib/Slic3r/Fill.pm index 55abfdb05..219aa81e4 100644 --- a/lib/Slic3r/Fill.pm +++ b/lib/Slic3r/Fill.pm @@ -63,6 +63,12 @@ sub make_fill { ); } + # subtract any other surface already processed + $union = diff_ex( + [ map @$_, @$union ], + [ map $_->p, @surfaces ], + ); + push @surfaces, map Slic3r::Surface->cast_from_expolygon($_, surface_type => $group->[0]->surface_type, bridge_angle => $group->[0]->bridge_angle, diff --git a/lib/Slic3r/Surface.pm b/lib/Slic3r/Surface.pm index ef5d5c333..b6e16f5a1 100644 --- a/lib/Slic3r/Surface.pm +++ b/lib/Slic3r/Surface.pm @@ -55,22 +55,18 @@ sub group { my $params = ref $_[0] eq 'HASH' ? shift(@_) : {}; my (@surfaces) = @_; - my $unique_type = sub { - ($params->{merge_solid} && $_[0]->surface_type =~ /top|bottom|solid/ - ? 'solid' : $_[0]->surface_type) . "_" . ($_[0]->bridge_angle || '') - . "_" . $_[0]->depth_layers; - }; - my @unique_types = (); + my %unique_types = (); foreach my $surface (@surfaces) { - my $type = $unique_type->($surface); - push @unique_types, $type unless grep $_ eq $type, @unique_types; + my $type = ($params->{merge_solid} && $surface->surface_type =~ /top|bottom|solid/) + ? 'solid' + : $surface->surface_type; + $type .= "_" . ($_[0]->bridge_angle || ''); + $type .= "_" . $_[0]->depth_layers; + $unique_types{$type} ||= []; + push @{ $unique_types{$type} }, $surface; } - my @groups = (); - foreach my $type (@unique_types) { - push @groups, [ grep { $unique_type->($_) eq $type } @surfaces ]; - } - return @groups; + return values %unique_types; } sub add_hole {