mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-31 04:31:15 -06:00 
			
		
		
		
	New experimental autospeed feature. #2810
This commit is contained in:
		
							parent
							
								
									6e280ab8cb
								
							
						
					
					
						commit
						7f70da97b4
					
				
					 12 changed files with 165 additions and 9 deletions
				
			
		|  | @ -27,6 +27,7 @@ has '_seam_position'     => (is => 'ro', default => sub { {} });  # $object => p | |||
| has 'first_layer'        => (is => 'rw', default => sub {0});   # this flag triggers first layer speeds | ||||
| has 'elapsed_time'       => (is => 'rw', default => sub {0} );  # seconds | ||||
| has 'last_pos'           => (is => 'rw', default => sub { Slic3r::Point->new(0,0) } ); | ||||
| has 'volumetric_speed'   => (is => 'rw', default => sub {0}); | ||||
| 
 | ||||
| sub apply_print_config { | ||||
|     my ($self, $print_config) = @_; | ||||
|  | @ -298,11 +299,13 @@ sub _extrude_path { | |||
|             die "Invalid speed"; | ||||
|         } | ||||
|     } | ||||
|     my $F = $speed * 60;  # convert mm/sec to mm/min | ||||
|      | ||||
|     if ($self->first_layer) { | ||||
|         $F = $self->config->get_abs_value_over('first_layer_speed', $F/60) * 60; | ||||
|         $speed = $self->config->get_abs_value_over('first_layer_speed', $speed); | ||||
|     } | ||||
|     if ($self->volumetric_speed != 0) { | ||||
|         $speed ||= $self->volumetric_speed / $path->mm3_per_mm; | ||||
|     } | ||||
|     my $F = $speed * 60;  # convert mm/sec to mm/min | ||||
|      | ||||
|     # extrude arc or line | ||||
|     $gcode .= ";_BRIDGE_FAN_START\n" if $path->is_bridge && $self->enable_cooling_markers; | ||||
|  |  | |||
|  | @ -450,6 +450,7 @@ sub build { | |||
|         infill_every_layers infill_only_where_needed | ||||
|         solid_infill_every_layers fill_angle solid_infill_below_area  | ||||
|         only_retract_when_crossing_perimeters infill_first | ||||
|         max_print_speed max_volumetric_speed | ||||
|         perimeter_speed small_perimeter_speed external_perimeter_speed infill_speed  | ||||
|         solid_infill_speed top_solid_infill_speed support_material_speed  | ||||
|         support_material_interface_speed bridge_speed gap_fill_speed | ||||
|  | @ -607,6 +608,11 @@ sub build { | |||
|             $optgroup->append_single_option_line('first_layer_acceleration'); | ||||
|             $optgroup->append_single_option_line('default_acceleration'); | ||||
|         } | ||||
|         { | ||||
|             my $optgroup = $page->new_optgroup('Autospeed (advanced)'); | ||||
|             $optgroup->append_single_option_line('max_print_speed'); | ||||
|             $optgroup->append_single_option_line('max_volumetric_speed'); | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     { | ||||
|  |  | |||
|  | @ -15,7 +15,7 @@ has '_brim_done'                     => (is => 'rw'); | |||
| has '_second_layer_things_done'      => (is => 'rw'); | ||||
| has '_last_obj_copy'                 => (is => 'rw'); | ||||
| 
 | ||||
| use List::Util qw(first sum); | ||||
| use List::Util qw(first sum min max); | ||||
| use Slic3r::Flow ':roles'; | ||||
| use Slic3r::Geometry qw(X Y scale unscale chained_path convex_hull); | ||||
| use Slic3r::Geometry::Clipper qw(JT_SQUARE union_ex offset); | ||||
|  | @ -40,9 +40,60 @@ sub BUILD { | |||
|             layer_count         => $layer_count, | ||||
|             enable_cooling_markers => 1, | ||||
|         ); | ||||
|         $self->_gcodegen($gcodegen); | ||||
|         $gcodegen->apply_print_config($self->config); | ||||
|         $gcodegen->set_extruders($self->print->extruders); | ||||
|         $self->_gcodegen($gcodegen); | ||||
|          | ||||
|         # initialize autospeed | ||||
|         { | ||||
|             # get the minimum cross-section used in the print | ||||
|             my @mm3_per_mm = (); | ||||
|             foreach my $object (@{$self->print->objects}) { | ||||
|                 foreach my $region_id (0..$#{$self->print->regions}) { | ||||
|                     my $region = $self->print->get_region($region_id); | ||||
|                     foreach my $layer (@{$object->layers}) { | ||||
|                         my $layerm = $layer->get_region($region_id); | ||||
|                         if ($region->config->get_abs_value('perimeter_speed') == 0 | ||||
|                             || $region->config->get_abs_value('small_perimeter_speed') == 0 | ||||
|                             || $region->config->get_abs_value('external_perimeter_speed') == 0 | ||||
|                             || $region->config->get_abs_value('bridge_speed') == 0) { | ||||
|                             push @mm3_per_mm, $layerm->perimeters->min_mm3_per_mm; | ||||
|                         } | ||||
|                         if ($region->config->get_abs_value('infill_speed') == 0 | ||||
|                             || $region->config->get_abs_value('solid_infill_speed') == 0 | ||||
|                             || $region->config->get_abs_value('top_solid_infill_speed') == 0 | ||||
|                             || $region->config->get_abs_value('bridge_speed') == 0) { | ||||
|                             push @mm3_per_mm, $layerm->fills->min_mm3_per_mm; | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|                 if ($object->config->get_abs_value('support_material_speed') == 0 | ||||
|                     || $object->config->get_abs_value('support_material_interface_speed') == 0) { | ||||
|                     foreach my $layer (@{$object->support_layers}) { | ||||
|                         push @mm3_per_mm, $layer->support_fills->min_mm3_per_mm; | ||||
|                         push @mm3_per_mm, $layer->support_interface_fills->min_mm3_per_mm; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             my $min_mm3_per_mm = min(@mm3_per_mm); | ||||
|             if ($min_mm3_per_mm > 0) { | ||||
|                 # In order to honor max_print_speed we need to find a target volumetric | ||||
|                 # speed that we can use throughout the print. So we define this target  | ||||
|                 # volumetric speed as the volumetric speed produced by printing the  | ||||
|                 # smallest cross-section at the maximum speed: any larger cross-section | ||||
|                 # will need slower feedrates. | ||||
|                 my $volumetric_speed = $min_mm3_per_mm * $self->config->max_print_speed; | ||||
|                  | ||||
|                 # limit such volumetric speed with max_volumetric_speed if set | ||||
|                 if ($self->config->max_volumetric_speed > 0) { | ||||
|                     $volumetric_speed = min( | ||||
|                         $volumetric_speed, | ||||
|                         $self->config->max_volumetric_speed, | ||||
|                     ); | ||||
|                 } | ||||
|                 $gcodegen->volumetric_speed($volumetric_speed); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     $self->_cooling_buffer(Slic3r::GCode::CoolingBuffer->new( | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Alessandro Ranellucci
						Alessandro Ranellucci