From fe8b904e7551cde83b1ead75922e9b60278b50ad Mon Sep 17 00:00:00 2001 From: "lane.wei" Date: Tue, 6 Aug 2024 16:31:32 +0800 Subject: [PATCH] ENH: config: add default_nozzle_volume_type in printer 1. also remove original nozzle_volume_type from printer and move into project config 2. support save nozzle_volume_type into appconfig and load from it at beginning or printer switch jira: no-jira Change-Id: I01fc82d142fc633fc59a238796a71b9f8d180efb --- src/libslic3r/AppConfig.cpp | 26 ++++++++++++++++++++++++ src/libslic3r/AppConfig.hpp | 8 ++++++-- src/libslic3r/Preset.cpp | 2 +- src/libslic3r/PresetBundle.cpp | 18 +++++++++++++++++ src/libslic3r/PrintConfig.cpp | 17 +++++++++++++--- src/slic3r/GUI/OptionsGroup.cpp | 8 ++++---- src/slic3r/GUI/OptionsGroup.hpp | 2 +- src/slic3r/GUI/Plater.cpp | 4 ++-- src/slic3r/GUI/Tab.cpp | 35 ++++++++++++++++++++++++++++++--- src/slic3r/GUI/Tab.hpp | 1 + 10 files changed, 105 insertions(+), 16 deletions(-) diff --git a/src/libslic3r/AppConfig.cpp b/src/libslic3r/AppConfig.cpp index 048b765da..e4f7f95cf 100644 --- a/src/libslic3r/AppConfig.cpp +++ b/src/libslic3r/AppConfig.cpp @@ -1268,6 +1268,32 @@ std::vector AppConfig::get_custom_color_from_config() return colors; } +void AppConfig::save_nozzle_volume_types_to_config(const std::string& printer_name, const std::string& nozzle_volume_types) +{ + if (!has_section("nozzle_volume_types")) { + std::map data; + data[printer_name] = nozzle_volume_types; + set_section("nozzle_volume_types", data); + } else { + auto data = get_section("nozzle_volume_types"); + auto data_modify = const_cast&>(data); + data_modify[printer_name] = nozzle_volume_types; + set_section("nozzle_volume_types", data_modify); + } +} + +std::string AppConfig::get_nozzle_volume_types_from_config(const std::string& printer_name) +{ + std::string nozzle_volume_types; + if (has_section("nozzle_volume_types")) { + auto data = get_section("nozzle_volume_types"); + if (data.find(printer_name) != data.end()) + nozzle_volume_types = data[printer_name]; + } + + return nozzle_volume_types; +} + void AppConfig::reset_selections() { auto it = m_storage.find("presets"); diff --git a/src/libslic3r/AppConfig.hpp b/src/libslic3r/AppConfig.hpp index d1dd4acba..f08e0f71e 100644 --- a/src/libslic3r/AppConfig.hpp +++ b/src/libslic3r/AppConfig.hpp @@ -71,7 +71,7 @@ public: if (it == m_storage.end()) return false; auto it2 = it->second.find(key); - if (it2 == it->second.end()) + if (it2 == it->second.end()) return false; value = it2->second; return true; @@ -203,6 +203,10 @@ public: void save_custom_color_to_config(const std::vector &colors); std::vector get_custom_color_from_config(); + + void save_nozzle_volume_types_to_config(const std::string& printer_name, const std::string& nozzle_volume_types); + std::string get_nozzle_volume_types_from_config(const std::string& printer_name); + // reset the current print / filament / printer selections, so that // the PresetBundle::load_selections(const AppConfig &config) call will select // the first non-default preset when called. @@ -252,7 +256,7 @@ public: private: template - bool get_3dmouse_device_numeric_value(const std::string &device_name, const char *parameter_name, T &out) const + bool get_3dmouse_device_numeric_value(const std::string &device_name, const char *parameter_name, T &out) const { std::string key = std::string("mouse_device:") + device_name; auto it = m_storage.find(key); diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index ecc850929..f871d5046 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -944,7 +944,7 @@ static std::vector s_Preset_printer_options { "printer_technology", "printable_area", "bed_exclude_area","bed_custom_texture", "bed_custom_model", "gcode_flavor", "single_extruder_multi_material", "machine_start_gcode", "machine_end_gcode","printing_by_object_gcode","before_layer_change_gcode", "layer_change_gcode", "time_lapse_gcode", "change_filament_gcode", - "printer_model", "printer_variant", "printer_extruder_id", "printer_extruder_variant", "extruder_variant_list", "nozzle_volume_type", + "printer_model", "printer_variant", "printer_extruder_id", "printer_extruder_variant", "extruder_variant_list", "default_nozzle_volume_type", "printable_height", "extruder_clearance_radius", "extruder_clearance_max_radius","extruder_clearance_height_to_lid", "extruder_clearance_height_to_rod", "nozzle_height", "default_print_profile", "inherits", diff --git a/src/libslic3r/PresetBundle.cpp b/src/libslic3r/PresetBundle.cpp index 89d6d2bef..a7e143eb5 100644 --- a/src/libslic3r/PresetBundle.cpp +++ b/src/libslic3r/PresetBundle.cpp @@ -41,6 +41,7 @@ static std::vector s_project_options { "wipe_tower_rotation_angle", "curr_bed_type", "flush_multiplier", + "nozzle_volume_type" }; //BBS: add BBL as default @@ -1674,6 +1675,23 @@ void PresetBundle::load_selections(AppConfig &config, const PresetPreferences& p } } + const Preset& current_printer = printers.get_selected_preset(); + const Preset* base_printer = printers.get_preset_base(current_printer); + bool use_default_nozzle_volume_type = true; + if (base_printer) { + std::string prev_nozzle_volume_type = config.get_nozzle_volume_types_from_config(base_printer->name); + if (!prev_nozzle_volume_type.empty()) { + ConfigOptionEnumsGeneric* nozzle_volume_type_option = project_config.option("nozzle_volume_type"); + if (nozzle_volume_type_option->deserialize(prev_nozzle_volume_type)) { + use_default_nozzle_volume_type = false; + } + } + } + + if (use_default_nozzle_volume_type) { + project_config.option("nozzle_volume_type")->values = current_printer.config.option("default_nozzle_volume_type")->values; + } + // Parse the initial physical printer name. std::string initial_physical_printer_name = remove_ini_suffix(config.get("presets", "physical_printer")); diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index aed1ed066..6414aac9b 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -3078,7 +3078,18 @@ void PrintConfigDef::init_fff_params() def->enum_values.push_back("Big Traffic"); def->enum_labels.push_back(L("Normal")); def->enum_labels.push_back(L("Big Traffic")); - def->mode = comAdvanced; + def->mode = comSimple; + def->set_default_value(new ConfigOptionEnumsGeneric{ NozzleVolumeType::nvtNormal }); + + def = this->add("default_nozzle_volume_type", coEnums); + def->label = L("Default Nozzle Volume Type"); + def->tooltip = ("Default Nozzle volume type for extruders in this printer"); + def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); + def->enum_values.push_back("Normal"); + def->enum_values.push_back("Big Traffic"); + def->enum_labels.push_back(L("Normal")); + def->enum_labels.push_back(L("Big Traffic")); + def->mode = comDevelop; def->set_default_value(new ConfigOptionEnumsGeneric{ NozzleVolumeType::nvtNormal }); def = this->add("extruder_variant_list", coStrings); @@ -4265,7 +4276,7 @@ void PrintConfigDef::init_extruder_option_keys() { // ConfigOptionFloats, ConfigOptionPercents, ConfigOptionBools, ConfigOptionStrings m_extruder_option_keys = { - "extruder_type", "nozzle_diameter", "nozzle_volume_type", "min_layer_height", "max_layer_height", "extruder_offset", + "extruder_type", "nozzle_diameter", "default_nozzle_volume_type", "min_layer_height", "max_layer_height", "extruder_offset", "retraction_length", "z_hop", "z_hop_types", "retraction_speed", "retract_lift_above", "retract_lift_below","deretraction_speed", "retract_before_wipe", "retract_restart_extra", "retraction_minimum_travel", "wipe", "wipe_distance", "retract_when_changing_layer", "retract_length_toolchange", "retract_restart_extra_toolchange", "extruder_colour", @@ -5143,7 +5154,7 @@ std::set filament_options_with_variant = { std::set printer_extruder_options = { "extruder_type", "nozzle_diameter", - "nozzle_volume_type", + "default_nozzle_volume_type", "min_layer_height", "max_layer_height" }; diff --git a/src/slic3r/GUI/OptionsGroup.cpp b/src/slic3r/GUI/OptionsGroup.cpp index 546c6a707..1fed4af41 100644 --- a/src/slic3r/GUI/OptionsGroup.cpp +++ b/src/slic3r/GUI/OptionsGroup.cpp @@ -24,7 +24,7 @@ namespace Slic3r { namespace GUI { constexpr int titleWidth = 20; // get the param index of cur_exturder -int get_extruder_idx(const DynamicPrintConfig& config, const std::string &opt_key, int cur_extruder_id) +int get_extruder_idx(const DynamicPrintConfig& config, const std::string &opt_key, int cur_extruder_id, NozzleVolumeType nozzle_volume_type) { if (printer_extruder_options.find(opt_key) != printer_extruder_options.end()) { return cur_extruder_id; @@ -37,13 +37,13 @@ int get_extruder_idx(const DynamicPrintConfig& config, const std::string &opt_ke assert(cur_extruder_id < extruder_count); const DynamicPrintConfig& cur_printer_config = wxGetApp().preset_bundle->printers.get_selected_preset().config; auto opt_extruder_type = dynamic_cast(cur_printer_config.option("extruder_type")); - auto opt_nozzle_volume_type = dynamic_cast(cur_printer_config.option("nozzle_volume_type")); + //auto opt_nozzle_volume_type = dynamic_cast(cur_printer_config.option("default_nozzle_volume_type")); - if (!opt_extruder_type || !opt_nozzle_volume_type) + if (!opt_extruder_type) return 0; ExtruderType extruder_type = (ExtruderType) (opt_extruder_type->get_at(cur_extruder_id)); - NozzleVolumeType nozzle_volume_type = (NozzleVolumeType) (opt_nozzle_volume_type->get_at(cur_extruder_id)); + //NozzleVolumeType nozzle_volume_type = (NozzleVolumeType) (opt_nozzle_volume_type->get_at(cur_extruder_id)); std::string id_name, variant_name; unsigned int stride = 1; diff --git a/src/slic3r/GUI/OptionsGroup.hpp b/src/slic3r/GUI/OptionsGroup.hpp index f1858e8ef..0c94e46df 100644 --- a/src/slic3r/GUI/OptionsGroup.hpp +++ b/src/slic3r/GUI/OptionsGroup.hpp @@ -24,7 +24,7 @@ namespace Slic3r { namespace GUI { -extern int get_extruder_idx(const DynamicPrintConfig& config, const std::string &opt_key, int cur_extruder_id); +extern int get_extruder_idx(const DynamicPrintConfig& config, const std::string &opt_key, int cur_extruder_id, NozzleVolumeType nozzle_volume_type); // Thrown if the building of a parameter page is canceled. class UIBuildCanceled : public std::exception {}; diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index f129a550e..dbe1dc6b2 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1529,8 +1529,8 @@ void Sidebar::update_presets(Preset::Type preset_type) if (extruder_variants->size() == 2) { auto extruders_def = printer_preset.config.def()->get("extruder_type"); auto extruders = printer_preset.config.option("extruder_type"); - auto nozzle_volumes_def = printer_preset.config.def()->get("nozzle_volume_type"); - auto nozzle_volumes = printer_preset.config.option("nozzle_volume_type"); + auto nozzle_volumes_def = wxGetApp().preset_bundle->project_config.def()->get("nozzle_volume_type"); + auto nozzle_volumes = wxGetApp().preset_bundle->project_config.option("nozzle_volume_type"); auto update_extruder_variant = [extruders_def, extruders, nozzle_volumes_def, nozzle_volumes, extruder_variants](ComboBox &box, int index) { box.Clear(); auto extruder = extruders_def->enum_labels[extruders->values[index]]; diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 79b80ea2c..fefe8e66e 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -4160,6 +4160,27 @@ void TabPrinter::build_unregular_pages(bool from_initial_build/* = false*/) void TabPrinter::on_preset_loaded() { // BBS + //update nozzle_volume_type + const Preset& current_printer = m_preset_bundle->printers.get_selected_preset(); + const Preset* base_printer = m_preset_bundle->printers.get_preset_base(current_printer); + if (!base_printer) + base_printer = ¤t_printer; + std::string base_name = base_printer->name; + if (base_name != m_base_preset_name) { + bool use_default_nozzle_volume_type = true; + m_base_preset_name = base_name; + std::string prev_nozzle_volume_type = wxGetApp().app_config->get_nozzle_volume_types_from_config(base_name); + if (!prev_nozzle_volume_type.empty()) { + ConfigOptionEnumsGeneric* nozzle_volume_type_option = m_preset_bundle->project_config.option("nozzle_volume_type"); + if (nozzle_volume_type_option->deserialize(prev_nozzle_volume_type)) { + use_default_nozzle_volume_type = false; + } + } + if (use_default_nozzle_volume_type) { + m_preset_bundle->project_config.option("nozzle_volume_type")->values = current_printer.config.option("default_nozzle_volume_type")->values; + } + } + // update the extruders count field auto *nozzle_diameter = dynamic_cast(m_config->option("nozzle_diameter")); size_t extruders_count = nozzle_diameter->values.size(); @@ -5702,11 +5723,19 @@ wxSizer* Tab::compatible_widget_create(wxWindow* parent, PresetDependencies &dep void TabPrinter::set_extruder_volume_type(int extruder_id, NozzleVolumeType type) { - auto nozzle_volumes = m_config->option("nozzle_volume_type"); + auto nozzle_volumes = m_preset_bundle->project_config.option("nozzle_volume_type"); assert(nozzle_volumes->values.size() > (size_t)extruder_id); nozzle_volumes->values[extruder_id] = type; on_value_change((boost::format("nozzle_volume_type#%1%") % extruder_id).str(), int(type)); update_dirty(); + + //save to app config + if (!m_base_preset_name.empty()) { + ConfigOptionEnumsGeneric* nozzle_volume_type_option = m_preset_bundle->project_config.option("nozzle_volume_type"); + std::string nozzle_volume_type_str = nozzle_volume_type_option->serialize(); + wxGetApp().app_config->save_nozzle_volume_types_to_config(m_base_preset_name, nozzle_volume_type_str); + } + } // Return a callback to create a TabPrinter widget to edit bed shape @@ -5856,7 +5885,7 @@ void Tab::update_extruder_variants(int extruder_id, bool reload) BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << extruder_id; if (m_extruder_switch) { Preset &printer_preset = wxGetApp().preset_bundle->printers.get_edited_preset(); - auto nozzle_volumes = printer_preset.config.option("nozzle_volume_type"); + auto nozzle_volumes = wxGetApp().preset_bundle->project_config.option("nozzle_volume_type"); if (nozzle_volumes->size() == 2) { auto nozzle_volumes_def = printer_preset.config.def()->get("nozzle_volume_type"); wxString left, right; @@ -5894,7 +5923,7 @@ void Tab::update_extruder_variants(int extruder_id, bool reload) void Tab::switch_excluder(int extruder_id, bool reload) { Preset & printer_preset = wxGetApp().preset_bundle->printers.get_edited_preset(); - auto nozzle_volumes = printer_preset.config.option("nozzle_volume_type"); + auto nozzle_volumes = wxGetApp().preset_bundle->project_config.option("nozzle_volume_type"); auto extruders = printer_preset.config.option("extruder_type"); std::pair variant_keys[]{ {}, {"print_extruder_id", "print_extruder_variant"}, // Preset::TYPE_PRINT diff --git a/src/slic3r/GUI/Tab.hpp b/src/slic3r/GUI/Tab.hpp index b77e9280a..06d4fabd4 100644 --- a/src/slic3r/GUI/Tab.hpp +++ b/src/slic3r/GUI/Tab.hpp @@ -602,6 +602,7 @@ public: size_t m_initial_extruders_count; size_t m_sys_extruders_count; size_t m_cache_extruder_count = 0; + std::string m_base_preset_name; PrinterTechnology m_printer_technology = ptFFF;