diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index bbd8a1f10..c8e53fc0a 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -2690,7 +2690,7 @@ std::vector PresetCollection::diameters_of_selected_printer() std::set diameters; auto printer_model = m_edited_preset.config.opt_string("printer_model"); for (auto &preset : m_presets) { - if (preset.is_system && preset.config.opt_string("printer_model") == printer_model) + if (preset.config.opt_string("printer_model") == printer_model) diameters.insert(preset.config.opt_string("printer_variant")); } return std::vector{diameters.begin(), diameters.end()}; diff --git a/src/slic3r/GUI/CreatePresetsDialog.cpp b/src/slic3r/GUI/CreatePresetsDialog.cpp index 04cfec4ac..3a8e0eecd 100644 --- a/src/slic3r/GUI/CreatePresetsDialog.cpp +++ b/src/slic3r/GUI/CreatePresetsDialog.cpp @@ -1629,6 +1629,10 @@ wxBoxSizer *CreatePrinterPresetDialog::create_printer_item(wxWindow *parent) MessageDialog dlg(this, _L("The model is not fond, place reselect vendor."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES | wxYES_DEFAULT | wxCENTRE); dlg.ShowModal(); } + + m_select_printer->SetSelection(-1); + m_select_printer->SetValue(_L("Select Printer")); + m_select_printer->SetLabelColor(DEFAULT_PROMPT_TEXT_COLOUR); e.Skip(); }); @@ -2426,6 +2430,8 @@ void CreatePrinterPresetDialog::select_curr_radiobox(std::vectorIsEnabled()) + return; radiobox_list[i].first->SetValue(true); wxString curr_selected_type = radiobox_list[i].second; this->Freeze(); @@ -2525,11 +2531,22 @@ wxBoxSizer *CreatePrinterPresetDialog::create_printer_preset_item(wxWindow *pare m_printer_vendor = new ComboBox(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, PRINTER_PRESET_VENDOR_SIZE, 0, nullptr, wxCB_READONLY); m_printer_vendor->SetValue(_L("Select Vendor")); m_printer_vendor->SetLabelColor(DEFAULT_PROMPT_TEXT_COLOUR); + + VendorMap vendors; + wxArrayString exist_vendor_choice = get_exist_vendor_choices(vendors); + m_printer_vendor->Set(exist_vendor_choice); + m_printer_vendor->Bind(wxEVT_COMBOBOX, [this](wxCommandEvent &e) { + e.SetExtraLong(1); // 0 means form last page, 1 means form cur combobox + on_select_printer_model(e); + }); + comboBox_sizer->Add(m_printer_vendor, 0, wxEXPAND, 0); m_printer_model = new ComboBox(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, PRINTER_PRESET_MODEL_SIZE, 0, nullptr, wxCB_READONLY); m_printer_model->SetLabelColor(DEFAULT_PROMPT_TEXT_COLOUR); m_printer_model->SetValue(_L("Select Model")); + m_printer_model->Bind(wxEVT_COMBOBOX, &CreatePrinterPresetDialog::on_preset_model_value_change, this); + comboBox_sizer->Add(m_printer_model, 0, wxEXPAND | wxLEFT, FromDIP(10)); vertical_sizer->Add(comboBox_sizer, 0, wxEXPAND | wxTOP, FromDIP(5)); @@ -2913,52 +2930,96 @@ void CreatePrinterPresetDialog::show_page2() bool CreatePrinterPresetDialog::data_init() { - std::string nozzle_type = into_u8(m_nozzle_diameter->GetStringSelection()); - size_t index_mm = nozzle_type.find(" mm"); - if (std::string::npos != index_mm) { - nozzle_type = nozzle_type.substr(0, index_mm); + wxCommandEvent e; + e.SetExtraLong(0); // 0 means form last page, 1 means form cur combobox + on_select_printer_model(e); + + auto get_nozzle_size_for_printer_model = [this](const std::string &model_name) -> size_t { + auto iter = m_printer_name_to_preset.find(model_name); + if (iter != m_printer_name_to_preset.end()) { + std::shared_ptr printer_preset = iter->second; + if (printer_preset) { + auto nozzle_diameter = dynamic_cast(printer_preset->config.option("nozzle_diameter", true)); + return nozzle_diameter->values.size(); + } + } + return 1; // default nozzle size + }; + + size_t selected_nozzle_size = get_nozzle_size_for_printer_model(into_u8(m_select_printer->GetStringSelection())); + + bool has_set_value = false; + for (size_t i = 0; i < m_create_presets_btns.size(); ++i) { + auto &item = m_create_presets_btns[i]; + if (item.second == m_create_type.base_template) { + if (selected_nozzle_size > 1) { + item.first->Disable(); + item.first->SetValue(false); + } + else { + item.first->Enable(); + if (!has_set_value) { + select_curr_radiobox(m_create_presets_btns, i); + has_set_value = true; + } + } + } + else { + if (!has_set_value) { + select_curr_radiobox(m_create_presets_btns, i); + has_set_value = true; + } else { + item.first->SetValue(false); + } + } } - float nozzle = nozzle_diameter_map[nozzle_type]; + + m_page2->SetSizerAndFit(m_page2_sizer); + return true; +} + +void CreatePrinterPresetDialog::on_select_printer_model(wxCommandEvent &e) +{ + bool is_from_last_page = e.GetExtraLong() == 0; // 0 means form last page, 1 means form cur combobox + m_printer_vendor->SetLabelColor(*wxBLACK); + VendorMap vendors; + wxArrayString exist_vendor_choice = get_exist_vendor_choices(vendors); + std::string curr_selected_vendor = into_u8(m_printer_vendor->GetStringSelection()); + auto iterator = vendors.find(curr_selected_vendor); + if (iterator != vendors.end()) { + m_printer_preset_vendor_selected = iterator->second; + } else { + if (is_from_last_page) { + m_printer_vendor->SetLabelColor(DEFAULT_PROMPT_TEXT_COLOUR); + return; + } + + MessageDialog dlg(this, _L("Vendor is not found, please reselect."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES_NO | wxYES_DEFAULT | wxCENTRE); + dlg.ShowModal(); + return; + } + + std::string nozzle_type = into_u8(m_nozzle_diameter->GetStringSelection()); + size_t index_mm = nozzle_type.find(" mm"); + if (std::string::npos != index_mm) { nozzle_type = nozzle_type.substr(0, index_mm); } + float nozzle = nozzle_diameter_map[nozzle_type]; BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " entry and nozzle type is: " << nozzle_type << " and nozzle is: " << nozzle; - VendorMap vendors; - wxArrayString exist_vendor_choice = get_exist_vendor_choices(vendors); - m_printer_vendor->Set(exist_vendor_choice); - - m_printer_model->Bind(wxEVT_COMBOBOX, &CreatePrinterPresetDialog::on_preset_model_value_change, this); - - m_printer_vendor->Bind(wxEVT_COMBOBOX, [this, vendors, nozzle](wxCommandEvent e) { - m_printer_vendor->SetLabelColor(*wxBLACK); - - std::string curr_selected_vendor = into_u8(m_printer_vendor->GetStringSelection()); - auto iterator = vendors.find(curr_selected_vendor); - if (iterator != vendors.end()) { - m_printer_preset_vendor_selected = iterator->second; - } else { - MessageDialog dlg(this, _L("Vendor is not found, please reselect."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES_NO | wxYES_DEFAULT | wxCENTRE); - dlg.ShowModal(); - return; - } - - wxArrayString printer_preset_model = printer_preset_sort_with_nozzle_diameter(m_printer_preset_vendor_selected, nozzle); - if (printer_preset_model.size() == 0) { - MessageDialog dlg(this, _L("Current vendor has no models, please reselect."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES | wxYES_DEFAULT | wxCENTRE); - dlg.ShowModal(); - return; - } - m_printer_model->Set(printer_preset_model); - if (!printer_preset_model.empty()) { - m_printer_model->SetSelection(0); - wxCommandEvent e; - on_preset_model_value_change(e); - update_preset_list_size(); - } - rewritten = false; - e.Skip(); - - }); - return true; - + wxArrayString printer_preset_model = printer_preset_sort_with_nozzle_diameter(m_printer_preset_vendor_selected, nozzle); + if (printer_preset_model.size() == 0) { + MessageDialog dlg(this, _L("Current vendor has no models, please reselect."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES | wxYES_DEFAULT | wxCENTRE); + dlg.ShowModal(); + return; + } + m_printer_model->Set(printer_preset_model); + if (!printer_preset_model.empty()) { + m_printer_model->SetSelection(0); + wxCommandEvent e; + on_preset_model_value_change(e); + update_preset_list_size(); + } + rewritten = false; + e.Skip(); } void CreatePrinterPresetDialog::set_current_visible_printer() diff --git a/src/slic3r/GUI/CreatePresetsDialog.hpp b/src/slic3r/GUI/CreatePresetsDialog.hpp index e1e2af6b6..118f98b9b 100644 --- a/src/slic3r/GUI/CreatePresetsDialog.hpp +++ b/src/slic3r/GUI/CreatePresetsDialog.hpp @@ -14,7 +14,7 @@ #include "ParamsDialog.hpp" #include "json_diff.hpp" -namespace Slic3r { +namespace Slic3r { namespace GUI { class CreateFilamentPresetDialog : public DPIDialog @@ -24,7 +24,7 @@ public: ~CreateFilamentPresetDialog(); protected: - enum FilamentOptionType { + enum FilamentOptionType { VENDOR = 0, TYPE, SERIAL, @@ -126,6 +126,7 @@ protected: /********************************************************** Data Interaction *******************************************************/ bool data_init(); + void on_select_printer_model(wxCommandEvent &e); void set_current_visible_printer(); void select_curr_radiobox(std::vector> &radiobox_list, int btn_idx); void select_all_preset_template(std::vector> &preset_templates); @@ -244,7 +245,7 @@ public: ~ExportConfigsDialog();//to do: delete preset protected: - + struct ExportType { wxString preset_bundle; @@ -341,7 +342,7 @@ class PresetTree { public: PresetTree(EditFilamentPresetDialog *dialog); - + wxPanel *get_preset_tree(std::pair>> printer_and_presets); private: @@ -364,7 +365,7 @@ class EditFilamentPresetDialog : public DPIDialog public: EditFilamentPresetDialog(wxWindow *parent, FilamentInfomation *filament_info); ~EditFilamentPresetDialog(); - + wxPanel *get_preset_tree_panel() { return m_preset_tree_panel; } std::shared_ptr get_need_edit_preset() { return m_need_edit_preset; } void set_printer_name(const std::string &printer_name) { m_selected_printer = printer_name; } diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index a65f28585..f35790405 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1977,10 +1977,10 @@ void Sidebar::create_printer_preset() CreatePrinterPresetDialog dlg(wxGetApp().mainframe); int res = dlg.ShowModal(); if (wxID_OK == res) { + wxGetApp().load_current_presets(); wxGetApp().mainframe->update_side_preset_ui(); update_ui_from_settings(); update_all_preset_comboboxes(); - wxGetApp().load_current_presets(); CreatePresetSuccessfulDialog success_dlg(wxGetApp().mainframe, SuccessType::PRINTER); int res = success_dlg.ShowModal(); if (res == wxID_OK) { diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 196019a51..3feb05709 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -6099,9 +6099,10 @@ void Tab::update_extruder_variants(int extruder_id, bool reload) { BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << extruder_id; if (m_extruder_switch) { - Preset &printer_preset = m_preset_bundle->printers.get_edited_preset(); auto nozzle_volumes = m_preset_bundle->project_config.option("nozzle_volume_type"); - if (nozzle_volumes->size() == 2) { + int extruder_nums = m_preset_bundle->get_printer_extruder_count(); + nozzle_volumes->values.resize(extruder_nums); + if (extruder_nums == 2) { auto nozzle_volumes_def = m_preset_bundle->project_config.def()->get("nozzle_volume_type"); wxString left, right; for (size_t i = 0; i < nozzle_volumes_def->enum_labels.size(); ++i) {