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); $self->slices->append(@$slices);
} }
sub merge_slices {
my ($self) = @_;
$_->merge_slices for @{$self->regions};
}
sub make_perimeters { sub make_perimeters {
my $self = shift; my $self = shift;
Slic3r::debugf "Making perimeters for layer %d\n", $self->id; 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 { sub make_perimeters {
my ($self, $slices, $fill_surfaces) = @_; 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" die "No layers were detected. You might want to repair your STL file(s) or check their size and retry.\n"
if !@{$self->layers}; if !@{$self->layers};
$self->set_typed_slices(0);
$self->set_step_done(STEP_SLICE); $self->set_step_done(STEP_SLICE);
} }
@ -412,6 +413,13 @@ sub make_perimeters {
$self->set_step_started(STEP_PERIMETERS); $self->set_step_started(STEP_PERIMETERS);
$self->print->status_cb->(20, "Generating 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 # compare each layer to the one below, and mark those slices needing
# one additional inner perimeter, like the top of domed objects- # one additional inner perimeter, like the top of domed objects-
@ -509,6 +517,7 @@ sub prepare_infill {
# and transform $layerm->fill_surfaces from expolygon # and transform $layerm->fill_surfaces from expolygon
# to typed top/bottom/internal surfaces; # to typed top/bottom/internal surfaces;
$self->detect_surfaces_type; $self->detect_surfaces_type;
$self->set_typed_slices(1);
# decide what surfaces are to be filled # decide what surfaces are to be filled
$_->prepare_fill_surfaces for map @{$_->regions}, @{$self->layers}; $_->prepare_fill_surfaces for map @{$_->regions}, @{$self->layers};

View file

@ -66,7 +66,8 @@ REGISTER_CLASS(PrintRegion, "Print::Region");
PrintObject::PrintObject(Print* print, ModelObject* model_object, const BoundingBoxf3 &modobj_bbox) PrintObject::PrintObject(Print* print, ModelObject* model_object, const BoundingBoxf3 &modobj_bbox)
: _print(print), : _print(print),
_model_object(model_object) _model_object(model_object),
typed_slices(false)
{ {
region_volumes.resize(this->_print->regions.size()); region_volumes.resize(this->_print->regions.size());

View file

@ -71,6 +71,10 @@ class PrintObject
PrintObjectConfig config; PrintObjectConfig config;
t_layer_height_ranges layer_height_ranges; t_layer_height_ranges layer_height_ranges;
// this is set to true when LayerRegion->slices is split in top/internal/bottom
// so that next call to make_perimeters() performs a union() before computing loops
bool typed_slices;
Point3 size; // XYZ in scaled coordinates Point3 size; // XYZ in scaled coordinates
// scaled coordinates to add to copies (to compensate for the alignment // scaled coordinates to add to copies (to compensate for the alignment

View file

@ -62,6 +62,11 @@ _constant()
Ref<Point> _copies_shift() Ref<Point> _copies_shift()
%code%{ RETVAL = &THIS->_copies_shift; %}; %code%{ RETVAL = &THIS->_copies_shift; %};
bool typed_slices()
%code%{ RETVAL = THIS->typed_slices; %};
void set_typed_slices(bool value)
%code%{ THIS->typed_slices = value; %};
Points _shifted_copies() Points _shifted_copies()
%code%{ RETVAL = THIS->_shifted_copies; %}; %code%{ RETVAL = THIS->_shifted_copies; %};
void set_shifted_copies(Points value) void set_shifted_copies(Points value)