From 0618c169824dd8bfb7efaf6d380e8855e0b71fdc Mon Sep 17 00:00:00 2001 From: tome9111991 <57866234+tome9111991@users.noreply.github.com> Date: Thu, 1 Jan 2026 14:48:06 +0100 Subject: [PATCH 1/3] Fix: Skip bed temperature command when "Other Layers" temperature is 0 in by-object print sequence Problem Description: When "Bed Temperature for Other Layers" is set to 0 (which should disable the feature), and "Print Sequence" is set to "by object", the bed temperature is incorrectly set to 0 (M140 S0) when printing the second object. This causes the bed to cool down during printing, which should not happen when the feature is disabled. Root Cause: In the code block that handles the transition from layer 1 to layer 2 (lines 4421-4429), the bed temperature for "Other Layers" was always set via m_writer.set_bed_temperature(), even when the temperature value was 0. A value of 0 should mean the feature is disabled and the temperature should not be changed (keeping the current first layer temperature). Solution: Added a check to only set the bed temperature if it's greater than 0, similar to how nozzle temperature is handled (line 4417). This ensures that when "Other Layers" bed temperature is set to 0, the temperature command is not emitted and the current bed temperature (from the first layer) is maintained. --- src/libslic3r/GCode.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 0e07e3fdb8..f6c69bde79 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -4424,6 +4424,8 @@ LayerResult GCode::process_layer( bed_temp = get_highest_bed_temperature(false,print); else bed_temp = get_bed_temperature(first_extruder_id, false, m_config.curr_bed_type); + // ORCA: Only set bed temperature if it's greater than 0 (0 means the feature is disabled) + if (bed_temp > 0) gcode += m_writer.set_bed_temperature(bed_temp); // Mark the temperature transition from 1st to 2nd layer to be finished. m_second_layer_things_done = true; From c83972e7632fcaa009f53ad67430f7f494c91331 Mon Sep 17 00:00:00 2001 From: tome9111991 <57866234+tome9111991@users.noreply.github.com> Date: Sat, 3 Jan 2026 12:12:52 +0100 Subject: [PATCH 2/3] Fix: Allow -1 for 'Other layers' bed temperature to disable G-code emission - Changed min value from 0 to -1 for all bed temperature options (Other layers) - Updated tooltips to explain that -1 skips setting the temperature - Updated logic in GCode::process_layer to skip M140 if temp is -1 - This addresses the issue where setting 0 (intended as 'no change') would incorrectly turn off the bed heater, especially in 'by object' print sequence. --- src/libslic3r/GCode.cpp | 4 ++-- src/libslic3r/PrintConfig.cpp | 30 ++++++++++++++++++------------ 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index f6c69bde79..cc9e8986d8 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -4424,8 +4424,8 @@ LayerResult GCode::process_layer( bed_temp = get_highest_bed_temperature(false,print); else bed_temp = get_bed_temperature(first_extruder_id, false, m_config.curr_bed_type); - // ORCA: Only set bed temperature if it's greater than 0 (0 means the feature is disabled) - if (bed_temp > 0) + // ORCA: Only set bed temperature if it's greater than or equal to 0 (-1 means the feature is disabled) + if (bed_temp >= 0) gcode += m_writer.set_bed_temperature(bed_temp); // Mark the temperature transition from 1st to 2nd layer to be finished. m_second_layer_things_done = true; diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 7549eb821d..908881b8c2 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -860,60 +860,66 @@ void PrintConfigDef::init_fff_params() def = this->add("supertack_plate_temp", coInts); def->label = L("Other layers"); def->tooltip = L("Bed temperature for layers except the initial one. " - "A value of 0 means the filament does not support printing on the Cool Plate SuperTack."); + "A value of 0 means the filament does not support printing on the Cool Plate SuperTack. " + "A value of -1 will skip setting the temperature for subsequent layers."); def->sidetext = L(u8"\u2103" /* °C */); // degrees Celsius, CIS languages need translation def->full_label = L("Bed temperature"); - def->min = 0; + def->min = -1; def->max = 120; def->set_default_value(new ConfigOptionInts{35}); def = this->add("cool_plate_temp", coInts); def->label = L("Other layers"); def->tooltip = L("Bed temperature for layers except the initial one. " - "A value of 0 means the filament does not support printing on the Cool Plate."); + "A value of 0 means the filament does not support printing on the Cool Plate. " + "A value of -1 will skip setting the temperature for subsequent layers."); def->sidetext = L(u8"\u2103" /* °C */); // degrees Celsius, CIS languages need translation def->full_label = L("Bed temperature"); - def->min = 0; + def->min = -1; def->max = 300; def->set_default_value(new ConfigOptionInts{ 35 }); def = this->add("textured_cool_plate_temp", coInts); def->label = L("Other layers"); def->tooltip = L("Bed temperature for layers except the initial one. " - "A value of 0 means the filament does not support printing on the Textured Cool Plate."); + "A value of 0 means the filament does not support printing on the Textured Cool Plate. " + "A value of -1 will skip setting the temperature for subsequent layers."); def->sidetext = L(u8"\u2103" /* °C */); // degrees Celsius, CIS languages need translation def->full_label = L("Bed temperature"); - def->min = 0; + def->min = -1; def->max = 300; def->set_default_value(new ConfigOptionInts{ 40 }); def = this->add("eng_plate_temp", coInts); def->label = L("Other layers"); def->tooltip = L("Bed temperature for layers except the initial one. " - "A value of 0 means the filament does not support printing on the Engineering Plate."); + "A value of 0 means the filament does not support printing on the Engineering Plate. " + "A value of -1 will skip setting the temperature for subsequent layers."); def->sidetext = L(u8"\u2103" /* °C */); // degrees Celsius, CIS languages need translation def->full_label = L("Bed temperature"); - def->min = 0; + def->min = -1; def->max = 300; def->set_default_value(new ConfigOptionInts{ 45 }); def = this->add("hot_plate_temp", coInts); def->label = L("Other layers"); def->tooltip = L("Bed temperature for layers except the initial one. " - "A value of 0 means the filament does not support printing on the High Temp Plate."); + "A value of 0 means the filament does not support printing on the High Temp Plate. " + "A value of -1 will skip setting the temperature for subsequent layers."); def->sidetext = L(u8"\u2103" /* °C */); // degrees Celsius, CIS languages need translation def->full_label = L("Bed temperature"); - def->min = 0; + def->min = -1; def->max = 300; def->set_default_value(new ConfigOptionInts{ 45 }); def = this->add("textured_plate_temp", coInts); def->label = L("Other layers"); def->tooltip = L("Bed temperature for layers except the initial one. " - "A value of 0 means the filament does not support printing on the Textured PEI Plate."); + "A value of 0 means the filament does not support printing on the Textured PEI Plate. " + "A value of -1 will skip setting the temperature for subsequent layers."); def->sidetext = L(u8"\u2103" /* °C */); // degrees Celsius, CIS languages need translation def->full_label = L("Bed temperature"); - def->min = 0; + def->min = -1; def->max = 300; def->set_default_value(new ConfigOptionInts{45}); From d34889c70f68475f497c21de26fd21c4ee8db6fe Mon Sep 17 00:00:00 2001 From: tome9111991 <57866234+tome9111991@users.noreply.github.com> Date: Sat, 3 Jan 2026 14:00:34 +0100 Subject: [PATCH 3/3] Fix GUI: Allow negative input in SpinInput widgets when min < 0 --- src/slic3r/GUI/Widgets/SpinInput.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/slic3r/GUI/Widgets/SpinInput.cpp b/src/slic3r/GUI/Widgets/SpinInput.cpp index ccd7a80447..32515692c0 100644 --- a/src/slic3r/GUI/Widgets/SpinInput.cpp +++ b/src/slic3r/GUI/Widgets/SpinInput.cpp @@ -135,6 +135,15 @@ void SpinInput::SetRange(int min, int max) { this->min = min; this->max = max; + if (text_ctrl) { + if (min < 0) { + wxTextValidator validator(wxFILTER_INCLUDE_CHAR_LIST); + validator.SetCharIncludes("0123456789-"); + text_ctrl->SetValidator(validator); + } else { + text_ctrl->SetValidator(wxTextValidator(wxFILTER_DIGITS)); + } + } } void SpinInput::DoSetToolTipText(wxString const &tip)