#include "calib_dlg.hpp" #include "GUI_App.hpp" #include "MsgDialog.hpp" #include "I18N.hpp" #include #include "MainFrame.hpp" #include namespace Slic3r { namespace GUI { wxBoxSizer *create_item_checkbox(wxString title, wxWindow *parent, bool *value, CheckBoxInWT *&checkbox) { wxBoxSizer* m_sizer_checkbox = new wxBoxSizer(wxHORIZONTAL); m_sizer_checkbox->Add(0, 0, 0, wxEXPAND | wxLEFT, 5); checkbox = new ::CheckBoxInWT(parent); m_sizer_checkbox->Add(checkbox, 0, wxALIGN_CENTER, 0); m_sizer_checkbox->Add(0, 0, 0, wxEXPAND | wxLEFT, 8); auto checkbox_title = new wxStaticText(parent, wxID_ANY, title, wxDefaultPosition, wxSize(-1, -1), 0); checkbox_title->SetForegroundColour(wxColour(144, 144, 144)); checkbox_title->SetFont(::Label::Body_13); checkbox_title->Wrap(-1); m_sizer_checkbox->Add(checkbox_title, 0, wxALIGN_CENTER | wxALL, 3); checkbox->SetValue(true); checkbox->Bind(wxEVT_TOGGLEBUTTON, [parent, checkbox, value](wxCommandEvent& e) { (*value) = (*value) ? false : true; e.Skip(); }); return m_sizer_checkbox; } FRF_Calibration_Dlg::FRF_Calibration_Dlg(wxWindow* parent, wxWindowID id, Plater* plater) : DPIDialog(parent, id, _L("Flowrate Fine Calibration"), wxDefaultPosition, parent->FromDIP(wxSize(-1, 280)), wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER), m_plater(plater) { wxBoxSizer* v_sizer = new wxBoxSizer(wxVERTICAL); SetSizer(v_sizer); // Settings auto filament_config = &wxGetApp().preset_bundle->filaments.get_edited_preset().config; wxString start_length_str = _L("Extrusion Multiplier: "); auto text_size = wxWindow::GetTextExtent(start_length_str); text_size.x = text_size.x * 1.5; auto st_size = FromDIP(wxSize(text_size.x, -1)); auto ti_size = FromDIP(wxSize(90, -1)); auto desc_size = FromDIP(wxSize(300, -1)); // extru auto multip = filament_config->opt_float("extrusion_multiplier",0); std::string multip_str = std::to_string(multip); if (multip_str.find(".") > 0) { size_t fp = multip_str.rfind("."); size_t f = multip_str.rfind("0"); while (f > fp) { if (f != -1) { multip_str = multip_str.erase(f); } f = multip_str.rfind("0"); } fp = multip_str.rfind("."); if (fp == multip_str.size() - 1) { multip_str = multip_str.erase(fp); } } auto start_length_sizer = new wxBoxSizer(wxHORIZONTAL); auto start_length_text = new wxStaticText(this, wxID_ANY, start_length_str, wxDefaultPosition, st_size, wxALIGN_LEFT); m_tiExtru = new TextInput(this, multip_str, "", "", wxDefaultPosition, ti_size, wxTE_CENTRE); m_tiExtru->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC)); // desc auto setting_desc = new wxStaticText(this, wxID_ANY, _u8L("Please input the best value from the coarse calibration to further determine a more accurate extrusion multiplier."), wxDefaultPosition, desc_size, wxALIGN_LEFT); setting_desc->Wrap(setting_desc->GetClientSize().x); // delay start_length_sizer->Add(start_length_text, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2); start_length_sizer->Add(m_tiExtru, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2); v_sizer->Add(0, FromDIP(10), 0, wxEXPAND, 5); v_sizer->Add(setting_desc, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2); v_sizer->Add(start_length_sizer); v_sizer->Add(0, FromDIP(10), 0, wxEXPAND, 5); m_btnStart = new Button(this, _L("OK")); StateColor btn_bg_blue(std::pair(wxColour(51, 91, 188), StateColor::Pressed), std::pair(wxColour(51, 109, 251), StateColor::Hovered), std::pair(wxColour(68, 121, 251), StateColor::Normal)); m_btnStart->SetBackgroundColor(btn_bg_blue); m_btnStart->SetBorderColor(wxColour(68, 121, 251)); m_btnStart->SetTextColor(wxColour("#FFFFFE")); m_btnStart->SetSize(wxSize(FromDIP(48), FromDIP(24))); m_btnStart->SetMinSize(wxSize(FromDIP(48), FromDIP(24))); m_btnStart->SetCornerRadius(FromDIP(3)); m_btnStart->Bind(wxEVT_BUTTON, &FRF_Calibration_Dlg::on_start, this); v_sizer->Add(m_btnStart, 0, wxALL | wxALIGN_RIGHT, FromDIP(5)); m_btnStart->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(FRF_Calibration_Dlg::on_start), NULL, this); //wxGetApp().UpdateDlgDarkUI(this); Layout(); Fit(); } FRF_Calibration_Dlg::~FRF_Calibration_Dlg() { // Disconnect Events m_btnStart->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(FRF_Calibration_Dlg::on_start), NULL, this); } void FRF_Calibration_Dlg::on_start(wxCommandEvent& event) { bool read_double = false; read_double = m_tiExtru->GetTextCtrl()->GetValue().ToDouble(&m_params.start); if (!read_double || m_params.start < 0.9) { MessageDialog msg_dlg(nullptr, _L("Please input valid values:\n 0.9 <= Extrusion Multiplier <= 1.1\n"), wxEmptyString, wxICON_WARNING | wxOK); msg_dlg.ShowModal(); m_tiExtru->GetTextCtrl()->SetValue("0.9"); return; } else if (!read_double || m_params.start > 1.1) { MessageDialog msg_dlg(nullptr, _L("Please input valid values:\n 0.9 <= Extrusion Multiplier <= 1.1\n"), wxEmptyString, wxICON_WARNING | wxOK); msg_dlg.ShowModal(); m_tiExtru->GetTextCtrl()->SetValue("1.1"); return; } m_params.mode = CalibMode::Calib_FRF; m_plater->calib_flowrate_fine(m_params); EndModal(wxID_OK); } void FRF_Calibration_Dlg::on_dpi_changed(const wxRect& suggested_rect) { this->Refresh(); Fit(); } PA_Calibration_Dlg::PA_Calibration_Dlg(wxWindow* parent, wxWindowID id, Plater* plater) : DPIDialog(parent, id, _L("Pressure Advance Calibration"), wxDefaultPosition, parent->FromDIP(wxSize(-1, 280)), wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER), m_plater(plater) { wxBoxSizer* v_sizer = new wxBoxSizer(wxVERTICAL); SetSizer(v_sizer); wxBoxSizer* choice_sizer = new wxBoxSizer(wxHORIZONTAL); choice_sizer->Add(FromDIP(5), 0, 0, wxEXPAND, 5); wxString m_rbMethodChoices[] = { _L("PA Line"), _L("PA Pattern"), _L("PA Tower") }; int m_rbMethodNChoices = sizeof(m_rbMethodChoices) / sizeof(wxString); m_rbMethod = new wxRadioBox(this, wxID_ANY, _L("Method"), wxDefaultPosition, wxDefaultSize, m_rbMethodNChoices, m_rbMethodChoices, 1, wxRA_SPECIFY_COLS); m_rbMethod->SetSelection(0); choice_sizer->Add(m_rbMethod, 0, wxALL, 5); v_sizer->Add(choice_sizer); // Settings // wxString start_pa_str = _L("Start PA: "); wxString end_pa_str = _L("End PA: "); wxString PA_step_str = _L("PA step: "); auto text_size = wxWindow::GetTextExtent(start_pa_str); text_size.IncTo(wxWindow::GetTextExtent(end_pa_str)); text_size.IncTo(wxWindow::GetTextExtent(PA_step_str)); text_size.x = text_size.x * 1.5; wxStaticBoxSizer* settings_sizer = new wxStaticBoxSizer(wxVERTICAL, this, _L("Settings")); auto st_size = FromDIP(wxSize(text_size.x, -1)); auto ti_size = FromDIP(wxSize(90, -1)); // start PA auto start_PA_sizer = new wxBoxSizer(wxHORIZONTAL); auto start_pa_text = new wxStaticText(this, wxID_ANY, start_pa_str, wxDefaultPosition, st_size, wxALIGN_LEFT); m_tiStartPA = new TextInput(this, "", "", "", wxDefaultPosition, ti_size, wxTE_CENTRE | wxTE_PROCESS_ENTER); m_tiStartPA->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC)); start_PA_sizer->Add(start_pa_text, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2); start_PA_sizer->Add(m_tiStartPA, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2); settings_sizer->Add(start_PA_sizer); // end PA auto end_PA_sizer = new wxBoxSizer(wxHORIZONTAL); auto end_pa_text = new wxStaticText(this, wxID_ANY, end_pa_str, wxDefaultPosition, st_size, wxALIGN_LEFT); m_tiEndPA = new TextInput(this, "", "", "", wxDefaultPosition, ti_size, wxTE_CENTRE | wxTE_PROCESS_ENTER); m_tiStartPA->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC)); end_PA_sizer->Add(end_pa_text, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2); end_PA_sizer->Add(m_tiEndPA, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2); settings_sizer->Add(end_PA_sizer); // PA step auto PA_step_sizer = new wxBoxSizer(wxHORIZONTAL); auto PA_step_text = new wxStaticText(this, wxID_ANY, PA_step_str, wxDefaultPosition, st_size, wxALIGN_LEFT); m_tiPAStep = new TextInput(this, "", "", "", wxDefaultPosition, ti_size, wxTE_CENTRE | wxTE_PROCESS_ENTER); m_tiStartPA->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC)); PA_step_sizer->Add(PA_step_text, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2); PA_step_sizer->Add(m_tiPAStep, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2); settings_sizer->Add(PA_step_sizer); v_sizer->Add(settings_sizer); v_sizer->Add(0, FromDIP(10), 0, wxEXPAND, 5); m_btnStart = new Button(this, _L("OK")); StateColor btn_bg_green(std::pair(wxColour(51, 91, 188), StateColor::Pressed), std::pair(wxColour(51, 109, 251), StateColor::Hovered), std::pair(wxColour(68, 121, 251), StateColor::Normal)); m_btnStart->SetBackgroundColor(btn_bg_green); m_btnStart->SetBorderColor(wxColour(0, 150, 136)); m_btnStart->SetTextColor(wxColour("#FFFFFE")); m_btnStart->SetSize(wxSize(FromDIP(48), FromDIP(24))); m_btnStart->SetMinSize(wxSize(FromDIP(48), FromDIP(24))); m_btnStart->SetCornerRadius(FromDIP(3)); m_btnStart->Bind(wxEVT_BUTTON, &PA_Calibration_Dlg::on_start, this); v_sizer->Add(m_btnStart, 0, wxALL | wxALIGN_RIGHT, FromDIP(5)); PA_Calibration_Dlg::reset_params(); // Connect Events m_rbMethod->Connect(wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler(PA_Calibration_Dlg::on_method_changed), NULL, this); this->Connect(wxEVT_SHOW, wxShowEventHandler(PA_Calibration_Dlg::on_show)); Layout(); Fit(); } PA_Calibration_Dlg::~PA_Calibration_Dlg() { // Disconnect Events m_rbMethod->Disconnect(wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler(PA_Calibration_Dlg::on_method_changed), NULL, this); m_btnStart->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(PA_Calibration_Dlg::on_start), NULL, this); } void PA_Calibration_Dlg::reset_params() { int method = m_rbMethod->GetSelection(); m_tiStartPA->GetTextCtrl()->SetValue(wxString::FromDouble(0.0)); switch (method) { case 1: m_params.mode = CalibMode::Calib_PA_Pattern; m_tiEndPA->GetTextCtrl()->SetValue(wxString::FromDouble(0.08)); m_tiPAStep->GetTextCtrl()->SetValue(wxString::FromDouble(0.005)); break; case 2: m_params.mode = CalibMode::Calib_PA_Tower; m_tiEndPA->GetTextCtrl()->SetValue(wxString::FromDouble(0.1)); m_tiPAStep->GetTextCtrl()->SetValue(wxString::FromDouble(0.002)); break; default: m_params.mode = CalibMode::Calib_PA_Line; m_tiEndPA->GetTextCtrl()->SetValue(wxString::FromDouble(0.1)); m_tiPAStep->GetTextCtrl()->SetValue(wxString::FromDouble(0.002)); break; } } void PA_Calibration_Dlg::on_start(wxCommandEvent& event) { bool read_double = false; read_double = m_tiStartPA->GetTextCtrl()->GetValue().ToDouble(&m_params.start); read_double = read_double && m_tiEndPA->GetTextCtrl()->GetValue().ToDouble(&m_params.end); read_double = read_double && m_tiPAStep->GetTextCtrl()->GetValue().ToDouble(&m_params.step); if (!read_double || m_params.start < 0 || m_params.step < EPSILON || m_params.end < m_params.start + m_params.step) { MessageDialog msg_dlg(nullptr, _L("Please input valid values:\nStart PA: >= 0.0\nEnd PA: > Start PA\nPA step: >= 0.001)"), wxEmptyString, wxICON_WARNING | wxOK); msg_dlg.ShowModal(); return; } switch (m_rbMethod->GetSelection()) { case 1: m_params.mode = CalibMode::Calib_PA_Pattern; break; case 2: m_params.mode = CalibMode::Calib_PA_Tower; break; default: m_params.mode = CalibMode::Calib_PA_Line; } m_plater->calib_pa(m_rbMethod->GetSelection(), m_tiStartPA->GetTextCtrl()->GetValue(), m_tiEndPA->GetTextCtrl()->GetValue(), m_tiPAStep->GetTextCtrl()->GetValue()); EndModal(wxID_OK); } void PA_Calibration_Dlg::on_method_changed(wxCommandEvent& event) { PA_Calibration_Dlg::reset_params(); event.Skip(); } void PA_Calibration_Dlg::on_dpi_changed(const wxRect& suggested_rect) { this->Refresh(); Fit(); } void PA_Calibration_Dlg::on_show(wxShowEvent& event) { PA_Calibration_Dlg::reset_params(); } }} // namespace Slic3r::GUI