From 2970e315402d01bc492e30c9d98546bcee6bbea1 Mon Sep 17 00:00:00 2001 From: Alessandro Ranellucci Date: Tue, 29 Nov 2011 11:36:52 +0100 Subject: [PATCH] Bugfix: some bridges being very close could lead to overlapping infill --- lib/Slic3r/Fill.pm | 6 ++++++ lib/Slic3r/Surface.pm | 22 +++++++++------------- 2 files changed, 15 insertions(+), 13 deletions(-) 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 {