From 3d25b9030cd7781299e926ebee0b619119d9a7c1 Mon Sep 17 00:00:00 2001 From: Alessandro Ranellucci Date: Mon, 26 May 2014 15:19:13 +0200 Subject: [PATCH] Bugfix: movement between objects in sequential printing mode was going too far away. #2013 #2007 --- lib/Slic3r/Print.pm | 4 ++-- t/gcode.t | 19 +++++++++++++++++-- xs/src/Point.cpp | 6 ++++++ xs/src/Point.hpp | 1 + xs/xsp/Point.xsp | 2 ++ 5 files changed, 28 insertions(+), 4 deletions(-) diff --git a/lib/Slic3r/Print.pm b/lib/Slic3r/Print.pm index 57761874..7c4f1b31 100644 --- a/lib/Slic3r/Print.pm +++ b/lib/Slic3r/Print.pm @@ -953,6 +953,7 @@ sub write_gcode { my $finished_objects = 0; for my $obj_idx (@obj_idx) { + my $object = $self->objects->[$obj_idx]; for my $copy (@{ $self->objects->[$obj_idx]->_shifted_copies }) { # move to the origin position for the copy we're going to print. # this happens before Z goes down to layer 0 again, so that @@ -960,7 +961,7 @@ sub write_gcode { if ($finished_objects > 0) { $gcodegen->set_shift(map unscale $copy->[$_], X,Y); print $fh $gcodegen->retract; - print $fh $gcodegen->G0(Slic3r::Point->new(0,0), undef, 0, $gcodegen->config->travel_speed*60, 'move to origin position for next object'); + print $fh $gcodegen->G0($object->_copies_shift->negative, undef, 0, $gcodegen->config->travel_speed*60, 'move to origin position for next object'); } my $buffer = Slic3r::GCode::CoolingBuffer->new( @@ -968,7 +969,6 @@ sub write_gcode { gcodegen => $gcodegen, ); - my $object = $self->objects->[$obj_idx]; my @layers = sort { $a->print_z <=> $b->print_z } @{$object->layers}, @{$object->support_layers}; for my $layer (@layers) { # if we are printing the bottom layer of an object, and we have already finished diff --git a/t/gcode.t b/t/gcode.t index a241bba2..ce9a0f48 100644 --- a/t/gcode.t +++ b/t/gcode.t @@ -1,4 +1,4 @@ -use Test::More tests => 8; +use Test::More tests => 9; use strict; use warnings; @@ -9,7 +9,7 @@ BEGIN { use List::Util qw(first); use Slic3r; -use Slic3r::Geometry qw(scale); +use Slic3r::Geometry qw(scale convex_hull); use Slic3r::Test; { @@ -46,6 +46,7 @@ use Slic3r::Test; # - complete objects does not crash # - no hard-coded "E" are generated # - Z moves are correctly generated for both objects + # - no travel moves go outside skirt my $config = Slic3r::Config->new_from_defaults; $config->set('gcode_comments', 1); $config->set('complete_objects', 1); @@ -56,16 +57,30 @@ use Slic3r::Test; my $print = Slic3r::Test::init_print('20mm_cube', config => $config, duplicate => 2); ok my $gcode = Slic3r::Test::gcode($print), "complete_objects"; my @z_moves = (); + my @travel_moves = (); # array of scaled points + my @extrusions = (); # array of scaled points Slic3r::GCode::Reader->new->parse($gcode, sub { my ($self, $cmd, $args, $info) = @_; fail 'unexpected E argument' if defined $args->{E}; if (defined $args->{Z}) { push @z_moves, $args->{Z}; } + + if ($info->{dist_XY}) { + if ($info->{extruding} || $args->{A}) { + push @extrusions, Slic3r::Point->new_scale($info->{new_X}, $info->{new_Y}); + } else { + push @travel_moves, Slic3r::Point->new_scale($info->{new_X}, $info->{new_Y}) + if @extrusions; # skip initial travel move to first skirt point + } + } }); my $layer_count = 20/0.4; # cube is 20mm tall is scalar(@z_moves), 2*$layer_count, 'complete_objects generates the correct number of Z moves'; is_deeply [ @z_moves[0..($layer_count-1)] ], [ @z_moves[$layer_count..$#z_moves] ], 'complete_objects generates the correct Z moves'; + + my $convex_hull = convex_hull(\@extrusions); + ok !(defined first { !$convex_hull->contains_point($_) } @travel_moves), 'all travel moves happen within skirt'; } { diff --git a/xs/src/Point.cpp b/xs/src/Point.cpp index 7d0013e2..64677dbf 100644 --- a/xs/src/Point.cpp +++ b/xs/src/Point.cpp @@ -190,6 +190,12 @@ Point::projection_onto(const Line &line) const } } +Point +Point::negative() const +{ + return Point(-this->x, -this->y); +} + Point operator+(const Point& point1, const Point& point2) { diff --git a/xs/src/Point.hpp b/xs/src/Point.hpp index b83a2a23..b87fa3a4 100644 --- a/xs/src/Point.hpp +++ b/xs/src/Point.hpp @@ -43,6 +43,7 @@ class Point double ccw(const Line &line) const; Point projection_onto(const MultiPoint &poly) const; Point projection_onto(const Line &line) const; + Point negative() const; #ifdef SLIC3RXS void from_SV(SV* point_sv); diff --git a/xs/xsp/Point.xsp b/xs/xsp/Point.xsp index 12d1928b..943e1789 100644 --- a/xs/xsp/Point.xsp +++ b/xs/xsp/Point.xsp @@ -35,6 +35,8 @@ %code{% RETVAL = new Point(THIS->projection_onto(*polyline)); %}; Clone projection_onto_line(Line* line) %code{% RETVAL = new Point(THIS->projection_onto(*line)); %}; + Clone negative() + %code{% RETVAL = new Point(THIS->negative()); %}; %{