diff --git a/lib/Slic3r/Fill.pm b/lib/Slic3r/Fill.pm index e08bc2e70..de1d52ef6 100644 --- a/lib/Slic3r/Fill.pm +++ b/lib/Slic3r/Fill.pm @@ -89,13 +89,7 @@ sub make_fill { 1, ); - push @surfaces, map Slic3r::Surface->new( - expolygon => $_, - surface_type => $group->[0]->surface_type, - bridge_angle => $group->[0]->bridge_angle, - thickness => $group->[0]->thickness, - thickness_layers => $group->[0]->thickness_layers, - ), @$union; + push @surfaces, map $group->[0]->clone(expolygon => $_), @$union; } } diff --git a/lib/Slic3r/Layer/Region.pm b/lib/Slic3r/Layer/Region.pm index 6aec785ae..1f1b8df2a 100644 --- a/lib/Slic3r/Layer/Region.pm +++ b/lib/Slic3r/Layer/Region.pm @@ -514,10 +514,7 @@ sub process_external_surfaces { # subtract the new top surfaces from the other non-top surfaces and re-add them my @other = grep $_->surface_type != S_TYPE_TOP && $_->surface_type != S_TYPE_BOTTOM, @{$self->fill_surfaces}; foreach my $group (Slic3r::Surface->group(@other)) { - push @new_surfaces, map Slic3r::Surface->new( - expolygon => $_, - surface_type => $group->[0]->surface_type, - ), @{diff_ex( + push @new_surfaces, map $group->[0]->clone(expolygon => $_), @{diff_ex( [ map $_->p, @$group ], [ map $_->p, @new_surfaces ], )}; diff --git a/lib/Slic3r/Print/Object.pm b/lib/Slic3r/Print/Object.pm index a14f6202d..a1193217f 100644 --- a/lib/Slic3r/Print/Object.pm +++ b/lib/Slic3r/Print/Object.pm @@ -543,13 +543,11 @@ sub bridge_over_infill { my @new_surfaces = (); # subtract the area from all types of surfaces foreach my $group (Slic3r::Surface->group(@{$lower_layerm->fill_surfaces})) { - push @new_surfaces, map Slic3r::Surface->new( - expolygon => $_, - surface_type => $group->[0]->surface_type, - ), @{diff_ex( - [ map $_->p, @$group ], - [ map @$_, @$to_bridge ], - )}; + push @new_surfaces, map $group->[0]->clone(expolygon => $_), + @{diff_ex( + [ map $_->p, @$group ], + [ map @$_, @$to_bridge ], + )}; push @new_surfaces, map Slic3r::Surface->new( expolygon => $_, surface_type => S_TYPE_INTERNALVOID, @@ -669,8 +667,7 @@ sub discover_horizontal_shells { [ map @$_, @$internal_solid, @$internal ], 1, ); - push @$neighbor_fill_surfaces, Slic3r::Surface->new - (expolygon => $_, surface_type => $s->[0]->surface_type, bridge_angle => $s->[0]->bridge_angle) + push @$neighbor_fill_surfaces, $s->[0]->clone(expolygon => $_) for @$solid_surfaces; } } diff --git a/lib/Slic3r/Surface.pm b/lib/Slic3r/Surface.pm index 966dcde41..b18d2e467 100644 --- a/lib/Slic3r/Surface.pm +++ b/lib/Slic3r/Surface.pm @@ -34,6 +34,17 @@ sub new { $self; } +sub clone { + my $self = shift; + my %p = @_; + + return (ref $self)->new( + (map { $_ => $self->$_ } qw(surface_type thickness thickness_layers bridge_angle)), + expolygon => ($p{expolygon} ? delete $p{expolygon} : $self->expolygon->clone), + %p, + ); +} + sub expolygon { $_[0][S_EXPOLYGON] } sub surface_type { $_[0][S_SURFACE_TYPE] = $_[1] if defined $_[1]; $_[0][S_SURFACE_TYPE] } sub thickness { $_[0][S_THICKNESS] } @@ -85,22 +96,12 @@ sub group { sub offset { my $self = shift; - return map $self->_inflate_expolygon($_), $self->expolygon->offset_ex(@_); + return map $self->clone(expolygon => $_), $self->expolygon->offset_ex(@_); } sub simplify { my $self = shift; - return map $self->_inflate_expolygon($_), $self->expolygon->simplify(@_); -} - -sub _inflate_expolygon { - my $self = shift; - my ($expolygon) = @_; - - return (ref $self)->new( - expolygon => $expolygon, - map { $_ => $self->$_ } qw(surface_type thickness thickness_layers bridge_angle), - ); + return map $self->clone(expolygon => $_), $self->expolygon->simplify(@_); } sub p {