Do each island completely if avoid_crossing_perimeters is enabled. #278

This commit is contained in:
Alessandro Ranellucci 2013-03-10 16:09:03 +01:00
parent f10a4787b2
commit dac168eff0
4 changed files with 57 additions and 17 deletions

View file

@ -60,6 +60,11 @@ sub split_at_first_point {
return $self->split_at_index(0); return $self->split_at_index(0);
} }
sub first_point {
my $self = shift;
return $self->polygon->[0];
}
package Slic3r::ExtrusionLoop::Packed; package Slic3r::ExtrusionLoop::Packed;
sub unpack { sub unpack {
my $self = shift; my $self = shift;

View file

@ -86,9 +86,9 @@ sub points {
return $self->polyline; return $self->polyline;
} }
sub endpoints { sub first_point {
my $self = shift; my $self = shift;
return ($self->points->[0], $self->points->[-1]); return $self->polyline->[0];
} }
sub is_printable { 1 } sub is_printable { 1 }

View file

@ -3,9 +3,12 @@ use Moo;
has 'paths' => (is => 'rw', default => sub { [] }); has 'paths' => (is => 'rw', default => sub { [] });
sub endpoints { # no-op
sub unpack { $_[0] }
sub first_point {
my $self = shift; my $self = shift;
return [ map $_->endpoints, @{$self->paths} ]; return $self->paths->[0]->unpack->polyline->[0];
} }
sub chained_path { sub chained_path {

View file

@ -850,21 +850,53 @@ sub write_gcode {
my $layerm = $layer->regions->[$region_id]; my $layerm = $layer->regions->[$region_id];
my $region = $self->regions->[$region_id]; my $region = $self->regions->[$region_id];
# extrude perimeters my @islands = ();
if (@{ $layerm->perimeters }) { if ($Slic3r::Config->avoid_crossing_perimeters) {
$gcode .= $gcodegen->set_extruder($region->extruders->{perimeter}); push @islands, map +{ perimeters => [], fills => [] }, @{$layer->slices};
$gcode .= $gcodegen->extrude($_, 'perimeter') for @{ $layerm->perimeters }; PERIMETER: foreach my $perimeter (@{$layerm->perimeters}) {
$perimeter = $perimeter->unpack;
for my $i (0 .. $#{$layer->slices}-1) {
if ($layer->slices->[$i]->contour->encloses_point($perimeter->first_point)) {
push @{ $islands[$i]{perimeters} }, $perimeter;
next PERIMETER;
}
}
push @{ $islands[-1]{perimeters} }, $perimeter; # optimization
}
FILL: foreach my $fill (@{$layerm->fills}) {
for my $i (0 .. $#{$layer->slices}-1) {
$fill = $fill->unpack;
if ($layer->slices->[$i]->contour->encloses_point($fill->first_point)) {
push @{ $islands[$i]{fills} }, $fill;
next FILL;
}
}
push @{ $islands[-1]{fills} }, $fill; # optimization
}
} else {
push @islands, {
perimeters => $layerm->perimeters,
fills => $layerm->fills,
};
} }
# extrude fills foreach my $island (@islands) {
if (@{ $layerm->fills }) { # extrude perimeters
$gcode .= $gcodegen->set_extruder($region->extruders->{infill}); if (@{ $island->{perimeters} }) {
for my $fill (@{ $layerm->fills }) { $gcode .= $gcodegen->set_extruder($region->extruders->{perimeter});
if ($fill->isa('Slic3r::ExtrusionPath::Collection')) { $gcode .= $gcodegen->extrude($_, 'perimeter') for @{ $island->{perimeters} };
$gcode .= $gcodegen->extrude($_, 'fill') }
for $fill->chained_path($gcodegen->last_pos);
} else { # extrude fills
$gcode .= $gcodegen->extrude($fill, 'fill') ; if (@{ $island->{fills} }) {
$gcode .= $gcodegen->set_extruder($region->extruders->{infill});
for my $fill (@{ $island->{fills} }) {
if ($fill->isa('Slic3r::ExtrusionPath::Collection')) {
$gcode .= $gcodegen->extrude($_, 'fill')
for $fill->chained_path($gcodegen->last_pos);
} else {
$gcode .= $gcodegen->extrude($fill, 'fill') ;
}
} }
} }
} }