From f3599d555c256476e23d794b3b950e8b39e51252 Mon Sep 17 00:00:00 2001 From: "maosheng.wei" Date: Thu, 26 Oct 2023 09:39:29 +0800 Subject: [PATCH] FIX: create filament issue Jira: 4917 4920 4928 4933 4934 4917 filament preset name too long to dialog too long 4920 too long fiilament preset can't save 4928 limit preset tree size 4933 edit filament dialog remove cancel button 4934 update preset tree and refresh Signed-off-by: maosheng.wei Change-Id: Ibf708911576324a58c5640a50f5207b45a69b4e9 --- src/libslic3r/Preset.cpp | 29 ++++------ src/libslic3r/Preset.hpp | 9 +++- src/slic3r/GUI/CreatePresetsDialog.cpp | 75 +++++++++++++++++--------- src/slic3r/GUI/CreatePresetsDialog.hpp | 1 - 4 files changed, 67 insertions(+), 47 deletions(-) diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 1997c93ee..1fdac717c 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -2168,29 +2168,20 @@ bool PresetCollection::create_presets_from_template_for_printer(std::vector & failures, - std::string const & filament_name, - std::string const & filament_id, - const std::string & vendor_name, - const std::string & compatible_printers, - bool force_rewritten) +bool PresetCollection::clone_presets_for_filament(Preset const *const & preset, + std::vector &failures, + std::string const & filament_name, + std::string const & filament_id, + const DynamicConfig & dynamic_config, + const std::string & compatible_printers, + bool force_rewritten) { std::vector const presets = {preset}; - return clone_presets(presets, failures, [&filament_name, &filament_id, &vendor_name, &compatible_printers](Preset &preset, Preset::Type &type) { + return clone_presets(presets, failures, [&filament_name, &filament_id, &dynamic_config, &compatible_printers](Preset &preset, Preset::Type &type) { preset.name = filament_name + " @" + compatible_printers; if (type == Preset::TYPE_FILAMENT) { - auto filament_vendor = preset.config.option("filament_vendor", true); - if (filament_vendor->values.empty()) { - filament_vendor->values.push_back(vendor_name); - } else { - filament_vendor->values = {vendor_name}; - } - auto compatible_printers_option = preset.config.option("compatible_printers", true); - if (compatible_printers_option->values.empty()) { compatible_printers_option->values.push_back(compatible_printers); - } else { - compatible_printers_option->values = {compatible_printers}; - } + preset.config.apply_only(dynamic_config, {"filament_vendor", "compatible_printers", "filament_type"},true); + preset.filament_id = filament_id; } }, diff --git a/src/libslic3r/Preset.hpp b/src/libslic3r/Preset.hpp index 2545dc8ad..65534f0fa 100644 --- a/src/libslic3r/Preset.hpp +++ b/src/libslic3r/Preset.hpp @@ -461,8 +461,13 @@ public: bool clone_presets_for_printer(std::vector const &presets, std::vector &failures, std::string const &printer, bool force_rewritten = false); bool create_presets_from_template_for_printer( std::vector const &templates, std::vector &failures, std::string const &printer, std::function create_filament_id, bool force_rewritten = false); - bool clone_presets_for_filament(Preset const * const &preset, std::vector &failures, std::string const &filament_name, std::string const &filament_id, const std::string& vendor, - const std::string& compatible_printers, bool force_rewritten = false); + bool clone_presets_for_filament(Preset const *const & preset, + std::vector &failures, + std::string const & filament_name, + std::string const & filament_id, + const DynamicConfig & dynamic_config, + const std::string & compatible_printers, + bool force_rewritten = false); std::map> get_filament_presets() const; diff --git a/src/slic3r/GUI/CreatePresetsDialog.cpp b/src/slic3r/GUI/CreatePresetsDialog.cpp index e50282585..12ac6d4fc 100644 --- a/src/slic3r/GUI/CreatePresetsDialog.cpp +++ b/src/slic3r/GUI/CreatePresetsDialog.cpp @@ -43,8 +43,17 @@ static const std::vector filament_types = {"PLA", "PLA+", "PLA "PETGCF", "PTBA", "PTBA90A", "PEEK", "TPU93A", "TPU75D", "TPU", "TPU92A", "TPU98A", "Misc", "TPE", "GLAZE", "Nylon", "CPE", "METAL", "ABST", "Carbon Fiber"}; -static const std::vector system_filament_types = {"PLA", "ABS", "TPU", "PC","ASA", "PA-CF","PET-CF", "PETG", "PETG-CF", "PLA Aero", "PLA-CF", "PA", - "HIPS", "PPS", "PVA"}; +static const std::vector system_filament_types = {"PLA", "ABS", "TPU", "PC", "ASA", "PA-CF", "PA6-CF", "PET-CF", "PETG", "PETG-CF", + "PLA Aero", "PLA-CF", "PPA-CF", "PPA-GF", "PA", "HIPS", "PPS", "PPS-CF", "PVA"}; + +/* +static const std::unordered_map system_filament_types_map = {{"PLA", "PLA"}, {"ABS", "ABS"}, {"TPU", "TPU"}, + {"PC", "PC"}, {"ASA", "ASA"}, {"PA-CF", "PA-CF"}, + {"PA6-CF", "PA6-CF"}, {"PET-CF", "PET-CF"}, {"PETG", "PETG"}, + {"PETG-CF", "PETG-CF"}, {"PLA Aero", "PLA-AERO"}, {"PLA-CF", "PLA-CF"}, + {"PPA-CF", "PPA-CF"}, {"PPA-GF", "PPA-GF"}, {"PA", "PA"}, + {"HIPS", "HIPS"}, {"PPS", "PPS"}, {"PPS-CF", "PPS-CF"}, + {"PVA", "PVA"}};*/ static const std::vector printer_vendors = {"AnkerMake", "Anycubic", "Artillery", "BIBO", "BIQU", "Creality ENDER", "Creality CR", "Creality SERMOON", "Elegoo", "FLSun", "gCreate", "Geeetech", "INAT", "Infinity3D", "Jubilee", "LNL3D", @@ -213,15 +222,17 @@ static wxBoxSizer *create_preset_tree(wxWindow *parent, std::pairAddRoot(printer_name); + int row = 1; for (std::shared_ptr preset : printer_and_preset.second) { wxString preset_name = wxString::FromUTF8(preset->name); wxTreeItemId childId1 = treeCtrl->AppendItem(rootId, preset_name); + row++; } treeCtrl->Expand(rootId); wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL); - sizer->SetMinSize(wxSize(220,-1)); - treeCtrl->SetMaxSize(wxSize(-1, 60)); + treeCtrl->SetMinSize(wxSize(220, std::min(row * 30, 140))); + treeCtrl->SetMaxSize(wxSize(300, std::min(row * 30, 140))); sizer->Add(treeCtrl, 0, wxEXPAND | wxALL, 0); return sizer; @@ -584,6 +595,7 @@ wxBoxSizer *CreateFilamentPresetDialog::create_vendor_item() wxBoxSizer *textInputSizer = new wxBoxSizer(wxVERTICAL); m_filament_custom_vendor_input = new TextInput(this, wxEmptyString, wxEmptyString, wxEmptyString, wxDefaultPosition, NAME_OPTION_COMBOBOX_SIZE, wxTE_PROCESS_ENTER); + m_filament_custom_vendor_input->GetTextCtrl()->SetMaxLength(50); m_filament_custom_vendor_input->SetSize(NAME_OPTION_COMBOBOX_SIZE); textInputSizer->Add(m_filament_custom_vendor_input, 0, wxEXPAND | wxALL, 0); m_filament_custom_vendor_input->GetTextCtrl()->SetHint(_L("Input custom vendor")); @@ -662,6 +674,7 @@ wxBoxSizer *CreateFilamentPresetDialog::create_serial_item() wxBoxSizer *comboBoxSizer = new wxBoxSizer(wxVERTICAL); m_filament_serial_input = new TextInput(this, "", "", "", wxDefaultPosition, NAME_OPTION_COMBOBOX_SIZE, wxTE_PROCESS_ENTER); + m_filament_serial_input->GetTextCtrl()->SetMaxLength(50); comboBoxSizer->Add(m_filament_serial_input, 0, wxEXPAND | wxALL, 0); m_filament_serial_input->GetTextCtrl()->Bind(wxEVT_CHAR, [this](wxKeyEvent &event) { int key = event.GetKeyCode(); @@ -843,7 +856,11 @@ wxBoxSizer *CreateFilamentPresetDialog::create_button_item() std::string compatible_printer_name = checkbox_preset.second.first; std::vector failures; Preset const *const checked_preset = checkbox_preset.second.second; - bool res = preset_bundle->filaments.clone_presets_for_filament(checked_preset, failures, filament_preset_name, user_filament_id, vendor_name, + DynamicConfig dynamic_config; + dynamic_config.set_key_value("filament_vendor", new ConfigOptionStrings({vendor_name})); + dynamic_config.set_key_value("compatible_printers", new ConfigOptionStrings({compatible_printer_name})); + dynamic_config.set_key_value("filament_type", new ConfigOptionStrings({type_name})); + bool res = preset_bundle->filaments.clone_presets_for_filament(checked_preset, failures, filament_preset_name, user_filament_id, dynamic_config, compatible_printer_name); if (!res) { std::string failure_names; @@ -851,7 +868,7 @@ wxBoxSizer *CreateFilamentPresetDialog::create_button_item() MessageDialog dlg(this, _L("Some existing presets have failed to be created, as follows:\n") + failure_names + _L("\nDo you want to rewrite it?"), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES_NO | wxYES_DEFAULT | wxCENTRE); if (dlg.ShowModal() == wxID_YES) { - res = preset_bundle->filaments.clone_presets_for_filament(checked_preset, failures, filament_preset_name, user_filament_id, vendor_name, + res = preset_bundle->filaments.clone_presets_for_filament(checked_preset, failures, filament_preset_name, user_filament_id, dynamic_config, compatible_printer_name, true); BOOST_LOG_TRIVIAL(info) << "clone filament have failures rewritten is successful? " << res; } @@ -866,14 +883,20 @@ wxBoxSizer *CreateFilamentPresetDialog::create_button_item() std::string compatible_printer_name = checkbox_preset.second.first; std::vector failures; Preset const *const checked_preset = checkbox_preset.second.second; - bool res = preset_bundle->filaments.clone_presets_for_filament(checked_preset, failures, filament_preset_name, user_filament_id, vendor_name, compatible_printer_name); + DynamicConfig dynamic_config; + dynamic_config.set_key_value("filament_vendor", new ConfigOptionStrings({vendor_name})); + dynamic_config.set_key_value("compatible_printers", new ConfigOptionStrings({compatible_printer_name})); + dynamic_config.set_key_value("filament_type", new ConfigOptionStrings({type_name})); + bool res = preset_bundle->filaments.clone_presets_for_filament(checked_preset, failures, filament_preset_name, user_filament_id, dynamic_config, + compatible_printer_name); if (!res) { std::string failure_names; for (std::string &failure : failures) { failure_names += failure + "\n"; } MessageDialog dlg(this, _L("Some existing presets have failed to be created, as follows:\n") + failure_names + _L("\nDo you want to rewrite it?"), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES_NO | wxYES_DEFAULT | wxCENTRE); if (wxID_YES == dlg.ShowModal()) { - res = preset_bundle->filaments.clone_presets_for_filament(checked_preset, failures, filament_preset_name, user_filament_id, vendor_name, compatible_printer_name, true); + res = preset_bundle->filaments.clone_presets_for_filament(checked_preset, failures, filament_preset_name, user_filament_id, dynamic_config, + compatible_printer_name, true); BOOST_LOG_TRIVIAL(info) << "clone filament presets have failures rewritten is successful? " << res; } } @@ -3749,9 +3772,11 @@ void EditFilamentPresetDialog::update_preset_tree() m_preset_tree_sizer->Add(create_preset_tree(m_preset_tree_window, printer_and_presets)); } m_preset_tree_window->SetSizerAndFit(m_preset_tree_sizer); + + this->Thaw(); this->Layout(); this->Fit(); - this->Thaw(); + this->Refresh(); } wxBoxSizer *EditFilamentPresetDialog::create_filament_basic_info() @@ -3770,7 +3795,7 @@ wxBoxSizer *EditFilamentPresetDialog::create_filament_basic_info() vendor_sizer->Add(vendor_key_sizer, 0, wxEXPAND | wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(10)); wxBoxSizer *vendor_value_sizer = new wxBoxSizer(wxVERTICAL); - wxStaticText *vendor_text = new wxStaticText(this, wxID_ANY, m_vendor_name, wxDefaultPosition, wxDefaultSize); + wxStaticText *vendor_text = new wxStaticText(this, wxID_ANY, from_u8(m_vendor_name), wxDefaultPosition, wxDefaultSize); vendor_value_sizer->Add(vendor_text, 0, wxEXPAND | wxALL, 0); vendor_sizer->Add(vendor_value_sizer, 0, wxEXPAND | wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(10)); @@ -3782,7 +3807,7 @@ wxBoxSizer *EditFilamentPresetDialog::create_filament_basic_info() type_sizer->Add(type_key_sizer, 0, wxEXPAND | wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(10)); wxBoxSizer * type_value_sizer = new wxBoxSizer(wxVERTICAL); - wxStaticText *type_text = new wxStaticText(this, wxID_ANY, m_filament_type, wxDefaultPosition, wxDefaultSize); + wxStaticText *type_text = new wxStaticText(this, wxID_ANY, from_u8(m_filament_type), wxDefaultPosition, wxDefaultSize); type_value_sizer->Add(type_text, 0, wxEXPAND | wxALL, 0); type_sizer->Add(type_value_sizer, 0, wxEXPAND | wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(10)); @@ -3794,7 +3819,14 @@ wxBoxSizer *EditFilamentPresetDialog::create_filament_basic_info() serial_sizer->Add(serial_key_sizer, 0, wxEXPAND | wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(10)); wxBoxSizer * serial_value_sizer = new wxBoxSizer(wxVERTICAL); - wxStaticText *serial_text = new wxStaticText(this, wxID_ANY, m_filament_serial, wxDefaultPosition, wxDefaultSize); + wxString full_filamnet_serial = from_u8(m_filament_serial); + wxString show_filament_serial = full_filamnet_serial; + if (m_filament_serial.size() > 40) { + show_filament_serial = from_u8(m_filament_serial.substr(0, 20)) + "..."; + } + wxStaticText *serial_text = new wxStaticText(this, wxID_ANY, show_filament_serial, wxDefaultPosition, wxDefaultSize); + wxToolTip * toolTip = new wxToolTip(full_filamnet_serial); + serial_text->SetToolTip(toolTip); serial_value_sizer->Add(serial_text, 0, wxEXPAND | wxALL, 0); serial_sizer->Add(serial_value_sizer, 0, wxEXPAND | wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(10)); @@ -3885,15 +3917,6 @@ wxBoxSizer *EditFilamentPresetDialog::create_button_sizer() StateColor btn_bg_white(std::pair(wxColour(206, 206, 206), StateColor::Pressed), std::pair(wxColour(238, 238, 238), StateColor::Hovered), std::pair(*wxWHITE, StateColor::Normal)); - m_cancel_btn = new Button(this, _L("Cancel")); - m_cancel_btn->SetBackgroundColor(btn_bg_white); - m_cancel_btn->SetBorderColor(wxColour(38, 46, 48)); - m_cancel_btn->SetFont(Label::Body_12); - m_cancel_btn->SetSize(wxSize(FromDIP(58), FromDIP(24))); - m_cancel_btn->SetMinSize(wxSize(FromDIP(58), FromDIP(24))); - m_cancel_btn->SetCornerRadius(FromDIP(12)); - bSizer_button->Add(m_cancel_btn, 0, wxRIGHT | wxBOTTOM, FromDIP(10)); - m_del_filament_btn->Bind(wxEVT_BUTTON, ([this](wxCommandEvent &e) { WarningDialog dlg(this, _L("Delete filament?\nDelete filament would deleted all the attatched filament presets"), _L("Delete filament"), wxYES | wxCANCEL | wxCANCEL_DEFAULT | wxCENTRE); int res = dlg.ShowModal(); @@ -3933,7 +3956,6 @@ wxBoxSizer *EditFilamentPresetDialog::create_button_sizer() })); m_ok_btn->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent &e) { EndModal(wxID_OK); }); - m_cancel_btn->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent &e) { EndModal(wxID_CANCEL); }); return bSizer_button; @@ -4106,15 +4128,18 @@ wxBoxSizer *CreatePresetForPrinterDialog::create_button_sizer() std::shared_ptr filament_preset = iter->second; PresetBundle * preset_bundle = wxGetApp().preset_bundle; std::vector failures; - bool res = preset_bundle->filaments.clone_presets_for_filament(filament_preset.get(), failures, m_filament_name, m_filament_id, m_filament_vendor, printer_name); + DynamicConfig dynamic_config; + dynamic_config.set_key_value("filament_vendor", new ConfigOptionStrings({m_filament_vendor})); + dynamic_config.set_key_value("compatible_printers", new ConfigOptionStrings({printer_name})); + dynamic_config.set_key_value("filament_type", new ConfigOptionStrings({m_filament_type})); + bool res = preset_bundle->filaments.clone_presets_for_filament(filament_preset.get(), failures, m_filament_name, m_filament_id, dynamic_config, printer_name); if (!res) { std::string failure_names; for (std::string &failure : failures) { failure_names += failure + "\n"; } MessageDialog dlg(this, _L("Some existing presets have failed to be created, as follows:\n") + failure_names + _L("\nDo you want to rewrite it?"), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES_NO | wxYES_DEFAULT | wxCENTRE); if (dlg.ShowModal() == wxID_YES) { - res = preset_bundle->filaments.clone_presets_for_filament(filament_preset.get(), failures, m_filament_name, m_filament_id, m_filament_vendor, printer_name, - true); + res = preset_bundle->filaments.clone_presets_for_filament(filament_preset.get(), failures, m_filament_name, m_filament_id, dynamic_config, printer_name, true); BOOST_LOG_TRIVIAL(info) << "clone filament have failures rewritten is successful? " << res; } else { BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "have same name preset and not rewritten"; diff --git a/src/slic3r/GUI/CreatePresetsDialog.hpp b/src/slic3r/GUI/CreatePresetsDialog.hpp index 1070a1023..d83b3ae49 100644 --- a/src/slic3r/GUI/CreatePresetsDialog.hpp +++ b/src/slic3r/GUI/CreatePresetsDialog.hpp @@ -338,7 +338,6 @@ private: Button * m_add_filament_btn = nullptr; Button * m_del_filament_btn = nullptr; Button * m_ok_btn = nullptr; - Button * m_cancel_btn = nullptr; wxGridSizer * m_preset_tree_sizer = nullptr; wxScrolledWindow * m_preset_tree_window = nullptr; std::unordered_map>> m_printer_compatible_presets;