PrusaSlicer-NonPlainar/lib/Slic3r/TriangleMesh.pm

53 lines
1.3 KiB
Perl
Raw Normal View History

package Slic3r::TriangleMesh;
2013-09-09 22:40:46 +00:00
use strict;
use warnings;
2013-09-09 22:40:46 +00:00
use List::Util qw(first);
use Slic3r::Geometry qw(X Y);
2013-08-05 18:21:08 +00:00
use Slic3r::Geometry::Clipper qw(union_ex offset);
2013-09-09 22:40:46 +00:00
sub needed_repair {
my $self = shift;
2013-09-09 22:40:46 +00:00
my $stats = $self->stats;
return (first { $stats->{$_} > 0 }
qw(degenerate_facets edges_fixed facets_removed facets_added facets_reversed backwards_edges)) ? 1 : 0;
}
sub center {
my $self = shift;
return $self->bounding_box->center;
}
sub facets_count {
my $self = shift;
return $self->stats->{number_of_facets};
}
sub bounding_box {
my $self = shift;
return Slic3r::Geometry::BoundingBox->new_from_bb($self->bb3);
}
2013-08-05 18:21:08 +00:00
# this will return *scaled* expolygons, so it is expected to be run
# on unscaled meshes
sub horizontal_projection {
my $self = shift;
2013-09-09 22:40:46 +00:00
my ($facets, $vertices) = ($self->facets, $self->vertices);
my @f = ();
2013-09-09 22:40:46 +00:00
foreach my $facet (@$facets) {
2013-08-05 18:21:08 +00:00
push @f, Slic3r::Polygon->new(
2013-09-09 22:40:46 +00:00
map [ map $_ / &Slic3r::SCALING_FACTOR, @{$vertices->[$_]}[X,Y] ], @$facet
2013-08-05 18:21:08 +00:00
);
}
$_->make_counter_clockwise for @f; # do this after scaling, as winding order might change while doing that
# the offset factor was tuned using groovemount.stl
2013-08-26 15:58:37 +00:00
return union_ex(offset(\@f, Slic3r::Geometry::scale 0.01), 1);
}
1;