diff --git a/lib/Slic3r/Extruder.pm b/lib/Slic3r/Extruder.pm index 6057ae71..e5235e6f 100644 --- a/lib/Slic3r/Extruder.pm +++ b/lib/Slic3r/Extruder.pm @@ -77,7 +77,10 @@ sub extrude { sub extrude_loop { my $self = shift; my ($loop, $description) = @_; - + + # extrude all loops ccw + $loop->polygon->make_counter_clockwise; + # find the point of the loop that is closest to the current extruder position my $start_at = $loop->nearest_point_to($self->last_pos); diff --git a/lib/Slic3r/Perimeter.pm b/lib/Slic3r/Perimeter.pm index 17a82f03..b5e1d437 100644 --- a/lib/Slic3r/Perimeter.pm +++ b/lib/Slic3r/Perimeter.pm @@ -115,7 +115,6 @@ sub make_perimeter { } foreach my $hole (@holes) { - $hole->reverse; push @{ $layer->perimeters }, Slic3r::ExtrusionLoop->new(polygon => $hole, role => 'perimeter'); } diff --git a/lib/Slic3r/Polygon.pm b/lib/Slic3r/Polygon.pm index f515b558..5ec5d9a3 100644 --- a/lib/Slic3r/Polygon.pm +++ b/lib/Slic3r/Polygon.pm @@ -30,11 +30,6 @@ sub clone { return (ref $self)->new(map $_->clone, @$self); } -sub reverse { - my $self = shift; - @$self = CORE::reverse @$self; -} - sub lines { my $self = shift; return map Slic3r::Line->new($_), polygon_lines($self); @@ -135,7 +130,7 @@ sub is_printable { # for a distance equal to half of the extrusion width; # if no offset is possible, then polyline is not printable my $p = $self->clone; - @$p = CORE::reverse @$p if !Math::Clipper::is_counter_clockwise($p); + $p->make_counter_clockwise; my $offsets = Math::Clipper::offset([$p], -(scale $Slic3r::flow_spacing / 2), $Slic3r::resolution * 100000, JT_MITER, 2); return @$offsets ? 1 : 0; } diff --git a/lib/Slic3r/Polyline.pm b/lib/Slic3r/Polyline.pm index 84d21fed..a8155764 100644 --- a/lib/Slic3r/Polyline.pm +++ b/lib/Slic3r/Polyline.pm @@ -61,24 +61,24 @@ sub simplify { bless $_, 'Slic3r::Point' for @$self; } -sub reverse_points { +sub reverse { my $self = shift; - @$self = reverse @$self; + @$self = CORE::reverse @$self; } sub is_counter_clockwise { my $self = shift; - return Math::Clipper::is_counter_clockwise($self->p); + return Math::Clipper::is_counter_clockwise($self); } sub make_counter_clockwise { my $self = shift; - $self->reverse_points if !$self->is_counter_clockwise; + $self->reverse if !$self->is_counter_clockwise; } sub make_clockwise { my $self = shift; - $self->reverse_points if $self->is_counter_clockwise; + $self->reverse if $self->is_counter_clockwise; } sub nearest_point_to {