Skip to content

Commit

Permalink
Bugfix: movement between objects in sequential printing mode was goin…
Browse files Browse the repository at this point in the history
…g too far away. #2013 #2007
  • Loading branch information
alranel committed May 26, 2014
1 parent 8290a00 commit 3d25b90
Show file tree
Hide file tree
Showing 5 changed files with 28 additions and 4 deletions.
4 changes: 2 additions & 2 deletions lib/Slic3r/Print.pm
Original file line number Diff line number Diff line change
Expand Up @@ -953,22 +953,22 @@ 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
# no collision happens hopefully.
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(
config => $self->config,
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
Expand Down
19 changes: 17 additions & 2 deletions t/gcode.t
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use Test::More tests => 8;
use Test::More tests => 9;
use strict;
use warnings;

Expand All @@ -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;

{
Expand Down Expand Up @@ -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);
Expand All @@ -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';
}

{
Expand Down
6 changes: 6 additions & 0 deletions xs/src/Point.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down
1 change: 1 addition & 0 deletions xs/src/Point.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
2 changes: 2 additions & 0 deletions xs/xsp/Point.xsp
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@
%code{% RETVAL = new Point(THIS->projection_onto(*polyline)); %};
Clone<Point> projection_onto_line(Line* line)
%code{% RETVAL = new Point(THIS->projection_onto(*line)); %};
Clone<Point> negative()
%code{% RETVAL = new Point(THIS->negative()); %};

%{

Expand Down

0 comments on commit 3d25b90

Please sign in to comment.