New implementation of the little inwards move before leaving a loop. #186
This commit is contained in:
parent
283809f5c2
commit
f001374c6e
@ -97,7 +97,7 @@ sub extrude_loop {
|
||||
|
||||
# extrude all loops ccw
|
||||
$loop = $loop->unpack if $loop->isa('Slic3r::ExtrusionLoop::Packed');
|
||||
$loop->polygon->make_counter_clockwise;
|
||||
my $was_clockwise = $loop->polygon->make_counter_clockwise;
|
||||
|
||||
# find the point of the loop that is closest to the current extruder position
|
||||
# or randomize if requested
|
||||
@ -118,7 +118,27 @@ sub extrude_loop {
|
||||
return '' if !@{$extrusion_path->polyline};
|
||||
|
||||
# extrude along the path
|
||||
return $self->extrude_path($extrusion_path, $description);
|
||||
my $gcode = $self->extrude_path($extrusion_path, $description);
|
||||
|
||||
# make a little move inwards before leaving loop
|
||||
if ($loop->role == EXTR_ROLE_EXTERNAL_PERIMETER) {
|
||||
# detect angle between last and first segment
|
||||
# the side depends on the original winding order of the polygon (left for contours, right for holes)
|
||||
my @points = $was_clockwise ? (-2, 1) : (1, -2);
|
||||
my $angle = Slic3r::Geometry::angle3points(@{$extrusion_path->polyline}[0, @points]) / 3;
|
||||
$angle *= -1 if $was_clockwise;
|
||||
|
||||
# create the destination point along the first segment and rotate it
|
||||
my $point = Slic3r::Geometry::point_along_segment(@{$extrusion_path->polyline}[0,1], scale $extrusion_path->flow_spacing);
|
||||
bless $point, 'Slic3r::Point';
|
||||
$point->rotate($angle, $extrusion_path->polyline->[0]);
|
||||
|
||||
# generate the travel move
|
||||
$self->speed('travel');
|
||||
$gcode .= $self->G0($point, undef, 0, "move inwards before travel");
|
||||
}
|
||||
|
||||
return $gcode;
|
||||
}
|
||||
|
||||
sub extrude_path {
|
||||
|
@ -736,6 +736,7 @@ sub size_3D {
|
||||
return map $extents[$_][MAX] - $extents[$_][MIN], (X,Y,Z);
|
||||
}
|
||||
|
||||
# this assumes a CCW rotation from $p2 to $p3 around $p1
|
||||
sub angle3points {
|
||||
my ($p1, $p2, $p3) = @_;
|
||||
# p1 is the center
|
||||
|
@ -31,12 +31,20 @@ sub is_counter_clockwise {
|
||||
|
||||
sub make_counter_clockwise {
|
||||
my $self = shift;
|
||||
$self->reverse if !$self->is_counter_clockwise;
|
||||
if (!$self->is_counter_clockwise) {
|
||||
$self->reverse;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
sub make_clockwise {
|
||||
my $self = shift;
|
||||
$self->reverse if $self->is_counter_clockwise;
|
||||
if ($self->is_counter_clockwise) {
|
||||
$self->reverse;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
sub merge_continuous_lines {
|
||||
|
11
t/angles.t
11
t/angles.t
@ -2,7 +2,7 @@ use Test::More;
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
plan tests => 24;
|
||||
plan tests => 26;
|
||||
|
||||
BEGIN {
|
||||
use FindBin;
|
||||
@ -10,7 +10,7 @@ BEGIN {
|
||||
}
|
||||
|
||||
use Slic3r;
|
||||
use Slic3r::Geometry qw(line_atan line_direction rad2deg_dir PI);
|
||||
use Slic3r::Geometry qw(line_atan line_direction rad2deg_dir angle3points PI);
|
||||
|
||||
#==========================================================
|
||||
|
||||
@ -54,3 +54,10 @@ use Slic3r::Geometry qw(line_atan line_direction rad2deg_dir PI);
|
||||
}
|
||||
|
||||
#==========================================================
|
||||
|
||||
{
|
||||
is angle3points([0,0], [10,0], [0,10]), PI/2, 'CW angle3points';
|
||||
is angle3points([0,0], [0,10], [10,0]), PI/2*3, 'CCW angle3points';
|
||||
}
|
||||
|
||||
#==========================================================
|
||||
|
Loading…
Reference in New Issue
Block a user