mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-12 01:07:57 -06:00
Bugfix: crash when extending an array option by 2+ positions. #1908
This commit is contained in:
parent
f6e99f1467
commit
c3bb8a69db
4 changed files with 64 additions and 33 deletions
|
@ -733,27 +733,22 @@ sub build {
|
|||
sub _extruder_options { qw(nozzle_diameter extruder_offset retract_length retract_lift retract_speed retract_restart_extra retract_before_travel wipe
|
||||
retract_layer_change retract_length_toolchange retract_restart_extra_toolchange) }
|
||||
|
||||
sub config {
|
||||
my $self = shift;
|
||||
|
||||
my $config = $self->SUPER::config(@_);
|
||||
|
||||
# remove all unused values
|
||||
foreach my $opt_key ($self->_extruder_options) {
|
||||
my $values = $config->get($opt_key);
|
||||
splice @$values, $self->{extruders_count} if $self->{extruders_count} <= $#$values;
|
||||
$config->set($opt_key, $values);
|
||||
}
|
||||
|
||||
return $config;
|
||||
}
|
||||
|
||||
sub _build_extruder_pages {
|
||||
my $self = shift;
|
||||
|
||||
foreach my $extruder_idx (0 .. $self->{extruders_count}-1) {
|
||||
# build page if it doesn't exist
|
||||
$self->{extruder_pages}[$extruder_idx] ||= $self->add_options_page("Extruder " . ($extruder_idx + 1), 'funnel.png', optgroups => [
|
||||
my $default_config = Slic3r::Config::Full->new;
|
||||
|
||||
foreach my $extruder_idx (@{$self->{extruder_pages}} .. $self->{extruders_count}-1) {
|
||||
# extend options
|
||||
foreach my $opt_key ($self->_extruder_options) {
|
||||
my $values = $self->{config}->get($opt_key);
|
||||
$values->[$extruder_idx] = $default_config->get_at($opt_key, 0);
|
||||
$self->{config}->set($opt_key, $values)
|
||||
or die "Unable to extend $opt_key";
|
||||
}
|
||||
|
||||
# build page
|
||||
$self->{extruder_pages}[$extruder_idx] = $self->add_options_page("Extruder " . ($extruder_idx + 1), 'funnel.png', optgroups => [
|
||||
{
|
||||
title => 'Size',
|
||||
options => ['nozzle_diameter#' . $extruder_idx],
|
||||
|
@ -780,6 +775,19 @@ sub _build_extruder_pages {
|
|||
$self->{extruder_pages}[$extruder_idx]{disabled} = 0;
|
||||
}
|
||||
|
||||
# remove extra pages
|
||||
if ($self->{extruders_count} <= $#{$self->{extruder_pages}}) {
|
||||
splice @{$self->{extruder_pages}}, $self->{extruders_count};
|
||||
}
|
||||
|
||||
# remove extra config values
|
||||
foreach my $opt_key ($self->_extruder_options) {
|
||||
my $values = $self->{config}->get($opt_key);
|
||||
splice @$values, $self->{extruders_count} if $self->{extruders_count} <= $#$values;
|
||||
$self->{config}->set($opt_key, $values)
|
||||
or die "Unable to truncate $opt_key";
|
||||
}
|
||||
|
||||
# rebuild page list
|
||||
@{$self->{pages}} = (
|
||||
(grep $_->{title} !~ /^Extruder \d+/, @{$self->{pages}}),
|
||||
|
@ -793,14 +801,7 @@ sub on_value_change {
|
|||
$self->SUPER::on_value_change(@_);
|
||||
|
||||
if ($opt_key eq 'extruders_count') {
|
||||
# remove unused pages from list
|
||||
my @unused_pages = @{ $self->{extruder_pages} }[$self->{extruders_count} .. $#{$self->{extruder_pages}}];
|
||||
for my $page (@unused_pages) {
|
||||
@{$self->{pages}} = grep $_ ne $page, @{$self->{pages}};
|
||||
$page->{disabled} = 1;
|
||||
}
|
||||
|
||||
# add extra pages
|
||||
# add extra pages or remove unused
|
||||
$self->_build_extruder_pages;
|
||||
|
||||
# update page list and select first page (General)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue