Bugfix: make_perimeters() was not truly idempotent because prepare_infill() split ->slices into typed surfaces

This commit is contained in:
Alessandro Ranellucci 2014-07-15 19:07:38 +02:00
parent 28f9278963
commit d9f5fdae72
6 changed files with 38 additions and 3 deletions

View file

@ -57,6 +57,11 @@ sub make_slices {
$self->slices->append(@$slices);
}
sub merge_slices {
my ($self) = @_;
$_->merge_slices for @{$self->regions};
}
sub make_perimeters {
my $self = shift;
Slic3r::debugf "Making perimeters for layer %d\n", $self->id;

View file

@ -40,6 +40,17 @@ sub flow {
);
}
sub merge_slices {
my ($self) = @_;
my $expolygons = union_ex([ map $_->p, @{$self->slices} ]);
$self->slices->clear;
$self->slices->append(Slic3r::Surface->new(
expolygon => $_,
surface_type => S_TYPE_INTERNAL,
)) for @$expolygons;
}
sub make_perimeters {
my ($self, $slices, $fill_surfaces) = @_;

View file

@ -366,6 +366,7 @@ sub slice {
die "No layers were detected. You might want to repair your STL file(s) or check their size and retry.\n"
if !@{$self->layers};
$self->set_typed_slices(0);
$self->set_step_done(STEP_SLICE);
}
@ -412,6 +413,13 @@ sub make_perimeters {
$self->set_step_started(STEP_PERIMETERS);
$self->print->status_cb->(20, "Generating perimeters");
# merge slices if they were split into types
if ($self->typed_slices) {
$_->merge_slices for @{$self->layers};
$self->set_typed_slices(0);
$self->invalidate_step(STEP_PREPARE_INFILL);
}
# compare each layer to the one below, and mark those slices needing
# one additional inner perimeter, like the top of domed objects-
@ -509,7 +517,8 @@ sub prepare_infill {
# and transform $layerm->fill_surfaces from expolygon
# to typed top/bottom/internal surfaces;
$self->detect_surfaces_type;
$self->set_typed_slices(1);
# decide what surfaces are to be filled
$_->prepare_fill_surfaces for map @{$_->regions}, @{$self->layers};