Get rid of most calls to $Slic3r::flow

This commit is contained in:
Alessandro Ranellucci 2013-02-18 11:52:47 +01:00
parent 6dc62d3cf2
commit b9c84490b8
3 changed files with 13 additions and 8 deletions

View file

@ -16,6 +16,7 @@ has 'layer' => (
has 'region' => (is => 'ro', required => 1); has 'region' => (is => 'ro', required => 1);
has 'perimeter_flow' => (is => 'rw'); has 'perimeter_flow' => (is => 'rw');
has 'infill_flow' => (is => 'rw'); has 'infill_flow' => (is => 'rw');
has 'infill_area_threshold' => (is => 'lazy');
has 'overhang_width' => (is => 'lazy'); has 'overhang_width' => (is => 'lazy');
# collection of spare segments generated by slicing the original geometry; # collection of spare segments generated by slicing the original geometry;
@ -71,6 +72,11 @@ sub _build_overhang_width {
return scale($self->height * ((cos $threshold_rad) / (sin $threshold_rad))); return scale($self->height * ((cos $threshold_rad) / (sin $threshold_rad)));
} }
sub _build_infill_area_threshold {
my $self = shift;
return $self->infill_flow->scaled_spacing ** 2;
}
# build polylines from lines # build polylines from lines
sub make_surfaces { sub make_surfaces {
my $self = shift; my $self = shift;
@ -194,7 +200,7 @@ sub make_perimeters {
# this compensation only works for circular holes, while it would # this compensation only works for circular holes, while it would
# overcompensate for hexagons and other shapes having straight edges. # overcompensate for hexagons and other shapes having straight edges.
# so we require a minimum number of vertices. # so we require a minimum number of vertices.
next unless $circumference / @$hole >= 3 * $Slic3r::flow->scaled_width; next unless $circumference / @$hole >= 3 * $self->perimeter_flow->scaled_width;
# revert the compensation done in make_surfaces() and get the actual radius # revert the compensation done in make_surfaces() and get the actual radius
# of the hole # of the hole
@ -411,7 +417,7 @@ sub _add_perimeter {
my $self = shift; my $self = shift;
my ($polygon, $role) = @_; my ($polygon, $role) = @_;
return unless $polygon->is_printable($self->perimeter_flow->width); return unless $polygon->is_printable($self->perimeter_flow);
push @{ $self->perimeters }, Slic3r::ExtrusionLoop->pack( push @{ $self->perimeters }, Slic3r::ExtrusionLoop->pack(
polygon => $polygon, polygon => $polygon,
role => ($role // EXTR_ROLE_PERIMETER), role => ($role // EXTR_ROLE_PERIMETER),

View file

@ -118,7 +118,7 @@ sub subdivide {
# returns false if the polyline is too tight to be printed # returns false if the polyline is too tight to be printed
sub is_printable { sub is_printable {
my $self = shift; my $self = shift;
my ($flow_width) = @_; my ($flow) = @_;
# try to get an inwards offset # try to get an inwards offset
# for a distance equal to half of the extrusion width; # for a distance equal to half of the extrusion width;
@ -129,7 +129,7 @@ sub is_printable {
# detect them and we would be discarding them. # detect them and we would be discarding them.
my $p = $self->clone; my $p = $self->clone;
$p->make_counter_clockwise; $p->make_counter_clockwise;
return $p->offset(Slic3r::Geometry::scale($flow_width || $Slic3r::flow->width) / 2) ? 1 : 0; return $p->offset($flow->scaled_width / 2) ? 1 : 0;
} }
sub is_valid { sub is_valid {

View file

@ -306,7 +306,7 @@ sub detect_surfaces_type {
[ map { ref $_ eq 'ARRAY' ? $_ : ref $_ eq 'Slic3r::ExPolygon' ? @$_ : $_->p } @$clip_surfaces ], [ map { ref $_ eq 'ARRAY' ? $_ : ref $_ eq 'Slic3r::ExPolygon' ? @$_ : $_->p } @$clip_surfaces ],
1, 1,
); );
return grep $_->contour->is_printable($layerm->flow->width), return grep $_->contour->is_printable($layerm->flow),
map Slic3r::Surface->new(expolygon => $_, surface_type => $result_type), map Slic3r::Surface->new(expolygon => $_, surface_type => $result_type),
@$expolygons; @$expolygons;
}; };
@ -430,8 +430,6 @@ sub discover_horizontal_shells {
Slic3r::debugf "==> DISCOVERING HORIZONTAL SHELLS\n"; Slic3r::debugf "==> DISCOVERING HORIZONTAL SHELLS\n";
my $area_threshold = $Slic3r::flow->scaled_spacing ** 2;
for my $region_id (0 .. ($self->print->regions_count-1)) { for my $region_id (0 .. ($self->print->regions_count-1)) {
for (my $i = 0; $i < $self->layer_count; $i++) { for (my $i = 0; $i < $self->layer_count; $i++) {
my $layerm = $self->layers->[$i]->regions->[$region_id]; my $layerm = $self->layers->[$i]->regions->[$region_id];
@ -514,6 +512,7 @@ sub discover_horizontal_shells {
} }
} }
my $area_threshold = $layerm->infill_area_threshold;
@{$layerm->fill_surfaces} = grep $_->expolygon->area > $area_threshold, @{$layerm->fill_surfaces}; @{$layerm->fill_surfaces} = grep $_->expolygon->area > $area_threshold, @{$layerm->fill_surfaces};
} }
@ -534,7 +533,6 @@ sub combine_infill {
return unless $Slic3r::Config->infill_every_layers > 1 && $Slic3r::Config->fill_density > 0; return unless $Slic3r::Config->infill_every_layers > 1 && $Slic3r::Config->fill_density > 0;
my $every = $Slic3r::Config->infill_every_layers; my $every = $Slic3r::Config->infill_every_layers;
my $area_threshold = $Slic3r::flow->scaled_spacing ** 2;
my $layer_count = $self->layer_count; my $layer_count = $self->layer_count;
for my $region_id (0 .. ($self->print->regions_count-1)) { for my $region_id (0 .. ($self->print->regions_count-1)) {
@ -559,6 +557,7 @@ sub combine_infill {
); );
} }
my $area_threshold = $layerms[0]->infill_area_threshold;
@$intersection = grep $_->area > $area_threshold, @$intersection; @$intersection = grep $_->area > $area_threshold, @$intersection;
next if !@$intersection; next if !@$intersection;
Slic3r::debugf " combining %d %s regions from layers %d-%d\n", Slic3r::debugf " combining %d %s regions from layers %d-%d\n",