From 9dbf21235c5e688e26ae9d7ac5459da9c52e1bf8 Mon Sep 17 00:00:00 2001 From: Alessandro Ranellucci Date: Sat, 6 Jul 2013 11:50:41 +0200 Subject: [PATCH 1/2] Fixed missing change in recent refactoring, causing plater crash. #1298 --- lib/Slic3r/TriangleMesh.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Slic3r/TriangleMesh.pm b/lib/Slic3r/TriangleMesh.pm index b4624250d..e0698b4a6 100644 --- a/lib/Slic3r/TriangleMesh.pm +++ b/lib/Slic3r/TriangleMesh.pm @@ -607,7 +607,7 @@ sub horizontal_projection { my @f = (); foreach my $facet (@{$self->facets}) { - push @f, Slic3r::Polygon->new([ map [ @{$self->vertices->[$_]}[X,Y] ], @$facet ]); + push @f, Slic3r::Polygon->new(map [ @{$self->vertices->[$_]}[X,Y] ], @$facet); } my $scale_vector = Math::Clipper::integerize_coordinate_sets({ bits => 32 }, @f); From 8d1069766bf82c8caf6b2d9012d4b082106b7150 Mon Sep 17 00:00:00 2001 From: Alessandro Ranellucci Date: Sat, 6 Jul 2013 12:14:49 +0200 Subject: [PATCH 2/2] Workaround dclone() not being thread-safe --- lib/Slic3r/ExPolygon.pm | 7 ++++++- lib/Slic3r/Point.pm | 5 +++++ lib/Slic3r/Polyline.pm | 5 +++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/lib/Slic3r/ExPolygon.pm b/lib/Slic3r/ExPolygon.pm index fd1af58b0..c58af979f 100644 --- a/lib/Slic3r/ExPolygon.pm +++ b/lib/Slic3r/ExPolygon.pm @@ -32,6 +32,11 @@ sub clone { Storable::dclone($_[0]) } +sub threadsafe_clone { + my $self = shift; + return (ref $self)->new(map $_->threadsafe_clone, @$self); +} + sub contour { my $self = shift; return $self->[0]; @@ -303,7 +308,7 @@ has 'expolygons' => (is => 'ro', default => sub { [] }); sub clone { my $self = shift; return (ref $self)->new( - expolygons => [ map $_->clone, @{$self->expolygons} ], + expolygons => [ map $_->threadsafe_clone, @{$self->expolygons} ], ); } diff --git a/lib/Slic3r/Point.pm b/lib/Slic3r/Point.pm index 233f60f34..4e86995e1 100644 --- a/lib/Slic3r/Point.pm +++ b/lib/Slic3r/Point.pm @@ -24,6 +24,11 @@ sub clone { Storable::dclone($_[0]) } +sub threadsafe_clone { + my $self = shift; + return (ref $self)->new(@$self); +} + sub coincides_with { my $self = shift; my ($point) = @_; diff --git a/lib/Slic3r/Polyline.pm b/lib/Slic3r/Polyline.pm index f2a9cbd7f..fd4bd571f 100644 --- a/lib/Slic3r/Polyline.pm +++ b/lib/Slic3r/Polyline.pm @@ -22,6 +22,11 @@ sub clone { Storable::dclone($_[0]) } +sub threadsafe_clone { + my $self = shift; + return (ref $self)->new(map $_->threadsafe_clone, @$self); +} + sub serialize { my $self = shift; return pack 'l*', map @$_, @$self;