Make only_retract_when_crossing_perimeters work with avoid_crossing_perimeters
This commit is contained in:
parent
72613ae2b4
commit
37810f777f
1 changed files with 45 additions and 28 deletions
|
@ -186,26 +186,9 @@ sub extrude_path {
|
||||||
return $gcode;
|
return $gcode;
|
||||||
}
|
}
|
||||||
|
|
||||||
my $gcode = "";
|
|
||||||
|
|
||||||
# skip retract for support material
|
|
||||||
{
|
|
||||||
# retract if distance from previous position is greater or equal to the one specified by the user
|
|
||||||
my $travel = Slic3r::Line->new($self->last_pos->clone, $path->points->[0]->clone);
|
|
||||||
if ($travel->length >= scale $self->extruder->retract_before_travel
|
|
||||||
&& ($path->role != EXTR_ROLE_SUPPORTMATERIAL || !$self->layer->support_islands_enclose_line($travel))) {
|
|
||||||
# move travel back to original layer coordinates.
|
|
||||||
# note that we're only considering the current object's islands, while we should
|
|
||||||
# build a more complete configuration space
|
|
||||||
$travel->translate(-$self->shift_x, -$self->shift_y);
|
|
||||||
if (!$Slic3r::Config->only_retract_when_crossing_perimeters || !$path->is_fill || !first { $_->encloses_line($travel, scaled_epsilon) } @{$self->layer->slices}) {
|
|
||||||
$gcode .= $self->retract(travel_to => $path->points->[0]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# go to first point of extrusion path
|
# go to first point of extrusion path
|
||||||
$gcode .= $self->travel_to($path->points->[0], "move to first $description point");
|
my $gcode = "";
|
||||||
|
$gcode .= $self->travel_to($path->points->[0], $path->role, "move to first $description point");
|
||||||
|
|
||||||
# compensate retraction
|
# compensate retraction
|
||||||
$gcode .= $self->unretract;
|
$gcode .= $self->unretract;
|
||||||
|
@ -260,17 +243,54 @@ sub extrude_path {
|
||||||
|
|
||||||
sub travel_to {
|
sub travel_to {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
my ($point, $comment) = @_;
|
my ($point, $role, $comment) = @_;
|
||||||
|
|
||||||
return "" if points_coincide($self->last_pos, $point);
|
|
||||||
$self->speed('travel');
|
$self->speed('travel');
|
||||||
my $gcode = "";
|
my $gcode = "";
|
||||||
if ($Slic3r::Config->avoid_crossing_perimeters && $self->last_pos->distance_to($point) > scale 5 && !$self->straight_once) {
|
|
||||||
|
my $travel = Slic3r::Line->new($self->last_pos->clone, $point->clone);
|
||||||
|
|
||||||
|
# move travel back to original layer coordinates for the island check.
|
||||||
|
# note that we're only considering the current object's islands, while we should
|
||||||
|
# build a more complete configuration space
|
||||||
|
$travel->translate(-$self->shift_x, -$self->shift_y);
|
||||||
|
|
||||||
|
if ($travel->length < scale $self->extruder->retract_before_travel
|
||||||
|
|| ($Slic3r::Config->only_retract_when_crossing_perimeters && first { $_->encloses_line($travel, scaled_epsilon) } @{$self->layer->slices})
|
||||||
|
|| ($role == EXTR_ROLE_SUPPORTMATERIAL && $self->layer->support_islands_enclose_line($travel))
|
||||||
|
) {
|
||||||
|
$self->straight_once(0);
|
||||||
|
$gcode .= $self->G0($point, undef, 0, $comment || "");
|
||||||
|
} elsif (!$Slic3r::Config->avoid_crossing_perimeters || $self->straight_once) {
|
||||||
|
$self->straight_once(0);
|
||||||
|
$gcode .= $self->retract(travel_to => $point);
|
||||||
|
$gcode .= $self->G0($point, undef, 0, $comment || "");
|
||||||
|
} else {
|
||||||
my $plan = sub {
|
my $plan = sub {
|
||||||
my $mp = shift;
|
my $mp = shift;
|
||||||
return join '',
|
|
||||||
map $self->G0($_->[B], undef, 0, $comment || ""),
|
my $gcode = "";
|
||||||
$mp->shortest_path($self->last_pos, $point)->lines;
|
my @travel = $mp->shortest_path($self->last_pos, $point)->lines;
|
||||||
|
|
||||||
|
# if the path is not contained in a single island we need to retract
|
||||||
|
my $need_retract = !$Slic3r::Config->only_retract_when_crossing_perimeters;
|
||||||
|
if (!$need_retract) {
|
||||||
|
$need_retract = 1;
|
||||||
|
foreach my $slice (@{$self->layer->slices}) {
|
||||||
|
# discard the island if at any line is not enclosed in it
|
||||||
|
next if first { !$slice->encloses_line($_, scaled_epsilon) } @travel;
|
||||||
|
# okay, this island encloses the full travel path
|
||||||
|
$need_retract = 0;
|
||||||
|
last;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# do the retract (the travel_to argument is broken)
|
||||||
|
$gcode .= $self->retract(travel_to => $point) if $need_retract;
|
||||||
|
|
||||||
|
# append the actual path and return
|
||||||
|
$gcode .= join '', map $self->G0($_->[B], undef, 0, $comment || ""), @travel;
|
||||||
|
return $gcode;
|
||||||
};
|
};
|
||||||
|
|
||||||
if ($self->new_object) {
|
if ($self->new_object) {
|
||||||
|
@ -288,9 +308,6 @@ sub travel_to {
|
||||||
} else {
|
} else {
|
||||||
$gcode .= $plan->($self->layer_mp);
|
$gcode .= $plan->($self->layer_mp);
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
$self->straight_once(0);
|
|
||||||
$gcode .= $self->G0($point, undef, 0, $comment || "");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return $gcode;
|
return $gcode;
|
||||||
|
|
Loading…
Reference in a new issue