diff --git a/lib/Slic3r/Config.pm b/lib/Slic3r/Config.pm index 41cdd72a7a..e6132af099 100644 --- a/lib/Slic3r/Config.pm +++ b/lib/Slic3r/Config.pm @@ -646,7 +646,7 @@ sub validate { # calculate flow $Slic3r::flow->calculate($Slic3r::extrusion_width); if ($Slic3r::first_layer_extrusion_width) { - $Slic3r::first_layer_flow = Slic3r::Flow->new; + $Slic3r::first_layer_flow = Slic3r::Flow->new(layer_height => $Slic3r::_first_layer_height); $Slic3r::first_layer_flow->calculate($Slic3r::first_layer_extrusion_width); } $Slic3r::perimeters_flow->calculate($Slic3r::perimeters_extrusion_width || $Slic3r::extrusion_width); diff --git a/lib/Slic3r/Flow.pm b/lib/Slic3r/Flow.pm index 6a5675c3a5..4fe37bcbc5 100644 --- a/lib/Slic3r/Flow.pm +++ b/lib/Slic3r/Flow.pm @@ -3,9 +3,12 @@ use Moo; use Slic3r::Geometry qw(PI); -has 'width' => (is => 'rw'); -has 'min_spacing' => (is => 'rw'); -has 'spacing' => (is => 'rw'); +has 'width' => (is => 'rw'); +has 'min_spacing' => (is => 'rw'); +has 'spacing' => (is => 'rw'); +has 'layer_height' => (is => 'lazy', builder => 1); + +sub _build_layer_height { $Slic3r::layer_height } sub calculate { my $self = shift; @@ -14,20 +17,20 @@ sub calculate { my ($flow_width, $min_flow_spacing, $flow_spacing); if ($extrusion_width) { $flow_width = $extrusion_width =~ /^(\d+(?:\.\d+)?)%$/ - ? ($Slic3r::layer_height * $1 / 100) + ? ($self->layer_height * $1 / 100) : $extrusion_width; } else { # here we calculate a sane default by matching the flow speed (at the nozzle) # and the feed rate my $volume = ($Slic3r::nozzle_diameter**2) * PI/4; - my $shape_threshold = $Slic3r::nozzle_diameter * $Slic3r::layer_height - + ($Slic3r::layer_height**2) * PI/4; + my $shape_threshold = $Slic3r::nozzle_diameter * $self->layer_height + + ($self->layer_height**2) * PI/4; if ($volume >= $shape_threshold) { # rectangle with semicircles at the ends - $flow_width = (($Slic3r::nozzle_diameter**2) * PI + ($Slic3r::layer_height**2) * (4 - PI)) / (4 * $Slic3r::layer_height); + $flow_width = (($Slic3r::nozzle_diameter**2) * PI + ($self->layer_height**2) * (4 - PI)) / (4 * $self->layer_height); } else { # rectangle with squished semicircles at the ends - $flow_width = $Slic3r::nozzle_diameter * ($Slic3r::nozzle_diameter/$Slic3r::layer_height - 4/PI + 1); + $flow_width = $Slic3r::nozzle_diameter * ($Slic3r::nozzle_diameter/$self->layer_height - 4/PI + 1); } my $min_flow_width = $Slic3r::nozzle_diameter * 1.05; @@ -36,9 +39,9 @@ sub calculate { $flow_width = $min_flow_width if $flow_width < $min_flow_width; } - if ($flow_width >= ($Slic3r::nozzle_diameter + $Slic3r::layer_height)) { + if ($flow_width >= ($Slic3r::nozzle_diameter + $self->layer_height)) { # rectangle with semicircles at the ends - $min_flow_spacing = $flow_width - $Slic3r::layer_height * (1 - PI/4); + $min_flow_spacing = $flow_width - $self->layer_height * (1 - PI/4); } else { # rectangle with shrunk semicircles at the ends $min_flow_spacing = $flow_width * (1 - PI/4) + $Slic3r::nozzle_diameter * PI/4;