diff --git a/resources/profiles/BBL/machine/fdm_machine_common.json b/resources/profiles/BBL/machine/fdm_machine_common.json index 0073ac6a8a..566d3960ed 100644 --- a/resources/profiles/BBL/machine/fdm_machine_common.json +++ b/resources/profiles/BBL/machine/fdm_machine_common.json @@ -136,7 +136,7 @@ "60" ], "scan_first_layer": "0", - "enable_power_loss_recovery": "1", + "enable_power_loss_recovery": "printer_configuration", "silent_mode": "0", "single_extruder_multi_material": "1", "support_air_filtration": "0", diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 707dadd9f9..0e07e3fdb8 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -3084,10 +3084,11 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato m_sorted_layer_filaments.emplace_back(lt.extruders); } - // Orca: finish tracking power lost recovery + // Orca: disable power loss recovery if it was enabled earlier { - if (m_second_layer_things_done && print.config().enable_power_loss_recovery.value == true) { - file.write(m_writer.enable_power_loss_recovery(false)); + const auto plr_mode = print.config().enable_power_loss_recovery.value; + if (m_second_layer_things_done && plr_mode == PowerLossRecoveryMode::Enable) { + file.write(m_writer.enable_power_loss_recovery(PowerLossRecoveryMode::Disable)); } } ++ finished_objects; @@ -3165,9 +3166,9 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato m_sorted_layer_filaments.emplace_back(lt.extruders); } - // Orca: finish tracking power lost recovery - if (m_second_layer_things_done && print.config().enable_power_loss_recovery.value == true) { - file.write(m_writer.enable_power_loss_recovery(false)); + // Orca: disable power loss recovery + if (m_second_layer_things_done && print.config().enable_power_loss_recovery.value == PowerLossRecoveryMode::Enable) { + file.write(m_writer.enable_power_loss_recovery(PowerLossRecoveryMode::Disable)); } if (m_wipe_tower) // Purge the extruder, pull out the active filament. @@ -4381,10 +4382,9 @@ LayerResult GCode::process_layer( } if (!first_layer && !m_second_layer_things_done) { - // Orca: start tracking power lost recovery - if (print.config().enable_power_loss_recovery.value == true) { - gcode += m_writer.enable_power_loss_recovery(true); - } + // Orca: set power loss recovery + const auto plr_mode = print.config().enable_power_loss_recovery.value; + gcode += m_writer.enable_power_loss_recovery(plr_mode); if (print.is_BBL_printer()) { // BBS: open first layer inspection at second layer diff --git a/src/libslic3r/GCodeWriter.cpp b/src/libslic3r/GCodeWriter.cpp index f3d218750b..1008e5eab1 100644 --- a/src/libslic3r/GCodeWriter.cpp +++ b/src/libslic3r/GCodeWriter.cpp @@ -444,23 +444,28 @@ std::string GCodeWriter::reset_e(bool force) } } -std::string GCodeWriter::enable_power_loss_recovery(bool enable) +std::string GCodeWriter::enable_power_loss_recovery(PowerLossRecoveryMode mode) { std::ostringstream gcode; - + + if (mode == PowerLossRecoveryMode::PrinterConfiguration) + return std::string(); + + const bool enable = mode == PowerLossRecoveryMode::Enable; + if (m_is_bbl_printers) { - gcode << "; start tracking Power Loss Recovery https://wiki.bambulab.com/en/knowledge-sharing/power-loss-recovery\n"; - gcode << "M1003 S" << (enable ? "1" : "0") << "\n"; + gcode << "M1003 S" << (enable ? "1" : "0"); } else if (FLAVOR_IS(gcfMarlinFirmware)) { - gcode << "; start tracking Power-loss Recovery https://marlinfw.org/docs/gcode/M413.html\n"; - gcode << "M413 S" << (enable ? "1" : "0") << "\n"; + gcode << "M413 S" << (enable ? "1" : "0"); + } else { + return std::string(); } - + if (GCodeWriter::full_gcode_comment) gcode << " ; set Power-loss Recovery"; + gcode << "\n"; return gcode.str(); } - std::string GCodeWriter::update_progress(unsigned int num, unsigned int tot, bool allow_100) const { if (FLAVOR_IS_NOT(gcfMakerWare) && FLAVOR_IS_NOT(gcfSailfish)) diff --git a/src/libslic3r/GCodeWriter.hpp b/src/libslic3r/GCodeWriter.hpp index 32e737164d..dbc64694e2 100644 --- a/src/libslic3r/GCodeWriter.hpp +++ b/src/libslic3r/GCodeWriter.hpp @@ -61,7 +61,7 @@ public: std::string set_input_shaping(char axis, float damp, float freq, std::string type) const; std::string reset_e(bool force = false); std::string update_progress(unsigned int num, unsigned int tot, bool allow_100 = false) const; - std::string enable_power_loss_recovery(bool enable); + std::string enable_power_loss_recovery(PowerLossRecoveryMode mode); // return false if this extruder was already selected bool need_toolchange(unsigned int filament_id) const; std::string set_extruder(unsigned int filament_id); diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 054a57f797..7549eb821d 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -161,6 +161,14 @@ static t_config_enum_values s_keys_map_BedTempFormula { }; CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(BedTempFormula) +// Orca +static t_config_enum_values s_keys_map_PowerLossRecoveryMode { + { "printer_configuration", int(PowerLossRecoveryMode::PrinterConfiguration) }, + { "enable", int(PowerLossRecoveryMode::Enable) }, + { "disable", int(PowerLossRecoveryMode::Disable) } +}; +CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(PowerLossRecoveryMode) + static t_config_enum_values s_keys_map_FuzzySkinType { { "none", int(FuzzySkinType::None) }, { "external", int(FuzzySkinType::External) }, @@ -3376,11 +3384,18 @@ void PrintConfigDef::init_fff_params() def->set_default_value(new ConfigOptionBool(false)); // Orca - def = this->add("enable_power_loss_recovery", coBool); - def->label = L("Turn on Power Loss Recovery"); - def->tooltip = L("Enable this to insert power loss recovery commands in generated G-code.(Only for Bambu Lab printers and Marlin firmware based printers)"); + def = this->add("enable_power_loss_recovery", coEnum); + def->label = L("Power Loss Recovery"); + def->tooltip = L("Choose how to control power loss recovery. When set to Printer configuration, the slicer will not emit power loss recovery G-code and will leave the printer's configuration unchanged. Applicable to Bambu Lab or Marlin 2 firmware based printers."); def->mode = comAdvanced; - def->set_default_value(new ConfigOptionBool(false)); + def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); + def->enum_values.push_back("printer_configuration"); + def->enum_values.push_back("enable"); + def->enum_values.push_back("disable"); + def->enum_labels.push_back(L("Printer configuration")); + def->enum_labels.push_back(L("Enable")); + def->enum_labels.push_back(L("Disable")); + def->set_default_value(new ConfigOptionEnum(PowerLossRecoveryMode::PrinterConfiguration)); //BBS // def = this->add("spaghetti_detector", coBool); @@ -7442,6 +7457,13 @@ void PrintConfigDef::handle_legacy(t_config_option_key &opt_key, std::string &va else if (opt_key == "extruder_type") { ReplaceString(value, "DirectDrive", "Direct Drive"); } + else if (opt_key == "enable_power_loss_recovery") { + if (value == "1" || boost::iequals(value, "true")) { + value = "enable"; + } else if (value == "0" || boost::iequals(value, "false")) { + value = "disable"; + } + } else if(opt_key == "ensure_vertical_shell_thickness") { if(value == "1") { value = "ensure_all"; diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 1dac4b7057..998764f292 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -102,6 +102,13 @@ enum class BedTempFormula { count, }; +// Orca +enum class PowerLossRecoveryMode { + PrinterConfiguration, + Enable, + Disable, +}; + // BBS enum class WallSequence { InnerOuter, @@ -507,6 +514,7 @@ CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(PrintHostType) CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(AuthorizationType) CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(WipeTowerWallType) CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(PerimeterGeneratorType) +CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(PowerLossRecoveryMode) #undef CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS @@ -1272,7 +1280,7 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionIntsNullable, filament_flush_temp)) // BBS ((ConfigOptionBool, scan_first_layer)) - ((ConfigOptionBool, enable_power_loss_recovery)) + ((ConfigOptionEnum, enable_power_loss_recovery)) ((ConfigOptionBool, enable_wrapping_detection)) ((ConfigOptionInt, wrapping_detection_layers)) ((ConfigOptionPoints, wrapping_exclude_area))