From 7aea0ceff3d4b44313266872992c19548f6fb831 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Tue, 3 Dec 2019 18:31:07 +0100 Subject: [PATCH] ConfigWizard improvements - added check for printers and filaments/matelials selection --- src/slic3r/GUI/ConfigWizard.cpp | 176 ++++++++++++++++++------ src/slic3r/GUI/ConfigWizard_private.hpp | 21 ++- 2 files changed, 154 insertions(+), 43 deletions(-) diff --git a/src/slic3r/GUI/ConfigWizard.cpp b/src/slic3r/GUI/ConfigWizard.cpp index 3321227b7..23fc17682 100644 --- a/src/slic3r/GUI/ConfigWizard.cpp +++ b/src/slic3r/GUI/ConfigWizard.cpp @@ -504,7 +504,8 @@ void PagePrinters::set_run_reason(ConfigWizard::RunReason run_reason) { if (technology == T_FFF && (run_reason == ConfigWizard::RR_DATA_EMPTY || run_reason == ConfigWizard::RR_DATA_LEGACY) - && printer_pickers.size() > 0) { + && printer_pickers.size() > 0 + && printer_pickers[0]->vendor_id == PresetBundle::PRUSA_BUNDLE) { printer_pickers[0]->select_one(0, true); } } @@ -628,32 +629,45 @@ void PageMaterials::update_lists(int sel1, int sel2) const std::string &vendor = list_l2->get_data(sel2); materials->filter_presets(type, vendor, [this](const Preset *p) { - // #ys_FIXME_alias - // const int i = list_l3->append(p->name, p); + bool was_checked = false; - if (list_l3->find(p->alias) != wxNOT_FOUND) - return; - const int i = list_l3->append(p->alias, &p->alias); + int cur_i = list_l3->find(p->alias); + if (cur_i == wxNOT_FOUND) + cur_i = list_l3->append(p->alias, &p->alias); + else + was_checked = list_l3->IsChecked(cur_i); - const bool checked = wizard_p()->appconfig_new.has(materials->appconfig_section(), p->name); - list_l3->Check(i, checked); - }); + const std::string& section = materials->appconfig_section(); + + const bool checked = wizard_p()->appconfig_new.has(section, p->name); + list_l3->Check(cur_i, checked | was_checked); + + /* Update preset selection in config. + * If one preset from aliases bundle is selected, + * than mark all presets with this aliases as selected + * */ + if (checked && !was_checked) + wizard_p()->update_presets_in_config(section, p->alias, true); + else if (!checked && was_checked) + wizard_p()->appconfig_new.set(section, p->name, "1"); + } ); } sel2_prev = sel2; } + + // for the very begining + if ((wizard_p()->run_reason == ConfigWizard::RR_DATA_EMPTY || wizard_p()->run_reason == ConfigWizard::RR_DATA_LEGACY) + && list_l3->size() > 0 ) + { + list_l3->Check(0, true); + wizard_p()->update_presets_in_config(materials->appconfig_section(), list_l3->get_data(0), true); + } } void PageMaterials::select_material(int i) { const bool checked = list_l3->IsChecked(i); - // #ys_FIXME_aliases - // const Preset &preset = list_l3->get_data(i); - // if (checked) { - // wizard_p()->appconfig_new.set(materials->appconfig_section(), preset.name, "1"); - // } else { - // wizard_p()->appconfig_new.erase(materials->appconfig_section(), preset.name); - // } const std::string& alias_key = list_l3->get_data(i); wizard_p()->update_presets_in_config(materials->appconfig_section(), alias_key, checked); @@ -826,9 +840,11 @@ PageVendors::PageVendors(ConfigWizard *parent) if (enabled) { cbox->SetValue(true); - auto pair = wizard_p()->pages_3rdparty.find(vendor->id); - wxCHECK_RET(pair != wizard_p()->pages_3rdparty.end(), "Internal error: 3rd party vendor printers page not created"); - pair->second->install = true; + auto pages = wizard_p()->pages_3rdparty.find(vendor->id); + wxCHECK_RET(pages != wizard_p()->pages_3rdparty.end(), "Internal error: 3rd party vendor printers page not created"); + + for (PagePrinters* page : { pages->second.first, pages->second.second }) + if (page) page->install = true; } append(cbox); @@ -1326,9 +1342,10 @@ void ConfigWizard::priv::load_pages() index->add_page(page_fff); index->add_page(page_msla); index->add_page(page_vendors); - for (const auto &pair : pages_3rdparty) { - PagePrinters *page = pair.second; - if (page->install) { index->add_page(page); } + for (const auto &pages : pages_3rdparty) { + for ( PagePrinters* page : { pages.second.first, pages.second.second }) + if (page && page->install) + index->add_page(page); } index->add_page(page_custom); @@ -1343,6 +1360,9 @@ void ConfigWizard::priv::load_pages() if (any_fff_selected) { index->add_page(page_filaments); } if (any_sla_selected) { index->add_page(page_sla_materials); } + // there should to be selected at least one printer + btn_finish->Enable(any_fff_selected || any_sla_selected); + index->add_page(page_update); index->add_page(page_mode); @@ -1450,10 +1470,31 @@ void ConfigWizard::priv::create_3rdparty_pages() const VendorProfile *vendor = pair.second.vendor_profile; if (vendor->id == PresetBundle::PRUSA_BUNDLE) { continue; } - auto *page = new PagePrinters(q, vendor->name, vendor->name, *vendor, 1, T_ANY); - add_page(page); + bool is_fff_technology = false; + bool is_sla_technology = false; - pages_3rdparty.insert({vendor->id, page}); + for (auto& model: vendor->models) + { + if (!is_fff_technology && model.technology == ptFFF) + is_fff_technology = true; + if (!is_sla_technology && model.technology == ptSLA) + is_sla_technology = true; + } + + PagePrinters* pageFFF = nullptr; + PagePrinters* pageSLA = nullptr; + + if (is_fff_technology) { + pageFFF = new PagePrinters(q, vendor->name + " " +_(L("FFF Technology Printers")), vendor->name+" FFF", *vendor, 1, T_FFF); + add_page(pageFFF); + } + + if (is_sla_technology) { + pageSLA = new PagePrinters(q, vendor->name + " " + _(L("SLA Technology Printers")), vendor->name+" MSLA", *vendor, 1, T_SLA); + add_page(pageSLA); + } + + pages_3rdparty.insert({vendor->id, {pageFFF, pageSLA}}); } } @@ -1533,10 +1574,10 @@ void ConfigWizard::priv::on_custom_setup() void ConfigWizard::priv::on_printer_pick(PagePrinters *page, const PrinterPickerEvent &evt) { - if (page_msla->any_selected() != any_sla_selected || - page_fff->any_selected() != any_fff_selected) { - any_fff_selected = page_fff->any_selected(); - any_sla_selected = page_msla->any_selected(); + if (check_sla_selected() != any_sla_selected || + check_fff_selected() != any_fff_selected) { + any_fff_selected = check_fff_selected(); + any_sla_selected = check_sla_selected(); load_pages(); } @@ -1553,9 +1594,9 @@ void ConfigWizard::priv::on_printer_pick(PagePrinters *page, const PrinterPicker } } - if (page == page_fff) { + if (page->technology & T_FFF) { page_filaments->clear(); - } else if (page == page_msla) { + } else if (page->technology & T_SLA) { page_sla_materials->clear(); } } @@ -1564,17 +1605,48 @@ void ConfigWizard::priv::on_3rdparty_install(const VendorProfile *vendor, bool i { auto it = pages_3rdparty.find(vendor->id); wxCHECK_RET(it != pages_3rdparty.end(), "Internal error: GUI page not found for 3rd party vendor profile"); - PagePrinters *page = it->second; - if (page->install && !install) { - page->select_all(false); - } - page->install = install; - page->Layout(); + for (PagePrinters* page : { it->second.first, it->second.second }) + if (page) { + if (page->install && !install) + page->select_all(false); + page->install = install; + page->Layout(); + } load_pages(); } +bool ConfigWizard::priv::check_material_config() +{ + const auto exist_preset = [this](const std::string& section, const Materials& materials) + { + if (appconfig_new.has_section(section) && + !appconfig_new.get_section(section).empty()) + { + const std::map& appconfig_presets = appconfig_new.get_section(section); + for (const auto& preset : appconfig_presets) + if (materials.exist_preset(preset.first)) + return true; + } + return false; + }; + + if (any_fff_selected && !exist_preset(AppConfig::SECTION_FILAMENTS, filaments)) + { + show_info(q, _(L("You have to select at least one filament for selected printers")), ""); + return false; + } + + if (any_sla_selected && !exist_preset(AppConfig::SECTION_MATERIALS, sla_materials)) + { + show_info(q, _(L("You have to select at least one material for selected printers")), ""); + return false; + } + + return true; +} + void ConfigWizard::priv::apply_config(AppConfig *app_config, PresetBundle *preset_bundle, const PresetUpdater *updater) { const auto enabled_vendors = appconfig_new.vendors(); @@ -1718,6 +1790,25 @@ void ConfigWizard::priv::update_presets_in_config(const std::string& section, co update(section, name); } +bool ConfigWizard::priv::check_fff_selected() +{ + bool ret = page_fff->any_selected(); + for (const auto& printer: pages_3rdparty) + if (printer.second.first) // FFF page + ret |= printer.second.first->any_selected(); + + return ret; +} + +bool ConfigWizard::priv::check_sla_selected() +{ + bool ret = page_msla->any_selected(); + for (const auto& printer: pages_3rdparty) + if (printer.second.second) // SLA page + ret |= printer.second.second->any_selected(); + return ret; +} + // Public @@ -1774,8 +1865,8 @@ ConfigWizard::ConfigWizard(wxWindow *parent) p->page_msla = new PagePrinters(this, _(L("Prusa MSLA Technology Printers")), "Prusa MSLA", *vendor_prusa, 0, T_SLA); p->add_page(p->page_msla); - p->any_sla_selected = p->page_msla->any_selected(); - p->any_fff_selected = p->page_fff->any_selected(); + p->any_sla_selected = p->check_sla_selected(); + p->any_fff_selected = p->check_fff_selected(); p->update_materials(T_ANY); @@ -1815,7 +1906,12 @@ ConfigWizard::ConfigWizard(wxWindow *parent) p->btn_prev->Bind(wxEVT_BUTTON, [this](const wxCommandEvent &) { this->p->index->go_prev(); }); p->btn_next->Bind(wxEVT_BUTTON, [this](const wxCommandEvent &) { this->p->index->go_next(); }); - p->btn_finish->Bind(wxEVT_BUTTON, [this](const wxCommandEvent &) { this->EndModal(wxID_OK); }); + p->btn_finish->Bind(wxEVT_BUTTON, [this](const wxCommandEvent &) + { + if (!p->check_material_config()) + return; + this->EndModal(wxID_OK); + }); // p->btn_finish->Hide(); p->btn_sel_all->Bind(wxEVT_BUTTON, [this](const wxCommandEvent &) { diff --git a/src/slic3r/GUI/ConfigWizard_private.hpp b/src/slic3r/GUI/ConfigWizard_private.hpp index 3a936fa42..75cd23218 100644 --- a/src/slic3r/GUI/ConfigWizard_private.hpp +++ b/src/slic3r/GUI/ConfigWizard_private.hpp @@ -81,6 +81,14 @@ struct Materials } } + bool exist_preset(const std::string& preset_name) const + { + for (const Preset* preset : presets) + if (preset->name == preset_name) + return true; + return false; + } + static const std::string UNKNOWN; static const std::string& get_filament_type(const Preset *preset); static const std::string& get_filament_vendor(const Preset *preset); @@ -240,11 +248,11 @@ template struct DataList : public T return wxNOT_FOUND; } + + int size() { return this->GetCount(); } }; typedef DataList StringList; -// #ys_FIXME_alias -//typedef DataList PresetList; typedef DataList PresetList; struct PageMaterials: ConfigWizardPage @@ -345,7 +353,10 @@ struct PageTemperatures: ConfigWizardPage virtual void apply_custom_config(DynamicPrintConfig &config); }; -typedef std::map Pages3rdparty; +// hypothetically, each vendor can has printers both of technologies (FFF and SLA) +typedef std::map> Pages3rdparty; class ConfigWizardIndex: public wxPanel @@ -477,10 +488,14 @@ struct ConfigWizard::priv void on_printer_pick(PagePrinters *page, const PrinterPickerEvent &evt); void on_3rdparty_install(const VendorProfile *vendor, bool install); + bool check_material_config(); 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); + bool check_fff_selected(); // Used to decide whether to display Filaments page + bool check_sla_selected(); // Used to decide whether to display SLA Materials page + int em() const { return index->em(); } };