diff --git a/lib/Slic3r/GCode.pm b/lib/Slic3r/GCode.pm index 0f322ca15..662d95a86 100644 --- a/lib/Slic3r/GCode.pm +++ b/lib/Slic3r/GCode.pm @@ -349,17 +349,19 @@ sub travel_to { ) { # Just perform a straight travel move without any retraction. $gcode .= $self->writer->travel_to_xy($self->point_to_gcode($point), $comment); - } elsif ($self->config->avoid_crossing_perimeters && !$self->avoid_crossing_perimeters->straight_once) { + } elsif ($self->config->avoid_crossing_perimeters && !$self->avoid_crossing_perimeters->disable_once) { + # If avoid_crossing_perimeters is enabled and the disable_once flag is not set + # we need to plan a multi-segment travel move inside the configuration space. $gcode .= $self->avoid_crossing_perimeters->travel_to($self, $point, $comment); } else { - # If avoid_crossing_perimeters is disabled or the straight_once flag is set, + # If avoid_crossing_perimeters is disabled or the disable_once flag is set, # perform a straight move with a retraction. $gcode .= $self->retract; $gcode .= $self->writer->travel_to_xy($self->point_to_gcode($point), $comment || ''); } # Re-allow avoid_crossing_perimeters for the next travel moves - $self->avoid_crossing_perimeters->straight_once(0); + $self->avoid_crossing_perimeters->disable_once(0); return $gcode; } @@ -554,10 +556,11 @@ sub wipe { package Slic3r::GCode::AvoidCrossingPerimeters; use Moo; -has '_external_mp' => (is => 'rw'); -has '_layer_mp' => (is => 'rw'); -has 'new_object' => (is => 'rw', default => sub {0}); # this flag triggers the use of the external configuration space for avoid_crossing_perimeters for the next travel move -has 'straight_once' => (is => 'rw', default => sub {1}); # this flag disables avoid_crossing_perimeters just for the next travel move +has '_external_mp' => (is => 'rw'); +has '_layer_mp' => (is => 'rw'); +has 'use_external_mp' => (is => 'rw', default => sub {0}); +has 'use_external_mp_once' => (is => 'rw', default => sub {0}); # this flag triggers the use of the external configuration space for avoid_crossing_perimeters for the next travel move +has 'disable_once' => (is => 'rw', default => sub {1}); # this flag disables avoid_crossing_perimeters just for the next travel move use Slic3r::Geometry qw(scale); @@ -576,11 +579,8 @@ sub travel_to { my $gcode = ""; - # If avoid_crossing_perimeters is enabled and the straight_once flag is not set - # we need to plan a multi-segment travel move inside the configuration space. - if ($self->new_object) { - # If we're moving to a new object we need to use the external configuration space. - $self->new_object(0); + if ($self->use_external_mp || $self->use_external_mp_once) { + $self->use_external_mp_once(0); # represent $point in G-code coordinates $point = $point->clone; diff --git a/lib/Slic3r/Print/GCode.pm b/lib/Slic3r/Print/GCode.pm index c1b1a6813..b8391b5e8 100644 --- a/lib/Slic3r/Print/GCode.pm +++ b/lib/Slic3r/Print/GCode.pm @@ -309,6 +309,7 @@ sub process_layer { if (((values %{$self->_skirt_done}) < $self->print->config->skirt_height || $self->print->config->skirt_height == -1) && !$self->_skirt_done->{$layer->print_z}) { $self->_gcodegen->set_origin(Slic3r::Pointf->new(0,0)); + $self->_gcodegen->avoid_crossing_perimeters->use_external_mp(1); my @extruder_ids = map { $_->id } @{$self->_gcodegen->writer->extruders}; $gcode .= $self->_gcodegen->set_extruder($extruder_ids[0]); # skip skirt if we have a large brim @@ -326,21 +327,25 @@ sub process_layer { } } $self->_skirt_done->{$layer->print_z} = 1; - $self->_gcodegen->avoid_crossing_perimeters->straight_once(1); + $self->_gcodegen->avoid_crossing_perimeters->use_external_mp(0); + $self->_gcodegen->avoid_crossing_perimeters->disable_once(1); } # extrude brim if (!$self->_brim_done) { $gcode .= $self->_gcodegen->set_extruder($self->print->objects->[0]->config->support_material_extruder-1); $self->_gcodegen->set_origin(Slic3r::Pointf->new(0,0)); + $self->_gcodegen->avoid_crossing_perimeters->use_external_mp(1); $gcode .= $self->_gcodegen->extrude_loop($_, 'brim', $object->config->support_material_speed) for @{$self->print->brim}; $self->_brim_done(1); - $self->_gcodegen->avoid_crossing_perimeters->straight_once(1); + $self->_gcodegen->avoid_crossing_perimeters->use_external_mp(0); + $self->_gcodegen->avoid_crossing_perimeters->disable_once(1); } for my $copy (@$object_copies) { - $self->_gcodegen->avoid_crossing_perimeters->new_object(1) if ($self->_last_obj_copy // '') ne "$copy"; + # when starting a new object, use the external motion planner for the first travel move + $self->_gcodegen->avoid_crossing_perimeters->use_external_mp_once(1) if ($self->_last_obj_copy // '') ne "$copy"; $self->_last_obj_copy("$copy"); $self->_gcodegen->set_origin(Slic3r::Pointf->new(map unscale $copy->[$_], X,Y));