mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-30 20:21:12 -06:00 
			
		
		
		
	New --cooling option and checkbox to enable/disable fan and cooling control
This commit is contained in:
		
							parent
							
								
									70e69be60a
								
							
						
					
					
						commit
						170d29a789
					
				
					 7 changed files with 33 additions and 24 deletions
				
			
		|  | @ -293,6 +293,11 @@ our $Options = { | |||
|     }, | ||||
|      | ||||
|     # cooling options | ||||
|     'cooling' => { | ||||
|         label   => 'Enable cooling', | ||||
|         cli     => 'cooling', | ||||
|         type    => 'bool', | ||||
|     }, | ||||
|     'min_fan_speed' => { | ||||
|         label   => 'Min fan speed (%)', | ||||
|         cli     => 'min-fan-speed=i', | ||||
|  |  | |||
|  | @ -158,8 +158,7 @@ sub extrude_path { | |||
|         } | ||||
|     } | ||||
|      | ||||
|     # TODO: optimize: avoid calculation if cooling is disabled | ||||
|     if (1) { | ||||
|     if ($Slic3r::cooling) { | ||||
|         $self->elapsed_time($self->elapsed_time + (unscale($path_length) / $self->speeds->{$self->last_speed} * 60)); | ||||
|     } | ||||
|      | ||||
|  |  | |||
|  | @ -49,7 +49,7 @@ sub new { | |||
|         }, | ||||
|         cooling => { | ||||
|             title => 'Cooling', | ||||
|             options => [qw(min_fan_speed max_fan_speed bridge_fan_speed fan_below_layer_time slowdown_below_layer_time min_print_speed disable_fan_first_layers)], | ||||
|             options => [qw(cooling min_fan_speed max_fan_speed bridge_fan_speed fan_below_layer_time slowdown_below_layer_time min_print_speed disable_fan_first_layers)], | ||||
|             label_width => 300, | ||||
|         }, | ||||
|         skirt => { | ||||
|  |  | |||
|  | @ -660,33 +660,35 @@ sub export_gcode { | |||
|         } | ||||
|         last if !$layer_gcode; | ||||
|          | ||||
|         my $layer_time = $extruder->elapsed_time; | ||||
|         my $fan_speed = 0; | ||||
|         my $speed_factor = 1; | ||||
|         Slic3r::debugf "Layer %d estimated printing time: %d seconds\n", $layer->id, $layer_time; | ||||
|         if ($layer_time < $Slic3r::fan_below_layer_time) { | ||||
|             if ($layer_time < $Slic3r::slowdown_below_layer_time) { | ||||
|                 $fan_speed = $Slic3r::max_fan_speed; | ||||
|                 $speed_factor = $layer_time / $Slic3r::slowdown_below_layer_time; | ||||
|             } else { | ||||
|                 $fan_speed = $Slic3r::max_fan_speed - ($Slic3r::max_fan_speed - $Slic3r::min_fan_speed) | ||||
|                     * ($layer_time - $Slic3r::slowdown_below_layer_time) | ||||
|                     / ($Slic3r::fan_below_layer_time - $Slic3r::slowdown_below_layer_time); #/ | ||||
|         if ($Slic3r::cooling) { | ||||
|             my $layer_time = $extruder->elapsed_time; | ||||
|             Slic3r::debugf "Layer %d estimated printing time: %d seconds\n", $layer->id, $layer_time; | ||||
|             if ($layer_time < $Slic3r::fan_below_layer_time) { | ||||
|                 if ($layer_time < $Slic3r::slowdown_below_layer_time) { | ||||
|                     $fan_speed = $Slic3r::max_fan_speed; | ||||
|                     $speed_factor = $layer_time / $Slic3r::slowdown_below_layer_time; | ||||
|                 } else { | ||||
|                     $fan_speed = $Slic3r::max_fan_speed - ($Slic3r::max_fan_speed - $Slic3r::min_fan_speed) | ||||
|                         * ($layer_time - $Slic3r::slowdown_below_layer_time) | ||||
|                         / ($Slic3r::fan_below_layer_time - $Slic3r::slowdown_below_layer_time); #/ | ||||
|                 } | ||||
|             } | ||||
|             Slic3r::debugf "  fan = %d%%, speed = %d%%\n", $fan_speed, $speed_factor * 100; | ||||
|              | ||||
|             if ($speed_factor < 1) { | ||||
|                 $layer_gcode =~ s/^(?=.*? [XY])(G1 .*?F)(\d+(?:\.\d+)?)/ | ||||
|                     my $new_speed = $2 * $speed_factor; | ||||
|                     $1 . sprintf("%.${dec}f", $new_speed < $min_print_speed ? $min_print_speed : $new_speed) | ||||
|                     /gexm; | ||||
|             } | ||||
|             $fan_speed = 0 if $layer->id < $Slic3r::disable_fan_first_layers; | ||||
|             $layer_gcode = $extruder->set_fan($fan_speed) . $layer_gcode; | ||||
|         } | ||||
|         Slic3r::debugf "  fan = %d%%, speed = %d%%\n", $fan_speed, $speed_factor * 100; | ||||
|          | ||||
|         if ($speed_factor < 1) { | ||||
|             $layer_gcode =~ s/^(?=.*? [XY])(G1 .*?F)(\d+(?:\.\d+)?)/ | ||||
|                 my $new_speed = $2 * $speed_factor; | ||||
|                 $1 . sprintf("%.${dec}f", $new_speed < $min_print_speed ? $min_print_speed : $new_speed) | ||||
|                 /gexm; | ||||
|         } | ||||
|         $fan_speed = 0 if $layer->id < $Slic3r::disable_fan_first_layers; | ||||
|         $layer_gcode = $extruder->set_fan($fan_speed) . $layer_gcode; | ||||
|          | ||||
|         # bridge fan speed | ||||
|         if ($Slic3r::bridge_fan_speed == 0 || $layer->id < $Slic3r::disable_fan_first_layers) { | ||||
|         if (!$Slic3r::cooling || $Slic3r::bridge_fan_speed == 0 || $layer->id < $Slic3r::disable_fan_first_layers) { | ||||
|             $layer_gcode =~ s/^_BRIDGE_FAN_(?:START|END)\n//gm; | ||||
|         } else { | ||||
|             $layer_gcode =~ s/^_BRIDGE_FAN_START\n/ $extruder->set_fan($Slic3r::bridge_fan_speed, 1) /gmex; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Alessandro Ranellucci
						Alessandro Ranellucci