diff --git a/lib/Slic3r/Config.pm b/lib/Slic3r/Config.pm index 514a45823d..256e6971c2 100644 --- a/lib/Slic3r/Config.pm +++ b/lib/Slic3r/Config.pm @@ -835,7 +835,9 @@ sub new_from_cli { sub merge { my $class = shift; - return $class->new(map %$_, @_); + my $config = $class->new; + $config->apply($_) for @_; + return $config; } sub load { diff --git a/lib/Slic3r/GUI/SkeinPanel.pm b/lib/Slic3r/GUI/SkeinPanel.pm index 5fbc8a2648..764f60a81f 100644 --- a/lib/Slic3r/GUI/SkeinPanel.pm +++ b/lib/Slic3r/GUI/SkeinPanel.pm @@ -232,16 +232,22 @@ sub config { # retrieve filament presets and build a single config object for them my $filament_config; - foreach my $preset_idx ($self->{plater}->filament_presets) { - my $preset = $self->{options_tabs}{filament}->get_preset($preset_idx); - my $config = $self->{options_tabs}{filament}->get_preset_config($preset); - if (!$filament_config) { - $filament_config = $config; - next; - } - foreach my $opt_key (keys %$config) { - next unless ref $filament_config->get($opt_key) eq 'ARRAY'; - push @{ $filament_config->get($opt_key) }, $config->get($opt_key)->[0]; + if ($self->{plater}->filament_presets == 1) { + $filament_config = $self->{options_tabs}{filament}->config; + } else { + # TODO: handle dirty presets. + # perhaps plater shouldn't expose dirty presets at all in multi-extruder environments. + foreach my $preset_idx ($self->{plater}->filament_presets) { + my $preset = $self->{options_tabs}{filament}->get_preset($preset_idx); + my $config = $self->{options_tabs}{filament}->get_preset_config($preset); + if (!$filament_config) { + $filament_config = $config; + next; + } + foreach my $opt_key (keys %$config) { + next unless ref $filament_config->get($opt_key) eq 'ARRAY'; + push @{ $filament_config->get($opt_key) }, $config->get($opt_key)->[0]; + } } } diff --git a/lib/Slic3r/GUI/Tab.pm b/lib/Slic3r/GUI/Tab.pm index 240963cddf..c0c7e52263 100644 --- a/lib/Slic3r/GUI/Tab.pm +++ b/lib/Slic3r/GUI/Tab.pm @@ -210,7 +210,8 @@ sub get_preset_config { } # apply preset values on top of defaults - $config->apply(Slic3r::Config->load($preset->{file})); + my $external_config = Slic3r::Config->load($preset->{file}); + $config->set($_, $external_config->get($_)) for @{$self->{options}}; } return $config;