mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-31 04:31:15 -06:00 
			
		
		
		
	Ported GCode::set_extruder() and OozePrevention
This commit is contained in:
		
							parent
							
								
									72355a9500
								
							
						
					
					
						commit
						a6f4c8e567
					
				
					 4 changed files with 101 additions and 86 deletions
				
			
		|  | @ -334,90 +334,4 @@ sub travel_to { | |||
|     return $gcode; | ||||
| } | ||||
| 
 | ||||
| sub set_extruder { | ||||
|     my ($self, $extruder_id) = @_; | ||||
|      | ||||
|     $self->placeholder_parser->set('current_extruder', $extruder_id); | ||||
|     return "" if !$self->writer->need_toolchange($extruder_id); | ||||
|      | ||||
|     # if we are running a single-extruder setup, just set the extruder and return nothing | ||||
|     if (!$self->writer->multiple_extruders) { | ||||
|         return $self->writer->toolchange($extruder_id); | ||||
|     } | ||||
|      | ||||
|     # prepend retraction on the current extruder | ||||
|     my $gcode = $self->retract(1); | ||||
|      | ||||
|     # append custom toolchange G-code | ||||
|     if (defined $self->writer->extruder && $self->config->toolchange_gcode) { | ||||
|         my $pp = $self->placeholder_parser->clone; | ||||
|         $pp->set('previous_extruder' => $self->writer->extruder->id); | ||||
|         $pp->set('next_extruder'     => $extruder_id); | ||||
|         $gcode .= sprintf "%s\n", $pp->process($self->config->toolchange_gcode); | ||||
|     } | ||||
|      | ||||
|     # if ooze prevention is enabled, park current extruder in the nearest | ||||
|     # standby point and set it to the standby temperature | ||||
|     $gcode .= $self->ooze_prevention->pre_toolchange($self) | ||||
|         if $self->ooze_prevention->enable && defined $self->writer->extruder; | ||||
|      | ||||
|     # append the toolchange command | ||||
|     $gcode .= $self->writer->toolchange($extruder_id); | ||||
|      | ||||
|     # set the new extruder to the operating temperature | ||||
|     $gcode .= $self->ooze_prevention->post_toolchange($self) | ||||
|         if $self->ooze_prevention->enable; | ||||
|      | ||||
|     return $gcode; | ||||
| } | ||||
| 
 | ||||
| package Slic3r::GCode::OozePrevention; | ||||
| use strict; | ||||
| use warnings; | ||||
| 
 | ||||
| use Slic3r::Geometry qw(scale); | ||||
| 
 | ||||
| sub pre_toolchange { | ||||
|     my ($self, $gcodegen) = @_; | ||||
|      | ||||
|     my $gcode = ""; | ||||
|      | ||||
|     # move to the nearest standby point | ||||
|     if (@{$self->standby_points}) { | ||||
|         # get current position in print coordinates | ||||
|         my $pos = Slic3r::Point->new_scale(@{$gcodegen->writer->get_position}[0,1]); | ||||
|          | ||||
|         my $standby_point = Slic3r::Pointf->new_unscale(@{$pos->nearest_point($self->standby_points)}); | ||||
|         # We don't call $gcodegen->travel_to() because we don't need retraction (it was already | ||||
|         # triggered by the caller) nor avoid_crossing_perimeters and also because the coordinates | ||||
|         # of the destination point must not be transformed by origin nor current extruder offset. | ||||
|         $gcode .= $gcodegen->writer->travel_to_xy($standby_point, 'move to standby position'); | ||||
|     } | ||||
|      | ||||
|     if ($gcodegen->config->standby_temperature_delta != 0) { | ||||
|         my $temp = $gcodegen->has_layer && $gcodegen->layer->id == 0 | ||||
|             ? $gcodegen->config->get_at('first_layer_temperature', $gcodegen->writer->extruder->id) | ||||
|             : $gcodegen->config->get_at('temperature', $gcodegen->writer->extruder->id); | ||||
|         # we assume that heating is always slower than cooling, so no need to block | ||||
|         $gcode .= $gcodegen->writer->set_temperature($temp + $gcodegen->config->standby_temperature_delta, 0); | ||||
|     } | ||||
|      | ||||
|     return $gcode; | ||||
| } | ||||
| 
 | ||||
| sub post_toolchange { | ||||
|     my ($self, $gcodegen) = @_; | ||||
|      | ||||
|     my $gcode = ""; | ||||
|      | ||||
|     if ($gcodegen->config->standby_temperature_delta != 0) { | ||||
|         my $temp = $gcodegen->has_layer && $gcodegen->layer->id == 0 | ||||
|             ? $gcodegen->config->get_at('first_layer_temperature', $gcodegen->writer->extruder->id) | ||||
|             : $gcodegen->config->get_at('temperature', $gcodegen->writer->extruder->id); | ||||
|         $gcode .= $gcodegen->writer->set_temperature($temp, 1); | ||||
|     } | ||||
|      | ||||
|     return $gcode; | ||||
| } | ||||
| 
 | ||||
| 1; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Alessandro Ranellucci
						Alessandro Ranellucci