f46226b32f
Guards against issue of slightly off-vertical walls triggering extra infill on layers that should be empty when combining infill.
72 lines
2.9 KiB
Perl
72 lines
2.9 KiB
Perl
use Test::More tests => 3;
|
|
use strict;
|
|
use warnings;
|
|
|
|
BEGIN {
|
|
use FindBin;
|
|
use lib "$FindBin::Bin/../lib";
|
|
}
|
|
|
|
use List::Util qw(first);
|
|
use Slic3r;
|
|
use Slic3r::Test;
|
|
|
|
{
|
|
my $config = Slic3r::Config->new_from_defaults;
|
|
$config->set('skirts', 0);
|
|
$config->set('solid_layers', 0);
|
|
$config->set('bottom_solid_layers', 0);
|
|
$config->set('top_solid_layers', 0);
|
|
$config->set('infill_every_layers', 6);
|
|
$config->set('layer_height', 0.06);
|
|
|
|
my $test = sub {
|
|
my ($shift) = @_;
|
|
|
|
my $self = Slic3r::Test::init_print('20mm_cube', config => $config);
|
|
|
|
$shift /= &Slic3r::SCALING_FACTOR;
|
|
|
|
# Put a slope on the box's sides by shifting x and y coords by $tilt * (z / boxheight).
|
|
# The test here is to put such a slight slope on the walls that it should
|
|
# not trigger any extra fill on fill layers that should be empty when
|
|
# combine infill is enabled.
|
|
$_->[0] += $shift * ($_->[2] / (20 / &Slic3r::SCALING_FACTOR)), for @{$self->objects->[0]->meshes->[0]->vertices};
|
|
$_->[1] += $shift * ($_->[2] / (20 / &Slic3r::SCALING_FACTOR)), for @{$self->objects->[0]->meshes->[0]->vertices};
|
|
|
|
# copy of Print::export_gcode() up to the point
|
|
# after fill surfaces are combined
|
|
$self->init_extruders;
|
|
$_->slice(keep_meshes => 1) for @{$self->objects};
|
|
$_->make_perimeters for @{$self->objects};
|
|
foreach my $layer (map @{$_->layers}, @{$self->objects}) {
|
|
$_->simplify(&Slic3r::SCALED_RESOLUTION)
|
|
for @{$layer->slices}, (map $_->expolygon, map @{$_->slices}, @{$layer->regions});
|
|
}
|
|
$_->detect_surfaces_type for @{$self->objects};
|
|
$_->prepare_fill_surfaces for map @{$_->regions}, map @{$_->layers}, @{$self->objects};
|
|
$_->process_bridges for map @{$_->regions}, map @{$_->layers}, @{$self->objects};
|
|
$_->discover_horizontal_shells for @{$self->objects};
|
|
$_->combine_infill for @{$self->objects};
|
|
|
|
# Only layers with id % 6 == 0 should have fill.
|
|
my $spurious_infill = 0;
|
|
foreach my $layer (map @{$_->layers}, @{$self->objects}) {
|
|
++$spurious_infill if ($layer->id % 6 && grep @{$_->fill_surfaces} > 0, @{$layer->regions});
|
|
}
|
|
|
|
$spurious_infill -= scalar(@{$self->objects->[0]->layers} - 1) % 6;
|
|
|
|
fail "spurious fill surfaces found on layers that should have none (walls " . sprintf("%.4f", Slic3r::Geometry::rad2deg(atan2($shift, 20/&Slic3r::SCALING_FACTOR))) . " degrees off vertical)"
|
|
unless $spurious_infill == 0;
|
|
1;
|
|
};
|
|
|
|
# Test with mm skew offsets for the top of the 20mm-high box
|
|
for my $shift (0, 0.0001, 1) {
|
|
ok $test->($shift), "no spurious fill surfaces with box walls " . sprintf("%.4f",Slic3r::Geometry::rad2deg(atan2($shift, 20))) . " degrees off of vertical";
|
|
}
|
|
}
|
|
|
|
__END__
|