PrusaSlicer-NonPlainar/lib/Slic3r/Surface.pm

87 lines
1.7 KiB
Perl
Raw Normal View History

2011-09-01 21:06:28 +02:00
package Slic3r::Surface;
use Moo;
2011-09-01 21:06:28 +02:00
2011-09-02 21:10:20 +02:00
use Math::Geometry::Planar;
2011-09-01 21:06:28 +02:00
has 'contour' => (
is => 'ro',
#isa => 'Slic3r::Polyline::Closed',
2011-09-01 21:06:28 +02:00
required => 1,
);
has 'holes' => (
traits => ['Array'],
is => 'rw',
#isa => 'ArrayRef[Slic3r::Polyline::Closed]',
2011-09-01 21:06:28 +02:00
default => sub { [] },
);
2011-09-05 12:21:27 +02:00
# TODO: to allow for multiple solid skins to be filled near external
# surfaces, a new type should be defined: internal-solid
2011-09-01 21:06:28 +02:00
has 'surface_type' => (
is => 'rw',
#isa => enum([qw(internal bottom top)]),
2011-09-01 21:06:28 +02:00
);
sub add_hole {
2011-09-01 21:06:28 +02:00
my $self = shift;
my ($hole) = @_;
push @{ $self->holes }, $hole;
2011-09-01 21:06:28 +02:00
}
sub new_from_mgp {
my $self = shift;
2011-09-05 12:21:27 +02:00
my ($polygon, %params) = @_;
my ($contour_p, @holes_p) = @{ $polygon->polygons };
return __PACKAGE__->new(
contour => Slic3r::Polyline::Closed->cast($contour_p),
holes => [
map Slic3r::Polyline::Closed->cast($_), @holes_p
],
2011-09-05 12:21:27 +02:00
%params,
);
}
2011-09-01 21:06:28 +02:00
sub id {
my $self = shift;
return $self->contour->id;
}
sub encloses_point {
my $self = shift;
my ($point) = @_;
return 0 if !$self->contour->encloses_point($point);
return 0 if grep $_->encloses_point($point), @{ $self->holes };
return 1;
}
2011-09-02 21:10:20 +02:00
sub mgp_polygon {
my $self = shift;
my $p = Math::Geometry::Planar->new;
$p->polygons([ $self->contour->p, map($_->p, @{ $self->holes }) ]);
2011-09-02 21:10:20 +02:00
return $p;
}
sub clipper_polygon {
my $self = shift;
return {
outer => $self->contour->p,
holes => [
map $_->p, @{$self->holes}
],
};
}
2011-09-05 12:21:27 +02:00
sub lines {
my $self = shift;
return @{ $self->contour->lines }, map @{ $_->lines }, @{ $self->holes };
}
2011-09-01 21:06:28 +02:00
1;