From b495e15d7f17604c62cee5083153e3aa1cb892e4 Mon Sep 17 00:00:00 2001 From: Alessandro Ranellucci Date: Thu, 29 Nov 2012 19:13:52 +0100 Subject: [PATCH] Fix plater slowness after the introduction of the vertical projection --- lib/Slic3r/GUI/Plater.pm | 13 +++++++------ lib/Slic3r/TriangleMesh.pm | 5 +++-- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/lib/Slic3r/GUI/Plater.pm b/lib/Slic3r/GUI/Plater.pm index 724a5259..a8b30cba 100644 --- a/lib/Slic3r/GUI/Plater.pm +++ b/lib/Slic3r/GUI/Plater.pm @@ -1119,20 +1119,21 @@ sub make_thumbnail { my @points = map [ @$_[X,Y] ], @{$self->model_object->mesh->vertices}; my $mesh = $self->model_object->mesh; my $thumbnail = Slic3r::ExPolygon::Collection->new( - expolygons => (@{$mesh->facets} <= 2000) + expolygons => (@{$mesh->facets} <= 5000) ? $mesh->horizontal_projection : [ Slic3r::ExPolygon->new(convex_hull($mesh->vertices)) ], ); for (map @$_, map @$_, @{$thumbnail->expolygons}) { @$_ = map $_ * $self->thumbnail_scaling_factor, @$_; } - for (@{$thumbnail->expolygons}) { - $_->simplify(0.3); - $_->rotate(Slic3r::Geometry::deg2rad($self->rotate)); - $_->scale($self->scale); + foreach my $expolygon (@{$thumbnail->expolygons}) { + @$expolygon = grep $_->area >= 1, @$expolygon; + $expolygon->simplify(0.5); + $expolygon->rotate(Slic3r::Geometry::deg2rad($self->rotate)); + $expolygon->scale($self->scale); } + @{$thumbnail->expolygons} = grep @$_, @{$thumbnail->expolygons}; $thumbnail->align_to_origin; - $self->thumbnail($thumbnail); # ignored in multi-threaded environments $self->free_model_object; diff --git a/lib/Slic3r/TriangleMesh.pm b/lib/Slic3r/TriangleMesh.pm index ea1204fe..59944596 100644 --- a/lib/Slic3r/TriangleMesh.pm +++ b/lib/Slic3r/TriangleMesh.pm @@ -584,11 +584,12 @@ sub horizontal_projection { my @f = (); foreach my $facet (@{$self->facets}) { - push @f, [ map [ @{$self->vertices->[$_]}[X,Y] ], @$facet ]; + push @f, Slic3r::Polygon->new([ map [ @{$self->vertices->[$_]}[X,Y] ], @$facet ]); } + $_->make_counter_clockwise for @f; my $scale_vector = Math::Clipper::integerize_coordinate_sets({ bits => 32 }, @f); - my $union = union_ex([ Slic3r::Geometry::Clipper::offset(\@f, 1) ]); + my $union = union_ex([ Slic3r::Geometry::Clipper::offset(\@f, 10000) ]); Math::Clipper::unscale_coordinate_sets($scale_vector, $_) for @$union; return $union; }