PrusaSlicer-NonPlainar/lib/Slic3r/Surface.pm

77 lines
1.7 KiB
Perl

package Slic3r::Surface;
use Moo;
has 'expolygon' => (
is => 'ro',
required => 1,
handles => [qw(encloses_point lines contour holes)],
);
has 'surface_type' => (
is => 'rw',
#isa => enum([qw(internal internal-solid bottom top)]),
);
# this integer represents the thickness of the surface expressed in layers
has 'depth_layers' => (is => 'ro', default => sub {1});
has 'bridge_angle' => (is => 'ro');
# static method to group surfaces having same surface_type, bridge_angle and depth_layers
sub group {
my $class = shift;
my $params = ref $_[0] eq 'HASH' ? shift(@_) : {};
my (@surfaces) = @_;
my %unique_types = ();
foreach my $surface (@surfaces) {
my $type = ($params->{merge_solid} && $surface->surface_type =~ /top|bottom|solid/)
? 'solid'
: $surface->surface_type;
$type .= "_" . ($surface->bridge_angle // ''); #/
$type .= "_" . $surface->depth_layers;
$unique_types{$type} ||= [];
push @{ $unique_types{$type} }, $surface;
}
return values %unique_types;
}
sub offset {
my $self = shift;
return map (ref $self)->new(
expolygon => $_,
map { $_ => $self->$_ } qw(surface_type depth_layers bridge_angle),
), $self->expolygon->offset_ex(@_);
}
sub add_hole {
my $self = shift;
my ($hole) = @_;
push @$self, $hole;
}
sub id {
my $self = shift;
return $self->contour->id;
}
sub clipper_polygon {
my $self = shift;
return {
outer => $self->contour->p,
holes => [
map $_->p, @{$self->holes}
],
};
}
sub p {
my $self = shift;
return @{$self->expolygon};
}
1;