package Slic3r::Surface; use strict; use warnings; require Exporter; our @ISA = qw(Exporter); our @EXPORT_OK = qw(S_TYPE_TOP S_TYPE_BOTTOM S_TYPE_INTERNAL S_TYPE_INTERNALSOLID S_TYPE_INTERNALBRIDGE S_TYPE_INTERNALVOID); our %EXPORT_TAGS = (types => \@EXPORT_OK); # delegate handles sub encloses_point { $_[0]->expolygon->encloses_point } sub lines { $_[0]->expolygon->lines } sub contour { $_[0]->expolygon->contour } sub holes { $_[0]->expolygon->holes } # static method to group surfaces having same surface_type, bridge_angle and thickness* sub group { my $class = shift; my $params = ref $_[0] eq 'HASH' ? shift(@_) : {}; my (@surfaces) = @_; my %unique_types = (); foreach my $surface (@surfaces) { my $stype = $surface->surface_type; if ($surface->is_bridge && ($params->{bridged_bottom} || $surface->surface_type != S_TYPE_BOTTOM)) { $stype = 'bridge'; } elsif ($surface->is_solid) { my $fw = $params->{solid_infill_flow}; if ($surface->surface_type == S_TYPE_TOP && $params->{top_infill_flow}) { $fw = $params->{top_infill_flow}->width; } my $pattern = $surface->is_external ? $params->{solid_fill_pattern} : 'rectilinear'; $stype = join '_', $fw // '', $pattern // ''; } my $type = join '_', $stype, $surface->bridge_angle // '', $surface->thickness // '', $surface->thickness_layers; $unique_types{$type} ||= []; push @{ $unique_types{$type} }, $surface; } return values %unique_types; } sub offset { my $self = shift; return [ map $self->clone(expolygon => $_), @{$self->expolygon->offset_ex(@_)} ]; } sub simplify { my $self = shift; return map $self->clone(expolygon => $_), $self->expolygon->simplify(@_); } sub p { my $self = shift; return @{$self->polygons}; } sub is_solid { my $self = shift; my $type = $self->surface_type; # S_TYPE_INTERNALBRIDGE is not solid because we can't merge it with other solid types return $type == S_TYPE_TOP || $type == S_TYPE_BOTTOM || $type == S_TYPE_INTERNALSOLID; } sub is_external { my $self = shift; my $type = $self->surface_type; return $type == S_TYPE_TOP || $type == S_TYPE_BOTTOM; } sub is_bridge { my $self = shift; my $type = $self->surface_type; return $type == S_TYPE_BOTTOM || $type == S_TYPE_INTERNALBRIDGE; } 1;