1use Test::More tests => 6;
2use strict;
3use warnings;
4
5BEGIN {
6    use FindBin;
7    use lib "$FindBin::Bin/../lib";
8    use local::lib "$FindBin::Bin/../local-lib";
9}
10
11use List::Util qw(first sum);
12use Slic3r;
13use Slic3r::Geometry qw(scale PI);
14use Slic3r::Test;
15
16{
17    my $config = Slic3r::Config::new_from_defaults;
18    $config->set('skirts', 1);
19    $config->set('brim_width', 2);
20    $config->set('perimeters', 3);
21    $config->set('fill_density', 0.4);
22    $config->set('bottom_solid_layers', 1);
23    $config->set('first_layer_extrusion_width', 2);
24    $config->set('first_layer_height', '100%');
25    $config->set('filament_diameter', [ 3.0 ]);
26    $config->set('nozzle_diameter', [ 0.5 ]);
27
28    my $print = Slic3r::Test::init_print('20mm_cube', config => $config);
29    my @E_per_mm = ();
30    Slic3r::GCode::Reader->new->parse(my $gcode = Slic3r::Test::gcode($print), sub {
31        my ($self, $cmd, $args, $info) = @_;
32
33        if ($self->Z == $config->layer_height) {  # only consider first layer
34            if ($info->{extruding} && $info->{dist_XY} > 0) {
35                push @E_per_mm, $info->{dist_E} / $info->{dist_XY};
36            }
37        }
38    });
39    my $E_per_mm_avg = sum(@E_per_mm) / @E_per_mm;
40    # allow some tolerance because solid rectilinear infill might be adjusted/stretched
41    ok !(defined first { abs($_ - $E_per_mm_avg) > 0.015 } @E_per_mm),
42        'first_layer_extrusion_width applies to everything on first layer';
43}
44
45{
46    my $config = Slic3r::Config::new_from_defaults;
47    $config->set('bridge_speed', 99);
48    $config->set('bridge_flow_ratio', 1);
49    $config->set('cooling', [ 0 ]);             # to prevent speeds from being altered
50    $config->set('first_layer_speed', '100%');  # to prevent speeds from being altered
51
52    my $test = sub {
53        my $print = Slic3r::Test::init_print('overhang', config => $config);
54        my @E_per_mm = ();
55        Slic3r::GCode::Reader->new->parse(my $gcode = Slic3r::Test::gcode($print), sub {
56            my ($self, $cmd, $args, $info) = @_;
57
58            if ($info->{extruding} && $info->{dist_XY} > 0) {
59                if (($args->{F} // $self->F) == $config->bridge_speed*60) {
60                    push @E_per_mm, $info->{dist_E} / $info->{dist_XY};
61                }
62            }
63        });
64        my $expected_mm3_per_mm = ($config->nozzle_diameter->[0]**2) * PI/4 * $config->bridge_flow_ratio;
65        my $expected_E_per_mm = $expected_mm3_per_mm / ((($config->filament_diameter->[0]/2)**2)*PI);
66        ok !(defined first { abs($_ - $expected_E_per_mm) > 0.01 } @E_per_mm),
67            'expected flow when using bridge_flow_ratio = ' . $config->bridge_flow_ratio;
68    };
69
70    $config->set('bridge_flow_ratio', 0.5);
71    $test->();
72    $config->set('bridge_flow_ratio', 2);
73    $test->();
74    $config->set('extrusion_width', 0.4);
75    $config->set('bridge_flow_ratio', 1);
76    $test->();
77    $config->set('bridge_flow_ratio', 0.5);
78    $test->();
79    $config->set('bridge_flow_ratio', 2);
80    $test->();
81}
82
83__END__
84