~ubuntu-branches/ubuntu/utopic/slic3r/utopic

« back to all changes in this revision

Viewing changes to lib/Slic3r/GCode/CoolingBuffer.pm

  • Committer: Package Import Robot
  • Author(s): Chow Loong Jin
  • Date: 2014-06-17 01:27:26 UTC
  • Revision ID: package-import@ubuntu.com-20140617012726-2wrs4zdo251nr4vg
Tags: upstream-1.1.4+dfsg
ImportĀ upstreamĀ versionĀ 1.1.4+dfsg

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
package Slic3r::GCode::CoolingBuffer;
 
2
use Moo;
 
3
 
 
4
has 'config'    => (is => 'ro', required => 1);  # Slic3r::Config::Print
 
5
has 'gcodegen'  => (is => 'ro', required => 1);
 
6
has 'gcode'     => (is => 'rw', default => sub {""});
 
7
has 'elapsed_time' => (is => 'rw', default => sub {0});
 
8
has 'layer_id'  => (is => 'rw');
 
9
has 'last_z'    => (is => 'rw', default => sub { {} });  # obj_id => z (basically a 'last seen' table)
 
10
has 'min_print_speed' => (is => 'lazy');
 
11
 
 
12
sub _build_min_print_speed {
 
13
    my $self = shift;
 
14
    return 60 * $self->config->min_print_speed;
 
15
}
 
16
 
 
17
sub append {
 
18
    my $self = shift;
 
19
    my ($gcode, $obj_id, $layer_id, $print_z) = @_;
 
20
    
 
21
    my $return = "";
 
22
    if (exists $self->last_z->{$obj_id} && $self->last_z->{$obj_id} != $print_z) {
 
23
        $return = $self->flush;
 
24
    }
 
25
    
 
26
    $self->layer_id($layer_id);
 
27
    $self->last_z->{$obj_id} = $print_z;
 
28
    $self->gcode($self->gcode . $gcode);
 
29
    $self->elapsed_time($self->elapsed_time + $self->gcodegen->elapsed_time);
 
30
    $self->gcodegen->elapsed_time(0);
 
31
    
 
32
    return $return;
 
33
}
 
34
 
 
35
sub flush {
 
36
    my $self = shift;
 
37
    
 
38
    my $gcode = $self->gcode;
 
39
    my $elapsed = $self->elapsed_time;
 
40
    $self->gcode("");
 
41
    $self->elapsed_time(0);
 
42
    $self->last_z({});  # reset the whole table otherwise we would compute overlapping times
 
43
    
 
44
    my $fan_speed = $self->config->fan_always_on ? $self->config->min_fan_speed : 0;
 
45
    my $speed_factor = 1;
 
46
    if ($self->config->cooling) {
 
47
        Slic3r::debugf "Layer %d estimated printing time: %d seconds\n", $self->layer_id, $elapsed;
 
48
        if ($elapsed < $self->config->slowdown_below_layer_time) {
 
49
            $fan_speed = $self->config->max_fan_speed;
 
50
            $speed_factor = $elapsed / $self->config->slowdown_below_layer_time;
 
51
        } elsif ($elapsed < $self->config->fan_below_layer_time) {
 
52
            $fan_speed = $self->config->max_fan_speed - ($self->config->max_fan_speed - $self->config->min_fan_speed)
 
53
                * ($elapsed - $self->config->slowdown_below_layer_time)
 
54
                / ($self->config->fan_below_layer_time - $self->config->slowdown_below_layer_time); #/
 
55
        }
 
56
        Slic3r::debugf "  fan = %d%%, speed = %d%%\n", $fan_speed, $speed_factor * 100;
 
57
        
 
58
        if ($speed_factor < 1) {
 
59
            $gcode =~ s/^(?=.*? [XY])(?=.*? E)(?!;_WIPE)(?<!;_BRIDGE_FAN_START\n)(G1 .*?F)(\d+(?:\.\d+)?)/
 
60
                my $new_speed = $2 * $speed_factor;
 
61
                $1 . sprintf("%.3f", $new_speed < $self->min_print_speed ? $self->min_print_speed : $new_speed)
 
62
                /gexm;
 
63
        }
 
64
    }
 
65
    $fan_speed = 0 if $self->layer_id < $self->config->disable_fan_first_layers;
 
66
    $gcode = $self->gcodegen->set_fan($fan_speed) . $gcode;
 
67
    
 
68
    # bridge fan speed
 
69
    if (!$self->config->cooling || $self->config->bridge_fan_speed == 0 || $self->layer_id < $self->config->disable_fan_first_layers) {
 
70
        $gcode =~ s/^;_BRIDGE_FAN_(?:START|END)\n//gm;
 
71
    } else {
 
72
        $gcode =~ s/^;_BRIDGE_FAN_START\n/ $self->gcodegen->set_fan($self->config->bridge_fan_speed, 1) /gmex;
 
73
        $gcode =~ s/^;_BRIDGE_FAN_END\n/ $self->gcodegen->set_fan($fan_speed, 1) /gmex;
 
74
    }
 
75
    $gcode =~ s/;_WIPE//g;
 
76
    
 
77
    return $gcode;
 
78
}
 
79
 
 
80
1;