mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-23 22:54:08 -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