From 536514ff03fadec4fa92776f3fb81e0e9cec17ef Mon Sep 17 00:00:00 2001 From: YuSanka Date: Wed, 15 Jan 2020 09:33:19 +0100 Subject: [PATCH] Added default filament(resin) in wizard for selected printers Added default_materials field to "Vendor".ini --- resources/profiles/Creality.ini | 1 + resources/profiles/PrusaResearch.ini | 12 +++ src/slic3r/GUI/ConfigWizard.cpp | 106 +++++++++++++++++++++++- src/slic3r/GUI/ConfigWizard_private.hpp | 13 ++- 4 files changed, 128 insertions(+), 4 deletions(-) diff --git a/resources/profiles/Creality.ini b/resources/profiles/Creality.ini index 4ebf99d328..eba85fef17 100644 --- a/resources/profiles/Creality.ini +++ b/resources/profiles/Creality.ini @@ -18,6 +18,7 @@ config_update_url = http://files.prusa3d.com/wp-content/uploads/repository/Prusa name = Creality Ender-3 variants = 0.4 technology = FFF +default_materials = Creality PLA @ENDER3; Prusament PLA @ENDER3 # All presets starting with asterisk, for example *common*, are intermediate and they will # not make it into the user interface. diff --git a/resources/profiles/PrusaResearch.ini b/resources/profiles/PrusaResearch.ini index 746aaf9668..a2dfc49139 100644 --- a/resources/profiles/PrusaResearch.ini +++ b/resources/profiles/PrusaResearch.ini @@ -22,72 +22,84 @@ name = Original Prusa MINI variants = 0.4; 0.25; 0.6 technology = FFF family = MINI +default_materials = Prusament PLA; Prusament PETG @MINI [printer_model:MK3S] name = Original Prusa i3 MK3S variants = 0.4; 0.25; 0.6 technology = FFF family = MK3 +default_materials = Prusament PLA; Prusament PETG [printer_model:MK3] name = Original Prusa i3 MK3 variants = 0.4; 0.25; 0.6 technology = FFF family = MK3 +default_materials = Prusament PLA; Prusament PETG [printer_model:MK3SMMU2S] name = Original Prusa i3 MK3S MMU2S variants = 0.4; 0.25; 0.6 technology = FFF family = MK3 +default_materials = Prusament PLA @MMU2; Prusament PETG @MMU2 [printer_model:MK3MMU2] name = Original Prusa i3 MK3 MMU2 variants = 0.4; 0.25; 0.6 technology = FFF family = MK3 +default_materials = Prusament PLA @MMU2; Prusament PETG @MMU2 [printer_model:MK2.5S] name = Original Prusa i3 MK2.5S variants = 0.4; 0.25; 0.6 technology = FFF family = MK2.5 +default_materials = Prusament PLA; Prusament PETG [printer_model:MK2.5] name = Original Prusa i3 MK2.5 variants = 0.4; 0.25; 0.6 technology = FFF family = MK2.5 +default_materials = Prusament PLA; Prusament PETG [printer_model:MK2.5SMMU2S] name = Original Prusa i3 MK2.5S MMU2S variants = 0.4; 0.25; 0.6 technology = FFF family = MK2.5 +default_materials = Prusament PLA @MMU2; Prusament PETG @MMU2 [printer_model:MK2.5MMU2] name = Original Prusa i3 MK2.5 MMU2 variants = 0.4; 0.25; 0.6 technology = FFF family = MK2.5 +default_materials = Prusament PLA @MMU2; Prusament PETG @MMU2 [printer_model:MK2S] name = Original Prusa i3 MK2S variants = 0.4; 0.25; 0.6 technology = FFF family = MK2 +default_materials = Prusament PLA; Prusament PETG [printer_model:MK2SMM] name = Original Prusa i3 MK2S MMU1 variants = 0.4; 0.6 technology = FFF family = MK2 +default_materials = Prusament PLA; Prusament PETG @MMU1 [printer_model:SL1] name = Original Prusa SL1 variants = default technology = SLA family = SL1 +default_materials = Prusa Transparent Tough @0.05 # All presets starting with asterisk, for example *common*, are intermediate and they will # not make it into the user interface. diff --git a/src/slic3r/GUI/ConfigWizard.cpp b/src/slic3r/GUI/ConfigWizard.cpp index 8a4b28d3a4..add680a40f 100644 --- a/src/slic3r/GUI/ConfigWizard.cpp +++ b/src/slic3r/GUI/ConfigWizard.cpp @@ -350,6 +350,21 @@ bool PrinterPicker::any_selected() const return false; } +std::set PrinterPicker::get_selected_models() const +{ + std::set ret_set; + + for (const auto& cb : cboxes) + if (cb->GetValue()) + ret_set.emplace(cb->model); + + for (const auto& cb : cboxes_alt) + if (cb->GetValue()) + ret_set.emplace(cb->model); + + return ret_set; +} + void PrinterPicker::on_checkbox(const Checkbox *cbox, bool checked) { PrinterPickerEvent evt(EVT_PRINTER_PICK, GetId(), vendor_id, cbox->model, cbox->variant, checked); @@ -500,6 +515,19 @@ bool PagePrinters::any_selected() const return false; } +std::set PagePrinters::get_selected_models() +{ + std::set ret_set; + + for (const auto *picker : printer_pickers) + { + std::set tmp_models = picker->get_selected_models(); + ret_set.insert(tmp_models.begin(), tmp_models.end()); + } + + return ret_set; +} + void PagePrinters::set_run_reason(ConfigWizard::RunReason run_reason) { if (technology == T_FFF @@ -1600,6 +1628,10 @@ void ConfigWizard::priv::on_printer_pick(PagePrinters *page, const PrinterPicker preset.is_visible = evt.enable; } } + + // if at list one printer is selected but there in no one selected material, + // select materials which is default for selected printer(s) + select_default_materials_if_needed(pair.second.vendor_profile, page->technology, evt.model_id); } if (page->technology & T_FFF) { @@ -1609,6 +1641,57 @@ void ConfigWizard::priv::on_printer_pick(PagePrinters *page, const PrinterPicker } } +void ConfigWizard::priv::select_default_materials_for_printer_model(const std::vector& models, Technology technology, const std::string& model_id) +{ + PageMaterials* page_materials = technology & T_FFF ? page_filaments : page_sla_materials; + + auto it = std::find_if(models.begin(), models.end(), [model_id](VendorProfile::PrinterModel model) {return model_id == model.id; }); + if (it != models.end()) + for (const std::string& material : it->default_materials) + appconfig_new.set(page_materials->materials->appconfig_section(), material, "1"); +} + +void ConfigWizard::priv::select_default_materials_if_needed(VendorProfile* vendor_profile, Technology technology, const std::string& model_id) +{ + if ((technology & T_FFF && !any_fff_selected) || + (technology & T_SLA && !any_sla_selected) || + check_materials_in_config(technology, false)) + return; + + select_default_materials_for_printer_model(vendor_profile->models, technology, model_id); +} + +void ConfigWizard::priv::selected_default_materials(Technology technology) +{ + auto select_default_materials_for_printer_page = [this](PagePrinters * page_printers, Technology technology) + { + std::set selected_models = page_printers->get_selected_models(); + const std::string vendor_id = page_printers->get_vendor_id(); + + for (auto& pair : bundles) + { + if (pair.first != vendor_id) + continue; + + for (const std::string& model_id : selected_models) + select_default_materials_for_printer_model(pair.second.vendor_profile->models, technology, model_id); + } + }; + + PagePrinters* page_printers = technology & T_FFF ? page_fff : page_msla; + select_default_materials_for_printer_page(page_printers, technology); + + for (const auto& printer : pages_3rdparty) + { + page_printers = technology & T_FFF ? printer.second.first : printer.second.second; + if (page_printers) + select_default_materials_for_printer_page(page_printers, technology); + } + + update_materials(technology); + (technology& T_FFF ? page_filaments : page_sla_materials)->reload_presets(); +} + void ConfigWizard::priv::on_3rdparty_install(const VendorProfile *vendor, bool install) { auto it = pages_3rdparty.find(vendor->id); @@ -1645,7 +1728,7 @@ bool ConfigWizard::priv::on_bnt_finish() return check_materials_in_config(T_ANY); } -bool ConfigWizard::priv::check_materials_in_config(Technology technology) +bool ConfigWizard::priv::check_materials_in_config(Technology technology, bool show_info_msg) { const auto exist_preset = [this](const std::string& section, const Materials& materials) { @@ -1660,15 +1743,32 @@ bool ConfigWizard::priv::check_materials_in_config(Technology technology) return false; }; + const auto ask_and_selected_default_materials = [this](wxString message, Technology technology) + { + wxMessageDialog msg(q, message, _(L("Notice")), wxYES_NO); + if (msg.ShowModal() == wxID_YES) + selected_default_materials(technology); + }; + if (any_fff_selected && technology & T_FFF && !exist_preset(AppConfig::SECTION_FILAMENTS, filaments)) { - show_info(q, _(L("You have to select at least one filament for selected printers")), ""); + if (show_info_msg) + { + wxString message = _(L("You have to select at least one filament for selected printers")) + "\n\n\t" + + _(L("Do you want to automatic select default filaments?")); + ask_and_selected_default_materials(message, T_FFF); + } return false; } if (any_sla_selected && technology & T_SLA && !exist_preset(AppConfig::SECTION_MATERIALS, sla_materials)) { - show_info(q, _(L("You have to select at least one material for selected printers")), ""); + if (show_info_msg) + { + wxString message = _(L("You have to select at least one material for selected printers")) + "\n\n\t" + + _(L("Do you want to automatic select default materials?")); + ask_and_selected_default_materials(message, T_SLA); + } return false; } diff --git a/src/slic3r/GUI/ConfigWizard_private.hpp b/src/slic3r/GUI/ConfigWizard_private.hpp index 3ea5321f84..9c14633c9f 100644 --- a/src/slic3r/GUI/ConfigWizard_private.hpp +++ b/src/slic3r/GUI/ConfigWizard_private.hpp @@ -149,6 +149,7 @@ struct PrinterPicker: wxPanel void select_all(bool select, bool alternates = false); void select_one(size_t i, bool select); bool any_selected() const; + std::set get_selected_models() const ; int get_width() const { return width; } const std::vector& get_button_indexes() { return m_button_indexes; } @@ -215,6 +216,9 @@ struct PagePrinters: ConfigWizardPage void select_all(bool select, bool alternates = false); int get_width() const; bool any_selected() const; + std::set get_selected_models(); + + std::string get_vendor_id() const { return printer_pickers.empty() ? "" : printer_pickers[0]->vendor_id; } virtual void set_run_reason(ConfigWizard::RunReason run_reason) override; }; @@ -503,10 +507,17 @@ struct ConfigWizard::priv void on_custom_setup(); void on_printer_pick(PagePrinters *page, const PrinterPickerEvent &evt); + void select_default_materials_for_printer_model(const std::vector &models, + Technology technology, + const std::string & model_id); + void select_default_materials_if_needed(VendorProfile* vendor_profile, + Technology technology, + const std::string &model_id); + void selected_default_materials(Technology technology); void on_3rdparty_install(const VendorProfile *vendor, bool install); bool on_bnt_finish(); - bool check_materials_in_config(Technology technology); + bool check_materials_in_config(Technology technology, bool show_info_msg = true); void apply_config(AppConfig *app_config, PresetBundle *preset_bundle, const PresetUpdater *updater); // #ys_FIXME_alise void update_presets_in_config(const std::string& section, const std::string& alias_key, bool add);