diff --git a/lib/Slic3r/ExtrusionPath.pm b/lib/Slic3r/ExtrusionPath.pm index 5446736f61..0bcd3b78a2 100644 --- a/lib/Slic3r/ExtrusionPath.pm +++ b/lib/Slic3r/ExtrusionPath.pm @@ -65,11 +65,6 @@ sub points { return $self->polyline; } -sub first_point { - my $self = shift; - return $self->polyline->[0]; -} - sub is_perimeter { my $self = shift; return $self->role == EXTR_ROLE_PERIMETER diff --git a/lib/Slic3r/GCode.pm b/lib/Slic3r/GCode.pm index d8ba29a98b..9f653e2e26 100644 --- a/lib/Slic3r/GCode.pm +++ b/lib/Slic3r/GCode.pm @@ -268,7 +268,7 @@ sub extrude_loop { my $distance = min(scale $extrusion_path->flow_spacing, $first_segment->length); my $point = Slic3r::Geometry::point_along_segment(@$first_segment, $distance); $point = Slic3r::Point->new(@$point); - $point->rotate($angle, $extrusion_path->polyline->[0]); + $point->rotate($angle, $extrusion_path->first_point); # generate the travel move $gcode .= $self->travel_to($point, $loop->role, "move inwards before travel"); @@ -294,8 +294,9 @@ sub extrude_path { # go to first point of extrusion path my $gcode = ""; - $gcode .= $self->travel_to($path->points->[0], $path->role, "move to first $description point") - if !defined $self->last_pos || !$self->last_pos->coincides_with($path->points->[0]); + my $first_point = $path->first_point; + $gcode .= $self->travel_to($first_point, $path->role, "move to first $description point") + if !defined $self->last_pos || !$self->last_pos->coincides_with($first_point); # compensate retraction $gcode .= $self->unretract; diff --git a/xs/src/ExtrusionEntity.cpp b/xs/src/ExtrusionEntity.cpp index 463bc75e98..e8b5864463 100644 --- a/xs/src/ExtrusionEntity.cpp +++ b/xs/src/ExtrusionEntity.cpp @@ -8,6 +8,12 @@ ExtrusionPath::reverse() this->polyline.reverse(); } +const Point* +ExtrusionPath::first_point() const +{ + return &(this->polyline.points.front()); +} + ExtrusionPath* ExtrusionLoop::split_at_index(int index) { diff --git a/xs/src/ExtrusionEntity.hpp b/xs/src/ExtrusionEntity.hpp index 5cf37cc241..c85293be68 100644 --- a/xs/src/ExtrusionEntity.hpp +++ b/xs/src/ExtrusionEntity.hpp @@ -38,6 +38,7 @@ class ExtrusionPath : public ExtrusionEntity public: Polyline polyline; void reverse(); + const Point* first_point() const; }; class ExtrusionLoop : public ExtrusionEntity diff --git a/xs/t/07_extrusionpath.t b/xs/t/07_extrusionpath.t index b84631dd84..835f25a21e 100644 --- a/xs/t/07_extrusionpath.t +++ b/xs/t/07_extrusionpath.t @@ -4,7 +4,7 @@ use strict; use warnings; use Slic3r::XS; -use Test::More tests => 7; +use Test::More tests => 8; my $points = [ [100, 100], @@ -28,6 +28,8 @@ is scalar(@$path), 4, 'append to path'; $path->pop_back; is scalar(@$path), 3, 'pop_back from path'; +ok $path->first_point->coincides_with($path->polyline->[0]), 'first_point'; + $path = $path->clone; is $path->role, Slic3r::ExtrusionPath::EXTR_ROLE_EXTERNAL_PERIMETER, 'role'; diff --git a/xs/xsp/ExtrusionPath.xsp b/xs/xsp/ExtrusionPath.xsp index 3d139d53b8..b4e03c199f 100644 --- a/xs/xsp/ExtrusionPath.xsp +++ b/xs/xsp/ExtrusionPath.xsp @@ -16,6 +16,8 @@ void reverse(); Lines lines() %code{% RETVAL = THIS->polyline.lines(); %}; + Point* first_point() + %code{% const char* CLASS = "Slic3r::Point"; RETVAL = new Point(*(THIS->first_point())); %}; %{ ExtrusionPath*