diff --git a/lib/Slic3r/Layer/Region.pm b/lib/Slic3r/Layer/Region.pm index ee0b42265..65ee99ae6 100644 --- a/lib/Slic3r/Layer/Region.pm +++ b/lib/Slic3r/Layer/Region.pm @@ -171,33 +171,9 @@ sub make_perimeters { my @holes = (); # array of Polygons with cw orientation my @gaps = (); # array of ExPolygons - # for each island: + # we need to process each island separately because we might have different + # extra perimeters for each one foreach my $surface (@{$self->slices}) { - - # experimental hole compensation (see ArcCompensation in the RepRap wiki) - if (0) { - my @last_offsets = (); # dumb instantiation - foreach my $hole ($last_offsets[0]->holes) { - my $circumference = abs($hole->length); - next unless $circumference <= &Slic3r::SMALL_PERIMETER_LENGTH; - # this compensation only works for circular holes, while it would - # overcompensate for hexagons and other shapes having straight edges. - # so we require a minimum number of vertices. - next unless $circumference / @$hole >= 3 * $self->perimeter_flow->scaled_width; - - # revert the compensation done in make_surfaces() and get the actual radius - # of the hole - my $radius = ($circumference / PI / 2) - $self->perimeter_flow->scaled_spacing/2; - my $new_radius = ($self->perimeter_flow->scaled_width + sqrt(($self->perimeter_flow->scaled_width ** 2) + (4*($radius**2)))) / 2; - # holes are always turned to contours, so reverse point order before and after - $hole->reverse; - my @offsetted = $hole->offset(+ ($new_radius - $radius)); - # skip arc compensation when hole is not round (thus leads to multiple offsets) - @$hole = map Slic3r::Point->new($_), @{ $offsetted[0] } if @offsetted == 1; - $hole->reverse; - } - } - # detect how many perimeters must be generated for this island my $loop_number = $Slic3r::Config->perimeters + ($surface->extra_perimeters || 0); @@ -235,18 +211,16 @@ sub make_perimeters { } # create one more offset to be used as boundary for fill - { - # we offset by half the perimeter spacing (to get to the actual infill boundary) - # and then we offset back and forth by the infill spacing to only consider the - # non-collapsing regions - push @{ $self->fill_surfaces }, - map $_->simplify(&Slic3r::SCALED_RESOLUTION), - offset2_ex( - \@last, - -($perimeter_spacing/2 + $infill_spacing), - +$infill_spacing, - ); - } + # we offset by half the perimeter spacing (to get to the actual infill boundary) + # and then we offset back and forth by the infill spacing to only consider the + # non-collapsing regions + push @{ $self->fill_surfaces }, + map $_->simplify(&Slic3r::SCALED_RESOLUTION), + offset2_ex( + \@last, + -($perimeter_spacing/2 + $infill_spacing), + +$infill_spacing, + ); } $self->_fill_gaps(\@gaps); @@ -304,7 +278,9 @@ sub make_perimeters { # TODO: add test for perimeter order @loops = reverse @loops if $Slic3r::Config->external_perimeters_first - || $self->layer->id == 0 && $Slic3r::Config->brim_width > 0; + || ($self->layer->id == 0 && $Slic3r::Config->brim_width > 0); + + # append perimeters push @{ $self->perimeters }, @loops; # add thin walls as perimeters