diff --git a/lib/Slic3r/ExPolygon.pm b/lib/Slic3r/ExPolygon.pm index 3db8a724..84afc910 100644 --- a/lib/Slic3r/ExPolygon.pm +++ b/lib/Slic3r/ExPolygon.pm @@ -325,6 +325,11 @@ use Slic3r::Geometry qw(X1 Y1); has 'expolygons' => (is => 'ro', default => sub { [] }); +sub append { + my $self = shift; + push @{$self->expolygons}, @_; +} + sub clone { my $self = shift; return (ref $self)->new( diff --git a/lib/Slic3r/GUI/Plater.pm b/lib/Slic3r/GUI/Plater.pm index a6fb6cf2..57ad8e8d 100644 --- a/lib/Slic3r/GUI/Plater.pm +++ b/lib/Slic3r/GUI/Plater.pm @@ -1167,17 +1167,23 @@ sub make_thumbnail { my $self = shift; my $mesh = $self->model_object->mesh; # $self->model_object is already aligned to origin - my $thumbnail = Slic3r::ExPolygon::Collection->new( - expolygons => (@{$mesh->facets} <= 5000) - ? $mesh->horizontal_projection - : [ Slic3r::ExPolygon->new($self->convex_hull) ], - ); - # Note: the call to simplify() was removed here because it used Clipper - # simplification which needs integerization. - # TODO: remove polygons with area <= 1 pixel + my $thumbnail = Slic3r::ExPolygon::Collection->new; + if (@{$mesh->facets} <= 5000) { + $thumbnail->append(@{ $mesh->horizontal_projection }); + } else { + my $convex_hull = Slic3r::ExPolygon->new($self->convex_hull)->clone; + $convex_hull->scale(1/&Slic3r::SCALING_FACTOR); + $thumbnail->append($convex_hull); + } + + # remove polygons with area <= 1mm + my $area_threshold = Slic3r::Geometry::scale 1; + @{$thumbnail->expolygons} = + map $_->simplify(0.5), + grep $_->area >= $area_threshold, + @{$thumbnail->expolygons}; $thumbnail->scale(&Slic3r::SCALING_FACTOR); - $self->thumbnail($thumbnail); # ignored in multi-threaded environments $self->free_model_object;