FIX: create filament issue

Jira: 4904 4905 4908 4916 4918 4923
4904 printer combobox has same preset name
4905 printer combobox has user preset
4908 create filament successful but has imcompatible presets
4916 not selected preset but create successful
4918 too many preset to have no OK button
4923 edit filament, filament preset combobox has only one preset

Change-Id: I42155998fd1bd89e048aaa9eb5ac30ad4c679f08
Signed-off-by: maosheng.wei <maosheng.wei@bambulab.com>
This commit is contained in:
maosheng.wei 2023-10-25 16:39:40 +08:00 committed by Lane.Wei
parent 15f853af73
commit ae9d9e644f
2 changed files with 105 additions and 69 deletions

View File

@ -463,7 +463,6 @@ static bool delete_filament_preset_by_name(std::string delete_preset_name, std::
CreateFilamentPresetDialog::CreateFilamentPresetDialog(wxWindow *parent)
: DPIDialog(parent ? parent : nullptr, wxID_ANY, _L("Creat Filament"), wxDefaultPosition, wxDefaultSize, wxCAPTION | wxCLOSE_BOX | wxCENTRE)
{
m_create_type.base_filament = _L("Create based on current filamet");
m_create_type.base_filament_preset = _L("Copy current filament preset ");
@ -484,8 +483,17 @@ CreateFilamentPresetDialog::CreateFilamentPresetDialog(wxWindow *parent)
m_main_sizer->Add(create_item(FilamentOptionType::TYPE), 0, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, FromDIP(5));
m_main_sizer->Add(create_item(FilamentOptionType::SERIAL), 0, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, FromDIP(5));
m_main_sizer->Add(create_item(FilamentOptionType::FILAMENT_PRESET), 0, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, FromDIP(5));
m_main_sizer->Add(create_item(FilamentOptionType::PRESET_FOR_PRINTER), 0, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, FromDIP(5));
m_main_sizer->Add(create_button_item(), 0, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, FromDIP(5));
m_scrolled_preset_panel = new wxScrolledWindow(this, wxID_ANY);
m_scrolled_preset_panel->SetMinSize(PRESET_TEMPLATE_SIZE);
m_scrolled_preset_panel->SetBackgroundColour(*wxWHITE);
m_scrolled_preset_panel->SetScrollRate(5, 5);
m_scrolled_sizer = new wxBoxSizer(wxVERTICAL);
m_scrolled_sizer->Add(create_item(FilamentOptionType::PRESET_FOR_PRINTER), 0, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, FromDIP(5));
m_scrolled_sizer->Add(0, 0, 0, wxTOP, FromDIP(5));
m_scrolled_sizer->Add(create_button_item(), 0, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, FromDIP(5));
m_scrolled_preset_panel->SetSizerAndFit(m_scrolled_sizer);
m_main_sizer->Add(m_scrolled_preset_panel, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(10));
get_all_filament_presets();
select_curr_radiobox(m_create_type_btns, 0);
@ -511,6 +519,19 @@ CreateFilamentPresetDialog::~CreateFilamentPresetDialog()
void CreateFilamentPresetDialog::on_dpi_changed(const wxRect &suggested_rect) {}
bool CreateFilamentPresetDialog::is_check_box_selected()
{
for (const std::pair<CheckBox *, std::pair<std::string, Preset *>> &checkbox_preset : m_filament_preset) {
if (checkbox_preset.first->GetValue()) { return true; }
}
for (const std::pair<CheckBox *, std::pair<std::string, Preset *>> &checkbox_preset : m_machint_filament_preset) {
if (checkbox_preset.first->GetValue()) { return true; }
}
return false;
}
wxBoxSizer *CreateFilamentPresetDialog::create_item(FilamentOptionType option_type)
{
@ -566,6 +587,14 @@ wxBoxSizer *CreateFilamentPresetDialog::create_vendor_item()
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"));
m_filament_custom_vendor_input->GetTextCtrl()->Bind(wxEVT_CHAR, [this](wxKeyEvent &event) {
int key = event.GetKeyCode();
if (key == 64 || key == 59) { //@ ;
event.Skip(false);
return;
}
event.Skip();
});
m_filament_custom_vendor_input->Hide();
horizontal_sizer->Add(textInputSizer, 0, wxEXPAND | wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(10));
@ -609,8 +638,12 @@ wxBoxSizer *CreateFilamentPresetDialog::create_type_item()
} else if (curr_create_type == m_create_type.base_filament_preset) {
get_filament_presets_by_machine();
}
m_scrolled_preset_panel->SetSizerAndFit(m_scrolled_sizer);
Layout();
Fit();
if (this->GetSize().GetHeight() > 900) {
this->SetSize(-1, 900);
}
e.Skip();
});
@ -689,11 +722,15 @@ wxBoxSizer *CreateFilamentPresetDialog::create_filament_preset_item()
} else {
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " not find filament id corresponding to the type: and the type is" << filament_type;
}
m_scrolled_preset_panel->SetSizerAndFit(m_scrolled_sizer);
m_filament_preset_panel->Thaw();
Layout();
Fit();
Refresh();
if (this->GetSize().GetHeight() > 900) {
this->SetSize(-1, 900);
}
e.Skip();
});
@ -713,20 +750,15 @@ wxBoxSizer *CreateFilamentPresetDialog::create_filament_preset_item()
wxBoxSizer *CreateFilamentPresetDialog::create_filament_preset_for_printer_item()
{
wxBoxSizer *vertical_sizer = new wxBoxSizer(wxVERTICAL);
wxBoxSizer * optionSizer = new wxBoxSizer(wxVERTICAL);
wxStaticText *static_filament_preset_text = new wxStaticText(this, wxID_ANY, _L("We could create the filament presets for your following printer:"), wxDefaultPosition, wxDefaultSize);
optionSizer->Add(static_filament_preset_text, 0, wxEXPAND | wxALL, 0);
m_filament_preset_panel = new wxPanel(this, wxID_ANY);
wxStaticText *static_filament_preset_text = new wxStaticText(m_scrolled_preset_panel, wxID_ANY, _L("We could create the filament presets for your following printer:"),
wxDefaultPosition, wxDefaultSize);
vertical_sizer->Add(static_filament_preset_text, 0, wxEXPAND | wxALL, 0);
m_filament_preset_panel = new wxPanel(m_scrolled_preset_panel, wxID_ANY);
m_filament_preset_panel->SetBackgroundColour(PRINTER_LIST_COLOUR);
//m_filament_preset_panel->SetMinSize(PRINTER_LIST_SIZE);
m_filament_preset_panel->SetSize(PRINTER_LIST_SIZE);
m_filament_presets_sizer = new wxGridSizer(3, FromDIP(5), FromDIP(5));
m_filament_preset_panel->SetSizer(m_filament_presets_sizer);
optionSizer->Add(m_filament_preset_panel, 0, wxEXPAND | wxTOP | wxALIGN_CENTER_HORIZONTAL, FromDIP(5));
vertical_sizer->Add(optionSizer, 0, wxEXPAND | wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(10));
vertical_sizer->Add(m_filament_preset_panel, 0, wxEXPAND | wxTOP | wxALIGN_CENTER_HORIZONTAL, FromDIP(5));
return vertical_sizer;
}
@ -739,7 +771,7 @@ wxBoxSizer *CreateFilamentPresetDialog::create_button_item()
StateColor btn_bg_green(std::pair<wxColour, int>(wxColour(27, 136, 68), StateColor::Pressed), std::pair<wxColour, int>(wxColour(61, 203, 115), StateColor::Hovered),
std::pair<wxColour, int>(wxColour(0, 174, 66), StateColor::Normal));
m_button_create = new Button(this, _L("Create"));
m_button_create = new Button(m_scrolled_preset_panel, _L("Create"));
m_button_create->SetBackgroundColor(btn_bg_green);
m_button_create->SetBorderColor(*wxWHITE);
m_button_create->SetTextColor(wxColour(0xFFFFFE));
@ -792,6 +824,13 @@ wxBoxSizer *CreateFilamentPresetDialog::create_button_item()
serial_name = into_u8(serial_str);
}
if (!is_check_box_selected()) {
MessageDialog dlg(this, _L("You have not selected a printer or preset yet. Please select at least one."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"),
wxYES | wxYES_DEFAULT | wxCENTRE);
dlg.ShowModal();
return;
}
std::string filament_preset_name = vendor_name + " " + type_name + " " + serial_name;
std::string user_filament_id = get_filament_id(filament_preset_name);
@ -838,18 +877,19 @@ wxBoxSizer *CreateFilamentPresetDialog::create_button_item()
BOOST_LOG_TRIVIAL(info) << "clone filament presets have failures rewritten is successful? " << res;
}
}
BOOST_LOG_TRIVIAL(info) << "clone filament presets no failures is successful? " << res;
BOOST_LOG_TRIVIAL(info) << "clone filament presets no failures is successful? " << res << " old preset is: " << checked_preset->name
<< " compatible_printer_name is: " << compatible_printer_name;
}
}
}
preset_bundle->update_compatible(PresetSelectCompatibleType::Always);
EndModal(wxID_OK);
});
StateColor btn_bg_white(std::pair<wxColour, int>(wxColour(206, 206, 206), StateColor::Pressed), std::pair<wxColour, int>(wxColour(238, 238, 238), StateColor::Hovered),
std::pair<wxColour, int>(*wxWHITE, StateColor::Normal));
m_button_cancel = new Button(this, _L("Cancel"));
m_button_cancel = new Button(m_scrolled_preset_panel, _L("Cancel"));
m_button_cancel->SetBackgroundColor(btn_bg_white);
m_button_cancel->SetBorderColor(wxColour(38, 46, 48));
m_button_cancel->SetFont(Label::Body_12);
@ -943,33 +983,37 @@ void CreateFilamentPresetDialog::select_curr_radiobox(std::vector<std::pair<Radi
if (i == btn_idx) {
radiobox_list[i].first->SetValue(true);
const wxString &curr_selected_type = radiobox_list[i].second;
this->Freeze();
if (curr_selected_type == m_create_type.base_filament) {
m_filament_preset_combobox->Show();
if (_L("Select Type") != m_filament_type_combobox->GetLabel()) {
this->Freeze();
clear_filament_preset_map();
wxArrayString filament_preset_choice = get_filament_preset_choices();
m_filament_preset_combobox->Set(filament_preset_choice);
m_filament_preset_combobox->SetLabel(_L("Select Filament Preset"));
m_filament_preset_combobox->SetLabelColor(DEFAULT_PROMPT_TEXT_COLOUR);
this->Thaw();
}
} else if (curr_selected_type == m_create_type.base_filament_preset) {
m_filament_preset_combobox->Hide();
if (_L("Select Type") != m_filament_type_combobox->GetLabel()) {
this->Freeze();
clear_filament_preset_map();
get_filament_presets_by_machine();
this->Thaw();
}
}
Fit();
Layout();
Refresh();
m_scrolled_preset_panel->SetSizerAndFit(m_scrolled_sizer);
this->Thaw();
} else {
radiobox_list[i].first->SetValue(false);
}
}
Layout();
Fit();
Refresh();
if (this->GetSize().GetHeight() > 900) {
this->SetSize(-1, 900);
}
}
wxString CreateFilamentPresetDialog::curr_create_filament_type()
@ -3941,17 +3985,25 @@ void CreatePresetForPrinterDialog::get_visible_printer_and_compatible_filament_p
m_printer_compatible_filament_presets.clear();
for (const Preset &printer_preset : printer_presets) {
if (printer_preset.is_visible) {
if (m_preset_bundle->printers.get_preset_base(printer_preset) != &printer_preset) continue;
if (m_preset_bundle->printers.select_preset_by_name(printer_preset.name, false)) {
m_preset_bundle->update_compatible(PresetSelectCompatibleType::Always);
const std::deque<Preset> &filament_presets = m_preset_bundle->filaments.get_presets();
for (const Preset &filament_preset : filament_presets) {
if ("Default Filament" == filament_preset.name) continue;
auto filament_types = dynamic_cast<ConfigOptionStrings *>(const_cast<Preset*>(&filament_preset)->config.option("filament_type"));
if (filament_preset.is_default || !filament_preset.is_compatible) continue;
ConfigOptionStrings *filament_types;
const Preset * filament_preset_base = m_preset_bundle->filaments.get_preset_base(filament_preset);
if (filament_preset_base == &filament_preset) {
filament_types = dynamic_cast<ConfigOptionStrings *>(const_cast<Preset *>(&filament_preset)->config.option("filament_type"));
} else {
filament_types = dynamic_cast<ConfigOptionStrings *>(const_cast<Preset *>(filament_preset_base)->config.option("filament_type"));
}
if (filament_types && filament_types->values.empty()) continue;
const std::string filament_type = filament_types->values[0];
if (filament_type != m_filament_type) continue;
if (filament_preset.is_compatible) {
m_printer_compatible_filament_presets[std::make_shared<Preset>(printer_preset)].push_back(std::make_shared<Preset>(filament_preset));
//if (filament_type != m_filament_type) continue;
if (filament_type == m_filament_type) {
m_printer_compatible_filament_presets[printer_preset.name].push_back(std::make_shared<Preset>(filament_preset));
}
}
}
@ -3966,21 +4018,19 @@ wxBoxSizer *CreatePresetForPrinterDialog::create_selected_printer_preset_sizer()
select_preseter_preset_sizer->Add(printer_text, 0, wxEXPAND | wxALL, 0);
m_selected_printer = new ComboBox(this, wxID_ANY, wxEmptyString, wxDefaultPosition, PRINTER_PRESET_MODEL_SIZE, 0, nullptr, wxCB_READONLY);
select_preseter_preset_sizer->Add(m_selected_printer, 0, wxEXPAND | wxTOP, FromDIP(5));
wxArrayString printer_choices;
for (std::pair<std::shared_ptr<Preset>, std::vector<std::shared_ptr<Preset>>> printer_to_filament_presets : m_printer_compatible_filament_presets) {
std::shared_ptr<Preset> printer_preset = printer_to_filament_presets.first;
auto compatible_printer_name = printer_preset->name;
for (std::pair<std::string, std::vector<std::shared_ptr<Preset>>> printer_to_filament_presets : m_printer_compatible_filament_presets) {
auto compatible_printer_name = printer_to_filament_presets.first;
if (compatible_printer_name.empty()) {
BOOST_LOG_TRIVIAL(info)<<__FUNCTION__ << " a printer has no name and the preset name is: " << printer_preset->name;
BOOST_LOG_TRIVIAL(info)<<__FUNCTION__ << " a printer has no name";
continue;
}
wxString printer_name = wxString::FromUTF8(compatible_printer_name);
printer_choice_to_printer_preset[printer_name] = printer_preset;
wxString printer_name = from_u8(compatible_printer_name);
printer_choices.push_back(printer_name);
}
m_selected_printer->Set(printer_choices);
return select_preseter_preset_sizer;
}
@ -3994,27 +4044,20 @@ wxBoxSizer *CreatePresetForPrinterDialog::create_selected_filament_preset_sizer(
m_selected_printer->Bind(wxEVT_COMBOBOX, [this](wxCommandEvent &e) {
wxString printer_name = m_selected_printer->GetStringSelection();
std::unordered_map<wxString, std::shared_ptr<Preset>>::iterator iter = printer_choice_to_printer_preset.find(printer_name);
if (printer_choice_to_printer_preset.end() != iter) {
std::unordered_map<std::shared_ptr<Preset>, std::vector<std::shared_ptr<Preset>>>::iterator filament_iter = m_printer_compatible_filament_presets.find(iter->second);
if (m_printer_compatible_filament_presets.end() != filament_iter) {
filament_choice_to_filament_preset.clear();
wxArrayString filament_choices;
for (std::shared_ptr<Preset> filament_preset : filament_iter->second) {
wxString filament_name = wxString::FromUTF8(filament_preset->name);
filament_choice_to_filament_preset[filament_name] = filament_preset;
filament_choices.push_back(filament_name);
}
m_selected_filament->Set(filament_choices);
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " count of compatible filament presets :" << filament_choices.size();
if (filament_choices.size()) {
m_selected_filament->SetSelection(0);
}
} else {
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "printer preset not find compatible filament presets";
std::unordered_map<string, std::vector<std::shared_ptr<Preset>>>::iterator filament_iter = m_printer_compatible_filament_presets.find(into_u8(printer_name));
if (m_printer_compatible_filament_presets.end() != filament_iter) {
filament_choice_to_filament_preset.clear();
wxArrayString filament_choices;
for (std::shared_ptr<Preset> filament_preset : filament_iter->second) {
wxString filament_name = wxString::FromUTF8(filament_preset->name);
filament_choice_to_filament_preset[filament_name] = filament_preset;
filament_choices.push_back(filament_name);
}
m_selected_filament->Set(filament_choices);
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " count of compatible filament presets :" << filament_choices.size();
if (filament_choices.size()) { m_selected_filament->SetSelection(0); }
} else {
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "printer choice not find printer preset";
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "printer preset not find compatible filament presets";
}
});
@ -4054,20 +4097,11 @@ wxBoxSizer *CreatePresetForPrinterDialog::create_button_sizer()
m_ok_btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent &e) {
wxString selected_printer_name = m_selected_printer->GetStringSelection();
std::shared_ptr<Preset> printer_preset = printer_choice_to_printer_preset[selected_printer_name];
std::string printer_name = into_u8(selected_printer_name);
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " add preset: get compatible printer name:";
auto compatible_printer_name = printer_preset->name;
if (compatible_printer_name.empty()) {
BOOST_LOG_TRIVIAL(info) << " add preset: selected printer has no name";
MessageDialog dlg(this, _L("The printer preset you selected does not have a name, please reselect it"), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES | wxYES_DEFAULT | wxCENTRE);
dlg.ShowModal();
return;
}
std::string printer_name = compatible_printer_name;
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " add preset: get compatible printer name:";
wxString filament_preset_name = m_selected_filament->GetStringSelection();
std::unordered_map<wxString, std::shared_ptr<Preset>>::iterator iter = filament_choice_to_filament_preset.find(filament_preset_name);
wxString filament_preset_name = m_selected_filament->GetStringSelection();
std::unordered_map<wxString, std::shared_ptr<Preset>>::iterator iter = filament_choice_to_filament_preset.find(filament_preset_name);
if (filament_choice_to_filament_preset.end() != iter) {
std::shared_ptr<Preset> filament_preset = iter->second;
PresetBundle * preset_bundle = wxGetApp().preset_bundle;

View File

@ -40,6 +40,7 @@ protected:
protected:
void on_dpi_changed(const wxRect &suggested_rect) override;
bool is_check_box_selected();
wxBoxSizer *create_item(FilamentOptionType option_type);
wxBoxSizer *create_vendor_item();
wxBoxSizer *create_type_item();
@ -81,7 +82,9 @@ private:
TextInput * m_filament_custom_vendor_input = nullptr;
wxGridSizer * m_filament_presets_sizer = nullptr;
wxPanel * m_filament_preset_panel = nullptr;
wxScrolledWindow * m_scrolled_preset_panel = nullptr;
TextInput * m_filament_serial_input = nullptr;
wxBoxSizer * m_scrolled_sizer = nullptr;
};
@ -306,9 +309,8 @@ private:
ComboBox * m_selected_filament = nullptr;
Button * m_ok_btn = nullptr;
Button * m_cancel_btn = nullptr;
std::unordered_map<wxString, std::shared_ptr<Preset>> printer_choice_to_printer_preset;
std::unordered_map<wxString, std::shared_ptr<Preset>> filament_choice_to_filament_preset;
std::unordered_map<std::shared_ptr<Preset>, std::vector<std::shared_ptr<Preset>>> m_printer_compatible_filament_presets;//need be used when add presets
std::unordered_map<std::string, std::vector<std::shared_ptr<Preset>>> m_printer_compatible_filament_presets; // need be used when add presets
};