mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-12 09:17:52 -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