Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/prusa3d/PrusaSlicer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlessandro Ranellucci <aar@cpan.org>2014-05-26 17:19:13 +0400
committerAlessandro Ranellucci <aar@cpan.org>2014-05-26 17:19:13 +0400
commit3d25b9030cd7781299e926ebee0b619119d9a7c1 (patch)
treedeba280645d5bb72994978f81867d548f95999e0
parent8290a006ed0829eba2d6b825332b90aff9a45936 (diff)
Bugfix: movement between objects in sequential printing mode was going too far away. #2013 #2007
-rw-r--r--lib/Slic3r/Print.pm4
-rw-r--r--t/gcode.t19
-rw-r--r--xs/src/Point.cpp6
-rw-r--r--xs/src/Point.hpp1
-rw-r--r--xs/xsp/Point.xsp2
5 files changed, 28 insertions, 4 deletions
diff --git a/lib/Slic3r/Print.pm b/lib/Slic3r/Print.pm
index 577618749..7c4f1b31f 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 a241bba27..ce9a0f487 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 7d0013e22..64677dbf6 100644
--- a/xs/src/Point.cpp
+++ b/xs/src/Point.cpp
@@ -191,6 +191,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)
{
return Point(point1.x + point2.x, point1.y + point2.y);
diff --git a/xs/src/Point.hpp b/xs/src/Point.hpp
index b83a2a238..b87fa3a45 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 12d1928b8..943e1789e 100644
--- a/xs/xsp/Point.xsp
+++ b/xs/xsp/Point.xsp
@@ -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()); %};
%{