diff --git a/resources/images/cali_page_after_flow.png b/resources/images/cali_page_after_flow.png
new file mode 100644
index 0000000000..5ce6761771
Binary files /dev/null and b/resources/images/cali_page_after_flow.png differ
diff --git a/resources/images/cali_page_after_pa.png b/resources/images/cali_page_after_pa.png
new file mode 100644
index 0000000000..4bf3655fe4
Binary files /dev/null and b/resources/images/cali_page_after_pa.png differ
diff --git a/resources/images/cali_page_before_flow.png b/resources/images/cali_page_before_flow.png
new file mode 100644
index 0000000000..80e01aa204
Binary files /dev/null and b/resources/images/cali_page_before_flow.png differ
diff --git a/resources/images/cali_page_before_pa.png b/resources/images/cali_page_before_pa.png
new file mode 100644
index 0000000000..2e52dd064b
Binary files /dev/null and b/resources/images/cali_page_before_pa.png differ
diff --git a/resources/images/cali_page_caption_help.svg b/resources/images/cali_page_caption_help.svg
new file mode 100644
index 0000000000..70babeb017
--- /dev/null
+++ b/resources/images/cali_page_caption_help.svg
@@ -0,0 +1,4 @@
+
diff --git a/resources/images/cali_page_caption_help_hover.svg b/resources/images/cali_page_caption_help_hover.svg
new file mode 100644
index 0000000000..70babeb017
--- /dev/null
+++ b/resources/images/cali_page_caption_help_hover.svg
@@ -0,0 +1,4 @@
+
diff --git a/resources/images/cali_page_caption_prev.svg b/resources/images/cali_page_caption_prev.svg
new file mode 100644
index 0000000000..b34eca2cc1
--- /dev/null
+++ b/resources/images/cali_page_caption_prev.svg
@@ -0,0 +1,3 @@
+
diff --git a/resources/images/cali_page_caption_prev_hover.svg b/resources/images/cali_page_caption_prev_hover.svg
new file mode 100644
index 0000000000..b34eca2cc1
--- /dev/null
+++ b/resources/images/cali_page_caption_prev_hover.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/libslic3r/Calib.hpp b/src/libslic3r/Calib.hpp
index a18840ae4d..a519dc4808 100644
--- a/src/libslic3r/Calib.hpp
+++ b/src/libslic3r/Calib.hpp
@@ -32,11 +32,8 @@ struct PrinterCaliInfo
std::string dev_id;
CalibMode mode;
CalibState state;
- //std::string filament_preset;
- //std::vector tray_ids;
+ /* tray index -> filament preset name */
std::map filament_presets;
- //float nozzle_dia;
- //int bed_type;
};
struct Calib_Params
diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt
index 12a0591d02..42d5d76289 100644
--- a/src/slic3r/CMakeLists.txt
+++ b/src/slic3r/CMakeLists.txt
@@ -392,14 +392,22 @@ set(SLIC3R_GUI_SOURCES
GUI/ReleaseNote.cpp
GUI/SingleChoiceDialog.hpp
GUI/SingleChoiceDialog.cpp
+ GUI/CaliHistoryDialog.hpp
+ GUI/CaliHistoryDialog.cpp
GUI/CalibrationPanel.hpp
GUI/CalibrationPanel.cpp
GUI/CalibrationWizard.hpp
GUI/CalibrationWizard.cpp
- GUI/EditCalibrationHistoryDialog.cpp
- GUI/EditCalibrationHistoryDialog.hpp
GUI/CalibrationWizardPage.cpp
GUI/CalibrationWizardPage.hpp
+ GUI/CalibrationWizardStartPage.cpp
+ GUI/CalibrationWizardStartPage.hpp
+ GUI/CalibrationWizardPresetPage.cpp
+ GUI/CalibrationWizardPresetPage.hpp
+ GUI/CalibrationWizardCaliPage.cpp
+ GUI/CalibrationWizardCaliPage.hpp
+ GUI/CalibrationWizardSavePage.cpp
+ GUI/CalibrationWizardSavePage.hpp
GUI/calib_dlg.cpp
GUI/calib_dlg.hpp
GUI/Calibration.hpp
diff --git a/src/slic3r/GUI/CaliHistoryDialog.cpp b/src/slic3r/GUI/CaliHistoryDialog.cpp
new file mode 100644
index 0000000000..cc3b8ca5af
--- /dev/null
+++ b/src/slic3r/GUI/CaliHistoryDialog.cpp
@@ -0,0 +1,421 @@
+#include "CaliHistoryDialog.hpp"
+#include "I18N.hpp"
+
+#include "libslic3r/Utils.hpp"
+#include "GUI.hpp"
+#include "GUI_App.hpp"
+#include "format.hpp"
+#include "MsgDialog.hpp"
+#include "slic3r/Utils/CalibUtils.hpp"
+
+namespace Slic3r {
+namespace GUI {
+
+
+#define HISTORY_WINDOW_SIZE wxSize(FromDIP(600), FromDIP(450))
+#define EDIT_HISTORY_DIALOG_INPUT_SIZE wxSize(FromDIP(160), FromDIP(24))
+#define HISTORY_WINDOW_ITEMS_COUNT 4
+
+HistoryWindow::HistoryWindow(wxWindow* parent, const std::vector& calib_results_history)
+ : DPIDialog(parent, wxID_ANY, _L("Pressure Advance Calibration Result"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE)
+ , m_calib_results_history(calib_results_history)
+{
+ this->SetBackgroundColour(*wxWHITE);
+ auto main_sizer = new wxBoxSizer(wxVERTICAL);
+
+ auto scroll_window = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL | wxVSCROLL);
+ scroll_window->SetScrollRate(5, 5);
+ scroll_window->SetBackgroundColour(*wxWHITE);
+
+ auto scroll_sizer = new wxBoxSizer(wxVERTICAL);
+ scroll_window->SetSizer(scroll_sizer);
+
+ wxPanel* comboBox_panel = new wxPanel(scroll_window);
+ comboBox_panel->SetBackgroundColour(wxColour(238, 238, 238));
+ auto comboBox_sizer = new wxBoxSizer(wxVERTICAL);
+ comboBox_panel->SetSizer(comboBox_sizer);
+ comboBox_sizer->AddSpacer(10);
+
+ auto nozzle_dia_title = new wxStaticText(comboBox_panel, wxID_ANY, _L("Nozzle Diameter"));
+ nozzle_dia_title->SetFont(Label::Head_14);
+ comboBox_sizer->Add(nozzle_dia_title, 0, wxLEFT | wxRIGHT, FromDIP(15));
+ comboBox_sizer->AddSpacer(10);
+
+ m_comboBox_nozzle_dia = new ComboBox(comboBox_panel, wxID_ANY, "", wxDefaultPosition, wxSize(FromDIP(500), FromDIP(24)), 0, nullptr, wxCB_READONLY);
+ comboBox_sizer->Add(m_comboBox_nozzle_dia, 0, wxLEFT | wxRIGHT, FromDIP(15));
+ comboBox_sizer->AddSpacer(10);
+
+ scroll_sizer->Add(comboBox_panel);
+
+ scroll_sizer->AddSpacer(FromDIP(15));
+
+ wxPanel* tips_panel = new wxPanel(scroll_window, wxID_ANY);
+ auto tips_sizer = new wxBoxSizer(wxVERTICAL);
+ tips_panel->SetSizer(tips_sizer);
+ m_tips = new wxStaticText(tips_panel, wxID_ANY, "");
+ m_tips->SetForegroundColour({ 145, 145, 145 });
+ tips_sizer->Add(m_tips, 0, wxEXPAND);
+
+ scroll_sizer->Add(tips_panel, 0, wxEXPAND);
+
+ scroll_sizer->AddSpacer(FromDIP(15));
+
+ m_history_data_panel = new wxPanel(scroll_window);
+
+ scroll_sizer->Add(m_history_data_panel, 1, wxEXPAND);
+
+ main_sizer->Add(scroll_window, 1, wxEXPAND | wxALL, FromDIP(10));
+ SetSizer(main_sizer);
+ main_sizer->Fit(this);
+ SetMinSize(HISTORY_WINDOW_SIZE);
+ SetSize(HISTORY_WINDOW_SIZE);
+ CenterOnParent();
+
+ wxGetApp().UpdateDlgDarkUI(this);
+
+ m_comboBox_nozzle_dia->Bind(wxEVT_COMBOBOX, &HistoryWindow::on_select_nozzle, this);
+
+ m_refresh_timer = new wxTimer();
+ m_refresh_timer->SetOwner(this);
+ m_refresh_timer->Start(200);
+ Bind(wxEVT_TIMER, &HistoryWindow::on_timer, this);
+}
+
+HistoryWindow::~HistoryWindow()
+{
+ m_refresh_timer->Stop();
+}
+
+void HistoryWindow::sync_history_result(MachineObject* obj)
+{
+ BOOST_LOG_TRIVIAL(info) << "sync_history_result";
+
+ m_calib_results_history.clear();
+ if (obj)
+ m_calib_results_history = obj->pa_calib_tab;
+
+ if (m_calib_results_history.empty()) {
+ // for test
+ /*
+ std::vector temp_test;
+ PACalibResult test{ 0, 0, 0.0f, "test", "test", "test_name", 0.1f, 0.5f };
+ temp_test.push_back(test);
+ test.tray_id = 1;
+ temp_test.push_back(test);
+ test.tray_id = 2;
+ temp_test.push_back(test);
+ test.tray_id = 3;
+ temp_test.push_back(test);
+ m_calib_results_history = temp_test;
+ */
+ }
+
+ sync_history_data();
+
+ if (m_calib_results_history.empty()) {
+ m_tips->SetLabel(_L("No History Result"));
+ }
+ else {
+ m_tips->SetLabel("Success to get history result");
+ }
+ m_tips->Refresh();
+
+}
+
+void HistoryWindow::on_device_connected(MachineObject* obj)
+{
+ if (!obj) {
+ return;
+ }
+
+ curr_obj = obj;
+ // init nozzle value
+ static std::array nozzle_diameter_list = { 0.2f, 0.4f, 0.6f, 0.8f };
+ int selection = 1;
+ for (int i = 0; i < nozzle_diameter_list.size(); i++) {
+ m_comboBox_nozzle_dia->AppendString(wxString::Format("%1.1f mm", nozzle_diameter_list[i]));
+ if (abs(curr_obj->nozzle_diameter - nozzle_diameter_list[i]) < 1e-3) {
+ selection = i;
+ }
+ }
+ m_comboBox_nozzle_dia->SetSelection(selection);
+
+ // trigger on_select nozzle
+ wxCommandEvent evt(wxEVT_COMBOBOX);
+ evt.SetEventObject(m_comboBox_nozzle_dia);
+ wxPostEvent(m_comboBox_nozzle_dia, evt);
+}
+
+void HistoryWindow::on_timer(wxTimerEvent& event)
+{
+ update(curr_obj);
+}
+
+void HistoryWindow::update(MachineObject* obj)
+{
+ if (!obj) return;
+
+ if (obj->cali_version != history_version) {
+ if (obj->has_get_pa_calib_tab) {
+ history_version = obj->cali_version;
+ reqeust_history_result(obj);
+ }
+ }
+
+ // sync when history is not empty
+ if (obj->has_get_pa_calib_tab && m_calib_results_history.empty()) {
+ sync_history_result(curr_obj);
+ }
+}
+
+void HistoryWindow::on_select_nozzle(wxCommandEvent& evt)
+{
+ reqeust_history_result(curr_obj);
+
+}
+
+void HistoryWindow::reqeust_history_result(MachineObject* obj)
+{
+ if (curr_obj) {
+ curr_obj->reset_pa_cali_history_result();
+ sync_history_result(curr_obj);
+
+ float nozzle_value = get_nozzle_value();
+ if (nozzle_value > 0) {
+ CalibUtils::emit_get_PA_calib_infos(nozzle_value);
+ m_tips->SetLabel("Refreshing the historical pressure advance records");
+ BOOST_LOG_TRIVIAL(info) << "request calib history";
+ }
+ }
+}
+
+void HistoryWindow::sync_history_data() {
+ m_history_data_panel->DestroyChildren();
+ wxGridBagSizer* gbSizer;
+ gbSizer = new wxGridBagSizer(FromDIP(0), FromDIP(80));
+ gbSizer->SetFlexibleDirection(wxBOTH);
+ gbSizer->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
+
+ m_history_data_panel->SetSizer(gbSizer, true);
+
+ auto title_material = new wxStaticText(m_history_data_panel, wxID_ANY, _L("Material"));
+ title_material->SetFont(Label::Head_14);
+ gbSizer->Add(title_material, { 0, 0 }, { 1, 1 }, wxBOTTOM, FromDIP(15));
+
+ auto title_k = new wxStaticText(m_history_data_panel, wxID_ANY, _L("K"));
+ title_k->SetFont(Label::Head_14);
+ gbSizer->Add(title_k, { 0, 1 }, { 1, 1 }, wxBOTTOM, FromDIP(15));
+
+ // Hide
+ //auto title_n = new wxStaticText(m_history_data_panel, wxID_ANY, _L("N"));
+ //title_n->SetFont(Label::Head_14);
+ //gbSizer->Add(title_n, { 0, 2 }, { 1, 1 }, wxBOTTOM, FromDIP(15));
+
+ auto title_action = new wxStaticText(m_history_data_panel, wxID_ANY, _L("Action"));
+ title_action->SetFont(Label::Head_14);
+ gbSizer->Add(title_action, { 0, 2 }, { 1, 1 });
+
+ int i = 1;
+ for (auto& result : m_calib_results_history) {
+ wxString material_name = "";
+ material_name = result.name;
+ auto material_name_value = new wxStaticText(m_history_data_panel, wxID_ANY, material_name);
+ auto k_str = wxString::Format("%.3f", result.k_value);
+ auto n_str = wxString::Format("%.3f", result.n_coef);
+ auto k_value = new wxStaticText(m_history_data_panel, wxID_ANY, k_str);
+ auto n_value = new wxStaticText(m_history_data_panel, wxID_ANY, n_str);
+ n_value->Hide();
+ auto delete_button = new Button(m_history_data_panel, _L("Delete"));
+ delete_button->SetBackgroundColour(*wxWHITE);
+ delete_button->SetMinSize(wxSize(-1, FromDIP(24)));
+ delete_button->SetCornerRadius(FromDIP(12));
+ delete_button->Bind(wxEVT_BUTTON, [this, gbSizer, i, &result](auto& e) {
+ for (int j = 0; j < HISTORY_WINDOW_ITEMS_COUNT; j++) {
+ auto item = gbSizer->FindItemAtPosition({ i, j });
+ item->GetWindow()->Hide();
+ }
+ gbSizer->SetEmptyCellSize({ 0,0 });
+ m_history_data_panel->Layout();
+ m_history_data_panel->Fit();
+ CalibUtils::delete_PA_calib_result({ result.tray_id, result.cali_idx, result.nozzle_diameter, result.filament_id });
+ });
+
+ auto edit_button = new Button(m_history_data_panel, _L("Edit"));
+ StateColor btn_bg_green(std::pair(wxColour(27, 136, 68), StateColor::Pressed),
+ std::pair(wxColour(61, 203, 115), StateColor::Hovered),
+ std::pair(wxColour(0, 174, 66), StateColor::Normal));
+ edit_button->SetBackgroundColour(*wxWHITE);
+ edit_button->SetBackgroundColor(btn_bg_green);
+ edit_button->SetBorderColor(wxColour(0, 174, 66));
+ edit_button->SetTextColor(wxColour("#FFFFFE"));
+ edit_button->SetMinSize(wxSize(-1, FromDIP(24)));
+ edit_button->SetCornerRadius(FromDIP(12));
+ edit_button->Bind(wxEVT_BUTTON, [this, &result, k_value, material_name_value](auto& e) {
+ PACalibResult result_buffer = result;
+ result_buffer.k_value = stof(k_value->GetLabel().ToStdString());
+ result_buffer.name = material_name_value->GetLabel().ToStdString();
+ EditCalibrationHistoryDialog dlg(this, result_buffer);
+ if (dlg.ShowModal() == wxID_OK) {
+ auto new_result = dlg.get_result();
+
+ wxString new_k_str = wxString::Format("%.3f", new_result.k_value);
+ k_value->SetLabel(new_k_str);
+ material_name_value->SetLabel(new_result.name);
+
+ new_result.tray_id = -1;
+ CalibUtils::set_PA_calib_result({ new_result });
+
+ // TODO Re-request history and refresh page
+ //wxCommandEvent evt(wxEVT_COMBOBOX);
+ //evt.SetEventObject(m_comboBox_nozzle_dia);
+ //wxPostEvent(m_comboBox_nozzle_dia, evt);
+ }
+ });
+
+ gbSizer->Add(material_name_value, { i, 0 }, { 1, 1 }, wxBOTTOM, FromDIP(15));
+ gbSizer->Add(k_value, { i, 1 }, { 1, 1 }, wxBOTTOM, FromDIP(15));
+ //gbSizer->Add(n_value, { i, 2 }, { 1, 1 }, wxBOTTOM, FromDIP(15));
+ gbSizer->Add(delete_button, { i, 2 }, { 1, 1 }, wxBOTTOM, FromDIP(15));
+ gbSizer->Add(edit_button, { i, 3 }, { 1, 1 }, wxBOTTOM, FromDIP(15));
+ i++;
+ }
+
+ Layout();
+}
+
+float HistoryWindow::get_nozzle_value()
+{
+ double nozzle_value = 0.0;
+ wxString nozzle_value_str = m_comboBox_nozzle_dia->GetValue();
+ try {
+ nozzle_value_str.ToDouble(&nozzle_value);
+ }
+ catch (...) {
+ ;
+ }
+
+ return nozzle_value;
+}
+
+
+EditCalibrationHistoryDialog::EditCalibrationHistoryDialog(wxWindow* parent, const PACalibResult& result)
+ : DPIDialog(parent, wxID_ANY, _L("Edit Pressure Advance"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE)
+ , m_new_result(result)
+{
+ this->SetBackgroundColour(*wxWHITE);
+ auto main_sizer = new wxBoxSizer(wxVERTICAL);
+
+ auto top_panel = new wxPanel(this);
+ auto panel_sizer = new wxBoxSizer(wxVERTICAL);
+ top_panel->SetSizer(panel_sizer);
+
+ auto flex_sizer = new wxFlexGridSizer(0, 2, FromDIP(15), FromDIP(30));
+ flex_sizer->SetFlexibleDirection(wxBOTH);
+ flex_sizer->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
+
+ wxStaticText* material_name_title = new wxStaticText(top_panel, wxID_ANY, _L("Material"));
+ TextInput* material_name_value = new TextInput(top_panel, m_new_result.name, "", "", wxDefaultPosition, EDIT_HISTORY_DIALOG_INPUT_SIZE, wxTE_PROCESS_ENTER);
+ material_name_value->GetTextCtrl()->Bind(wxEVT_TEXT_ENTER, [this, material_name_value](auto& e) {
+ if (!material_name_value->GetTextCtrl()->GetValue().IsEmpty())
+ m_new_result.name = material_name_value->GetTextCtrl()->GetValue().ToStdString();
+ });
+ material_name_value->GetTextCtrl()->Bind(wxEVT_KILL_FOCUS, [this, material_name_value](auto& e) {
+ if (!material_name_value->GetTextCtrl()->GetValue().IsEmpty())
+ m_new_result.name = material_name_value->GetTextCtrl()->GetValue().ToStdString();
+ e.Skip();
+ });
+ flex_sizer->Add(material_name_title);
+ flex_sizer->Add(material_name_value);
+
+ wxStaticText* k_title = new wxStaticText(top_panel, wxID_ANY, _L("K Factor"));
+ auto k_str = wxString::Format("%.3f", m_new_result.k_value);
+ TextInput* k_value = new TextInput(top_panel, k_str, "", "", wxDefaultPosition, EDIT_HISTORY_DIALOG_INPUT_SIZE, wxTE_PROCESS_ENTER);
+ k_value->GetTextCtrl()->Bind(wxEVT_TEXT_ENTER, [this, k_value](auto& e) {
+ float k = 0.0f;
+ if (!CalibUtils::validate_input_k_value(k_value->GetTextCtrl()->GetValue(), &k)) {
+ MessageDialog msg_dlg(nullptr, _L("Please input a valid value (K in 0~0.5)"), wxEmptyString, wxICON_WARNING | wxOK);
+ msg_dlg.ShowModal();
+ }
+ wxString k_str = wxString::Format("%.3f", k);
+ k_value->GetTextCtrl()->SetValue(k_str);
+ m_new_result.k_value = k;
+ });
+ k_value->GetTextCtrl()->Bind(wxEVT_KILL_FOCUS, [this, k_value](auto& e) {
+ float k = 0.0f;
+ if (!CalibUtils::validate_input_k_value(k_value->GetTextCtrl()->GetValue(), &k)) {
+ MessageDialog msg_dlg(nullptr, _L("Please input a valid value (K in 0~0.5)"), wxEmptyString, wxICON_WARNING | wxOK);
+ msg_dlg.ShowModal();
+ }
+ wxString k_str = wxString::Format("%.3f", k);
+ k_value->GetTextCtrl()->SetValue(k_str);
+ m_new_result.k_value = k;
+ e.Skip();
+ });
+ flex_sizer->Add(k_title);
+ flex_sizer->Add(k_value);
+
+ // Hide:
+ //wxStaticText* n_title = new wxStaticText(top_panel, wxID_ANY, _L("N Factor"));
+ //TextInput* n_value = new TextInput(top_panel, n, "", "", wxDefaultPosition, EDIT_HISTORY_DIALOG_INPUT_SIZE, wxTE_PROCESS_ENTER);
+ //flex_sizer->Add(n_title);
+ //flex_sizer->Add(n_value);
+
+ panel_sizer->Add(flex_sizer);
+
+ panel_sizer->AddSpacer(FromDIP(25));
+
+ auto btn_sizer = new wxBoxSizer(wxHORIZONTAL);
+ Button* save_btn = new Button(top_panel, _L("Save"));
+ StateColor btn_bg_green(std::pair(wxColour(27, 136, 68), StateColor::Pressed),
+ std::pair(wxColour(61, 203, 115), StateColor::Hovered),
+ std::pair(wxColour(0, 174, 66), StateColor::Normal));
+ save_btn->SetBackgroundColour(*wxWHITE);
+ save_btn->SetBackgroundColor(btn_bg_green);
+ save_btn->SetBorderColor(wxColour(0, 174, 66));
+ save_btn->SetTextColor(wxColour("#FFFFFE"));
+ save_btn->SetMinSize(wxSize(-1, FromDIP(24)));
+ save_btn->SetCornerRadius(FromDIP(12));
+ Button* cancel_btn = new Button(top_panel, _L("Cancel"));
+ cancel_btn->SetBackgroundColour(*wxWHITE);
+ cancel_btn->SetMinSize(wxSize(-1, FromDIP(24)));
+ cancel_btn->SetCornerRadius(FromDIP(12));
+ save_btn->Bind(wxEVT_BUTTON, &EditCalibrationHistoryDialog::on_save, this);
+ cancel_btn->Bind(wxEVT_BUTTON, &EditCalibrationHistoryDialog::on_cancel, this);
+ btn_sizer->AddStretchSpacer();
+ btn_sizer->Add(save_btn);
+ btn_sizer->AddSpacer(FromDIP(20));
+ btn_sizer->Add(cancel_btn);
+ panel_sizer->Add(btn_sizer, 0, wxEXPAND, 0);
+
+
+ main_sizer->Add(top_panel, 1, wxEXPAND | wxALL, FromDIP(20));
+
+ SetSizer(main_sizer);
+ Layout();
+ Fit();
+ CenterOnParent();
+
+ wxGetApp().UpdateDlgDarkUI(this);
+}
+
+EditCalibrationHistoryDialog::~EditCalibrationHistoryDialog() {
+}
+
+PACalibResult EditCalibrationHistoryDialog::get_result() {
+ return m_new_result;
+}
+
+void EditCalibrationHistoryDialog::on_save(wxCommandEvent& event) {
+ EndModal(wxID_OK);
+}
+
+void EditCalibrationHistoryDialog::on_cancel(wxCommandEvent& event) {
+ EndModal(wxID_CANCEL);
+}
+
+void EditCalibrationHistoryDialog::on_dpi_changed(const wxRect& suggested_rect)
+{
+}
+
+} // namespace GUI
+} // namespace Slic3r
diff --git a/src/slic3r/GUI/CaliHistoryDialog.hpp b/src/slic3r/GUI/CaliHistoryDialog.hpp
new file mode 100644
index 0000000000..001006cd12
--- /dev/null
+++ b/src/slic3r/GUI/CaliHistoryDialog.hpp
@@ -0,0 +1,57 @@
+#ifndef slic3r_GUI_CaliHistory_hpp_
+#define slic3r_GUI_CaliHistory_hpp_
+
+#include "GUI_Utils.hpp"
+#include "wxExtensions.hpp"
+#include "Widgets/ComboBox.hpp"
+#include "DeviceManager.hpp"
+
+namespace Slic3r {
+namespace GUI {
+
+class HistoryWindow : public DPIDialog {
+public:
+ HistoryWindow(wxWindow* parent, const std::vector& calib_results_history);
+ ~HistoryWindow();
+ void on_dpi_changed(const wxRect& suggested_rect) {}
+ void on_select_nozzle(wxCommandEvent& evt);
+ void reqeust_history_result(MachineObject* obj);
+ void sync_history_result(MachineObject* obj);
+ void on_device_connected(MachineObject* obj);
+ void on_timer(wxTimerEvent& event);
+ void update(MachineObject* obj);
+protected:
+ void sync_history_data();
+ float get_nozzle_value();
+
+ wxPanel* m_history_data_panel;
+ ComboBox* m_comboBox_nozzle_dia;
+ wxStaticText* m_tips;
+
+ wxTimer* m_refresh_timer { nullptr };
+
+ std::vector m_calib_results_history;
+ MachineObject* curr_obj { nullptr };
+ int history_version = -1;
+};
+
+class EditCalibrationHistoryDialog : public DPIDialog
+{
+public:
+ EditCalibrationHistoryDialog(wxWindow* parent, const PACalibResult& result);
+ ~EditCalibrationHistoryDialog();
+ void on_dpi_changed(const wxRect& suggested_rect) override;
+ PACalibResult get_result();
+
+protected:
+ virtual void on_save(wxCommandEvent& event);
+ virtual void on_cancel(wxCommandEvent& event);
+
+protected:
+ PACalibResult m_new_result;
+};
+
+} // namespace GUI
+} // namespace Slic3r
+
+#endif
diff --git a/src/slic3r/GUI/CalibrationPanel.cpp b/src/slic3r/GUI/CalibrationPanel.cpp
index e48fbaf2db..7c33da2cd1 100644
--- a/src/slic3r/GUI/CalibrationPanel.cpp
+++ b/src/slic3r/GUI/CalibrationPanel.cpp
@@ -459,20 +459,19 @@ CalibrationPanel::CalibrationPanel(wxWindow* parent, wxWindowID id, const wxPoin
void CalibrationPanel::init_tabpanel() {
m_side_tools = new SideTools(this, wxID_ANY);
- m_side_tools->Connect(wxEVT_LEFT_DOWN, wxMouseEventHandler(CalibrationPanel::on_printer_clicked), NULL, this);
+ m_side_tools->get_panel()->Connect(wxEVT_LEFT_DOWN, wxMouseEventHandler(CalibrationPanel::on_printer_clicked), NULL, this);
wxBoxSizer* sizer_side_tools = new wxBoxSizer(wxVERTICAL);
sizer_side_tools->Add(m_side_tools, 1, wxEXPAND, 0);
m_tabpanel = new Tabbook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, sizer_side_tools, wxNB_LEFT | wxTAB_TRAVERSAL | wxNB_NOPAGETHEME);
+ m_side_tools->set_table_panel(m_tabpanel);
m_tabpanel->SetBackgroundColour(*wxWHITE);
m_cali_panels[0] = new PressureAdvanceWizard(m_tabpanel);
m_cali_panels[1] = new FlowRateWizard(m_tabpanel);
m_cali_panels[2] = new MaxVolumetricSpeedWizard(m_tabpanel);
- //m_cali_panels[3] = new TemperatureWizard(m_tabpanel);
- //m_cali_panels[4] = new RetractionWizard(m_tabpanel);
for (int i = 0; i < (int)CALI_MODE_COUNT; i++) {
bool selected = false;
@@ -487,11 +486,7 @@ void CalibrationPanel::init_tabpanel() {
for (int i = 0; i < (int)CALI_MODE_COUNT; i++)
m_tabpanel->SetPageImage(i, "");
- m_tabpanel->Bind(wxEVT_BOOKCTRL_PAGE_CHANGED, [this](wxBookCtrlEvent&) {
- wxCommandEvent e (EVT_CALIBRATION_TAB_CHANGED);
- e.SetEventObject(m_tabpanel->GetCurrentPage());
- wxPostEvent(m_tabpanel->GetCurrentPage(), e);
- }, m_tabpanel->GetId());
+ m_initialized = true;
}
void CalibrationPanel::init_timer()
@@ -507,60 +502,137 @@ void CalibrationPanel::on_timer(wxTimerEvent& event) {
}
void CalibrationPanel::update_print_error_info(int code, std::string msg, std::string extra) {
- for (int i = 0; i < m_tabpanel->GetPageCount(); i++) {
- if(m_tabpanel->GetPage(i))
- static_cast(m_tabpanel->GetPage(i))->update_print_error_info(code, msg, extra);
+ // update current wizard only
+ int curr_selected = m_tabpanel->GetSelection();
+ if (curr_selected >= 0 && curr_selected < CALI_MODE_COUNT) {
+ if (m_cali_panels[curr_selected]) {
+ auto page = m_cali_panels[curr_selected]->get_curr_step()->page;
+ if(page && page->get_page_type() == CaliPageType::CALI_PAGE_PRESET){
+ auto preset_page = static_cast(page);
+ if (preset_page->get_page_status() == CaliPresetPageStatus::CaliPresetStatusSending)
+ preset_page->update_print_error_info(code, msg, extra);
+ }
+ }
}
}
void CalibrationPanel::update_all() {
- for (int i = 0; i < (int)CALI_MODE_COUNT; i++) {
- m_cali_panels[i]->update_printer();
- if (m_cali_panels[i]->IsShown())
- m_cali_panels[i]->update_print_progress();
- }
NetworkAgent* m_agent = wxGetApp().getAgent();
Slic3r::DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager();
- if (!dev)
+ if (!dev) return;
+ obj = dev->get_selected_machine();
+
+ // update current wizard only
+ int curr_selected = m_tabpanel->GetSelection();
+
+ if (curr_selected >= 0 && curr_selected < CALI_MODE_COUNT) {
+ if (m_cali_panels[curr_selected])
+ m_cali_panels[curr_selected]->update(obj);
+ }
+
+ // check valid machine
+ if (obj && dev->get_my_machine(obj->dev_id) == nullptr) {
+ dev->set_selected_machine("");
+ if (m_agent)
+ m_agent->set_user_selected_machine("");
+ show_status((int)MONITOR_NO_PRINTER);
return;
- MachineObject* obj = dev->get_selected_machine();
+ }
+
+ if (wxGetApp().is_user_login()) {
+ dev->check_pushing();
+ try {
+ m_agent->refresh_connection();
+ }
+ catch (...) {
+ ;
+ }
+ }
+
+ if (obj) {
+ wxGetApp().reset_to_active();
+ if (obj->connection_type() != last_conn_type) {
+ last_conn_type = obj->connection_type();
+ }
+ }
+
+ m_side_tools->update_status(obj);
if (!obj) {
- m_side_tools->set_none_printer_mode();
+ show_status((int)MONITOR_NO_PRINTER);
return;
}
- /* Update Device Info */
- m_side_tools->set_current_printer_name(obj->dev_name);
+ if (obj->is_connecting()) {
+ show_status(MONITOR_CONNECTING);
+ return;
+ }
+ else if (!obj->is_connected()) {
+ int server_status = 0;
+ // only disconnected server in cloud mode
+ if (obj->connection_type() != "lan") {
+ if (m_agent) {
+ server_status = m_agent->is_server_connected() ? 0 : (int)MONITOR_DISCONNECTED_SERVER;
+ }
+ }
+ show_status((int)MONITOR_DISCONNECTED + server_status);
+ return;
+ }
- // update wifi signal image
- int wifi_signal_val = 0;
- if (!obj->is_connected() || obj->is_connecting()) {
- m_side_tools->set_current_printer_signal(WifiSignal::NONE);
- }
- else {
- if (!obj->wifi_signal.empty() && boost::ends_with(obj->wifi_signal, "dBm")) {
- try {
- wifi_signal_val = std::stoi(obj->wifi_signal.substr(0, obj->wifi_signal.size() - 3));
- }
- catch (...) {
- ;
- }
- if (wifi_signal_val > -45) {
- m_side_tools->set_current_printer_signal(WifiSignal::STRONG);
- }
- else if (wifi_signal_val <= -45 && wifi_signal_val >= -60) {
- m_side_tools->set_current_printer_signal(WifiSignal::MIDDLE);
- }
- else {
- m_side_tools->set_current_printer_signal(WifiSignal::WEAK);
+ show_status(MONITOR_NORMAL);
+}
+
+void CalibrationPanel::show_status(int status)
+{
+ if (!m_initialized) return;
+ if (last_status == status)return;
+ if (last_status & (int)MonitorStatus::MONITOR_CONNECTING != 0) {
+ NetworkAgent* agent = wxGetApp().getAgent();
+ json j;
+ j["dev_id"] = obj ? obj->dev_id : "obj_nullptr";
+ if (status & (int)MonitorStatus::MONITOR_DISCONNECTED != 0) {
+ j["result"] = "failed";
+ if (agent) {
+ agent->track_event("connect_dev", j.dump());
}
}
- else {
- m_side_tools->set_current_printer_signal(WifiSignal::MIDDLE);
+ else if (status & (int)MonitorStatus::MONITOR_NORMAL != 0) {
+ j["result"] = "success";
+ if (agent) {
+ agent->track_event("connect_dev", j.dump());
+ }
}
}
+ last_status = status;
+
+ BOOST_LOG_TRIVIAL(info) << "monitor: show_status = " << status;
+
+
+ Freeze();
+ // update panels
+ if (m_side_tools) { m_side_tools->show_status(status); };
+
+ if ((status & (int)MonitorStatus::MONITOR_NO_PRINTER) != 0) {
+ set_default();
+ m_tabpanel->Layout();
+ }
+ else if (((status & (int)MonitorStatus::MONITOR_NORMAL) != 0)
+ || ((status & (int)MonitorStatus::MONITOR_DISCONNECTED) != 0)
+ || ((status & (int)MonitorStatus::MONITOR_DISCONNECTED_SERVER) != 0)
+ || ((status & (int)MonitorStatus::MONITOR_CONNECTING) != 0))
+ {
+
+ if (((status & (int)MonitorStatus::MONITOR_DISCONNECTED) != 0)
+ || ((status & (int)MonitorStatus::MONITOR_DISCONNECTED_SERVER) != 0)
+ || ((status & (int)MonitorStatus::MONITOR_CONNECTING) != 0))
+ {
+ set_default();
+ }
+ m_tabpanel->Layout();
+ }
+ Layout();
+ Thaw();
}
bool CalibrationPanel::Show(bool show) {
@@ -596,8 +668,15 @@ void CalibrationPanel::on_printer_clicked(wxMouseEvent& event)
}
}
+void CalibrationPanel::set_default()
+{
+ obj = nullptr;
+ last_conn_type = "undefined";
+ wxGetApp().sidebar().load_ams_list({}, {});
+}
+
CalibrationPanel::~CalibrationPanel() {
- m_side_tools->Disconnect(wxEVT_LEFT_DOWN, wxMouseEventHandler(CalibrationPanel::on_printer_clicked), NULL, this);
+ m_side_tools->get_panel()->Disconnect(wxEVT_LEFT_DOWN, wxMouseEventHandler(CalibrationPanel::on_printer_clicked), NULL, this);
if (m_refresh_timer)
m_refresh_timer->Stop();
delete m_refresh_timer;
diff --git a/src/slic3r/GUI/CalibrationPanel.hpp b/src/slic3r/GUI/CalibrationPanel.hpp
index 09af9f7501..9f7026c084 100644
--- a/src/slic3r/GUI/CalibrationPanel.hpp
+++ b/src/slic3r/GUI/CalibrationPanel.hpp
@@ -86,7 +86,7 @@ private:
wxBoxSizer* m_sizer_my_devices{ nullptr };
wxScrolledWindow* m_scrolledWindow{ nullptr };
wxTimer* m_refresh_timer{ nullptr };
- std::vector m_user_list_machine_panel;
+ std::vector m_user_list_machine_panel;
boost::thread* get_print_info_thread{ nullptr };
std::string m_print_info;
std::map m_bind_machine_list;
@@ -107,21 +107,25 @@ public:
Tabbook* get_tabpanel() { return m_tabpanel; };
void update_print_error_info(int code, std::string msg, std::string extra);
void update_all();
+ void show_status(int status);
bool Show(bool show);
void on_printer_clicked(wxMouseEvent& event);
+ void set_default();
protected:
void init_tabpanel();
void init_timer();
void on_timer(wxTimerEvent& event);
-private:
- SideTools* m_side_tools{ nullptr };
- Tabbook* m_tabpanel{ nullptr };
- SelectMObjectPopup m_mobjectlist_popup;
- CalibrationWizard* m_cali_panels[CALI_MODE_COUNT];
-
- wxTimer* m_refresh_timer = nullptr;
+ int last_status;
+ bool m_initialized { false };
+ std::string last_conn_type = "undedefined";
+ MachineObject* obj{ nullptr };
+ SideTools* m_side_tools{ nullptr };
+ Tabbook* m_tabpanel{ nullptr };
+ SelectMObjectPopup m_mobjectlist_popup;
+ CalibrationWizard* m_cali_panels[CALI_MODE_COUNT];
+ wxTimer* m_refresh_timer = nullptr;
};
}} // namespace Slic3r::GUI
diff --git a/src/slic3r/GUI/CalibrationWizard.cpp b/src/slic3r/GUI/CalibrationWizard.cpp
index 4dac663cfd..cf0c480db3 100644
--- a/src/slic3r/GUI/CalibrationWizard.cpp
+++ b/src/slic3r/GUI/CalibrationWizard.cpp
@@ -2,244 +2,25 @@
#include "I18N.hpp"
#include "GUI_App.hpp"
#include "MsgDialog.hpp"
+#include "CalibrationWizardPage.hpp"
#include "../../libslic3r/Calib.hpp"
#include "Tabbook.hpp"
-#include "MainFrame.hpp"
+#include "CaliHistoryDialog.hpp"
namespace Slic3r { namespace GUI {
#define CALIBRATION_DEBUG
-#define PRESET_GAP FromDIP(25)
-#define CALIBRATION_COMBOX_SIZE wxSize(FromDIP(500), FromDIP(24))
-#define CALIBRATION_FILAMENT_COMBOX_SIZE wxSize(FromDIP(250), FromDIP(24))
-#define CALIBRATION_OPTIMAL_INPUT_SIZE wxSize(FromDIP(300), FromDIP(24))
-#define CALIBRATION_FROM_TO_INPUT_SIZE wxSize(FromDIP(160), FromDIP(24))
-#define CALIBRATION_FGSIZER_HGAP FromDIP(50)
-#define CALIBRATION_TEXT_MAX_LENGTH FromDIP(90) + CALIBRATION_FGSIZER_HGAP + 2 * CALIBRATION_FILAMENT_COMBOX_SIZE.x
-#define CALIBRATION_PROGRESSBAR_LENGTH FromDIP(600)
+wxDEFINE_EVENT(EVT_DEVICE_CHANGED, wxCommandEvent);
+wxDEFINE_EVENT(EVT_CALIBRATION_JOB_FINISHED, wxCommandEvent);
+
static const wxString NA_STR = _L("N/A");
-wxDEFINE_EVENT(EVT_CALIBRATION_TRAY_SELECTION_CHANGED, SimpleEvent);
-wxDEFINE_EVENT(EVT_CALIBRATION_NOTIFY_CHANGE_PAGES, SimpleEvent);
-wxDEFINE_EVENT(EVT_CALIBRATION_TAB_CHANGED, wxCommandEvent);
-
-static bool is_high_end_type(MachineObject* obj) {
- if (obj) {
- if (obj->printer_type == "BL-P001" || obj->printer_type == "BL-P002")
- return true;
- else if (obj->printer_type == "C11" || obj->printer_type == "C12")
- return false;
- }
-
- return false;
-}
-
-static bool validate_input_flow_ratio(wxString flow_ratio, float* output_value) {
- float default_flow_ratio = 1.0f;
-
- if (flow_ratio.IsEmpty()) {
- *output_value = default_flow_ratio;
- MessageDialog msg_dlg(nullptr, _L("Please input a valid value (0.0 < flow ratio < 0.2)"), wxEmptyString, wxICON_WARNING | wxOK);
- msg_dlg.ShowModal();
- return false;
- }
-
- double flow_ratio_value = 0.0;
- try {
- flow_ratio.ToDouble(&flow_ratio_value);
- }
- catch (...) {
- ;
- }
-
- if (flow_ratio_value <= 0.0 || flow_ratio_value >= 2.0) {
- *output_value = default_flow_ratio;
- MessageDialog msg_dlg(nullptr, _L("Please input a valid value (0.0 < flow ratio < 0.2)"), wxEmptyString, wxICON_WARNING | wxOK);
- msg_dlg.ShowModal();
- return false;
- }
-
- *output_value = flow_ratio_value;
- return true;
-}
-
-static bool validate_input_k_value(wxString k_text, float* output_value)
-{
- float default_k = 0.0f;
- if (k_text.IsEmpty()) {
- *output_value = default_k;
- MessageDialog msg_dlg(nullptr, _L("Please input a valid value (K in 0~0.5)"), wxEmptyString, wxICON_WARNING | wxOK);
- msg_dlg.ShowModal();
- return false;
- }
-
- double k_value = 0.0;
- try {
- k_text.ToDouble(&k_value);
- }
- catch (...) {
- ;
- }
-
- if (k_value < 0 || k_value > 0.5) {
- *output_value = default_k;
- MessageDialog msg_dlg(nullptr, _L("Please input a valid value (K in 0~0.5)"), wxEmptyString, wxICON_WARNING | wxOK);
- msg_dlg.ShowModal();
- return false;
- }
-
- *output_value = k_value;
- return true;
-};
-
-static bool validate_input_n_value(wxString n_text, float* output_value) {
- float default_n = 1.0f;
- if (n_text.IsEmpty()) {
- *output_value = default_n;
- MessageDialog msg_dlg(nullptr, _L("Please input a valid value (N in 0.6~2.0)"), wxEmptyString, wxICON_WARNING | wxOK);
- msg_dlg.ShowModal();
- return false;
- }
-
- double n_value = 0.0;
- try {
- n_text.ToDouble(&n_value);
- }
- catch (...) {
- ;
- }
-
- if (n_value < 0.6 || n_value > 2.0) {
- *output_value = default_n;
- MessageDialog msg_dlg(nullptr, _L("Please input a valid value (N in 0.6~2.0)"), wxEmptyString, wxICON_WARNING | wxOK);
- msg_dlg.ShowModal();
- return false;
- }
-
- *output_value = n_value;
- return true;
-}
-
-wxString get_calibration_wiki_page(CalibMode cali_mode)
-{
- switch (cali_mode) {
- case CalibMode::Calib_PA_Line:
- return wxString("https://wiki.bambulab.com/en/software/bambu-studio/calibration_pa");
- case CalibMode::Calib_Flow_Rate:
- return wxString("https://wiki.bambulab.com/en/software/bambu-studio/calibration_flow_rate");
- case CalibMode::Calib_Vol_speed_Tower:
- return wxString("https://wiki.bambulab.com/en/software/bambu-studio/calibration_volumetric");
- case CalibMode::Calib_Temp_Tower:
- return wxString("https://wiki.bambulab.com/en/software/bambu-studio/calibration_temperature");
- case CalibMode::Calib_Retraction_tower:
- return wxString("https://wiki.bambulab.com/en/software/bambu-studio/calibration_retraction");
- default:
- return "";
- }
-}
-
-FilamentComboBox::FilamentComboBox(wxWindow* parent, const wxPoint& pos, const wxSize& size)
- : wxPanel(parent, wxID_ANY, pos, size, wxTAB_TRAVERSAL)
-{
- wxBoxSizer* main_sizer = new wxBoxSizer(wxHORIZONTAL);
-
- m_comboBox = new CalibrateFilamentComboBox(this);
- m_comboBox->SetSize(CALIBRATION_FILAMENT_COMBOX_SIZE);
- m_comboBox->SetMinSize(CALIBRATION_FILAMENT_COMBOX_SIZE);
- main_sizer->Add(m_comboBox->clr_picker, 0, wxALIGN_CENTER | wxRIGHT, FromDIP(8));
- main_sizer->Add(m_comboBox, 0, wxALIGN_CENTER);
-
- this->SetSizer(main_sizer);
- this->Layout();
- main_sizer->Fit(this);
-}
-
-void FilamentComboBox::set_select_mode(FilamentSelectMode mode)
-{
- m_mode = mode;
- if (m_checkBox)
- m_checkBox->Show(m_mode == FSMCheckBoxMode);
- if (m_radioBox)
- m_radioBox->Show(m_mode == FSMRadioMode);
-
- Layout();
-}
-
-void FilamentComboBox::load_tray_from_ams(int id, DynamicPrintConfig& tray)
-{
- m_comboBox->load_tray(tray);
-
- m_tray_id = id;
- m_tray_name = m_comboBox->get_tray_name();
- m_is_bbl_filamnet = MachineObject::is_bbl_filament(m_comboBox->get_tag_uid());
- Enable(m_comboBox->is_tray_exist());
- if (m_comboBox->is_tray_exist()) {
- if (!m_comboBox->is_compatible_with_printer())
- SetValue(false);
- if (m_radioBox)
- m_radioBox->Enable(m_comboBox->is_compatible_with_printer());
- if (m_checkBox)
- m_checkBox->Enable(m_comboBox->is_compatible_with_printer());
- }
-}
-
-void FilamentComboBox::update_from_preset() { m_comboBox->update(); }
-
-bool FilamentComboBox::Show(bool show)
-{
- bool result = true;
- if (m_radioBox && m_mode == FSMRadioMode)
- result = result && m_radioBox->Show(show);
- if (m_checkBox && m_mode == FSMCheckBoxMode)
- result = result && m_checkBox->Show(show);
- result = result && wxPanel::Show(show);
- return result;
-}
-
-bool FilamentComboBox::Enable(bool enable) {
- if (!enable)
- SetValue(false);
-
- bool result = true;
- if (m_radioBox)
- result = result && m_radioBox->Enable(enable);
- if (m_checkBox)
- result = result && m_checkBox->Enable(enable);
- result = result && wxPanel::Enable(enable);
- return result;
-}
-
-void FilamentComboBox::SetValue(bool value, bool send_event) {
- if (m_radioBox) {
- if (value == m_radioBox->GetValue()) {
- if (m_checkBox) {
- if (value == m_checkBox->GetValue())
- return;
- }
- else {
- return;
- }
- }
- }
- if (m_radioBox)
- m_radioBox->SetValue(value);
- if (m_checkBox)
- m_checkBox->SetValue(value);
- if (send_event) {
- SimpleEvent e(EVT_CALIBRATION_TRAY_SELECTION_CHANGED);
- e.ResumePropagation(wxEVENT_PROPAGATE_MAX);
- e.SetEventObject(this);
- GetEventHandler()->ProcessEvent(e);
- }
-}
CalibrationWizard::CalibrationWizard(wxWindow* parent, CalibMode mode, wxWindowID id, const wxPoint& pos, const wxSize& size, long style)
: wxPanel(parent, id, pos, size, style)
, m_mode(mode)
{
- m_wiki_url = get_calibration_wiki_page(m_mode);
-
SetBackgroundColour(wxColour(0xEEEEEE));
wxBoxSizer* main_sizer = new wxBoxSizer(wxVERTICAL);
@@ -260,1641 +41,126 @@ CalibrationWizard::CalibrationWizard(wxWindow* parent, CalibMode mode, wxWindowI
this->Layout();
main_sizer->Fit(this);
- init_bitmaps();
- init_printer_calib_info_from_appconfig();
-
- Bind(EVT_CALIBRATIONPAGE_PREV, &CalibrationWizard::on_click_btn_prev, this);
- Bind(EVT_CALIBRATIONPAGE_NEXT, &CalibrationWizard::on_click_btn_next, this);
- Bind(EVT_CALIBRATION_TRAY_SELECTION_CHANGED, &CalibrationWizard::on_select_tray, this);
- Bind(EVT_SHOW_ERROR_INFO, [this](auto& e) {show_send_failed_info(true); });
-
-#ifdef CALIBRATION_DEBUG
- this->Bind(wxEVT_CHAR_HOOK, [this](auto& evt) {
- const int keyCode = evt.GetKeyCode();
- switch (keyCode)
- {
- case WXK_NUMPAD_PAGEUP: case WXK_PAGEUP:
- show_page(get_curr_page()->get_prev_page());
- break;
- case WXK_NUMPAD_PAGEDOWN: case WXK_PAGEDOWN:
- {
- show_page(get_curr_page()->get_next_page());
- break;
- }
- default:
- evt.Skip();
- break;
- }
- });
-#endif
+ Bind(EVT_CALIBRATION_JOB_FINISHED, &CalibrationWizard::on_cali_job_finished, this);
}
-CalibrationWizardPage* CalibrationWizard::create_presets_page(bool need_custom_range) {
- auto page = new CalibrationWizardPage(m_scrolledWindow);
- page->set_page_type(PageType::Preset);
- page->set_highlight_step_text(PageType::Preset);
-
- auto page_content_sizer = page->get_content_vsizer();
-
- m_presets_panel = new wxPanel(page);
- page_content_sizer->Add(m_presets_panel, 0, wxEXPAND, 0);
- auto panel_sizer = new wxBoxSizer(wxVERTICAL);
- m_presets_panel->SetSizer(panel_sizer);
-
- auto nozzle_combo_text = new wxStaticText(m_presets_panel, wxID_ANY, _L("Nozzle"), wxDefaultPosition, wxDefaultSize, 0);
- nozzle_combo_text->Wrap(-1);
- nozzle_combo_text->SetFont(Label::Head_14);
- panel_sizer->Add(nozzle_combo_text, 0, wxALL, 0);
- m_comboBox_nozzle_dia = new ComboBox(m_presets_panel, wxID_ANY, "", wxDefaultPosition, CALIBRATION_COMBOX_SIZE, 0, nullptr, wxCB_READONLY);
- panel_sizer->Add(m_comboBox_nozzle_dia, 0, wxALL, 0);
-
- panel_sizer->AddSpacer(PRESET_GAP);
-
- auto plate_type_combo_text = new wxStaticText(m_presets_panel, wxID_ANY, _L("Plate Type"), wxDefaultPosition, wxDefaultSize, 0);
- plate_type_combo_text->Wrap(-1);
- plate_type_combo_text->SetFont(Label::Head_14);
- panel_sizer->Add(plate_type_combo_text, 0, wxALL, 0);
- m_comboBox_bed_type = new ComboBox(m_presets_panel, wxID_ANY, "", wxDefaultPosition, CALIBRATION_COMBOX_SIZE, 0, nullptr, wxCB_READONLY);
- panel_sizer->Add(m_comboBox_bed_type, 0, wxALL, 0);
-
- panel_sizer->AddSpacer(PRESET_GAP);
-
- {// Hide
- auto process_combo_text = new wxStaticText(m_presets_panel, wxID_ANY, _L("Process"), wxDefaultPosition, wxDefaultSize, 0);
- process_combo_text->Hide();
- process_combo_text->Wrap(-1);
- panel_sizer->Add(process_combo_text, 0, wxALL, 0);
- m_comboBox_process = new ComboBox(m_presets_panel, wxID_ANY, "", wxDefaultPosition, CALIBRATION_COMBOX_SIZE, 0, nullptr, wxCB_READONLY);
- m_comboBox_process->Hide();
- panel_sizer->Add(m_comboBox_process, 0, wxALL, 0);
- }// Hide
-
- m_select_ams_mode_panel = new wxPanel(m_presets_panel);
- auto choose_ams_sizer = new wxBoxSizer(wxVERTICAL);
- auto filament_from_text = new wxStaticText(m_select_ams_mode_panel, wxID_ANY, _L("Filament From"), wxDefaultPosition, wxDefaultSize, 0);
- filament_from_text->SetFont(Label::Head_14);
- choose_ams_sizer->Add(filament_from_text, 0);
- auto raioBox_sizer = new wxFlexGridSizer(2, 1, 0, FromDIP(10));
- m_ams_radiobox = new wxRadioButton(m_select_ams_mode_panel, wxID_ANY, _L("AMS"));
- m_ams_radiobox->SetValue(true);
- raioBox_sizer->Add(m_ams_radiobox, 0);
- //auto ams_text = new wxStaticText(m_choose_ams_panel, wxID_ANY, _L("AMS"), wxDefaultPosition, wxDefaultSize, 0);
- //raioBox_sizer->Add(ams_text);
- m_ext_spool_radiobox = new wxRadioButton(m_select_ams_mode_panel, wxID_ANY, _L("External Spool"));
- raioBox_sizer->Add(m_ext_spool_radiobox, 0);
- //auto ext_spool_text = new wxStaticText(m_choose_ams_panel, wxID_ANY, _L("External Spool"), wxDefaultPosition, wxDefaultSize, 0);
- //raioBox_sizer->Add(ext_spool_text, 0);
- choose_ams_sizer->Add(raioBox_sizer, 0);
- m_select_ams_mode_panel->SetSizer(choose_ams_sizer);
- panel_sizer->Add(m_select_ams_mode_panel, 0);
-
- panel_sizer->AddSpacer(PRESET_GAP);
-
- auto filament_for_title_sizer = new wxBoxSizer(wxHORIZONTAL);
- auto filament_for_text = new wxStaticText(m_presets_panel, wxID_ANY, _L("Filament For Calibration"), wxDefaultPosition, wxDefaultSize, 0);
- filament_for_text->SetFont(Label::Head_14);
- filament_for_title_sizer->Add(filament_for_text, 0, wxALIGN_CENTER);
- filament_for_title_sizer->AddSpacer(FromDIP(25));
- m_ams_sync_button = new ScalableButton(m_presets_panel, wxID_ANY, "ams_fila_sync", wxEmptyString, wxDefaultSize, wxDefaultPosition, wxBU_EXACTFIT | wxNO_BORDER, false, 18);
- m_ams_sync_button->SetBackgroundColour(*wxWHITE);
- m_ams_sync_button->SetToolTip(_L("Synchronize filament list from AMS"));
- filament_for_title_sizer->Add(m_ams_sync_button, 0, wxALIGN_CENTER, 0);
- panel_sizer->Add(filament_for_title_sizer);
- m_filament_list_panel = new wxPanel(m_presets_panel);
- auto filament_list_sizer = new wxBoxSizer(wxVERTICAL);
- auto filament_list_tips = new wxStaticText(m_filament_list_panel, wxID_ANY, _L("Please select same type of material, because plate temperature might not be compatible with different type of material"), wxDefaultPosition, wxDefaultSize, 0);
- filament_list_tips->Hide();
- filament_list_tips->SetFont(Label::Body_13);
- filament_list_tips->SetForegroundColour(wxColour(145, 145, 145));
- filament_list_tips->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
- filament_list_sizer->Add(filament_list_tips);
- filament_list_sizer->AddSpacer(FromDIP(10));
- m_muilti_ams_panel = new wxPanel(m_filament_list_panel);
- auto multi_ams_sizer = new wxBoxSizer(wxVERTICAL);
- auto ams_items_sizer = new wxBoxSizer(wxHORIZONTAL);
- for (int i = 0; i < 4; i++) {
- AMSinfo temp_info = AMSinfo{ std::to_string(i), std::vector{} };
- auto amsitem = new AMSItem(m_muilti_ams_panel, wxID_ANY, temp_info);
- amsitem->Bind(wxEVT_LEFT_DOWN, [this, amsitem](wxMouseEvent& e) {
- on_switch_ams(amsitem->m_amsinfo.ams_id);
- e.Skip();
- });
- m_ams_item_list.push_back(amsitem);
- ams_items_sizer->Add(amsitem, 0, wxALIGN_CENTER | wxRIGHT, FromDIP(6));
- }
- multi_ams_sizer->Add(ams_items_sizer, 0);
- multi_ams_sizer->AddSpacer(FromDIP(10));
- m_muilti_ams_panel->SetSizer(multi_ams_sizer);
- filament_list_sizer->Add(m_muilti_ams_panel);
- m_muilti_ams_panel->Hide();
- auto filament_fgSizer = new wxFlexGridSizer(2, 2, FromDIP(10), CALIBRATION_FGSIZER_HGAP);
- for (int i = 0; i < 16; i++) {
- auto filament_comboBox_sizer = new wxBoxSizer(wxHORIZONTAL);
- wxRadioButton* radio_btn = new wxRadioButton(m_filament_list_panel, wxID_ANY, "");
- CheckBox* check_box = new CheckBox(m_filament_list_panel);
- check_box->SetBackgroundColour(*wxWHITE);
- FilamentComboBox* fcb = new FilamentComboBox(m_filament_list_panel);
- fcb->SetRadioBox(radio_btn);
- fcb->SetCheckBox(check_box);
- fcb->set_select_mode(FilamentSelectMode::FSMRadioMode);
- filament_comboBox_sizer->Add(radio_btn, 0, wxALIGN_CENTER);
- filament_comboBox_sizer->Add(check_box, 0, wxALIGN_CENTER | wxRIGHT, FromDIP(8));
- filament_comboBox_sizer->Add(fcb, 0, wxALIGN_CENTER);
- filament_fgSizer->Add(filament_comboBox_sizer, 0);
- radio_btn->Bind(wxEVT_RADIOBUTTON, [this](wxCommandEvent& event) {
- SimpleEvent e(EVT_CALIBRATION_TRAY_SELECTION_CHANGED);
- e.SetEventObject(this);
- wxPostEvent(this, e);
- event.Skip();
- });
- check_box->Bind(wxEVT_TOGGLEBUTTON, [this](wxCommandEvent& event) {
- SimpleEvent e(EVT_CALIBRATION_TRAY_SELECTION_CHANGED);
- e.SetEventObject(this);
- wxPostEvent(this, e);
- event.Skip();
- });
- m_filament_comboBox_list.push_back(fcb);
-
- if (i >= 4)
- fcb->Show(false);
- }
- filament_list_sizer->Add(filament_fgSizer, 0);
- m_filament_list_panel->SetSizer(filament_list_sizer);
- panel_sizer->Add(m_filament_list_panel, 0);
-
- {// Hide
- m_virtual_panel = new wxPanel(m_presets_panel);
- auto virtual_sizer = new wxBoxSizer(wxHORIZONTAL);
- virtual_sizer->AddSpacer(FromDIP(10));
- wxRadioButton* radio_btn = new wxRadioButton(m_virtual_panel, wxID_ANY, "");
- CheckBox* check_box = new CheckBox(m_virtual_panel);
- m_virtual_tray_comboBox = new FilamentComboBox(m_virtual_panel);
- m_virtual_tray_comboBox->SetRadioBox(radio_btn);
- m_virtual_tray_comboBox->SetCheckBox(check_box);
- m_virtual_tray_comboBox->set_select_mode(FilamentSelectMode::FSMRadioMode);
- radio_btn->Bind(wxEVT_RADIOBUTTON, [this](wxCommandEvent& event) {
- SimpleEvent e(EVT_CALIBRATION_TRAY_SELECTION_CHANGED);
- e.SetEventObject(this);
- wxPostEvent(this, e);
- event.Skip();
- });
- virtual_sizer->Add(radio_btn, 0, wxALIGN_CENTER);
- virtual_sizer->Add(check_box, 0, wxALIGN_CENTER);
- virtual_sizer->Add(m_virtual_tray_comboBox, 0, wxALIGN_CENTER | wxRIGHT, FromDIP(8));
- m_virtual_panel->SetSizer(virtual_sizer);
- m_virtual_panel->Hide();
- panel_sizer->Add(m_virtual_panel, 0);
- }// Hide
-
- m_filaments_incompatible_tips = new wxStaticText(m_presets_panel, wxID_ANY, _L(""));
- m_filaments_incompatible_tips->SetFont(Label::Body_13);
- m_filaments_incompatible_tips->SetForegroundColour(wxColour(230, 92, 92));
- m_filaments_incompatible_tips->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
- m_filaments_incompatible_tips->Hide();
- panel_sizer->Add(m_filaments_incompatible_tips, 0, wxEXPAND);
-
- m_bed_type_incompatible_tips = new wxStaticText(m_presets_panel, wxID_ANY, _L(""));
- m_bed_type_incompatible_tips->SetFont(Label::Body_13);
- m_bed_type_incompatible_tips->SetForegroundColour(wxColour(230, 92, 92));
- m_bed_type_incompatible_tips->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
- m_bed_type_incompatible_tips->Hide();
- panel_sizer->Add(m_bed_type_incompatible_tips, 0, wxEXPAND);
-
- panel_sizer->AddSpacer(PRESET_GAP);
-
- if (need_custom_range) {
- wxBoxSizer* horiz_sizer;
- horiz_sizer = new wxBoxSizer(wxHORIZONTAL);
-
- wxBoxSizer* from_sizer;
- from_sizer = new wxBoxSizer(wxVERTICAL);
- m_from_text = new wxStaticText(m_presets_panel, wxID_ANY, _L("From"), wxDefaultPosition, wxDefaultSize, 0);
- m_from_text->Wrap(-1);
- m_from_text->SetFont(::Label::Body_14);
- from_sizer->Add(m_from_text, 0, wxALL, 0);
- m_from_value = new TextInput(m_presets_panel, wxEmptyString, _L("\u2103"), "", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE, 0);
- m_from_value->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC));
- from_sizer->Add(m_from_value, 0, wxALL, 0);
- horiz_sizer->Add(from_sizer, 0, wxEXPAND, 0);
-
- horiz_sizer->Add(FromDIP(10), 0, 0, wxEXPAND, 0);
-
- wxBoxSizer* to_sizer;
- to_sizer = new wxBoxSizer(wxVERTICAL);
- m_to_text = new wxStaticText(m_presets_panel, wxID_ANY, _L("To"), wxDefaultPosition, wxDefaultSize, 0);
- m_to_text->Wrap(-1);
- m_to_text->SetFont(::Label::Body_14);
- to_sizer->Add(m_to_text, 0, wxALL, 0);
- m_to_value = new TextInput(m_presets_panel, wxEmptyString, _L("\u2103"), "", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE, 0);
- m_to_value->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC));
- to_sizer->Add(m_to_value, 0, wxALL, 0);
- horiz_sizer->Add(to_sizer, 0, wxEXPAND, 0);
-
- horiz_sizer->Add(FromDIP(10), 0, 0, wxEXPAND, 0);
-
- wxBoxSizer* step_sizer;
- step_sizer = new wxBoxSizer(wxVERTICAL);
- m_step_text = new wxStaticText(m_presets_panel, wxID_ANY, _L("Step"), wxDefaultPosition, wxDefaultSize, 0);
- m_step_text->Wrap(-1);
- m_step_text->SetFont(::Label::Body_14);
- step_sizer->Add(m_step_text, 0, wxALL, 0);
- m_step = new TextInput(m_presets_panel, "5", _L("\u2103"), "", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE, 0);
- m_step->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC));
- step_sizer->Add(m_step, 0, wxALL, 0);
- horiz_sizer->Add(step_sizer, 0, wxEXPAND, 0);
- panel_sizer->Add(horiz_sizer, 0, wxEXPAND, 0);
-
- panel_sizer->AddSpacer(PRESET_GAP);
- }
- else {
- m_from_text = nullptr;
- m_to_text = nullptr;
- m_from_value = nullptr;
- m_to_value = nullptr;
- m_step_text = nullptr;
- m_step = nullptr;
- }
-
- auto printing_param_panel = new wxPanel(m_presets_panel);
- printing_param_panel->SetBackgroundColour(wxColour(238, 238, 238));
- printing_param_panel->SetMinSize(wxSize(CALIBRATION_TEXT_MAX_LENGTH * 1.7f, -1));
- auto printing_param_sizer = new wxBoxSizer(wxVERTICAL);
- printing_param_panel->SetSizer(printing_param_sizer);
-
- printing_param_sizer->AddSpacer(FromDIP(10));
-
- auto preset_panel_tips = new wxStaticText(printing_param_panel, wxID_ANY, _L("A test model will be printed. Please clear the build plate and place it back to the hot bed before calibration."));
- preset_panel_tips->SetFont(Label::Body_14);
- preset_panel_tips->Wrap(CALIBRATION_TEXT_MAX_LENGTH * 1.5f);
- printing_param_sizer->Add(preset_panel_tips, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(20));
-
- printing_param_sizer->AddSpacer(FromDIP(10));
-
- auto info_sizer = new wxFlexGridSizer(0, 3, 0, FromDIP(10));
- info_sizer->SetFlexibleDirection(wxBOTH);
- info_sizer->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
-
- auto nozzle_temp_sizer = new wxBoxSizer(wxVERTICAL);
- auto nozzle_temp_text = new wxStaticText(printing_param_panel, wxID_ANY, _L("Nozzle temperature"));
- nozzle_temp_text->SetFont(Label::Body_12);
- m_nozzle_temp = new TextInput(printing_param_panel, wxEmptyString, _L("\u2103"), "", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE, wxTE_READONLY);
- m_nozzle_temp->SetBorderWidth(0);
- nozzle_temp_sizer->Add(nozzle_temp_text, 0, wxALIGN_LEFT);
- nozzle_temp_sizer->Add(m_nozzle_temp, 0, wxEXPAND);
- nozzle_temp_text->Hide();
- m_nozzle_temp->Hide();
-
- auto bed_temp_sizer = new wxBoxSizer(wxHORIZONTAL);
- auto printing_param_text = new wxStaticText(printing_param_panel, wxID_ANY, _L("Printing Parameters"));
- printing_param_text->SetFont(Label::Head_12);
- printing_param_text->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
- bed_temp_sizer->Add(printing_param_text, 0, wxALIGN_CENTER | wxRIGHT, FromDIP(20));
- auto bed_temp_text = new wxStaticText(printing_param_panel, wxID_ANY, _L("Bed temperature"));
- bed_temp_text->SetFont(Label::Body_12);
- m_bed_temp = new TextInput(printing_param_panel, wxEmptyString, _L("\u2103"), "", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE, wxTE_READONLY);
- m_bed_temp->SetBorderWidth(0);
- bed_temp_sizer->Add(bed_temp_text, 0, wxALIGN_CENTER | wxRIGHT, FromDIP(10));
- bed_temp_sizer->Add(m_bed_temp, 0, wxALIGN_CENTER);
-
- auto max_flow_sizer = new wxBoxSizer(wxVERTICAL);
- auto max_flow_text = new wxStaticText(printing_param_panel, wxID_ANY, _L("Max volumetric speed"));
- max_flow_text->SetFont(Label::Body_12);
- m_max_volumetric_speed = new TextInput(printing_param_panel, wxEmptyString, _L("mm\u00B3"), "", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE, wxTE_READONLY);
- m_max_volumetric_speed->SetBorderWidth(0);
- max_flow_sizer->Add(max_flow_text, 0, wxALIGN_LEFT);
- max_flow_sizer->Add(m_max_volumetric_speed, 0, wxEXPAND);
- max_flow_text->Hide();
- m_max_volumetric_speed->Hide();
-
- m_nozzle_temp->GetTextCtrl()->Bind(wxEVT_SET_FOCUS, [](auto&) {});
- m_bed_temp->GetTextCtrl()->Bind(wxEVT_SET_FOCUS, [](auto&) {});
- m_max_volumetric_speed->GetTextCtrl()->Bind(wxEVT_SET_FOCUS, [](auto&) {});
-
- info_sizer->Add(nozzle_temp_sizer);
- info_sizer->Add(bed_temp_sizer);
- info_sizer->Add(max_flow_sizer);
- printing_param_sizer->Add(info_sizer, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(20));
-
- printing_param_sizer->AddSpacer(FromDIP(10));
-
- panel_sizer->Add(printing_param_panel, 0);
-
- init_presets_selections();
-
-
- auto page_btn_sizer = page->get_btn_hsizer();
-
- auto page_prev_btn = page->get_prev_btn();
- page_prev_btn->SetLabel(_L("Restart"));
- page_prev_btn->SetButtonType(ButtonType::Restart);
-
- auto page_next_btn = page->get_next_btn();
- page_next_btn->SetLabel(_L("Calibrate"));
- page_next_btn->SetButtonType(ButtonType::Calibrate);
-
- // send bar
- m_send_progress_panel = new wxPanel(page);
- m_send_progress_panel->Hide();
- auto send_panel_sizer = new wxBoxSizer(wxVERTICAL);
- m_send_progress_panel->SetSizer(send_panel_sizer);
-
- m_send_progress_bar = std::shared_ptr(new BBLStatusBarSend(m_send_progress_panel));
- m_send_progress_bar->set_cancel_callback_fina([this]() {
- BOOST_LOG_TRIVIAL(info) << "CalibrationWizard::print_job: enter canceled";
- if (CalibUtils::print_job) {
- if (CalibUtils::print_job->is_running()) {
- BOOST_LOG_TRIVIAL(info) << "calibration_print_job: canceled";
- CalibUtils::print_job->cancel();
- }
- CalibUtils::print_job->join();
- }
- show_send_progress_bar(false);
- });
- send_panel_sizer->Add(m_send_progress_bar->get_panel(), 0);
- page_btn_sizer->Insert(1, m_send_progress_panel, 0, wxALIGN_CENTER, 0);
-
- // show bind failed info
- m_sw_print_failed_info = new wxScrolledWindow(m_send_progress_panel, wxID_ANY, wxDefaultPosition, wxSize(FromDIP(380), FromDIP(125)), wxVSCROLL);
- m_sw_print_failed_info->SetBackgroundColour(*wxWHITE);
- m_sw_print_failed_info->SetScrollRate(0, 5);
- m_sw_print_failed_info->SetMinSize(wxSize(FromDIP(380), FromDIP(125)));
- m_sw_print_failed_info->SetMaxSize(wxSize(FromDIP(380), FromDIP(125)));
- m_sw_print_failed_info->Hide();
- send_panel_sizer->Add(m_sw_print_failed_info, 0);
-
- wxBoxSizer* sizer_print_failed_info = new wxBoxSizer(wxVERTICAL);
- m_sw_print_failed_info->SetSizer(sizer_print_failed_info);
-
- wxBoxSizer* sizer_error_code = new wxBoxSizer(wxHORIZONTAL);
- wxBoxSizer* sizer_error_desc = new wxBoxSizer(wxHORIZONTAL);
- wxBoxSizer* sizer_extra_info = new wxBoxSizer(wxHORIZONTAL);
-
- auto st_title_error_code = new wxStaticText(m_sw_print_failed_info, wxID_ANY, _L("Error code"));
- auto st_title_error_code_doc = new wxStaticText(m_sw_print_failed_info, wxID_ANY, ": ");
- m_st_txt_error_code = new Label(m_sw_print_failed_info, wxEmptyString);
- st_title_error_code->SetForegroundColour(0x909090);
- st_title_error_code_doc->SetForegroundColour(0x909090);
- m_st_txt_error_code->SetForegroundColour(0x909090);
- st_title_error_code->SetFont(::Label::Body_13);
- st_title_error_code_doc->SetFont(::Label::Body_13);
- m_st_txt_error_code->SetFont(::Label::Body_13);
- st_title_error_code->SetMinSize(wxSize(FromDIP(74), -1));
- st_title_error_code->SetMaxSize(wxSize(FromDIP(74), -1));
- m_st_txt_error_code->SetMinSize(wxSize(FromDIP(260), -1));
- m_st_txt_error_code->SetMaxSize(wxSize(FromDIP(260), -1));
- sizer_error_code->Add(st_title_error_code, 0, wxALL, 0);
- sizer_error_code->Add(st_title_error_code_doc, 0, wxALL, 0);
- sizer_error_code->Add(m_st_txt_error_code, 0, wxALL, 0);
-
- auto st_title_error_desc = new wxStaticText(m_sw_print_failed_info, wxID_ANY, _L("Error desc"));
- auto st_title_error_desc_doc = new wxStaticText(m_sw_print_failed_info, wxID_ANY, ": ");
- m_st_txt_error_desc = new Label(m_sw_print_failed_info, wxEmptyString);
- st_title_error_desc->SetForegroundColour(0x909090);
- st_title_error_desc_doc->SetForegroundColour(0x909090);
- m_st_txt_error_desc->SetForegroundColour(0x909090);
- st_title_error_desc->SetFont(::Label::Body_13);
- st_title_error_desc_doc->SetFont(::Label::Body_13);
- m_st_txt_error_desc->SetFont(::Label::Body_13);
- st_title_error_desc->SetMinSize(wxSize(FromDIP(74), -1));
- st_title_error_desc->SetMaxSize(wxSize(FromDIP(74), -1));
- m_st_txt_error_desc->SetMinSize(wxSize(FromDIP(260), -1));
- m_st_txt_error_desc->SetMaxSize(wxSize(FromDIP(260), -1));
- sizer_error_desc->Add(st_title_error_desc, 0, wxALL, 0);
- sizer_error_desc->Add(st_title_error_desc_doc, 0, wxALL, 0);
- sizer_error_desc->Add(m_st_txt_error_desc, 0, wxALL, 0);
-
- auto st_title_extra_info = new wxStaticText(m_sw_print_failed_info, wxID_ANY, _L("Extra info"));
- auto st_title_extra_info_doc = new wxStaticText(m_sw_print_failed_info, wxID_ANY, ": ");
- m_st_txt_extra_info = new Label(m_sw_print_failed_info, wxEmptyString);
- st_title_extra_info->SetForegroundColour(0x909090);
- st_title_extra_info_doc->SetForegroundColour(0x909090);
- m_st_txt_extra_info->SetForegroundColour(0x909090);
- st_title_extra_info->SetFont(::Label::Body_13);
- st_title_extra_info_doc->SetFont(::Label::Body_13);
- m_st_txt_extra_info->SetFont(::Label::Body_13);
- st_title_extra_info->SetMinSize(wxSize(FromDIP(74), -1));
- st_title_extra_info->SetMaxSize(wxSize(FromDIP(74), -1));
- m_st_txt_extra_info->SetMinSize(wxSize(FromDIP(260), -1));
- m_st_txt_extra_info->SetMaxSize(wxSize(FromDIP(260), -1));
- sizer_extra_info->Add(st_title_extra_info, 0, wxALL, 0);
- sizer_extra_info->Add(st_title_extra_info_doc, 0, wxALL, 0);
- sizer_extra_info->Add(m_st_txt_extra_info, 0, wxALL, 0);
-
- sizer_print_failed_info->Add(sizer_error_code, 0, wxLEFT, 5);
- sizer_print_failed_info->Add(0, 0, 0, wxTOP, FromDIP(3));
- sizer_print_failed_info->Add(sizer_error_desc, 0, wxLEFT, 5);
- sizer_print_failed_info->Add(0, 0, 0, wxTOP, FromDIP(3));
- sizer_print_failed_info->Add(sizer_extra_info, 0, wxLEFT, 5);
- // send bar
-
- m_presets_panel->Layout();
- panel_sizer->Fit(m_presets_panel);
-
- m_comboBox_nozzle_dia->Bind(wxEVT_COMBOBOX, &CalibrationWizard::on_select_nozzle, this);
- Bind(EVT_CALIBRATION_TAB_CHANGED, &CalibrationWizard::on_select_nozzle, this);
- m_comboBox_bed_type->Bind(wxEVT_COMBOBOX, &CalibrationWizard::on_select_bed_type, this);
- m_ams_sync_button->Bind(wxEVT_BUTTON, [this](wxCommandEvent& e) {
- on_update_ams_filament();
- });
- m_ams_radiobox->Bind(wxEVT_RADIOBUTTON, &CalibrationWizard::on_choose_ams, this);
- m_ext_spool_radiobox->Bind(wxEVT_RADIOBUTTON, &CalibrationWizard::on_choose_ext_spool, this);
-
- return page;
-}
-
-CalibrationWizardPage* CalibrationWizard::create_print_page() {
- auto page = new CalibrationWizardPage(m_scrolledWindow);
- page->set_page_type(PageType::Calibration);
- page->set_highlight_step_text(PageType::Calibration);
- auto sizer = page->get_content_vsizer();
-
- m_print_picture = new wxStaticBitmap(page, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0);
- sizer->Add(m_print_picture, 0, wxALIGN_CENTER, 0);
- sizer->AddSpacer(FromDIP(20));
-
- m_print_panel = new wxPanel(page);
- m_print_panel->SetSize({ CALIBRATION_PROGRESSBAR_LENGTH, -1 });
- m_print_panel->SetMinSize({ CALIBRATION_PROGRESSBAR_LENGTH, -1 });
-
- page->get_prev_btn()->Hide();
-
- m_btn_next = page->get_next_btn();
- m_btn_next->SetLabel(_L("Next"));
- m_btn_next->SetButtonType(ButtonType::Next);
-
- m_btn_recali = page->get_prev_btn();
- m_btn_recali->SetLabel(_L("Re-Calibrate"));
- m_btn_recali->SetButtonType(ButtonType::Recalibrate);
-
- sizer->Add(m_print_panel, 0, wxALIGN_CENTER, 0);
- auto panel_sizer = new wxBoxSizer(wxVERTICAL);
-
-
- m_staticText_profile_value = new wxStaticText(m_print_panel, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT | wxST_ELLIPSIZE_END);
- m_staticText_profile_value->Wrap(-1);
- m_staticText_profile_value->SetFont(Label::Body_14);
- m_staticText_profile_value->SetForegroundColour(0x6B6B6B);
-
-
- m_printing_stage_value = new wxStaticText(m_print_panel, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT | wxST_ELLIPSIZE_END);
- m_printing_stage_value->SetFont(Label::Body_14);
- m_printing_stage_value->Wrap(-1);
- m_printing_stage_value->SetForegroundColour(wxColour(0, 174, 66));
-
-
- wxPanel* panel_text = new wxPanel(m_print_panel);
- panel_text->SetBackgroundColour(*wxWHITE);
-
- wxBoxSizer* text_sizer = new wxBoxSizer(wxHORIZONTAL);
-
- m_staticText_progress_percent = new wxStaticText(panel_text, wxID_ANY, "0%", wxDefaultPosition, wxDefaultSize, 0);
- m_staticText_progress_percent->SetFont(::Label::Head_18);
- m_staticText_progress_percent->SetForegroundColour(wxColour(0, 174, 66));
-
- m_staticText_layers = new wxStaticText(panel_text, wxID_ANY, _L("Layer: N/A"));
- m_staticText_layers->SetFont(::Label::Body_15);
- m_staticText_layers->SetForegroundColour(wxColour(146, 146, 146));
-
- m_staticText_progress_left_time = new wxStaticText(panel_text, wxID_ANY, NA_STR, wxDefaultPosition, wxDefaultSize, 0);
- m_staticText_progress_left_time->Wrap(-1);
- m_staticText_progress_left_time->SetFont(::Label::Body_15);
- m_staticText_progress_left_time->SetForegroundColour(wxColour(146, 146, 146));
-
- text_sizer->Add(m_staticText_progress_percent, 0, wxALIGN_CENTER, 0);
- text_sizer->Add(0, 0, 1, wxEXPAND, 0);
- text_sizer->Add(m_staticText_layers, 0, wxALIGN_CENTER | wxALL, 0);
- text_sizer->Add(0, 0, 0, wxLEFT, FromDIP(20));
- text_sizer->Add(m_staticText_progress_left_time, 0, wxALIGN_CENTER | wxALL, 0);
- text_sizer->AddSpacer(FromDIP(90));
-
- panel_text->SetSizer(text_sizer);
-
-
- auto panel_progressbar = new wxPanel(m_print_panel, wxID_ANY);
- panel_progressbar->SetBackgroundColour(*wxWHITE);
- auto progressbar_sizer = new wxBoxSizer(wxHORIZONTAL);
-
- m_print_gauge_progress = new ProgressBar(panel_progressbar, wxID_ANY, 100, wxDefaultPosition, wxDefaultSize);
- m_print_gauge_progress->SetValue(0);
- m_print_gauge_progress->SetHeight(FromDIP(8));
- m_print_gauge_progress->SetSize(wxSize(FromDIP(400), -1));
- m_print_gauge_progress->SetMinSize(wxSize(FromDIP(400), -1));
-
- m_button_pause_resume = new ScalableButton(panel_progressbar, wxID_ANY, "print_control_pause", wxEmptyString, wxDefaultSize, wxDefaultPosition, wxBU_EXACTFIT | wxNO_BORDER, true);
-
- m_button_abort = new ScalableButton(panel_progressbar, wxID_ANY, "print_control_stop", wxEmptyString, wxDefaultSize, wxDefaultPosition, wxBU_EXACTFIT | wxNO_BORDER, true);
- m_button_abort->SetToolTip(_L("Stop"));
-
- progressbar_sizer->Add(m_print_gauge_progress, 1, wxALIGN_CENTER_VERTICAL, 0);
- progressbar_sizer->Add(0, 0, 0, wxEXPAND | wxLEFT, FromDIP(18));
- progressbar_sizer->Add(m_button_pause_resume, 0, wxALL, FromDIP(5));
- progressbar_sizer->Add(0, 0, 0, wxEXPAND | wxLEFT, FromDIP(18));
- progressbar_sizer->Add(m_button_abort, 0, wxALL, FromDIP(5));
-
- panel_progressbar->SetSizer(progressbar_sizer);
-
- panel_sizer->AddSpacer(FromDIP(15));
- panel_sizer->Add(m_staticText_profile_value, 0, wxEXPAND | wxTOP, FromDIP(5));
- panel_sizer->Add(m_printing_stage_value, 0, wxEXPAND | wxTOP, FromDIP(5));
- panel_sizer->Add(panel_text, 0, wxEXPAND, 0);
- panel_sizer->Add(panel_progressbar, 0, wxEXPAND, 0);
- panel_sizer->AddSpacer(FromDIP(15));
-
- m_print_panel->SetSizer(panel_sizer);
-
- m_print_panel->SetSizer(panel_sizer);
- m_print_panel->Layout();
- panel_sizer->Fit(m_print_panel);
-
-
- m_button_pause_resume->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) {
- if (m_button_pause_resume->GetToolTipText() == _L("Pause")) {
- m_button_pause_resume->SetBitmap(m_bitmap_pause_hover.bmp());
- }
-
- if (m_button_pause_resume->GetToolTipText() == _L("Resume")) {
- m_button_pause_resume->SetBitmap(m_bitmap_resume_hover.bmp());
- }
- });
- m_button_pause_resume->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) {
- if (m_button_pause_resume->GetToolTipText() == _L("Pause")) {
- m_button_pause_resume->SetBitmap(m_bitmap_pause.bmp());
- }
-
- if (m_button_pause_resume->GetToolTipText() == _L("Resume")) {
- m_button_pause_resume->SetBitmap(m_bitmap_resume.bmp());
- }
- });
- m_button_pause_resume->Bind(wxEVT_BUTTON, &CalibrationWizard::on_subtask_pause_resume, this);
- m_button_abort->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) {
- m_button_abort->SetBitmap(m_bitmap_abort_hover.bmp());
- });
- m_button_abort->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) {
- m_button_abort->SetBitmap(m_bitmap_abort.bmp()); }
- );
- m_button_abort->Bind(wxEVT_BUTTON, &CalibrationWizard::on_subtask_abort, this);
-
- return page;
-}
-
-CalibrationWizardPage* CalibrationWizard::create_save_page() {
- auto page = new CalibrationWizardPage(m_scrolledWindow);
- page->set_page_type(PageType::Save);
- page->set_highlight_step_text(PageType::Save);
- auto sizer = page->get_content_vsizer();
-
- m_save_panel = new wxPanel(page);
- sizer->Add(m_save_panel, 0, wxALIGN_CENTER, 0);
- auto panel_sizer = new wxBoxSizer(wxVERTICAL);
- m_save_panel->SetSizer(panel_sizer);
-
- create_save_panel_content(panel_sizer);
-
- auto page_prev_btn = page->get_prev_btn();
- page_prev_btn->SetLabel(_L("Restart"));
- page_prev_btn->SetButtonType(ButtonType::Restart);
-
- auto page_next_btn = page->get_next_btn();
- page_next_btn->SetLabel(_L("Save"));
- page_next_btn->SetButtonType(ButtonType::Save);
-
- return page;
-}
-
-void CalibrationWizard::update_print_error_info(int code, std::string msg, std::string extra)
+CalibrationWizard::~CalibrationWizard()
{
- m_print_error_code = code;
- m_print_error_msg = msg;
- m_print_error_extra = extra;
+ ;
}
-void CalibrationWizard::show_send_failed_info(bool show, int code, wxString description, wxString extra) {
- if (show) {
- if (!m_sw_print_failed_info->IsShown()) {
- m_sw_print_failed_info->Show(true);
-
- m_st_txt_error_code->SetLabelText(wxString::Format("%d", m_print_error_code));
- m_st_txt_error_desc->SetLabelText(wxGetApp().filter_string(m_print_error_msg));
- m_st_txt_extra_info->SetLabelText(wxGetApp().filter_string(m_print_error_extra));
-
- m_st_txt_error_code->Wrap(FromDIP(260));
- m_st_txt_error_desc->Wrap(FromDIP(260));
- m_st_txt_extra_info->Wrap(FromDIP(260));
- }
- else {
- m_sw_print_failed_info->Show(false);
- }
- Layout();
- Fit();
- }
- else {
- if (!m_sw_print_failed_info->IsShown()) { return; }
- m_sw_print_failed_info->Show(false);
- m_st_txt_error_code->SetLabelText(wxEmptyString);
- m_st_txt_error_desc->SetLabelText(wxEmptyString);
- m_st_txt_extra_info->SetLabelText(wxEmptyString);
- Layout();
- Fit();
- }
-}
-
-
-void CalibrationWizard::show_send_progress_bar(bool show)
+void CalibrationWizard::on_cali_job_finished(wxCommandEvent& event)
{
- m_send_progress_panel->Show(show);
-
- get_curr_page()->get_prev_btn()->Show(!show);
- get_curr_page()->get_next_btn()->Show(!show);
-
- Layout();
+ this->on_cali_job_finished();
+ event.Skip();
}
-void CalibrationWizard::on_choose_ams(wxCommandEvent& event) {
- m_filament_list_panel->Show();
- m_virtual_panel->Hide();
- m_filament_from_ext_spool = false;
- m_virtual_tray_comboBox->SetValue(false);
-
- Layout();
- Refresh();
-}
-
-void CalibrationWizard::on_choose_ext_spool(wxCommandEvent& event) {
- m_virtual_panel->Show();
- m_filament_list_panel->Hide();
- m_filament_from_ext_spool = true;
- for (int i = 0; i < m_filament_comboBox_list.size(); i++) {
- m_filament_comboBox_list[i]->SetValue(false);
- }
-
- Layout();
- Refresh();
-}
-
-void CalibrationWizard::show_page(CalibrationWizardPage* page) {
- if (!page)
+void CalibrationWizard::show_step(CalibrationWizardPageStep* step)
+{
+ if (!step)
return;
- auto page_node = m_first_page;
- while (page_node)
- {
- page_node->Hide();
- page_node = page_node->get_next_page();
- }
- m_curr_page = page;
- m_curr_page->Show();
-
- Layout();
-}
-
-void CalibrationWizard::reset_preset_page() {
- m_filament_presets.clear();
- init_presets_selections();
- change_ams_select_mode();
- on_update_ams_filament(false);
- on_switch_ams(m_ams_item_list[0]->m_amsinfo.ams_id);
- for (auto fcb : m_filament_comboBox_list)
- fcb->SetValue(false);
- m_virtual_tray_comboBox->SetValue(false);
-}
-
-void CalibrationWizard::on_click_btn_prev(IntEvent& event)
-{
- bool recalibration = false;
- ButtonType button_type = static_cast(event.get_data());
- switch (button_type)
- {
- case Slic3r::GUI::Back:
- show_page(get_curr_page()->get_prev_page());
- break;
- case Slic3r::GUI::Recalibrate: {
- if (!curr_obj ||
- curr_obj->is_system_printing() ||
- curr_obj->is_in_printing()) {
- MessageDialog msg_dlg(nullptr, _L("Is in printing. Please wait for printing to complete"), wxEmptyString, wxICON_WARNING | wxOK);
- msg_dlg.ShowModal();
- return;
- }
- MessageDialog msg_dlg(nullptr, _L("It will restart to get the results. Do you confirm to re-calibrate?"), wxEmptyString, wxICON_WARNING | wxYES | wxNO);
- auto answer = msg_dlg.ShowModal();
- if (answer == wxID_NO)
- return;
- recalibration = true;
- }
- case Slic3r::GUI::Restart:
- if (!recalibration) {
- MessageDialog msg_dlg(nullptr, _L("It will restart to get the results. Do you confirm to restart?"), wxEmptyString, wxICON_WARNING | wxYES | wxNO);
- auto answer = msg_dlg.ShowModal();
- if (answer == wxID_NO)
- return;
- }
-
- reset_preset_page();
- if (m_mode == CalibMode::Calib_Flow_Rate) {
- auto flow_rate_wizard = static_cast(this);
- flow_rate_wizard->reset_reuse_panels();
- }
- show_page(get_frist_page());
- save_to_printer_calib_info(PageType::Start);
- break;
- }
-}
-
-void CalibrationWizard::on_click_btn_next(IntEvent& event)
-{
- ButtonType button_type = static_cast(event.get_data());
- switch (button_type)
- {
- case Slic3r::GUI::Start:
- show_page(get_curr_page()->get_next_page());
- break;
- case Slic3r::GUI::Next:
- set_save_name();
- show_page(get_curr_page()->get_next_page());
- save_to_printer_calib_info(m_curr_page->get_page_type());
- break;
- case Slic3r::GUI::Calibrate: {
- if(!curr_obj){
- MessageDialog msg_dlg(nullptr, _L("No Printer Connected!"), wxEmptyString, wxICON_WARNING | wxOK);
- msg_dlg.ShowModal();
- return;
- }
-
- if (curr_obj->is_connecting() || !curr_obj->is_connected()) {
- MessageDialog msg_dlg(nullptr, _L("Printer is not connected yet."), wxEmptyString, wxICON_WARNING | wxOK);
- msg_dlg.ShowModal();
- return;
- }
-
- if (!m_printer_preset || m_filament_presets.empty() || !m_print_preset) {
- wxString tips;
- if (!m_printer_preset) {
- tips = _L("Please select a printer and nozzle for calibration.");
- }
- else if (!m_print_preset) {
- tips = _L("No print preset");
- }
- else {
- tips = _L("Please select filament for calibration.");
- }
- MessageDialog msg_dlg(nullptr, tips, wxEmptyString, wxICON_WARNING | wxOK);
- msg_dlg.ShowModal();
- return;
- }
-
- if (curr_obj->is_system_printing() ||
- curr_obj->is_in_printing()) {
- MessageDialog msg_dlg(nullptr, _L("Is in printing. Please wait for printing to complete"), wxEmptyString, wxICON_WARNING | wxOK);
- msg_dlg.ShowModal();
- return;
- }
-
- std::string nozzle_temp_str = m_nozzle_temp->GetTextCtrl()->GetValue().ToStdString();
- std::string bed_temp_str = m_bed_temp->GetTextCtrl()->GetValue().ToStdString();
- std::string max_volumetric_speed_str = m_max_volumetric_speed->GetTextCtrl()->GetValue().ToStdString();
- if (nozzle_temp_str.empty() || bed_temp_str.empty() || max_volumetric_speed_str.empty()) {
- MessageDialog msg_dlg(nullptr, _L("The printing parameters is empty, please reselect nozzle and plate type."), wxEmptyString, wxICON_WARNING | wxOK);
- msg_dlg.ShowModal();
- return;
- }
-
- std::vector tray_ids = get_selected_tray();
- if (start_calibration(tray_ids)) {
- is_between_start_and_runing = true;
- if (m_mode != CalibMode::Calib_Flow_Rate) {
- save_to_printer_calib_info(PageType::Calibration);
- }
- }
- break;
- }
- case Slic3r::GUI::Save:
- if (!curr_obj ||
- curr_obj->is_system_printing() ||
- curr_obj->is_in_printing()) {
- MessageDialog msg_dlg(nullptr, _L("Is in printing. Please wait for printing to complete"), wxEmptyString, wxICON_WARNING | wxOK);
- msg_dlg.ShowModal();
- return;
- }
- if (save_calibration_result()) {
- MessageDialog msg_dlg(nullptr, _L("Saved success."), wxEmptyString, wxICON_WARNING | wxOK);
- msg_dlg.ShowModal();
- save_to_printer_calib_info(PageType::Finish);
- }
- break;
- default:
- break;
- }
-}
-
-void CalibrationWizard::init_printer_calib_info_from_appconfig() {
- std::vector infos = wxGetApp().app_config->get_printer_cali_infos();
- for (int i = 0; i < infos.size(); i++) {
- if (m_printer_calib_infos.find(infos[i].dev_id) == m_printer_calib_infos.end()) {
- m_printer_calib_infos[infos[i].dev_id].dev_id = infos[i].dev_id;
- m_printer_calib_infos[infos[i].dev_id].filament_presets = infos[i].filament_presets;
- m_printer_calib_infos[infos[i].dev_id].mode = infos[i].mode;
- m_printer_calib_infos[infos[i].dev_id].state = infos[i].state;
- //m_printer_calib_infos[infos[i].dev_id].nozzle_dia = infos[i].nozzle_dia;
- //m_printer_calib_infos[infos[i].dev_id].bed_type = infos[i].bed_type;
- }
- }
-}
-
-void CalibrationWizard::save_to_printer_calib_info(PageType page_type) {
- if (curr_obj) {
- m_printer_calib_infos[curr_obj->dev_id].dev_id = curr_obj->dev_id;
- m_printer_calib_infos[curr_obj->dev_id].mode = m_mode;
- m_printer_calib_infos[curr_obj->dev_id].state = static_cast(page_type);
- for (auto filament_preset : m_filament_presets) {
- m_printer_calib_infos[curr_obj->dev_id].filament_presets[filament_preset.first] = filament_preset.second->name;
- }
- //m_printer_calib_infos[curr_obj->dev_id].nozzle_dia = stof(m_comboBox_nozzle_dia->GetValue().ToStdString());
- //m_printer_calib_infos[curr_obj->dev_id].bed_type = (int)(m_comboBox_bed_type->GetSelection() + btDefault + 1);
- wxGetApp().app_config->save_printer_cali_infos(m_printer_calib_infos[curr_obj->dev_id]);
- }
-}
-
-void CalibrationWizard::update_print_progress()
-{
- DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager();
- if (!dev || !curr_obj) {
- reset_printing_values();
- return;
+ if (m_curr_step) {
+ m_curr_step->page->Hide();
}
- // check valid machine
- if (dev->get_my_machine(curr_obj->dev_id) == nullptr) {
- reset_printing_values();
- return;
- }
+ m_curr_step = step;
- if (curr_obj->is_connecting()) {
- reset_printing_values();
- return;
- }
- else if (!curr_obj->is_connected()) {
- reset_printing_values();
- return;
- }
-
- m_print_panel->Freeze();
-
- if (curr_obj->is_support_layer_num) {
- m_staticText_layers->Show();
- }
- else {
- m_staticText_layers->Hide();
- }
-
- if (curr_obj->print_status == "RUNNING") {
- is_between_start_and_runing = false;
- m_btn_recali->Hide();
- m_print_panel->GetParent()->Layout();
- }
-
- if (curr_obj->is_system_printing()) {
- reset_printing_values();
- }
- else if (curr_obj->is_in_printing() || curr_obj->print_status == "FINISH" || curr_obj->print_status == "IDLE") {
- if (curr_obj->is_in_prepare() || curr_obj->print_status == "SLICING") {
- reset_printing_values();
-
- wxString prepare_text;
- if (curr_obj->is_in_prepare())
- prepare_text = wxString::Format(_L("Downloading..."));
- else if (curr_obj->print_status == "SLICING") {
- if (curr_obj->queue_number <= 0) {
- prepare_text = wxString::Format(_L("Cloud Slicing..."));
- }
- else {
- prepare_text = wxString::Format(_L("In Cloud Slicing Queue, there are %s tasks ahead."), std::to_string(curr_obj->queue_number));
- }
- }
- else
- prepare_text = wxString::Format(_L("Downloading..."));
-
- if (curr_obj->gcode_file_prepare_percent >= 0 && curr_obj->gcode_file_prepare_percent <= 100)
- prepare_text += wxString::Format("(%d%%)", curr_obj->gcode_file_prepare_percent);
- m_printing_stage_value->SetLabelText(prepare_text);
- wxString subtask_text = wxString::Format("%s", GUI::from_u8(curr_obj->subtask_name));
- if (curr_obj->get_modeltask() && curr_obj->get_modeltask()->design_id > 0) {
- if (!m_staticText_profile_value->IsShown()) { m_staticText_profile_value->Show(); }
- m_staticText_profile_value->SetLabelText(wxString::FromUTF8(curr_obj->get_modeltask()->profile_name));
- }
- else {
- m_staticText_profile_value->SetLabelText(wxEmptyString);
- m_staticText_profile_value->Hide();
- }
- }
- else {
- if (curr_obj->can_resume()) {
- m_button_pause_resume->SetBitmap(m_bitmap_resume.bmp());
- if (m_button_pause_resume->GetToolTipText() != _L("Resume")) { m_button_pause_resume->SetToolTip(_L("Resume")); }
- }
- else {
- m_button_pause_resume->SetBitmap(m_bitmap_pause.bmp());
- if (m_button_pause_resume->GetToolTipText() != _L("Pause")) { m_button_pause_resume->SetToolTip(_L("Pause")); }
- }
-
- if ((curr_obj->print_status == "FINISH" || curr_obj->print_status == "IDLE")) {
- if (is_between_start_and_runing) {
- // just entering, fake status
- reset_printing_values();
- m_print_panel->Thaw();
- return;
- }
- else {
- // true status
- m_btn_recali->Show();
- if (curr_obj->print_status == "IDLE")
- reset_printing_values();
-
- if (m_curr_page->get_page_type() == PageType::Calibration || m_curr_page->get_page_type() == PageType::Save)
- {
- request_calib_result();
- }
- if (curr_obj->print_status == "FINISH" || curr_obj->print_status == "IDLE")
- {
- m_button_abort->Enable(false);
- m_button_abort->SetBitmap(m_bitmap_abort_disable.bmp());
- m_button_pause_resume->Enable(false);
- m_button_pause_resume->SetBitmap(m_bitmap_resume_disable.bmp());
- m_btn_next->Enable(true);
- }
- m_print_panel->GetParent()->Layout();
- }
- }
- else {
- m_button_abort->Enable(true);
- m_button_abort->SetBitmap(m_bitmap_abort.bmp());
- m_button_pause_resume->Enable(true);
- m_btn_next->Enable(false);
- }
-
- // update printing stage
- m_printing_stage_value->SetLabelText(curr_obj->get_curr_stage());
- // update left time
- std::string left_time;
- try {
- left_time = get_bbl_monitor_time_dhm(curr_obj->mc_left_time);
- }
- catch (...) {
- ;
- }
- wxString left_time_text = left_time.empty() ? NA_STR : wxString::Format("-%s", left_time);
- m_staticText_progress_left_time->SetLabelText(left_time_text);
-
- if (curr_obj->subtask_) {
- m_print_gauge_progress->SetValue(curr_obj->subtask_->task_progress);
- m_staticText_progress_percent->SetLabelText(wxString::Format("%d%%", curr_obj->subtask_->task_progress));
- m_staticText_layers->SetLabelText(wxString::Format(_L("Layer: %d/%d"), curr_obj->curr_layer, curr_obj->total_layers));
-
- }
- else {
- m_print_gauge_progress->SetValue(0);
- m_staticText_progress_percent->SetLabelText(NA_STR);
- m_staticText_layers->SetLabelText(wxString::Format(_L("Layer: %s"), NA_STR));
- }
- }
-
- wxString subtask_text = wxString::Format("%s", GUI::from_u8(curr_obj->subtask_name));
-
- if (curr_obj->get_modeltask() && curr_obj->get_modeltask()->design_id > 0) {
- if (!m_staticText_profile_value->IsShown()) { m_staticText_profile_value->Show(); }
- m_staticText_profile_value->SetLabelText(wxString::FromUTF8(curr_obj->get_modeltask()->profile_name));
- }
- else {
- m_staticText_profile_value->SetLabelText(wxEmptyString);
- m_staticText_profile_value->Hide();
- }
- }
- else {
- reset_printing_values();
- if (curr_obj->print_status == "FAILED" && !is_between_start_and_runing) {
- m_btn_recali->Show();
- m_printing_stage_value->SetLabelText(_L("FAILED"));
- }
- }
-
- if (is_between_start_and_runing) {
- m_btn_recali->Hide();
- m_print_panel->GetParent()->Layout();
- }
-
- check_sync_printer_status();
-
- m_print_panel->Layout();
-
- m_print_panel->Thaw();
-}
-
-void CalibrationWizard::reset_printing_values()
-{
- m_button_pause_resume->Enable(false);
- m_button_pause_resume->SetBitmap(m_bitmap_pause_disable.bmp());
-
- m_button_abort->Enable(false);
- m_button_abort->SetBitmap(m_bitmap_abort_disable.bmp());
-
- m_btn_next->Enable(false);
-
- m_staticText_profile_value->SetLabelText(wxEmptyString);
- m_staticText_profile_value->Hide();
- m_printing_stage_value->SetLabelText("");
- m_print_gauge_progress->SetValue(0);
- m_staticText_progress_left_time->SetLabelText(NA_STR);
- m_staticText_layers->SetLabelText(wxString::Format(_L("Layer: %s"), NA_STR));
- m_staticText_progress_percent->SetLabelText(NA_STR);
- m_print_panel->Layout();
-}
-
-void CalibrationWizard::on_subtask_pause_resume(wxCommandEvent& event)
-{
- if (curr_obj) {
- if (curr_obj->can_resume())
- curr_obj->command_task_resume();
- else
- curr_obj->command_task_pause();
- }
-}
-
-void CalibrationWizard::on_subtask_abort(wxCommandEvent& event)
-{
- MessageDialog msg_dlg(nullptr, _L("Are you sure you want to cancel this calibration? It will return to start page"), wxEmptyString, wxICON_WARNING | wxOK | wxCANCEL);
- if (msg_dlg.ShowModal() == wxID_OK) {
- if (curr_obj) curr_obj->command_task_abort();
- m_btn_recali->Show();
- if (m_mode == CalibMode::Calib_Flow_Rate) {
- auto flow_rate_wizard = static_cast(this);
- flow_rate_wizard->reset_reuse_panels();
- }
- show_page(get_frist_page());
- save_to_printer_calib_info(PageType::Start);
- }
- //if (abort_dlg == nullptr) {
- // abort_dlg = new SecondaryCheckDialog(this->GetParent(), wxID_ANY, _L("Cancel print"));
- // abort_dlg->Bind(EVT_SECONDARY_CHECK_CONFIRM, [this](wxCommandEvent& e) {
- // if (obj) obj->command_task_abort();
- // });
- //}
- //abort_dlg->update_text(_L("Are you sure you want to cancel this print?"));
- //abort_dlg->on_show();
-}
-
-void CalibrationWizard::set_ams_select_mode(FilamentSelectMode mode) {
- for (int i = 0; i < m_filament_comboBox_list.size(); i++) {
- m_filament_comboBox_list[i]->set_select_mode(mode);
- if (i >= 4)
- m_filament_comboBox_list[i]->GetCheckBox()->Show(false);
- }
-}
-
-std::vector CalibrationWizard::get_selected_tray()
-{
- std::vector tray_ids;
-
- if (m_filament_from_ext_spool) {
- if(m_virtual_tray_comboBox->GetRadioBox()->GetValue())
- tray_ids.push_back(m_virtual_tray_comboBox->get_tray_id());
- }
- else {
- if (get_ams_select_mode() == FilamentSelectMode::FSMCheckBoxMode) {
- for (auto& fcb : m_filament_comboBox_list) {
- if (fcb->GetCheckBox()->GetValue()) {
- tray_ids.push_back(fcb->get_tray_id());
- }
- }
- }
- else if (get_ams_select_mode() == FilamentSelectMode::FSMRadioMode) {
- for (auto& fcb : m_filament_comboBox_list) {
- if (fcb->GetRadioBox()->GetValue()) {
- tray_ids.push_back(fcb->get_tray_id());
- }
- }
- }
- }
- return tray_ids;
-}
-
-void CalibrationWizard::set_selected_tray(const std::vector& tray_ids)
-{
- if (tray_ids.empty())
- return;
-
- if (tray_ids[0] == VIRTUAL_TRAY_ID) {
- assert(tray_ids.size() == 1);
- m_filament_from_ext_spool = true;
- m_virtual_tray_comboBox->SetValue(true, false);
- }
- else {
- m_filament_from_ext_spool = false;
- for (int tray_id : tray_ids) {
- if (get_ams_select_mode() == FilamentSelectMode::FSMCheckBoxMode) {
- for (auto& fcb : m_filament_comboBox_list) {
- if (fcb->get_tray_id() == tray_id) {
- fcb->SetValue(true, false);
- }
- }
- }
- else if (get_ams_select_mode() == FilamentSelectMode::FSMRadioMode) {
- for (auto& fcb : m_filament_comboBox_list) {
- if (fcb->get_tray_id() == tray_id) {
- fcb->SetValue(true, false);
- }
- }
- }
- }
- }
- recommend_input_value();
-}
-
-FilamentComboBoxList CalibrationWizard::get_selected_filament_comboBox()
-{
- FilamentComboBoxList fcb_list;
-
- if (m_filament_from_ext_spool) {
- if (m_virtual_tray_comboBox->GetRadioBox()->GetValue())
- fcb_list.push_back(m_virtual_tray_comboBox);
- }
- else {
- if (get_ams_select_mode() == FilamentSelectMode::FSMCheckBoxMode) {
- for (auto& fcb : m_filament_comboBox_list) {
- if (fcb->GetCheckBox()->GetValue()) {
- fcb_list.push_back(fcb);
- }
- }
- }
- else if (get_ams_select_mode() == FilamentSelectMode::FSMRadioMode) {
- for (auto& fcb : m_filament_comboBox_list) {
- if (fcb->GetRadioBox()->GetValue()) {
- fcb_list.push_back(fcb);
- }
- }
- }
- }
- return fcb_list;
-}
-
-void CalibrationWizard::init_presets_selections() {
- init_nozzle_selections();
- init_bed_type_selections();
- init_process_selections();
-}
-
-void CalibrationWizard::init_nozzle_selections()
-{
- m_comboBox_nozzle_dia->Clear();
- m_printer_preset = nullptr;
- if (curr_obj) {
- m_comboBox_nozzle_dia->AppendString(wxString::Format("%1.1f", 0.2));
- m_comboBox_nozzle_dia->AppendString(wxString::Format("%1.1f", 0.4));
- m_comboBox_nozzle_dia->AppendString(wxString::Format("%1.1f", 0.6));
- m_comboBox_nozzle_dia->AppendString(wxString::Format("%1.1f", 0.8));
- m_comboBox_nozzle_dia->SetSelection(-1);
- if (is_high_end_type(curr_obj) &&
- (abs(curr_obj->nozzle_diameter - 0.2f) < 1e-3 ||
- abs(curr_obj->nozzle_diameter - 0.4f) < 1e-3 ||
- abs(curr_obj->nozzle_diameter - 0.6f) < 1e-3 ||
- abs(curr_obj->nozzle_diameter - 0.8f) < 1e-3)
- ) {
- m_comboBox_nozzle_dia->SetValue(wxString::Format("%1.1f", curr_obj->nozzle_diameter));
- wxCommandEvent evt(wxEVT_COMBOBOX);
- evt.SetEventObject(m_comboBox_nozzle_dia);
- wxPostEvent(m_comboBox_nozzle_dia, evt);
- }
- else {
- m_comboBox_nozzle_dia->SetValue("");
- }
- }
-}
-
-void CalibrationWizard::init_bed_type_selections()
-{
- m_comboBox_bed_type->Clear();
- int curr_selection = 0;
- if (curr_obj) {
- const ConfigOptionDef* bed_type_def = print_config_def.get("curr_bed_type");
- if (bed_type_def && bed_type_def->enum_keys_map) {
- for (auto item : bed_type_def->enum_labels) {
- m_comboBox_bed_type->AppendString(_L(item));
- }
- m_comboBox_bed_type->SetSelection(curr_selection);
- }
- }
-}
-
-void CalibrationWizard::init_process_selections()
-{
- m_comboBox_process->Clear();
- m_print_preset = nullptr;
- wxArrayString print_items;
- PresetBundle* preset_bundle = wxGetApp().preset_bundle;
-
- double nozzle_value = 0.4;
- wxString nozzle_value_str = m_comboBox_nozzle_dia->GetValue();
- try {
- nozzle_value_str.ToDouble(&nozzle_value);
- }
- catch (...) {
- ;
- }
-
- if (preset_bundle && curr_obj) {
- for (auto print_it = preset_bundle->prints.begin(); print_it != preset_bundle->prints.end(); print_it++) {
- ConfigOption* printer_opt = print_it->config.option("compatible_printers");
- ConfigOptionStrings* printer_strs = dynamic_cast(printer_opt);
- for (auto printer_str : printer_strs->values) {
- if (m_printer_preset && m_printer_preset->name == printer_str) {
- wxString process_name = wxString::FromUTF8(print_it->name);
- print_items.Add(process_name);
- break;
- }
- }
- }
- m_comboBox_process->Set(print_items);
- m_comboBox_process->SetSelection((print_items.size() + 1) / 2 - 1);
-
- for (auto print_it = preset_bundle->prints.begin(); print_it != preset_bundle->prints.end(); print_it++) {
- wxString print_name = wxString::FromUTF8(print_it->name);
- if (print_name.compare(m_comboBox_process->GetValue()) == 0) {
- m_print_preset = &*print_it;
- }
- }
- }
-}
-
-void CalibrationWizard::check_has_ams(MachineObject* obj) {
- if (obj->amsList.size() == 0 || obj->ams_exist_bits == 0) {
- m_select_ams_mode_panel->Hide();
- wxCommandEvent radioBox_evt(wxEVT_RADIOBUTTON);
- radioBox_evt.SetEventObject(m_ext_spool_radiobox);
- wxPostEvent(m_ext_spool_radiobox, radioBox_evt);
- }
- else {
- m_select_ams_mode_panel->Show();
- wxCommandEvent radioBox_evt(wxEVT_RADIOBUTTON);
- radioBox_evt.SetEventObject(m_ams_radiobox);
- wxPostEvent(m_ams_radiobox, radioBox_evt);
- }
-}
-
-void CalibrationWizard::update_printer() {
- DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager();
- if (!dev) return;
- MachineObject* new_obj = dev->get_selected_machine();
- if (new_obj) {
- check_has_ams(new_obj);
-
- if (new_obj != curr_obj) {
- curr_obj = new_obj;
- wxGetApp().sidebar().load_ams_list(new_obj->dev_id, new_obj);
- wxGetApp().preset_bundle->set_calibrate_printer("");
- init_presets_selections();
- change_ams_select_mode();
- on_update_ams_filament(false);
- on_switch_ams(m_ams_item_list[0]->m_amsinfo.ams_id);
- for (auto& fcb : m_filament_comboBox_list)
- fcb->SetValue(false);
- m_virtual_tray_comboBox->SetValue(false);
-
- // for pa & flow rate calibration, need to change high end or low end pages
- SimpleEvent e(EVT_CALIBRATION_NOTIFY_CHANGE_PAGES);
- e.SetEventObject(this);
- GetEventHandler()->ProcessEvent(e);
-
- auto it = m_printer_calib_infos.find(curr_obj->dev_id);
- if (it != m_printer_calib_infos.end() && it->second.mode == m_mode) {
- PresetBundle* preset_bundle = wxGetApp().preset_bundle;
- if (preset_bundle) {
- for (auto filament_preset : m_printer_calib_infos[curr_obj->dev_id].filament_presets) {
- for (auto filament_it = preset_bundle->filaments.begin(); filament_it != preset_bundle->filaments.end(); filament_it++) {
- if (filament_it->name == filament_preset.second) {
- m_filament_presets[filament_preset.first] = (&*filament_it);
- }
- }
- }
- }
- std::vector tray_ids;
- for (auto filament_preset : it->second.filament_presets) {
- tray_ids.push_back(filament_preset.first);
- }
- set_selected_tray(tray_ids);
- jump_to_page(static_cast(m_printer_calib_infos[curr_obj->dev_id].state));
- }
- else {
- // reset to first page
- show_page(m_first_page);
- }
- }
- }
- else {
- curr_obj = nullptr;
- }
-}
-
-void CalibrationWizard::on_select_nozzle(wxCommandEvent& evt) {
- if (curr_obj) {
- double nozzle_value = 0.0;
- wxString nozzle_value_str = m_comboBox_nozzle_dia->GetValue();
- try {
- nozzle_value_str.ToDouble(&nozzle_value);
- }
- catch (...) {
- ;
- }
- PresetBundle* preset_bundle = wxGetApp().preset_bundle;
- for (auto printer_it = preset_bundle->printers.begin(); printer_it != preset_bundle->printers.end(); printer_it++) {
- // only use system printer preset
- if (!printer_it->is_system) continue;
-
- ConfigOption* printer_nozzle_opt = printer_it->config.option("nozzle_diameter");
- ConfigOptionFloats* printer_nozzle_vals = nullptr;
- if (printer_nozzle_opt)
- printer_nozzle_vals = dynamic_cast(printer_nozzle_opt);
- std::string model_id = printer_it->get_current_printer_type(preset_bundle);
- if (model_id.compare(curr_obj->printer_type) == 0
- && printer_nozzle_vals
- && abs(printer_nozzle_vals->get_at(0) - nozzle_value) < 1e-3) {
- m_printer_preset = &*printer_it;
- }
- }
-
- if (m_printer_preset) {
- preset_bundle->set_calibrate_printer(m_printer_preset->name);
- on_update_ams_filament(false);
-
- init_process_selections();
- }
- }
-}
-
-void CalibrationWizard::on_select_bed_type(wxCommandEvent& evt) {
- recommend_input_value();
-}
-
-void CalibrationWizard::on_switch_ams(std::string ams_id)
-{
- for (auto i = 0; i < m_ams_item_list.size(); i++) {
- AMSItem* item = m_ams_item_list[i];
- if (item->m_amsinfo.ams_id == ams_id) {
- item->OnSelected();
- }
- else {
- item->UnSelected();
- }
- }
-
- for (int i = 0; i < m_filament_comboBox_list.size(); i++) {
- if (stoi(ams_id) * 4 <= i && i < stoi(ams_id) * 4 + 4)
- m_filament_comboBox_list[i]->Show(true);
- else {
- m_filament_comboBox_list[i]->SetValue(false);
- m_filament_comboBox_list[i]->Show(false);
- }
+ if (m_curr_step) {
+ m_curr_step->page->Show();
}
Layout();
}
-static std::map filament_is_high_temp{
- {"PLA", false},
- {"PLA-CF", false},
- //{"PETG", true},
- {"ABS", true},
- {"TPU", false},
- {"PA", true},
- {"PA-CF", true},
- {"PET-CF", true},
- {"PC", true},
- {"ASA", true},
- {"HIPS", true}
-};
-
-void CalibrationWizard::on_select_tray(SimpleEvent& evt) {
- // when set selection of comboBox or select a checkbox/radio will enter
-
- FilamentComboBoxList fcb_list = get_selected_filament_comboBox();
- if (fcb_list.empty()) {
- m_filament_presets.clear();
- m_filaments_incompatible_tips->SetLabel("");
- m_filaments_incompatible_tips->Hide();
- recommend_input_value();
- return;
- }
- // check compatibility
- bool has_high_temperature_filament = false;
- bool has_low_temperature_filament = false;
- wxString hight_temp_filament_type = "";
- wxString low_temp_filament_type = "";
- for (auto& fcb : fcb_list) {
- wxString filament_type = "";
- if (fcb->GetComboBox()->get_selected_preset())
- filament_type = fcb->GetComboBox()->get_selected_preset()->alias;
- for (auto& item : filament_is_high_temp) {
- if (filament_type.Contains(item.first)) {
- if (item.second == true) {
- has_high_temperature_filament = true;
- hight_temp_filament_type = item.first;
- }
- else {
- has_low_temperature_filament = true;
- low_temp_filament_type = item.first;
- }
- }
- }
- }
- if (has_high_temperature_filament && has_low_temperature_filament) {
- m_filament_presets.clear();
- wxString tips = wxString::Format(_L("Unable to print %s and %s together. Filaments have large bed temperature difference"), hight_temp_filament_type, low_temp_filament_type);
- m_filaments_incompatible_tips->SetLabel(tips);
- m_filaments_incompatible_tips->Show();
- Layout();
- }
- else {
- for (auto& fcb : fcb_list) {
- Preset* preset = const_cast(fcb->GetComboBox()->get_selected_preset());
- if (preset)
- m_filament_presets[fcb->get_tray_id()] = preset;
- }
- m_filaments_incompatible_tips->SetLabel("");
- m_filaments_incompatible_tips->Hide();
- Layout();
- }
-
- recommend_input_value();
-}
-
-void CalibrationWizard::on_update_ams_filament(bool dialog)
+void CalibrationWizard::update(MachineObject* obj)
{
- auto& list = wxGetApp().preset_bundle->filament_ams_list;
- if (list.empty() && dialog) {
- MessageDialog dlg(this, _L("No AMS filaments. Please select a printer to load AMS info."), _L("Sync filaments with AMS"), wxOK);
- dlg.ShowModal();
- return;
- }
+ curr_obj = obj;
- // clear selections while changing printer
- for (auto& fcb : m_filament_comboBox_list)
- fcb->update_from_preset();
- m_virtual_tray_comboBox->update_from_preset();
-
- // update tray info
- DynamicPrintConfig empty_config;
- empty_config.set_key_value("filament_id", new ConfigOptionStrings{ "" });
- empty_config.set_key_value("tag_uid", new ConfigOptionStrings{ "" });
- empty_config.set_key_value("filament_type", new ConfigOptionStrings{ "" });
- empty_config.set_key_value("tray_name", new ConfigOptionStrings{ "" });
- empty_config.set_key_value("filament_colour", new ConfigOptionStrings{ "" });
- empty_config.set_key_value("filament_exist", new ConfigOptionBools{ false });
- for (int i = 0; i < m_filament_comboBox_list.size(); i++) {
- auto it = std::find_if(list.begin(), list.end(), [i](auto& entry) {
- return entry.first == i;
- });
- if (it != list.end()) {
- m_filament_comboBox_list[i]->load_tray_from_ams(i, it->second);
- }
- else {
- m_filament_comboBox_list[i]->load_tray_from_ams(i, empty_config);
- }
+ /* only update curr step
+ if (m_curr_step) {
+ m_curr_step->page->update(obj);
}
- auto it = std::find_if(list.begin(), list.end(), [](auto& entry) {
- return entry.first == VIRTUAL_TRAY_ID;
- });
- if (it != list.end()) {
- m_virtual_tray_comboBox->load_tray_from_ams(VIRTUAL_TRAY_ID, it->second);
+ */
+ if (!obj) {
+ for (int i = 0; i < m_page_steps.size(); i++) {
+ if (m_page_steps[i]->page)
+ m_page_steps[i]->page->on_reset_page();
+ }
}
else {
- m_virtual_tray_comboBox->load_tray_from_ams(VIRTUAL_TRAY_ID, empty_config);
+ if (last_obj != obj && obj->is_info_ready()) {
+ for (int i = 0; i < m_page_steps.size(); i++) {
+ if (m_page_steps[i]->page)
+ m_page_steps[i]->page->on_device_connected(obj);
+ }
+ this->on_device_connected(obj);
+
+ last_obj = obj;
+ }
}
- // update m_ams_item_list
- std::vector ams_info;
- if (curr_obj) {
- for (auto ams = curr_obj->amsList.begin(); ams != curr_obj->amsList.end(); ams++) {
- AMSinfo info;
- info.ams_id = ams->first;
- if (ams->second->is_exists && info.parse_ams_info(ams->second, curr_obj->ams_calibrate_remain_flag, curr_obj->is_support_ams_humidity)) ams_info.push_back(info);
- }
+ // update all page steps
+ for (int i = 0; i < m_page_steps.size(); i++) {
+ if (m_page_steps[i]->page)
+ m_page_steps[i]->page->update(obj);
}
- for (auto i = 0; i < m_ams_item_list.size(); i++) {
- AMSItem* item = m_ams_item_list[i];
- if (ams_info.size() > 1) {
- m_muilti_ams_panel->Show();
- if (i < ams_info.size()) {
- item->Update(ams_info[i]);
- item->Open();
- }
- else {
- item->Close();
- }
- }
- else {
- m_muilti_ams_panel->Hide();
- item->Close();
- }
- }
- Layout();
}
-bool CalibrationWizard::recommend_input_value() {
- if (m_filament_presets.empty()) {
- m_nozzle_temp->GetTextCtrl()->SetValue(wxEmptyString);
- m_bed_temp->GetTextCtrl()->SetValue(wxEmptyString);
- m_max_volumetric_speed->GetTextCtrl()->SetValue(wxEmptyString);
- m_bed_type_incompatible_tips->SetLabel("");
- m_bed_type_incompatible_tips->Hide();
+void CalibrationWizard::on_device_connected(MachineObject* obj)
+{
+ if (!m_page_steps.empty())
+ show_step(m_page_steps.front());
+}
+
+void CalibrationWizard::set_cali_method(CalibrationMethod method)
+{
+ m_cali_method = method;
+ for (int i = 0; i < m_page_steps.size(); i++) {
+ if (m_page_steps[i]->page)
+ m_page_steps[i]->page->set_cali_method(method);
+ }
+}
+
+bool CalibrationWizard::save_preset(const std::string &old_preset_name, const std::string &new_preset_name, const std::map &key_values, std::string& message)
+{
+ if (new_preset_name.empty()) {
+ message = L("The name cannot be empty.");
return false;
}
- int bed_temp_int = -1;
- bool bed_temp_compatible = true;
- PresetBundle* preset_bundle = wxGetApp().preset_bundle;
- if (preset_bundle) {
- for (auto& filament_preset : m_filament_presets) {
- // update nozzle temperature
- ConfigOption* opt_nozzle_temp = filament_preset.second->config.option("nozzle_temperature");
- if (opt_nozzle_temp) {
- ConfigOptionInts* opt_min_ints = dynamic_cast(opt_nozzle_temp);
- if (opt_min_ints) {
- wxString text_nozzle_temp = wxString::Format("%d", opt_min_ints->get_at(0));
- m_nozzle_temp->GetTextCtrl()->SetValue(text_nozzle_temp);
- }
- }
- // update bed temperature
- bed_temp_int = get_bed_temp(&filament_preset.second->config);
- wxString bed_temp_text = wxString::Format("%d", bed_temp_int);
- m_bed_temp->GetTextCtrl()->SetValue(bed_temp_text);
- // update max flow speed
- ConfigOption* opt_flow_speed = filament_preset.second->config.option("filament_max_volumetric_speed");
- if (opt_flow_speed) {
- ConfigOptionFloats* opt_flow_floats = dynamic_cast(opt_flow_speed);
- if (opt_flow_floats) {
- wxString flow_val_text = wxString::Format("%0.2f", opt_flow_floats->get_at(0));
- m_max_volumetric_speed->GetTextCtrl()->SetValue(flow_val_text);
- }
- }
-
- // check compatibility
- if (m_bed_temp->GetTextCtrl()->GetValue().compare("0") <= 0) {
- m_nozzle_temp->GetTextCtrl()->SetValue(wxEmptyString);
- m_bed_temp->GetTextCtrl()->SetValue(wxEmptyString);
- m_max_volumetric_speed->GetTextCtrl()->SetValue(wxEmptyString);
- wxString tips = wxString::Format(_L("%s is not compatible with %s"), m_comboBox_bed_type->GetValue(), filament_preset.second->alias);
- m_bed_type_incompatible_tips->SetLabel(tips);
- m_bed_type_incompatible_tips->Update();
- m_bed_type_incompatible_tips->Show();
- Layout();
- bed_temp_compatible = false;
- }
- else {
- m_bed_type_incompatible_tips->SetLabel("");
- m_bed_type_incompatible_tips->Hide();
- }
- }
+ PresetCollection *filament_presets = &wxGetApp().preset_bundle->filaments;
+ Preset* preset = filament_presets->find_preset(old_preset_name);
+ if (!preset) {
+ message = L("The selected preset has been deleted.");
+ return false;
}
- return bed_temp_compatible;
-}
-int CalibrationWizard::get_bed_temp(DynamicPrintConfig* config)
-{
- BedType curr_bed_type = BedType(m_comboBox_bed_type->GetSelection() + btDefault + 1);
- const ConfigOptionInts* opt_bed_temp_ints = config->option(get_bed_temp_key(curr_bed_type));
- if (opt_bed_temp_ints) {
- return opt_bed_temp_ints->get_at(0);
- }
- return -1;
-}
-
-bool CalibrationWizard::save_presets(Preset *preset, const std::string &config_key, ConfigOption *config_value, const std::string &new_preset_name, std::string& message)
-{
- PresetCollection* filament_presets = &wxGetApp().preset_bundle->filaments;
-
- std::string new_name = filament_presets->get_preset_name_by_alias(new_preset_name);
- std::string curr_preset_name = preset->name;
- preset = filament_presets->find_preset(curr_preset_name);
Preset temp_preset = *preset;
+ std::string new_name = filament_presets->get_preset_name_by_alias(new_preset_name);
bool exist_preset = false;
// If name is current, get the editing preset
Preset *new_preset = filament_presets->find_preset(new_name);
if (new_preset) {
if (new_preset->is_system) {
- message = "The name cannot be the same as the system preset name.";
+ message = L("The name cannot be the same as the system preset name.");
return false;
}
if (new_preset != preset) {
- message = "The name is the same as another existing preset name";
+ message = L("The name is the same as another existing preset name");
return false;
}
- if (new_preset != &filament_presets->get_edited_preset())
- new_preset = &temp_preset;
+ if (new_preset != &filament_presets->get_edited_preset()) new_preset = &temp_preset;
exist_preset = true;
} else {
new_preset = &temp_preset;
}
- new_preset->config.set_key_value(config_key, config_value);
+ for (auto item : key_values) {
+ new_preset->config.set_key_value(item.first, item.second);
+ }
// Save the preset into Slic3r::data_dir / presets / section_name / preset_name.ini
filament_presets->save_current_preset(new_name, false, false, new_preset);
@@ -1904,6 +170,7 @@ bool CalibrationWizard::save_presets(Preset *preset, const std::string &config_k
// Preset* preset = &m_presets.preset(it - m_presets.begin(), true);
if (!new_preset) {
BOOST_LOG_TRIVIAL(info) << "create new preset failed";
+ message = L("create new preset failed.");
return false;
}
@@ -1924,2345 +191,885 @@ bool CalibrationWizard::save_presets(Preset *preset, const std::string &config_k
wxGetApp().preset_bundle->update_compatible(PresetSelectCompatibleType::Never);
// BBS if create a new prset name, preset changed from preset name to new preset name
- if (!exist_preset) {
- wxGetApp().plater()->sidebar().update_presets_from_to(Preset::Type::TYPE_FILAMENT, curr_preset_name, new_preset->name);
- }
+ if (!exist_preset) { wxGetApp().plater()->sidebar().update_presets_from_to(Preset::Type::TYPE_FILAMENT, old_preset_name, new_preset->name); }
- wxGetApp().mainframe->update_filament_tab_ui();
+ // todo: zhimin
+ // wxGetApp().mainframe->update_filament_tab_ui();
return true;
}
-void CalibrationWizard::jump_to_page(PageType page_type) {
- if (page_type == PageType::Finish) {
- show_page(m_first_page);
- return;
- }
-
- auto tabbook = static_cast(GetParent());
- for (int i = 0; i < tabbook->GetPageCount(); i++) {
- if (static_cast(tabbook->GetPage(i))->get_calibration_mode() == m_mode)
- tabbook->SetSelection(i);
- }
- auto page_node = m_first_page;
- while (page_node)
- {
- if (page_node->get_page_type() == page_type) {
- m_curr_page = page_node;
- show_page(m_curr_page);
- break;
- }
- page_node = page_node->get_next_page();
- }
-}
-
-void CalibrationWizard::init_bitmaps()
+void CalibrationWizard::on_cali_go_home()
{
- m_bitmap_pause = ScalableBitmap(this, "print_control_pause", 18);
- m_bitmap_pause_hover = ScalableBitmap(this, "print_control_pause_hover", 18);
- m_bitmap_resume = ScalableBitmap(this, "print_control_resume", 18);
- m_bitmap_resume_hover = ScalableBitmap(this, "print_control_resume_hover", 18);
- m_bitmap_pause_disable = ScalableBitmap(this, "print_control_pause_disable", 18);
- m_bitmap_resume_disable = ScalableBitmap(this, "print_control_resume_disable", 18);
- m_bitmap_abort = ScalableBitmap(this, "print_control_stop", 18);
- m_bitmap_abort_hover = ScalableBitmap(this, "print_control_stop_hover", 18);
- m_bitmap_abort_disable = ScalableBitmap(this, "print_control_stop_disable", 18);
-}
+ // can go home? confirm to continue
+ CalibrationMethod method;
+ int cali_stage = 0;
+ CalibMode obj_cali_mode = get_obj_calibration_mode(curr_obj, method, cali_stage);
-HistoryWindow::HistoryWindow(wxWindow* parent)
- : DPIDialog(parent, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE)
-{
- create();
- wxGetApp().UpdateDlgDarkUI(this);
-}
+ if (obj_cali_mode == m_mode && curr_obj && curr_obj->is_in_printing()) {
+ if (go_home_dialog == nullptr)
+ go_home_dialog = new SecondaryCheckDialog(this, wxID_ANY, _L("Confirm"));
-void HistoryWindow::create() {
- this->SetBackgroundColour(*wxWHITE);
- auto main_sizer = new wxBoxSizer(wxVERTICAL);
+ go_home_dialog->Bind(EVT_SECONDARY_CHECK_CONFIRM, [this, method](wxCommandEvent &e) {
+ if (curr_obj) {
+ curr_obj->command_task_abort();
+ } else {
+ assert(false);
+ }
+ if (!m_page_steps.empty())
+ show_step(m_page_steps.front());
+ });
- auto scroll_window = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL | wxVSCROLL);
- scroll_window->SetScrollRate(5, 5);
- scroll_window->SetBackgroundColour(*wxWHITE);
-
- auto scroll_sizer = new wxBoxSizer(wxVERTICAL);
- scroll_window->SetSizer(scroll_sizer);
-
- m_history_data_panel = new wxPanel(scroll_window);
-
- scroll_sizer->Add(m_history_data_panel, 1, wxALIGN_CENTER);
-
- main_sizer->Add(scroll_window, 1, wxEXPAND | wxALL, FromDIP(10));
-
- SetSizer(main_sizer);
- Layout();
- Fit();
- SetMinSize(wxSize(FromDIP(960), FromDIP(720)));
- SetSize(wxSize(FromDIP(960), FromDIP(720)));
- CenterOnParent();
+ go_home_dialog->update_text(_L("Are you sure to cancel the current calibration and return to the home page?"));
+ go_home_dialog->on_show();
+ } else {
+ if (!m_page_steps.empty()) show_step(m_page_steps.front());
+ }
}
PressureAdvanceWizard::PressureAdvanceWizard(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style)
: CalibrationWizard(parent, CalibMode::Calib_PA_Line, id, pos, size, style)
{
create_pages();
- init_bitmaps();
- set_ams_select_mode(FSMCheckBoxMode);
-
- Bind(EVT_CALIBRATION_NOTIFY_CHANGE_PAGES, &PressureAdvanceWizard::switch_pages, this);
-}
-
-void PressureAdvanceWizard::create_save_panel_content(wxBoxSizer* sizer)
-{
- // low end save panel
- {
- m_low_end_save_panel = new wxPanel(m_save_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
- auto low_end_sizer = new wxBoxSizer(wxVERTICAL);
- m_low_end_save_panel->SetSizer(low_end_sizer);
-
- auto complete_text_panel = new wxPanel(m_low_end_save_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
- wxBoxSizer* complete_text_sizer = new wxBoxSizer(wxVERTICAL);
- auto complete_text = new wxStaticText(complete_text_panel, wxID_ANY, _L("Please find the best line on your plate"));
- complete_text->SetFont(Label::Head_14);
- complete_text->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
- complete_text_sizer->Add(complete_text, 0, wxALIGN_CENTER);
- complete_text_panel->SetSizer(complete_text_sizer);
- low_end_sizer->Add(complete_text_panel, 0, wxALIGN_CENTER, 0);
-
- low_end_sizer->AddSpacer(FromDIP(20));
-
- m_record_picture = new wxStaticBitmap(m_low_end_save_panel, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0);
- low_end_sizer->Add(m_record_picture, 0, wxALL | wxALIGN_CENTER_HORIZONTAL, 0);
-
- low_end_sizer->AddSpacer(FromDIP(20));
-
- auto value_sizer = new wxBoxSizer(wxHORIZONTAL);
- auto k_value_text = new wxStaticText(m_low_end_save_panel, wxID_ANY, _L("Factor K"), wxDefaultPosition, wxDefaultSize, 0);
- k_value_text->Wrap(-1);
- k_value_text->SetFont(::Label::Body_14);
- auto n_value_text = new wxStaticText(m_low_end_save_panel, wxID_ANY, _L("Factor N"), wxDefaultPosition, wxDefaultSize, 0);
- n_value_text->Wrap(-1);
- n_value_text->SetFont(::Label::Body_14);
- m_k_val = new TextInput(m_low_end_save_panel, wxEmptyString, "", "", wxDefaultPosition, CALIBRATION_OPTIMAL_INPUT_SIZE, 0);
- m_n_val = new TextInput(m_low_end_save_panel, wxEmptyString, "", "", wxDefaultPosition, CALIBRATION_OPTIMAL_INPUT_SIZE, 0);
- n_value_text->Hide();
- m_n_val->Hide();
- value_sizer->Add(k_value_text, 0, wxALIGN_CENTER_VERTICAL, 0);
- value_sizer->AddSpacer(FromDIP(10));
- value_sizer->Add(m_k_val, 0);
- value_sizer->AddSpacer(FromDIP(50));
- value_sizer->Add(n_value_text, 0, wxALIGN_CENTER_VERTICAL, 0);
- value_sizer->AddSpacer(FromDIP(10));
- value_sizer->Add(m_n_val, 0);
- low_end_sizer->Add(value_sizer, 0, wxALIGN_CENTER);
-
- sizer->Add(m_low_end_save_panel, 0, wxEXPAND);
- }
-
- // high end save panel (Hide)
- {
- m_high_end_save_panel = new wxPanel(m_save_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
- auto high_end_sizer = new wxBoxSizer(wxVERTICAL);
- m_high_end_save_panel->SetSizer(high_end_sizer);
-
- auto complete_text_panel = new wxPanel(m_high_end_save_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
- wxBoxSizer* complete_text_sizer = new wxBoxSizer(wxVERTICAL);
- auto complete_text = new wxStaticText(complete_text_panel, wxID_ANY, _L("We found the best Pressure Advance Factor"));
- complete_text->SetFont(Label::Head_14);
- complete_text->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
- complete_text_sizer->Add(complete_text, 0, wxALIGN_CENTER);
- complete_text_panel->SetSizer(complete_text_sizer);
- high_end_sizer->Add(complete_text_panel, 0, wxALIGN_CENTER, 0);
-
- high_end_sizer->AddSpacer(FromDIP(20));
-
- m_grid_panel = new wxPanel(m_high_end_save_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
- high_end_sizer->Add(m_grid_panel, 0, wxALIGN_CENTER);
-
- sizer->Add(m_high_end_save_panel, 0, wxEXPAND);
-
- m_high_end_save_panel->Hide();
- }
-}
-
-CalibrationWizardPage* PressureAdvanceWizard::create_start_page()
-{
- auto page = new CalibrationWizardPage(m_scrolledWindow);
- page->set_page_type(PageType::Start);
- page->set_highlight_step_text(PageType::Start);
- auto page_content_sizer = page->get_content_vsizer();
-
- auto when_title = new wxStaticText(page, wxID_ANY, _L("When you need Pressure Advance Calibration"));
- when_title->SetFont(Label::Head_14);
- when_title->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
- page_content_sizer->Add(when_title);
- auto when_text = new wxStaticText(page, wxID_ANY, _L("uneven extrusion"));
- when_text->SetFont(Label::Body_14);
- when_text->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
- page_content_sizer->Add(when_text);
-
- page_content_sizer->AddSpacer(PRESET_GAP);
-
- auto bitmap_sizer = new wxBoxSizer(wxHORIZONTAL);
- auto bitmap1 = new wxStaticBitmap(page, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0);
- bitmap1->SetMinSize(wxSize(560, 450));
- bitmap1->SetBackgroundColour(*wxBLACK);
- bitmap_sizer->Add(bitmap1, 0, wxALL, 0);
- bitmap_sizer->AddSpacer(FromDIP(20));
- auto bitmap2 = new wxStaticBitmap(page, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0);
- bitmap2->SetMinSize(wxSize(560, 450));
- bitmap2->SetBackgroundColour(*wxBLACK);
- bitmap_sizer->Add(bitmap2, 0, wxALL, 0);
- page_content_sizer->Add(bitmap_sizer, 0, wxALL, 0);
-
- page_content_sizer->AddSpacer(PRESET_GAP);
-
- auto about_title = new wxStaticText(page, wxID_ANY, _L("About this calibration"));
- about_title->SetFont(Label::Head_14);
- about_title->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
- page_content_sizer->Add(about_title);
- auto about_text = new wxStaticText(page, wxID_ANY, _L("After calibration, the linear compensation factor(K) will be recorded and applied to printing. This factor would be different if device, degree of usage, material, and material family type are different"));
- about_text->SetFont(Label::Body_14);
- about_text->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
- page_content_sizer->Add(about_text);
-
- page_content_sizer->AddSpacer(PRESET_GAP);
-
- auto wiki = new wxStaticText(page, wxID_ANY, _L("Wiki"));
- wiki->SetFont(Label::Head_14);
- wiki->SetForegroundColour({ 0, 88, 220 });
- wiki->Bind(wxEVT_ENTER_WINDOW, [this, wiki](wxMouseEvent& e) {
- e.Skip();
- SetCursor(wxCURSOR_HAND);
- });
- wiki->Bind(wxEVT_LEAVE_WINDOW, [this, wiki](wxMouseEvent& e) {
- e.Skip();
- SetCursor(wxCURSOR_ARROW);
- });
- wiki->Bind(wxEVT_LEFT_UP, [this](wxMouseEvent& e) {
- if (!m_wiki_url.empty()) wxLaunchDefaultBrowser(m_wiki_url);
- });
- page_content_sizer->Add(wiki, 0);
-
-
- auto page_prev_btn = page->get_prev_btn();
- page_prev_btn->Hide();
- page_prev_btn->SetLabel(_L("Manage Result"));
- page_prev_btn->SetButtonType(ButtonType::Back);
- page_prev_btn->Bind(wxEVT_BUTTON, [this](auto& e) {
- if (is_high_end_type(curr_obj)) {
- sync_history_window_data();
- }
- });
-
- auto page_next_btn = page->get_next_btn();
- page_next_btn->SetLabel(_L("Start"));
- page_next_btn->SetButtonType(ButtonType::Start);
-
- return page;
}
void PressureAdvanceWizard::create_pages()
{
- create_history_window();
- // page 0 : start page
- m_page0 = create_start_page();
- m_page0->set_page_title(_L("Pressure Advance"));
- m_all_pages_sizer->Add(m_page0, 1, wxEXPAND | wxALL, FromDIP(25));
+ start_step = new CalibrationWizardPageStep(new CalibrationPAStartPage(m_scrolledWindow));
+ preset_step = new CalibrationWizardPageStep(new CalibrationPresetPage(m_scrolledWindow, m_mode, false));
+ cali_step = new CalibrationWizardPageStep(new CalibrationCaliPage(m_scrolledWindow, m_mode));
+ save_step = new CalibrationWizardPageStep(new CalibrationPASavePage(m_scrolledWindow));
+
+ m_all_pages_sizer->Add(start_step->page, 1, wxEXPAND | wxALL, FromDIP(25));
+ m_all_pages_sizer->Add(preset_step->page, 1, wxEXPAND | wxALL, FromDIP(25));
+ m_all_pages_sizer->Add(cali_step->page, 1, wxEXPAND | wxALL, FromDIP(25));
+ m_all_pages_sizer->Add(save_step->page, 1, wxEXPAND | wxALL, FromDIP(25));
- // page 1 : preset page
- m_page1 = create_presets_page(false);
- m_page1->set_page_title(_L("Pressure Advance"));
- m_all_pages_sizer->Add(m_page1, 1, wxEXPAND | wxALL, FromDIP(25));
- // page 2 : print page
- m_page2 = create_print_page();
- m_page2->set_page_title(_L("Pressure Advance"));
- m_all_pages_sizer->Add(m_page2, 1, wxEXPAND | wxALL, FromDIP(25));
+ m_page_steps.push_back(start_step);
+ m_page_steps.push_back(preset_step);
+ m_page_steps.push_back(cali_step);
+ m_page_steps.push_back(save_step);
- // page 3 : save page
- m_page3 = create_save_page();
- m_page3->set_page_title(_L("Pressure Advance"));
- m_page3->Bind(wxEVT_SHOW, [this](auto&) {
- sync_save_page_data();
- });
- m_all_pages_sizer->Add(m_page3, 1, wxEXPAND | wxALL, FromDIP(25));
+ for (int i = 0; i < m_page_steps.size() -1; i++) {
+ m_page_steps[i]->chain(m_page_steps[i+1]);
+ }
- // link page
- m_first_page = m_page0;
- m_curr_page = m_page0;
- m_page0->chain(m_page1)->chain(m_page2)->chain(m_page3);
- show_page(m_curr_page);
+ for (int i = 0; i < m_page_steps.size(); i++) {
+ m_page_steps[i]->page->Hide();
+ m_page_steps[i]->page->Bind(EVT_CALI_ACTION, &PressureAdvanceWizard::on_cali_action, this);
+ }
+
+ if (!m_page_steps.empty())
+ show_step(m_page_steps.front());
}
-void PressureAdvanceWizard::create_history_window()
+void PressureAdvanceWizard::on_cali_action(wxCommandEvent& evt)
{
- m_history_page = new HistoryWindow(this);
+ CaliPageActionType action = static_cast(evt.GetInt());
+ if (action == CaliPageActionType::CALI_ACTION_MANAGE_RESULT) {
+ HistoryWindow history_dialog(this, m_calib_results_history);
+ history_dialog.on_device_connected(curr_obj);
+ history_dialog.ShowModal();
+ }
+ else if (action == CaliPageActionType::CALI_ACTION_MANUAL_CALI) {
+ preset_step->page->set_cali_filament_mode(CalibrationFilamentMode::CALI_MODEL_SINGLE);
+ set_cali_method(CalibrationMethod::CALI_METHOD_MANUAL);
+ preset_step->page->on_device_connected(curr_obj);
+ show_step(m_curr_step->next);
+ }
+ else if (action == CaliPageActionType::CALI_ACTION_AUTO_CALI) {
+ CalibrationFilamentMode fila_mode = get_cali_filament_mode(curr_obj, m_mode);
+ preset_step->page->set_cali_filament_mode(fila_mode);
+ set_cali_method(CalibrationMethod::CALI_METHOD_AUTO);
+ preset_step->page->on_device_connected(curr_obj);
+ show_step(m_curr_step->next);
+ }
+ else if (action == CaliPageActionType::CALI_ACTION_NEXT) {
+ show_step(m_curr_step->next);
+ }
+ else if (action == CaliPageActionType::CALI_ACTION_CALI_NEXT) {
+ (static_cast(save_step->page))->sync_cali_result(curr_obj);
+ show_step(m_curr_step->next);
+ }
+ else if (action == CaliPageActionType::CALI_ACTION_PREV) {
+ show_step(m_curr_step->prev);
+ }
+ else if (action == CaliPageActionType::CALI_ACTION_CALI) {
+ on_cali_start();
+ show_step(m_curr_step->next);
+ }
+ else if (action == CaliPageActionType::CALI_ACTION_GO_HOME) {
+ on_cali_go_home();
+ } else if (action == CaliPageActionType::CALI_ACTION_PA_SAVE) {
+ on_cali_save();
+ }
}
-void PressureAdvanceWizard::request_calib_result() {
- if (is_high_end_type(curr_obj)) {
- if (is_first_time_get_result) {
- curr_obj->has_get_pa_calib_result = false;
- CalibUtils::emit_get_PA_calib_results(curr_obj->nozzle_diameter);
- is_first_time_get_result = false;
- }
- if (curr_obj->has_get_pa_calib_result) {
- if (!has_get_result) {
- CalibUtils::get_PA_calib_results(m_calib_results);
- if (m_calib_results.size() > 0) {
- has_get_result = true;
- sync_save_page_data();
+void PressureAdvanceWizard::update(MachineObject* obj)
+{
+ CalibrationWizard::update(obj);
+}
+
+void PressureAdvanceWizard::on_device_connected(MachineObject* obj)
+{
+ CalibrationWizard::on_device_connected(obj);
+
+ CalibrationMethod method;
+ int cali_stage = 0;
+ CalibMode obj_cali_mode = get_obj_calibration_mode(obj, method, cali_stage);
+
+ // show cali step when obj is in pa calibration
+ if (obj) {
+ CalibrationWizard::set_cali_method(method);
+
+ if (m_curr_step != cali_step) {
+ if (obj_cali_mode == m_mode) {
+ if (obj->is_in_printing() || obj->is_printing_finished()) {
+ CalibrationWizard::set_cali_method(method);
+ show_step(cali_step);
}
}
}
}
}
-void PressureAdvanceWizard::sync_history_window_data() {
- auto history_data_panel = m_history_page->m_history_data_panel;
- history_data_panel->DestroyChildren();
-
- wxGridBagSizer* gbSizer;
- gbSizer = new wxGridBagSizer(FromDIP(15), FromDIP(0));
- gbSizer->SetFlexibleDirection(wxBOTH);
- gbSizer->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
-
- history_data_panel->SetSizer(gbSizer, true);
-
- auto title_nozzle = new wxStaticText(history_data_panel, wxID_ANY, _L("Nozzle Diameter"));
- title_nozzle->SetFont(Label::Head_14);
- gbSizer->Add(title_nozzle, { 0, 0 }, {1, 1}, wxRIGHT, FromDIP(80));
-
- auto title_material = new wxStaticText(history_data_panel, wxID_ANY, _L("Material"));
- title_material->SetFont(Label::Head_14);
- gbSizer->Add(title_material, { 0, 1 }, { 1, 1 }, wxRIGHT, FromDIP(80));
-
- auto title_k = new wxStaticText(history_data_panel, wxID_ANY, _L("K"));
- title_k->SetFont(Label::Head_14);
- gbSizer->Add(title_k, { 0, 2 }, { 1, 1 }, wxRIGHT, FromDIP(80));
-
- // Hide
- //auto title_n = new wxStaticText(history_data_panel, wxID_ANY, _L("N"));
- //title_n->SetFont(Label::Head_14);
- //gbSizer->Add(title_n, { 0, 3 }, { 1, 1 }, wxRIGHT, FromDIP(80));
-
- auto title_action = new wxStaticText(history_data_panel, wxID_ANY, _L("Action"));
- title_action->SetFont(Label::Head_14);
- gbSizer->Add(title_action, { 0, 3 }, { 1, 1 });
-
- int i = 1;
- for (auto& result : m_calib_results_history) {
- auto nozzle_dia_str = wxString::Format("%1.1f", result.nozzle_diameter);
- auto nozzle_dia_value = new wxStaticText(history_data_panel, wxID_ANY, nozzle_dia_str);
- wxString material_name = NA_STR;
- material_name = result.name;
- auto material_name_value = new wxStaticText(history_data_panel, wxID_ANY, material_name);
- auto k_str = wxString::Format("%.3f", result.k_value);
- auto n_str = wxString::Format("%.3f", result.n_coef);
- auto k_value = new wxStaticText(history_data_panel, wxID_ANY, k_str);
- auto n_value = new wxStaticText(history_data_panel, wxID_ANY, n_str);
- n_value->Hide();
- auto delete_button = new PageButton(history_data_panel, _L("Delete"), ButtonType::Back);
- delete_button->Bind(wxEVT_BUTTON, [gbSizer, i, history_data_panel, &result](auto &e) {
- for (int j = 0; j < 5; j++) {
- auto item = gbSizer->FindItemAtPosition({ i, j });
- item->GetWindow()->Hide();
- }
- gbSizer->SetEmptyCellSize({ 0,0 });
- history_data_panel->Layout();
- history_data_panel->Fit();
- CalibUtils::delete_PA_calib_result({result.tray_id, result.cali_idx, result.nozzle_diameter, result.filament_id});
- });
- auto edit_button = new PageButton(history_data_panel, _L("Edit"), ButtonType::Next);
- edit_button->Bind(wxEVT_BUTTON, [this, &result, nozzle_dia_str, k_value, n_value, material_name_value](auto& e) {
- EditCalibrationHistoryDialog dlg(m_history_page, k_value->GetLabel(), n_value->GetLabel(), material_name_value->GetLabel(), nozzle_dia_str);
- if (dlg.ShowModal() == wxID_OK) {
- float k = 0.0f;
- k = dlg.get_k_value();
- wxString new_k_str = wxString::Format("%.3f", k);
-
- wxString new_material_name = dlg.get_material_name_value();
-
- k_value->SetLabel(new_k_str);
- material_name_value->SetLabel(new_material_name);
- PACalibResult new_result = result;
- new_result.tray_id = -1;
- new_result.name = new_material_name.ToStdString();
- new_result.k_value = k;
- CalibUtils::set_PA_calib_result({ new_result });
- }
- });
-
- gbSizer->Add(nozzle_dia_value, { i, 0 }, { 1, 1 }, wxRIGHT, FromDIP(80));
- gbSizer->Add(material_name_value, { i, 1 }, { 1, 1 }, wxRIGHT, FromDIP(80));
- gbSizer->Add(k_value, { i, 2 }, { 1, 1 }, wxRIGHT, FromDIP(80));
- //gbSizer->Add(n_value, { i, 3 }, { 1, 1 }, wxRIGHT, FromDIP(80));
- gbSizer->Add(delete_button, { i, 3 }, { 1, 1 }, wxRIGHT, FromDIP(25));
- gbSizer->Add(edit_button, { i, 4 }, { 1, 1 });
- i++;
- }
-
- if (m_calib_results_history.empty()) {
- MessageDialog msg_dlg(nullptr, _L("No History Result"), wxEmptyString, wxICON_WARNING | wxOK);
- msg_dlg.ShowModal();
- }
- else {
- m_history_page->ShowModal();
- }
-
- m_history_page->Layout();
-}
-
-void PressureAdvanceWizard::sync_save_page_data() {
- FilamentComboBoxList fcb_list = get_selected_filament_comboBox();
-
- m_grid_panel->DestroyChildren();
- wxBoxSizer* grid_sizer = new wxBoxSizer(wxHORIZONTAL);
- const int COLUMN_GAP = FromDIP(50);
- const int ROW_GAP = FromDIP(30);
- wxBoxSizer* left_title_sizer = new wxBoxSizer(wxVERTICAL);
- left_title_sizer->AddSpacer(FromDIP(52));
- auto k_title = new wxStaticText(m_grid_panel, wxID_ANY, _L("FactorK"), wxDefaultPosition, wxDefaultSize, 0);
- k_title->SetFont(Label::Head_14);
- left_title_sizer->Add(k_title, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP);
- auto n_title = new wxStaticText(m_grid_panel, wxID_ANY, _L("FactorN"), wxDefaultPosition, wxDefaultSize, 0);
- n_title->SetFont(Label::Head_14);
- // hide n value
- n_title->Hide();
- left_title_sizer->Add(n_title, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP);
- auto brand_title = new wxStaticText(m_grid_panel, wxID_ANY, _L("Brand Name"), wxDefaultPosition, wxDefaultSize, 0);
- brand_title->SetFont(Label::Head_14);
- left_title_sizer->Add(brand_title, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP);
- grid_sizer->Add(left_title_sizer);
- grid_sizer->AddSpacer(COLUMN_GAP);
-
- for (auto& fcb : fcb_list) {
- bool result_failed = false;
- auto it_result = std::find_if(m_calib_results.begin(), m_calib_results.end(), [fcb](auto& calib_result) {
- return calib_result.tray_id == fcb->get_tray_id();
- });
- if (it_result != m_calib_results.end()) {
- result_failed = false;
- }
- else {
- result_failed = true;
- }
- int index = it_result - m_calib_results.begin();
-
- wxBoxSizer* column_data_sizer = new wxBoxSizer(wxVERTICAL);
- auto tray_title = new wxStaticText(m_grid_panel, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, 0);
- tray_title->SetFont(Label::Head_14);
- tray_title->SetLabel(fcb->get_tray_name());
- column_data_sizer->Add(tray_title, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP);
-
- auto k_value = new TextInput(m_grid_panel, NA_STR, "", "", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE, wxTE_PROCESS_ENTER);
- auto n_value = new TextInput(m_grid_panel, NA_STR, "", "", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE, wxTE_PROCESS_ENTER);
- k_value->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC));
- n_value->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC));
- auto k_value_failed = new wxStaticText(m_grid_panel, wxID_ANY, _L("Failed"), wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE);
- auto n_value_failed = new wxStaticText(m_grid_panel, wxID_ANY, _L("Failed"), wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE);
-
- if (!result_failed) {
- auto k_str = wxString::Format("%.3f", m_calib_results[index].k_value);
- auto n_str = wxString::Format("%.3f", m_calib_results[index].n_coef);
- k_value->GetTextCtrl()->SetValue(k_str);
- n_value->GetTextCtrl()->SetValue(n_str);
- }
-
- k_value->GetTextCtrl()->Bind(wxEVT_TEXT_ENTER, [this, result_failed, index, fcb, k_value](auto& e) {
- if (!result_failed) {
- float k = 0.0f;
- validate_input_k_value(k_value->GetTextCtrl()->GetValue(), &k);
- wxString k_str = wxString::Format("%.3f", k);
- k_value->GetTextCtrl()->SetValue(k_str);
- m_calib_results[index].k_value = k;
- }
- });
- k_value->GetTextCtrl()->Bind(wxEVT_KILL_FOCUS, [this, result_failed, index, fcb, k_value](auto& e) {
- if (!result_failed) {
- float k = 0.0f;
- validate_input_k_value(k_value->GetTextCtrl()->GetValue(), &k);
- wxString k_str = wxString::Format("%.3f", k);
- k_value->GetTextCtrl()->SetValue(k_str);
- m_calib_results[index].k_value = k;
- }
- e.Skip();
- });
- column_data_sizer->Add(k_value, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP);
- column_data_sizer->Add(n_value, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP);
- column_data_sizer->Add(k_value_failed, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP);
- column_data_sizer->Add(n_value_failed, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP);
-
- auto comboBox_tray_name = new ComboBox(m_grid_panel, wxID_ANY, "", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE, 0, nullptr);
- auto tray_name_failed = new wxStaticText(m_grid_panel, wxID_ANY, " - ", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE);
- wxArrayString selections;
- static std::vector filtered_results;
- filtered_results.clear();
- for (auto history : m_calib_results_history) {
- if (history.setting_id == m_filament_presets[fcb->get_tray_id()]->setting_id) {
- filtered_results.push_back(history);
- selections.push_back(history.name);
- }
- }
- comboBox_tray_name->Set(selections);
-
- auto set_edit_mode = [this, k_value, n_value, k_value_failed, n_value_failed, comboBox_tray_name, tray_name_failed](std::string str) {
- if (str == "normal") {
- comboBox_tray_name->Show();
- tray_name_failed->Show(false);
- k_value->Show();
- n_value->Show();
- k_value_failed->Show(false);
- n_value_failed->Show(false);
- }
- if (str == "failed") {
- comboBox_tray_name->Show(false);
- tray_name_failed->Show();
- k_value->Show(false);
- n_value->Show(false);
- k_value_failed->Show();
- n_value_failed->Show();
- }
-
- // hide n value
- n_value->Hide();
- n_value_failed->Hide();
-
- m_grid_panel->Layout();
- m_grid_panel->Update();
- };
-
- if (result_failed) {
- set_edit_mode("failed");
- }
- else {
- comboBox_tray_name->SetValue(fcb->GetComboBox()->GetValue());
- m_calib_results[index].name = comboBox_tray_name->GetValue().ToStdString();
- set_edit_mode("normal");
- comboBox_tray_name->GetTextCtrl()->Bind(wxEVT_KEY_DOWN, [this, result_failed, index, fcb, comboBox_tray_name](auto& e) {
- if (wxGetKeyState(WXK_RETURN)) {
- this->m_calib_results[index].name = comboBox_tray_name->GetTextCtrl()->GetValue().ToStdString();
- }
- else
- e.Skip();
- });
- comboBox_tray_name->GetTextCtrl()->Bind(wxEVT_KILL_FOCUS, [this, result_failed, index, fcb, comboBox_tray_name](auto& e) {
- this->m_calib_results[index].name = comboBox_tray_name->GetTextCtrl()->GetValue().ToStdString();
- e.Skip();
- });
- }
-
- comboBox_tray_name->Bind(wxEVT_COMBOBOX, [this, result_failed, index, fcb, comboBox_tray_name, k_value, n_value, set_edit_mode](auto& e) {
- int selection = comboBox_tray_name->GetSelection();
- set_edit_mode("normal");
- auto history = filtered_results[selection];
-
- if (!result_failed) {
- this->m_calib_results[index].name = history.name;
- }
- });
-
- column_data_sizer->Add(comboBox_tray_name, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP);
- column_data_sizer->Add(tray_name_failed, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP);
-
- grid_sizer->Add(column_data_sizer);
- grid_sizer->AddSpacer(COLUMN_GAP);
- }
- m_grid_panel->SetSizer(grid_sizer, true);
- m_grid_panel->Bind(wxEVT_LEFT_DOWN, [this](auto& e) {
- m_grid_panel->SetFocusIgnoringChildren();
- });
- Layout();
-}
-
-void PressureAdvanceWizard::switch_pages(SimpleEvent& evt) {
- if (curr_obj) {
- if (is_high_end_type(curr_obj))
- {
- m_low_end_save_panel->Hide();
- m_high_end_save_panel->Show();
-
- m_page0->get_prev_btn()->Show();
-
- sync_save_page_data(); // CALIBRATION_DEBUG
- }
- else
- {
- m_high_end_save_panel->Hide();
- m_low_end_save_panel->Show();
-
- m_page0->get_prev_btn()->Hide();
- }
- Layout();
- }
-}
-
-void PressureAdvanceWizard::change_ams_select_mode() {
- if (is_high_end_type(curr_obj)) {
- set_ams_select_mode(FSMCheckBoxMode);
- }
- else{
- set_ams_select_mode(FSMRadioMode);
- }
-}
-
-bool PressureAdvanceWizard::start_calibration(std::vector tray_ids)
+static bool get_preset_info(const DynamicConfig& config, const BedType plate_type, int& nozzle_temp, int& bed_temp, float& max_volumetric_speed)
{
- int nozzle_temp = -1;
- int bed_temp = -1;
- float max_volumetric_speed = -1;
+ const ConfigOptionInts* nozzle_temp_opt = config.option("nozzle_temperature");
+ const ConfigOptionInts* opt_bed_temp_ints = config.option(get_bed_temp_key(plate_type));
+ const ConfigOptionFloats* speed_opt = config.option("filament_max_volumetric_speed");
+ if (nozzle_temp_opt && speed_opt && opt_bed_temp_ints) {
+ nozzle_temp = nozzle_temp_opt->get_at(0);
+ max_volumetric_speed = speed_opt->get_at(0);
+ bed_temp = opt_bed_temp_ints->get_at(0);
+ if (bed_temp >= 0 && nozzle_temp >= 0 && max_volumetric_speed >= 0) {
+ return true;
+ }
+ }
+ return false;
+}
- if (m_nozzle_temp->GetTextCtrl()->GetValue().IsEmpty() ||
- m_bed_temp->GetTextCtrl()->GetValue().IsEmpty() ||
- m_max_volumetric_speed->GetTextCtrl()->GetValue().IsEmpty())
- return false;
- nozzle_temp = stoi(m_nozzle_temp->GetTextCtrl()->GetValue().ToStdString());
- bed_temp = stoi(m_bed_temp->GetTextCtrl()->GetValue().ToStdString());
- max_volumetric_speed = stof(m_max_volumetric_speed->GetTextCtrl()->GetValue().ToStdString());
-
- if (bed_temp < 0 || nozzle_temp < 0 || max_volumetric_speed < 0) {
- MessageDialog msg_dlg(nullptr, _L("Make sure bed_temp > 0 \nnozzle_temp > 0\nmax_volumetric_speed > 0"), wxEmptyString, wxICON_WARNING | wxOK);
+void PressureAdvanceWizard::on_cali_start()
+{
+ if (!curr_obj) {
+ MessageDialog msg_dlg(nullptr, _L("No Printer Connected!"), wxEmptyString, wxICON_WARNING | wxOK);
msg_dlg.ShowModal();
- return false;
+ return;
}
- if (is_high_end_type(curr_obj)) {
- m_calib_results.clear();
+ if (curr_obj->is_connecting() || !curr_obj->is_connected()) {
+ MessageDialog msg_dlg(nullptr, _L("Printer is not connected yet."), wxEmptyString, wxICON_WARNING | wxOK);
+ msg_dlg.ShowModal();
+ return;
+ }
+
+ //clean PA result
+ curr_obj->reset_pa_cali_result();
+
+ float nozzle_dia = -1;
+ std::string setting_id;
+ BedType plate_type = BedType::btDefault;
+
+ CalibrationPresetPage* preset_page = (static_cast(preset_step->page));
+
+ std::map selected_filaments = preset_page->get_selected_filaments();
+
+ curr_obj->selected_cali_preset.clear();
+ for (auto& item : selected_filaments) {
+ CaliPresetInfo result;
+ result.tray_id = item.first;
+ result.nozzle_diameter = nozzle_dia;
+ result.filament_id = item.second->filament_id;
+ result.setting_id = item.second->setting_id;
+ result.name = item.second->name;
+ curr_obj->selected_cali_preset.push_back(result);
+ }
+
+ preset_page->get_preset_info(nozzle_dia, plate_type);
+
+ if (nozzle_dia < 0 || plate_type == BedType::btDefault) {
+ BOOST_LOG_TRIVIAL(error) << "CaliPreset: get preset info, nozzle and plate type error";
+ return;
+ }
+
+ if (curr_obj->printer_type == "BL-P001"
+ || curr_obj->printer_type == "BL-P002") {
X1CCalibInfos calib_infos;
- for (int tray_id : tray_ids) {
- if (m_filament_presets.find(tray_id) == m_filament_presets.end())
- return false;
+ for (auto& item : selected_filaments) {
+ int nozzle_temp = -1;
+ int bed_temp = -1;
+ float max_volumetric_speed = -1;
+
+ if (!get_preset_info(item.second->config, plate_type, nozzle_temp, bed_temp, max_volumetric_speed)) {
+ BOOST_LOG_TRIVIAL(error) << "CaliPreset: get preset info error";
+ continue;
+ }
+
X1CCalibInfos::X1CCalibInfo calib_info;
- calib_info.tray_id = tray_id;
- calib_info.nozzle_diameter = dynamic_cast(m_printer_preset->config.option("nozzle_diameter"))->get_at(0);
- calib_info.filament_id = m_filament_presets[tray_id]->filament_id;
- calib_info.setting_id = m_filament_presets[tray_id]->setting_id;
+ calib_info.tray_id = item.first;
+ calib_info.nozzle_diameter = nozzle_dia;
+ calib_info.filament_id = item.second->filament_id;
+ calib_info.setting_id = item.second->setting_id;
calib_info.bed_temp = bed_temp;
calib_info.nozzle_temp = nozzle_temp;
calib_info.max_volumetric_speed = max_volumetric_speed;
calib_infos.calib_datas.push_back(calib_info);
}
+
std::string error_message;
- CalibUtils::calib_PA(calib_infos, error_message);
- if (!error_message.empty()) {
- MessageDialog msg_dlg(nullptr, error_message, wxEmptyString, wxICON_WARNING | wxOK);
+ wxString wx_err_string;
+ if (m_cali_method == CalibrationMethod::CALI_METHOD_AUTO) {
+ CalibUtils::calib_PA(calib_infos, 0, error_message); // mode = 0 for auto
+ wx_err_string = from_u8(error_message);
+ } else if (m_cali_method == CalibrationMethod::CALI_METHOD_MANUAL) {
+ CalibUtils::calib_PA(calib_infos, 1, error_message); // mode = 1 for manual
+ wx_err_string = from_u8(error_message);
+ } else {
+ assert(false);
+ }
+ if (!wx_err_string.empty()) {
+ MessageDialog msg_dlg(nullptr, wx_err_string, wxEmptyString, wxICON_WARNING | wxOK);
msg_dlg.ShowModal();
- return false;
}
- is_first_time_get_result = true;
- has_get_result = false;
- show_page(get_curr_page()->get_next_page());
- return true;
}
- else {
- curr_obj->command_start_extrusion_cali(tray_ids[0], nozzle_temp, bed_temp, max_volumetric_speed, m_filament_presets.begin()->second->setting_id);
- show_page(get_curr_page()->get_next_page());
- return true;
- }
-
- return false;
-}
-
-bool PressureAdvanceWizard::save_calibration_result()
-{
- if (is_high_end_type(curr_obj)) {
- for (auto& result : m_calib_results) {
- if (result.k_value > 0.5 || result.k_value < 0) {
- wxString k_tips = _L("Please input a valid value (K in 0~0.5)");
- MessageDialog msg_dlg(nullptr, k_tips, wxEmptyString, wxICON_WARNING | wxOK);
- msg_dlg.ShowModal();
- return false;
- }
+ else if (curr_obj->printer_type == "C11"
+ || curr_obj->printer_type == "C12") {
+ if (selected_filaments.empty()) {
+ BOOST_LOG_TRIVIAL(warning) << "CaliPreset: selected filaments is empty";
+ return;
}
- CalibUtils::set_PA_calib_result(m_calib_results);
- return true;
- }
- else {
- float k = 0.0f;
- validate_input_k_value(m_k_val->GetTextCtrl()->GetValue(), &k);
- wxString k_str = wxString::Format("%.3f", k);
- m_k_val->GetTextCtrl()->SetValue(k_str);
- double n = 0.0;
- //n_text.ToDouble(&n);
-
- // set values
int nozzle_temp = -1;
int bed_temp = -1;
float max_volumetric_speed = -1;
- std::string setting_id;
- std::string name;
+ if (!get_preset_info(selected_filaments.begin()->second->config, plate_type, nozzle_temp, bed_temp, max_volumetric_speed)) {
+ BOOST_LOG_TRIVIAL(error) << "CaliPreset: get preset info error";
+ return;
+ }
- nozzle_temp = stoi(m_nozzle_temp->GetTextCtrl()->GetValue().ToStdString());
- bed_temp = stoi(m_bed_temp->GetTextCtrl()->GetValue().ToStdString());
- max_volumetric_speed = stof(m_max_volumetric_speed->GetTextCtrl()->GetValue().ToStdString());
- setting_id = m_filament_presets.begin()->second->setting_id;
- name = m_filament_presets.begin()->second->name;
-
- // send command
- std::vector tray_ids = get_selected_tray();
- curr_obj->command_extrusion_cali_set(tray_ids[0], setting_id, name, k, n, bed_temp, nozzle_temp, max_volumetric_speed);
- return true;
+ curr_obj->command_start_extrusion_cali(selected_filaments.begin()->first,
+ nozzle_temp, bed_temp, max_volumetric_speed, setting_id);
+ } else {
+ assert(false);
}
- return false;
}
-bool PressureAdvanceWizard::recommend_input_value()
+void PressureAdvanceWizard::on_cali_save()
{
- return CalibrationWizard::recommend_input_value();
-}
+ if (curr_obj) {
+ if (curr_obj->printer_type == "BL-P001"
+ || curr_obj->printer_type == "BL-P002") {
+ if (m_cali_method == CalibrationMethod::CALI_METHOD_AUTO) {
+ std::vector new_pa_cali_results;
+ auto save_page = static_cast(save_step->page);
+ if (!save_page->get_auto_result(new_pa_cali_results)) {
+ return;
+ }
+ CalibUtils::set_PA_calib_result(new_pa_cali_results);
+ }
+ else if (m_cali_method == CalibrationMethod::CALI_METHOD_MANUAL) {
+ PACalibResult new_pa_cali_result;
+ auto save_page = static_cast(save_step->page);
+ if (!save_page->get_manual_result(new_pa_cali_result)) {
+ return;
+ }
+ CalibUtils::set_PA_calib_result({ new_pa_cali_result });
+ }
+ }
+ else if (curr_obj->printer_type == "C11"
+ || curr_obj->printer_type == "C12") {
+ auto save_page = static_cast(save_step->page);
+ float new_k_value = 0.0f;
+ float new_n_value = 0.0f;
+ if (!save_page->get_p1p_result(&new_k_value, &new_n_value)) {
+ return;
+ }
-void PressureAdvanceWizard::init_bitmaps()
-{
- m_print_picture->SetBitmap(create_scaled_bitmap("extrusion_calibration_tips_en", nullptr, 400));
- m_record_picture->SetBitmap(create_scaled_bitmap("extrusion_calibration_tips_en", nullptr, 400));
-}
+ float nozzle_dia = 0.4;
+ BedType plate_type = BedType::btDefault;
+ CalibrationPresetPage* preset_page = (static_cast(preset_step->page));
+ preset_page->get_preset_info(nozzle_dia, plate_type);
+ std::map selected_filaments = preset_page->get_selected_filaments();
+ int tray_id = selected_filaments.begin()->first;
+ std::string setting_id = selected_filaments.begin()->second->setting_id;
-void PressureAdvanceWizard::check_sync_printer_status()
-{
- // todo: sync the printer result
- DeviceManager *dev = Slic3r::GUI::wxGetApp().getDeviceManager();
- if (!dev)
- return;
+ int nozzle_temp = -1;
+ int bed_temp = -1;
+ float max_volumetric_speed = -1;
+ if (!get_preset_info(selected_filaments.begin()->second->config, plate_type, nozzle_temp, bed_temp, max_volumetric_speed)) {
+ BOOST_LOG_TRIVIAL(error) << "CaliPreset: get preset info error";
+ return;
+ }
- MachineObject *obj_ = dev->get_selected_machine();
- if (!obj_)
- return;
-
- if (m_cali_version != obj_->cali_version) {
- m_cali_version = obj_->cali_version;
- CalibUtils::emit_get_PA_calib_info(obj_->nozzle_diameter, "");
+ curr_obj->command_extrusion_cali_set(tray_id, setting_id, "", new_k_value, new_n_value, bed_temp, nozzle_temp, max_volumetric_speed);
+ }
+ else {
+ assert(false);
+ }
+ MessageDialog msg_dlg(nullptr, _L("Pressure advance calibration result has been saved to the printer"), wxEmptyString, wxICON_WARNING | wxOK);
+ msg_dlg.ShowModal();
}
-
- if (CalibUtils::get_PA_calib_tab(m_calib_results_history)) {
- obj_->has_get_pa_calib_tab = false;
-
- //PACalibIndexInfo cali_info;
- //PACalibResult result_0 = m_calib_results_history[0];
-
- //cali_info.tray_id = 0;
- //cali_info.cali_idx = result_0.cali_idx;
- //cali_info.nozzle_diameter = result_0.nozzle_diameter;
- //cali_info.filament_id = result_0.filament_id;
- //CalibUtils::select_PA_calib_result(cali_info);
-
- //result_0 = m_calib_results_history[2];
- //cali_info.tray_id = 2;
- //cali_info.cali_idx = result_0.cali_idx;
- //cali_info.nozzle_diameter = result_0.nozzle_diameter;
- //cali_info.filament_id = result_0.filament_id;
- //CalibUtils::select_PA_calib_result(cali_info);
-
- //result_0 = m_calib_results_history[3];
- //cali_info.tray_id = 3;
- //cali_info.cali_idx = result_0.cali_idx;
- //cali_info.nozzle_diameter = result_0.nozzle_diameter;
- //cali_info.filament_id = result_0.filament_id;
- //CalibUtils::select_PA_calib_result(cali_info);
- }
-
- //if (m_calib_results_history.size() > 10) {
- // PACalibIndexInfo cali_info;
- // PACalibResult result_0 = m_calib_results_history[0];
-
- // cali_info.tray_id = 0;
- // cali_info.cali_idx = result_0.cali_idx;
- // cali_info.nozzle_diameter = result_0.nozzle_diameter;
- // cali_info.filament_id = result_0.filament_id;
- // CalibUtils::delete_PA_calib_result(cali_info);
- //}
}
FlowRateWizard::FlowRateWizard(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style)
: CalibrationWizard(parent, CalibMode::Calib_Flow_Rate, id, pos, size, style)
{
create_pages();
- init_bitmaps();
- Bind(EVT_CALIBRATION_NOTIFY_CHANGE_PAGES, &FlowRateWizard::switch_pages, this);
-}
-
-void FlowRateWizard::set_save_name() {
- if (m_filament_presets.size() > 0) {
- m_save_name = m_filament_presets.begin()->second->alias + "-Calibrated";
- }
- else { m_save_name = ""; }
- if (!is_high_end_type(curr_obj)) {
- m_save_name_input1->GetTextCtrl()->SetValue(m_save_name);
- m_save_name_input2->GetTextCtrl()->SetValue(m_save_name);
- }
-}
-
-void FlowRateWizard::create_save_panel_content(wxBoxSizer* sizer)
-{
- auto complete_text = new wxStaticText(m_save_panel, wxID_ANY, _L("Please find the best object on your plate"), wxDefaultPosition, wxDefaultSize, 0);
- complete_text->SetFont(Label::Head_14);
- complete_text->Wrap(-1);
- sizer->Add(complete_text, 0, 0, 0);
- sizer->AddSpacer(FromDIP(20));
-
- m_low_record_picture2 = new wxStaticBitmap(m_save_panel, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0);
- m_low_record_picture2->SetMinSize(wxSize(560, 450));
- m_low_record_picture2->SetBackgroundColour(*wxBLACK);
- sizer->Add(m_low_record_picture2, 0, wxALIGN_CENTER, 0);
-
- sizer->AddSpacer(FromDIP(20));
-
- auto fine_value_sizer = new wxBoxSizer(wxVERTICAL);
- auto fine_value_text = new wxStaticText(m_save_panel, wxID_ANY, _L("Fill in the value above the block with smoothest top surface"), wxDefaultPosition, wxDefaultSize, 0);
- fine_value_text->Wrap(-1);
- fine_value_text->SetFont(::Label::Head_14);
- m_optimal_block_fine = new ComboBox(m_save_panel, wxID_ANY, "", wxDefaultPosition, CALIBRATION_OPTIMAL_INPUT_SIZE, 0, nullptr, wxCB_READONLY);
- wxArrayString fine_block_items;
- for (int i = 0; i < 10; i++)
- {
- fine_block_items.Add(std::to_string(-9 + (i)));
- }
- m_optimal_block_fine->Set(fine_block_items);
- m_fine_calc_result_text = new wxStaticText(m_save_panel, wxID_ANY, "");
- fine_value_sizer->Add(fine_value_text, 0, 0);
- fine_value_sizer->Add(m_optimal_block_fine, 0, 0);
- fine_value_sizer->Add(m_fine_calc_result_text, 0);
- sizer->Add(fine_value_sizer, 0, 0, 0);
- sizer->AddSpacer(FromDIP(20));
-
- auto save_text = new wxStaticText(m_save_panel, wxID_ANY, _L("Save to Filament Preset"), wxDefaultPosition, wxDefaultSize, 0);
- save_text->Wrap(-1);
- save_text->SetFont(Label::Head_14);
- sizer->Add(save_text, 0, 0, 0);
-
- m_save_name_input2 = new TextInput(m_save_panel, m_save_name, "", "", wxDefaultPosition, { CALIBRATION_TEXT_MAX_LENGTH, FromDIP(24) }, 0);
- sizer->Add(m_save_name_input2, 0, 0, 0);
- m_save_name_input2->GetTextCtrl()->Bind(wxEVT_TEXT, [this](auto& e) {
- if (!m_save_name_input2->GetTextCtrl()->GetValue().IsEmpty())
- m_save_name = m_save_name_input2->GetTextCtrl()->GetValue().ToStdString();
- else
- m_save_name = "";
- });
-}
-
-void FlowRateWizard::create_low_end_pages() {
- // page 3 : save coarse result
- m_low_end_page3 = new CalibrationWizardPage(m_scrolledWindow, false);
- m_low_end_page3->set_page_title(_L("Flow Rate"));
- m_low_end_page3->set_page_type(PageType::CoarseSave);
- m_low_end_page3->set_highlight_step_text(PageType::CoarseSave);
-
- auto page3_content_sizer = m_low_end_page3->get_content_vsizer();
-
- auto page3_description = new wxStaticText(m_low_end_page3, wxID_ANY, _L("Please find the best object on your plate"), wxDefaultPosition, wxDefaultSize, 0);
- page3_description->SetFont(Label::Head_14);
- page3_description->Wrap(-1);
- page3_content_sizer->Add(page3_description, 0, 0, 0);
- page3_content_sizer->AddSpacer(FromDIP(20));
-
- m_low_record_picture1 = new wxStaticBitmap(m_low_end_page3, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0);
- m_low_record_picture1->SetMinSize(wxSize(560, 450));
- m_low_record_picture1->SetBackgroundColour(*wxBLACK);
- page3_content_sizer->Add(m_low_record_picture1, 0, 0, 0);
-
- page3_content_sizer->AddSpacer(FromDIP(20));
-
- auto coarse_value_sizer = new wxBoxSizer(wxVERTICAL);
- auto coarse_value_text = new wxStaticText(m_low_end_page3, wxID_ANY, _L("Fill in the value above the block with smoothest top surface"), wxDefaultPosition, wxDefaultSize, 0);
- coarse_value_text->SetFont(Label::Head_14);
- coarse_value_text->Wrap(-1);
- m_optimal_block_coarse = new ComboBox(m_low_end_page3, wxID_ANY, "", wxDefaultPosition, CALIBRATION_OPTIMAL_INPUT_SIZE, 0, nullptr, wxCB_READONLY);
- wxArrayString coarse_block_items;
- for (int i = 0; i < 9; i++)
- {
- coarse_block_items.Add(std::to_string(-20 + (i * 5)));
- }
- m_optimal_block_coarse->Set(coarse_block_items);
- m_coarse_calc_result_text = new wxStaticText(m_low_end_page3, wxID_ANY, "");
- coarse_value_sizer->Add(coarse_value_text, 0, 0);
- coarse_value_sizer->Add(m_optimal_block_coarse, 0, 0);
- coarse_value_sizer->Add(m_coarse_calc_result_text, 0);
- page3_content_sizer->Add(coarse_value_sizer, 0, 0, 0);
- page3_content_sizer->AddSpacer(FromDIP(20));
-
- auto checkBox_panel = new wxPanel(m_low_end_page3);
- auto cb_sizer = new wxBoxSizer(wxHORIZONTAL);
- checkBox_panel->SetSizer(cb_sizer);
- m_checkBox_skip_calibration = new CheckBox(checkBox_panel);
- cb_sizer->Add(m_checkBox_skip_calibration);
-
- auto cb_text = new wxStaticText(checkBox_panel, wxID_ANY, _L("Skip Calibration2"));
- cb_sizer->Add(cb_text);
- cb_text->Bind(wxEVT_LEFT_DOWN, [this](auto &) {
- m_checkBox_skip_calibration->SetValue(!m_checkBox_skip_calibration->GetValue());
- wxCommandEvent event(wxEVT_TOGGLEBUTTON);
- event.SetEventObject(m_checkBox_skip_calibration);
- m_checkBox_skip_calibration->GetEventHandler()->ProcessEvent(event);
- });
-
- page3_content_sizer->Add(checkBox_panel, 0, 0, 0);
-
- auto save_panel = new wxPanel(m_low_end_page3);
- auto save_sizer = new wxBoxSizer(wxVERTICAL);
- save_panel->SetSizer(save_sizer);
-
- auto save_text = new wxStaticText(save_panel, wxID_ANY, _L("Save to Filament Preset"), wxDefaultPosition, wxDefaultSize, 0);
- save_text->Wrap(-1);
- save_text->SetFont(Label::Head_14);
- save_sizer->Add(save_text, 0, 0, 0);
-
- m_save_name_input1 = new TextInput(save_panel, m_save_name, "", "", wxDefaultPosition, { CALIBRATION_TEXT_MAX_LENGTH, FromDIP(24) }, 0);
- save_sizer->Add(m_save_name_input1, 0, 0, 0);
- m_save_name_input1->GetTextCtrl()->Bind(wxEVT_TEXT, [this](auto& e) {
- if (!m_save_name_input1->GetTextCtrl()->GetValue().IsEmpty())
- m_save_name = m_save_name_input1->GetTextCtrl()->GetValue().ToStdString();
- else
- m_save_name = "";
- });
-
- page3_content_sizer->Add(save_panel, 0, 0, 0);
- save_panel->Hide();
-
- auto page3_prev_btn = m_low_end_page3->get_prev_btn();
- page3_prev_btn->SetLabel(_L("Restart"));
- page3_prev_btn->SetButtonType(ButtonType::Restart);
-
- auto page3_next_btn = m_low_end_page3->get_next_btn();
- page3_next_btn->SetLabel(_L("Calibrate"));
- page3_next_btn->SetButtonType(ButtonType::Calibrate);
-
- m_checkBox_skip_calibration->Bind(wxEVT_TOGGLEBUTTON, [this, save_panel](auto& e) {
- if (m_checkBox_skip_calibration->GetValue()) {
- m_low_end_page3->get_next_btn()->SetLabel(_L("Save"));
- m_low_end_page3->get_next_btn()->SetButtonType(ButtonType::Save);
- save_panel->Show();
- }
- else {
- m_low_end_page3->get_next_btn()->SetLabel(_L("Calibrate"));
- m_low_end_page3->get_next_btn()->SetButtonType(ButtonType::Calibrate);
- save_panel->Hide();
- m_low_end_page3->get_next_btn()->Bind(wxEVT_BUTTON, &FlowRateWizard::on_fine_tune, this);
- }
- Layout();
- e.Skip();
- });
-
- m_all_pages_sizer->Add(m_low_end_page3, 1, wxEXPAND | wxALL, FromDIP(25));
-
- // page 4 : print page
- m_low_end_page4 = new CalibrationWizardPage(m_scrolledWindow, true);
- m_low_end_page4->set_page_title(_L("Flow Rate"));
- m_low_end_page4->set_page_type(PageType::FineCalibration);
- m_low_end_page4->set_highlight_step_text(PageType::FineCalibration);
-
- m_low_end_page4->get_prev_btn()->Hide();
-
- auto page4_next_btn = m_low_end_page4->get_next_btn();
- page4_next_btn->SetLabel(_L("Next"));
- page4_next_btn->SetButtonType(ButtonType::Next);
-
- auto page4_content_sizer = m_low_end_page4->get_content_vsizer();
- m_low_print_picture2 = new wxStaticBitmap(m_low_end_page4, wxID_ANY, create_scaled_bitmap("flow_rate_calibration_fine", nullptr, 400), wxDefaultPosition, wxDefaultSize, 0);
- page4_content_sizer->Add(m_low_print_picture2, 0, wxALL | wxALIGN_CENTER_HORIZONTAL, 0);
- page4_content_sizer->AddSpacer(FromDIP(20));
- m_all_pages_sizer->Add(m_low_end_page4, 1, wxEXPAND | wxALL, FromDIP(25));
-
- // page 5 : save fine result
- m_low_end_page5 = create_save_page();
- m_low_end_page5->set_page_title(_L("Flow Rate"));
- m_all_pages_sizer->Add(m_low_end_page5, 1, wxEXPAND | wxALL, FromDIP(25));
-
- // link page
- m_page2->chain(m_low_end_page3)->chain(m_low_end_page4)->chain(m_low_end_page5);
- show_page(m_curr_page);
-
- m_optimal_block_coarse->Bind(wxEVT_COMBOBOX, [this](auto& e) {
- if (m_filament_presets.begin()->second) {
- DynamicPrintConfig& filament_config = m_filament_presets.begin()->second->config;
- auto curr_flow_ratio = filament_config.option("filament_flow_ratio")->get_at(0);
- m_coarse_calc_result = curr_flow_ratio * (100.0f + stof(m_optimal_block_coarse->GetValue().ToStdString())) / 100.0f;
- m_coarse_calc_result_text->SetLabel(wxString::Format(_L("flow ratio : %s "), std::to_string(m_coarse_calc_result)));
- }
- });
- m_optimal_block_fine->Bind(wxEVT_COMBOBOX, [this](auto& e) {
- if (m_filament_presets.begin()->second) {
- DynamicPrintConfig& filament_config = m_filament_presets.begin()->second->config;
- auto curr_flow_ratio = filament_config.option("filament_flow_ratio")->get_at(0);
- m_fine_calc_result = curr_flow_ratio * (100.0f + stof(m_optimal_block_fine->GetValue().ToStdString())) / 100.0f;
- m_fine_calc_result_text->SetLabel(wxString::Format(_L("flow ratio : %s "), std::to_string(m_fine_calc_result)));
- }
- });
-}
-
-void FlowRateWizard::create_high_end_pages() {
- // page 3 : save fine result
- m_high_end_page3 = new CalibrationWizardPage(m_scrolledWindow, false);
- m_high_end_page3->set_page_title(_L("Flow Rate"));
- m_high_end_page3->set_page_type(PageType::Save);
- m_high_end_page3->set_highlight_step_text(PageType::Save);
-
- auto high_end_page3_content_sizer = m_high_end_page3->get_content_vsizer();
- auto complete_text_panel = new wxPanel(m_high_end_page3, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
- wxBoxSizer* complete_text_sizer = new wxBoxSizer(wxVERTICAL);
- auto complete_text = new wxStaticText(complete_text_panel, wxID_ANY, _L("We found the best flow ratio for you"));
- complete_text->SetFont(Label::Head_14);
- complete_text->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
- complete_text_sizer->Add(complete_text, 0, wxALIGN_CENTER);
- complete_text_panel->SetSizer(complete_text_sizer);
- high_end_page3_content_sizer->Add(complete_text_panel, 0, wxALIGN_CENTER, 0);
-
- high_end_page3_content_sizer->AddSpacer(FromDIP(20));
-
- m_grid_panel = new wxPanel(m_high_end_page3, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
- high_end_page3_content_sizer->Add(m_grid_panel, 0, wxALIGN_CENTER);
-
- auto high_end_page3_prev_btn = m_high_end_page3->get_prev_btn();
- high_end_page3_prev_btn->SetLabel(_L("Restart"));
- high_end_page3_prev_btn->SetButtonType(ButtonType::Restart);
-
- auto high_end_page3_next_btn = m_high_end_page3->get_next_btn();
- high_end_page3_next_btn->SetLabel(_L("Save"));
- high_end_page3_next_btn->SetButtonType(ButtonType::Save);
-
- m_all_pages_sizer->Add(m_high_end_page3, 1, wxEXPAND | wxALL, FromDIP(25));
-
- m_high_end_page3->Bind(wxEVT_SHOW, [this](auto&) {
- sync_save_page_data();
- });
- // link page
- m_page2->chain(m_high_end_page3);
- show_page(m_curr_page);
-}
-
-CalibrationWizardPage* FlowRateWizard::create_start_page()
-{
- auto page = new CalibrationWizardPage(m_scrolledWindow);
- page->set_page_type(PageType::Start);
- page->set_highlight_step_text(PageType::Start);
- auto page_content_sizer = page->get_content_vsizer();
-
- auto when_title = new wxStaticText(page, wxID_ANY, _L("When you need Flow Rate Calibration"));
- when_title->SetFont(Label::Head_14);
- when_title->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
- page_content_sizer->Add(when_title);
- auto when_text = new wxStaticText(page, wxID_ANY, _L("Over-extrusion or under extrusion"));
- when_text->SetFont(Label::Body_14);
- when_text->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
- page_content_sizer->Add(when_text);
-
- page_content_sizer->AddSpacer(PRESET_GAP);
-
- auto recommend_title = new wxStaticText(page, wxID_ANY, _L("Flow Rate calibration is recommended when you print with:"));
- recommend_title->SetFont(Label::Head_14);
- recommend_title->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
- page_content_sizer->Add(recommend_title);
- auto recommend_text1 = new wxStaticText(page, wxID_ANY, _L("material with significant thermal shrinkage/expansion, such as..."));
- recommend_text1->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
- recommend_text1->SetFont(Label::Body_14);
- page_content_sizer->Add(recommend_text1);
- auto recommend_text2 = new wxStaticText(page, wxID_ANY, _L("materials with inaccurate filament diameter"));
- recommend_text2->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
- recommend_text2->SetFont(Label::Body_14);
- page_content_sizer->Add(recommend_text2);
-
- page_content_sizer->AddSpacer(PRESET_GAP);
-
- auto bitmap_sizer = new wxBoxSizer(wxHORIZONTAL);
- auto bitmap1 = new wxStaticBitmap(page, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0);
- bitmap1->SetMinSize(wxSize(560, 450));
- bitmap1->SetBackgroundColour(*wxBLACK);
- bitmap_sizer->Add(bitmap1, 0, wxALL, 0);
- bitmap_sizer->AddSpacer(FromDIP(20));
- auto bitmap2 = new wxStaticBitmap(page, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0);
- bitmap2->SetMinSize(wxSize(560, 450));
- bitmap2->SetBackgroundColour(*wxBLACK);
- bitmap_sizer->Add(bitmap2, 0, wxALL, 0);
- page_content_sizer->Add(bitmap_sizer, 0, wxALL, 0);
-
- page_content_sizer->AddSpacer(PRESET_GAP);
-
- auto wiki = new wxStaticText(page, wxID_ANY, _L("Wiki")); //todo set wiki url
- wiki->SetFont(Label::Head_14);
- wiki->SetForegroundColour({ 0, 88, 220 });
- wiki->Bind(wxEVT_ENTER_WINDOW, [this, wiki](wxMouseEvent& e) {
- e.Skip();
- SetCursor(wxCURSOR_HAND);
- });
- wiki->Bind(wxEVT_LEAVE_WINDOW, [this, wiki](wxMouseEvent& e) {
- e.Skip();
- SetCursor(wxCURSOR_ARROW);
- });
- wiki->Bind(wxEVT_LEFT_UP, [this](wxMouseEvent& e) {
- if (!m_wiki_url.empty()) wxLaunchDefaultBrowser(m_wiki_url);
- });
- page_content_sizer->Add(wiki, 0);
-
-
- page->get_prev_btn()->Hide();
-
- auto page_next_btn = page->get_next_btn();
- page_next_btn->SetLabel(_L("Start"));
- page_next_btn->SetButtonType(ButtonType::Start);
-
- return page;
}
void FlowRateWizard::create_pages()
{
- // page 0 : start page
- m_page0 = create_start_page();
- m_page0->set_page_title(_L("Flow Rate"));
- m_all_pages_sizer->Add(m_page0, 1, wxEXPAND | wxALL, FromDIP(25));
+ start_step = new CalibrationWizardPageStep(new CalibrationFlowRateStartPage(m_scrolledWindow));
+ preset_step = new CalibrationWizardPageStep(new CalibrationPresetPage(m_scrolledWindow, m_mode, false));
- // page 1 : preset page
- m_page1 = create_presets_page(false);
- m_page1->set_page_title(_L("Flow Rate"));
+ // manual
+ cali_coarse_step = new CalibrationWizardPageStep(new CalibrationCaliPage(m_scrolledWindow, m_mode, CaliPageType::CALI_PAGE_CALI));
+ coarse_save_step = new CalibrationWizardPageStep(new CalibrationFlowCoarseSavePage(m_scrolledWindow));
+ cali_fine_step = new CalibrationWizardPageStep(new CalibrationCaliPage(m_scrolledWindow, m_mode, CaliPageType::CALI_PAGE_FINE_CALI));
+ fine_save_step = new CalibrationWizardPageStep(new CalibrationFlowFineSavePage(m_scrolledWindow));
+
+ // auto
+ cali_step = new CalibrationWizardPageStep(new CalibrationCaliPage(m_scrolledWindow, m_mode));
+ save_step = new CalibrationWizardPageStep(new CalibrationFlowX1SavePage(m_scrolledWindow));
- // Hide
- {
- auto page1_content_sizer = m_page1->get_content_vsizer();
- m_choose_step_panel = new wxPanel(m_page1);
- auto choose_step_sizer = new wxBoxSizer(wxVERTICAL);
- m_choose_step_panel->SetSizer(choose_step_sizer);
- m_complete_radioBox = new wxRadioButton(m_choose_step_panel, wxID_ANY, _L("Complete Calibration"));
- m_complete_radioBox->SetValue(true);
- choose_step_sizer->Add(m_complete_radioBox);
- choose_step_sizer->AddSpacer(FromDIP(10));
- m_fine_radioBox = new wxRadioButton(m_choose_step_panel, wxID_ANY, _L("Fine Calibration based on flow ratio"));
- choose_step_sizer->Add(m_fine_radioBox);
- choose_step_sizer->AddSpacer(FromDIP(10));
- TextInput* flow_ratio_input = new TextInput(m_choose_step_panel, wxEmptyString,"", "", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE);
- flow_ratio_input->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC));
- float default_flow_ratio = 1.0f;
- auto flow_ratio_str = wxString::Format("%.3f", default_flow_ratio);
- flow_ratio_input->GetTextCtrl()->SetValue(flow_ratio_str);
- flow_ratio_input->Hide();
- choose_step_sizer->Add(flow_ratio_input, 0, wxLEFT, FromDIP(18));
- flow_ratio_input->GetTextCtrl()->Bind(wxEVT_TEXT_ENTER, [this, flow_ratio_input](auto& e) {
- float flow_ratio = 0.0f;
- validate_input_flow_ratio(flow_ratio_input->GetTextCtrl()->GetValue(), &flow_ratio);
- auto flow_ratio_str = wxString::Format("%.3f", flow_ratio);
- flow_ratio_input->GetTextCtrl()->SetValue(flow_ratio_str);
- m_coarse_calc_result = flow_ratio;
- });
- flow_ratio_input->GetTextCtrl()->Bind(wxEVT_KILL_FOCUS, [this, flow_ratio_input](auto& e) {
- float flow_ratio = 0.0f;
- validate_input_flow_ratio(flow_ratio_input->GetTextCtrl()->GetValue(), &flow_ratio);
- auto flow_ratio_str = wxString::Format("%.3f", flow_ratio);
- flow_ratio_input->GetTextCtrl()->SetValue(flow_ratio_str);
- m_coarse_calc_result = flow_ratio;
- e.Skip();
- });
- m_page1->Bind(wxEVT_LEFT_DOWN, [this](auto&e) {
- m_page1->SetFocusIgnoringChildren();
- });
- m_complete_radioBox->Bind(wxEVT_RADIOBUTTON, [this, flow_ratio_input](auto& e) {
- flow_ratio_input->Show(false);
- this->Layout();
- });
- m_fine_radioBox->Bind(wxEVT_RADIOBUTTON, [this, flow_ratio_input](auto& e) {
- flow_ratio_input->Show();
- this->Layout();
- });
+ m_all_pages_sizer->Add(start_step->page, 1, wxEXPAND | wxALL, FromDIP(25));
+ m_all_pages_sizer->Add(preset_step->page, 1, wxEXPAND | wxALL, FromDIP(25));
+ m_all_pages_sizer->Add(cali_coarse_step->page, 1, wxEXPAND | wxALL, FromDIP(25));
+ m_all_pages_sizer->Add(coarse_save_step->page, 1, wxEXPAND | wxALL, FromDIP(25));
+ m_all_pages_sizer->Add(cali_fine_step->page, 1, wxEXPAND | wxALL, FromDIP(25));
+ m_all_pages_sizer->Add(fine_save_step->page, 1, wxEXPAND | wxALL, FromDIP(25));
- page1_content_sizer->AddSpacer(PRESET_GAP);
- page1_content_sizer->Add(m_choose_step_panel, 0);
+ m_all_pages_sizer->Add(cali_step->page, 1, wxEXPAND | wxALL, FromDIP(25));
+ m_all_pages_sizer->Add(save_step->page, 1, wxEXPAND | wxALL, FromDIP(25));
+
+ m_page_steps.push_back(start_step);
+ m_page_steps.push_back(preset_step);
+ m_page_steps.push_back(cali_coarse_step);
+ m_page_steps.push_back(coarse_save_step);
+ m_page_steps.push_back(cali_fine_step);
+ m_page_steps.push_back(fine_save_step);
+
+ //m_page_steps.push_back(cali_step);
+ //m_page_steps.push_back(save_step);
+
+ for (int i = 0; i < m_page_steps.size() - 1; i++) {
+ m_page_steps[i]->chain(m_page_steps[i + 1]);
}
- // Hide
- m_all_pages_sizer->Add(m_page1, 1, wxEXPAND | wxALL, FromDIP(25));
-
- // page 2 : print page
- m_page2 = create_print_page();
- m_page2->set_page_title(_L("Flow Rate"));
- m_all_pages_sizer->Add(m_page2, 1, wxEXPAND | wxALL, FromDIP(25));
-
- m_page0->chain(m_page1)->chain(m_page2);
- m_first_page = m_page0;
- m_curr_page = m_page0;
- show_page(m_curr_page);
-
- create_low_end_pages();
-}
-
-void FlowRateWizard::request_calib_result() {
-
- if (is_high_end_type(curr_obj)) {
- if (is_first_time_get_result) {
- curr_obj->has_get_flow_ratio_result = false;
- CalibUtils::emit_get_flow_ratio_calib_results(curr_obj->nozzle_diameter);
- is_first_time_get_result = false;
- }
- if (curr_obj->has_get_flow_ratio_result) {
- if (!has_get_result) {
- CalibUtils::get_flow_ratio_calib_results(m_calib_results);
- if (m_calib_results.size() > 0) {
- has_get_result = true;
- sync_save_page_data();
- }
- }
- }
+ // hide all pages
+ cali_step->page->Hide();
+ save_step->page->Hide();
+ for (int i = 0; i < m_page_steps.size(); i++) {
+ m_page_steps[i]->page->Hide();
+ m_page_steps[i]->page->Bind(EVT_CALI_ACTION, &FlowRateWizard::on_cali_action, this);
}
+
+
+ cali_step->page->Bind(EVT_CALI_ACTION, &FlowRateWizard::on_cali_action, this);
+ save_step->page->Bind(EVT_CALI_ACTION, &FlowRateWizard::on_cali_action, this);
+
+ if (!m_page_steps.empty())
+ show_step(m_page_steps.front());
+
+ set_cali_method(CalibrationMethod::CALI_METHOD_MANUAL);
}
-void FlowRateWizard::sync_save_page_data() {
- m_high_end_save_names.clear();
- m_grid_panel->DestroyChildren();
- wxBoxSizer* grid_sizer = new wxBoxSizer(wxHORIZONTAL);
- const int COLUMN_GAP = FromDIP(50);
- const int ROW_GAP = FromDIP(30);
- wxBoxSizer* left_title_sizer = new wxBoxSizer(wxVERTICAL);
- left_title_sizer->AddSpacer(FromDIP(49));
- auto flow_ratio_title = new wxStaticText(m_grid_panel, wxID_ANY, _L("Flow Ratio"), wxDefaultPosition, wxDefaultSize, 0);
- flow_ratio_title->SetFont(Label::Head_14);
- left_title_sizer->Add(flow_ratio_title, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP);
- auto brand_title = new wxStaticText(m_grid_panel, wxID_ANY, _L("Brand Name"), wxDefaultPosition, wxDefaultSize, 0);
- brand_title->SetFont(Label::Head_14);
- left_title_sizer->Add(brand_title, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP);
- grid_sizer->Add(left_title_sizer);
- grid_sizer->AddSpacer(COLUMN_GAP);
-
- FilamentComboBoxList fcb_list = get_selected_filament_comboBox();
- for (auto& fcb : fcb_list) {
- bool result_failed = false;
- auto it_result = std::find_if(m_calib_results.begin(), m_calib_results.end(), [fcb](auto& calib_result) {
- return calib_result.tray_id == fcb->get_tray_id();
- });
- if (it_result != m_calib_results.end()) {
- result_failed = false;
- }
- else {
- result_failed = true;
- }
- int index = it_result - m_calib_results.begin();
-
- wxBoxSizer* column_data_sizer = new wxBoxSizer(wxVERTICAL);
- auto tray_title = new wxStaticText(m_grid_panel, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, 0);
- tray_title->SetFont(Label::Head_14);
- tray_title->SetLabel(fcb->get_tray_name());
- column_data_sizer->Add(tray_title, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP);
-
- auto flow_ratio_value = new TextInput(m_grid_panel, NA_STR, "", "", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE, wxTE_PROCESS_ENTER);
- auto flow_ratio_value_failed = new wxStaticText(m_grid_panel, wxID_ANY, _L("Failed"), wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE);
- flow_ratio_value->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC));
- if (!result_failed) {
- auto flow_ratio_str = wxString::Format("%.3f", it_result->flow_ratio);
- flow_ratio_value->GetTextCtrl()->SetValue(flow_ratio_str);
- }
- flow_ratio_value->GetTextCtrl()->Bind(wxEVT_TEXT_ENTER, [this, fcb, flow_ratio_value, index](auto& e) {
- float flow_ratio = 0.0f;
- validate_input_flow_ratio(flow_ratio_value->GetTextCtrl()->GetValue(), &flow_ratio);
- auto flow_ratio_str = wxString::Format("%.3f", flow_ratio);
- flow_ratio_value->GetTextCtrl()->SetValue(flow_ratio_str);
- m_calib_results[index].flow_ratio = flow_ratio;
- });
- flow_ratio_value->GetTextCtrl()->Bind(wxEVT_KILL_FOCUS, [this, fcb, flow_ratio_value, index](auto& e) {
- float flow_ratio = 0.0f;
- validate_input_flow_ratio(flow_ratio_value->GetTextCtrl()->GetValue(), &flow_ratio);
- auto flow_ratio_str = wxString::Format("%.3f", flow_ratio);
- flow_ratio_value->GetTextCtrl()->SetValue(flow_ratio_str);
- m_calib_results[index].flow_ratio = flow_ratio;
- e.Skip();
- });
- column_data_sizer->Add(flow_ratio_value, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP);
- column_data_sizer->Add(flow_ratio_value_failed, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP);
-
- auto save_name_input = new TextInput(m_grid_panel, fcb->GetComboBox()->GetValue() + "-Calibrated", "", "", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE, wxTE_PROCESS_ENTER);
- auto save_name_input_failed = new wxStaticText(m_grid_panel, wxID_ANY, " - ", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE);
-
- auto set_edit_mode = [this, flow_ratio_value, flow_ratio_value_failed, save_name_input, save_name_input_failed](std::string str) {
- if (str == "normal") {
- save_name_input->Show();
- save_name_input_failed->Show(false);
- flow_ratio_value->Show();
- flow_ratio_value_failed->Show(false);
- }
- if (str == "failed") {
- save_name_input->Show(false);
- save_name_input_failed->Show();
- flow_ratio_value->Show(false);
- flow_ratio_value_failed->Show();
- }
- m_grid_panel->Layout();
- m_grid_panel->Update();
- };
-
- if (!result_failed) {
- m_high_end_save_names[fcb->get_tray_id()] = save_name_input->GetTextCtrl()->GetValue().ToStdString();
- save_name_input->GetTextCtrl()->Bind(wxEVT_TEXT_ENTER, [this, fcb, save_name_input](auto& e) {
- m_high_end_save_names[fcb->get_tray_id()] = save_name_input->GetTextCtrl()->GetValue().ToStdString();
- });
- save_name_input->GetTextCtrl()->Bind(wxEVT_KILL_FOCUS, [this, fcb, save_name_input](auto& e) {
- m_high_end_save_names[fcb->get_tray_id()] = save_name_input->GetTextCtrl()->GetValue().ToStdString();
- e.Skip();
- });
- set_edit_mode("normal");
- }
- else {
- set_edit_mode("failed");
- }
- column_data_sizer->Add(save_name_input, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP);
- column_data_sizer->Add(save_name_input_failed, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP);
-
- grid_sizer->Add(column_data_sizer);
- grid_sizer->AddSpacer(COLUMN_GAP);
- }
- m_grid_panel->Bind(wxEVT_LEFT_DOWN, [this](auto& e) {
- m_grid_panel->SetFocusIgnoringChildren();
- });
- m_grid_panel->SetSizer(grid_sizer, true);
- Layout();
-}
-
-void FlowRateWizard::switch_pages(SimpleEvent& evt) {
- if (curr_obj) {
- if (is_high_end_type(curr_obj)) {
- m_choose_step_panel->Hide();
- }
- else {
- m_choose_step_panel->Show();
- }
-
- if (is_high_end_type(curr_obj))
- {
- if (m_low_end_page3) {
- m_low_end_page3->Destroy();
- m_low_end_page3 = nullptr;
- }
- if (m_low_end_page4) {
- m_low_end_page4->Destroy();
- m_low_end_page4 = nullptr;
- }
- if (m_low_end_page5) {
- m_low_end_page5->Destroy();
- m_low_end_page5 = nullptr;
- }
- if (m_high_end_page3) {
- m_high_end_page3->Destroy();
- m_high_end_page3 = nullptr;
- }
-
- create_high_end_pages();
-
- sync_save_page_data(); // CALIBRATION_DEBUG
- }
- else
- {
- if (m_high_end_page3) {
- m_high_end_page3->Destroy();
- m_high_end_page3 = nullptr;
- }
- if (m_low_end_page3) {
- m_low_end_page3->Destroy();
- m_low_end_page3 = nullptr;
- }
- if (m_low_end_page4) {
- m_low_end_page4->Destroy();
- m_low_end_page4 = nullptr;
- }
- if (m_low_end_page5) {
- m_low_end_page5->Destroy();
- m_low_end_page5 = nullptr;
- }
-
- create_low_end_pages();
- }
- Layout();
- }
-}
-
-void FlowRateWizard::change_ams_select_mode() {
- //if (is_high_end_type(curr_obj)) {
- // set_ams_select_mode(FSMCheckBoxMode);
- //}
- //else {
- // set_ams_select_mode(FSMRadioMode);
- //}
- set_ams_select_mode(FSMRadioMode);
-}
-
-bool FlowRateWizard::start_calibration(std::vector tray_ids)
+void FlowRateWizard::on_cali_action(wxCommandEvent& evt)
{
- int nozzle_temp = -1;
- int bed_temp = -1;
- float max_volumetric_speed = -1;
-
- if (m_nozzle_temp->GetTextCtrl()->GetValue().IsEmpty() ||
- m_bed_temp->GetTextCtrl()->GetValue().IsEmpty() ||
- m_max_volumetric_speed->GetTextCtrl()->GetValue().IsEmpty())
- return false;
- nozzle_temp = stoi(m_nozzle_temp->GetTextCtrl()->GetValue().ToStdString());
- bed_temp = stoi(m_bed_temp->GetTextCtrl()->GetValue().ToStdString());
- max_volumetric_speed = stof(m_max_volumetric_speed->GetTextCtrl()->GetValue().ToStdString());
-
- if (bed_temp < 0 || nozzle_temp < 0 || max_volumetric_speed < 0) {
- MessageDialog msg_dlg(nullptr, _L("Make sure bed_temp > 0 \nnozzle_temp > 0\nmax_volumetric_speed > 0"), wxEmptyString, wxICON_WARNING | wxOK);
- msg_dlg.ShowModal();
- return false;
+ CaliPageActionType action = static_cast(evt.GetInt());
+ if (action == CaliPageActionType::CALI_ACTION_MANAGE_RESULT) {
+ ;
}
+ else if (action == CaliPageActionType::CALI_ACTION_MANUAL_CALI) {
+ preset_step->page->set_cali_filament_mode(CalibrationFilamentMode::CALI_MODEL_SINGLE);
+ this->set_cali_method(CalibrationMethod::CALI_METHOD_MANUAL);
+ preset_step->page->on_device_connected(curr_obj);
+ show_step(m_curr_step->next);
+ }
+ else if (action == CaliPageActionType::CALI_ACTION_AUTO_CALI) {
+ CalibrationFilamentMode fila_mode = get_cali_filament_mode(curr_obj, m_mode);
+ preset_step->page->set_cali_filament_mode(fila_mode);
+ this->set_cali_method(CalibrationMethod::CALI_METHOD_AUTO);
+ preset_step->page->on_device_connected(curr_obj);
+ show_step(m_curr_step->next);
+ }
+ else if (action == CaliPageActionType::CALI_ACTION_NEXT) {
+ show_step(m_curr_step->next);
+ }
+ else if (action == CaliPageActionType::CALI_ACTION_PREV) {
+ show_step(m_curr_step->prev);
+ }
+ else if (action == CaliPageActionType::CALI_ACTION_CALI) {
+ if (m_cali_method == CalibrationMethod::CALI_METHOD_AUTO) {
+ on_cali_start();
+ // show next step when print job is sending finished.
+ show_step(m_curr_step->next);
+ }
+ else if (m_cali_method == CalibrationMethod::CALI_METHOD_MANUAL) {
+ CaliPresetStage stage = CaliPresetStage::CALI_MANULA_STAGE_NONE;
+ float cali_value = 0.0f;
+ static_cast(preset_step->page)->get_cali_stage(stage, cali_value);
+ on_cali_start(stage, cali_value);
+ if (stage == CaliPresetStage::CALI_MANUAL_STAGE_2) {
+ // set next step page
+ m_curr_step->chain(cali_fine_step);
+ }
+ show_step(m_curr_step->next);
+ }
+ else {
+ on_cali_start();
+ show_step(m_curr_step->next);
+ }
+ }
+ else if (action == CaliPageActionType::CALI_ACTION_FLOW_CALI_STAGE_2) {
+ if (m_cali_method == CalibrationMethod::CALI_METHOD_MANUAL) {
+ float new_flow_ratio = 0.0f;
+ wxString temp_name = ""; // unused
+ auto coarse_save_page = static_cast(m_curr_step->page);
+ if (!coarse_save_page->get_result(&new_flow_ratio, &temp_name)) {
+ return;
+ }
+ on_cali_start(CaliPresetStage::CALI_MANUAL_STAGE_2, new_flow_ratio);
+ show_step(m_curr_step->next);
+ }
+ }
+ else if (action == CaliPageActionType::CALI_ACTION_FLOW_SAVE) {
+ on_cali_save();
+ }
+ else if (action == CaliPageActionType::CALI_ACTION_FLOW_COARSE_SAVE) {
+ auto coarse_save_page = static_cast(coarse_save_step->page);
+ if (coarse_save_page->is_skip_fine_calibration()) {
+ on_cali_save();
+ }
+ }
+ else if (action == CaliPageActionType::CALI_ACTION_FLOW_FINE_SAVE) {
+ on_cali_save();
+ }
+ else if (action == CaliPageActionType::CALI_ACTION_GO_HOME) {
+ on_cali_go_home();
+ }
+}
- if (is_high_end_type(curr_obj)) {
- m_calib_results.clear();
+void FlowRateWizard::on_cali_start(CaliPresetStage stage, float cali_value)
+{
+ if (!curr_obj) return;
+
+ //clean flow rate result
+ curr_obj->flow_ratio_results.clear();
+
+ float nozzle_dia = 0.4;
+ std::string setting_id;
+ BedType plate_type = BedType::btDefault;
+
+ CalibrationPresetPage* preset_page = (static_cast(preset_step->page));
+
+ preset_page->get_preset_info(nozzle_dia, plate_type);
+
+ std::map selected_filaments = preset_page->get_selected_filaments();
+
+ if (m_cali_method == CalibrationMethod::CALI_METHOD_AUTO) {
X1CCalibInfos calib_infos;
- for (int tray_id : tray_ids) {
- if (m_filament_presets.find(tray_id) == m_filament_presets.end())
- return false;
+ for (auto& item : selected_filaments) {
+ int nozzle_temp = -1;
+ int bed_temp = -1;
+ float max_volumetric_speed = -1;
+
+ if (!get_preset_info(item.second->config, plate_type, nozzle_temp, bed_temp, max_volumetric_speed)) {
+ BOOST_LOG_TRIVIAL(error) << "CaliPreset: get preset info error";
+ }
+
X1CCalibInfos::X1CCalibInfo calib_info;
- calib_info.tray_id = tray_id;
- calib_info.nozzle_diameter = dynamic_cast(m_printer_preset->config.option("nozzle_diameter"))->get_at(0);
- calib_info.filament_id = m_filament_presets.at(tray_id)->filament_id;
- calib_info.setting_id = m_filament_presets.at(tray_id)->setting_id;
- calib_info.bed_temp = bed_temp;
- calib_info.nozzle_temp = nozzle_temp;
+ calib_info.tray_id = item.first;
+ calib_info.nozzle_diameter = nozzle_dia;
+ calib_info.filament_id = item.second->filament_id;
+ calib_info.setting_id = item.second->setting_id;
+ calib_info.bed_temp = bed_temp;
+ calib_info.nozzle_temp = nozzle_temp;
calib_info.max_volumetric_speed = max_volumetric_speed;
- calib_info.flow_rate = m_filament_presets.at(tray_id)->config.option("filament_flow_ratio")->get_at(0);
calib_infos.calib_datas.push_back(calib_info);
}
+
+ wxString wx_err_string;
std::string error_message;
CalibUtils::calib_flowrate_X1C(calib_infos, error_message);
- if (!error_message.empty()) {
- MessageDialog msg_dlg(nullptr, error_message, wxEmptyString, wxICON_WARNING | wxOK);
+ wx_err_string = from_u8(error_message);
+ if (!wx_err_string.empty()) {
+ MessageDialog msg_dlg(nullptr, wx_err_string, wxEmptyString, wxICON_WARNING | wxOK);
msg_dlg.ShowModal();
- return false;
}
- is_first_time_get_result = true;
- has_get_result = false;
- show_page(get_curr_page()->get_next_page());
- save_to_printer_calib_info(PageType::Calibration);
- return true;
}
- else {
- int pass = -1;
- if (m_fine_radioBox->GetValue()) {
- m_curr_page = m_low_end_page3;
- reset_print_panel_to_page(m_low_end_page4, m_low_end_page4->get_content_vsizer());
- DynamicPrintConfig* filament_config = &m_filament_presets.begin()->second->config;
- filament_config->set_key_value("filament_flow_ratio", new ConfigOptionFloats{ m_coarse_calc_result });
- }
- if (get_curr_page() == m_page1) {
- pass = 1;
- }
- else if (get_curr_page() == m_low_end_page3)
- pass = 2;
- else
- return false;
-
+ else if (m_cali_method == CalibrationMethod::CALI_METHOD_MANUAL) {
CalibInfo calib_info;
- calib_info.dev_id = curr_obj->dev_id;
- calib_info.select_ams = "[" + std::to_string(tray_ids[0]) + "]";
- calib_info.process_bar = m_send_progress_bar;
- calib_info.bed_type = BedType(m_comboBox_bed_type->GetSelection() + btDefault + 1);
- calib_info.printer_prest = m_printer_preset;
- calib_info.filament_prest = m_filament_presets.begin()->second;
- calib_info.print_prest = m_print_preset;
+ calib_info.dev_id = curr_obj->dev_id;
+ Preset* temp_filament_preset = nullptr;
+ int cali_stage = -1;
+ wxString wx_err_string;
- std::string error_message;
- CalibUtils::calib_flowrate(pass, calib_info, error_message);
- if (!error_message.empty()) {
- MessageDialog msg_dlg(nullptr, error_message, wxEmptyString, wxICON_WARNING | wxOK);
- msg_dlg.ShowModal();
- return false;
+ if (!selected_filaments.empty()) {
+ calib_info.select_ams = "[" + std::to_string(selected_filaments.begin()->first) + "]";
+ Preset* preset = selected_filaments.begin()->second;
+ temp_filament_preset = new Preset(preset->type, preset->name + "_temp");
+ temp_filament_preset->config = preset->config;
+
+ calib_info.bed_type = plate_type;
+ calib_info.process_bar = preset_page->get_sending_progress_bar();
+ calib_info.printer_prest = preset_page->get_printer_preset(curr_obj, nozzle_dia);
+ calib_info.print_prest = preset_page->get_print_preset();
+ calib_info.params.mode = CalibMode::Calib_Flow_Rate;
+
+ if (stage == CaliPresetStage::CALI_MANUAL_STAGE_1) {
+ cali_stage = 1;
+ }
+ else if (stage == CaliPresetStage::CALI_MANUAL_STAGE_2) {
+ cali_stage = 2;
+ temp_filament_preset->config.set_key_value("filament_flow_ratio", new ConfigOptionFloats{ cali_value });
+ }
+ calib_info.filament_prest = temp_filament_preset;
+
+ if (cali_stage > 0) {
+ std::string error_message;
+ CalibUtils::calib_flowrate(cali_stage, calib_info, error_message);
+ wx_err_string = from_u8(error_message);
+ }
+ else {
+ wx_err_string = _L("Internal Error") + wxString(": Invalid calibration stage");
+ }
+ } else {
+ wx_err_string = _L("Please select at least one filament for calibration");
}
- show_send_progress_bar(true);
- if (pass == 1)
- save_to_printer_calib_info(PageType::Calibration);
- else if(pass == 2)
- save_to_printer_calib_info(PageType::FineCalibration);
- return true;
+
+ if (!wx_err_string.empty()) {
+ MessageDialog msg_dlg(nullptr, wx_err_string, wxEmptyString, wxICON_WARNING | wxOK);
+ msg_dlg.ShowModal();
+ }
+ preset_page->on_cali_start_job();
+ if (temp_filament_preset)
+ delete temp_filament_preset;
+ } else {
+ assert(false);
}
}
-bool FlowRateWizard::save_calibration_result()
+void FlowRateWizard::on_cali_save()
{
- if (is_high_end_type(curr_obj)) {
- for (auto& result : m_calib_results) {
- if (result.flow_ratio <= 0 || result.flow_ratio >= 2) {
- MessageDialog msg_dlg(nullptr, _L("Please input a valid value (0.0 < flow ratio < 0.2)"), wxEmptyString, wxICON_WARNING | wxOK);
- msg_dlg.ShowModal();
- return false;
+ if (curr_obj) {
+ if (m_cali_method == CalibrationMethod::CALI_METHOD_AUTO) {
+ std::vector> new_results;
+ auto save_page = static_cast(save_step->page);
+ if (!save_page->get_result(new_results)) {
+ return;
}
- }
- for (int i = 0; i < m_calib_results.size(); i++) {
- auto it = m_high_end_save_names.find(m_calib_results[i].tray_id);
- if (it != m_high_end_save_names.end() && !it->second.empty()) {
- if (m_filament_presets.find(m_calib_results[i].tray_id) == m_filament_presets.end())
- return false;
+
+ std::string old_preset_name;
+ CalibrationPresetPage* preset_page = (static_cast(preset_step->page));
+ std::map selected_filaments = preset_page->get_selected_filaments();
+ old_preset_name = selected_filaments.begin()->second->name;
+
+ for (int i = 0; i < new_results.size(); i++) {
+ std::map key_value_map;
+ key_value_map.insert(std::make_pair("filament_flow_ratio", new ConfigOptionFloats{ new_results[i].second }));
std::string message;
- if(save_presets(m_filament_presets.at(m_calib_results[i].tray_id), "filament_flow_ratio", new ConfigOptionFloats{ m_calib_results[i].flow_ratio }, it->second, message))
- return true;
- else {
- MessageDialog msg_dlg(nullptr, _L(message), wxEmptyString, wxICON_WARNING | wxOK);
- msg_dlg.ShowModal();
- return false;
+ if (!save_preset(old_preset_name, new_results[i].first.ToStdString(), key_value_map, message)) {
+ MessageDialog error_msg_dlg(nullptr, message, wxEmptyString, wxICON_WARNING | wxOK);
+ error_msg_dlg.ShowModal();
}
}
- if (it != m_high_end_save_names.end() && it->second.empty()) {
- MessageDialog msg_dlg(nullptr, _L("Input name of filament preset to save"), wxEmptyString, wxICON_WARNING | wxOK);
- msg_dlg.ShowModal();
- return false;
+ MessageDialog msg_dlg(nullptr, _L("Flow rate calibration result has been saved to preset"), wxEmptyString, wxICON_WARNING | wxOK);
+ msg_dlg.ShowModal();
+ }
+ else if (m_cali_method == CalibrationMethod::CALI_METHOD_MANUAL) {
+ float new_flow_ratio = 0.0f;
+ wxString new_preset_name = "";
+ if(m_curr_step->page->get_page_type() == CaliPageType::CALI_PAGE_COARSE_SAVE)
+ {
+ auto coarse_save_page = static_cast(m_curr_step->page);
+ if (!coarse_save_page->get_result(&new_flow_ratio, &new_preset_name)) {
+ return;
+ }
}
- }
- return false;
- }
- else {
- bool valid = true;
- float result_value;
- if (m_fine_radioBox->GetValue()) {
- result_value = m_fine_calc_result;
- if (m_optimal_block_fine->GetValue().IsEmpty())
- valid = false;
- }
- else {
- if (m_checkBox_skip_calibration->GetValue()) {
- result_value = m_coarse_calc_result;
- if (m_optimal_block_coarse->GetValue().IsEmpty())
- valid = false;
+ else if (m_curr_step->page->get_page_type() == CaliPageType::CALI_PAGE_FINE_SAVE)
+ {
+ auto fine_save_page = static_cast(m_curr_step->page);
+ if (!fine_save_page->get_result(&new_flow_ratio, &new_preset_name)) {
+ return;
+ }
}
else {
- result_value = m_fine_calc_result;
- if (m_optimal_block_coarse->GetValue().IsEmpty() || m_optimal_block_fine->GetValue().IsEmpty())
- valid = false;
+ return;
+ }
+ std::string old_preset_name;
+ CalibrationPresetPage* preset_page = (static_cast(preset_step->page));
+ std::map selected_filaments = preset_page->get_selected_filaments();
+ old_preset_name = selected_filaments.begin()->second->name;
+
+ std::map key_value_map;
+ key_value_map.insert(std::make_pair("filament_flow_ratio", new ConfigOptionFloats{ new_flow_ratio }));
+
+ std::string message;
+ if (!save_preset(old_preset_name, new_preset_name.ToStdString(), key_value_map, message)) {
+ MessageDialog error_msg_dlg(nullptr, message, wxEmptyString, wxICON_WARNING | wxOK);
+ error_msg_dlg.ShowModal();
+ }
+
+ MessageDialog msg_dlg(nullptr, _L("Flow rate calibration result has been saved to preset"), wxEmptyString, wxICON_WARNING | wxOK);
+ msg_dlg.ShowModal();
+ }
+ else {
+ assert(false);
+ }
+ }
+}
+
+void FlowRateWizard::update(MachineObject* obj)
+{
+ CalibrationWizard::update(obj);
+}
+
+void FlowRateWizard::on_device_connected(MachineObject* obj)
+{
+ CalibrationWizard::on_device_connected(obj);
+
+ CalibrationMethod method;
+ int cali_stage = 0;
+ CalibMode obj_cali_mode = get_obj_calibration_mode(obj, method, cali_stage);
+
+ // show cali step when obj is in pa calibration
+ if (obj) {
+ this->set_cali_method(method);
+ if (obj_cali_mode == m_mode) {
+ if (obj->is_in_printing() || obj->is_printing_finished()) {
+ if (method == CalibrationMethod::CALI_METHOD_MANUAL) {
+ if (cali_stage == 1) {
+ if (m_curr_step != cali_coarse_step)
+ show_step(cali_coarse_step);
+ }
+ else if (cali_stage == 2) {
+ if (m_curr_step != cali_fine_step) {
+ show_step(cali_fine_step);
+ }
+ }
+ else
+ show_step(cali_coarse_step);
+ }
+ else if (method == CalibrationMethod::CALI_METHOD_AUTO) {
+ if (m_curr_step != cali_step)
+ show_step(cali_step);
+ }
}
}
- if (!valid)
- {
- MessageDialog msg_dlg(nullptr, _L("Choose a block with smoothest top surface."), wxEmptyString, wxICON_WARNING | wxOK);
- msg_dlg.ShowModal();
- return false;
- }
- if (m_save_name.empty()) {
- MessageDialog msg_dlg(nullptr, _L("Input name of filament preset to save"), wxEmptyString, wxICON_WARNING | wxOK);
- msg_dlg.ShowModal();
- return false;
- }
- std::string message;
- if (!save_presets(m_filament_presets.begin()->second, "filament_flow_ratio", new ConfigOptionFloats{ result_value }, m_save_name, message)) {
- MessageDialog msg_dlg(nullptr, _L(message), wxEmptyString, wxICON_WARNING | wxOK);
- msg_dlg.ShowModal();
- return false;
- }
- reset_reuse_panels();
- return true;
}
- return false;
}
-bool FlowRateWizard::recommend_input_value()
+void FlowRateWizard::set_cali_method(CalibrationMethod method)
{
- return CalibrationWizard::recommend_input_value();
-}
+ m_cali_method = method;
+ if (method == CalibrationMethod::CALI_METHOD_AUTO) {
+ m_page_steps.clear();
+ m_page_steps.push_back(start_step);
+ m_page_steps.push_back(preset_step);
+ m_page_steps.push_back(cali_step);
+ m_page_steps.push_back(save_step);
-void FlowRateWizard::reset_reuse_panels() {
- reset_send_progress_to_page(m_page1, m_page1->get_btn_hsizer());
- reset_print_panel_to_page(m_page2, m_page2->get_content_vsizer());
-}
-
-void FlowRateWizard::reset_print_panel_to_page(CalibrationWizardPage* page, wxBoxSizer* sizer)
-{
- m_btn_next = page->get_next_btn();
- m_btn_recali = page->get_prev_btn();
- m_print_panel->Reparent(page);
- sizer->Remove(sizer->GetItemCount() - 1);
- sizer->Add(m_print_panel, 0, wxALIGN_CENTER, 0);
- Layout();
-}
-
-void FlowRateWizard::reset_send_progress_to_page(CalibrationWizardPage* page, wxBoxSizer* sizer)
-{
- m_send_progress_panel->Reparent(page);
- sizer->Remove(1);
- sizer->Insert(1, m_send_progress_panel, 0, wxALIGN_CENTER, 0);
- Layout();
-}
-
-void FlowRateWizard::on_fine_tune(wxCommandEvent& e) {
- if (m_optimal_block_coarse->GetValue().IsEmpty()){
- MessageDialog msg_dlg(nullptr, _L("Choose a block with smoothest top surface."), wxEmptyString, wxICON_WARNING | wxOK);
- msg_dlg.ShowModal();
- return;
+ for (int i = 0; i < m_page_steps.size() - 1; i++) {
+ m_page_steps[i]->chain(m_page_steps[i + 1]);
+ }
}
+ else if (method == CalibrationMethod::CALI_METHOD_MANUAL) {
+ m_page_steps.clear();
+ m_page_steps.push_back(start_step);
+ m_page_steps.push_back(preset_step);
+ m_page_steps.push_back(cali_coarse_step);
+ m_page_steps.push_back(coarse_save_step);
+ m_page_steps.push_back(cali_fine_step);
+ m_page_steps.push_back(fine_save_step);
- DynamicPrintConfig& filament_config = m_filament_presets.begin()->second->config;
- filament_config.set_key_value("filament_flow_ratio", new ConfigOptionFloats{ m_coarse_calc_result });
-
- reset_send_progress_to_page(m_low_end_page3, m_low_end_page3->get_btn_hsizer());
-
- reset_print_panel_to_page(m_low_end_page4, m_low_end_page4->get_content_vsizer());
-
- e.Skip();
+ for (int i = 0; i < m_page_steps.size() - 1; i++) {
+ m_page_steps[i]->chain(m_page_steps[i + 1]);
+ }
+ }
+ else {
+ assert(false);
+ }
+ CalibrationWizard::set_cali_method(method);
}
-void FlowRateWizard::init_bitmaps()
+void FlowRateWizard::on_cali_job_finished()
{
- m_print_picture->SetBitmap(create_scaled_bitmap("flow_rate_calibration", nullptr, 400));
- m_low_record_picture1->SetMinSize(wxSize(560, 450));
- m_low_record_picture1->SetBackgroundColour(*wxBLACK);
- m_low_print_picture2->SetBitmap(create_scaled_bitmap("flow_rate_calibration_fine", nullptr, 400));
- m_low_record_picture2->SetMinSize(wxSize(560, 450));
- m_low_record_picture2->SetBackgroundColour(*wxBLACK);
+ static_cast(preset_step->page)->on_cali_finished_job();
+
+ show_step(m_curr_step->next);
}
+
MaxVolumetricSpeedWizard::MaxVolumetricSpeedWizard(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style)
: CalibrationWizard(parent, CalibMode::Calib_Vol_speed_Tower, id, pos, size, style)
{
create_pages();
- init_bitmaps();
- m_optimal_max_speed->GetTextCtrl()->Bind(wxEVT_TEXT, [this](auto& e) {
- if (!m_optimal_max_speed->GetTextCtrl()->GetValue().IsEmpty()) {
- m_calc_result = stof(m_optimal_max_speed->GetTextCtrl()->GetValue().ToStdString()); // todo determine to select an object or input target value directly
- m_calc_result_text->SetLabel(wxString::Format(_L("max volumetric speed : %s "), std::to_string(m_calc_result)));
- }
- });
-}
-
-void MaxVolumetricSpeedWizard::set_save_name() {
- if (m_filament_presets.begin()->second) {
- m_save_name = m_filament_presets.begin()->second->alias + "-Calibrated";
- }
- else { m_save_name = ""; }
- m_save_name_input->GetTextCtrl()->SetValue(m_save_name);
-}
-
-CalibrationWizardPage* MaxVolumetricSpeedWizard::create_start_page()
-{
- auto page = new CalibrationWizardPage(m_scrolledWindow);
- page->set_page_type(PageType::Start);
- page->set_highlight_step_text(PageType::Start);
- auto page_content_sizer = page->get_content_vsizer();
-
- auto when_title = new wxStaticText(page, wxID_ANY, _L("When you need Max Volumetric Speed Calibration"));
- when_title->SetFont(Label::Head_14);
- when_title->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
- page_content_sizer->Add(when_title);
- auto when_text = new wxStaticText(page, wxID_ANY, _L("Under-extrusion"));
- when_text->SetFont(Label::Body_14);
- when_text->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
- page_content_sizer->Add(when_text);
-
- page_content_sizer->AddSpacer(PRESET_GAP);
-
- auto explain_title = new wxStaticText(page, wxID_ANY, _L("What will happen if the Max Volumetric Speed is not set up properly"));
- explain_title->SetFont(Label::Head_14);
- explain_title->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
- page_content_sizer->Add(explain_title);
- auto explain_text1 = new wxStaticText(page, wxID_ANY, _L("Under-extrusion: If the value is set too high, under-extrusion will happen and cause poor apperance on the printed model"));
- explain_text1->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
- explain_text1->SetFont(Label::Body_14);
- page_content_sizer->Add(explain_text1);
- auto explain_text2 = new wxStaticText(page, wxID_ANY, _L("Print speed is limited: If the value is set too low, the print speed will be limited and make the print time longer. Take the model on the right picture for example. max volumetric speed [n] mm^3/s costs [x] minutes. max volumetric speed [m] mm^3/s costs [y] minutes"));
- explain_text2->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
- explain_text2->SetFont(Label::Body_14);
- page_content_sizer->Add(explain_text2);
-
- page_content_sizer->AddSpacer(PRESET_GAP);
-
- auto bitmap_sizer = new wxBoxSizer(wxHORIZONTAL);
- auto bitmap1 = new wxStaticBitmap(page, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0);
- bitmap1->SetMinSize(wxSize(560, 450));
- bitmap1->SetBackgroundColour(*wxBLACK);
- bitmap_sizer->Add(bitmap1, 0, wxALL, 0);
- bitmap_sizer->AddSpacer(FromDIP(20));
- auto bitmap2 = new wxStaticBitmap(page, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0);
- bitmap2->SetMinSize(wxSize(560, 450));
- bitmap2->SetBackgroundColour(*wxBLACK);
- bitmap_sizer->Add(bitmap2, 0, wxALL, 0);
- page_content_sizer->Add(bitmap_sizer, 0, wxALL, 0);
-
- page_content_sizer->AddSpacer(PRESET_GAP);
-
- auto wiki = new wxStaticText(page, wxID_ANY, _L("Wiki"));
- wiki->SetFont(Label::Head_14);
- wiki->SetForegroundColour({ 0, 88, 220 });
- wiki->Bind(wxEVT_ENTER_WINDOW, [this, wiki](wxMouseEvent& e) {
- e.Skip();
- SetCursor(wxCURSOR_HAND);
- });
- wiki->Bind(wxEVT_LEAVE_WINDOW, [this, wiki](wxMouseEvent& e) {
- e.Skip();
- SetCursor(wxCURSOR_ARROW);
- });
- wiki->Bind(wxEVT_LEFT_UP, [this](wxMouseEvent& e) {
- if (!m_wiki_url.empty()) wxLaunchDefaultBrowser(m_wiki_url);
- });
- page_content_sizer->Add(wiki, 0);
-
- page->get_prev_btn()->Hide();
-
- auto page_next_btn = page->get_next_btn();
- page_next_btn->SetLabel(_L("Start"));
- page_next_btn->SetButtonType(ButtonType::Start);
-
- return page;
-}
-
-void MaxVolumetricSpeedWizard::create_save_panel_content(wxBoxSizer* sizer)
-{
- auto complete_text = new wxStaticText(m_save_panel, wxID_ANY, _L("Please find the best object on your plate"), wxDefaultPosition, wxDefaultSize, 0);
- complete_text->SetFont(::Label::Head_14);
- complete_text->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
- sizer->Add(complete_text, 0, 0, 0);
-
- sizer->AddSpacer(FromDIP(20));
-
- m_record_picture = new wxStaticBitmap(m_save_panel, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0);
- sizer->Add(m_record_picture, 0, wxALIGN_CENTER, 0);
-
- sizer->AddSpacer(FromDIP(20));
-
- auto value_sizer = new wxBoxSizer(wxVERTICAL);
- auto value_text = new wxStaticText(m_save_panel, wxID_ANY, _L("Input Value"), wxDefaultPosition, wxDefaultSize, 0);
- value_text->SetFont(Label::Head_14);
- value_text->Wrap(-1);
- m_optimal_max_speed = new TextInput(m_save_panel, wxEmptyString, "", "", wxDefaultPosition, CALIBRATION_OPTIMAL_INPUT_SIZE, wxTE_PROCESS_ENTER);
- m_optimal_max_speed->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC));
- m_calc_result_text = new wxStaticText(m_save_panel, wxID_ANY, "");
- value_sizer->Add(value_text, 0, 0, 0);
- value_sizer->Add(m_optimal_max_speed, 0);
- value_sizer->Add(m_calc_result_text, 0);
- sizer->Add(value_sizer, 0, 0);
-
- sizer->AddSpacer(FromDIP(20));
-
- auto save_text = new wxStaticText(m_save_panel, wxID_ANY, _L("Save to Filament Preset"), wxDefaultPosition, wxDefaultSize, 0);
- save_text->Wrap(-1);
- save_text->SetFont(Label::Head_14);
- sizer->Add(save_text, 0, 0, 0);
-
- m_save_name_input = new TextInput(m_save_panel, m_save_name, "", "", wxDefaultPosition, { CALIBRATION_TEXT_MAX_LENGTH, FromDIP(24) }, 0);
- sizer->Add(m_save_name_input, 0, 0, 0);
- m_save_name_input->GetTextCtrl()->Bind(wxEVT_TEXT, [this](auto& e) {
- if (!m_save_name_input->GetTextCtrl()->GetValue().IsEmpty())
- m_save_name = m_save_name_input->GetTextCtrl()->GetValue().ToStdString();
- else
- m_save_name = "";
- });
}
void MaxVolumetricSpeedWizard::create_pages()
{
- // page 0 : start page
- m_page0 = create_start_page();
- m_page0->set_page_title(_L("Max Volumetric Speed"));
- m_all_pages_sizer->Add(m_page0, 1, wxEXPAND | wxALL, FromDIP(25));
+ start_step = new CalibrationWizardPageStep(new CalibrationMaxVolumetricSpeedStartPage(m_scrolledWindow));
+ preset_step = new CalibrationWizardPageStep(new MaxVolumetricSpeedPresetPage(m_scrolledWindow, m_mode, true));
- // page 1 : preset page
- m_page1 = create_presets_page(true);
- m_page1->set_page_title(_L("Max Volumetric Speed"));
+ // manual
+ cali_step = new CalibrationWizardPageStep(new CalibrationCaliPage(m_scrolledWindow, m_mode));
+ save_step = new CalibrationWizardPageStep(new CalibrationMaxVolumetricSpeedSavePage(m_scrolledWindow));
- m_from_text->SetLabel(_L("From Volumetric Speed"));
- m_to_text->SetLabel(_L("To Volumetric Speed"));
- m_from_value->SetLabel(_L("mm\u00B3/s"));
- m_to_value->SetLabel(_L("mm\u00B3/s"));
- m_step->SetLabel(_L("mm\u00B3/s"));
- auto step_str = wxString::Format("%1.1f", 0.5f);
- m_step->GetTextCtrl()->SetValue(step_str);
+ m_all_pages_sizer->Add(start_step->page, 1, wxEXPAND | wxALL, FromDIP(25));
+ m_all_pages_sizer->Add(preset_step->page, 1, wxEXPAND | wxALL, FromDIP(25));
+ m_all_pages_sizer->Add(cali_step->page, 1, wxEXPAND | wxALL, FromDIP(25));
+ m_all_pages_sizer->Add(save_step->page, 1, wxEXPAND | wxALL, FromDIP(25));
- m_all_pages_sizer->Add(m_page1, 1, wxEXPAND | wxALL, FromDIP(25));
+ m_page_steps.push_back(start_step);
+ m_page_steps.push_back(preset_step);
+ m_page_steps.push_back(cali_step);
+ m_page_steps.push_back(save_step);
- // page 2 : print page
- m_page2 = create_print_page();
- m_page2->set_page_title(_L("Max Volumetric Speed"));
- m_all_pages_sizer->Add(m_page2, 1, wxEXPAND | wxALL, FromDIP(25));
-
- // page 3 : save page
- m_page3 = create_save_page();
- m_page3->set_page_title(_L("Max Volumetric Speed"));
- m_all_pages_sizer->Add(m_page3, 1, wxEXPAND | wxALL, FromDIP(25));
-
- // link page
- m_page0->chain(m_page1)->chain(m_page2)->chain(m_page3);
-
- m_first_page = m_page0;
- m_curr_page = m_page0;
- show_page(m_curr_page);
-}
-
-bool MaxVolumetricSpeedWizard::start_calibration(std::vector tray_ids)
-{
- Calib_Params params;
- m_from_value->GetTextCtrl()->GetValue().ToDouble(¶ms.start);
- m_to_value->GetTextCtrl()->GetValue().ToDouble(¶ms.end);
- m_step->GetTextCtrl()->GetValue().ToDouble(¶ms.step);
- params.mode = CalibMode::Calib_Vol_speed_Tower;
-
- if (params.start <= 0 || params.step <= 0 || params.end < (params.start + params.step) || params.end > 60) {
- MessageDialog msg_dlg(nullptr, _L("Please input valid values:\nFrom > 0\nTo < 60\nStep >= 0\nTo > From + Step"), wxEmptyString, wxICON_WARNING | wxOK);
- msg_dlg.ShowModal();
- return false;
+ for (int i = 0; i < m_page_steps.size() - 1; i++) {
+ m_page_steps[i]->chain(m_page_steps[i + 1]);
}
- CalibInfo calib_info;
- calib_info.params = params;
- calib_info.dev_id = curr_obj->dev_id;
- calib_info.select_ams = "[" + std::to_string(tray_ids[0]) + "]";
- calib_info.process_bar = m_send_progress_bar;
- calib_info.bed_type = BedType(m_comboBox_bed_type->GetSelection() + btDefault + 1);
- calib_info.printer_prest = m_printer_preset;
- calib_info.filament_prest = m_filament_presets.begin()->second;
- calib_info.print_prest = m_print_preset;
+ for (int i = 0; i < m_page_steps.size(); i++) {
+ m_page_steps[i]->page->Hide();
+ m_page_steps[i]->page->Bind(EVT_CALI_ACTION, &MaxVolumetricSpeedWizard::on_cali_action, this);
+ }
+ for (auto page_step : m_page_steps) {
+ page_step->page->Hide();
+ }
+
+ if (!m_page_steps.empty())
+ show_step(m_page_steps.front());
+ return;
+}
+
+void MaxVolumetricSpeedWizard::on_cali_action(wxCommandEvent& evt)
+{
+ CaliPageActionType action = static_cast(evt.GetInt());
+
+ if (action == CaliPageActionType::CALI_ACTION_START) {
+ show_step(m_curr_step->next);
+ }
+ else if (action == CaliPageActionType::CALI_ACTION_PREV) {
+ show_step(m_curr_step->prev);
+ }
+ else if (action == CaliPageActionType::CALI_ACTION_CALI) {
+ on_cali_start();
+ }
+ else if (action == CaliPageActionType::CALI_ACTION_NEXT) {
+ show_step(m_curr_step->next);
+ }
+ else if (action == CaliPageActionType::CALI_ACTION_COMMON_SAVE) {
+ on_cali_save();
+ }
+ else if (action == CaliPageActionType::CALI_ACTION_GO_HOME) {
+ on_cali_go_home();
+ }
+}
+
+void MaxVolumetricSpeedWizard::on_cali_start()
+{
+ float nozzle_dia = 0.4;
+ std::string setting_id;
+ BedType plate_type = BedType::btDefault;
+
+ CalibrationPresetPage *preset_page = (static_cast(preset_step->page));
+
+ preset_page->get_preset_info(nozzle_dia, plate_type);
+
+ wxArrayString values = preset_page->get_custom_range_values();
+ Calib_Params params;
+ if (values.size() != 3) {
+ MessageDialog msg_dlg(nullptr, _L("The input value size must be 3."), wxEmptyString, wxICON_WARNING | wxOK);
+ msg_dlg.ShowModal();
+ return;
+ }
+ else {
+ values[0].ToDouble(¶ms.start);
+ values[1].ToDouble(¶ms.end);
+ values[2].ToDouble(¶ms.step);
+ }
+ params.mode = m_mode;
+
+ std::map selected_filaments = preset_page->get_selected_filaments();
+
+ CalibInfo calib_info;
+ calib_info.params = params;
+ calib_info.dev_id = curr_obj->dev_id;
+ if (!selected_filaments.empty()) {
+ calib_info.select_ams = "[" + std::to_string(selected_filaments.begin()->first) + "]";
+ calib_info.filament_prest = selected_filaments.begin()->second;
+ }
+
+ calib_info.bed_type = plate_type;
+ calib_info.process_bar = preset_page->get_sending_progress_bar();
+ calib_info.printer_prest = preset_page->get_printer_preset(curr_obj, nozzle_dia);
+ calib_info.print_prest = preset_page->get_print_preset();
+
+ wxString wx_err_string;
std::string error_message;
CalibUtils::calib_max_vol_speed(calib_info, error_message);
- if (!error_message.empty()) {
- MessageDialog msg_dlg(nullptr, _L(error_message), wxEmptyString, wxICON_WARNING | wxOK);
+ wx_err_string = from_u8(error_message);
+ if (!wx_err_string.empty()) {
+ MessageDialog msg_dlg(nullptr, wx_err_string, wxEmptyString, wxICON_WARNING | wxOK);
msg_dlg.ShowModal();
- return false;
}
- show_send_progress_bar(true);
- return true;
+
+ preset_page->on_cali_start_job();
}
-bool MaxVolumetricSpeedWizard::save_calibration_result()
+void MaxVolumetricSpeedWizard::on_cali_save()
{
- if (m_optimal_max_speed->GetTextCtrl()->GetValue().IsEmpty())
- {
- MessageDialog msg_dlg(nullptr, _L("Input a value."), wxEmptyString, wxICON_WARNING | wxOK);
- msg_dlg.ShowModal();
- return false;
+ std::string old_preset_name;
+ std::string new_preset_name;
+
+ CalibrationPresetPage *preset_page = (static_cast(preset_step->page));
+ std::map selected_filaments = preset_page->get_selected_filaments();
+ if (!selected_filaments.empty()) {
+ old_preset_name = selected_filaments.begin()->second->name;
}
- double max_volumetric_speed;
- m_optimal_max_speed->GetTextCtrl()->GetValue().ToDouble(&max_volumetric_speed);
- if (m_save_name.empty()) {
- MessageDialog msg_dlg(nullptr, _L("Input name of filament preset to save"), wxEmptyString, wxICON_WARNING | wxOK);
- msg_dlg.ShowModal();
- return false;
+
+ double value = 0;
+ CalibrationMaxVolumetricSpeedSavePage *save_page = (static_cast(save_step->page));
+ if (!save_page->get_save_result(value, new_preset_name)) {
+ return;
}
+
+ std::map key_value_map;
+ key_value_map.insert(std::make_pair("filament_max_volumetric_speed", new ConfigOptionFloats{ value }));
+
std::string message;
- if (!save_presets(m_filament_presets.begin()->second, "filament_max_volumetric_speed", new ConfigOptionFloats{ max_volumetric_speed }, m_save_name, message)) {
- MessageDialog msg_dlg(nullptr, _L(message), wxEmptyString, wxICON_WARNING | wxOK);
- msg_dlg.ShowModal();
- return false;
+ if (!save_preset(old_preset_name, new_preset_name, key_value_map, message)) {
+ MessageDialog error_msg_dlg(nullptr, message, wxEmptyString, wxICON_WARNING | wxOK);
+ error_msg_dlg.ShowModal();
}
- return true;
}
-bool MaxVolumetricSpeedWizard::recommend_input_value()
+void MaxVolumetricSpeedWizard::on_cali_job_finished()
{
- if (!CalibrationWizard::recommend_input_value()) {
- m_from_value->GetTextCtrl()->SetValue(wxEmptyString);
- m_to_value->GetTextCtrl()->SetValue(wxEmptyString);
- m_step->GetTextCtrl()->SetValue(wxEmptyString);
- return false;
- }
- else {
- m_from_value->GetTextCtrl()->SetValue("5");
- m_to_value->GetTextCtrl()->SetValue("20");
- auto step_str = wxString::Format("%1.1f", 0.5f);
- m_step->GetTextCtrl()->SetValue(step_str);
- return true;
- }
-}
+ static_cast(preset_step->page)->on_cali_finished_job();
-void MaxVolumetricSpeedWizard::init_bitmaps()
+ show_step(m_curr_step->next);
+}
+void MaxVolumetricSpeedWizard::on_device_connected(MachineObject *obj)
{
- m_print_picture->SetBitmap(create_scaled_bitmap("max_volumetric_speed_calibration", nullptr, 400));
- m_record_picture->SetMinSize(wxSize(500, 400));
- m_record_picture->SetBackgroundColour(*wxBLACK);
-}
+ CalibrationWizard::on_device_connected(obj);
-TemperatureWizard::TemperatureWizard(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style)
- : CalibrationWizard(parent, CalibMode::Calib_Temp_Tower, id, pos, size, style)
-{
- create_pages();
- init_bitmaps();
-}
+ CalibrationMethod method;
+ int cali_stage = 0;
+ CalibMode obj_cali_mode = get_obj_calibration_mode(obj, method, cali_stage);
-void TemperatureWizard::set_save_name() {
- if (m_filament_presets.begin()->second) {
- m_save_name = m_filament_presets.begin()->second->alias + "-Calibrated";
- }
- else { m_save_name = ""; }
- m_save_name_input->GetTextCtrl()->SetValue(m_save_name);
-}
-
-CalibrationWizardPage* TemperatureWizard::create_start_page()
-{
- auto page = new CalibrationWizardPage(m_scrolledWindow);
- page->set_page_type(PageType::Start);
- page->set_highlight_step_text(PageType::Start);
- auto page_content_sizer = page->get_content_vsizer();
-
- auto when_title = new wxStaticText(page, wxID_ANY, _L("When you need Temperature Calibration"));
- when_title->SetFont(Label::Head_14);
- when_title->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
- page_content_sizer->Add(when_title);
- auto when_text1 = new wxStaticText(page, wxID_ANY, _L("Model stringing"));
- when_text1->SetFont(Label::Body_14);
- when_text1->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
- page_content_sizer->Add(when_text1);
- auto when_text2 = new wxStaticText(page, wxID_ANY, _L("Layer adhesion problem"));
- when_text2->SetFont(Label::Body_14);
- when_text2->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
- page_content_sizer->Add(when_text2);
- auto when_text3 = new wxStaticText(page, wxID_ANY, _L("Warping(overhang)"));
- when_text3->SetFont(Label::Body_14);
- when_text3->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
- page_content_sizer->Add(when_text3);
- auto when_text4 = new wxStaticText(page, wxID_ANY, _L("Bridging"));
- when_text4->SetFont(Label::Body_14);
- when_text4->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
- page_content_sizer->Add(when_text4);
-
- page_content_sizer->AddSpacer(PRESET_GAP);
-
- auto bitmap_sizer = new wxBoxSizer(wxHORIZONTAL);
- auto bitmap1 = new wxStaticBitmap(page, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0);
- bitmap1->SetMinSize(wxSize(560, 450));
- bitmap1->SetBackgroundColour(*wxBLACK);
- bitmap_sizer->Add(bitmap1, 0, wxALL, 0);
- bitmap_sizer->AddSpacer(FromDIP(20));
- auto bitmap2 = new wxStaticBitmap(page, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0);
- bitmap2->SetMinSize(wxSize(560, 450));
- bitmap2->SetBackgroundColour(*wxBLACK);
- bitmap_sizer->Add(bitmap2, 0, wxALL, 0);
- page_content_sizer->Add(bitmap_sizer, 0, wxALL, 0);
-
- page_content_sizer->AddSpacer(PRESET_GAP);
-
- auto wiki = new wxStaticText(page, wxID_ANY, _L("Wiki"));
- wiki->SetFont(Label::Head_14);
- wiki->SetForegroundColour({ 0, 88, 220 });
- wiki->Bind(wxEVT_ENTER_WINDOW, [this, wiki](wxMouseEvent& e) {
- e.Skip();
- SetCursor(wxCURSOR_HAND);
- });
- wiki->Bind(wxEVT_LEAVE_WINDOW, [this, wiki](wxMouseEvent& e) {
- e.Skip();
- SetCursor(wxCURSOR_ARROW);
- });
- wiki->Bind(wxEVT_LEFT_UP, [this](wxMouseEvent& e) {
- if (!m_wiki_url.empty()) wxLaunchDefaultBrowser(m_wiki_url);
- });
- page_content_sizer->Add(wiki, 0);
-
-
- page->get_prev_btn()->Hide();
-
- auto page_next_btn = page->get_next_btn();
- page_next_btn->SetLabel(_L("Start"));
- page_next_btn->SetButtonType(ButtonType::Start);
-
- return page;
-}
-
-void TemperatureWizard::create_save_panel_content(wxBoxSizer* sizer)
-{
- auto complete_text = new wxStaticText(m_save_panel, wxID_ANY, _L("Please find the best object on your plate"), wxDefaultPosition, wxDefaultSize, 0);
- complete_text->SetFont(::Label::Head_14);
- complete_text->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
- sizer->Add(complete_text, 0, 0, 0);
- sizer->AddSpacer(FromDIP(20));
-
- m_record_picture = new wxStaticBitmap(m_save_panel, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0);
- sizer->Add(m_record_picture, 0, wxALIGN_CENTER, 0);
- sizer->AddSpacer(FromDIP(20));
-
- auto optimal_temp_text = new wxStaticText(m_save_panel, wxID_ANY, _L("Optimal Temp"), wxDefaultPosition, wxDefaultSize, 0);
- optimal_temp_text->Wrap(-1);
- optimal_temp_text->SetFont(Label::Head_14);
- sizer->Add(optimal_temp_text, 0, 0, 0);
-
- m_optimal_temp = new TextInput(m_save_panel, wxEmptyString, _L("\u2103"), "", wxDefaultPosition, CALIBRATION_OPTIMAL_INPUT_SIZE, 0);
- m_optimal_temp->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC));
- sizer->Add(m_optimal_temp, 0, 0, 0);
-
- sizer->AddSpacer(FromDIP(20));
-
- auto save_text = new wxStaticText(m_save_panel, wxID_ANY, _L("Save to Filament Preset"), wxDefaultPosition, wxDefaultSize, 0);
- save_text->Wrap(-1);
- save_text->SetFont(Label::Head_14);
- sizer->Add(save_text, 0, 0, 0);
-
- m_save_name_input = new TextInput(m_save_panel, m_save_name, "", "", wxDefaultPosition, { CALIBRATION_TEXT_MAX_LENGTH, FromDIP(24) }, 0);
- sizer->Add(m_save_name_input, 0, 0, 0);
- m_save_name_input->GetTextCtrl()->Bind(wxEVT_TEXT, [this](auto& e) {
- if (!m_save_name_input->GetTextCtrl()->GetValue().IsEmpty())
- m_save_name = m_save_name_input->GetTextCtrl()->GetValue().ToStdString();
- else
- m_save_name = "";
- });
-}
-
-void TemperatureWizard::create_pages()
-{
- // page 0 : start page
- m_page0 = create_start_page();
- m_page0->set_page_title(_L("Temperature Calibration"));
- m_all_pages_sizer->Add(m_page0, 1, wxEXPAND | wxALL, FromDIP(25));
-
- // page 1 : preset page
- m_page1 = create_presets_page(true);
- m_page1->set_page_title(_L("Temperature Calibration"));
-
- m_from_text->SetLabel(_L("From Temp"));
- m_to_text->SetLabel(_L("To Temp"));
- m_step->Enable(false);
-
- m_all_pages_sizer->Add(m_page1, 1, wxEXPAND | wxALL, FromDIP(25));
-
- // page 2 : print page
- m_page2 = create_print_page();
- m_page2->set_page_title(_L("Temperature Calibration"));
-
- m_all_pages_sizer->Add(m_page2, 1, wxEXPAND | wxALL, FromDIP(25));
-
- // page 3 : save page
- m_page3 = create_save_page();
- m_page3->set_page_title(_L("Temperature Calibration"));
- m_all_pages_sizer->Add(m_page3, 1, wxEXPAND | wxALL, FromDIP(25));
-
-
- // link pages
- m_page0->chain(m_page1)->chain(m_page2)->chain(m_page3);
-
- m_first_page = m_page0;
- m_curr_page = m_page0;
- show_page(m_curr_page);
-}
-
-bool TemperatureWizard::start_calibration(std::vector tray_ids)
-{
- Calib_Params params;
- m_from_value->GetTextCtrl()->GetValue().ToDouble(¶ms.start);
- m_to_value->GetTextCtrl()->GetValue().ToDouble(¶ms.end);
- params.mode = CalibMode::Calib_Temp_Tower;
-
- if (params.start < 180 || params.end > 350 || params.end < (params.start + 5) || (params.end - params.start) >= 120) { // todo
- MessageDialog msg_dlg(nullptr, _L("Please input valid values:\nFrom temp: >= 180\nTo temp: <= 350\nFrom temp <= To temp - Step\n From temp - To temp < 120"), wxEmptyString, wxICON_WARNING | wxOK);
- msg_dlg.ShowModal();
- return false;
- }
-
- CalibInfo calib_info;
- calib_info.params = params;
- calib_info.dev_id = curr_obj->dev_id;
- calib_info.select_ams = "[" + std::to_string(tray_ids[0]) + "]";
- calib_info.process_bar = m_send_progress_bar;
- calib_info.bed_type = BedType(m_comboBox_bed_type->GetSelection() + btDefault + 1);
- calib_info.printer_prest = m_printer_preset;
- calib_info.filament_prest = m_filament_presets.begin()->second;
- calib_info.print_prest = m_print_preset;
-
- std::string error_message;
- CalibUtils::calib_temptue(calib_info, error_message);
- if (!error_message.empty()) {
- MessageDialog msg_dlg(nullptr, _L(error_message), wxEmptyString, wxICON_WARNING | wxOK);
- msg_dlg.ShowModal();
- return false;
- }
- show_send_progress_bar(true);
- return true;
-}
-
-bool TemperatureWizard::save_calibration_result()
-{
- if (m_optimal_temp->GetTextCtrl()->GetValue().IsEmpty()) // todo need a valid range
- {
- MessageDialog msg_dlg(nullptr, _L("Input an optiaml temperature."), wxEmptyString, wxICON_WARNING | wxOK);
- msg_dlg.ShowModal();
- return false;
- }
- int temp = stoi(m_optimal_temp->GetTextCtrl()->GetValue().ToStdString());
- if (m_save_name.empty()) {
- MessageDialog msg_dlg(nullptr, _L("Input name of filament preset to save"), wxEmptyString, wxICON_WARNING | wxOK);
- msg_dlg.ShowModal();
- return false;
- }
- std::string message;
- if (!save_presets(m_filament_presets.begin()->second, "nozzle_temperature", new ConfigOptionInts(1, temp), m_save_name, message)) {
- MessageDialog msg_dlg(nullptr, _L(message), wxEmptyString, wxICON_WARNING | wxOK);
- msg_dlg.ShowModal();
- return false;
- }
- return true;
-}
-
-bool TemperatureWizard::recommend_input_value()
-{
- if (!CalibrationWizard::recommend_input_value()) {
- m_from_value->GetTextCtrl()->SetValue(wxEmptyString);
- m_to_value->GetTextCtrl()->SetValue(wxEmptyString);
- m_step->GetTextCtrl()->SetValue(wxEmptyString);
- return false;
- }
- else {
- wxString filament_name = m_filament_presets.begin()->second->alias;
-
- int start, end;
- if (filament_name.Contains("ABS") || filament_name.Contains("ASA")) {//todo supplement
- start = 230;
- end = 270;
+ if (obj) {
+ this->set_cali_method(method);
+ if (obj_cali_mode == m_mode) {
+ if (obj->is_in_printing() || obj->is_printing_finished()) {
+ if (m_curr_step != cali_step) {
+ show_step(cali_step);
+ }
+ }
}
- else if (filament_name.Contains("PETG")) {
- start = 230;
- end = 260;
- }
- else if (filament_name.Contains("TPU")) {
- start = 210;
- end = 240;
- }
- else if (filament_name.Contains("PA-CF")) {
- start = 280;
- end = 320;
- }
- else if (filament_name.Contains("PET-CF")) {
- start = 280;
- end = 320;
- }
- else if (filament_name.Contains("PLA")) {
- start = 190;
- end = 230;
- }
- else {
- start = 190;
- end = 230;
- }
- m_from_value->GetTextCtrl()->SetValue(std::to_string(start));
- m_to_value->GetTextCtrl()->SetValue(std::to_string(end));
- m_step->GetTextCtrl()->SetValue("5");
-
- return true;
}
}
-
-void TemperatureWizard::init_bitmaps()
-{
- m_print_picture->SetBitmap(create_scaled_bitmap("temperature_calibration", nullptr, 400));
- m_record_picture->SetBitmap(create_scaled_bitmap("temperature_record", nullptr, 400));
-}
-
-RetractionWizard::RetractionWizard(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style)
- : CalibrationWizard(parent, CalibMode::Calib_Retraction_tower, id, pos, size, style)
-{
- create_pages();
- init_bitmaps();
-}
-
-void RetractionWizard::set_save_name() {
- if (m_filament_presets.begin()->second) {
- m_save_name = m_filament_presets.begin()->second->alias + "-Calibrated";
- }
- else { m_save_name = ""; }
- m_save_name_input->GetTextCtrl()->SetValue(m_save_name);
-}
-
-
-void RetractionWizard::create_save_panel_content(wxBoxSizer* sizer)
-{
- auto complete_text = new wxStaticText(m_save_panel, wxID_ANY, _L("Please find the best object on your plate"), wxDefaultPosition, wxDefaultSize, 0);
- complete_text->SetFont(::Label::Head_14);
- complete_text->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
- sizer->Add(complete_text, 0, 0, 0);
- sizer->AddSpacer(FromDIP(20));
-
- m_record_picture = new wxStaticBitmap(m_save_panel, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0);
- sizer->Add(m_record_picture, 0, wxALIGN_CENTER, 0);
- sizer->AddSpacer(FromDIP(20));
-
- auto optimal_temp_text = new wxStaticText(m_save_panel, wxID_ANY, _L("Optimal Retraction Length"), wxDefaultPosition, wxDefaultSize, 0);
- optimal_temp_text->Wrap(-1);
- optimal_temp_text->SetFont(Label::Head_14);
- sizer->Add(optimal_temp_text, 0, 0, 0);
-
- m_optimal_retraction = new TextInput(m_save_panel, wxEmptyString, _L("mm"), "", wxDefaultPosition, CALIBRATION_OPTIMAL_INPUT_SIZE, 0);
- m_optimal_retraction->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC));
- sizer->Add(m_optimal_retraction, 0, 0, 0);
-
- sizer->AddSpacer(FromDIP(20));
-
- auto save_text = new wxStaticText(m_save_panel, wxID_ANY, _L("Save to Filament Preset"), wxDefaultPosition, wxDefaultSize, 0);
- save_text->Wrap(-1);
- save_text->SetFont(Label::Head_14);
- sizer->Add(save_text, 0, 0, 0);
-
- m_save_name_input = new TextInput(m_save_panel, m_save_name, "", "", wxDefaultPosition, { CALIBRATION_TEXT_MAX_LENGTH, FromDIP(24) }, 0);
- sizer->Add(m_save_name_input, 0, 0, 0);
- m_save_name_input->GetTextCtrl()->Bind(wxEVT_TEXT, [this](auto& e) {
- if (!m_save_name_input->GetTextCtrl()->GetValue().IsEmpty())
- m_save_name = m_save_name_input->GetTextCtrl()->GetValue().ToStdString();
- else
- m_save_name = "";
- });
-}
-
-CalibrationWizardPage* RetractionWizard::create_start_page()
-{
- auto page = new CalibrationWizardPage(m_scrolledWindow);
- page->set_page_type(PageType::Start);
- page->set_highlight_step_text(PageType::Start);
- auto page_content_sizer = page->get_content_vsizer();
-
- auto when_title = new wxStaticText(page, wxID_ANY, _L("When you need Temperature Calibration"));
- when_title->SetFont(Label::Head_14);
- when_title->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
- page_content_sizer->Add(when_title);
- auto when_text1 = new wxStaticText(page, wxID_ANY, _L("Model stringing"));
- when_text1->SetFont(Label::Body_14);
- when_text1->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
- page_content_sizer->Add(when_text1);
- auto when_text2 = new wxStaticText(page, wxID_ANY, _L("Layer adhesion problem"));
- when_text2->SetFont(Label::Body_14);
- when_text2->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
- page_content_sizer->Add(when_text2);
- auto when_text3 = new wxStaticText(page, wxID_ANY, _L("Warping(overhang)"));
- when_text3->SetFont(Label::Body_14);
- when_text3->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
- page_content_sizer->Add(when_text3);
- auto when_text4 = new wxStaticText(page, wxID_ANY, _L("Bridging"));
- when_text4->SetFont(Label::Body_14);
- when_text4->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
- page_content_sizer->Add(when_text4);
-
- auto bitmap_sizer = new wxBoxSizer(wxHORIZONTAL);
- auto bitmap1 = new wxStaticBitmap(page, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0);
- bitmap1->SetMinSize(wxSize(560, 450));
- bitmap1->SetBackgroundColour(*wxBLACK);
- bitmap_sizer->Add(bitmap1, 0, wxALL, 0);
- bitmap_sizer->AddSpacer(FromDIP(20));
- auto bitmap2 = new wxStaticBitmap(page, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0);
- bitmap2->SetMinSize(wxSize(560, 450));
- bitmap2->SetBackgroundColour(*wxBLACK);
- bitmap_sizer->Add(bitmap2, 0, wxALL, 0);
- page_content_sizer->Add(bitmap_sizer, 0, wxALL, 0);
-
- page_content_sizer->AddSpacer(PRESET_GAP);
-
- auto wiki = new wxStaticText(page, wxID_ANY, _L("Wiki"));
- wiki->SetFont(Label::Head_14);
- wiki->SetForegroundColour({ 0, 88, 220 });
- wiki->Bind(wxEVT_ENTER_WINDOW, [this, wiki](wxMouseEvent& e) {
- e.Skip();
- SetCursor(wxCURSOR_HAND);
- });
- wiki->Bind(wxEVT_LEAVE_WINDOW, [this, wiki](wxMouseEvent& e) {
- e.Skip();
- SetCursor(wxCURSOR_ARROW);
- });
- wiki->Bind(wxEVT_LEFT_UP, [this](wxMouseEvent& e) {
- if (!m_wiki_url.empty()) wxLaunchDefaultBrowser(m_wiki_url);
- });
- page_content_sizer->Add(wiki, 0);
-
-
- page->get_prev_btn()->Hide();
-
- auto page_next_btn = page->get_next_btn();
- page_next_btn->SetLabel(_L("Start"));
- page_next_btn->SetButtonType(ButtonType::Start);
-
- return page;
-}
-
-void RetractionWizard::create_pages()
-{
- // page 1 : preset page
- m_page1 = create_presets_page(true);
- m_page1->set_page_title(_L("Retraction Calibration"));
-
- m_from_text->SetLabel(_L("From Retraction Length"));
- m_to_text->SetLabel(_L("To Retraction Length"));
- m_from_value->SetLabel(_L("mm"));
- m_to_value->SetLabel(_L("mm"));
- m_step->SetLabel(_L("mm"));
- auto step_str = wxString::Format("%1.1f", 0.1f);
- m_step->GetTextCtrl()->SetValue(step_str);
-
- m_all_pages_sizer->Add(m_page1, 1, wxEXPAND | wxALL, FromDIP(25));
-
- // page 2 : print page
- m_page2 = create_print_page();
- m_page2->set_page_title(_L("Retraction Calibration"));
-
- m_all_pages_sizer->Add(m_page2, 1, wxEXPAND | wxALL, FromDIP(25));
-
- // page 3 : save page
- m_page3 = create_save_page();
- m_page3->set_page_title(_L("Retraction Calibration"));
- m_all_pages_sizer->Add(m_page3, 1, wxEXPAND | wxALL, FromDIP(25));
-
-
- // link pages
- m_page1->chain(m_page2)->chain(m_page3);
-
- m_first_page = m_page1;
- m_curr_page = m_page1;
- show_page(m_curr_page);
-}
-
-bool RetractionWizard::start_calibration(std::vector tray_ids)
-{
- Calib_Params params;
- m_from_value->GetTextCtrl()->GetValue().ToDouble(¶ms.start);
- m_to_value->GetTextCtrl()->GetValue().ToDouble(¶ms.end);
- params.mode = CalibMode::Calib_Retraction_tower;
-
- // todo limit
- //if (params.start < 180 || params.end > 350 || params.end < (params.start + 5) || (params.end - params.start) >= 120) { // todo
- // MessageDialog msg_dlg(nullptr, _L("Please input valid values:\nFrom temp: >= 180\nTo temp: <= 350\nFrom temp <= To temp - Step\n From temp - To temp < 120"), wxEmptyString, wxICON_WARNING | wxOK);
- // msg_dlg.ShowModal();
- // return false;
- //}
-
- CalibInfo calib_info;
- calib_info.params = params;
- calib_info.dev_id = curr_obj->dev_id;
- calib_info.select_ams = "[" + std::to_string(tray_ids[0]) + "]";
- calib_info.process_bar = m_send_progress_bar;
- calib_info.bed_type = BedType(m_comboBox_bed_type->GetSelection() + btDefault + 1);
- calib_info.printer_prest = m_printer_preset;
- calib_info.filament_prest = m_filament_presets.begin()->second;
- calib_info.print_prest = m_print_preset;
-
- std::string error_message;
- CalibUtils::calib_retraction(calib_info, error_message);
- if (!error_message.empty()) {
- MessageDialog msg_dlg(nullptr, _L(error_message), wxEmptyString, wxICON_WARNING | wxOK);
- msg_dlg.ShowModal();
- return false;
- }
- show_send_progress_bar(true);
- return true;
-}
-
-bool RetractionWizard::save_calibration_result()
-{
- if (m_optimal_retraction->GetTextCtrl()->GetValue().IsEmpty()) // todo need a valid range
- {
- MessageDialog msg_dlg(nullptr, _L("Input an optiaml retraction length."), wxEmptyString, wxICON_WARNING | wxOK);
- msg_dlg.ShowModal();
- return false;
- }
- float length = stof(m_optimal_retraction->GetTextCtrl()->GetValue().ToStdString());
- if (m_save_name.empty()) {
- MessageDialog msg_dlg(nullptr, _L("Input name of filament preset to save"), wxEmptyString, wxICON_WARNING | wxOK);
- msg_dlg.ShowModal();
- return false;
- }
- std::string message;
- if (!save_presets(m_filament_presets.begin()->second, "retraction_length", new ConfigOptionFloats{ length }, m_save_name, message)) {
- MessageDialog msg_dlg(nullptr, _L(message), wxEmptyString, wxICON_WARNING | wxOK);
- msg_dlg.ShowModal();
- return false;
- }
- return true;
-}
-
-bool RetractionWizard::recommend_input_value()
-{
- if (!CalibrationWizard::recommend_input_value()) {
- m_from_value->GetTextCtrl()->SetValue(wxEmptyString);
- m_to_value->GetTextCtrl()->SetValue(wxEmptyString);
- m_step->GetTextCtrl()->SetValue(wxEmptyString);
- return false;
- }
- else {
- m_from_value->GetTextCtrl()->SetValue("0");
- m_to_value->GetTextCtrl()->SetValue("2");
- auto step_str = wxString::Format("%1.1f", 0.1f);
- m_step->GetTextCtrl()->SetValue(step_str);
- return true;
- }
-}
-
-void RetractionWizard::init_bitmaps()
-{
- m_print_picture->SetBitmap(create_scaled_bitmap("temperature_calibration", nullptr, 400));
- m_record_picture->SetBitmap(create_scaled_bitmap("temperature_record", nullptr, 400));
-}
-
-}}
\ No newline at end of file
+}}
diff --git a/src/slic3r/GUI/CalibrationWizard.hpp b/src/slic3r/GUI/CalibrationWizard.hpp
index 943beac387..a9ab9f9e8d 100644
--- a/src/slic3r/GUI/CalibrationWizard.hpp
+++ b/src/slic3r/GUI/CalibrationWizard.hpp
@@ -1,445 +1,165 @@
#ifndef slic3r_GUI_CalibrationWizard_hpp_
#define slic3r_GUI_CalibrationWizard_hpp_
+#include "../slic3r/Utils/CalibUtils.hpp"
+
#include "DeviceManager.hpp"
#include "CalibrationWizardPage.hpp"
-#include "Widgets/ComboBox.hpp"
-#include "Widgets/TextInput.hpp"
-#include "Widgets/AMSControl.hpp"
-#include "Widgets/ProgressBar.hpp"
-#include "SavePresetDialog.hpp"
-#include "PresetComboBoxes.hpp"
-#include "EditCalibrationHistoryDialog.hpp"
-#include "../slic3r/Utils/CalibUtils.hpp"
+#include "CalibrationWizardStartPage.hpp"
+#include "CalibrationWizardPresetPage.hpp"
+#include "CalibrationWizardCaliPage.hpp"
+#include "CalibrationWizardSavePage.hpp"
namespace Slic3r { namespace GUI {
-wxDECLARE_EVENT(EVT_CALIBRATION_TRAY_SELECTION_CHANGED, SimpleEvent);
-wxDECLARE_EVENT(EVT_CALIBRATION_NOTIFY_CHANGE_PAGES, SimpleEvent);
-wxDECLARE_EVENT(EVT_CALIBRATION_TAB_CHANGED, wxCommandEvent);
-enum FilamentSelectMode {
- FSMCheckBoxMode,
- FSMRadioMode
-};
-
-
-wxString get_calibration_wiki_page(CalibMode cali_mode);
-
-class FilamentComboBox : public wxPanel
+class CalibrationWizardPageStep
{
public:
- FilamentComboBox(wxWindow* parent, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize);
- ~FilamentComboBox() {};
-
- void set_select_mode(FilamentSelectMode mode);
- FilamentSelectMode get_select_mode() { return m_mode; }
- void load_tray_from_ams(int id, DynamicPrintConfig& tray);
- void update_from_preset();
- int get_tray_id() { return m_tray_id; }
- bool is_bbl_filament() { return m_is_bbl_filamnet; }
- std::string get_tray_name() { return m_tray_name; }
- CalibrateFilamentComboBox* GetComboBox() { return m_comboBox; }
- CheckBox* GetCheckBox() { return m_checkBox; }
- void SetCheckBox(CheckBox* cb) { m_checkBox = cb; }
- wxRadioButton* GetRadioBox() { return m_radioBox; }
- void SetRadioBox(wxRadioButton* btn) { m_radioBox = btn; }
- virtual bool Show(bool show = true);
- virtual bool Enable(bool enable);
- virtual void SetValue(bool value, bool send_event = true);
-
-protected:
- int m_tray_id;
- std::string m_tray_name;
- bool m_is_bbl_filamnet{ false };
-
- CheckBox* m_checkBox{nullptr};
- //RadioBox* m_radioBox;
- wxRadioButton* m_radioBox{ nullptr };
- CalibrateFilamentComboBox* m_comboBox{ nullptr };
- FilamentSelectMode m_mode{ FSMRadioMode };
+ CalibrationWizardPageStep(CalibrationWizardPage* data) {
+ page = data;
+ }
+
+ CalibrationWizardPageStep* prev { nullptr };
+ CalibrationWizardPageStep* next { nullptr };
+ CalibrationWizardPage* page { nullptr };
+ void chain(CalibrationWizardPageStep* step) {
+ if (!step) return;
+ this->next = step;
+ step->prev = this;
+ }
};
-typedef std::vector FilamentComboBoxList;
-
class CalibrationWizard : public wxPanel {
public:
- CalibrationWizard(wxWindow* parent, CalibMode mode, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTAB_TRAVERSAL);
- ~CalibrationWizard() {};
- CalibrationWizardPage* get_curr_page() { return m_curr_page; }
- CalibrationWizardPage* get_frist_page() { return m_first_page; }
- void show_page(CalibrationWizardPage* page);
- void update_print_error_info(int code, std::string msg, std::string extra);
- void show_send_progress_bar(bool show);
- void update_printer();
- void update_print_progress();
+ CalibrationWizard(wxWindow* parent, CalibMode mode,
+ wxWindowID id = wxID_ANY,
+ const wxPoint& pos = wxDefaultPosition,
+ const wxSize& size = wxDefaultSize,
+ long style = wxTAB_TRAVERSAL);
+
+ ~CalibrationWizard();
+
+ void on_cali_job_finished(wxCommandEvent& event);
+
+ virtual void on_cali_job_finished() {}
+
+ CalibrationWizardPageStep* get_curr_step() { return m_curr_step; }
+
+ void show_step(CalibrationWizardPageStep* step);
+
+ virtual void update(MachineObject* obj);
+
+ virtual void on_device_connected(MachineObject* obj);
+
+ virtual void set_cali_style(CalibrationStyle style) {
+ m_cali_style = style;
+ }
+
+ virtual void set_cali_method(CalibrationMethod method);
+
CalibMode get_calibration_mode() { return m_mode; }
-protected:
- virtual CalibrationWizardPage* create_start_page() { return nullptr; }
- virtual CalibrationWizardPage* create_presets_page(bool need_custom_range);
- virtual CalibrationWizardPage* create_print_page();
- virtual CalibrationWizardPage* create_save_page();
- virtual void create_save_panel_content(wxBoxSizer* sizer) {}
- virtual void create_pages() = 0;
- virtual bool start_calibration(std::vector tray_ids) = 0;
- virtual bool save_calibration_result() = 0;
- virtual bool recommend_input_value();
- virtual void set_save_name() {};
- virtual void request_calib_result() {};
- virtual void jump_to_page(PageType page_type);
- virtual void change_ams_select_mode() {};
- virtual void init_bitmaps();
- virtual void check_sync_printer_status() {};
-
-private:
- ScalableBitmap m_bitmap_pause;
- ScalableBitmap m_bitmap_pause_hover;
- ScalableBitmap m_bitmap_resume;
- ScalableBitmap m_bitmap_resume_hover;
- ScalableBitmap m_bitmap_pause_disable;
- ScalableBitmap m_bitmap_resume_disable;
- ScalableBitmap m_bitmap_abort;
- ScalableBitmap m_bitmap_abort_hover;
- ScalableBitmap m_bitmap_abort_disable;
+ bool save_preset(const std::string &old_preset_name, const std::string &new_preset_name, const std::map &key_values, std::string& message);
protected:
- wxString m_wiki_url;
-
- std::map m_printer_calib_infos;
- bool is_between_start_and_runing = false;
- CalibMode m_mode;
- MachineObject* curr_obj{ nullptr };
+ void on_cali_go_home();
+protected:
+ /* wx widgets*/
wxScrolledWindow* m_scrolledWindow;
wxBoxSizer* m_all_pages_sizer;
- CalibrationWizardPage* m_curr_page{ nullptr };
- CalibrationWizardPage* m_first_page{ nullptr };
+ CalibMode m_mode;
+ CalibrationStyle m_cali_style;
+ CalibrationMethod m_cali_method { CalibrationMethod::CALI_METHOD_MANUAL };
+ MachineObject* curr_obj { nullptr };
+ MachineObject* last_obj { nullptr };
- // preset panel
- wxPanel* m_presets_panel;
- wxPanel* m_select_ams_mode_panel;
- //RadioBox* m_ams_radiobox;
- //RadioBox* m_ext_spool_radiobox;
- wxRadioButton* m_ams_radiobox;
- wxRadioButton* m_ext_spool_radiobox;
- bool m_filament_from_ext_spool{ false };
- wxPanel* m_muilti_ams_panel;
- std::vector m_ams_item_list;
- wxPanel* m_filament_list_panel;
- ScalableButton* m_ams_sync_button;
- FilamentComboBoxList m_filament_comboBox_list;
- wxPanel* m_virtual_panel;
- FilamentComboBox* m_virtual_tray_comboBox;
- ComboBox* m_comboBox_nozzle_dia;
- ComboBox* m_comboBox_bed_type;
- ComboBox* m_comboBox_process;
- Preset* m_printer_preset{nullptr};
- //Preset* m_filament_preset{ nullptr };
- std::map m_filament_presets;
- Preset* m_print_preset{ nullptr };
- wxStaticText* m_from_text;
- wxStaticText* m_to_text;
- wxStaticText* m_step_text;
- TextInput* m_from_value;
- TextInput* m_to_value;
- TextInput* m_step;
- TextInput* m_nozzle_temp;
- TextInput* m_bed_temp;
- TextInput* m_max_volumetric_speed;
- wxStaticText* m_filaments_incompatible_tips;
- wxStaticText* m_bed_type_incompatible_tips;
- wxPanel* m_send_progress_panel;
- // send bar
- std::shared_ptr m_send_progress_bar;
- wxScrolledWindow* m_sw_print_failed_info{ nullptr };
- int m_print_error_code;
- std::string m_print_error_msg;
- std::string m_print_error_extra;
- Label* m_st_txt_error_code{ nullptr };
- Label* m_st_txt_error_desc{ nullptr };
- Label* m_st_txt_extra_info{ nullptr };
+ CalibrationWizardPageStep* m_curr_step { nullptr };
- // print panel
- wxPanel* m_print_panel;
- wxStaticBitmap* m_print_picture;
- wxStaticText* m_staticText_profile_value;
- wxStaticText* m_printing_stage_value;
- wxStaticText* m_staticText_progress_percent;
- wxStaticText* m_staticText_progress_left_time;
- wxStaticText* m_staticText_layers;
- ScalableButton* m_button_pause_resume;
- ScalableButton* m_button_abort;
- ProgressBar* m_print_gauge_progress; // for print
- PageButton* m_btn_recali;
- PageButton* m_btn_next;
+ CalibrationWizardPageStep* start_step { nullptr };
+ CalibrationWizardPageStep* preset_step { nullptr };
+ CalibrationWizardPageStep* cali_step { nullptr };
+ CalibrationWizardPageStep* save_step { nullptr };
+
+ CalibrationWizardPageStep* cali_coarse_step { nullptr };
+ CalibrationWizardPageStep* coarse_save_step { nullptr };
+ CalibrationWizardPageStep* cali_fine_step { nullptr };
+ CalibrationWizardPageStep* fine_save_step { nullptr };
- // save panel
- wxPanel* m_save_panel;
+ /* save steps of calibration pages */
+ std::vector m_page_steps;
- void init_printer_calib_info_from_appconfig();
- void save_to_printer_calib_info(PageType page_type);
-
- // preset
- void init_presets_selections();
- void init_nozzle_selections();
- void init_bed_type_selections();
- void init_process_selections();
- void check_has_ams(MachineObject * obj);
- int get_bed_temp(DynamicPrintConfig* config);
- FilamentSelectMode get_ams_select_mode() { if (!m_filament_comboBox_list.empty()) return m_filament_comboBox_list[0]->get_select_mode(); return FilamentSelectMode::FSMRadioMode; }
- void set_ams_select_mode(FilamentSelectMode mode);
- std::vector get_selected_tray();
- void set_selected_tray(const std::vector& tray_ids);
- FilamentComboBoxList get_selected_filament_comboBox();
- void show_send_failed_info(bool show, int code = 0, wxString description = wxEmptyString, wxString extra = wxEmptyString);
- void reset_preset_page();
-
- // print
- void reset_printing_values();
-
- // save
- bool save_presets(Preset* preset, const std::string& config_key, ConfigOption* config_value, const std::string& name, std::string& message);
-
- // event handlers
- void on_select_nozzle(wxCommandEvent& evt);
- void on_select_tray(SimpleEvent& evt);
- void on_select_bed_type(wxCommandEvent& evt);
- void on_click_btn_prev(IntEvent& event);
- void on_click_btn_next(IntEvent& event);
- void on_subtask_abort(wxCommandEvent& event);
- void on_subtask_pause_resume(wxCommandEvent& event);
- void on_choose_ams(wxCommandEvent& event);
- void on_choose_ext_spool(wxCommandEvent& event);
- void on_update_ams_filament(bool dialog = true);
- void on_switch_ams(std::string ams_id);
+ SecondaryCheckDialog *go_home_dialog = nullptr;
};
-class HistoryWindow : public DPIDialog {
-public:
- HistoryWindow(wxWindow* parent);
- ~HistoryWindow() {};
- void on_dpi_changed(const wxRect& suggested_rect) {}
- void create();
-
- wxPanel* m_history_data_panel;
-};
-
-class PressureAdvanceWizard : public CalibrationWizard{
+class PressureAdvanceWizard : public CalibrationWizard {
public:
PressureAdvanceWizard(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTAB_TRAVERSAL);
~PressureAdvanceWizard() {};
protected:
- virtual CalibrationWizardPage* create_start_page() override;
- void create_history_window();
- virtual void create_pages() override;
- virtual void create_save_panel_content(wxBoxSizer* sizer) override;
- virtual bool start_calibration(std::vector tray_ids) override;
- virtual bool save_calibration_result() override;
- virtual bool recommend_input_value() override;
- virtual void request_calib_result() override;
- virtual void change_ams_select_mode() override;
- virtual void init_bitmaps() override;
- virtual void check_sync_printer_status() override;
+ void create_pages();
- void sync_history_window_data();
- void sync_save_page_data();
- void switch_pages(SimpleEvent& evt);
-private:
- // history page
- HistoryWindow* m_history_page{ nullptr };
+ void on_cali_start();
- // start page
- CalibrationWizardPage* m_page0{ nullptr };
+ void on_cali_save();
- // preset page
- CalibrationWizardPage* m_page1{ nullptr };
+ void on_cali_action(wxCommandEvent& evt);
- // print page
- CalibrationWizardPage* m_page2{ nullptr };
+ void update(MachineObject* obj) override;
- // save page
- CalibrationWizardPage* m_page3{ nullptr };
- wxStaticBitmap* m_record_picture;
- wxPanel* m_low_end_save_panel;
- TextInput* m_k_val;
- TextInput* m_n_val;
+ void on_device_connected(MachineObject* obj) override;
- wxPanel* m_high_end_save_panel;
- std::vector m_calib_results;
std::vector m_calib_results_history;
- wxPanel* m_grid_panel;
-
- bool is_first_time_get_result = true;
- bool has_get_result = false;
-
- int m_cali_version = -1;
};
class FlowRateWizard : public CalibrationWizard {
public:
FlowRateWizard(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTAB_TRAVERSAL);
~FlowRateWizard() {};
- void reset_reuse_panels();
+
+ void set_cali_method(CalibrationMethod method) override;
+
+ void on_cali_job_finished() override;
+
protected:
- virtual CalibrationWizardPage* create_start_page() override;
- void create_low_end_pages();
- void create_high_end_pages();
- virtual void create_pages() override;
- virtual void create_save_panel_content(wxBoxSizer* sizer) override;
- virtual bool start_calibration(std::vector tray_ids) override;
- virtual bool save_calibration_result() override;
- virtual bool recommend_input_value() override;
- virtual void set_save_name() override;
- virtual void request_calib_result() override;
- virtual void change_ams_select_mode() override;
- virtual void init_bitmaps() override;
+ void create_pages();
- void sync_save_page_data();
- void switch_pages(SimpleEvent& evt);
-private:
- // start page
- CalibrationWizardPage* m_page0{ nullptr };
+ void on_cali_action(wxCommandEvent& evt);
- // preset page
- CalibrationWizardPage* m_page1{ nullptr };
- wxPanel* m_choose_step_panel;
- wxRadioButton* m_complete_radioBox;
- wxRadioButton* m_fine_radioBox;
+ void on_cali_start(CaliPresetStage stage = CaliPresetStage::CALI_MANULA_STAGE_NONE, float cali_value = 0.0f);
- // print page
- CalibrationWizardPage* m_page2{ nullptr };
+ void on_cali_save();
- // page 3
- CalibrationWizardPage* m_low_end_page3{ nullptr };
- wxStaticBitmap* m_low_record_picture1;
- ComboBox* m_optimal_block_coarse;
- wxStaticText* m_coarse_calc_result_text;
- float m_coarse_calc_result;
- CheckBox* m_checkBox_skip_calibration;
- TextInput* m_save_name_input1;
+ void update(MachineObject* obj) override;
- CalibrationWizardPage* m_high_end_page3{ nullptr };
- std::vector m_calib_results;
- wxPanel* m_grid_panel;
- std::map m_high_end_save_names;
-
- // page 4
- CalibrationWizardPage* m_low_end_page4{ nullptr };
- wxStaticBitmap* m_low_print_picture2;
-
- // save page
- CalibrationWizardPage* m_low_end_page5{ nullptr };
- wxStaticBitmap* m_low_record_picture2;
- ComboBox* m_optimal_block_fine;
- wxStaticText* m_fine_calc_result_text;
- float m_fine_calc_result;
- TextInput* m_save_name_input2;
- std::string m_save_name;
- bool is_first_time_get_result = true;
- bool has_get_result = false;
-
- void reset_print_panel_to_page(CalibrationWizardPage* page, wxBoxSizer* sizer);
- void reset_send_progress_to_page(CalibrationWizardPage* page, wxBoxSizer* sizer);
- void on_fine_tune(wxCommandEvent&);
+ void on_device_connected(MachineObject* obj) override;
};
class MaxVolumetricSpeedWizard : public CalibrationWizard {
public:
MaxVolumetricSpeedWizard(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTAB_TRAVERSAL);
~MaxVolumetricSpeedWizard() {};
+
+ void on_cali_job_finished() override;
+
protected:
- virtual CalibrationWizardPage* create_start_page() override;
- virtual void create_pages() override;
- virtual void create_save_panel_content(wxBoxSizer* sizer) override;
- virtual bool start_calibration(std::vector tray_ids) override;
- virtual bool save_calibration_result() override;
- virtual bool recommend_input_value() override;
- virtual void set_save_name() override;
- virtual void init_bitmaps() override;
-private:
- // start page
- CalibrationWizardPage* m_page0;
+ void create_pages();
- // preset page
- CalibrationWizardPage* m_page1;
+ void on_cali_action(wxCommandEvent& evt);
- // print page
- CalibrationWizardPage* m_page2;
+ void on_cali_start();
- // save page
- CalibrationWizardPage* m_page3;
- wxStaticBitmap* m_record_picture;
- TextInput* m_optimal_max_speed;
- wxStaticText* m_calc_result_text;
- float m_calc_result;
- TextInput* m_save_name_input;
- std::string m_save_name;
+ void on_cali_save();
+
+ void on_device_connected(MachineObject *obj) override;
};
-class TemperatureWizard : public CalibrationWizard {
-public:
- TemperatureWizard(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTAB_TRAVERSAL);
- ~TemperatureWizard() {};
-protected:
- virtual CalibrationWizardPage* create_start_page() override;
- virtual void create_pages() override;
- virtual void create_save_panel_content(wxBoxSizer* sizer) override;
- virtual bool start_calibration(std::vector tray_ids) override;
- virtual bool save_calibration_result() override;
- virtual bool recommend_input_value() override;
- virtual void set_save_name() override;
- virtual void init_bitmaps() override;
-private:
- // start page
- CalibrationWizardPage* m_page0;
-
- // preset page
- CalibrationWizardPage* m_page1;
-
- // print page
- CalibrationWizardPage* m_page2;
-
- // save page
- CalibrationWizardPage* m_page3;
- wxStaticBitmap* m_record_picture;
- TextInput* m_optimal_temp;
- TextInput* m_save_name_input;
- std::string m_save_name;
-};
-
-class RetractionWizard : public CalibrationWizard {
-public:
- RetractionWizard(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTAB_TRAVERSAL);
- ~RetractionWizard() {};
-protected:
- virtual CalibrationWizardPage* create_start_page() override;
- virtual void create_pages() override;
- virtual void create_save_panel_content(wxBoxSizer* sizer) override;
- virtual bool start_calibration(std::vector tray_ids) override;
- virtual bool save_calibration_result() override;
- virtual bool recommend_input_value() override;
- virtual void set_save_name() override;
- virtual void init_bitmaps() override;
-private:
- // start page
- CalibrationWizardPage* m_page0;
-
- // preset page
- CalibrationWizardPage* m_page1;
-
- // print page
- CalibrationWizardPage* m_page2;
-
- // save page
- CalibrationWizardPage* m_page3;
- wxStaticBitmap* m_record_picture;
- TextInput* m_optimal_retraction;
- TextInput* m_save_name_input;
- std::string m_save_name;
-};
+// save printer_type in command event
+wxDECLARE_EVENT(EVT_DEVICE_CHANGED, wxCommandEvent);
+wxDECLARE_EVENT(EVT_CALIBRATION_JOB_FINISHED, wxCommandEvent);
}} // namespace Slic3r::GUI
-#endif
\ No newline at end of file
+#endif
diff --git a/src/slic3r/GUI/CalibrationWizardCaliPage.cpp b/src/slic3r/GUI/CalibrationWizardCaliPage.cpp
new file mode 100644
index 0000000000..eb0031693c
--- /dev/null
+++ b/src/slic3r/GUI/CalibrationWizardCaliPage.cpp
@@ -0,0 +1,404 @@
+#include "CalibrationWizardCaliPage.hpp"
+#include "I18N.hpp"
+#include "Widgets/Label.hpp"
+
+namespace Slic3r { namespace GUI {
+
+static const wxString NA_STR = _L("N/A");
+
+
+CalibrationCaliPage::CalibrationCaliPage(wxWindow* parent, CalibMode cali_mode, CaliPageType cali_type,
+ wxWindowID id, const wxPoint& pos, const wxSize& size, long style)
+ : CalibrationWizardPage(parent, id, pos, size, style)
+{
+ m_cali_mode = cali_mode;
+
+ m_page_type = cali_type;
+
+ m_top_sizer = new wxBoxSizer(wxVERTICAL);
+
+ create_page(this);
+
+ this->SetSizer(m_top_sizer);
+ m_top_sizer->Fit(this);
+}
+
+CalibrationCaliPage::~CalibrationCaliPage()
+{
+ m_printing_panel->get_pause_resume_button()->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(CalibrationCaliPage::on_subtask_pause_resume), NULL, this);
+ m_printing_panel->get_abort_button()->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(CalibrationCaliPage::on_subtask_abort), NULL, this);
+}
+
+void CalibrationCaliPage::create_page(wxWindow* parent)
+{
+ m_page_caption = new CaliPageCaption(parent, m_cali_mode);
+ m_page_caption->show_prev_btn(true);
+ m_top_sizer->Add(m_page_caption, 0, wxEXPAND, 0);
+
+ wxArrayString steps;
+ steps.Add(_L("Preset"));
+ steps.Add(_L("Calibration"));
+ steps.Add(_L("Record"));
+ m_step_panel = new CaliPageStepGuide(parent, steps);
+ m_step_panel->set_steps(1);
+ m_top_sizer->Add(m_step_panel, 0, wxEXPAND, 0);
+
+ m_printing_picture = new wxStaticBitmap(parent, wxID_ANY, wxNullBitmap);
+ m_top_sizer->Add(m_printing_picture, 0, wxALIGN_CENTER, 0);
+ m_top_sizer->AddSpacer(FromDIP(20));
+
+ set_cali_img();
+
+ m_printing_panel = new PrintingTaskPanel(parent, PrintingTaskType::CALIBRATION);
+ m_printing_panel->SetDoubleBuffered(true);
+ m_printing_panel->SetSize({ CALIBRATION_PROGRESSBAR_LENGTH, -1 });
+ m_printing_panel->SetMinSize({ CALIBRATION_PROGRESSBAR_LENGTH, -1 });
+ m_printing_panel->enable_pause_resume_button(false, "resume_disable");
+ m_printing_panel->enable_abort_button(false);
+
+ m_top_sizer->Add(m_printing_panel, 0, wxALIGN_CENTER, 0);
+ m_action_panel = new CaliPageActionPanel(parent, m_cali_mode, CaliPageType::CALI_PAGE_CALI);
+ m_top_sizer->Add(m_action_panel, 0, wxEXPAND, 0);
+
+ m_printing_panel->get_pause_resume_button()->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(CalibrationCaliPage::on_subtask_pause_resume), NULL, this);
+ m_printing_panel->get_abort_button()->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(CalibrationCaliPage::on_subtask_abort), NULL, this);
+
+ Layout();
+}
+
+void CalibrationCaliPage::on_subtask_pause_resume(wxCommandEvent& event)
+{
+ DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager();
+ if (!dev) return;
+ MachineObject* obj = dev->get_selected_machine();
+ if (!obj) return;
+
+ if (obj->can_resume())
+ obj->command_task_resume();
+ else
+ obj->command_task_pause();
+}
+
+void CalibrationCaliPage::on_subtask_abort(wxCommandEvent& event)
+{
+ DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager();
+ if (!dev) return;
+ MachineObject* obj = dev->get_selected_machine();
+ if (!obj) return;
+
+ if (abort_dlg == nullptr) {
+ abort_dlg = new SecondaryCheckDialog(this->GetParent(), wxID_ANY, _L("Cancel print"));
+ abort_dlg->Bind(EVT_SECONDARY_CHECK_CONFIRM, [this, obj](wxCommandEvent& e) {
+ if (obj) obj->command_task_abort();
+ });
+ }
+ abort_dlg->update_text(_L("Are you sure you want to cancel this print?"));
+ abort_dlg->on_show();
+}
+
+
+void CalibrationCaliPage::set_cali_img()
+{
+ if (m_cali_mode == CalibMode::Calib_PA_Line) {
+ m_printing_picture->SetBitmap(create_scaled_bitmap("extrusion_calibration_tips_en", nullptr, 400));
+ }
+ else if (m_cali_mode == CalibMode::Calib_Flow_Rate) {
+ if (m_page_type == CaliPageType::CALI_PAGE_CALI)
+ m_printing_picture->SetBitmap(create_scaled_bitmap("flow_rate_calibration", nullptr, 400));
+ if (m_page_type == CaliPageType::CALI_PAGE_FINE_CALI)
+ m_printing_picture->SetBitmap(create_scaled_bitmap("flow_rate_calibration_fine", nullptr, 400));
+ else
+ m_printing_picture->SetBitmap(create_scaled_bitmap("flow_rate_calibration", nullptr, 400));
+ }
+ else if (m_cali_mode == CalibMode::Calib_Vol_speed_Tower) {
+ m_printing_picture->SetBitmap(create_scaled_bitmap("max_volumetric_speed_calibration", nullptr, 400));
+ }
+}
+
+void CalibrationCaliPage::update(MachineObject* obj)
+{
+ static int get_result_count = 0;
+ // enable calibration when finished
+ bool enable_cali = false;
+ if (obj) {
+ if (m_cali_mode == CalibMode::Calib_PA_Line) {
+ if (m_cali_method == CalibrationMethod::CALI_METHOD_AUTO) {
+ if (obj->get_pa_calib_result) {
+ enable_cali = true;
+ } else {
+ if (get_obj_calibration_mode(obj) == m_cali_mode && obj->is_printing_finished()) {
+ // use selected diameter, add a counter to timeout, add a warning tips when get result failed
+ CalibUtils::emit_get_PA_calib_results(get_selected_calibration_nozzle_dia(obj));
+ BOOST_LOG_TRIVIAL(trace) << "CalibUtils::emit_get_PA_calib_results, auto count = " << get_result_count++;
+ } else {
+ ;
+ }
+ }
+ } else if (m_cali_method == CalibrationMethod::CALI_METHOD_MANUAL) {
+ if (get_obj_calibration_mode(obj) == m_cali_mode && obj->is_printing_finished()) {
+ enable_cali = true;
+ } else {
+ enable_cali = false;
+ }
+ } else {
+ assert(false);
+ }
+ m_action_panel->enable_button(CaliPageActionType::CALI_ACTION_CALI_NEXT, enable_cali);
+ } else if (m_cali_mode == CalibMode::Calib_Flow_Rate) {
+ if (m_cali_method == CalibrationMethod::CALI_METHOD_AUTO) {
+ if (obj->get_flow_calib_result) {
+ enable_cali = true;
+ } else {
+ if (get_obj_calibration_mode(obj) == m_cali_mode && obj->is_printing_finished()) {
+ // use selected diameter, add a counter to timeout, add a warning tips when get result failed
+ CalibUtils::emit_get_flow_ratio_calib_results(get_selected_calibration_nozzle_dia(obj));
+ } else {
+ ;
+ }
+ }
+ } else if (m_cali_method == CalibrationMethod::CALI_METHOD_MANUAL) {
+ if (get_obj_calibration_mode(obj) == m_cali_mode && obj->is_printing_finished()) {
+ // use selected diameter, add a counter to timeout, add a warning tips when get result failed
+ CalibUtils::emit_get_flow_ratio_calib_results(get_selected_calibration_nozzle_dia(obj));
+ enable_cali = true;
+ }
+ else {
+ enable_cali = false;
+ }
+ } else {
+ assert(false);
+ }
+ m_action_panel->enable_button(CaliPageActionType::CALI_ACTION_NEXT, enable_cali);
+ }
+ else if (m_cali_mode == CalibMode::Calib_Vol_speed_Tower) {
+ if (get_obj_calibration_mode(obj) == m_cali_mode && obj->is_printing_finished()) {
+ enable_cali = true;
+ } else {
+ ;
+ }
+ }
+ else {
+ assert(false);
+ }
+ m_action_panel->enable_button(CaliPageActionType::CALI_ACTION_NEXT, enable_cali);
+ }
+
+ // only display calibration printing status
+ if (get_obj_calibration_mode(obj) == m_cali_mode) {
+ update_subtask(obj);
+ } else {
+ update_subtask(nullptr);
+ }
+}
+
+void CalibrationCaliPage::update_subtask(MachineObject* obj)
+{
+ if (!obj) return;
+
+ if (obj->is_support_layer_num) {
+ m_printing_panel->update_layers_num(true);
+ }
+ else {
+ m_printing_panel->update_layers_num(false);
+ }
+
+ if (obj->is_system_printing()
+ || obj->is_in_calibration()) {
+ reset_printing_values();
+ }
+ else if (obj->is_in_printing() || obj->print_status == "FINISH") {
+ if (obj->is_in_prepare() || obj->print_status == "SLICING") {
+ m_printing_panel->get_market_scoring_button()->Hide();
+ m_printing_panel->enable_abort_button(false);
+ m_printing_panel->enable_pause_resume_button(false, "pause_disable");
+ wxString prepare_text;
+ bool show_percent = true;
+
+ if (obj->is_in_prepare()) {
+ prepare_text = wxString::Format(_L("Downloading..."));
+ }
+ else if (obj->print_status == "SLICING") {
+ if (obj->queue_number <= 0) {
+ prepare_text = wxString::Format(_L("Cloud Slicing..."));
+ }
+ else {
+ prepare_text = wxString::Format(_L("In Cloud Slicing Queue, there are %s tasks ahead."), std::to_string(obj->queue_number));
+ show_percent = false;
+ }
+ }
+ else
+ prepare_text = wxString::Format(_L("Downloading..."));
+
+ if (obj->gcode_file_prepare_percent >= 0 && obj->gcode_file_prepare_percent <= 100 && show_percent)
+ prepare_text += wxString::Format("(%d%%)", obj->gcode_file_prepare_percent);
+
+ m_printing_panel->update_stage_value(prepare_text, 0);
+ m_printing_panel->update_progress_percent(NA_STR, wxEmptyString);
+ m_printing_panel->update_left_time(NA_STR);
+ m_printing_panel->update_layers_num(true, wxString::Format(_L("Layer: %s"), NA_STR));
+ m_printing_panel->update_subtask_name(wxString::Format("%s", GUI::from_u8(obj->subtask_name)));
+
+
+ if (obj->get_modeltask() && obj->get_modeltask()->design_id > 0) {
+ m_printing_panel->show_profile_info(true, wxString::FromUTF8(obj->get_modeltask()->profile_name));
+ }
+ else {
+ m_printing_panel->show_profile_info(false);
+ }
+
+ update_basic_print_data(false, obj->slice_info->weight, obj->slice_info->prediction);
+ }
+ else {
+ if (obj->can_resume()) {
+ m_printing_panel->enable_pause_resume_button(true, "resume");
+
+ }
+ else {
+ m_printing_panel->enable_pause_resume_button(true, "pause");
+ }
+ if (obj->print_status == "FINISH") {
+
+ m_printing_panel->enable_abort_button(false);
+ m_printing_panel->enable_pause_resume_button(false, "resume_disable");
+
+ bool is_market_task = obj->get_modeltask() && obj->get_modeltask()->design_id > 0;
+ if (is_market_task) {
+ m_printing_panel->get_market_scoring_button()->Show();
+ BOOST_LOG_TRIVIAL(info) << "SHOW_SCORE_BTU: design_id [" << obj->get_modeltask()->design_id << "] print_finish [" << m_print_finish << "]";
+ if (!m_print_finish && IsShownOnScreen()) {
+ m_print_finish = true;
+ }
+ }
+ else {
+ m_printing_panel->get_market_scoring_button()->Hide();
+ }
+ }
+ else {
+ m_printing_panel->enable_abort_button(true);
+ m_printing_panel->get_market_scoring_button()->Hide();
+ if (m_print_finish) {
+ m_print_finish = false;
+ }
+ }
+ // update printing stage
+
+ m_printing_panel->update_left_time(obj->mc_left_time);
+ if (obj->subtask_) {
+ m_printing_panel->update_stage_value(obj->get_curr_stage(), obj->subtask_->task_progress);
+ m_printing_panel->update_progress_percent(wxString::Format("%d", obj->subtask_->task_progress), "%");
+ m_printing_panel->update_layers_num(true, wxString::Format(_L("Layer: %d/%d"), obj->curr_layer, obj->total_layers));
+
+ }
+ else {
+ m_printing_panel->update_stage_value(obj->get_curr_stage(), 0);
+ m_printing_panel->update_progress_percent(NA_STR, wxEmptyString);
+ m_printing_panel->update_layers_num(true, wxString::Format(_L("Layer: %s"), NA_STR));
+ }
+ }
+
+ m_printing_panel->update_subtask_name(wxString::Format("%s", GUI::from_u8(obj->subtask_name)));
+
+ if (obj->get_modeltask() && obj->get_modeltask()->design_id > 0) {
+ m_printing_panel->show_profile_info(wxString::FromUTF8(obj->get_modeltask()->profile_name));
+ }
+ else {
+ m_printing_panel->show_profile_info(false);
+ }
+
+ }
+ else {
+ reset_printing_values();
+ }
+
+ this->Layout();
+}
+
+void CalibrationCaliPage::update_basic_print_data(bool def, float weight, int prediction)
+{
+ if (def) {
+ wxString str_prediction = wxString::Format("%s", get_bbl_time_dhms(prediction));
+ wxString str_weight = wxString::Format("%.2fg", weight);
+
+ m_printing_panel->show_priting_use_info(true, str_prediction, str_weight);
+ }
+ else {
+ m_printing_panel->show_priting_use_info(false, "0m", "0g");
+ }
+}
+
+void CalibrationCaliPage::reset_printing_values()
+{
+ m_printing_panel->enable_pause_resume_button(false, "pause_disable");
+ m_printing_panel->enable_abort_button(false);
+ m_printing_panel->reset_printing_value();
+ m_printing_panel->update_subtask_name(NA_STR);
+ m_printing_panel->show_profile_info(false);
+ m_printing_panel->update_stage_value(wxEmptyString, 0);
+ m_printing_panel->update_progress_percent(NA_STR, wxEmptyString);
+ m_printing_panel->get_market_scoring_button()->Hide();
+ m_printing_panel->update_left_time(NA_STR);
+ m_printing_panel->update_layers_num(true, wxString::Format(_L("Layer: %s"), NA_STR));
+ update_basic_print_data(false);
+ this->Layout();
+}
+
+void CalibrationCaliPage::on_device_connected(MachineObject* obj)
+{
+ ;
+}
+
+void CalibrationCaliPage::set_cali_method(CalibrationMethod method)
+{
+ m_cali_method = method;
+
+ wxArrayString auto_steps;
+ auto_steps.Add(_L("Preset"));
+ auto_steps.Add(_L("Calibration"));
+ auto_steps.Add(_L("Record"));
+
+ wxArrayString manual_steps;
+ manual_steps.Add(_L("Preset"));
+ manual_steps.Add(_L("Calibration1"));
+ manual_steps.Add(_L("Calibration2"));
+ manual_steps.Add(_L("Record"));
+
+ if (method == CalibrationMethod::CALI_METHOD_AUTO) {
+ m_step_panel->set_steps_string(auto_steps);
+ m_step_panel->set_steps(1);
+ }
+ else if (method == CalibrationMethod::CALI_METHOD_MANUAL) {
+ if (m_cali_mode == CalibMode::Calib_PA_Line) {
+ m_step_panel->set_steps_string(auto_steps);
+ m_step_panel->set_steps(1);
+ } else {
+ m_step_panel->set_steps_string(manual_steps);
+ if (m_page_type == CaliPageType::CALI_PAGE_CALI)
+ m_step_panel->set_steps(1);
+ else if (m_page_type == CaliPageType::CALI_PAGE_FINE_CALI) {
+ m_step_panel->set_steps(2);
+ }
+ else {
+ m_step_panel->set_steps(1);
+ }
+ }
+ }
+ else {
+ assert(false);
+ }
+}
+
+float CalibrationCaliPage::get_selected_calibration_nozzle_dia(MachineObject* obj)
+{
+ // return selected if this is set
+ if (obj->cali_selected_nozzle_dia > 1e-3 && obj->cali_selected_nozzle_dia < 10.0f)
+ return obj->cali_selected_nozzle_dia;
+
+ // return default nozzle if nozzle diameter is set
+ if (obj->nozzle_diameter > 1e-3 && obj->nozzle_diameter < 10.0f)
+ return obj->nozzle_diameter;
+
+ // return 0.4 by default
+ return 0.4;
+}
+
+}}
\ No newline at end of file
diff --git a/src/slic3r/GUI/CalibrationWizardCaliPage.hpp b/src/slic3r/GUI/CalibrationWizardCaliPage.hpp
new file mode 100644
index 0000000000..d7cf211352
--- /dev/null
+++ b/src/slic3r/GUI/CalibrationWizardCaliPage.hpp
@@ -0,0 +1,46 @@
+#ifndef slic3r_GUI_CalibrationWizardCaliPage_hpp_
+#define slic3r_GUI_CalibrationWizardCaliPage_hpp_
+
+#include "CalibrationWizardPage.hpp"
+#include "StatusPanel.hpp"
+
+namespace Slic3r { namespace GUI {
+
+class CalibrationCaliPage : public CalibrationWizardPage
+{
+public:
+ CalibrationCaliPage(wxWindow* parent,
+ CalibMode cali_mode,
+ CaliPageType cali_type = CaliPageType::CALI_PAGE_CALI,
+ wxWindowID id = wxID_ANY,
+ const wxPoint& pos = wxDefaultPosition,
+ const wxSize& size = wxDefaultSize,
+ long style = wxTAB_TRAVERSAL);
+ ~CalibrationCaliPage();
+
+ void create_page(wxWindow* parent);
+ void on_subtask_pause_resume(wxCommandEvent& event);
+ void on_subtask_abort(wxCommandEvent& event);
+ void set_cali_img();
+ void update(MachineObject* obj) override;
+ void update_subtask(MachineObject* obj);
+ void update_basic_print_data(bool def, float weight = 0.0, int prediction = 0);
+ void reset_printing_values();
+ void on_device_connected(MachineObject* obj) override;
+
+ void set_cali_method(CalibrationMethod method) override;
+
+protected:
+ float get_selected_calibration_nozzle_dia(MachineObject* obj);
+
+ bool m_print_finish {false};
+ wxBoxSizer* m_top_sizer;
+ CaliPageStepGuide* m_step_panel { nullptr };
+ PrintingTaskPanel* m_printing_panel { nullptr };
+ wxStaticBitmap* m_printing_picture;
+ SecondaryCheckDialog* abort_dlg { nullptr };
+};
+
+}} // namespace Slic3r::GUI
+
+#endif
\ No newline at end of file
diff --git a/src/slic3r/GUI/CalibrationWizardPage.cpp b/src/slic3r/GUI/CalibrationWizardPage.cpp
index dd80b52073..d5cf2c9013 100644
--- a/src/slic3r/GUI/CalibrationWizardPage.cpp
+++ b/src/slic3r/GUI/CalibrationWizardPage.cpp
@@ -1,14 +1,124 @@
#include "CalibrationWizardPage.hpp"
#include "I18N.hpp"
#include "Widgets/Label.hpp"
+#include "MsgDialog.hpp"
namespace Slic3r { namespace GUI {
-wxDEFINE_EVENT(EVT_CALIBRATIONPAGE_PREV, IntEvent);
-wxDEFINE_EVENT(EVT_CALIBRATIONPAGE_NEXT, IntEvent);
+wxDEFINE_EVENT(EVT_CALI_ACTION, wxCommandEvent);
+wxDEFINE_EVENT(EVT_CALI_TRAY_CHANGED, wxCommandEvent);
-PageButton::PageButton(wxWindow* parent, wxString text, ButtonType type)
- : m_type(type),
+
+CalibrationStyle get_cali_style(MachineObject* obj)
+{
+ if (!obj) return CalibrationStyle::CALI_STYLE_DEFAULT;
+
+ if (obj->printer_type == "BL-P001" || obj->printer_type == "BL-P002")
+ return CalibrationStyle::CALI_STYLE_X1;
+ else if (obj->printer_type == "C11" || obj->printer_type == "C12")
+ return CalibrationStyle::CALI_STYLE_P1P;
+
+ return CalibrationStyle::CALI_STYLE_DEFAULT;
+}
+
+wxString get_cali_mode_caption_string(CalibMode mode)
+{
+ if (mode == CalibMode::Calib_PA_Line)
+ return _L("Pressure Advance Calibration");
+ if (mode == CalibMode::Calib_Flow_Rate)
+ return _L("Flow Rate Calibration");
+ if (mode == CalibMode::Calib_Vol_speed_Tower)
+ return _L("Max Volumetric Speed");
+ return "no cali_mode_caption";
+}
+
+wxString get_calibration_wiki_page(CalibMode cali_mode)
+{
+ switch (cali_mode) {
+ case CalibMode::Calib_PA_Line:
+ return wxString("https://wiki.bambulab.com/en/software/bambu-studio/calibration_pa");
+ case CalibMode::Calib_Flow_Rate:
+ return wxString("https://wiki.bambulab.com/en/software/bambu-studio/calibration_flow_rate");
+ case CalibMode::Calib_Vol_speed_Tower:
+ return wxString("https://wiki.bambulab.com/en/software/bambu-studio/calibration_volumetric");
+ case CalibMode::Calib_Temp_Tower:
+ return wxString("https://wiki.bambulab.com/en/software/bambu-studio/calibration_temperature");
+ case CalibMode::Calib_Retraction_tower:
+ return wxString("https://wiki.bambulab.com/en/software/bambu-studio/calibration_retraction");
+ default:
+ return "";
+ }
+}
+
+CalibrationFilamentMode get_cali_filament_mode(MachineObject* obj, CalibMode mode)
+{
+ // default
+ if (!obj) return CalibrationFilamentMode::CALI_MODEL_SINGLE;
+
+
+ if (mode == CalibMode::Calib_PA_Line) {
+ if (obj->printer_type == "BL-P001" || obj->printer_type == "BL-P002")
+ return CalibrationFilamentMode::CALI_MODEL_MULITI;
+ else if (obj->printer_type == "C11" || obj->printer_type == "C12")
+ return CalibrationFilamentMode::CALI_MODEL_SINGLE;
+ }
+ else if (mode == CalibMode::Calib_Flow_Rate) {
+ if (obj->printer_type == "BL-P001" || obj->printer_type == "BL-P002")
+ return CalibrationFilamentMode::CALI_MODEL_SINGLE;
+ else if (obj->printer_type == "C11" || obj->printer_type == "C12")
+ return CalibrationFilamentMode::CALI_MODEL_SINGLE;
+ }
+
+ return CalibrationFilamentMode::CALI_MODEL_SINGLE;
+}
+
+CalibMode get_obj_calibration_mode(const MachineObject* obj)
+{
+ CalibrationMethod method;
+ int cali_stage;
+ return get_obj_calibration_mode(obj, method, cali_stage);
+}
+
+CalibMode get_obj_calibration_mode(const MachineObject* obj, int& cali_stage)
+{
+ CalibrationMethod method;
+ return get_obj_calibration_mode(obj, method, cali_stage);
+}
+
+CalibMode get_obj_calibration_mode(const MachineObject* obj, CalibrationMethod& method, int& cali_stage)
+{
+ method = CalibrationMethod::CALI_METHOD_MANUAL;
+
+ if (!obj) return CalibMode::Calib_None;
+
+ if (boost::contains(obj->m_gcode_file, "auto_filament_cali")) {
+ method = CalibrationMethod::CALI_METHOD_AUTO;
+ return CalibMode::Calib_PA_Line;
+ }
+ if (boost::contains(obj->m_gcode_file, "user_cali_manual_pa")) {
+ method = CalibrationMethod::CALI_METHOD_MANUAL;
+ return CalibMode::Calib_PA_Line;
+ }
+ if (boost::contains(obj->m_gcode_file, "extrusion_cali")) {
+ method == CalibrationMethod::CALI_METHOD_MANUAL;
+ return CalibMode::Calib_PA_Line;
+ }
+
+ if (boost::contains(obj->m_gcode_file, "abs_flowcalib_cali")) {
+ method = CalibrationMethod::CALI_METHOD_AUTO;
+ return CalibMode::Calib_Flow_Rate;
+ }
+
+ CalibMode cali_mode = CalibUtils::get_calib_mode_by_name(obj->subtask_name, cali_stage);
+ if (cali_mode != CalibMode::Calib_None) {
+ method = CalibrationMethod::CALI_METHOD_MANUAL;
+ }
+ return cali_mode;
+}
+
+
+CaliPageButton::CaliPageButton(wxWindow* parent, CaliPageActionType type, wxString text)
+ : m_action_type(type),
Button(parent, text)
{
StateColor btn_bg_green(std::pair(wxColour(206, 206, 206), StateColor::Disabled),
@@ -33,18 +143,77 @@ PageButton::PageButton(wxWindow* parent, wxString text, ButtonType type)
StateColor btn_text_white(std::pair(wxColour(255, 255, 254), StateColor::Disabled),
std::pair(wxColour(38, 46, 48), StateColor::Enabled));
- switch (m_type)
+ switch (m_action_type)
{
- case Slic3r::GUI::Back:
- case Slic3r::GUI::Recalibrate:
+ case CaliPageActionType::CALI_ACTION_MANAGE_RESULT:
+ this->SetLabel(_L("Manage Result"));
+ break;
+ case CaliPageActionType::CALI_ACTION_MANUAL_CALI:
+ this->SetLabel(_L("Maual Calibration"));
+ this->SetToolTip(_L("Result can be read by human eyes."));
+ break;
+ case CaliPageActionType::CALI_ACTION_AUTO_CALI:
+ this->SetLabel(_L("Auto-Calibration"));
+ this->SetToolTip(_L("We would use Lidar to read the calibration result"));
+ break;
+ case CaliPageActionType::CALI_ACTION_START:
+ this->SetLabel(_L("Start Calibration"));
+ break;
+ case CaliPageActionType::CALI_ACTION_PREV:
+ this->SetLabel(_L("Prev"));
+ break;
+ case CaliPageActionType::CALI_ACTION_RECALI:
+ this->SetLabel(_L("Recalibration"));
+ break;
+ case CaliPageActionType::CALI_ACTION_NEXT:
+ this->SetLabel(_L("Next"));
+ break;
+ case CaliPageActionType::CALI_ACTION_CALI_NEXT:
+ this->SetLabel(_L("Next"));
+ break;
+ case CaliPageActionType::CALI_ACTION_CALI:
+ this->SetLabel(_L("Calibrate"));
+ break;
+ case CaliPageActionType::CALI_ACTION_FLOW_CALI_STAGE_2:
+ this->SetLabel(_L("Calibrate"));
+ break;
+ case CaliPageActionType::CALI_ACTION_PA_SAVE:
+ this->SetLabel(_L("Finish"));
+ break;
+ case CaliPageActionType::CALI_ACTION_FLOW_SAVE:
+ this->SetLabel(_L("Finish"));
+ break;
+ case CaliPageActionType::CALI_ACTION_FLOW_COARSE_SAVE:
+ this->SetLabel(_L("Finish"));
+ break;
+ case CaliPageActionType::CALI_ACTION_FLOW_FINE_SAVE:
+ this->SetLabel(_L("Finish"));
+ break;
+ case CaliPageActionType::CALI_ACTION_COMMON_SAVE:
+ this->SetLabel(_L("Finish"));
+ break;
+ default:
+ this->SetLabel("Unknown");
+ break;
+ }
+
+ switch (m_action_type)
+ {
+ case CaliPageActionType::CALI_ACTION_PREV:
+ case CaliPageActionType::CALI_ACTION_RECALI:
SetBackgroundColor(btn_bg_white);
SetBorderColor(btn_bd_white);
SetTextColor(btn_text_white);
break;
- case Slic3r::GUI::Start:
- case Slic3r::GUI::Next:
- case Slic3r::GUI::Calibrate:
- case Slic3r::GUI::Save:
+ case CaliPageActionType::CALI_ACTION_START:
+ case CaliPageActionType::CALI_ACTION_NEXT:
+ case CaliPageActionType::CALI_ACTION_CALI:
+ case CaliPageActionType::CALI_ACTION_FLOW_CALI_STAGE_2:
+ case CaliPageActionType::CALI_ACTION_PA_SAVE:
+ case CaliPageActionType::CALI_ACTION_FLOW_SAVE:
+ case CaliPageActionType::CALI_ACTION_FLOW_COARSE_SAVE:
+ case CaliPageActionType::CALI_ACTION_FLOW_FINE_SAVE:
+ case CaliPageActionType::CALI_ACTION_COMMON_SAVE:
SetBackgroundColor(btn_bg_green);
SetBorderColor(btn_bd_green);
SetTextColor(btn_text_green);
@@ -59,102 +228,358 @@ PageButton::PageButton(wxWindow* parent, wxString text, ButtonType type)
SetCornerRadius(FromDIP(12));
}
-CalibrationWizardPage::CalibrationWizardPage(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style)
+
+FilamentComboBox::FilamentComboBox(wxWindow* parent, const wxPoint& pos, const wxSize& size)
+ : wxPanel(parent, wxID_ANY, pos, size, wxTAB_TRAVERSAL)
+{
+ wxBoxSizer* main_sizer = new wxBoxSizer(wxHORIZONTAL);
+
+ m_comboBox = new CalibrateFilamentComboBox(this);
+ m_comboBox->SetSize(CALIBRATION_FILAMENT_COMBOX_SIZE);
+ m_comboBox->SetMinSize(CALIBRATION_FILAMENT_COMBOX_SIZE);
+ main_sizer->Add(m_comboBox->clr_picker, 0, wxALIGN_CENTER | wxRIGHT, FromDIP(8));
+ main_sizer->Add(m_comboBox, 0, wxALIGN_CENTER);
+
+ this->SetSizer(main_sizer);
+ this->Layout();
+ main_sizer->Fit(this);
+}
+
+void FilamentComboBox::set_select_mode(CalibrationFilamentMode mode)
+{
+ m_mode = mode;
+ if (m_checkBox)
+ m_checkBox->Show(m_mode == CalibrationFilamentMode::CALI_MODEL_MULITI);
+ if (m_radioBox)
+ m_radioBox->Show(m_mode == CalibrationFilamentMode::CALI_MODEL_SINGLE);
+
+ Layout();
+}
+
+void FilamentComboBox::load_tray_from_ams(int id, DynamicPrintConfig& tray)
+{
+ m_comboBox->load_tray(tray);
+
+ m_tray_id = id;
+ m_tray_name = m_comboBox->get_tray_name();
+ m_is_bbl_filamnet = MachineObject::is_bbl_filament(m_comboBox->get_tag_uid());
+ Enable(m_comboBox->is_tray_exist());
+
+ if (m_comboBox->is_tray_exist()) {
+ if (!m_comboBox->is_compatible_with_printer()) {
+ SetValue(false);
+ }
+ }
+}
+
+void FilamentComboBox::update_from_preset() { m_comboBox->update(); }
+
+bool FilamentComboBox::Show(bool show)
+{
+ return wxPanel::Show(show);
+}
+
+bool FilamentComboBox::Enable(bool enable) {
+ if (!enable)
+ SetValue(false);
+
+ if (m_radioBox)
+ m_radioBox->Enable(enable);
+ if (m_checkBox)
+ m_checkBox->Enable(enable);
+ return wxPanel::Enable(enable);
+}
+
+void FilamentComboBox::SetValue(bool value, bool send_event) {
+ if (m_radioBox) {
+ if (value == m_radioBox->GetValue()) {
+ if (m_checkBox) {
+ if (value == m_checkBox->GetValue())
+ return;
+ }
+ else {
+ return;
+ }
+ }
+ }
+ if (m_radioBox)
+ m_radioBox->SetValue(value);
+ if (m_checkBox)
+ m_checkBox->SetValue(value);
+}
+
+
+
+CaliPageCaption::CaliPageCaption(wxWindow* parent, CalibMode cali_mode,
+ wxWindowID id, const wxPoint& pos, const wxSize& size, long style)
: wxPanel(parent, id, pos, size, style)
{
- SetBackgroundColour(*wxWHITE);
+ init_bitmaps();
- wxBoxSizer* page_sizer;
- page_sizer = new wxBoxSizer(wxVERTICAL);
+ auto top_sizer = new wxBoxSizer(wxVERTICAL);
+ auto caption_sizer = new wxBoxSizer(wxHORIZONTAL);
+ m_prev_btn = new ScalableButton(this, wxID_ANY, "cali_page_caption_prev",
+ wxEmptyString, wxDefaultSize, wxDefaultPosition, wxBU_EXACTFIT | wxNO_BORDER, true, 30);
+ m_prev_btn->SetBackgroundColour(*wxWHITE);
+ caption_sizer->Add(m_prev_btn, 0, wxALIGN_CENTER | wxRIGHT, FromDIP(10));
- wxBoxSizer* title_sizer;
- title_sizer = new wxBoxSizer(wxHORIZONTAL);
+ wxString title = get_cali_mode_caption_string(cali_mode);
+ wxStaticText* title_text = new wxStaticText(this, wxID_ANY, title, wxDefaultPosition, wxDefaultSize, 0);
+ title_text->Wrap(-1);
+ title_text->SetFont(Label::Head_16);
+ caption_sizer->Add(title_text, 0, wxALIGN_CENTER | wxRIGHT, FromDIP(10));
- m_title = new wxStaticText(this, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, 0);
- m_title->Wrap(-1);
- m_title->SetFont(Label::Head_16);
- title_sizer->Add(m_title, 0, wxALL | wxEXPAND, 0);
+ m_help_btn = new ScalableButton(this, wxID_ANY, "cali_page_caption_help",
+ wxEmptyString, wxDefaultSize, wxDefaultPosition, wxBU_EXACTFIT | wxNO_BORDER, true, 30);
+ m_help_btn->SetBackgroundColour(*wxWHITE);
+ caption_sizer->Add(m_help_btn, 0, wxALIGN_CENTER);
- title_sizer->AddStretchSpacer();
+ top_sizer->Add(caption_sizer, 1, wxEXPAND);
+ top_sizer->AddSpacer(FromDIP(35));
+ this->SetSizer(top_sizer);
+ top_sizer->Fit(this);
- page_sizer->Add(title_sizer, 0, wxEXPAND, 0);
+ // hover effect
+ m_prev_btn->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) {
+ m_prev_btn->SetBitmap(m_prev_bmp_hover.bmp());
+ });
- page_sizer->AddSpacer(FromDIP(20));
+ m_prev_btn->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) {
+ m_prev_btn->SetBitmap(m_prev_bmp_normal.bmp());
+ });
- m_top_sizer = new wxBoxSizer(wxHORIZONTAL);
- m_top_sizer->AddStretchSpacer();
- m_preset_text = new wxStaticText(this, wxID_ANY, _L("Preset"), wxDefaultPosition, wxDefaultSize, 0);
- m_preset_text->SetFont(::Label::Head_14);
- m_top_sizer->Add(m_preset_text, 0, wxALIGN_CENTER | wxLEFT | wxRIGHT, FromDIP(15));
- auto line1 = new wxPanel(this, wxID_ANY, wxDefaultPosition, {FromDIP(200), 1});
- line1->SetBackgroundColour(*wxBLACK);
- m_top_sizer->Add(line1, 1, wxALIGN_CENTER, 0);
- m_calibration_text = new wxStaticText(this, wxID_ANY, _L("Calibration"), wxDefaultPosition, wxDefaultSize, 0);
- m_calibration_text->SetFont(::Label::Head_14);
- m_top_sizer->Add(m_calibration_text, 0, wxALIGN_CENTER | wxLEFT | wxRIGHT, FromDIP(15));
- auto line2 = new wxPanel(this, wxID_ANY, wxDefaultPosition, { FromDIP(200), 1});
- line2->SetBackgroundColour(*wxBLACK);
- m_top_sizer->Add(line2, 1, wxALIGN_CENTER, 0);
- m_record_text = new wxStaticText(this, wxID_ANY, _L("Record"), wxDefaultPosition, wxDefaultSize, 0);
- m_record_text->SetFont(::Label::Head_14);
- m_top_sizer->Add(m_record_text, 0, wxALIGN_CENTER | wxLEFT | wxRIGHT, FromDIP(15));
- m_top_sizer->AddStretchSpacer();
- page_sizer->Add(m_top_sizer, 0, wxEXPAND, 0);
+ // hover effect
+ m_help_btn->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) {
+ m_help_btn->SetBitmap(m_help_bmp_hover.bmp());
+ });
- page_sizer->AddSpacer(FromDIP(40));
+ m_help_btn->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) {
+ m_help_btn->SetBitmap(m_help_bmp_normal.bmp());
+ });
- m_content_sizer = new wxBoxSizer(wxVERTICAL);
-
- page_sizer->Add(m_content_sizer, 0, wxALIGN_CENTER, 0);
-
- page_sizer->AddSpacer(FromDIP(40));
-
- m_btn_sizer = new wxBoxSizer(wxHORIZONTAL);
- m_btn_sizer->AddStretchSpacer();
- m_btn_prev = new PageButton(this, "Back", Back);
- m_btn_sizer->Add(m_btn_prev, 0);
- m_btn_sizer->AddSpacer(FromDIP(10));
- m_btn_next = new PageButton(this, "Next", Next);
- m_btn_sizer->Add(m_btn_next, 0);
- m_btn_sizer->AddStretchSpacer();
-
- page_sizer->Add(m_btn_sizer, 0, wxEXPAND, 0);
-
- this->SetSizer(page_sizer);
- this->Layout();
- page_sizer->Fit(this);
-
- m_btn_prev->Bind(wxEVT_BUTTON, &CalibrationWizardPage::on_click_prev, this);
- m_btn_next->Bind(wxEVT_BUTTON, &CalibrationWizardPage::on_click_next, this);
+ // send event
+ m_prev_btn->Bind(wxEVT_BUTTON, [this](auto& e) {
+ wxCommandEvent event(EVT_CALI_ACTION);
+ event.SetEventObject(m_parent);
+ event.SetInt((int)(CaliPageActionType::CALI_ACTION_GO_HOME));
+ wxPostEvent(m_parent, event);
+ });
}
-void CalibrationWizardPage::set_highlight_step_text(PageType page_type) {
- if (page_type == PageType::Start) {
- m_top_sizer->Clear(true);
- Layout();
- return;
+void CaliPageCaption::init_bitmaps() {
+ m_prev_bmp_normal = ScalableBitmap(this, "cali_page_caption_prev", 30);
+ m_prev_bmp_hover = ScalableBitmap(this, "cali_page_caption_prev_hover", 30);
+ m_help_bmp_normal = ScalableBitmap(this, "cali_page_caption_help", 30);
+ m_help_bmp_hover = ScalableBitmap(this, "cali_page_caption_help_hover", 30);
+}
+
+void CaliPageCaption::show_prev_btn(bool show)
+{
+ m_prev_btn->Show(show);
+}
+
+void CaliPageCaption::show_help_icon(bool show)
+{
+ m_help_btn->Show(show);
+}
+
+CaliPageStepGuide::CaliPageStepGuide(wxWindow* parent, wxArrayString steps,
+ wxWindowID id, const wxPoint& pos, const wxSize& size, long style)
+ : wxPanel(parent, id, pos, size, style),
+ m_steps(steps)
+{
+ auto top_sizer = new wxBoxSizer(wxVERTICAL);
+
+ m_step_sizer = new wxBoxSizer(wxHORIZONTAL);
+ m_step_sizer->AddSpacer(FromDIP(90));
+ for (int i = 0; i < m_steps.size(); i++) {
+ wxStaticText* step_text = new wxStaticText(this, wxID_ANY, m_steps[i]);
+ step_text->SetForegroundColour(wxColour(181, 181, 181));
+ m_text_steps.push_back(step_text);
+ m_step_sizer->Add(step_text, 0, wxALIGN_CENTER | wxLEFT | wxRIGHT, FromDIP(15));
+ if (i != m_steps.size() - 1) {
+ auto line = new wxPanel(this, wxID_ANY, wxDefaultPosition, { FromDIP(200), 1 });
+ line->SetBackgroundColour(*wxBLACK);
+ m_step_sizer->Add(line, 1, wxALIGN_CENTER);
+ }
}
- m_preset_text->SetForegroundColour(wxColour(181, 181, 181));
- m_calibration_text->SetForegroundColour(wxColour(181, 181, 181));
- m_record_text->SetForegroundColour(wxColour(181, 181, 181));
- if(page_type == PageType::Preset)
- m_preset_text->SetForegroundColour(*wxBLACK);
- if (page_type == PageType::Calibration || page_type == PageType::CoarseSave || page_type == PageType::FineCalibration)
- m_calibration_text->SetForegroundColour(*wxBLACK);
- if (page_type == PageType::Save)
- m_record_text->SetForegroundColour(*wxBLACK);
+ m_step_sizer->AddSpacer(FromDIP(90));
+
+ top_sizer->Add(m_step_sizer, 0, wxEXPAND);
+ top_sizer->AddSpacer(FromDIP(30));
+ this->SetSizer(top_sizer);
+ top_sizer->Fit(this);
}
-void CalibrationWizardPage::on_click_prev(wxCommandEvent&)
+void CaliPageStepGuide::set_steps(int index)
{
- IntEvent e(EVT_CALIBRATIONPAGE_PREV, static_cast(m_btn_prev->GetButtonType()), m_parent);
- m_parent->GetEventHandler()->ProcessEvent(e);
+ for (wxStaticText* text_step : m_text_steps) {
+ text_step->SetForegroundColour(wxColour(181, 181, 181));
+ }
+ m_text_steps[index]->SetForegroundColour(*wxBLACK);
}
-void CalibrationWizardPage::on_click_next(wxCommandEvent&)
+void CaliPageStepGuide::set_steps_string(wxArrayString steps)
{
- IntEvent e(EVT_CALIBRATIONPAGE_NEXT, static_cast(m_btn_next->GetButtonType()), m_parent);
- m_parent->GetEventHandler()->ProcessEvent(e);
+ m_steps.Clear();
+ m_text_steps.clear();
+ m_step_sizer->Clear(true);
+ m_steps = steps;
+ m_step_sizer->AddSpacer(FromDIP(90));
+ for (int i = 0; i < m_steps.size(); i++) {
+ wxStaticText* step_text = new wxStaticText(this, wxID_ANY, m_steps[i]);
+ step_text->SetForegroundColour(wxColour(181, 181, 181));
+ m_text_steps.push_back(step_text);
+ m_step_sizer->Add(step_text, 0, wxALIGN_CENTER | wxLEFT | wxRIGHT, FromDIP(15));
+ if (i != m_steps.size() - 1) {
+ auto line = new wxPanel(this, wxID_ANY, wxDefaultPosition, { FromDIP(200), 1 });
+ line->SetBackgroundColour(*wxBLACK);
+ m_step_sizer->Add(line, 1, wxALIGN_CENTER);
+ }
+ }
+ m_step_sizer->AddSpacer(FromDIP(90));
+ Layout();
}
-}}
\ No newline at end of file
+
+CaliPageActionPanel::CaliPageActionPanel(wxWindow* parent,
+ CalibMode cali_mode,
+ CaliPageType page_type,
+ wxWindowID id, const wxPoint& pos, const wxSize& size, long style)
+ : wxPanel(parent, id, pos, size, style)
+{
+ m_parent = parent;
+
+ wxWindow* btn_parent = this;
+
+ if (cali_mode == CalibMode::Calib_PA_Line) {
+ if (page_type == CaliPageType::CALI_PAGE_START) {
+ m_action_btns.push_back(new CaliPageButton(btn_parent, CaliPageActionType::CALI_ACTION_MANAGE_RESULT));
+ m_action_btns.push_back(new CaliPageButton(btn_parent, CaliPageActionType::CALI_ACTION_MANUAL_CALI));
+ m_action_btns.push_back(new CaliPageButton(btn_parent, CaliPageActionType::CALI_ACTION_AUTO_CALI));
+ }
+ else if (page_type == CaliPageType::CALI_PAGE_PRESET) {
+ m_action_btns.push_back(new CaliPageButton(btn_parent, CaliPageActionType::CALI_ACTION_CALI));
+ }
+ else if (page_type == CaliPageType::CALI_PAGE_CALI) {
+ m_action_btns.push_back(new CaliPageButton(btn_parent, CaliPageActionType::CALI_ACTION_CALI_NEXT));
+ }
+ else if (page_type == CaliPageType::CALI_PAGE_PA_SAVE) {
+ m_action_btns.push_back(new CaliPageButton(btn_parent, CaliPageActionType::CALI_ACTION_PA_SAVE));
+ }
+ }
+ else if (cali_mode == CalibMode::Calib_Flow_Rate) {
+ if (page_type == CaliPageType::CALI_PAGE_START) {
+ m_action_btns.push_back(new CaliPageButton(btn_parent, CaliPageActionType::CALI_ACTION_MANUAL_CALI));
+ m_action_btns.push_back(new CaliPageButton(btn_parent, CaliPageActionType::CALI_ACTION_AUTO_CALI));
+ }
+ else if (page_type == CaliPageType::CALI_PAGE_PRESET) {
+ m_action_btns.push_back(new CaliPageButton(btn_parent, CaliPageActionType::CALI_ACTION_CALI));
+ }
+ else if (page_type == CaliPageType::CALI_PAGE_CALI) {
+ m_action_btns.push_back(new CaliPageButton(btn_parent, CaliPageActionType::CALI_ACTION_NEXT));
+ }
+ else if (page_type == CaliPageType::CALI_PAGE_COARSE_SAVE) {
+ m_action_btns.push_back(new CaliPageButton(btn_parent, CaliPageActionType::CALI_ACTION_FLOW_COARSE_SAVE));
+ m_action_btns.push_back(new CaliPageButton(btn_parent, CaliPageActionType::CALI_ACTION_FLOW_CALI_STAGE_2));
+ }
+ else if (page_type == CaliPageType::CALI_PAGE_FINE_SAVE) {
+ m_action_btns.push_back(new CaliPageButton(btn_parent, CaliPageActionType::CALI_ACTION_FLOW_FINE_SAVE));
+ }
+ else if (page_type == CaliPageType::CALI_PAGE_FLOW_SAVE) {
+ m_action_btns.push_back(new CaliPageButton(btn_parent, CaliPageActionType::CALI_ACTION_FLOW_SAVE));
+ }
+ }
+ else {
+ if (page_type == CaliPageType::CALI_PAGE_START) {
+ m_action_btns.push_back(new CaliPageButton(btn_parent, CaliPageActionType::CALI_ACTION_START));
+ }
+ else if (page_type == CaliPageType::CALI_PAGE_PRESET) {
+ m_action_btns.push_back(new CaliPageButton(btn_parent, CaliPageActionType::CALI_ACTION_CALI));
+ }
+ else if (page_type == CaliPageType::CALI_PAGE_CALI) {
+ m_action_btns.push_back(new CaliPageButton(btn_parent, CaliPageActionType::CALI_ACTION_NEXT));
+ }
+ else if (page_type == CaliPageType::CALI_PAGE_COMMON_SAVE) {
+ m_action_btns.push_back(new CaliPageButton(btn_parent, CaliPageActionType::CALI_ACTION_COMMON_SAVE));
+ }
+ else {
+ m_action_btns.push_back(new CaliPageButton(btn_parent, CaliPageActionType::CALI_ACTION_PREV));
+ m_action_btns.push_back(new CaliPageButton(btn_parent, CaliPageActionType::CALI_ACTION_NEXT));
+ }
+
+ }
+
+ auto top_sizer = new wxBoxSizer(wxHORIZONTAL);
+
+ top_sizer->Add(0, 0, 1, wxEXPAND, 5);
+ for (int i = 0; i < m_action_btns.size(); i++) {
+ top_sizer->Add(m_action_btns[i], 0, wxALL, 5);
+
+ m_action_btns[i]->Bind(wxEVT_BUTTON,
+ [this, i](wxCommandEvent& evt) {
+ wxCommandEvent event(EVT_CALI_ACTION);
+ event.SetEventObject(m_parent);
+ event.SetInt((int)m_action_btns[i]->get_action_type());
+ wxPostEvent(m_parent, event);
+ });
+ }
+ top_sizer->Add(0, 0, 1, wxEXPAND, 5);
+
+ this->SetSizer(top_sizer);
+ top_sizer->Fit(this);
+}
+
+void CaliPageActionPanel::bind_button(CaliPageActionType action_type, bool is_block)
+{
+ for (int i = 0; i < m_action_btns.size(); i++) {
+ if (m_action_btns[i]->get_action_type() == action_type) {
+
+ if (is_block) {
+ m_action_btns[i]->Bind(wxEVT_BUTTON,
+ [this](wxCommandEvent& evt) {
+ MessageDialog msg(nullptr, _L("The current firmware version of the printer does not support calibration.\nPlease upgrade the printer firmware."), _L("Calibration not supported"), wxOK | wxICON_WARNING);
+ msg.ShowModal();
+ });
+ }
+ else {
+ m_action_btns[i]->Bind(wxEVT_BUTTON,
+ [this, i](wxCommandEvent& evt) {
+ wxCommandEvent event(EVT_CALI_ACTION);
+ event.SetEventObject(m_parent);
+ event.SetInt((int)m_action_btns[i]->get_action_type());
+ wxPostEvent(m_parent, event);
+ });
+ }
+ }
+ }
+
+}
+
+void CaliPageActionPanel::show_button(CaliPageActionType action_type, bool show)
+{
+ for (int i = 0; i < m_action_btns.size(); i++) {
+ if (m_action_btns[i]->get_action_type() == action_type) {
+ m_action_btns[i]->Show(show);
+ }
+ }
+}
+
+void CaliPageActionPanel::enable_button(CaliPageActionType action_type, bool enable)
+{
+ for (int i = 0; i < m_action_btns.size(); i++) {
+ if (m_action_btns[i]->get_action_type() == action_type) {
+ m_action_btns[i]->Enable(enable);
+ }
+ }
+}
+
+CalibrationWizardPage::CalibrationWizardPage(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style)
+ : wxPanel(parent, id, pos, size, style)
+ , m_parent(parent)
+{
+ SetBackgroundColour(*wxWHITE);
+}
+
+
+}}
diff --git a/src/slic3r/GUI/CalibrationWizardPage.hpp b/src/slic3r/GUI/CalibrationWizardPage.hpp
index 60d9a0166e..99df3ae76c 100644
--- a/src/slic3r/GUI/CalibrationWizardPage.hpp
+++ b/src/slic3r/GUI/CalibrationWizardPage.hpp
@@ -1,45 +1,206 @@
#ifndef slic3r_GUI_CalibrationWizardPage_hpp_
#define slic3r_GUI_CalibrationWizardPage_hpp_
+#include "wx/event.h"
#include "Widgets/Button.hpp"
-#include "Event.hpp"
+#include "Widgets/ComboBox.hpp"
+#include "Widgets/TextInput.hpp"
+#include "Widgets/AMSControl.hpp"
+#include "Widgets/ProgressBar.hpp"
+#include "wxExtensions.hpp"
+#include "PresetComboBoxes.hpp"
+
+#include "../slic3r/Utils/CalibUtils.hpp"
+#include "../../libslic3r/Calib.hpp"
namespace Slic3r { namespace GUI {
-wxDECLARE_EVENT(EVT_CALIBRATIONPAGE_PREV, IntEvent);
-wxDECLARE_EVENT(EVT_CALIBRATIONPAGE_NEXT, IntEvent);
+
+#define PRESET_GAP FromDIP(25)
+#define CALIBRATION_COMBOX_SIZE wxSize(FromDIP(500), FromDIP(24))
+#define CALIBRATION_FILAMENT_COMBOX_SIZE wxSize(FromDIP(250), FromDIP(24))
+#define CALIBRATION_OPTIMAL_INPUT_SIZE wxSize(FromDIP(300), FromDIP(24))
+#define CALIBRATION_FROM_TO_INPUT_SIZE wxSize(FromDIP(160), FromDIP(24))
+#define CALIBRATION_FGSIZER_HGAP FromDIP(50)
+#define CALIBRATION_TEXT_MAX_LENGTH FromDIP(90) + CALIBRATION_FGSIZER_HGAP + 2 * CALIBRATION_FILAMENT_COMBOX_SIZE.x
+#define CALIBRATION_PROGRESSBAR_LENGTH FromDIP(690)
class CalibrationWizard;
-enum ButtonType
+
+enum class CalibrationStyle : int
{
- Start,
- Restart,
- Back,
- Next,
- Calibrate,
- Recalibrate,
- Save,
+ CALI_STYLE_DEFAULT = 0,
+ CALI_STYLE_X1,
+ CALI_STYLE_P1P,
};
-class PageButton : public Button
+CalibrationStyle get_cali_style(MachineObject* obj);
+
+wxString get_cali_mode_caption_string(CalibMode mode);
+
+enum CalibrationFilamentMode {
+ /* calibration single filament at once */
+ CALI_MODEL_SINGLE = 0,
+ /* calibration multi filament at once */
+ CALI_MODEL_MULITI,
+};
+
+enum CalibrationMethod {
+ CALI_METHOD_MANUAL = 0,
+ CALI_METHOD_AUTO,
+ CALI_METHOD_NONE,
+};
+
+wxString get_calibration_wiki_page(CalibMode cali_mode);
+
+CalibrationFilamentMode get_cali_filament_mode(MachineObject* obj, CalibMode mode);
+
+CalibMode get_obj_calibration_mode(const MachineObject* obj);
+
+CalibMode get_obj_calibration_mode(const MachineObject* obj, int& cali_stage);
+
+CalibMode get_obj_calibration_mode(const MachineObject* obj, CalibrationMethod& method, int& cali_stage);
+
+
+enum class CaliPageType {
+ CALI_PAGE_START = 0,
+ CALI_PAGE_PRESET,
+ CALI_PAGE_CALI,
+ CALI_PAGE_COARSE_SAVE,
+ CALI_PAGE_FINE_CALI,
+ CALI_PAGE_FINE_SAVE,
+ CALI_PAGE_PA_SAVE,
+ CALI_PAGE_FLOW_SAVE,
+ CALI_PAGE_COMMON_SAVE,
+};
+
+class FilamentComboBox : public wxPanel
{
public:
- PageButton(wxWindow* parent, wxString text, ButtonType type);
- void SetButtonType(ButtonType rhs_type) { m_type = rhs_type; }
- ButtonType GetButtonType() { return m_type; }
- ~PageButton() {};
-private:
- ButtonType m_type;
+ FilamentComboBox(wxWindow* parent, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize);
+ ~FilamentComboBox() {};
+
+ void set_select_mode(CalibrationFilamentMode mode);
+ CalibrationFilamentMode get_select_mode() { return m_mode; }
+ void load_tray_from_ams(int id, DynamicPrintConfig& tray);
+ void update_from_preset();
+ int get_tray_id() { return m_tray_id; }
+ bool is_bbl_filament() { return m_is_bbl_filamnet; }
+ std::string get_tray_name() { return m_tray_name; }
+ CalibrateFilamentComboBox* GetComboBox() { return m_comboBox; }
+ CheckBox* GetCheckBox() { return m_checkBox; }
+ void SetCheckBox(CheckBox* cb) { m_checkBox = cb; }
+ wxRadioButton* GetRadioBox() { return m_radioBox; }
+ void SetRadioBox(wxRadioButton* btn) { m_radioBox = btn; }
+ virtual bool Show(bool show = true);
+ virtual bool Enable(bool enable);
+ virtual void SetValue(bool value, bool send_event = true);
+
+protected:
+ int m_tray_id { -1 };
+ std::string m_tray_name;
+ bool m_is_bbl_filamnet{ false };
+
+ CheckBox* m_checkBox{ nullptr };
+ wxRadioButton* m_radioBox{ nullptr };
+ CalibrateFilamentComboBox* m_comboBox{ nullptr };
+ CalibrationFilamentMode m_mode { CalibrationFilamentMode::CALI_MODEL_SINGLE };
};
-enum class PageType {
- Start,
- Preset,
- Calibration,
- CoarseSave,
- FineCalibration,
- Save,
- Finish,
+typedef std::vector FilamentComboBoxList;
+
+class CaliPageCaption : public wxPanel
+{
+public:
+ CaliPageCaption(wxWindow* parent,
+ CalibMode cali_mode,
+ wxWindowID id = wxID_ANY,
+ const wxPoint& pos = wxDefaultPosition,
+ const wxSize& size = wxDefaultSize,
+ long style = wxTAB_TRAVERSAL);
+
+ void show_prev_btn(bool show = true);
+ void show_help_icon(bool show = true);
+
+protected:
+ ScalableButton* m_prev_btn;
+ ScalableButton* m_help_btn;
+
+private:
+ void init_bitmaps();
+
+ ScalableBitmap m_prev_bmp_normal;
+ ScalableBitmap m_prev_bmp_hover;
+ ScalableBitmap m_help_bmp_normal;
+ ScalableBitmap m_help_bmp_hover;
+};
+
+class CaliPageStepGuide : public wxPanel
+{
+public:
+ CaliPageStepGuide(wxWindow* parent,
+ wxArrayString steps,
+ wxWindowID id = wxID_ANY,
+ const wxPoint& pos = wxDefaultPosition,
+ const wxSize& size = wxDefaultSize,
+ long style = wxTAB_TRAVERSAL);
+
+ void set_steps(int index);
+ void set_steps_string(wxArrayString steps);
+protected:
+ wxArrayString m_steps;
+ wxBoxSizer* m_step_sizer;
+ std::vector m_text_steps;
+};
+
+enum class CaliPageActionType : int
+{
+ CALI_ACTION_MANAGE_RESULT = 0,
+ CALI_ACTION_MANUAL_CALI,
+ CALI_ACTION_AUTO_CALI,
+ CALI_ACTION_START,
+ CALI_ACTION_CALI,
+ CALI_ACTION_FLOW_CALI_STAGE_2,
+ CALI_ACTION_RECALI,
+ CALI_ACTION_PREV,
+ CALI_ACTION_NEXT,
+ CALI_ACTION_CALI_NEXT,
+ CALI_ACTION_PA_SAVE,
+ CALI_ACTION_FLOW_SAVE,
+ CALI_ACTION_FLOW_COARSE_SAVE,
+ CALI_ACTION_FLOW_FINE_SAVE,
+ CALI_ACTION_COMMON_SAVE,
+ CALI_ACTION_GO_HOME,
+ CALI_ACTION_COUNT
+};
+
+class CaliPageButton : public Button
+{
+public:
+ CaliPageButton(wxWindow* parent, CaliPageActionType type, wxString text = wxEmptyString);
+
+ CaliPageActionType get_action_type() { return m_action_type; }
+private:
+ CaliPageActionType m_action_type;
+};
+
+class CaliPageActionPanel : public wxPanel
+{
+public:
+ CaliPageActionPanel(wxWindow* parent,
+ CalibMode cali_mode,
+ CaliPageType page_type,
+ wxWindowID id = wxID_ANY,
+ const wxPoint& pos = wxDefaultPosition,
+ const wxSize& size = wxDefaultSize,
+ long style = wxTAB_TRAVERSAL);
+
+ void bind_button(CaliPageActionType action_type, bool is_block);
+ void show_button(CaliPageActionType action_type, bool show = true);
+ void enable_button(CaliPageActionType action_type, bool enable = true);
+
+protected:
+ std::vector m_action_btns;
};
class CalibrationWizardPage : public wxPanel
@@ -48,6 +209,8 @@ public:
CalibrationWizardPage(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTAB_TRAVERSAL);
~CalibrationWizardPage() {};
+ CaliPageType get_page_type() { return m_page_type; }
+
CalibrationWizardPage* get_prev_page() { return m_prev_page; }
CalibrationWizardPage* get_next_page() { return m_next_page; }
void set_prev_page(CalibrationWizardPage* prev) { m_prev_page = prev; }
@@ -59,36 +222,43 @@ public:
return next;
}
- wxBoxSizer* get_top_hsizer() { return m_top_sizer; }
- wxBoxSizer* get_content_vsizer() { return m_content_sizer; }
- wxBoxSizer* get_btn_hsizer() { return m_btn_sizer; }
- PageButton* get_prev_btn() { return m_btn_prev; }
- PageButton* get_next_btn() { return m_btn_next; }
- PageType get_page_type() { return m_page_type; }
+ virtual void update(MachineObject* obj) { curr_obj = obj; }
+ /* device changed and connected */
+ virtual void on_device_connected(MachineObject* obj) {}
- void set_page_type(PageType type) { m_page_type = type; }
- void set_page_title(wxString title) { m_title->SetLabel(title); }
- void set_highlight_step_text(PageType page_type);
+ virtual void on_reset_page() {}
+
+ virtual void set_cali_filament_mode(CalibrationFilamentMode mode) {
+ m_cali_filament_mode = mode;
+ }
+
+ virtual void set_cali_method(CalibrationMethod method) {
+ m_cali_method = method;
+ if (method == CalibrationMethod::CALI_METHOD_MANUAL) {
+ set_cali_filament_mode(CalibrationFilamentMode::CALI_MODEL_SINGLE);
+ }
+ }
+
+protected:
+ CalibMode m_cali_mode;
+ CaliPageType m_page_type;
+ CalibrationFilamentMode m_cali_filament_mode;
+ CalibrationMethod m_cali_method{ CalibrationMethod::CALI_METHOD_MANUAL };
+ MachineObject* curr_obj { nullptr };
+
+ wxWindow* m_parent { nullptr };
+ CaliPageCaption* m_page_caption { nullptr };
+ CaliPageActionPanel* m_action_panel { nullptr };
private:
- wxStaticText* m_title;
- wxBoxSizer* m_top_sizer;
- wxStaticText* m_preset_text;
- wxStaticText* m_calibration_text;
- wxStaticText* m_record_text;
- wxBoxSizer* m_content_sizer;
- wxBoxSizer* m_btn_sizer;
- PageButton* m_btn_prev;
- PageButton* m_btn_next;
- PageType m_page_type;
-
- CalibrationWizardPage* m_prev_page{nullptr};
- CalibrationWizardPage* m_next_page{nullptr};
-
- void on_click_prev(wxCommandEvent&);
- void on_click_next(wxCommandEvent&);
+ CalibrationWizardPage* m_prev_page {nullptr};
+ CalibrationWizardPage* m_next_page {nullptr};
};
+wxDECLARE_EVENT(EVT_CALI_ACTION, wxCommandEvent);
+wxDECLARE_EVENT(EVT_CALI_TRAY_CHANGED, wxCommandEvent);
+
+
}} // namespace Slic3r::GUI
#endif
\ No newline at end of file
diff --git a/src/slic3r/GUI/CalibrationWizardPresetPage.cpp b/src/slic3r/GUI/CalibrationWizardPresetPage.cpp
new file mode 100644
index 0000000000..adf40f243e
--- /dev/null
+++ b/src/slic3r/GUI/CalibrationWizardPresetPage.cpp
@@ -0,0 +1,1408 @@
+#include "CalibrationWizardPresetPage.hpp"
+#include "I18N.hpp"
+#include "Widgets/Label.hpp"
+#include "MsgDialog.hpp"
+#include "libslic3r/Print.hpp"
+
+namespace Slic3r { namespace GUI {
+std::string float_to_string(float value, int precision = 2)
+{
+ std::stringstream stream;
+ stream << std::fixed << std::setprecision(precision) << value;
+ return stream.str();
+}
+
+CaliPresetCaliStagePanel::CaliPresetCaliStagePanel(
+ wxWindow* parent,
+ wxWindowID id,
+ const wxPoint& pos,
+ const wxSize& size,
+ long style)
+ : wxPanel(parent, id, pos, size, style)
+{
+ m_top_sizer = new wxBoxSizer(wxVERTICAL);
+
+ create_panel(this);
+
+ this->SetSizer(m_top_sizer);
+ m_top_sizer->Fit(this);
+}
+
+void CaliPresetCaliStagePanel::create_panel(wxWindow* parent)
+{
+ auto title = new wxStaticText(parent, wxID_ANY, _L("Calibration Type"));
+ title->SetFont(Label::Head_14);
+ m_top_sizer->Add(title);
+ m_top_sizer->AddSpacer(FromDIP(15));
+
+ m_complete_radioBox = new wxRadioButton(parent, wxID_ANY, _L("Complete Calibration"));
+ m_complete_radioBox->SetValue(true);
+ m_stage = CALI_MANUAL_STAGE_1;
+ m_top_sizer->Add(m_complete_radioBox);
+ m_top_sizer->AddSpacer(FromDIP(10));
+
+ m_fine_radioBox = new wxRadioButton(parent, wxID_ANY, _L("Fine Calibration based on flow ratio"));
+ m_top_sizer->Add(m_fine_radioBox);
+
+ auto input_panel = new wxPanel(parent);
+ input_panel->Hide();
+ auto input_sizer = new wxBoxSizer(wxHORIZONTAL);
+ input_panel->SetSizer(input_sizer);
+ flow_ratio_input = new TextInput(input_panel, wxEmptyString, "", "", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE);
+ flow_ratio_input->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC));
+ float default_flow_ratio = 1.0f;
+ auto flow_ratio_str = wxString::Format("%.3f", default_flow_ratio);
+ flow_ratio_input->GetTextCtrl()->SetValue(flow_ratio_str);
+ input_sizer->AddSpacer(FromDIP(18));
+ input_sizer->Add(flow_ratio_input, 0, wxTOP, FromDIP(10));
+ m_top_sizer->Add(input_panel);
+
+ m_top_sizer->AddSpacer(PRESET_GAP);
+
+ // events
+ m_complete_radioBox->Bind(wxEVT_RADIOBUTTON, [this, input_panel](auto& e) {
+ input_panel->Show(false);
+ m_stage = CALI_MANUAL_STAGE_1;
+ GetParent()->Layout();
+ });
+ m_fine_radioBox->Bind(wxEVT_RADIOBUTTON, [this, input_panel](auto& e) {
+ input_panel->Show();
+ m_stage = CALI_MANUAL_STAGE_2;
+ GetParent()->Layout();
+ });
+ flow_ratio_input->GetTextCtrl()->Bind(wxEVT_TEXT_ENTER, [this](auto& e) {
+ float flow_ratio = 0.0f;
+ if (!CalibUtils::validate_input_flow_ratio(flow_ratio_input->GetTextCtrl()->GetValue(), &flow_ratio)) {
+ MessageDialog msg_dlg(nullptr, _L("Please input a valid value (0.0 < flow ratio < 0.2)"), wxEmptyString, wxICON_WARNING | wxOK);
+ msg_dlg.ShowModal();
+ }
+ auto flow_ratio_str = wxString::Format("%.3f", flow_ratio);
+ flow_ratio_input->GetTextCtrl()->SetValue(flow_ratio_str);
+ m_flow_ratio_value = flow_ratio;
+ });
+ flow_ratio_input->GetTextCtrl()->Bind(wxEVT_KILL_FOCUS, [this](auto& e) {
+ float flow_ratio = 0.0f;
+ if (!CalibUtils::validate_input_flow_ratio(flow_ratio_input->GetTextCtrl()->GetValue(), &flow_ratio)) {
+ MessageDialog msg_dlg(nullptr, _L("Please input a valid value (0.0 < flow ratio < 0.2)"), wxEmptyString, wxICON_WARNING | wxOK);
+ msg_dlg.ShowModal();
+ }
+ auto flow_ratio_str = wxString::Format("%.3f", flow_ratio);
+ flow_ratio_input->GetTextCtrl()->SetValue(flow_ratio_str);
+ m_flow_ratio_value = flow_ratio;
+ e.Skip();
+ });
+ Bind(wxEVT_LEFT_DOWN, [this](auto& e) {
+ SetFocusIgnoringChildren();
+ });
+}
+
+void CaliPresetCaliStagePanel::set_cali_stage(CaliPresetStage stage, float value)
+{
+ if (stage == CaliPresetStage::CALI_MANUAL_STAGE_1) {
+ wxCommandEvent radioBox_evt(wxEVT_RADIOBUTTON);
+ radioBox_evt.SetEventObject(m_complete_radioBox);
+ wxPostEvent(m_complete_radioBox, radioBox_evt);
+ m_stage = stage;
+ }
+ else if(stage == CaliPresetStage::CALI_MANUAL_STAGE_2){
+ wxCommandEvent radioBox_evt(wxEVT_RADIOBUTTON);
+ radioBox_evt.SetEventObject(m_fine_radioBox);
+ wxPostEvent(m_fine_radioBox, radioBox_evt);
+ m_stage = stage;
+ m_flow_ratio_value = value;
+ }
+}
+
+void CaliPresetCaliStagePanel::get_cali_stage(CaliPresetStage& stage, float& value)
+{
+ stage = m_stage;
+ value = (m_stage == CALI_MANUAL_STAGE_2) ? m_flow_ratio_value : value;
+}
+
+void CaliPresetCaliStagePanel::set_flow_ratio_value(wxString flow_ratio)
+{
+ flow_ratio_input->GetTextCtrl()->SetValue(flow_ratio);
+}
+
+CaliPresetWarningPanel::CaliPresetWarningPanel(
+ wxWindow* parent,
+ wxWindowID id,
+ const wxPoint& pos,
+ const wxSize& size,
+ long style)
+ : wxPanel(parent, id, pos, size, style)
+{
+ m_top_sizer = new wxBoxSizer(wxHORIZONTAL);
+
+ create_panel(this);
+
+ this->SetSizer(m_top_sizer);
+ m_top_sizer->Fit(this);
+}
+
+void CaliPresetWarningPanel::create_panel(wxWindow* parent)
+{
+ m_warning_text = new wxStaticText(parent, wxID_ANY, wxEmptyString);
+ m_warning_text->SetFont(Label::Body_13);
+ m_warning_text->SetForegroundColour(wxColour(230, 92, 92));
+ m_warning_text->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
+ m_top_sizer->Add(m_warning_text, 0, wxEXPAND);
+}
+
+void CaliPresetWarningPanel::set_warning(wxString text)
+{
+ m_warning_text->SetLabel(text);
+}
+
+CaliPresetCustomRangePanel::CaliPresetCustomRangePanel(
+ wxWindow* parent,
+ int input_value_nums,
+ wxWindowID id,
+ const wxPoint& pos,
+ const wxSize& size,
+ long style)
+ : wxPanel(parent, id, pos, size, style)
+ , m_input_value_nums(input_value_nums)
+{
+ m_title_texts.resize(input_value_nums);
+ m_value_inputs.resize(input_value_nums);
+
+ m_top_sizer = new wxBoxSizer(wxHORIZONTAL);
+
+ create_panel(this);
+
+ this->SetSizer(m_top_sizer);
+ m_top_sizer->Fit(this);
+}
+
+void CaliPresetCustomRangePanel::set_unit(wxString unit)
+{
+ for (size_t i = 0; i < m_input_value_nums; ++i) {
+ m_value_inputs[i]->SetLabel(unit);
+ }
+}
+
+void CaliPresetCustomRangePanel::set_titles(wxArrayString titles)
+{
+ if (titles.size() != m_input_value_nums)
+ return;
+
+ for (size_t i = 0; i < m_input_value_nums; ++i) {
+ m_title_texts[i]->SetLabel(titles[i]);
+ }
+}
+
+void CaliPresetCustomRangePanel::set_values(wxArrayString values) {
+ if (values.size() != m_input_value_nums)
+ return;
+
+ for (size_t i = 0; i < m_input_value_nums; ++i) {
+ m_value_inputs[i]->GetTextCtrl()->SetValue(values[i]);
+ }
+}
+
+wxArrayString CaliPresetCustomRangePanel::get_values()
+{
+ wxArrayString result;
+ for (size_t i = 0; i < m_input_value_nums; ++i) {
+ result.push_back(m_value_inputs[i]->GetTextCtrl()->GetValue());
+ }
+ return result;
+}
+
+void CaliPresetCustomRangePanel::create_panel(wxWindow* parent)
+{
+ wxBoxSizer* horiz_sizer;
+ horiz_sizer = new wxBoxSizer(wxHORIZONTAL);
+
+ for (size_t i = 0; i < m_input_value_nums; ++i) {
+ if (i > 0) {
+ horiz_sizer->Add(FromDIP(10), 0, 0, wxEXPAND, 0);
+ }
+
+ wxBoxSizer *item_sizer;
+ item_sizer = new wxBoxSizer(wxVERTICAL);
+ m_title_texts[i] = new wxStaticText(parent, wxID_ANY, _L("Title"), wxDefaultPosition, wxDefaultSize, 0);
+ m_title_texts[i]->Wrap(-1);
+ m_title_texts[i]->SetFont(::Label::Body_14);
+ item_sizer->Add(m_title_texts[i], 0, wxALL, 0);
+ m_value_inputs[i] = new TextInput(parent, wxEmptyString, _L("\u2103"), "", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE, 0);
+ m_value_inputs[i]->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC));
+ item_sizer->Add(m_value_inputs[i], 0, wxALL, 0);
+ horiz_sizer->Add(item_sizer, 0, wxEXPAND, 0);
+ }
+
+ m_top_sizer->Add(horiz_sizer, 0, wxEXPAND, 0);
+}
+
+
+CaliPresetTipsPanel::CaliPresetTipsPanel(
+ wxWindow* parent,
+ wxWindowID id,
+ const wxPoint& pos,
+ const wxSize& size,
+ long style)
+ : wxPanel(parent, id, pos, size, style)
+{
+ this->SetBackgroundColour(wxColour(238, 238, 238));
+ this->SetMinSize(wxSize(CALIBRATION_TEXT_MAX_LENGTH * 1.7f, -1));
+
+ m_top_sizer = new wxBoxSizer(wxVERTICAL);
+
+ create_panel(this);
+
+ this->SetSizer(m_top_sizer);
+ m_top_sizer->Fit(this);
+}
+
+void CaliPresetTipsPanel::create_panel(wxWindow* parent)
+{
+ m_top_sizer->AddSpacer(FromDIP(10));
+
+ auto preset_panel_tips = new wxStaticText(parent, wxID_ANY, _L("A test model will be printed. Please clear the build plate and place it back to the hot bed before calibration."));
+ preset_panel_tips->SetFont(Label::Body_14);
+ preset_panel_tips->Wrap(CALIBRATION_TEXT_MAX_LENGTH * 1.5f);
+ m_top_sizer->Add(preset_panel_tips, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(20));
+
+ m_top_sizer->AddSpacer(FromDIP(10));
+
+ auto info_sizer = new wxFlexGridSizer(0, 3, 0, FromDIP(10));
+ info_sizer->SetFlexibleDirection(wxBOTH);
+ info_sizer->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
+
+ auto nozzle_temp_sizer = new wxBoxSizer(wxVERTICAL);
+ auto nozzle_temp_text = new wxStaticText(parent, wxID_ANY, _L("Nozzle temperature"));
+ nozzle_temp_text->SetFont(Label::Body_12);
+ m_nozzle_temp = new TextInput(parent, wxEmptyString, _L("\u2103"), "", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE, wxTE_READONLY);
+ m_nozzle_temp->SetBorderWidth(0);
+ nozzle_temp_sizer->Add(nozzle_temp_text, 0, wxALIGN_LEFT);
+ nozzle_temp_sizer->Add(m_nozzle_temp, 0, wxEXPAND);
+ nozzle_temp_text->Hide();
+ m_nozzle_temp->Hide();
+
+ auto bed_temp_sizer = new wxBoxSizer(wxHORIZONTAL);
+ auto printing_param_text = new wxStaticText(parent, wxID_ANY, _L("Printing Parameters"));
+ printing_param_text->SetFont(Label::Head_12);
+ printing_param_text->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
+ bed_temp_sizer->Add(printing_param_text, 0, wxALIGN_CENTER | wxRIGHT, FromDIP(20));
+ auto bed_temp_text = new wxStaticText(parent, wxID_ANY, _L("Bed temperature"));
+ bed_temp_text->SetFont(Label::Body_12);
+ m_bed_temp = new TextInput(parent, wxEmptyString, _L("\u2103"), "", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE, wxTE_READONLY);
+ m_bed_temp->SetBorderWidth(0);
+ bed_temp_sizer->Add(bed_temp_text, 0, wxALIGN_CENTER | wxRIGHT, FromDIP(10));
+ bed_temp_sizer->Add(m_bed_temp, 0, wxALIGN_CENTER);
+
+ auto max_flow_sizer = new wxBoxSizer(wxVERTICAL);
+ auto max_flow_text = new wxStaticText(parent, wxID_ANY, _L("Max volumetric speed"));
+ max_flow_text->SetFont(Label::Body_12);
+ m_max_volumetric_speed = new TextInput(parent, wxEmptyString, _L("mm\u00B3"), "", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE, wxTE_READONLY);
+ m_max_volumetric_speed->SetBorderWidth(0);
+ max_flow_sizer->Add(max_flow_text, 0, wxALIGN_LEFT);
+ max_flow_sizer->Add(m_max_volumetric_speed, 0, wxEXPAND);
+ max_flow_text->Hide();
+ m_max_volumetric_speed->Hide();
+
+ m_nozzle_temp->GetTextCtrl()->Bind(wxEVT_SET_FOCUS, [](auto&) {});
+ m_bed_temp->GetTextCtrl()->Bind(wxEVT_SET_FOCUS, [](auto&) {});
+ m_max_volumetric_speed->GetTextCtrl()->Bind(wxEVT_SET_FOCUS, [](auto&) {});
+
+ info_sizer->Add(nozzle_temp_sizer);
+ info_sizer->Add(bed_temp_sizer);
+ info_sizer->Add(max_flow_sizer);
+ m_top_sizer->Add(info_sizer, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(20));
+
+ m_top_sizer->AddSpacer(FromDIP(10));
+}
+
+void CaliPresetTipsPanel::set_params(int nozzle_temp, int bed_temp, float max_volumetric)
+{
+ wxString text_nozzle_temp = wxString::Format("%d", nozzle_temp);
+ m_nozzle_temp->GetTextCtrl()->SetValue(text_nozzle_temp);
+
+ wxString bed_temp_text = wxString::Format("%d", bed_temp);
+ m_bed_temp->GetTextCtrl()->SetValue(bed_temp_text);
+
+ wxString flow_val_text = wxString::Format("%0.2f", max_volumetric);
+ m_max_volumetric_speed->GetTextCtrl()->SetValue(flow_val_text);
+}
+
+void CaliPresetTipsPanel::get_params(int& nozzle_temp, int& bed_temp, float& max_volumetric)
+{
+ try {
+ nozzle_temp = stoi(m_nozzle_temp->GetTextCtrl()->GetValue().ToStdString());
+ bed_temp = stoi(m_bed_temp->GetTextCtrl()->GetValue().ToStdString());
+ max_volumetric = stof(m_max_volumetric_speed->GetTextCtrl()->GetValue().ToStdString());
+ }
+ catch(...) {
+ ;
+ }
+}
+
+CalibrationPresetPage::CalibrationPresetPage(
+ wxWindow* parent,
+ CalibMode cali_mode,
+ bool custom_range,
+ wxWindowID id,
+ const wxPoint& pos,
+ const wxSize& size,
+ long style)
+ : CalibrationWizardPage(parent, id, pos, size, style)
+ , m_show_custom_range(custom_range)
+{
+ m_cali_mode = cali_mode;
+ m_page_type = CaliPageType::CALI_PAGE_PRESET;
+ m_cali_filament_mode = CalibrationFilamentMode::CALI_MODEL_SINGLE;
+ m_top_sizer = new wxBoxSizer(wxVERTICAL);
+
+ create_page(this);
+
+ this->SetSizer(m_top_sizer);
+ m_top_sizer->Fit(this);
+}
+
+void CalibrationPresetPage::create_selection_panel(wxWindow* parent)
+{
+ auto panel_sizer = new wxBoxSizer(wxVERTICAL);
+
+ auto nozzle_combo_text = new wxStaticText(parent, wxID_ANY, _L("Please select the nozzle diameter of your printer"), wxDefaultPosition, wxDefaultSize, 0);
+ nozzle_combo_text->Wrap(-1);
+ nozzle_combo_text->SetFont(Label::Head_14);
+ panel_sizer->Add(nozzle_combo_text, 0, wxALL, 0);
+ m_comboBox_nozzle_dia = new ComboBox(parent, wxID_ANY, "", wxDefaultPosition, CALIBRATION_COMBOX_SIZE, 0, nullptr, wxCB_READONLY);
+ panel_sizer->Add(m_comboBox_nozzle_dia, 0, wxALL, 0);
+
+ panel_sizer->AddSpacer(PRESET_GAP);
+
+ auto plate_type_combo_text = new wxStaticText(parent, wxID_ANY, _L("Please select the plate type of your printer"), wxDefaultPosition, wxDefaultSize, 0);
+ plate_type_combo_text->Wrap(-1);
+ plate_type_combo_text->SetFont(Label::Head_14);
+ panel_sizer->Add(plate_type_combo_text, 0, wxALL, 0);
+ m_comboBox_bed_type = new ComboBox(parent, wxID_ANY, "", wxDefaultPosition, CALIBRATION_COMBOX_SIZE, 0, nullptr, wxCB_READONLY);
+ panel_sizer->Add(m_comboBox_bed_type, 0, wxALL, 0);
+
+ panel_sizer->AddSpacer(PRESET_GAP);
+
+ m_filament_from_panel = new wxPanel(parent);
+ auto filament_from_sizer = new wxBoxSizer(wxVERTICAL);
+ auto filament_from_text = new wxStaticText(m_filament_from_panel, wxID_ANY, _L("filament position"));
+ filament_from_text->SetFont(Label::Head_14);
+ filament_from_sizer->Add(filament_from_text, 0);
+ auto raioBox_sizer = new wxFlexGridSizer(2, 1, 0, FromDIP(10));
+ m_ams_radiobox = new wxRadioButton(m_filament_from_panel, wxID_ANY, _L("AMS"));
+ m_ams_radiobox->SetValue(true);
+ filament_from_text->Hide();
+ m_ams_radiobox->Hide();
+
+ raioBox_sizer->Add(m_ams_radiobox, 0);
+ m_ext_spool_radiobox = new wxRadioButton(m_filament_from_panel, wxID_ANY, _L("External Spool"));
+ m_ext_spool_radiobox->Hide();
+ raioBox_sizer->Add(m_ext_spool_radiobox, 0);
+ filament_from_sizer->Add(raioBox_sizer, 0);
+ m_filament_from_panel->SetSizer(filament_from_sizer);
+ panel_sizer->Add(m_filament_from_panel, 0);
+
+ panel_sizer->AddSpacer(PRESET_GAP);
+
+ auto filament_for_title_sizer = new wxBoxSizer(wxHORIZONTAL);
+ auto filament_for_text = new wxStaticText(parent, wxID_ANY, _L("Filament For Calibration"), wxDefaultPosition, wxDefaultSize, 0);
+ filament_for_text->SetFont(Label::Head_14);
+ filament_for_title_sizer->Add(filament_for_text, 0, wxALIGN_CENTER);
+ filament_for_title_sizer->AddSpacer(FromDIP(25));
+ m_ams_sync_button = new ScalableButton(parent, wxID_ANY, "ams_fila_sync", wxEmptyString, wxDefaultSize, wxDefaultPosition, wxBU_EXACTFIT | wxNO_BORDER, false, 18);
+ m_ams_sync_button->SetBackgroundColour(*wxWHITE);
+ m_ams_sync_button->SetToolTip(_L("Synchronize filament list from AMS"));
+ filament_for_title_sizer->Add(m_ams_sync_button, 0, wxALIGN_CENTER, 0);
+ panel_sizer->Add(filament_for_title_sizer);
+
+ parent->SetSizer(panel_sizer);
+ panel_sizer->Fit(parent);
+
+ m_ams_radiobox->Bind(wxEVT_RADIOBUTTON, &CalibrationPresetPage::on_choose_ams, this);
+ m_ext_spool_radiobox->Bind(wxEVT_RADIOBUTTON, &CalibrationPresetPage::on_choose_ext_spool, this);
+ m_ams_sync_button->Bind(wxEVT_BUTTON, [this](wxCommandEvent& e) {
+ sync_ams_info(curr_obj);
+ });
+
+ m_comboBox_nozzle_dia->Bind(wxEVT_COMBOBOX, &CalibrationPresetPage::on_select_nozzle, this);
+
+ m_comboBox_bed_type->Bind(wxEVT_COMBOBOX, &CalibrationPresetPage::on_select_plate_type, this);
+}
+
+#define NOZZLE_LIST_COUNT 4
+#define NOZZLE_LIST_DEFAULT 1
+float nozzle_diameter_list[NOZZLE_LIST_COUNT] = {0.2, 0.4, 0.6, 0.8 };
+
+void CalibrationPresetPage::init_selection_values()
+{
+ // init nozzle diameter
+ for (int i = 0; i < NOZZLE_LIST_COUNT; i++) {
+ m_comboBox_nozzle_dia->AppendString(wxString::Format("%1.1f mm", nozzle_diameter_list[i]));
+ }
+ m_comboBox_nozzle_dia->SetSelection(NOZZLE_LIST_DEFAULT);
+
+ // init plate type
+ int curr_selection = 0;
+ const ConfigOptionDef* bed_type_def = print_config_def.get("curr_bed_type");
+ if (bed_type_def && bed_type_def->enum_keys_map) {
+ for (auto item : bed_type_def->enum_labels) {
+ m_comboBox_bed_type->AppendString(_L(item));
+ }
+ m_comboBox_bed_type->SetSelection(curr_selection);
+ }
+}
+
+void CalibrationPresetPage::create_filament_list_panel(wxWindow* parent)
+{
+ auto panel_sizer = new wxBoxSizer(wxVERTICAL);
+
+ auto filament_list_tips = new wxStaticText(parent, wxID_ANY, _L("Please select same type of material, because plate temperature might not be compatible with different type of material"), wxDefaultPosition, wxDefaultSize, 0);
+ filament_list_tips->Hide();
+ filament_list_tips->SetFont(Label::Body_13);
+ filament_list_tips->SetForegroundColour(wxColour(145, 145, 145));
+ filament_list_tips->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
+ panel_sizer->Add(filament_list_tips);
+ panel_sizer->AddSpacer(FromDIP(10));
+
+ // ams panel
+ m_multi_ams_panel = new wxPanel(parent);
+ auto multi_ams_sizer = new wxBoxSizer(wxVERTICAL);
+ auto ams_items_sizer = new wxBoxSizer(wxHORIZONTAL);
+ for (int i = 0; i < 4; i++) {
+ AMSinfo temp_info = AMSinfo{ std::to_string(i), std::vector{} };
+ auto amsitem = new AMSItem(m_multi_ams_panel, wxID_ANY, temp_info);
+ amsitem->Bind(wxEVT_LEFT_DOWN, [this, amsitem](wxMouseEvent& e) {
+ on_switch_ams(amsitem->m_amsinfo.ams_id);
+ e.Skip();
+ });
+ m_ams_item_list.push_back(amsitem);
+ ams_items_sizer->Add(amsitem, 0, wxALIGN_CENTER | wxRIGHT, FromDIP(6));
+ }
+ multi_ams_sizer->Add(ams_items_sizer, 0);
+ multi_ams_sizer->AddSpacer(FromDIP(10));
+ m_multi_ams_panel->SetSizer(multi_ams_sizer);
+
+ panel_sizer->Add(m_multi_ams_panel);
+ m_multi_ams_panel->Hide();
+
+ auto filament_fgSizer = new wxFlexGridSizer(2, 2, FromDIP(10), CALIBRATION_FGSIZER_HGAP);
+ for (int i = 0; i < 4; i++) {
+ auto filament_comboBox_sizer = new wxBoxSizer(wxHORIZONTAL);
+ wxRadioButton* radio_btn = new wxRadioButton(m_filament_list_panel, wxID_ANY, "");
+ CheckBox* check_box = new CheckBox(m_filament_list_panel);
+ check_box->SetBackgroundColour(*wxWHITE);
+ FilamentComboBox* fcb = new FilamentComboBox(m_filament_list_panel);
+ fcb->SetRadioBox(radio_btn);
+ fcb->SetCheckBox(check_box);
+ fcb->set_select_mode(CalibrationFilamentMode::CALI_MODEL_SINGLE);
+ filament_comboBox_sizer->Add(radio_btn, 0, wxALIGN_CENTER);
+ filament_comboBox_sizer->Add(check_box, 0, wxALIGN_CENTER | wxRIGHT, FromDIP(8));
+ filament_comboBox_sizer->Add(fcb, 0, wxALIGN_CENTER);
+ filament_fgSizer->Add(filament_comboBox_sizer, 0);
+
+ radio_btn->Bind(wxEVT_RADIOBUTTON, [this](wxCommandEvent& evt) {
+ wxCommandEvent event(EVT_CALI_TRAY_CHANGED);
+ event.SetEventObject(this);
+ wxPostEvent(this, event);
+ });
+ check_box->Bind(wxEVT_TOGGLEBUTTON, [this](wxCommandEvent& evt) {
+ wxCommandEvent event(EVT_CALI_TRAY_CHANGED);
+ event.SetEventObject(this);
+ wxPostEvent(this, event);
+ evt.Skip();
+ });
+ m_filament_comboBox_list.push_back(fcb);
+
+ if (i == 0)
+ radio_btn->SetValue(true);
+ }
+ panel_sizer->Add(filament_fgSizer, 0);
+
+ parent->SetSizer(panel_sizer);
+ panel_sizer->Fit(parent);
+}
+
+void CalibrationPresetPage::create_ext_spool_panel(wxWindow* parent)
+{
+ auto panel_sizer = new wxBoxSizer(wxHORIZONTAL);
+ panel_sizer->AddSpacer(FromDIP(10));
+ wxRadioButton* radio_btn = new wxRadioButton(parent, wxID_ANY, "");
+ CheckBox* check_box = new CheckBox(parent);
+ m_virtual_tray_comboBox = new FilamentComboBox(parent);
+ m_virtual_tray_comboBox->SetRadioBox(radio_btn);
+ m_virtual_tray_comboBox->SetCheckBox(check_box);
+ m_virtual_tray_comboBox->set_select_mode(CalibrationFilamentMode::CALI_MODEL_SINGLE);
+ radio_btn->SetValue(true);
+
+ panel_sizer->Add(radio_btn, 0, wxALIGN_CENTER);
+ panel_sizer->Add(check_box, 0, wxALIGN_CENTER);
+ panel_sizer->Add(m_virtual_tray_comboBox, 0, wxALIGN_CENTER | wxRIGHT, FromDIP(8));
+ parent->SetSizer(panel_sizer);
+ panel_sizer->Fit(parent);
+}
+
+void CalibrationPresetPage::create_sending_panel(wxWindow* parent)
+{
+ auto panel_sizer = new wxBoxSizer(wxVERTICAL);
+ parent->SetSizer(panel_sizer);
+
+ m_send_progress_bar = std::shared_ptr(new BBLStatusBarSend(parent));
+ m_send_progress_bar->set_cancel_callback_fina([this]() {
+ BOOST_LOG_TRIVIAL(info) << "CalibrationWizard::print_job: enter canceled";
+ if (CalibUtils::print_job) {
+ if (CalibUtils::print_job->is_running()) {
+ BOOST_LOG_TRIVIAL(info) << "calibration_print_job: canceled";
+ CalibUtils::print_job->cancel();
+ }
+ CalibUtils::print_job->join();
+ }
+ show_status(CaliPresetStatusNormal);
+ });
+ panel_sizer->Add(m_send_progress_bar->get_panel(), 0);
+
+ m_sw_print_failed_info = new wxScrolledWindow(parent, wxID_ANY, wxDefaultPosition, wxSize(FromDIP(380), FromDIP(125)), wxVSCROLL);
+ m_sw_print_failed_info->SetBackgroundColour(*wxWHITE);
+ m_sw_print_failed_info->SetScrollRate(0, 5);
+ m_sw_print_failed_info->SetMinSize(wxSize(FromDIP(380), FromDIP(125)));
+ m_sw_print_failed_info->SetMaxSize(wxSize(FromDIP(380), FromDIP(125)));
+
+ m_sw_print_failed_info->Hide();
+
+ panel_sizer->Add(m_sw_print_failed_info, 0);
+
+ // create error info panel
+ wxBoxSizer* sizer_print_failed_info = new wxBoxSizer(wxVERTICAL);
+ m_sw_print_failed_info->SetSizer(sizer_print_failed_info);
+
+ wxBoxSizer* sizer_error_code = new wxBoxSizer(wxHORIZONTAL);
+ wxBoxSizer* sizer_error_desc = new wxBoxSizer(wxHORIZONTAL);
+ wxBoxSizer* sizer_extra_info = new wxBoxSizer(wxHORIZONTAL);
+
+ auto st_title_error_code = new wxStaticText(m_sw_print_failed_info, wxID_ANY, _L("Error code"));
+ auto st_title_error_code_doc = new wxStaticText(m_sw_print_failed_info, wxID_ANY, ": ");
+ m_st_txt_error_code = new Label(m_sw_print_failed_info, wxEmptyString);
+ st_title_error_code->SetForegroundColour(0x909090);
+ st_title_error_code_doc->SetForegroundColour(0x909090);
+ m_st_txt_error_code->SetForegroundColour(0x909090);
+ st_title_error_code->SetFont(::Label::Body_13);
+ st_title_error_code_doc->SetFont(::Label::Body_13);
+ m_st_txt_error_code->SetFont(::Label::Body_13);
+ st_title_error_code->SetMinSize(wxSize(FromDIP(74), -1));
+ st_title_error_code->SetMaxSize(wxSize(FromDIP(74), -1));
+ m_st_txt_error_code->SetMinSize(wxSize(FromDIP(260), -1));
+ m_st_txt_error_code->SetMaxSize(wxSize(FromDIP(260), -1));
+ sizer_error_code->Add(st_title_error_code, 0, wxALL, 0);
+ sizer_error_code->Add(st_title_error_code_doc, 0, wxALL, 0);
+ sizer_error_code->Add(m_st_txt_error_code, 0, wxALL, 0);
+
+ auto st_title_error_desc = new wxStaticText(m_sw_print_failed_info, wxID_ANY, _L("Error desc"));
+ auto st_title_error_desc_doc = new wxStaticText(m_sw_print_failed_info, wxID_ANY, ": ");
+ m_st_txt_error_desc = new Label(m_sw_print_failed_info, wxEmptyString);
+ st_title_error_desc->SetForegroundColour(0x909090);
+ st_title_error_desc_doc->SetForegroundColour(0x909090);
+ m_st_txt_error_desc->SetForegroundColour(0x909090);
+ st_title_error_desc->SetFont(::Label::Body_13);
+ st_title_error_desc_doc->SetFont(::Label::Body_13);
+ m_st_txt_error_desc->SetFont(::Label::Body_13);
+ st_title_error_desc->SetMinSize(wxSize(FromDIP(74), -1));
+ st_title_error_desc->SetMaxSize(wxSize(FromDIP(74), -1));
+ m_st_txt_error_desc->SetMinSize(wxSize(FromDIP(260), -1));
+ m_st_txt_error_desc->SetMaxSize(wxSize(FromDIP(260), -1));
+ sizer_error_desc->Add(st_title_error_desc, 0, wxALL, 0);
+ sizer_error_desc->Add(st_title_error_desc_doc, 0, wxALL, 0);
+ sizer_error_desc->Add(m_st_txt_error_desc, 0, wxALL, 0);
+
+ auto st_title_extra_info = new wxStaticText(m_sw_print_failed_info, wxID_ANY, _L("Extra info"));
+ auto st_title_extra_info_doc = new wxStaticText(m_sw_print_failed_info, wxID_ANY, ": ");
+ m_st_txt_extra_info = new Label(m_sw_print_failed_info, wxEmptyString);
+ st_title_extra_info->SetForegroundColour(0x909090);
+ st_title_extra_info_doc->SetForegroundColour(0x909090);
+ m_st_txt_extra_info->SetForegroundColour(0x909090);
+ st_title_extra_info->SetFont(::Label::Body_13);
+ st_title_extra_info_doc->SetFont(::Label::Body_13);
+ m_st_txt_extra_info->SetFont(::Label::Body_13);
+ st_title_extra_info->SetMinSize(wxSize(FromDIP(74), -1));
+ st_title_extra_info->SetMaxSize(wxSize(FromDIP(74), -1));
+ m_st_txt_extra_info->SetMinSize(wxSize(FromDIP(260), -1));
+ m_st_txt_extra_info->SetMaxSize(wxSize(FromDIP(260), -1));
+ sizer_extra_info->Add(st_title_extra_info, 0, wxALL, 0);
+ sizer_extra_info->Add(st_title_extra_info_doc, 0, wxALL, 0);
+ sizer_extra_info->Add(m_st_txt_extra_info, 0, wxALL, 0);
+
+ sizer_print_failed_info->Add(sizer_error_code, 0, wxLEFT, 5);
+ sizer_print_failed_info->Add(0, 0, 0, wxTOP, FromDIP(3));
+ sizer_print_failed_info->Add(sizer_error_desc, 0, wxLEFT, 5);
+ sizer_print_failed_info->Add(0, 0, 0, wxTOP, FromDIP(3));
+ sizer_print_failed_info->Add(sizer_extra_info, 0, wxLEFT, 5);
+
+
+ Bind(EVT_SHOW_ERROR_INFO, [this](auto& e) {
+ show_send_failed_info(true);
+ });
+}
+
+void CalibrationPresetPage::create_page(wxWindow* parent)
+{
+ m_page_caption = new CaliPageCaption(parent, m_cali_mode);
+ m_page_caption->show_prev_btn(true);
+ m_top_sizer->Add(m_page_caption, 0, wxEXPAND, 0);
+
+ if (m_cali_mode == CalibMode::Calib_Flow_Rate) {
+ wxArrayString steps;
+ steps.Add(_L("Preset"));
+ steps.Add(_L("Calibration1"));
+ steps.Add(_L("Calibration2"));
+ steps.Add(_L("Record Factor"));
+ m_step_panel = new CaliPageStepGuide(parent, steps);
+ m_step_panel->set_steps(0);
+ }
+ else {
+ wxArrayString steps;
+ steps.Add(_L("Preset"));
+ steps.Add(_L("Calibration"));
+ steps.Add(_L("Record"));
+ m_step_panel = new CaliPageStepGuide(parent, steps);
+ m_step_panel->set_steps(0);
+ }
+
+ m_top_sizer->Add(m_step_panel, 0, wxEXPAND, 0);
+
+ if (m_cali_mode == CalibMode::Calib_Flow_Rate) {
+ m_cali_stage_panel = new CaliPresetCaliStagePanel(parent);
+ m_top_sizer->Add(m_cali_stage_panel, 0);
+ }
+
+ m_selection_panel = new wxPanel(parent);
+ create_selection_panel(m_selection_panel);
+ init_selection_values();
+
+ m_filament_list_panel = new wxPanel(parent);
+ create_filament_list_panel(m_filament_list_panel);
+
+ m_ext_spool_panel = new wxPanel(parent);
+ create_ext_spool_panel(m_ext_spool_panel);
+ m_ext_spool_panel->Hide();
+
+ m_warning_panel = new CaliPresetWarningPanel(parent);
+
+ m_tips_panel = new CaliPresetTipsPanel(parent);
+
+ m_sending_panel = new wxPanel(parent);
+ create_sending_panel(m_sending_panel);
+
+ m_sending_panel->Hide();
+
+ if (m_show_custom_range) {
+ m_custom_range_panel = new CaliPresetCustomRangePanel(parent);
+ }
+
+ m_top_sizer->Add(m_selection_panel, 0);
+ m_top_sizer->Add(m_filament_list_panel, 0);
+ m_top_sizer->Add(m_ext_spool_panel, 0);
+ m_top_sizer->Add(m_warning_panel, 0);
+ if (m_show_custom_range) {
+ m_top_sizer->Add(m_custom_range_panel, 0);
+ m_top_sizer->AddSpacer(PRESET_GAP);
+ }
+ m_top_sizer->Add(m_tips_panel, 0);
+
+ m_top_sizer->Add(m_sending_panel, 0);
+
+ m_top_sizer->AddSpacer(PRESET_GAP);
+
+ m_action_panel = new CaliPageActionPanel(parent, m_cali_mode, CaliPageType::CALI_PAGE_PRESET);
+
+ m_top_sizer->Add(m_action_panel, 0, wxEXPAND, 0);
+
+ Bind(EVT_CALI_TRAY_CHANGED, &CalibrationPresetPage::on_select_tray, this);
+}
+
+void CalibrationPresetPage::on_select_nozzle(wxCommandEvent& evt)
+{
+ update_combobox_filaments(curr_obj);
+}
+
+void CalibrationPresetPage::on_select_plate_type(wxCommandEvent& evt)
+{
+ select_default_compatible_filament();
+ check_filament_compatible();
+}
+
+void CalibrationPresetPage::on_choose_ams(wxCommandEvent& event)
+{
+ select_default_compatible_filament();
+
+ m_filament_list_panel->Show();
+ m_ams_sync_button->Show();
+ m_ext_spool_panel->Hide();
+ Layout();
+}
+
+void CalibrationPresetPage::on_choose_ext_spool(wxCommandEvent& event)
+{
+ m_filament_list_panel->Hide();
+ m_ams_sync_button->Hide();
+ m_ext_spool_panel->Show();
+ Layout();
+}
+
+void CalibrationPresetPage::on_select_tray(wxCommandEvent& event)
+{
+ check_filament_compatible();
+
+ on_recommend_input_value();
+}
+
+void CalibrationPresetPage::on_switch_ams(std::string ams_id)
+{
+ for (auto i = 0; i < m_ams_item_list.size(); i++) {
+ AMSItem* item = m_ams_item_list[i];
+ if (item->m_amsinfo.ams_id == ams_id) {
+ item->OnSelected();
+ }
+ else {
+ item->UnSelected();
+ }
+ }
+
+ update_filament_combobox(ams_id);
+
+ select_default_compatible_filament();
+
+ Layout();
+}
+
+void CalibrationPresetPage::on_recommend_input_value()
+{
+ //TODO fix this
+ std::map selected_filaments = get_selected_filaments();
+ if (selected_filaments.empty())
+ return;
+
+ if (m_cali_mode == CalibMode::Calib_PA_Line) {
+
+ }
+ else if (m_cali_mode == CalibMode::Calib_Flow_Rate && m_cali_stage_panel) {
+ Preset *selected_filament_preset = selected_filaments.begin()->second;
+ if (selected_filament_preset) {
+ float flow_ratio = selected_filament_preset->config.option("filament_flow_ratio")->get_at(0);
+ m_cali_stage_panel->set_flow_ratio_value(float_to_string(flow_ratio));
+ }
+ }
+ else if (m_cali_mode == CalibMode::Calib_Vol_speed_Tower) {
+ Preset* selected_filament_preset = selected_filaments.begin()->second;
+ if (selected_filament_preset) {
+ double max_volumetric_speed = selected_filament_preset->config.option("filament_max_volumetric_speed")->get_at(0);
+ if (m_custom_range_panel) {
+ wxArrayString values;
+ values.push_back(float_to_string(max_volumetric_speed - 5));
+ values.push_back(float_to_string(max_volumetric_speed + 5));
+ values.push_back("0.5");
+ m_custom_range_panel->set_values(values);
+ }
+ }
+ }
+}
+
+void CalibrationPresetPage::check_filament_compatible()
+{
+ std::map selected_filaments = get_selected_filaments();
+ std::string incompatiable_filament_name;
+ std::string error_tips;
+ int bed_temp = 0;
+
+ std::vector selected_filaments_list;
+ for (auto& item: selected_filaments)
+ selected_filaments_list.push_back(item.second);
+
+ if (!is_filaments_compatiable(selected_filaments_list, bed_temp, incompatiable_filament_name, error_tips)) {
+ m_tips_panel->set_params(0, 0, 0.0f);
+ if (!error_tips.empty()) {
+ wxString tips = from_u8(error_tips);
+ } else {
+ wxString tips = wxString::Format(_L("%s is not compatible with %s"), m_comboBox_bed_type->GetValue(), incompatiable_filament_name);
+ m_warning_panel->set_warning(tips);
+ m_warning_panel->Show();
+ }
+ } else {
+ m_tips_panel->set_params(0, bed_temp, 0);
+ m_warning_panel->set_warning("");
+ m_warning_panel->Hide();
+ }
+ Layout();
+}
+
+bool CalibrationPresetPage::is_filaments_compatiable(const std::vector& prests)
+{
+ std::string incompatiable_filament_name;
+ std::string error_tips;
+ int bed_temp = 0;
+ return is_filaments_compatiable(prests, bed_temp, incompatiable_filament_name, error_tips);
+}
+
+bool CalibrationPresetPage::is_filaments_compatiable(const std::vector &prests,
+ int& bed_temp,
+ std::string& incompatiable_filament_name,
+ std::string& error_tips)
+{
+ if (prests.empty()) return true;
+
+ bed_temp = 0;
+ std::vector filament_types;
+ for (auto &item : prests) {
+ if (!item)
+ continue;
+
+ // update bed temperature
+ BedType curr_bed_type = BedType(m_comboBox_bed_type->GetSelection() + btDefault + 1);
+ const ConfigOptionInts *opt_bed_temp_ints = item->config.option(get_bed_temp_key(curr_bed_type));
+ int bed_temp_int = 0;
+ if (opt_bed_temp_ints) {
+ bed_temp_int = opt_bed_temp_ints->get_at(0);
+ }
+
+ if (bed_temp_int <= 0) {
+ if (!item->alias.empty())
+ incompatiable_filament_name = item->alias;
+ else
+ incompatiable_filament_name = item->name;
+
+ return false;
+ } else {
+ // set for firset preset
+ if (bed_temp == 0)
+ bed_temp = bed_temp_int;
+ }
+ std::string display_filament_type;
+ filament_types.push_back(item->config.get_filament_type(display_filament_type, 0));
+ }
+
+ if (!Print::check_multi_filaments_compatibility(filament_types)) {
+ error_tips = L("Can not print multiple filaments which have large difference of temperature together. Otherwise, the extruder and nozzle may be blocked or damaged during printing");
+ return false;
+ }
+
+ return true;
+}
+
+void CalibrationPresetPage::update_combobox_filaments(MachineObject* obj)
+{
+ //step 1: update combobox filament list
+ float nozzle_value = get_nozzle_value();
+ obj->cali_selected_nozzle_dia = nozzle_value;
+ if (nozzle_value < 1e-3) {
+ return;
+ }
+
+ Preset* printer_preset = get_printer_preset(obj, nozzle_value);
+
+ // sync ams filaments list info
+ PresetBundle* preset_bundle = wxGetApp().preset_bundle;
+ if (preset_bundle && printer_preset) {
+ preset_bundle->set_calibrate_printer(printer_preset->name);
+ update_filament_combobox();
+ }
+
+ //step 2: sync ams info from object by default
+ sync_ams_info(obj);
+
+ //step 3: select the default compatible filament to calibration
+ select_default_compatible_filament();
+}
+
+void CalibrationPresetPage::show_status(CaliPresetPageStatus status)
+{
+ if (status == CaliPresetPageStatus::CaliPresetStatusSending) {
+ m_sending_panel->Show();
+ }
+ else {
+ m_sending_panel->Hide();
+ }
+}
+
+float CalibrationPresetPage::get_nozzle_value()
+{
+ double nozzle_value = 0.0;
+ wxString nozzle_value_str = m_comboBox_nozzle_dia->GetValue();
+ try {
+ nozzle_value_str.ToDouble(&nozzle_value);
+ }
+ catch (...) {
+ ;
+ }
+
+ return nozzle_value;
+}
+
+void CalibrationPresetPage::update(MachineObject* obj)
+{
+ curr_obj = obj;
+}
+
+void CalibrationPresetPage::on_device_connected(MachineObject* obj)
+{
+ init_with_machine(obj);
+ update_combobox_filaments(obj);
+}
+
+void CalibrationPresetPage::update_print_error_info(int code, const std::string& msg, const std::string& extra)
+{
+ m_print_error_code = code;
+ m_print_error_msg = msg;
+ m_print_error_extra = extra;
+}
+
+void CalibrationPresetPage::show_send_failed_info(bool show, int code, wxString description, wxString extra)
+{
+ if (show) {
+ if (!m_sw_print_failed_info->IsShown()) {
+ m_sw_print_failed_info->Show(true);
+
+ m_st_txt_error_code->SetLabelText(wxString::Format("%d", m_print_error_code));
+ m_st_txt_error_desc->SetLabelText(wxGetApp().filter_string(m_print_error_msg));
+ m_st_txt_extra_info->SetLabelText(wxGetApp().filter_string(m_print_error_extra));
+
+ m_st_txt_error_code->Wrap(FromDIP(260));
+ m_st_txt_error_desc->Wrap(FromDIP(260));
+ m_st_txt_extra_info->Wrap(FromDIP(260));
+ }
+ else {
+ m_sw_print_failed_info->Show(false);
+ }
+ Layout();
+ Fit();
+ }
+ else {
+ if (!m_sw_print_failed_info->IsShown()) { return; }
+ m_sw_print_failed_info->Show(false);
+ m_st_txt_error_code->SetLabelText(wxEmptyString);
+ m_st_txt_error_desc->SetLabelText(wxEmptyString);
+ m_st_txt_extra_info->SetLabelText(wxEmptyString);
+ Layout();
+ Fit();
+ }
+}
+
+void CalibrationPresetPage::set_cali_filament_mode(CalibrationFilamentMode mode)
+{
+ CalibrationWizardPage::set_cali_filament_mode(mode);
+
+ for (int i = 0; i < m_filament_comboBox_list.size(); i++) {
+ m_filament_comboBox_list[i]->set_select_mode(mode);
+ }
+}
+
+void CalibrationPresetPage::set_cali_method(CalibrationMethod method)
+{
+ if (method == CalibrationMethod::CALI_METHOD_MANUAL && m_cali_mode == CalibMode::Calib_Flow_Rate) {
+ wxArrayString steps;
+ steps.Add(_L("Preset"));
+ steps.Add(_L("Calibration1"));
+ steps.Add(_L("Calibration2"));
+ steps.Add(_L("Record Factor"));
+ m_step_panel->set_steps_string(steps);
+ m_step_panel->set_steps(0);
+ if (m_cali_stage_panel)
+ m_cali_stage_panel->Show();
+ }
+ else {
+ wxArrayString steps;
+ steps.Add(_L("Preset"));
+ steps.Add(_L("Calibration"));
+ steps.Add(_L("Record Factor"));
+ m_step_panel->set_steps_string(steps);
+ m_step_panel->set_steps(0);
+ if (m_cali_stage_panel)
+ m_cali_stage_panel->Show(false);
+ }
+}
+
+void CalibrationPresetPage::on_cali_start_job()
+{
+ show_status(CaliPresetPageStatus::CaliPresetStatusSending);
+}
+
+void CalibrationPresetPage::on_cali_finished_job()
+{
+ show_status(CaliPresetPageStatus::CaliPresetStatusNormal);
+}
+
+void CalibrationPresetPage::init_with_machine(MachineObject* obj)
+{
+ if (!obj) return;
+
+ bool nozzle_is_set = false;
+ for (int i = 0; i < NOZZLE_LIST_COUNT; i++) {
+ if (abs(obj->nozzle_diameter - nozzle_diameter_list[i]) < 1e-3) {
+ if (m_comboBox_nozzle_dia->GetCount() > i) {
+ m_comboBox_nozzle_dia->SetSelection(i);
+ nozzle_is_set = true;
+ }
+ }
+ }
+
+ if (nozzle_is_set) {
+ wxCommandEvent event(wxEVT_COMBOBOX);
+ event.SetEventObject(this);
+ wxPostEvent(m_comboBox_nozzle_dia, event);
+ m_comboBox_nozzle_dia->SetToolTip(_L("The nozzle diameter has been synchronized from the printer Settings"));
+ } else {
+ m_comboBox_nozzle_dia->SetToolTip(wxEmptyString);
+ // set default to 0.4
+ if (m_comboBox_nozzle_dia->GetCount() > NOZZLE_LIST_DEFAULT)
+ m_comboBox_nozzle_dia->SetSelection(NOZZLE_LIST_DEFAULT);
+ }
+
+ // init default for filament source
+ if ( !obj->has_ams() || (obj->m_tray_now == std::to_string(VIRTUAL_TRAY_ID)) )
+ {
+ m_ext_spool_radiobox->SetValue(true);
+ wxCommandEvent event(wxEVT_RADIOBUTTON);
+ event.SetEventObject(this);
+ wxPostEvent(this->m_ext_spool_radiobox, event);
+ }
+ else {
+ m_ams_radiobox->SetValue(true);
+ wxCommandEvent event(wxEVT_RADIOBUTTON);
+ event.SetEventObject(this);
+ wxPostEvent(this->m_ams_radiobox, event);
+ }
+ Layout();
+ // init filaments for calibration
+ sync_ams_info(obj);
+}
+
+void CalibrationPresetPage::sync_ams_info(MachineObject* obj)
+{
+ std::map full_filament_ams_list = wxGetApp().sidebar().build_filament_ams_list(obj);
+
+ if (!obj) return;
+
+ // sync filament_ams_list from obj ams list
+ filament_ams_list.clear();
+ for (auto& ams_item : obj->amsList) {
+ for (auto& tray_item: ams_item.second->trayList) {
+ int tray_id = -1;
+ if (!tray_item.second->id.empty()) {
+ try {
+ tray_id = stoi(tray_item.second->id) + stoi(ams_item.second->id) * 4;
+ }
+ catch (...) {
+ ;
+ }
+ }
+ auto filament_ams = full_filament_ams_list.find(tray_id);
+ if (filament_ams != full_filament_ams_list.end()) {
+ filament_ams_list[tray_id] = filament_ams->second;
+ }
+ }
+ }
+
+ // init virtual tray info
+ if (full_filament_ams_list.find(VIRTUAL_TRAY_ID) != full_filament_ams_list.end()) {
+ filament_ams_list[VIRTUAL_TRAY_ID] = full_filament_ams_list[VIRTUAL_TRAY_ID];
+ }
+
+
+ // update filament from panel, display only obj has ams
+ // update multi ams panel, display only obj has multi ams
+ if (obj->has_ams()) {
+ m_filament_from_panel->Show();
+
+ if (obj->amsList.size() > 1) {
+ m_multi_ams_panel->Show();
+ on_switch_ams(obj->amsList.begin()->first);
+ } else {
+ m_multi_ams_panel->Hide();
+ update_filament_combobox();
+ }
+ }
+ else {
+ m_multi_ams_panel->Hide();
+ m_filament_from_panel->Hide();
+ }
+
+ std::vector ams_info;
+ for (auto ams = obj->amsList.begin(); ams != obj->amsList.end(); ams++) {
+ AMSinfo info;
+ info.ams_id = ams->first;
+ if (ams->second->is_exists
+ && info.parse_ams_info(ams->second, obj->ams_calibrate_remain_flag, obj->is_support_ams_humidity)) {
+ ams_info.push_back(info);
+ }
+ }
+
+ for (auto i = 0; i < m_ams_item_list.size(); i++) {
+ AMSItem* item = m_ams_item_list[i];
+ if (ams_info.size() > 1) {
+ if (i < ams_info.size()) {
+ item->Update(ams_info[i]);
+ item->Open();
+ } else {
+ item->Close();
+ }
+ } else {
+ item->Close();
+ }
+ }
+
+ Layout();
+}
+
+void CalibrationPresetPage::select_default_compatible_filament()
+{
+ if (!curr_obj)
+ return;
+
+ if (m_ams_radiobox->GetValue()) {
+ for (auto &fcb : m_filament_comboBox_list) {
+ if (!fcb->GetRadioBox()->IsEnabled())
+ continue;
+
+ Preset* preset = const_cast(fcb->GetComboBox()->get_selected_preset());
+ std::vector multi_select_filaments;
+ if (m_cali_filament_mode == CalibrationFilamentMode::CALI_MODEL_SINGLE) {
+ if (is_filaments_compatiable({preset})) {
+ fcb->GetRadioBox()->SetValue(true);
+ wxCommandEvent event(wxEVT_RADIOBUTTON);
+ event.SetEventObject(this);
+ wxPostEvent(fcb->GetRadioBox(), event);
+ Layout();
+ break;
+ } else
+ fcb->GetRadioBox()->SetValue(false);
+ } else if (m_cali_filament_mode == CalibrationFilamentMode::CALI_MODEL_MULITI) {
+ multi_select_filaments.push_back(preset);
+ if (!is_filaments_compatiable(multi_select_filaments)) {
+ multi_select_filaments.pop_back();
+ fcb->GetCheckBox()->SetValue(false);
+ }
+ else
+ fcb->GetCheckBox()->SetValue(true);
+
+ wxCommandEvent event(wxEVT_CHECKBOX);
+ event.SetEventObject(this);
+ wxPostEvent(fcb->GetCheckBox(), event);
+ Layout();
+ }
+ }
+ }
+ else if (m_ext_spool_radiobox->GetValue()){
+ Preset *preset = const_cast(m_virtual_tray_comboBox->GetComboBox()->get_selected_preset());
+ if (is_filaments_compatiable({preset})) {
+ m_virtual_tray_comboBox->GetRadioBox()->SetValue(true);
+ } else
+ m_virtual_tray_comboBox->GetRadioBox()->SetValue(false);
+
+ wxCommandEvent event(wxEVT_RADIOBUTTON);
+ event.SetEventObject(this);
+ wxPostEvent(m_virtual_tray_comboBox->GetRadioBox(), event);
+ Layout();
+ }
+ else {
+ assert(false);
+ }
+
+ check_filament_compatible();
+}
+
+std::vector CalibrationPresetPage::get_selected_filament_combobox()
+{
+ std::vector fcb_list;
+
+ if (m_ext_spool_radiobox->GetValue()) {
+ if (m_ext_spool_panel) {
+ if (m_virtual_tray_comboBox->GetRadioBox()->GetValue())
+ fcb_list.push_back(m_virtual_tray_comboBox);
+ }
+ } else if (m_ams_radiobox->GetValue()) {
+ if (m_cali_filament_mode == CalibrationFilamentMode::CALI_MODEL_MULITI) {
+ for (auto& fcb : m_filament_comboBox_list) {
+ if (fcb->GetCheckBox()->GetValue()) {
+ fcb_list.push_back(fcb);
+ }
+ }
+ }
+ else if (m_cali_filament_mode == CalibrationFilamentMode::CALI_MODEL_SINGLE) {
+ for (auto& fcb : m_filament_comboBox_list) {
+ if (fcb->GetRadioBox()->GetValue()) {
+ fcb_list.push_back(fcb);
+ }
+ }
+ }
+ } else {
+ assert(false);
+ }
+
+ return fcb_list;
+}
+
+std::map CalibrationPresetPage::get_selected_filaments()
+{
+ std::map out;
+ std::vector fcb_list = get_selected_filament_combobox();
+
+ for (int i = 0; i < fcb_list.size(); i++) {
+ Preset* preset = const_cast(fcb_list[i]->GetComboBox()->get_selected_preset());
+ // valid tray id
+ if (fcb_list[i]->get_tray_id() >= 0) {
+ out.emplace(std::make_pair(fcb_list[i]->get_tray_id(), preset));
+ }
+ }
+
+
+ return out;
+}
+
+void CalibrationPresetPage::get_preset_info(float& nozzle_dia, BedType& plate_type)
+{
+ if (m_comboBox_nozzle_dia->GetSelection() >=0 && m_comboBox_nozzle_dia->GetSelection() < NOZZLE_LIST_COUNT) {
+ nozzle_dia = nozzle_diameter_list[m_comboBox_nozzle_dia->GetSelection()];
+ } else {
+ nozzle_dia = -1.0f;
+ }
+
+ if (m_comboBox_bed_type->GetSelection() >= 0)
+ plate_type = static_cast(m_comboBox_bed_type->GetSelection() + 1);
+}
+
+void CalibrationPresetPage::get_cali_stage(CaliPresetStage& stage, float& value)
+{
+ m_cali_stage_panel->get_cali_stage(stage, value);
+}
+
+void CalibrationPresetPage::update_filament_combobox(std::string ams_id)
+{
+ for (auto& fcb : m_filament_comboBox_list) {
+ fcb->update_from_preset();
+ fcb->set_select_mode(m_cali_filament_mode);
+ }
+
+ DynamicPrintConfig empty_config;
+ empty_config.set_key_value("filament_id", new ConfigOptionStrings{ "" });
+ empty_config.set_key_value("tag_uid", new ConfigOptionStrings{ "" });
+ empty_config.set_key_value("filament_type", new ConfigOptionStrings{ "" });
+ empty_config.set_key_value("tray_name", new ConfigOptionStrings{ "" });
+ empty_config.set_key_value("filament_colour", new ConfigOptionStrings{ "" });
+ empty_config.set_key_value("filament_exist", new ConfigOptionBools{ false });
+
+ /* update virtual tray combo box*/
+ m_virtual_tray_comboBox->update_from_preset();
+ auto it = std::find_if(filament_ams_list.begin(), filament_ams_list.end(), [](auto& entry) {
+ return entry.first == VIRTUAL_TRAY_ID;
+ });
+
+ if (it != filament_ams_list.end()) {
+ m_virtual_tray_comboBox->load_tray_from_ams(VIRTUAL_TRAY_ID, it->second);
+ }
+ else {
+ m_virtual_tray_comboBox->load_tray_from_ams(VIRTUAL_TRAY_ID, empty_config);
+ }
+
+ if (filament_ams_list.empty())
+ return;
+
+ int ams_id_int = 0;
+ try {
+ if (!ams_id.empty())
+ ams_id_int = stoi(ams_id.c_str());
+
+ } catch (...) {}
+
+ for (int i = 0; i < 4; i++) {
+ int tray_index = ams_id_int * 4 + i;
+
+ auto it = std::find_if(filament_ams_list.begin(), filament_ams_list.end(), [tray_index](auto& entry) {
+ return entry.first == tray_index;
+ });
+
+ if (it != filament_ams_list.end()) {
+ m_filament_comboBox_list[i]->load_tray_from_ams(tray_index, it->second);
+ }
+ else {
+ m_filament_comboBox_list[i]->load_tray_from_ams(tray_index, empty_config);
+ }
+ }
+}
+
+Preset* CalibrationPresetPage::get_printer_preset(MachineObject* obj, float nozzle_value)
+{
+ if (!obj) return nullptr;
+
+ Preset* printer_preset = nullptr;
+ PresetBundle* preset_bundle = wxGetApp().preset_bundle;
+ for (auto printer_it = preset_bundle->printers.begin(); printer_it != preset_bundle->printers.end(); printer_it++) {
+ // only use system printer preset
+ if (!printer_it->is_system) continue;
+
+ ConfigOption* printer_nozzle_opt = printer_it->config.option("nozzle_diameter");
+ ConfigOptionFloats* printer_nozzle_vals = nullptr;
+ if (printer_nozzle_opt)
+ printer_nozzle_vals = dynamic_cast(printer_nozzle_opt);
+ std::string model_id = printer_it->get_current_printer_type(preset_bundle);
+ if (model_id.compare(obj->printer_type) == 0
+ && printer_nozzle_vals
+ && abs(printer_nozzle_vals->get_at(0) - nozzle_value) < 1e-3) {
+ printer_preset = &(*printer_it);
+ }
+ }
+
+ return printer_preset;
+}
+
+Preset* CalibrationPresetPage::get_print_preset()
+{
+ Preset* printer_preset = get_printer_preset(curr_obj, get_nozzle_value());
+
+ Preset* print_preset;
+ wxArrayString print_items;
+
+ // get default print profile
+ std::string default_print_profile_name;
+ if (printer_preset && printer_preset->config.has("default_print_profile")) {
+ default_print_profile_name = printer_preset->config.opt_string("default_print_profile");
+ }
+
+ PresetBundle* preset_bundle = wxGetApp().preset_bundle;
+ if (preset_bundle) {
+ for (auto print_it = preset_bundle->prints.begin(); print_it != preset_bundle->prints.end(); print_it++) {
+ if (print_it->name == default_print_profile_name) {
+ print_preset = &(*print_it);
+ BOOST_LOG_TRIVIAL(trace) << "CaliPresetPage: get_print_preset = " << print_preset->name;
+ }
+ }
+ }
+
+ return print_preset;
+}
+
+std::string CalibrationPresetPage::get_print_preset_name()
+{
+ Preset* print_preset = get_print_preset();
+ if (print_preset)
+ return print_preset->name;
+ return "";
+}
+
+wxArrayString CalibrationPresetPage::get_custom_range_values()
+{
+ if (m_show_custom_range && m_custom_range_panel) {
+ return m_custom_range_panel->get_values();
+ }
+ return wxArrayString();
+}
+
+MaxVolumetricSpeedPresetPage::MaxVolumetricSpeedPresetPage(
+ wxWindow *parent, CalibMode cali_mode, bool custom_range, wxWindowID id, const wxPoint &pos, const wxSize &size, long style)
+ : CalibrationPresetPage(parent, cali_mode, custom_range, id, pos, size, style)
+{
+ if (custom_range && m_custom_range_panel) {
+ wxArrayString titles;
+ titles.push_back(_L("From Volumetric Speed"));
+ titles.push_back(_L("To Volumetric Speed"));
+ titles.push_back(_L("Step"));
+ m_custom_range_panel->set_titles(titles);
+
+ m_custom_range_panel->set_unit(_L("mm\u00B3/s"));
+ }
+}
+}}
diff --git a/src/slic3r/GUI/CalibrationWizardPresetPage.hpp b/src/slic3r/GUI/CalibrationWizardPresetPage.hpp
new file mode 100644
index 0000000000..22724e82ba
--- /dev/null
+++ b/src/slic3r/GUI/CalibrationWizardPresetPage.hpp
@@ -0,0 +1,259 @@
+#ifndef slic3r_GUI_CalibrationWizardPresetPage_hpp_
+#define slic3r_GUI_CalibrationWizardPresetPage_hpp_
+
+#include "CalibrationWizardPage.hpp"
+
+namespace Slic3r { namespace GUI {
+
+enum CaliPresetStage {
+ CALI_MANULA_STAGE_NONE = 0,
+ CALI_MANUAL_STAGE_1,
+ CALI_MANUAL_STAGE_2,
+};
+
+class CaliPresetCaliStagePanel : public wxPanel
+{
+public:
+ CaliPresetCaliStagePanel(wxWindow* parent,
+ wxWindowID id = wxID_ANY,
+ const wxPoint& pos = wxDefaultPosition,
+ const wxSize& size = wxDefaultSize,
+ long style = wxTAB_TRAVERSAL);
+ void create_panel(wxWindow* parent);
+
+ void set_cali_stage(CaliPresetStage stage, float value);
+ void get_cali_stage(CaliPresetStage& stage, float& value);
+
+ void set_flow_ratio_value(wxString flow_ratio);
+
+protected:
+ CaliPresetStage m_stage;
+ wxBoxSizer* m_top_sizer;
+ wxRadioButton* m_complete_radioBox;
+ wxRadioButton* m_fine_radioBox;
+ TextInput * flow_ratio_input;
+ float m_flow_ratio_value;
+};
+
+class CaliPresetWarningPanel : public wxPanel
+{
+public:
+ CaliPresetWarningPanel(wxWindow* parent,
+ wxWindowID id = wxID_ANY,
+ const wxPoint& pos = wxDefaultPosition,
+ const wxSize& size = wxDefaultSize,
+ long style = wxTAB_TRAVERSAL);
+
+ void create_panel(wxWindow* parent);
+
+ void set_warning(wxString text);
+protected:
+ wxBoxSizer* m_top_sizer;
+ wxStaticText* m_warning_text;
+};
+
+class CaliPresetTipsPanel : public wxPanel
+{
+public:
+ CaliPresetTipsPanel(wxWindow* parent,
+ wxWindowID id = wxID_ANY,
+ const wxPoint& pos = wxDefaultPosition,
+ const wxSize& size = wxDefaultSize,
+ long style = wxTAB_TRAVERSAL);
+
+ void create_panel(wxWindow* parent);
+
+ void set_params(int nozzle_temp, int bed_temp, float max_volumetric);
+ void get_params(int& nozzle_temp, int& bed_temp, float& max_volumetric);
+protected:
+ wxBoxSizer* m_top_sizer;
+ TextInput* m_nozzle_temp;
+ TextInput* m_bed_temp;
+ TextInput* m_max_volumetric_speed;
+};
+
+class CaliPresetCustomRangePanel : public wxPanel
+{
+public:
+ CaliPresetCustomRangePanel(wxWindow* parent,
+ int input_value_nums = 3,
+ wxWindowID id = wxID_ANY,
+ const wxPoint& pos = wxDefaultPosition,
+ const wxSize& size = wxDefaultSize,
+ long style = wxTAB_TRAVERSAL);
+
+ void create_panel(wxWindow* parent);
+
+ void set_unit(wxString unit);
+ void set_titles(wxArrayString titles);
+ void set_values(wxArrayString values);
+ wxArrayString get_values();
+
+protected:
+ wxBoxSizer* m_top_sizer;
+ int m_input_value_nums;
+ std::vector m_title_texts;
+ std::vector m_value_inputs;
+};
+
+enum CaliPresetPageStatus
+{
+ CaliPresetStatusInit = 0,
+ CaliPresetStatusNormal,
+ CaliPresetStatusSending,
+};
+
+class CalibrationPresetPage : public CalibrationWizardPage
+{
+public:
+ CalibrationPresetPage(wxWindow* parent,
+ CalibMode cali_mode,
+ bool custom_range = false,
+ wxWindowID id = wxID_ANY,
+ const wxPoint& pos = wxDefaultPosition,
+ const wxSize& size = wxDefaultSize,
+ long style = wxTAB_TRAVERSAL);
+
+ void create_page(wxWindow* parent);
+
+ void update(MachineObject* obj) override;
+
+ void on_device_connected(MachineObject* obj) override;
+
+ void update_print_error_info(int code, const std::string& msg, const std::string& extra);
+
+ void show_send_failed_info(bool show, int code = 0, wxString description = wxEmptyString, wxString extra = wxEmptyString);
+
+ void set_cali_filament_mode(CalibrationFilamentMode mode) override;
+
+ void set_cali_method(CalibrationMethod method) override;
+
+ void on_cali_start_job();
+
+ void on_cali_finished_job();
+
+ void init_with_machine(MachineObject* obj);
+
+ void sync_ams_info(MachineObject* obj);
+
+ void select_default_compatible_filament();
+
+ std::vector get_selected_filament_combobox();
+
+ // key is tray_id
+ std::map get_selected_filaments();
+
+ void get_preset_info(
+ float& nozzle_dia,
+ BedType& plate_type);
+
+ void get_cali_stage(CaliPresetStage& stage, float& value);
+
+ std::shared_ptr get_sending_progress_bar() {
+ return m_send_progress_bar;
+ }
+
+ Preset* get_printer_preset(MachineObject* obj, float nozzle_value);
+ Preset* get_print_preset();
+ std::string get_print_preset_name();
+
+ wxArrayString get_custom_range_values();
+
+ CaliPresetPageStatus get_page_status() { return m_page_status; }
+protected:
+ void create_selection_panel(wxWindow* parent);
+ void create_filament_list_panel(wxWindow* parent);
+ void create_ext_spool_panel(wxWindow* parent);
+ void create_sending_panel(wxWindow* parent);
+
+ void init_selection_values();
+ void update_filament_combobox(std::string ams_id = "");
+
+ void on_select_nozzle(wxCommandEvent& evt);
+ void on_select_plate_type(wxCommandEvent& evt);
+
+ void on_choose_ams(wxCommandEvent& event);
+ void on_choose_ext_spool(wxCommandEvent& event);
+
+ void on_select_tray(wxCommandEvent& event);
+
+ void on_switch_ams(std::string ams_id = "");
+
+ void on_recommend_input_value();
+
+ void check_filament_compatible();
+ bool is_filaments_compatiable(const std::vector& prests);
+ bool is_filaments_compatiable(const std::vector& prests,
+ int& bed_temp,
+ std::string& incompatiable_filament_name,
+ std::string& error_tips);
+
+ void update_combobox_filaments(MachineObject* obj);
+
+ float get_nozzle_value();
+
+ void show_status(CaliPresetPageStatus status);
+
+ CaliPageStepGuide* m_step_panel { nullptr };
+ CaliPresetCaliStagePanel* m_cali_stage_panel { nullptr };
+ wxPanel* m_selection_panel { nullptr };
+ wxPanel* m_filament_from_panel { nullptr };
+ wxPanel* m_multi_ams_panel { nullptr };
+ wxPanel* m_filament_list_panel { nullptr };
+ wxPanel* m_ext_spool_panel { nullptr };
+ CaliPresetWarningPanel* m_warning_panel { nullptr };
+ CaliPresetCustomRangePanel* m_custom_range_panel { nullptr };
+ CaliPresetTipsPanel* m_tips_panel { nullptr };
+ wxPanel* m_sending_panel { nullptr };
+
+ wxBoxSizer* m_top_sizer;
+
+ // m_selection_panel widgets
+ ComboBox* m_comboBox_nozzle_dia;
+ ComboBox* m_comboBox_bed_type;
+ ComboBox* m_comboBox_process;
+
+ wxRadioButton* m_ams_radiobox;
+ wxRadioButton* m_ext_spool_radiobox;
+
+ ScalableButton* m_ams_sync_button;
+ FilamentComboBoxList m_filament_comboBox_list;
+ FilamentComboBox* m_virtual_tray_comboBox;
+
+ // m_sending panel widgets
+ std::shared_ptr m_send_progress_bar;
+ wxScrolledWindow* m_sw_print_failed_info { nullptr };
+ Label* m_st_txt_error_code { nullptr };
+ Label* m_st_txt_error_desc { nullptr };
+ Label* m_st_txt_extra_info { nullptr };
+ int m_print_error_code;
+ std::string m_print_error_msg;
+ std::string m_print_error_extra;
+
+ std::vector m_ams_item_list;
+
+ // for update filament combobox, key : tray_id
+ std::map filament_ams_list;
+
+ CaliPresetPageStatus m_page_status { CaliPresetPageStatus::CaliPresetStatusInit };
+
+ bool m_show_custom_range { false };
+
+ MachineObject* curr_obj { nullptr };
+};
+
+class MaxVolumetricSpeedPresetPage : public CalibrationPresetPage
+{
+public:
+ MaxVolumetricSpeedPresetPage(wxWindow * parent,
+ CalibMode cali_mode,
+ bool custom_range = false,
+ wxWindowID id = wxID_ANY,
+ const wxPoint &pos = wxDefaultPosition,
+ const wxSize & size = wxDefaultSize,
+ long style = wxTAB_TRAVERSAL);
+};
+
+}} // namespace Slic3r::GUI
+
+#endif
\ No newline at end of file
diff --git a/src/slic3r/GUI/CalibrationWizardSavePage.cpp b/src/slic3r/GUI/CalibrationWizardSavePage.cpp
new file mode 100644
index 0000000000..2c487f3336
--- /dev/null
+++ b/src/slic3r/GUI/CalibrationWizardSavePage.cpp
@@ -0,0 +1,1252 @@
+#include "CalibrationWizardSavePage.hpp"
+#include "I18N.hpp"
+#include "Widgets/Label.hpp"
+#include "MsgDialog.hpp"
+
+
+namespace Slic3r { namespace GUI {
+
+
+static wxString get_default_name(wxString filament_type, CalibMode mode){
+ switch (mode)
+ {
+ case Slic3r::CalibMode::Calib_None:
+ break;
+ case Slic3r::CalibMode::Calib_PA_Line:
+ if (filament_type.StartsWith("Generic")) {
+ filament_type.Replace("Generic", "Brand", true);
+ }
+ break;
+ case Slic3r::CalibMode::Calib_PA_Tower:
+ break;
+ case Slic3r::CalibMode::Calib_Flow_Rate:
+ filament_type += "Flow_Rate_Calibrated";
+ break;
+ case Slic3r::CalibMode::Calib_Temp_Tower:
+ filament_type += "Temperature_Calibrated";
+ break;
+ case Slic3r::CalibMode::Calib_Vol_speed_Tower:
+ filament_type += "Max_Volumetric_Speed_Calibrated";
+ break;
+ case Slic3r::CalibMode::Calib_VFA_Tower:
+ break;
+ case Slic3r::CalibMode::Calib_Retraction_tower:
+ break;
+ default:
+ break;
+ }
+ return filament_type;
+}
+
+CalibrationCommonSavePage::CalibrationCommonSavePage(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style)
+ : CalibrationWizardPage(parent, id, pos, size, style)
+{
+ ;
+}
+
+enum class GridTextInputType {
+ K,
+ N,
+ FlowRatio,
+ Name
+};
+
+class GridTextInput : public TextInput
+{
+public:
+ GridTextInput(wxWindow* parent, wxString text, wxString label, wxSize size, int col_idx, GridTextInputType type);
+ int get_col_idx() { return m_col_idx; }
+ void set_col_idx(int idx) { m_col_idx = idx; }
+ GridTextInputType get_type() { return m_type; }
+ void set_type(GridTextInputType type) { m_type = type; }
+private:
+ int m_col_idx;
+ GridTextInputType m_type;
+};
+
+GridTextInput::GridTextInput(wxWindow* parent, wxString text, wxString label, wxSize size, int col_idx, GridTextInputType type)
+ : TextInput(parent, text, label, "", wxDefaultPosition, size, wxTE_PROCESS_ENTER)
+ , m_col_idx(col_idx)
+ , m_type(type)
+{
+}
+
+class GridComboBox : public ComboBox {
+public:
+ GridComboBox(wxWindow* parent, wxSize size, int col_idx);
+ int get_col_idx() { return m_col_idx; }
+ void set_col_idx(int idx) { m_col_idx = idx; }
+private:
+ int m_col_idx;
+};
+
+GridComboBox::GridComboBox(wxWindow* parent, wxSize size, int col_idx)
+ : ComboBox(parent, wxID_ANY, "", wxDefaultPosition, size, 0, nullptr)
+ , m_col_idx(col_idx)
+{
+
+}
+
+CaliPASaveAutoPanel::CaliPASaveAutoPanel(
+ wxWindow* parent,
+ wxWindowID id,
+ const wxPoint& pos,
+ const wxSize& size,
+ long style)
+ : wxPanel(parent, id, pos, size, style)
+{
+ m_top_sizer = new wxBoxSizer(wxVERTICAL);
+
+ create_panel(this);
+
+ this->SetSizer(m_top_sizer);
+ m_top_sizer->Fit(this);
+}
+
+
+void CaliPASaveAutoPanel::create_panel(wxWindow* parent)
+{
+ auto complete_text_panel = new wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
+ wxBoxSizer* complete_text_sizer = new wxBoxSizer(wxVERTICAL);
+ auto complete_text = new wxStaticText(complete_text_panel, wxID_ANY, _L("We found the best Pressure Advance Factor"));
+ complete_text->SetFont(Label::Head_14);
+ complete_text->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
+ complete_text_sizer->Add(complete_text, 0, wxALIGN_CENTER);
+ complete_text_panel->SetSizer(complete_text_sizer);
+ m_top_sizer->Add(complete_text_panel, 0, wxALIGN_CENTER, 0);
+
+ m_top_sizer->AddSpacer(FromDIP(20));
+
+ m_grid_panel = new wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
+ m_top_sizer->Add(m_grid_panel, 0, wxALIGN_CENTER);
+}
+
+void CaliPASaveAutoPanel::sync_cali_result(const std::vector& cali_result)
+{
+ m_calib_results = cali_result;
+ m_grid_panel->DestroyChildren();
+ auto grid_sizer = new wxBoxSizer(wxHORIZONTAL);
+ const int COLUMN_GAP = FromDIP(50);
+ const int ROW_GAP = FromDIP(30);
+ wxBoxSizer* left_title_sizer = new wxBoxSizer(wxVERTICAL);
+ left_title_sizer->AddSpacer(FromDIP(52));
+ auto k_title = new wxStaticText(m_grid_panel, wxID_ANY, _L("Factor K"), wxDefaultPosition, wxDefaultSize, 0);
+ k_title->SetFont(Label::Head_14);
+ left_title_sizer->Add(k_title, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP);
+ auto n_title = new wxStaticText(m_grid_panel, wxID_ANY, _L("Factor N"), wxDefaultPosition, wxDefaultSize, 0);
+ n_title->SetFont(Label::Head_14);
+ // hide n value
+ n_title->Hide();
+ left_title_sizer->Add(n_title, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP);
+ auto brand_title = new wxStaticText(m_grid_panel, wxID_ANY, _L("Brand Name"), wxDefaultPosition, wxDefaultSize, 0);
+ brand_title->SetFont(Label::Head_14);
+ left_title_sizer->Add(brand_title, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP);
+ grid_sizer->Add(left_title_sizer);
+ grid_sizer->AddSpacer(COLUMN_GAP);
+
+ int index = 0;
+ for (auto& item : cali_result) {
+ bool result_failed = false;
+ if (item.confidence != 0)
+ result_failed = true;
+
+ wxBoxSizer* column_data_sizer = new wxBoxSizer(wxVERTICAL);
+ auto tray_title = new wxStaticText(m_grid_panel, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, 0);
+ tray_title->SetFont(Label::Head_14);
+ char prefix = 'A' + (item.tray_id / 4);
+ char suffix = '0' + 1 + item.tray_id % 4;
+ wxString tray_name = std::string(1, prefix) + std::string(1, suffix);
+ tray_title->SetLabel(tray_name);
+
+ auto k_value = new GridTextInput(m_grid_panel, "", "", CALIBRATION_FROM_TO_INPUT_SIZE, item.tray_id, GridTextInputType::K);
+ auto n_value = new GridTextInput(m_grid_panel, "", "", CALIBRATION_FROM_TO_INPUT_SIZE, item.tray_id, GridTextInputType::N);
+ k_value->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC));
+ n_value->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC));
+ auto k_value_failed = new wxStaticText(m_grid_panel, wxID_ANY, _L("Failed"), wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE);
+ auto n_value_failed = new wxStaticText(m_grid_panel, wxID_ANY, _L("Failed"), wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE);
+
+ auto comboBox_tray_name = new GridComboBox(m_grid_panel, CALIBRATION_FROM_TO_INPUT_SIZE, item.tray_id);
+ auto tray_name_failed = new wxStaticText(m_grid_panel, wxID_ANY, " - ", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE);
+ wxArrayString selections;
+ static std::vector filtered_results;
+ filtered_results.clear();
+ // TODO get history
+ //for (auto history : m_calib_results_history) {
+ // if (history.setting_id == m_filament_presets[fcb->get_tray_id()]->setting_id) {
+ // filtered_results.push_back(history);
+ // selections.push_back(history.name);
+ // }
+ //}
+ comboBox_tray_name->Set(selections);
+
+ column_data_sizer->Add(tray_title, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP);
+ column_data_sizer->Add(k_value, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP);
+ column_data_sizer->Add(n_value, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP);
+ column_data_sizer->Add(k_value_failed, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP);
+ column_data_sizer->Add(n_value_failed, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP);
+ column_data_sizer->Add(comboBox_tray_name, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP);
+ column_data_sizer->Add(tray_name_failed, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP);
+
+ auto set_edit_mode = [this, k_value, n_value, k_value_failed, n_value_failed, comboBox_tray_name, tray_name_failed](std::string str) {
+ if (str == "normal") {
+ comboBox_tray_name->Show();
+ tray_name_failed->Show(false);
+ k_value->Show();
+ n_value->Show();
+ k_value_failed->Show(false);
+ n_value_failed->Show(false);
+ }
+ if (str == "failed") {
+ comboBox_tray_name->Show(false);
+ tray_name_failed->Show();
+ k_value->Show(false);
+ n_value->Show(false);
+ k_value_failed->Show();
+ n_value_failed->Show();
+ }
+
+ // hide n value
+ n_value->Hide();
+ n_value_failed->Hide();
+
+ m_grid_panel->Layout();
+ m_grid_panel->Update();
+ };
+
+ if (!result_failed) {
+ set_edit_mode("normal");
+
+ auto k_str = wxString::Format("%.3f", item.k_value);
+ auto n_str = wxString::Format("%.3f", item.n_coef);
+ k_value->GetTextCtrl()->SetValue(k_str);
+ n_value->GetTextCtrl()->SetValue(n_str);
+ for (auto& info : m_obj->selected_cali_preset) {
+ if (item.tray_id == info.tray_id) {
+ comboBox_tray_name->SetValue(get_default_name(info.name, CalibMode::Calib_PA_Line) + "_" + tray_name);
+ break;
+ }
+ else {
+ BOOST_LOG_TRIVIAL(trace) << "CaliPASaveAutoPanel : obj->selected_cali_preset doesn't contain correct tray_id";
+ }
+ }
+
+ comboBox_tray_name->Bind(wxEVT_COMBOBOX, [this, index, comboBox_tray_name, k_value, n_value](auto& e) {
+ int selection = comboBox_tray_name->GetSelection();
+ auto history = filtered_results[selection];
+ m_calib_results[index].name = history.name;
+ });
+ }
+ else {
+ set_edit_mode("failed");
+ }
+
+ grid_sizer->Add(column_data_sizer);
+ grid_sizer->AddSpacer(COLUMN_GAP);
+ index++;
+ }
+
+ m_grid_panel->SetSizer(grid_sizer, true);
+ m_grid_panel->Bind(wxEVT_LEFT_DOWN, [this](auto& e) {
+ SetFocusIgnoringChildren();
+ });
+ Layout();
+}
+
+void CaliPASaveAutoPanel::save_to_result_from_widgets(wxWindow* window, bool* out_is_valid) {
+ if (!window)
+ return;
+
+ //operate
+ auto input = dynamic_cast(window);
+ if (input) {
+ int tray_id = input->get_col_idx();
+ if (input->get_type() == GridTextInputType::K) {
+ float k = 0.0f;
+ if (!CalibUtils::validate_input_k_value(input->GetTextCtrl()->GetValue(), &k)) {
+ MessageDialog msg_dlg(nullptr, _L("Please input a valid value (K in 0~0.5)"), wxEmptyString, wxICON_WARNING | wxOK);
+ msg_dlg.ShowModal();
+ *out_is_valid = false;
+ }
+ m_calib_results[tray_id].k_value = k;
+ }
+ else if (input->get_type() == GridTextInputType::N) {
+ }
+ }
+
+ auto comboBox = dynamic_cast(window);
+ if (comboBox) {
+ int tray_id = comboBox->get_col_idx();
+ wxString name = comboBox->GetTextCtrl()->GetValue().ToStdString();
+ if (name.IsEmpty()) {
+ MessageDialog msg_dlg(nullptr, _L("Please enter the name you want to save to printer."), wxEmptyString, wxICON_WARNING | wxOK);
+ msg_dlg.ShowModal();
+ *out_is_valid = false;
+ }
+ else if (name.Length() > 20) {
+ MessageDialog msg_dlg(nullptr, _L("The name cannot exceed 20 characters."), wxEmptyString, wxICON_WARNING | wxOK);
+ msg_dlg.ShowModal();
+ *out_is_valid = false;
+ }
+ m_calib_results[tray_id].name = name.ToStdString();
+ }
+
+ auto childern = window->GetChildren();
+ for (auto child : childern) {
+ save_to_result_from_widgets(child, out_is_valid);
+ }
+};
+
+bool CaliPASaveAutoPanel::get_result(std::vector& out_result) {
+ // Check if the value is valid and save to m_calib_results
+ bool is_valid = true;
+ save_to_result_from_widgets(m_grid_panel, &is_valid);
+ if (is_valid) {
+ out_result = m_calib_results;
+ return true;
+ }
+ else {
+ return false;
+ }
+}
+
+CaliPASaveManualPanel::CaliPASaveManualPanel(
+ wxWindow* parent,
+ wxWindowID id,
+ const wxPoint& pos,
+ const wxSize& size,
+ long style)
+ : wxPanel(parent, id, pos, size, style)
+{
+ m_top_sizer = new wxBoxSizer(wxVERTICAL);
+
+ create_panel(this);
+
+ this->SetSizer(m_top_sizer);
+ m_top_sizer->Fit(this);
+}
+
+void CaliPASaveManualPanel::create_panel(wxWindow* parent)
+{
+ auto complete_text_panel = new wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
+ wxBoxSizer* complete_text_sizer = new wxBoxSizer(wxVERTICAL);
+ auto complete_text = new wxStaticText(complete_text_panel, wxID_ANY, _L("Please find the best line on your plate"));
+ complete_text->SetFont(Label::Head_14);
+ complete_text->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
+ complete_text_sizer->Add(complete_text, 0, wxALIGN_CENTER);
+ complete_text_panel->SetSizer(complete_text_sizer);
+ m_top_sizer->Add(complete_text_panel, 0, wxALIGN_CENTER, 0);
+
+ m_top_sizer->AddSpacer(FromDIP(20));
+
+ m_record_picture = new wxStaticBitmap(parent, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0);
+ m_top_sizer->Add(m_record_picture, 0, wxALL | wxALIGN_CENTER_HORIZONTAL, 0);
+ set_save_img();
+
+ m_top_sizer->AddSpacer(FromDIP(20));
+
+ auto value_sizer = new wxBoxSizer(wxHORIZONTAL);
+ auto k_value_text = new wxStaticText(parent, wxID_ANY, _L("Factor K"), wxDefaultPosition, wxDefaultSize, 0);
+ k_value_text->Wrap(-1);
+ k_value_text->SetFont(::Label::Head_14);
+ auto n_value_text = new wxStaticText(parent, wxID_ANY, _L("Factor N"), wxDefaultPosition, wxDefaultSize, 0);
+ n_value_text->Wrap(-1);
+ n_value_text->SetFont(::Label::Head_14);
+ m_k_val = new TextInput(parent, wxEmptyString, "", "", wxDefaultPosition, CALIBRATION_OPTIMAL_INPUT_SIZE, 0);
+ m_n_val = new TextInput(parent, wxEmptyString, "", "", wxDefaultPosition, CALIBRATION_OPTIMAL_INPUT_SIZE, 0);
+ n_value_text->Hide();
+ m_n_val->Hide();
+ value_sizer->Add(k_value_text, 0, wxALIGN_CENTER_VERTICAL, 0);
+ value_sizer->AddSpacer(FromDIP(10));
+ value_sizer->Add(m_k_val, 0);
+ value_sizer->AddSpacer(FromDIP(50));
+ value_sizer->Add(n_value_text, 0, wxALIGN_CENTER_VERTICAL, 0);
+ value_sizer->AddSpacer(FromDIP(10));
+ value_sizer->Add(m_n_val, 0);
+ m_top_sizer->Add(value_sizer, 0, wxALIGN_CENTER);
+
+ m_top_sizer->AddSpacer(FromDIP(20));
+
+ auto save_text = new wxStaticText(parent, wxID_ANY, _L("Brand Name"), wxDefaultPosition, wxDefaultSize, 0);
+ save_text->SetFont(Label::Head_14);
+ m_top_sizer->Add(save_text, 0, 0, 0);
+
+ m_save_name_input = new TextInput(parent, "", "", "", wxDefaultPosition, { CALIBRATION_TEXT_MAX_LENGTH, FromDIP(24) }, 0);
+ m_top_sizer->Add(m_save_name_input, 0, 0, 0);
+
+ Bind(wxEVT_LEFT_DOWN, [this](auto& e) {
+ SetFocusIgnoringChildren();
+ });
+}
+
+void CaliPASaveManualPanel::set_save_img() {
+ m_record_picture->SetBitmap(create_scaled_bitmap("extrusion_calibration_tips_en", nullptr, 400));
+}
+
+void CaliPASaveManualPanel::set_default_name(const wxString& name) {
+ m_save_name_input->GetTextCtrl()->SetValue(name);
+}
+
+bool CaliPASaveManualPanel::get_result(PACalibResult& out_result) {
+ // Check if the value is valid
+ float k;
+ if (!CalibUtils::validate_input_k_value(m_k_val->GetTextCtrl()->GetValue(), &k)) {
+ MessageDialog msg_dlg(nullptr, _L("Please input a valid value (K in 0~0.5)"), wxEmptyString, wxICON_WARNING | wxOK);
+ msg_dlg.ShowModal();
+ return false;
+ }
+
+ wxString name = m_save_name_input->GetTextCtrl()->GetValue();
+ if (name.IsEmpty()) {
+ MessageDialog msg_dlg(nullptr, _L("Please enter the name you want to save to printer."), wxEmptyString, wxICON_WARNING | wxOK);
+ msg_dlg.ShowModal();
+ return false;
+ }
+ else if (name.Length() > 20) {
+ MessageDialog msg_dlg(nullptr, _L("The name cannot exceed 20 characters."), wxEmptyString, wxICON_WARNING | wxOK);
+ msg_dlg.ShowModal();
+ return false;
+ }
+
+ out_result.k_value = k;
+ out_result.name = name.ToStdString();
+ if (m_obj) {
+ assert(m_obj->selected_cali_preset.size() <= 1);
+ if (!m_obj->selected_cali_preset.empty()) {
+ out_result.tray_id = m_obj->selected_cali_preset[0].tray_id;
+ out_result.nozzle_diameter = m_obj->selected_cali_preset[0].nozzle_diameter;
+ out_result.filament_id = m_obj->selected_cali_preset[0].filament_id;
+ out_result.setting_id = m_obj->selected_cali_preset[0].setting_id;
+ }
+ else {
+ BOOST_LOG_TRIVIAL(trace) << "CaliPASaveManual: obj->selected_cali_preset is empty";
+ return false;
+ }
+ }
+ else {
+ BOOST_LOG_TRIVIAL(trace) << "CaliPASaveManual::get_result(): obj is nullptr";
+ return false;
+ }
+
+ return true;
+}
+
+bool CaliPASaveManualPanel::Show(bool show) {
+ if (show) {
+ if (m_obj) {
+ assert(m_obj->selected_cali_preset.size() <= 1);
+ if (!m_obj->selected_cali_preset.empty()) {
+ wxString default_name = get_default_name(m_obj->selected_cali_preset[0].name, CalibMode::Calib_PA_Line);
+ set_default_name(default_name);
+ }
+ }
+ else {
+ BOOST_LOG_TRIVIAL(trace) << "CaliPASaveManual::Show(): obj is nullptr";
+ }
+ }
+ return wxPanel::Show(show);
+}
+
+CaliPASaveP1PPanel::CaliPASaveP1PPanel(
+ wxWindow* parent,
+ wxWindowID id,
+ const wxPoint& pos,
+ const wxSize& size,
+ long style)
+ : wxPanel(parent, id, pos, size, style)
+{
+ m_top_sizer = new wxBoxSizer(wxVERTICAL);
+
+ create_panel(this);
+
+ this->SetSizer(m_top_sizer);
+ m_top_sizer->Fit(this);
+}
+
+void CaliPASaveP1PPanel::create_panel(wxWindow* parent)
+{
+ auto complete_text_panel = new wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
+ wxBoxSizer* complete_text_sizer = new wxBoxSizer(wxVERTICAL);
+ auto complete_text = new wxStaticText(complete_text_panel, wxID_ANY, _L("Please find the best line on your plate"));
+ complete_text->SetFont(Label::Head_14);
+ complete_text->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
+ complete_text_sizer->Add(complete_text, 0, wxALIGN_CENTER);
+ complete_text_panel->SetSizer(complete_text_sizer);
+ m_top_sizer->Add(complete_text_panel, 0, wxALIGN_CENTER, 0);
+
+ m_top_sizer->AddSpacer(FromDIP(20));
+
+ m_record_picture = new wxStaticBitmap(parent, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0);
+ m_top_sizer->Add(m_record_picture, 0, wxALL | wxALIGN_CENTER_HORIZONTAL, 0);
+ set_save_img();
+
+ m_top_sizer->AddSpacer(FromDIP(20));
+
+ auto value_sizer = new wxBoxSizer(wxHORIZONTAL);
+ auto k_value_text = new wxStaticText(parent, wxID_ANY, _L("Factor K"), wxDefaultPosition, wxDefaultSize, 0);
+ k_value_text->Wrap(-1);
+ k_value_text->SetFont(::Label::Head_14);
+ auto n_value_text = new wxStaticText(parent, wxID_ANY, _L("Factor N"), wxDefaultPosition, wxDefaultSize, 0);
+ n_value_text->Wrap(-1);
+ n_value_text->SetFont(::Label::Head_14);
+ m_k_val = new TextInput(parent, wxEmptyString, "", "", wxDefaultPosition, CALIBRATION_OPTIMAL_INPUT_SIZE, 0);
+ m_n_val = new TextInput(parent, wxEmptyString, "", "", wxDefaultPosition, CALIBRATION_OPTIMAL_INPUT_SIZE, 0);
+ n_value_text->Hide();
+ m_n_val->Hide();
+ value_sizer->Add(k_value_text, 0, wxALIGN_CENTER_VERTICAL, 0);
+ value_sizer->AddSpacer(FromDIP(10));
+ value_sizer->Add(m_k_val, 0);
+ value_sizer->AddSpacer(FromDIP(50));
+ value_sizer->Add(n_value_text, 0, wxALIGN_CENTER_VERTICAL, 0);
+ value_sizer->AddSpacer(FromDIP(10));
+ value_sizer->Add(m_n_val, 0);
+ m_top_sizer->Add(value_sizer, 0, wxALIGN_CENTER);
+
+ Bind(wxEVT_LEFT_DOWN, [this](auto& e) {
+ SetFocusIgnoringChildren();
+ });
+}
+
+void CaliPASaveP1PPanel::set_save_img() {
+ m_record_picture->SetBitmap(create_scaled_bitmap("extrusion_calibration_tips_en", nullptr, 400));
+}
+
+bool CaliPASaveP1PPanel::get_result(float* out_k, float* out_n){
+ // Check if the value is valid
+ if (!CalibUtils::validate_input_k_value(m_k_val->GetTextCtrl()->GetValue(), out_k)) {
+ MessageDialog msg_dlg(nullptr, _L("Please input a valid value (K in 0~0.5)"), wxEmptyString, wxICON_WARNING | wxOK);
+ msg_dlg.ShowModal();
+ return false;
+ }
+ return true;
+}
+
+CaliSavePresetValuePanel::CaliSavePresetValuePanel(
+ wxWindow *parent,
+ wxWindowID id,
+ const wxPoint &pos,
+ const wxSize &size,
+ long style)
+ : wxPanel(parent, id, pos, size, style)
+{
+ m_top_sizer = new wxBoxSizer(wxVERTICAL);
+
+ create_panel(this);
+
+ this->SetSizer(m_top_sizer);
+ m_top_sizer->Fit(this);
+}
+
+void CaliSavePresetValuePanel::create_panel(wxWindow *parent)
+{
+ m_record_picture = new wxStaticBitmap(parent, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0);
+
+ m_value_title = new wxStaticText(parent, wxID_ANY, _L("Input Value"), wxDefaultPosition, wxDefaultSize, 0);
+ m_value_title->SetFont(Label::Head_14);
+ m_value_title->Wrap(-1);
+ m_input_value = new TextInput(parent, wxEmptyString, "", "", wxDefaultPosition, CALIBRATION_OPTIMAL_INPUT_SIZE, wxTE_PROCESS_ENTER);
+ m_input_value->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC));
+
+ m_save_name_title = new wxStaticText(parent, wxID_ANY, _L("Save to Filament Preset"), wxDefaultPosition, wxDefaultSize, 0);
+ m_save_name_title->Wrap(-1);
+ m_save_name_title->SetFont(Label::Head_14);
+
+ m_input_name = new TextInput(parent, wxEmptyString, "", "", wxDefaultPosition, {CALIBRATION_TEXT_MAX_LENGTH, FromDIP(24)}, 0);
+
+ m_top_sizer->Add(m_record_picture, 0, wxALIGN_CENTER);
+ m_top_sizer->AddSpacer(FromDIP(20));
+ m_top_sizer->Add(m_value_title, 0, wxALIGN_CENTER);
+ m_top_sizer->AddSpacer(FromDIP(10));
+ m_top_sizer->Add(m_input_value, 0, wxALIGN_CENTER);
+ m_top_sizer->AddSpacer(FromDIP(20));
+ m_top_sizer->Add(m_save_name_title, 0, wxALIGN_CENTER);
+ m_top_sizer->AddSpacer(FromDIP(10));
+ m_top_sizer->Add(m_input_name, 0, wxALIGN_CENTER);
+}
+
+void CaliSavePresetValuePanel::set_img(const std::string& bmp_name_in)
+{
+ m_record_picture->SetBitmap(create_scaled_bitmap(bmp_name_in, nullptr, 400));
+}
+
+void CaliSavePresetValuePanel::set_value_title(const wxString& title) {
+ m_value_title->SetLabel(title);
+}
+
+void CaliSavePresetValuePanel::set_save_name_title(const wxString& title) {
+ m_save_name_title->SetLabel(title);
+}
+
+void CaliSavePresetValuePanel::get_value(double& value)
+{
+ m_input_value->GetTextCtrl()->GetValue().ToDouble(&value);
+}
+
+void CaliSavePresetValuePanel::get_save_name(std::string& name)
+{
+ name = m_input_name->GetTextCtrl()->GetValue().ToStdString();
+}
+
+void CaliSavePresetValuePanel::set_save_name(const std::string& name)
+{
+ m_input_name->GetTextCtrl()->SetValue(name);
+}
+
+CalibrationPASavePage::CalibrationPASavePage(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style)
+ : CalibrationCommonSavePage(parent, id, pos, size, style)
+{
+ m_cali_mode = CalibMode::Calib_PA_Line;
+
+ m_page_type = CaliPageType::CALI_PAGE_PA_SAVE;
+
+ m_top_sizer = new wxBoxSizer(wxVERTICAL);
+
+ create_page(this);
+
+ this->SetSizer(m_top_sizer);
+ m_top_sizer->Fit(this);
+}
+
+void CalibrationPASavePage::create_page(wxWindow* parent)
+{
+ m_page_caption = new CaliPageCaption(parent, m_cali_mode);
+ m_page_caption->show_prev_btn(true);
+ m_top_sizer->Add(m_page_caption, 0, wxEXPAND, 0);
+
+ wxArrayString steps;
+ steps.Add(_L("Preset"));
+ steps.Add(_L("Calibration"));
+ steps.Add(_L("Record"));
+ m_step_panel = new CaliPageStepGuide(parent, steps);
+ m_step_panel->set_steps(2);
+ m_top_sizer->Add(m_step_panel, 0, wxEXPAND, 0);
+
+ m_manual_panel = new CaliPASaveManualPanel(parent, wxID_ANY);
+ m_auto_panel = new CaliPASaveAutoPanel(parent, wxID_ANY);
+ m_p1p_panel = new CaliPASaveP1PPanel(parent, wxID_ANY);
+
+ m_top_sizer->Add(m_manual_panel, 0);
+ m_top_sizer->Add(m_auto_panel, 0);
+ m_top_sizer->Add(m_p1p_panel, 0);
+
+ m_action_panel = new CaliPageActionPanel(parent, m_cali_mode, CaliPageType::CALI_PAGE_PA_SAVE);
+ m_top_sizer->Add(m_action_panel, 0, wxEXPAND, 0);
+}
+
+void CalibrationPASavePage::sync_cali_result(MachineObject* obj)
+{
+ // only auto need sync cali_result
+ if (obj && m_cali_method == CalibrationMethod::CALI_METHOD_AUTO) {
+ m_auto_panel->sync_cali_result(obj->pa_calib_results);
+ } else {
+ std::vector empty_result;
+ m_auto_panel->sync_cali_result(empty_result);
+ }
+}
+
+void CalibrationPASavePage::show_panels(CalibrationMethod method, const std::string& printer_type) {
+ if (printer_type == "BL-P001"
+ || printer_type == "BL-P002") {
+ if (method == CalibrationMethod::CALI_METHOD_MANUAL) {
+ m_manual_panel->Show();
+ m_auto_panel->Show(false);
+ }
+ else {
+ m_auto_panel->Show();
+ m_manual_panel->Show(false);
+ }
+ m_p1p_panel->Show(false);
+ }
+ else if (printer_type == "C11"
+ || printer_type == "C12") {
+ m_auto_panel->Show(false);
+ m_manual_panel->Show(false);
+ m_p1p_panel->Show();
+ }
+ Layout();
+}
+
+void CalibrationPASavePage::set_cali_method(CalibrationMethod method)
+{
+ CalibrationWizardPage::set_cali_method(method);
+ if (curr_obj) {
+ show_panels(method, curr_obj->printer_type);
+ }
+}
+
+void CalibrationPASavePage::on_device_connected(MachineObject* obj)
+{
+ ;
+}
+
+void CalibrationPASavePage::update(MachineObject* obj)
+{
+ CalibrationWizardPage::update(obj);
+
+ if (m_auto_panel && m_auto_panel->IsShown())
+ m_auto_panel->set_machine_obj(obj);
+ if (m_manual_panel && m_manual_panel->IsShown())
+ m_manual_panel->set_machine_obj(obj);
+}
+
+CalibrationFlowX1SavePage::CalibrationFlowX1SavePage(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style)
+ : CalibrationCommonSavePage(parent, id, pos, size, style)
+{
+ m_cali_mode = CalibMode::Calib_Flow_Rate;
+
+ m_page_type = CaliPageType::CALI_PAGE_FLOW_SAVE;
+
+ m_top_sizer = new wxBoxSizer(wxVERTICAL);
+
+ create_page(this);
+
+ this->SetSizer(m_top_sizer);
+ m_top_sizer->Fit(this);
+}
+
+void CalibrationFlowX1SavePage::create_page(wxWindow* parent)
+{
+ m_page_caption = new CaliPageCaption(parent, m_cali_mode);
+ m_page_caption->show_prev_btn(true);
+ m_top_sizer->Add(m_page_caption, 0, wxEXPAND, 0);
+
+ wxArrayString steps;
+ steps.Add(_L("Preset"));
+ steps.Add(_L("Calibration"));
+ steps.Add(_L("Record"));
+ m_step_panel = new CaliPageStepGuide(parent, steps);
+ m_step_panel->set_steps(2);
+ m_top_sizer->Add(m_step_panel, 0, wxEXPAND, 0);
+
+ auto complete_text_panel = new wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
+ wxBoxSizer* complete_text_sizer = new wxBoxSizer(wxVERTICAL);
+ auto complete_text = new wxStaticText(complete_text_panel, wxID_ANY, _L("We found the best flow ratio for you"));
+ complete_text->SetFont(Label::Head_14);
+ complete_text->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
+ complete_text_sizer->Add(complete_text, 0, wxALIGN_CENTER);
+ complete_text_panel->SetSizer(complete_text_sizer);
+ m_top_sizer->Add(complete_text_panel, 0, wxALIGN_CENTER, 0);
+
+ m_top_sizer->AddSpacer(FromDIP(20));
+
+ m_grid_panel = new wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
+ m_top_sizer->Add(m_grid_panel, 0, wxALIGN_CENTER);
+
+ m_action_panel = new CaliPageActionPanel(parent, m_cali_mode, CaliPageType::CALI_PAGE_FLOW_SAVE);
+ m_top_sizer->Add(m_action_panel, 0, wxEXPAND, 0);
+}
+
+void CalibrationFlowX1SavePage::sync_cali_result(const std::vector& cali_result)
+{
+ m_save_results.clear();
+ m_grid_panel->DestroyChildren();
+ wxBoxSizer* grid_sizer = new wxBoxSizer(wxHORIZONTAL);
+ const int COLUMN_GAP = FromDIP(50);
+ const int ROW_GAP = FromDIP(30);
+ wxBoxSizer* left_title_sizer = new wxBoxSizer(wxVERTICAL);
+ left_title_sizer->AddSpacer(FromDIP(49));
+ auto flow_ratio_title = new wxStaticText(m_grid_panel, wxID_ANY, _L("Flow Ratio"), wxDefaultPosition, wxDefaultSize, 0);
+ flow_ratio_title->SetFont(Label::Head_14);
+ left_title_sizer->Add(flow_ratio_title, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP);
+ auto brand_title = new wxStaticText(m_grid_panel, wxID_ANY, _L("Brand Name"), wxDefaultPosition, wxDefaultSize, 0);
+ brand_title->SetFont(Label::Head_14);
+ left_title_sizer->Add(brand_title, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP);
+ grid_sizer->Add(left_title_sizer);
+ grid_sizer->AddSpacer(COLUMN_GAP);
+
+ for (auto& item : cali_result) {
+ bool result_failed = false;
+ if (item.confidence != 0)
+ result_failed = true;
+
+ wxBoxSizer* column_data_sizer = new wxBoxSizer(wxVERTICAL);
+ auto tray_title = new wxStaticText(m_grid_panel, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, 0);
+ tray_title->SetFont(Label::Head_14);
+ char prefix = 'A' + (item.tray_id / 4);
+ char suffix = '0' + 1 + item.tray_id % 4;
+ wxString tray_name = std::string(1, prefix) + std::string(1, suffix);
+ tray_title->SetLabel(tray_name);
+
+ auto flow_ratio_value = new GridTextInput(m_grid_panel, "", "", CALIBRATION_FROM_TO_INPUT_SIZE, item.tray_id, GridTextInputType::FlowRatio);
+ flow_ratio_value->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC));
+ auto flow_ratio_value_failed = new wxStaticText(m_grid_panel, wxID_ANY, _L("Failed"), wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE);
+
+ auto save_name_input = new GridTextInput(m_grid_panel, "", "", CALIBRATION_FROM_TO_INPUT_SIZE, item.tray_id, GridTextInputType::Name);
+ auto save_name_input_failed = new wxStaticText(m_grid_panel, wxID_ANY, " - ", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE);
+
+ column_data_sizer->Add(tray_title, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP);
+ column_data_sizer->Add(flow_ratio_value, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP);
+ column_data_sizer->Add(flow_ratio_value_failed, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP);
+ column_data_sizer->Add(save_name_input, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP);
+ column_data_sizer->Add(save_name_input_failed, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP);
+
+ auto set_edit_mode = [this, flow_ratio_value, flow_ratio_value_failed, save_name_input, save_name_input_failed](std::string str) {
+ if (str == "normal") {
+ save_name_input->Show();
+ save_name_input_failed->Show(false);
+ flow_ratio_value->Show();
+ flow_ratio_value_failed->Show(false);
+ }
+ if (str == "failed") {
+ save_name_input->Show(false);
+ save_name_input_failed->Show();
+ flow_ratio_value->Show(false);
+ flow_ratio_value_failed->Show();
+ }
+ m_grid_panel->Layout();
+ m_grid_panel->Update();
+ };
+
+ if (!result_failed) {
+ set_edit_mode("normal");
+
+ auto flow_ratio_str = wxString::Format("%.3f", item.flow_ratio);
+ flow_ratio_value->GetTextCtrl()->SetValue(flow_ratio_str);
+ for (auto& info : curr_obj->selected_cali_preset) {
+ if (item.tray_id == info.tray_id) {
+ save_name_input->GetTextCtrl()->SetValue(get_default_name(info.name, CalibMode::Calib_Flow_Rate) + "_" + tray_name);
+ break;
+ }
+ else {
+ BOOST_LOG_TRIVIAL(trace) << "CalibrationFlowX1Save : obj->selected_cali_preset doesn't contain correct tray_id";
+ }
+ }
+ }
+ else {
+ set_edit_mode("failed");
+ }
+
+ grid_sizer->Add(column_data_sizer);
+ grid_sizer->AddSpacer(COLUMN_GAP);
+ }
+ m_grid_panel->Bind(wxEVT_LEFT_DOWN, [this](auto& e) {
+ m_grid_panel->SetFocusIgnoringChildren();
+ });
+ m_grid_panel->SetSizer(grid_sizer, true);
+ Layout();
+}
+
+void CalibrationFlowX1SavePage::save_to_result_from_widgets(wxWindow* window, bool* out_is_valid)
+{
+ if (!window)
+ return;
+
+ //operate
+ auto input = dynamic_cast(window);
+ if (input) {
+ int tray_id = input->get_col_idx();
+ if (input->get_type() == GridTextInputType::FlowRatio) {
+ float flow_ratio = 0.0f;
+ if (!CalibUtils::validate_input_flow_ratio(input->GetTextCtrl()->GetValue(), &flow_ratio)) {
+ MessageDialog msg_dlg(nullptr, _L("Please input a valid value (0.0 < flow ratio < 0.2)"), wxEmptyString, wxICON_WARNING | wxOK);
+ msg_dlg.ShowModal();
+ *out_is_valid = false;
+ }
+ m_save_results[tray_id].second = flow_ratio;
+ }
+ else if (input->get_type() == GridTextInputType::Name) {
+ if (input->GetTextCtrl()->GetValue().IsEmpty()) {
+ MessageDialog msg_dlg(nullptr, _L("Please enter the name of the preset you want to save."), wxEmptyString, wxICON_WARNING | wxOK);
+ msg_dlg.ShowModal();
+ *out_is_valid = false;
+ }
+ m_save_results[tray_id].first = input->GetTextCtrl()->GetValue().ToStdString();
+ }
+ }
+
+ auto childern = window->GetChildren();
+ for (auto child : childern) {
+ save_to_result_from_widgets(child, out_is_valid);
+ }
+}
+
+bool CalibrationFlowX1SavePage::get_result(std::vector>& out_results)
+{
+ // Check if the value is valid and save to m_calib_results
+ bool is_valid = true;
+ save_to_result_from_widgets(m_grid_panel, &is_valid);
+ if (is_valid) {
+ // obj->cali_result contain failure results, so use m_save_results to record value
+ for (auto& item : m_save_results) {
+ out_results.push_back(item.second);
+ }
+ return true;
+ }
+ else {
+ return false;
+ }
+}
+
+CalibrationFlowCoarseSavePage::CalibrationFlowCoarseSavePage(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style)
+ : CalibrationCommonSavePage(parent, id, pos, size, style)
+{
+ m_cali_mode = CalibMode::Calib_Flow_Rate;
+
+ m_page_type = CaliPageType::CALI_PAGE_COARSE_SAVE;
+
+ m_top_sizer = new wxBoxSizer(wxVERTICAL);
+
+ create_page(this);
+
+ this->SetSizer(m_top_sizer);
+ m_top_sizer->Fit(this);
+}
+
+void CalibrationFlowCoarseSavePage::create_page(wxWindow* parent)
+{
+ m_page_caption = new CaliPageCaption(parent, m_cali_mode);
+ m_page_caption->show_prev_btn(true);
+ m_top_sizer->Add(m_page_caption, 0, wxEXPAND, 0);
+
+ wxArrayString steps;
+ steps.Add(_L("Preset"));
+ steps.Add(_L("Calibration1"));
+ steps.Add(_L("Calibration2"));
+ steps.Add(_L("Record"));
+ m_step_panel = new CaliPageStepGuide(parent, steps);
+ m_step_panel->set_steps(1);
+ m_top_sizer->Add(m_step_panel, 0, wxEXPAND, 0);
+
+ auto complete_text = new wxStaticText(parent, wxID_ANY, _L("Please find the best object on your plate"), wxDefaultPosition, wxDefaultSize, 0);
+ complete_text->SetFont(Label::Head_14);
+ complete_text->Wrap(-1);
+ m_top_sizer->Add(complete_text, 0, 0, 0);
+ m_top_sizer->AddSpacer(FromDIP(20));
+
+ m_record_picture = new wxStaticBitmap(parent, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0);
+ m_top_sizer->Add(m_record_picture, 0, wxALIGN_CENTER, 0);
+ set_save_img();
+
+ m_top_sizer->AddSpacer(FromDIP(20));
+
+ auto coarse_value_sizer = new wxBoxSizer(wxVERTICAL);
+ auto coarse_value_text = new wxStaticText(parent, wxID_ANY, _L("Fill in the value above the block with smoothest top surface"), wxDefaultPosition, wxDefaultSize, 0);
+ coarse_value_text->SetFont(Label::Head_14);
+ coarse_value_text->Wrap(-1);
+ m_optimal_block_coarse = new ComboBox(parent, wxID_ANY, "", wxDefaultPosition, CALIBRATION_OPTIMAL_INPUT_SIZE, 0, nullptr, wxCB_READONLY);
+ wxArrayString coarse_block_items;
+ for (int i = 0; i < 9; i++) {
+ coarse_block_items.Add(std::to_string(-20 + (i * 5)));
+ }
+ m_optimal_block_coarse->Set(coarse_block_items);
+ auto coarse_calc_result_text = new wxStaticText(parent, wxID_ANY, "");
+ coarse_value_sizer->Add(coarse_value_text, 0, 0);
+ coarse_value_sizer->Add(m_optimal_block_coarse, 0, 0);
+ coarse_value_sizer->Add(coarse_calc_result_text, 0);
+ m_top_sizer->Add(coarse_value_sizer, 0, 0, 0);
+ m_top_sizer->AddSpacer(FromDIP(20));
+
+ auto checkBox_panel = new wxPanel(parent);
+ auto cb_sizer = new wxBoxSizer(wxHORIZONTAL);
+ checkBox_panel->SetSizer(cb_sizer);
+ auto checkBox_skip_calibration = new CheckBox(checkBox_panel);
+ cb_sizer->Add(checkBox_skip_calibration);
+
+ auto cb_text = new wxStaticText(checkBox_panel, wxID_ANY, _L("Skip Calibration2"));
+ cb_sizer->Add(cb_text);
+ cb_text->Bind(wxEVT_LEFT_DOWN, [this, checkBox_skip_calibration](auto&) {
+ checkBox_skip_calibration->SetValue(!checkBox_skip_calibration->GetValue());
+ wxCommandEvent event(wxEVT_TOGGLEBUTTON);
+ event.SetEventObject(checkBox_skip_calibration);
+ checkBox_skip_calibration->GetEventHandler()->ProcessEvent(event);
+ });
+
+ m_top_sizer->Add(checkBox_panel, 0, 0, 0);
+
+ auto save_panel = new wxPanel(parent);
+ auto save_sizer = new wxBoxSizer(wxVERTICAL);
+ save_panel->SetSizer(save_sizer);
+
+ auto save_text = new wxStaticText(save_panel, wxID_ANY, _L("Save to Filament Preset"), wxDefaultPosition, wxDefaultSize, 0);
+ save_text->Wrap(-1);
+ save_text->SetFont(Label::Head_14);
+ save_sizer->Add(save_text, 0, 0, 0);
+
+ m_save_name_input = new TextInput(save_panel, "", "", "", wxDefaultPosition, {CALIBRATION_TEXT_MAX_LENGTH, FromDIP(24)}, 0);
+ save_sizer->Add(m_save_name_input, 0, 0, 0);
+
+ m_top_sizer->Add(save_panel, 0, 0, 0);
+ save_panel->Hide();
+
+ checkBox_skip_calibration->Bind(wxEVT_TOGGLEBUTTON, [this, save_panel, checkBox_skip_calibration](wxCommandEvent& e) {
+ if (checkBox_skip_calibration->GetValue()) {
+ m_skip_fine_calibration = true;
+ save_panel->Show();
+ m_action_panel->show_button(CaliPageActionType::CALI_ACTION_FLOW_COARSE_SAVE);
+ m_action_panel->show_button(CaliPageActionType::CALI_ACTION_FLOW_CALI_STAGE_2, false);
+ }
+ else {
+ m_skip_fine_calibration = false;
+ save_panel->Hide();
+ m_action_panel->show_button(CaliPageActionType::CALI_ACTION_FLOW_COARSE_SAVE, false);
+ m_action_panel->show_button(CaliPageActionType::CALI_ACTION_FLOW_CALI_STAGE_2);
+ }
+ Layout();
+ e.Skip();
+ });
+
+ m_optimal_block_coarse->Bind(wxEVT_COMBOBOX, [this, coarse_calc_result_text](auto& e) {
+ m_coarse_flow_ratio = m_curr_flow_ratio * (100.0f + stof(m_optimal_block_coarse->GetValue().ToStdString())) / 100.0f;
+ coarse_calc_result_text->SetLabel(wxString::Format(_L("flow ratio : %s "), std::to_string(m_coarse_flow_ratio)));
+ });
+
+ m_action_panel = new CaliPageActionPanel(parent, m_cali_mode, CaliPageType::CALI_PAGE_COARSE_SAVE);
+ m_action_panel->show_button(CaliPageActionType::CALI_ACTION_FLOW_COARSE_SAVE, false);
+ m_top_sizer->Add(m_action_panel, 0, wxEXPAND, 0);
+}
+
+void CalibrationFlowCoarseSavePage::set_save_img() {
+ m_record_picture->SetBitmap(create_scaled_bitmap("flow_rate_calibration", nullptr, 400));
+}
+
+void CalibrationFlowCoarseSavePage::set_default_name(const wxString& name) {
+ m_save_name_input->GetTextCtrl()->SetValue(name);
+}
+
+bool CalibrationFlowCoarseSavePage::is_skip_fine_calibration() {
+ return m_skip_fine_calibration;
+}
+
+void CalibrationFlowCoarseSavePage::set_curr_flow_ratio(const float value) {
+ m_curr_flow_ratio = value;
+}
+
+bool CalibrationFlowCoarseSavePage::get_result(float* out_value, wxString* out_name) {
+ if (!m_skip_fine_calibration)
+ return false;
+
+ // Check if the value is valid
+ if (m_coarse_flow_ratio <= 0.0 || m_coarse_flow_ratio >= 2.0) {
+ MessageDialog msg_dlg(nullptr, _L("Please choose a block with smoothest top surface"), wxEmptyString, wxICON_WARNING | wxOK);
+ msg_dlg.ShowModal();
+ return false;
+ }
+ if (m_save_name_input->GetTextCtrl()->GetValue().IsEmpty()) {
+ MessageDialog msg_dlg(nullptr, _L("Please enter the name of the preset you want to save."), wxEmptyString, wxICON_WARNING | wxOK);
+ msg_dlg.ShowModal();
+ return false;
+ }
+ *out_value = m_coarse_flow_ratio;
+ *out_name = m_save_name_input->GetTextCtrl()->GetValue();
+ return true;
+}
+
+bool CalibrationFlowCoarseSavePage::Show(bool show) {
+ if (show) {
+ if (curr_obj) {
+ assert(curr_obj->selected_cali_preset.size() <= 1);
+ if (!curr_obj->selected_cali_preset.empty()) {
+ wxString default_name = get_default_name(curr_obj->selected_cali_preset[0].name, CalibMode::Calib_Flow_Rate);
+ set_default_name(default_name);
+ }
+ }
+ else {
+ BOOST_LOG_TRIVIAL(trace) << "CalibrationFlowCoarseSave::Show(): obj is nullptr";
+ }
+ }
+ return wxPanel::Show(show);
+}
+
+CalibrationFlowFineSavePage::CalibrationFlowFineSavePage(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style)
+ : CalibrationCommonSavePage(parent, id, pos, size, style)
+{
+ m_cali_mode = CalibMode::Calib_Flow_Rate;
+
+ m_page_type = CaliPageType::CALI_PAGE_FINE_SAVE;
+
+ m_top_sizer = new wxBoxSizer(wxVERTICAL);
+
+ create_page(this);
+
+ this->SetSizer(m_top_sizer);
+ m_top_sizer->Fit(this);
+}
+
+void CalibrationFlowFineSavePage::create_page(wxWindow* parent)
+{
+ m_page_caption = new CaliPageCaption(parent, m_cali_mode);
+ m_page_caption->show_prev_btn(true);
+ m_top_sizer->Add(m_page_caption, 0, wxEXPAND, 0);
+
+ wxArrayString steps;
+ steps.Add(_L("Preset"));
+ steps.Add(_L("Calibration1"));
+ steps.Add(_L("Calibration2"));
+ steps.Add(_L("Record"));
+ m_step_panel = new CaliPageStepGuide(parent, steps);
+ m_step_panel->set_steps(3);
+ m_top_sizer->Add(m_step_panel, 0, wxEXPAND, 0);
+
+ auto complete_text = new wxStaticText(parent, wxID_ANY, _L("Please find the best object on your plate"), wxDefaultPosition, wxDefaultSize, 0);
+ complete_text->SetFont(Label::Head_14);
+ complete_text->Wrap(-1);
+ m_top_sizer->Add(complete_text, 0, 0, 0);
+ m_top_sizer->AddSpacer(FromDIP(20));
+
+ m_record_picture = new wxStaticBitmap(parent, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0);
+ m_top_sizer->Add(m_record_picture, 0, wxALIGN_CENTER, 0);
+ set_save_img();
+
+ m_top_sizer->AddSpacer(FromDIP(20));
+
+ auto fine_value_sizer = new wxBoxSizer(wxVERTICAL);
+ auto fine_value_text = new wxStaticText(parent, wxID_ANY, _L("Fill in the value above the block with smoothest top surface"), wxDefaultPosition, wxDefaultSize, 0);
+ fine_value_text->Wrap(-1);
+ fine_value_text->SetFont(::Label::Head_14);
+ m_optimal_block_fine = new ComboBox(parent, wxID_ANY, "", wxDefaultPosition, CALIBRATION_OPTIMAL_INPUT_SIZE, 0, nullptr, wxCB_READONLY);
+ wxArrayString fine_block_items;
+ for (int i = 0; i < 10; i++) {
+ fine_block_items.Add(std::to_string(-9 + (i)));
+ }
+ m_optimal_block_fine->Set(fine_block_items);
+ auto fine_calc_result_text = new wxStaticText(parent, wxID_ANY, "");
+ fine_value_sizer->Add(fine_value_text, 0, 0);
+ fine_value_sizer->Add(m_optimal_block_fine, 0, 0);
+ fine_value_sizer->Add(fine_calc_result_text, 0);
+ m_top_sizer->Add(fine_value_sizer, 0, 0, 0);
+ m_top_sizer->AddSpacer(FromDIP(20));
+
+ auto save_text = new wxStaticText(parent, wxID_ANY, _L("Save to Filament Preset"), wxDefaultPosition, wxDefaultSize, 0);
+ save_text->Wrap(-1);
+ save_text->SetFont(Label::Head_14);
+ m_top_sizer->Add(save_text, 0, 0, 0);
+
+ m_save_name_input = new TextInput(parent, "", "", "", wxDefaultPosition, {CALIBRATION_TEXT_MAX_LENGTH, FromDIP(24)}, 0);
+ m_top_sizer->Add(m_save_name_input, 0, 0, 0);
+
+ m_optimal_block_fine->Bind(wxEVT_COMBOBOX, [this, fine_calc_result_text](auto& e) {
+ m_fine_flow_ratio = m_curr_flow_ratio * (100.0f + stof(m_optimal_block_fine->GetValue().ToStdString())) / 100.0f;
+ fine_calc_result_text->SetLabel(wxString::Format(_L("flow ratio : %s "), std::to_string(m_fine_flow_ratio)));
+ });
+
+ m_action_panel = new CaliPageActionPanel(parent, m_cali_mode, CaliPageType::CALI_PAGE_FINE_SAVE);
+ m_top_sizer->Add(m_action_panel, 0, wxEXPAND, 0);
+}
+
+void CalibrationFlowFineSavePage::set_save_img() {
+ m_record_picture->SetBitmap(create_scaled_bitmap("flow_rate_calibration_fine", nullptr, 400));
+}
+
+void CalibrationFlowFineSavePage::set_default_name(const wxString& name) {
+ m_save_name_input->GetTextCtrl()->SetValue(name);
+}
+
+void CalibrationFlowFineSavePage::set_curr_flow_ratio(const float value) {
+ m_curr_flow_ratio = value;
+}
+
+bool CalibrationFlowFineSavePage::get_result(float* out_value, wxString* out_name) {
+ // Check if the value is valid
+ if (m_fine_flow_ratio <= 0.0 || m_fine_flow_ratio >= 2.0) {
+ MessageDialog msg_dlg(nullptr, _L("Please choose a block with smoothest top surface."), wxEmptyString, wxICON_WARNING | wxOK);
+ msg_dlg.ShowModal();
+ return false;
+ }
+ if (m_save_name_input->GetTextCtrl()->GetValue().IsEmpty()) {
+ MessageDialog msg_dlg(nullptr, _L("Please enter the name of the preset you want to save."), wxEmptyString, wxICON_WARNING | wxOK);
+ msg_dlg.ShowModal();
+ return false;
+ }
+ *out_value = m_fine_flow_ratio;
+ *out_name = m_save_name_input->GetTextCtrl()->GetValue();
+ return true;
+}
+
+bool CalibrationFlowFineSavePage::Show(bool show) {
+ if (show) {
+ if (curr_obj) {
+ assert(curr_obj->selected_cali_preset.size() <= 1);
+ if (!curr_obj->selected_cali_preset.empty()) {
+ wxString default_name = get_default_name(curr_obj->selected_cali_preset[0].name, CalibMode::Calib_Flow_Rate);
+ set_default_name(default_name);
+ }
+ }
+ else {
+ BOOST_LOG_TRIVIAL(trace) << "CalibrationFlowFineSave::Show(): obj is nullptr";
+ }
+ }
+ return wxPanel::Show(show);
+}
+
+CalibrationMaxVolumetricSpeedSavePage::CalibrationMaxVolumetricSpeedSavePage(
+ wxWindow *parent,
+ wxWindowID id,
+ const wxPoint &pos,
+ const wxSize &size,
+ long style)
+ : CalibrationCommonSavePage(parent, id, pos, size, style)
+{
+ m_cali_mode = CalibMode::Calib_Vol_speed_Tower;
+
+ m_page_type = CaliPageType::CALI_PAGE_COMMON_SAVE;
+
+ m_top_sizer = new wxBoxSizer(wxVERTICAL);
+
+ create_page(this);
+
+ this->SetSizer(m_top_sizer);
+ m_top_sizer->Fit(this);
+}
+
+void CalibrationMaxVolumetricSpeedSavePage::create_page(wxWindow *parent)
+{
+ m_page_caption = new CaliPageCaption(parent, m_cali_mode);
+ m_page_caption->show_prev_btn(true);
+ m_top_sizer->Add(m_page_caption, 0, wxEXPAND, 0);
+
+ wxArrayString steps;
+ steps.Add(_L("Preset"));
+ steps.Add(_L("Calibration"));
+ steps.Add(_L("Record"));
+ m_step_panel = new CaliPageStepGuide(parent, steps);
+ m_step_panel->set_steps(2);
+ m_top_sizer->Add(m_step_panel, 0, wxEXPAND, 0);
+
+ m_save_preset_panel = new CaliSavePresetValuePanel(parent, wxID_ANY);
+
+ set_save_img();
+
+ m_top_sizer->Add(m_save_preset_panel, 0);
+
+ m_action_panel = new CaliPageActionPanel(parent, m_cali_mode, CaliPageType::CALI_PAGE_COMMON_SAVE);
+ m_top_sizer->Add(m_action_panel, 0, wxEXPAND, 0);
+}
+
+void CalibrationMaxVolumetricSpeedSavePage::set_save_img() {
+ m_save_preset_panel->set_img("max_volumetric_speed_calibration");
+}
+
+bool CalibrationMaxVolumetricSpeedSavePage::get_save_result(double& value, std::string& name) {
+ // Check if the value is valid
+ m_save_preset_panel->get_save_name(name);
+ m_save_preset_panel->get_value(value);
+ if (value < 0 || value > 60) {
+ MessageDialog msg_dlg(nullptr, _L("Please input a valid value (0 <= Max Volumetric Speed <= 60)"), wxEmptyString, wxICON_WARNING | wxOK);
+ msg_dlg.ShowModal();
+ return false;
+ }
+ if (name.empty()) {
+ MessageDialog msg_dlg(nullptr, _L("Please enter the name of the preset you want to save."), wxEmptyString, wxICON_WARNING | wxOK);
+ msg_dlg.ShowModal();
+ return false;
+ }
+ return true;
+}
+
+bool CalibrationMaxVolumetricSpeedSavePage::Show(bool show) {
+ if (show) {
+ if (curr_obj) {
+ assert(curr_obj->selected_cali_preset.size() <= 1);
+ if (!curr_obj->selected_cali_preset.empty()) {
+ wxString default_name = get_default_name(curr_obj->selected_cali_preset[0].name, CalibMode::Calib_Vol_speed_Tower);
+ m_save_preset_panel->set_save_name(default_name.ToStdString());
+ }
+ }
+ else {
+ BOOST_LOG_TRIVIAL(trace) << "CalibrationMaxVolumetricSpeedSave::Show(): obj is nullptr";
+ }
+ }
+ return wxPanel::Show(show);
+}
+
+
+}}
\ No newline at end of file
diff --git a/src/slic3r/GUI/CalibrationWizardSavePage.hpp b/src/slic3r/GUI/CalibrationWizardSavePage.hpp
new file mode 100644
index 0000000000..652fbe9f8d
--- /dev/null
+++ b/src/slic3r/GUI/CalibrationWizardSavePage.hpp
@@ -0,0 +1,284 @@
+#ifndef slic3r_GUI_CalibrationWizardSavePage_hpp_
+#define slic3r_GUI_CalibrationWizardSavePage_hpp_
+
+#include "CalibrationWizardPage.hpp"
+#include "Widgets/TextInput.hpp"
+
+namespace Slic3r { namespace GUI {
+
+enum CaliSaveStyle {
+ CALI_SAVE_P1P_STYLE = 0,
+ CALI_SAVE_X1_STYLE,
+};
+
+
+class CalibrationCommonSavePage : public CalibrationWizardPage
+{
+public:
+ CalibrationCommonSavePage(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTAB_TRAVERSAL);
+
+protected:
+ wxBoxSizer* m_top_sizer;
+};
+
+class PAColumnDataPanel : wxPanel {
+public:
+ PAColumnDataPanel(
+ wxWindow* parent,
+ bool is_failed,
+ wxWindowID id = wxID_ANY,
+ const wxPoint& pos = wxDefaultPosition,
+ const wxSize& size = wxDefaultSize,
+ long style = wxTAB_TRAVERSAL);
+
+ bool is_failed() { return m_is_failed; }
+ int get_col_idx() { return m_col_idx; }
+ wxString get_k_str();
+ wxString get_n_str();
+ wxString get_name();
+ void set_data(wxString k_str, wxString n_str, wxString name);
+
+private:
+ wxBoxSizer* m_top_sizer;
+ TextInput* m_k_value_input;
+ TextInput* m_n_value_input;
+ ComboBox* m_comboBox_tray_name;
+ int m_col_idx;
+ bool m_is_failed;
+};
+
+class CaliSavePresetValuePanel : public wxPanel
+{
+protected:
+ wxBoxSizer* m_top_sizer;
+ wxStaticBitmap* m_record_picture;
+ wxStaticText* m_value_title;
+ wxStaticText* m_save_name_title;
+ ::TextInput* m_input_value;
+ ::TextInput* m_input_name;
+
+
+public:
+ CaliSavePresetValuePanel(
+ wxWindow* parent,
+ wxWindowID id = wxID_ANY,
+ const wxPoint& pos = wxDefaultPosition,
+ const wxSize& size = wxDefaultSize,
+ long style = wxTAB_TRAVERSAL);
+
+ void create_panel(wxWindow* parent);
+
+ void set_img(const std::string& bmp_name_in);
+ void set_value_title(const wxString& title);
+ void set_save_name_title(const wxString& title);
+ void get_value(double& value);
+ void get_save_name(std::string& name);
+ void set_save_name(const std::string& name);
+};
+
+
+class CaliPASaveAutoPanel : public wxPanel
+{
+public:
+ CaliPASaveAutoPanel(
+ wxWindow* parent,
+ wxWindowID id = wxID_ANY,
+ const wxPoint& pos = wxDefaultPosition,
+ const wxSize& size = wxDefaultSize,
+ long style = wxTAB_TRAVERSAL);
+
+ void create_panel(wxWindow* parent);
+
+ void set_machine_obj(MachineObject* obj) { m_obj = obj; }
+
+ void sync_cali_result(const std::vector& cali_result);
+ void save_to_result_from_widgets(wxWindow* window, bool* out_is_valid);
+ bool get_result(std::vector& out_result);
+
+protected:
+ wxBoxSizer* m_top_sizer;
+ wxPanel* m_grid_panel{ nullptr };
+ std::vector m_calib_results;
+
+ MachineObject* m_obj;
+};
+
+class CaliPASaveManualPanel : public wxPanel
+{
+public:
+ CaliPASaveManualPanel(
+ wxWindow* parent,
+ wxWindowID id = wxID_ANY,
+ const wxPoint& pos = wxDefaultPosition,
+ const wxSize& size = wxDefaultSize,
+ long style = wxTAB_TRAVERSAL);
+ void create_panel(wxWindow* parent);
+ void set_save_img();
+
+ void set_machine_obj(MachineObject* obj) { m_obj = obj; }
+
+ void set_default_name(const wxString& name);
+
+ bool get_result(PACalibResult& out_result);
+
+ virtual bool Show(bool show = true) override;
+
+protected:
+ wxBoxSizer* m_top_sizer;
+ wxStaticBitmap* m_record_picture;
+ ::TextInput* m_save_name_input;
+ ::TextInput* m_k_val;
+ ::TextInput* m_n_val;
+
+ MachineObject* m_obj;
+};
+
+class CaliPASaveP1PPanel : public wxPanel
+{
+public:
+ CaliPASaveP1PPanel(
+ wxWindow* parent,
+ wxWindowID id = wxID_ANY,
+ const wxPoint& pos = wxDefaultPosition,
+ const wxSize& size = wxDefaultSize,
+ long style = wxTAB_TRAVERSAL);
+ void create_panel(wxWindow* parent);
+ void set_save_img();
+
+ bool get_result(float* out_k, float* out_n);
+
+protected:
+ wxBoxSizer* m_top_sizer;
+ wxStaticBitmap* m_record_picture;
+ ::TextInput* m_k_val;
+ ::TextInput* m_n_val;
+};
+
+class CalibrationPASavePage : public CalibrationCommonSavePage
+{
+public:
+ CalibrationPASavePage(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTAB_TRAVERSAL);
+
+ void create_page(wxWindow* parent);
+ void set_cali_method(CalibrationMethod method) override;
+ // sync widget value from obj cali result
+ void sync_cali_result(MachineObject* obj);
+ bool get_auto_result(std::vector& result) { return m_auto_panel->get_result(result); }
+ bool get_manual_result(PACalibResult& result) { return m_manual_panel->get_result(result); }
+ bool get_p1p_result(float* k, float* n) { return m_p1p_panel->get_result(k, n); }
+
+ void show_panels(CalibrationMethod method, const std::string& printer_type);
+
+ void on_device_connected(MachineObject* obj);
+
+ void update(MachineObject* obj) override;
+
+protected:
+ CaliPageStepGuide* m_step_panel { nullptr };
+ CaliPASaveAutoPanel* m_auto_panel { nullptr };
+ CaliPASaveManualPanel* m_manual_panel { nullptr };
+ CaliPASaveP1PPanel* m_p1p_panel{ nullptr };
+
+ CaliSaveStyle m_save_style;
+
+ std::vector m_calib_results_history;
+};
+
+class CalibrationFlowX1SavePage : public CalibrationCommonSavePage
+{
+public:
+ CalibrationFlowX1SavePage(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTAB_TRAVERSAL);
+
+ void create_page(wxWindow* parent);
+
+ // sync widget value from cali flow rate result
+ void sync_cali_result(const std::vector& cali_result);
+ void save_to_result_from_widgets(wxWindow* window, bool* out_is_valid);
+ bool get_result(std::vector>& out_results);
+
+protected:
+ CaliPageStepGuide* m_step_panel{ nullptr };
+ wxPanel* m_grid_panel{ nullptr };
+
+ std::map> m_save_results; // map>
+};
+
+class CalibrationFlowCoarseSavePage : public CalibrationCommonSavePage
+{
+public:
+ CalibrationFlowCoarseSavePage(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTAB_TRAVERSAL);
+
+ void create_page(wxWindow* parent);
+ void set_save_img();
+
+ void set_default_name(const wxString& name);
+
+ bool is_skip_fine_calibration();
+
+ void set_curr_flow_ratio(float value);
+
+ bool get_result(float* out_value, wxString* out_name);
+
+ virtual bool Show(bool show = true) override;
+
+protected:
+ CaliPageStepGuide* m_step_panel{ nullptr };
+ wxStaticBitmap* m_record_picture;
+ ComboBox* m_optimal_block_coarse;
+ TextInput* m_save_name_input;
+
+ bool m_skip_fine_calibration = false;
+ float m_curr_flow_ratio;
+ float m_coarse_flow_ratio;
+};
+
+class CalibrationFlowFineSavePage : public CalibrationCommonSavePage
+{
+public:
+ CalibrationFlowFineSavePage(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTAB_TRAVERSAL);
+
+ void create_page(wxWindow* parent);
+ void set_save_img();
+
+ void set_default_name(const wxString& name);
+
+ void set_curr_flow_ratio(float value);
+
+ bool get_result(float* out_value, wxString* out_name);
+
+ virtual bool Show(bool show = true) override;
+
+protected:
+ CaliPageStepGuide* m_step_panel{ nullptr };
+ wxStaticBitmap* m_record_picture;
+ ComboBox* m_optimal_block_fine;
+ TextInput* m_save_name_input;
+
+ float m_curr_flow_ratio;
+ float m_fine_flow_ratio;
+};
+
+class CalibrationMaxVolumetricSpeedSavePage : public CalibrationCommonSavePage
+{
+public:
+ CalibrationMaxVolumetricSpeedSavePage(wxWindow *parent, wxWindowID id = wxID_ANY,
+ const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize, long style = wxTAB_TRAVERSAL);
+
+ void create_page(wxWindow *parent);
+ void set_save_img();
+
+ bool get_save_result(double &value, std::string &name);
+
+ void set_prest_name(const std::string &name) { m_save_preset_panel->set_save_name(name); };
+
+ virtual bool Show(bool show = true) override;
+
+protected:
+ CaliPageStepGuide *m_step_panel{nullptr};
+ CaliSavePresetValuePanel *m_save_preset_panel;
+};
+
+
+}} // namespace Slic3r::GUI
+
+#endif
\ No newline at end of file
diff --git a/src/slic3r/GUI/CalibrationWizardStartPage.cpp b/src/slic3r/GUI/CalibrationWizardStartPage.cpp
new file mode 100644
index 0000000000..d042342e77
--- /dev/null
+++ b/src/slic3r/GUI/CalibrationWizardStartPage.cpp
@@ -0,0 +1,304 @@
+#include "CalibrationWizardStartPage.hpp"
+#include "I18N.hpp"
+#include "Widgets/Label.hpp"
+
+namespace Slic3r { namespace GUI {
+
+
+CalibrationStartPage::CalibrationStartPage(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style)
+ :CalibrationWizardPage(parent, id, pos, size, style)
+{
+ m_top_sizer = new wxBoxSizer(wxVERTICAL);
+}
+
+void CalibrationStartPage::create_wiki(wxWindow* parent)
+{
+ m_wiki_text = new wxStaticText(parent, wxID_ANY, _L("Wiki"));
+ m_wiki_text->SetFont(Label::Head_14);
+ m_wiki_text->SetForegroundColour({ 0, 88, 220 });
+ m_wiki_text->Bind(wxEVT_ENTER_WINDOW, [this](wxMouseEvent& e) {
+ e.Skip();
+ SetCursor(wxCURSOR_HAND);
+ });
+ m_wiki_text->Bind(wxEVT_LEAVE_WINDOW, [this](wxMouseEvent& e) {
+ e.Skip();
+ SetCursor(wxCURSOR_ARROW);
+ });
+ m_wiki_text->Bind(wxEVT_LEFT_UP, [this](wxMouseEvent& e) {
+ if (!m_wiki_url.empty())
+ wxLaunchDefaultBrowser(m_wiki_url);
+ });
+}
+
+void CalibrationStartPage::create_when(wxWindow* parent, wxString title, wxString content)
+{
+ m_when_title = new wxStaticText(this, wxID_ANY, title);
+ m_when_title->SetFont(Label::Head_14);
+ m_when_title->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
+
+ m_when_content = new wxStaticText(this, wxID_ANY, content);
+ m_when_content->SetFont(Label::Body_14);
+ m_when_content->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
+}
+
+void CalibrationStartPage::create_bitmap(wxWindow* parent, const wxBitmap& before_img, const wxBitmap& after_img)
+{
+ m_images_sizer = new wxBoxSizer(wxHORIZONTAL);
+ m_before_bmp = new wxStaticBitmap(parent, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0);
+ m_before_bmp->SetBitmap(before_img);
+ m_images_sizer->Add(m_before_bmp, 0, wxALL, 0);
+ m_images_sizer->AddSpacer(FromDIP(20));
+ m_after_bmp = new wxStaticBitmap(parent, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0);
+ m_after_bmp->SetBitmap(after_img);
+ m_images_sizer->Add(m_after_bmp, 0, wxALL, 0);
+}
+
+void CalibrationStartPage::create_bitmap(wxWindow* parent, std::string before_img, std::string after_img)
+{
+ wxBitmap before_bmp = create_scaled_bitmap(before_img, nullptr, 400);
+ wxBitmap after_bmp = create_scaled_bitmap(after_img, nullptr, 400);
+
+ create_bitmap(parent, before_bmp, after_bmp);
+}
+
+CalibrationPAStartPage::CalibrationPAStartPage(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style)
+ : CalibrationStartPage(parent, id, pos, size, style)
+{
+ m_cali_mode = CalibMode::Calib_PA_Line;
+ m_page_type = CaliPageType::CALI_PAGE_START;
+
+ m_wiki_url = get_calibration_wiki_page(m_cali_mode);
+
+ create_page(this);
+
+ this->SetSizer(m_top_sizer);
+ m_top_sizer->Fit(this);
+}
+
+void CalibrationPAStartPage::create_page(wxWindow* parent)
+{
+ m_page_caption = new CaliPageCaption(parent, CalibMode::Calib_PA_Line);
+ m_page_caption->show_prev_btn(false);
+ m_top_sizer->Add(m_page_caption, 0, wxEXPAND, 0);
+ create_when(parent,
+ _L("When you need Pressure Advance Calibration"),
+ _L("uneven extrusion"));
+
+ m_top_sizer->Add(m_when_title);
+ m_top_sizer->Add(m_when_content);
+ m_top_sizer->AddSpacer(PRESET_GAP);
+
+ create_bitmap(parent, "cali_page_before_pa", "cali_page_after_pa");
+ m_top_sizer->Add(m_images_sizer, 0, wxALL, 0);
+
+ m_top_sizer->AddSpacer(PRESET_GAP);
+
+ auto about_title = new wxStaticText(parent, wxID_ANY, _L("About this calibration"));
+ about_title->SetFont(Label::Head_14);
+ about_title->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
+ m_top_sizer->Add(about_title);
+ auto about_text = new wxStaticText(parent, wxID_ANY, _L("After calibration, the linear compensation factor(K) will be recorded and applied to printing. This factor would be different if device, degree of usage, material, and material family type are different"));
+ about_text->SetFont(Label::Body_14);
+ about_text->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
+ m_top_sizer->Add(about_text);
+
+
+ m_top_sizer->AddSpacer(PRESET_GAP);
+
+ create_wiki(parent);
+ m_top_sizer->Add(m_wiki_text, 0);
+
+ m_action_panel = new CaliPageActionPanel(parent, CalibMode::Calib_PA_Line, CaliPageType::CALI_PAGE_START);
+
+ m_top_sizer->Add(m_action_panel, 0, wxEXPAND, 0);
+}
+
+void CalibrationPAStartPage::on_reset_page()
+{
+ m_action_panel->enable_button(CaliPageActionType::CALI_ACTION_MANAGE_RESULT, false);
+ m_action_panel->enable_button(CaliPageActionType::CALI_ACTION_AUTO_CALI, false);
+ m_action_panel->enable_button(CaliPageActionType::CALI_ACTION_MANUAL_CALI, false);
+}
+
+void CalibrationPAStartPage::on_device_connected(MachineObject* obj)
+{
+ //enable all button
+ m_action_panel->enable_button(CaliPageActionType::CALI_ACTION_MANAGE_RESULT, true);
+ m_action_panel->enable_button(CaliPageActionType::CALI_ACTION_AUTO_CALI, true);
+ m_action_panel->enable_button(CaliPageActionType::CALI_ACTION_MANUAL_CALI, true);
+
+ if (obj->printer_type == "BL-P001" || obj->printer_type == "BL-P002") {
+ m_action_panel->show_button(CaliPageActionType::CALI_ACTION_MANAGE_RESULT, true);
+ m_action_panel->show_button(CaliPageActionType::CALI_ACTION_AUTO_CALI, true);
+ m_action_panel->show_button(CaliPageActionType::CALI_ACTION_MANUAL_CALI, true);
+
+ if (obj->cali_version <= -1) {
+ m_action_panel->bind_button(CaliPageActionType::CALI_ACTION_MANAGE_RESULT, true);
+ m_action_panel->bind_button(CaliPageActionType::CALI_ACTION_AUTO_CALI, true);
+ m_action_panel->bind_button(CaliPageActionType::CALI_ACTION_MANUAL_CALI, true);
+ }
+ else {
+ m_action_panel->bind_button(CaliPageActionType::CALI_ACTION_MANAGE_RESULT, false);
+ m_action_panel->bind_button(CaliPageActionType::CALI_ACTION_MANUAL_CALI, false);
+ m_action_panel->bind_button(CaliPageActionType::CALI_ACTION_MANUAL_CALI, false);
+ }
+ }
+ else if (obj->printer_type == "C11" || obj->printer_type == "C12") {
+ m_action_panel->show_button(CaliPageActionType::CALI_ACTION_MANAGE_RESULT, false);
+ m_action_panel->show_button(CaliPageActionType::CALI_ACTION_AUTO_CALI, false);
+ m_action_panel->show_button(CaliPageActionType::CALI_ACTION_MANUAL_CALI, true);
+
+ if (obj->cali_version <= -1) {
+ m_action_panel->bind_button(CaliPageActionType::CALI_ACTION_MANUAL_CALI, true);
+ }
+ else {
+ m_action_panel->bind_button(CaliPageActionType::CALI_ACTION_MANUAL_CALI, false);
+ }
+ }
+}
+
+CalibrationFlowRateStartPage::CalibrationFlowRateStartPage(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style)
+ : CalibrationStartPage(parent, id, pos, size, style)
+{
+ m_cali_mode = CalibMode::Calib_Flow_Rate;
+
+ m_wiki_url = get_calibration_wiki_page(m_cali_mode);
+
+ create_page(this);
+
+ this->SetSizer(m_top_sizer);
+ m_top_sizer->Fit(this);
+}
+
+void CalibrationFlowRateStartPage::create_page(wxWindow* parent)
+{
+ m_page_caption = new CaliPageCaption(parent, CalibMode::Calib_Flow_Rate);
+ m_page_caption->show_prev_btn(false);
+ m_top_sizer->Add(m_page_caption, 0, wxEXPAND, 0);
+ create_when(parent,
+ _L("When you need Flow Rate Calibration"),
+ _L("Over-extrusion or under extrusion"));
+
+ m_top_sizer->Add(m_when_title);
+ m_top_sizer->Add(m_when_content);
+ m_top_sizer->AddSpacer(PRESET_GAP);
+
+ auto recommend_title = new wxStaticText(parent, wxID_ANY, _L("Flow Rate calibration is recommended when you print with:"));
+ recommend_title->SetFont(Label::Head_14);
+ recommend_title->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
+ m_top_sizer->Add(recommend_title);
+ auto recommend_text1 = new wxStaticText(parent, wxID_ANY, _L("material with significant thermal shrinkage/expansion, such as..."));
+ recommend_text1->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
+ recommend_text1->SetFont(Label::Body_14);
+ m_top_sizer->Add(recommend_text1);
+ auto recommend_text2 = new wxStaticText(parent, wxID_ANY, _L("materials with inaccurate filament diameter"));
+ recommend_text2->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
+ recommend_text2->SetFont(Label::Body_14);
+ m_top_sizer->Add(recommend_text2);
+
+ m_top_sizer->AddSpacer(PRESET_GAP);
+
+ create_bitmap(parent, "cali_page_before_flow", "cali_page_after_flow");
+
+ m_top_sizer->Add(m_images_sizer, 0, wxALL, 0);
+
+ m_top_sizer->AddSpacer(PRESET_GAP);
+
+ create_wiki(parent);
+ m_top_sizer->Add(m_wiki_text, 0);
+
+ m_action_panel = new CaliPageActionPanel(parent, CalibMode::Calib_Flow_Rate, CaliPageType::CALI_PAGE_START);
+
+ m_top_sizer->Add(m_action_panel, 0, wxEXPAND, 0);
+}
+
+void CalibrationFlowRateStartPage::on_reset_page()
+{
+ //disable all button
+ m_action_panel->enable_button(CaliPageActionType::CALI_ACTION_MANAGE_RESULT, false);
+ m_action_panel->enable_button(CaliPageActionType::CALI_ACTION_AUTO_CALI, false);
+ m_action_panel->enable_button(CaliPageActionType::CALI_ACTION_MANUAL_CALI, false);
+}
+
+void CalibrationFlowRateStartPage::on_device_connected(MachineObject* obj)
+{
+ //enable all button
+ m_action_panel->enable_button(CaliPageActionType::CALI_ACTION_MANAGE_RESULT, true);
+ m_action_panel->enable_button(CaliPageActionType::CALI_ACTION_AUTO_CALI, true);
+ m_action_panel->enable_button(CaliPageActionType::CALI_ACTION_MANUAL_CALI, true);
+
+ if (obj->printer_type == "BL-P001" || obj->printer_type == "BL-P002") {
+ m_action_panel->show_button(CaliPageActionType::CALI_ACTION_MANAGE_RESULT, false);
+ m_action_panel->show_button(CaliPageActionType::CALI_ACTION_AUTO_CALI, true);
+ m_action_panel->show_button(CaliPageActionType::CALI_ACTION_MANUAL_CALI, true);
+
+ if (obj->cali_version <= -1) {
+ m_action_panel->bind_button(CaliPageActionType::CALI_ACTION_AUTO_CALI, true);
+ }
+ else {
+ m_action_panel->bind_button(CaliPageActionType::CALI_ACTION_MANUAL_CALI, false);
+ }
+ }
+ else if (obj->printer_type == "C11" || obj->printer_type == "C12") {
+ m_action_panel->show_button(CaliPageActionType::CALI_ACTION_MANAGE_RESULT, false);
+ m_action_panel->show_button(CaliPageActionType::CALI_ACTION_AUTO_CALI, false);
+ m_action_panel->show_button(CaliPageActionType::CALI_ACTION_MANUAL_CALI, true);
+
+ m_action_panel->bind_button(CaliPageActionType::CALI_ACTION_MANUAL_CALI, false);
+ }
+}
+
+CalibrationMaxVolumetricSpeedStartPage::CalibrationMaxVolumetricSpeedStartPage(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style)
+ : CalibrationStartPage(parent, id, pos, size, style)
+{
+ m_cali_mode = CalibMode::Calib_Vol_speed_Tower;
+
+ m_wiki_url = get_calibration_wiki_page(m_cali_mode);
+
+ create_page(this);
+
+ this->SetSizer(m_top_sizer);
+ m_top_sizer->Fit(this);
+}
+
+void CalibrationMaxVolumetricSpeedStartPage::create_page(wxWindow* parent)
+{
+ m_page_caption = new CaliPageCaption(parent, m_cali_mode);
+ m_page_caption->show_prev_btn(false);
+ m_top_sizer->Add(m_page_caption, 0, wxEXPAND, 0);
+ create_when(parent, _L("When you need Max Volumetric Speed Calibration"), _L("Over-extrusion or under extrusion"));
+
+ m_top_sizer->Add(m_when_title);
+ m_top_sizer->Add(m_when_content);
+ m_top_sizer->AddSpacer(PRESET_GAP);
+
+ auto recommend_title = new wxStaticText(parent, wxID_ANY, _L("Max Volumetric Speed calibration is recommended when you print with:"));
+ recommend_title->SetFont(Label::Head_14);
+ recommend_title->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
+ m_top_sizer->Add(recommend_title);
+ auto recommend_text1 = new wxStaticText(parent, wxID_ANY, _L("material with significant thermal shrinkage/expansion, such as..."));
+ recommend_text1->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
+ recommend_text1->SetFont(Label::Body_14);
+ m_top_sizer->Add(recommend_text1);
+ auto recommend_text2 = new wxStaticText(parent, wxID_ANY, _L("materials with inaccurate filament diameter"));
+ recommend_text2->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
+ recommend_text2->SetFont(Label::Body_14);
+ m_top_sizer->Add(recommend_text2);
+
+ m_top_sizer->AddSpacer(PRESET_GAP);
+
+ create_bitmap(parent, "cali_page_before_flow", "cali_page_after_flow");
+
+ m_top_sizer->Add(m_images_sizer, 0, wxALL, 0);
+
+ m_top_sizer->AddSpacer(PRESET_GAP);
+
+ create_wiki(parent);
+ m_top_sizer->Add(m_wiki_text, 0);
+
+ m_action_panel = new CaliPageActionPanel(parent, m_cali_mode, CaliPageType::CALI_PAGE_START);
+
+ m_top_sizer->Add(m_action_panel, 0, wxEXPAND, 0);
+}
+
+}}
\ No newline at end of file
diff --git a/src/slic3r/GUI/CalibrationWizardStartPage.hpp b/src/slic3r/GUI/CalibrationWizardStartPage.hpp
new file mode 100644
index 0000000000..914b3d622e
--- /dev/null
+++ b/src/slic3r/GUI/CalibrationWizardStartPage.hpp
@@ -0,0 +1,80 @@
+#ifndef slic3r_GUI_CalibrationWizardStartPage_hpp_
+#define slic3r_GUI_CalibrationWizardStartPage_hpp_
+
+#include "CalibrationWizardPage.hpp"
+
+namespace Slic3r { namespace GUI {
+
+
+
+class CalibrationStartPage : public CalibrationWizardPage
+{
+public:
+ CalibrationStartPage(wxWindow* parent,
+ wxWindowID id = wxID_ANY,
+ const wxPoint& pos = wxDefaultPosition,
+ const wxSize& size = wxDefaultSize,
+ long style = wxTAB_TRAVERSAL);
+
+protected:
+ CalibMode m_cali_mode;
+ wxString m_wiki_url;
+
+ wxBoxSizer* m_top_sizer;
+ wxBoxSizer* m_images_sizer;
+ wxStaticText* m_wiki_text;
+ wxStaticText* m_when_title;
+ wxStaticText* m_when_content;
+ wxStaticBitmap* m_before_bmp;
+ wxStaticBitmap* m_after_bmp;
+
+ void create_wiki(wxWindow* parent);
+ void create_when(wxWindow* parent, wxString title, wxString content);
+ void create_bitmap(wxWindow* parent, const wxBitmap& before_img, const wxBitmap& after_img);
+ void create_bitmap(wxWindow* parent, std::string before_img, std::string after_img);
+};
+
+class CalibrationPAStartPage : public CalibrationStartPage
+{
+public:
+ CalibrationPAStartPage(wxWindow* parent,
+ wxWindowID id = wxID_ANY,
+ const wxPoint& pos = wxDefaultPosition,
+ const wxSize& size = wxDefaultSize,
+ long style = wxTAB_TRAVERSAL);
+
+ void create_page(wxWindow* parent);
+
+ void on_reset_page();
+ void on_device_connected(MachineObject* obj);
+};
+
+class CalibrationFlowRateStartPage : public CalibrationStartPage
+{
+public:
+ CalibrationFlowRateStartPage(wxWindow* parent,
+ wxWindowID id = wxID_ANY,
+ const wxPoint& pos = wxDefaultPosition,
+ const wxSize& size = wxDefaultSize,
+ long style = wxTAB_TRAVERSAL);
+
+ void create_page(wxWindow* parent);
+ void on_reset_page();
+ void on_device_connected(MachineObject* obj);
+};
+
+class CalibrationMaxVolumetricSpeedStartPage : public CalibrationStartPage
+{
+public:
+ CalibrationMaxVolumetricSpeedStartPage(wxWindow* parent,
+ wxWindowID id = wxID_ANY,
+ const wxPoint& pos = wxDefaultPosition,
+ const wxSize& size = wxDefaultSize,
+ long style = wxTAB_TRAVERSAL);
+
+ void create_page(wxWindow* parent);
+};
+
+}} // namespace Slic3r::GUI
+
+#endif
\ No newline at end of file
diff --git a/src/slic3r/GUI/DeviceManager.cpp b/src/slic3r/GUI/DeviceManager.cpp
index 48af9eaf14..c8338445a5 100644
--- a/src/slic3r/GUI/DeviceManager.cpp
+++ b/src/slic3r/GUI/DeviceManager.cpp
@@ -1186,6 +1186,14 @@ bool MachineObject::is_system_printing()
return false;
}
+bool MachineObject::check_pa_result_validation(PACalibResult& result)
+{
+ if (result.k_value < 0 || result.k_value > 10)
+ return false;
+
+ return true;
+}
+
bool MachineObject::is_axis_at_home(std::string axis)
{
if (home_flag < 0)
@@ -1248,6 +1256,8 @@ bool MachineObject::is_in_calibration()
return false;
}
+
+
bool MachineObject::is_calibration_done()
{
return calibration_done;
@@ -1983,7 +1993,10 @@ int MachineObject::command_set_pa_calibration(const std::vector&
for (int i = 0; i < pa_calib_values.size(); ++i) {
if (pa_calib_values[i].tray_id >= 0)
- j["print"]["filaments"][i]["tray_id"] = pa_calib_values[i].tray_id;
+ j["print"]["filaments"][i]["tray_id"] = pa_calib_values[i].tray_id;
+ if (pa_calib_values[i].cali_idx >= 0)
+ j["print"]["filaments"][i]["cali_idx"] = pa_calib_values[i].cali_idx;
+ j["print"]["filaments"][i]["tray_id"] = pa_calib_values[i].tray_id;
j["print"]["filaments"][i]["filament_id"] = pa_calib_values[i].filament_id;
j["print"]["filaments"][i]["setting_id"] = pa_calib_values[i].setting_id;
j["print"]["filaments"][i]["name"] = pa_calib_values[i].name;
@@ -2016,6 +2029,8 @@ int MachineObject::command_delete_pa_calibration(const PACalibIndexInfo& pa_cali
int MachineObject::command_get_pa_calibration_tab(float nozzle_diameter, const std::string &filament_id)
{
+ reset_pa_cali_history_result();
+
if ((printer_type == "BL-P001" || printer_type == "BL-P002")) {
json j;
j["print"]["command"] = "extrusion_cali_get";
@@ -3852,13 +3867,31 @@ int MachineObject::parse_json(std::string payload)
extrusion_cali_set_hold_start = std::chrono::system_clock::now();
}
else if (jj["command"].get() == "extrusion_cali_get") {
-#ifdef CALI_DEBUG
- std::string str = jj.dump();
- BOOST_LOG_TRIVIAL(info) << "extrusion_cali_get: " << str;
-#endif
- if (jj["filaments"].is_array()) {
+ reset_pa_cali_history_result();
+ has_get_pa_calib_tab = true;
+
+ if (jj.contains("nozzle_diameter")) {
+ if (jj["nozzle_diameter"].is_number_float()) {
+ pa_calib_tab_nozzle_dia = jj["nozzle_diameter"].get();
+ }
+ else if (jj["nozzle_diameter"].is_string()) {
+ pa_calib_tab_nozzle_dia = stof(jj["nozzle_diameter"].get().c_str());
+ }
+ else {
+ assert(false);
+ }
+ }
+ else {
+ assert(false);
+ }
+
+ if (jj.contains("filaments") && jj["filaments"].is_array()) {
try {
- pa_calib_tab.clear();
+#ifdef CALI_DEBUG
+ std::string str = jj.dump();
+ BOOST_LOG_TRIVIAL(info) << "extrusion_cali_get: " << str;
+#endif
+
for (auto it = jj["filaments"].begin(); it != jj["filaments"].end(); it++) {
PACalibResult pa_calib_result;
pa_calib_result.filament_id = (*it)["filament_id"].get();
@@ -3882,23 +3915,31 @@ int MachineObject::parse_json(std::string payload)
else if ((*it)["n_coef"].is_string())
pa_calib_result.n_coef = stof((*it)["n_coef"].get().c_str());
- pa_calib_tab.push_back(pa_calib_result);
+ if (check_pa_result_validation(pa_calib_result))
+ pa_calib_tab.push_back(pa_calib_result);
+ else {
+ BOOST_LOG_TRIVIAL(info) << "pa result is invalid";
+ }
}
- has_get_pa_calib_tab = true;
+
}
catch (...) {
}
}
+ // notify cali history to update
}
else if (jj["command"].get() == "extrusion_cali_get_result") {
-#ifdef CALI_DEBUG
- std::string str = jj.dump();
- BOOST_LOG_TRIVIAL(info) << "extrusion_cali_get_result: " << str;
-#endif
- if (jj["filaments"].is_array()) {
+ reset_pa_cali_result();
+ get_pa_calib_result = true;
+
+ if (jj.contains("filaments") && jj["filaments"].is_array()) {
try {
- pa_calib_results.clear();
+#ifdef CALI_DEBUG
+ std::string str = jj.dump();
+ BOOST_LOG_TRIVIAL(info) << "extrusion_cali_get_result: " << str;
+#endif
+
for (auto it = jj["filaments"].begin(); it != jj["filaments"].end(); it++) {
PACalibResult pa_calib_result;
pa_calib_result.tray_id = (*it)["tray_id"].get();
@@ -3921,23 +3962,35 @@ int MachineObject::parse_json(std::string payload)
else if ((*it)["n_coef"].is_string())
pa_calib_result.n_coef = stof((*it)["n_coef"].get().c_str());
- if ((*it).contains("confidence"))
+ if (it->contains("confidence")) {
pa_calib_result.confidence = (*it)["confidence"].get();
+ } else {
+ pa_calib_result.confidence = 0;
+ }
- pa_calib_results.push_back(pa_calib_result);
+ if (check_pa_result_validation(pa_calib_result))
+ pa_calib_results.push_back(pa_calib_result);
+ else {
+ BOOST_LOG_TRIVIAL(info) << "pa result is invalid";
+ }
}
- has_get_pa_calib_result = true;
} catch (...) {}
}
+
+ if (pa_calib_results.empty()) {
+ BOOST_LOG_TRIVIAL(info) << "no pa calib result";
+ }
}
else if (jj["command"].get() == "flowrate_get_result") {
-#ifdef CALI_DEBUG
- std::string str = jj.dump();
- BOOST_LOG_TRIVIAL(info) << "flowrate_get_result: " << str;
-#endif
- if (jj["filaments"].is_array()) {
+ this->reset_flow_rate_cali_result();
+
+ get_flow_calib_result = true;
+ if (jj.contains("filaments") && jj["filaments"].is_array()) {
try {
- flow_ratio_results.clear();
+#ifdef CALI_DEBUG
+ std::string str = jj.dump();
+ BOOST_LOG_TRIVIAL(info) << "flowrate_get_result: " << str;
+#endif
for (auto it = jj["filaments"].begin(); it != jj["filaments"].end(); it++) {
FlowRatioCalibResult flow_ratio_calib_result;
flow_ratio_calib_result.tray_id = (*it)["tray_id"].get();
@@ -3945,10 +3998,15 @@ int MachineObject::parse_json(std::string payload)
flow_ratio_calib_result.setting_id = (*it)["setting_id"].get();
flow_ratio_calib_result.nozzle_diameter = stof(jj["nozzle_diameter"].get().c_str());
flow_ratio_calib_result.flow_ratio = stof((*it)["flow_ratio"].get().c_str());
+ if (it->contains("confidence")) {
+ flow_ratio_calib_result.confidence = (*it)["confidence"].get();
+ } else {
+ flow_ratio_calib_result.confidence = 0;
+ }
flow_ratio_results.push_back(flow_ratio_calib_result);
}
- has_get_flow_ratio_result = true;
+
} catch (...) {}
}
}
diff --git a/src/slic3r/GUI/DeviceManager.hpp b/src/slic3r/GUI/DeviceManager.hpp
index 840268eb3d..205d7a0208 100644
--- a/src/slic3r/GUI/DeviceManager.hpp
+++ b/src/slic3r/GUI/DeviceManager.hpp
@@ -327,10 +327,26 @@ public:
std::vector calib_datas;
};
+class CaliPresetInfo
+{
+public:
+ int tray_id;
+ float nozzle_diameter;
+ std::string filament_id;
+ std::string setting_id;
+ std::string name;
+};
+
+
class PACalibResult
{
public:
- int tray_id;
+ enum CalibResult {
+ CALI_RESULT_SUCCESS = 0,
+ CALI_RESULT_PROBLEM = 1,
+ CALI_RESULT_FAILED = 2,
+ };
+ int tray_id;
int cali_idx;
float nozzle_diameter;
std::string filament_id;
@@ -338,7 +354,7 @@ public:
std::string name;
float k_value;
float n_coef;
- int confidence = -1;
+ int confidence = -1; // 0: success 1: uncertain 2: failed
};
struct PACalibIndexInfo
@@ -357,6 +373,7 @@ public:
std::string filament_id;
std::string setting_id;
float flow_ratio;
+ int confidence; // 0: success 1: uncertain 2: failed
};
#define UpgradeNoError 0
@@ -661,12 +678,37 @@ public:
bool is_support_layer_num { false };
int cali_version = -1;
- bool has_get_pa_calib_tab = false;
- bool has_get_pa_calib_result = false;
- bool has_get_flow_ratio_result = false;
+ float cali_selected_nozzle_dia { 0.0 };
+ // 1: record when start calibration in preset page
+ // 2: reset when start calibration in start page
+ // 3: save tray_id, filament_id, setting_id, and name, nozzle_dia
+ std::vector selected_cali_preset;
+
+ bool has_get_pa_calib_tab{ false };
std::vector pa_calib_tab;
+ float pa_calib_tab_nozzle_dia;
+ bool get_pa_calib_result { false };
std::vector pa_calib_results;
+ bool get_flow_calib_result { false };
std::vector flow_ratio_results;
+ void reset_pa_cali_history_result()
+ {
+ pa_calib_tab_nozzle_dia = 0.4f;
+ has_get_pa_calib_tab = false;
+ pa_calib_tab.clear();
+ }
+
+ void reset_pa_cali_result() {
+ get_pa_calib_result = false;
+ pa_calib_results.clear();
+ }
+
+ void reset_flow_rate_cali_result() {
+ get_flow_calib_result = false;
+ flow_ratio_results.clear();
+ }
+
+ bool check_pa_result_validation(PACalibResult& result);
std::vector stage_list_info;
int stage_curr = 0;
diff --git a/src/slic3r/GUI/EditCalibrationHistoryDialog.cpp b/src/slic3r/GUI/EditCalibrationHistoryDialog.cpp
deleted file mode 100644
index 19916542e5..0000000000
--- a/src/slic3r/GUI/EditCalibrationHistoryDialog.cpp
+++ /dev/null
@@ -1,198 +0,0 @@
-#include "EditCalibrationHistoryDialog.hpp"
-#include "MsgDialog.hpp"
-#include "GUI_App.hpp"
-
-namespace Slic3r { namespace GUI {
-
-#define EDIT_HISTORY_DIALOG_INPUT_SIZE wxSize(FromDIP(160), FromDIP(24))
-
-static bool validate_input_k_value(wxString k_text, float* output_value)
-{
- float default_k = 0.0f;
- if (k_text.IsEmpty()) {
- *output_value = default_k;
- MessageDialog msg_dlg(nullptr, _L("Please input a valid value (K in 0~0.5)"), wxEmptyString, wxICON_WARNING | wxOK);
- msg_dlg.ShowModal();
- return false;
- }
-
- double k_value = 0.0;
- try {
- k_text.ToDouble(&k_value);
- }
- catch (...) {
- ;
- }
-
- if (k_value < 0 || k_value > 0.5) {
- *output_value = default_k;
- MessageDialog msg_dlg(nullptr, _L("Please input a valid value (K in 0~0.5)"), wxEmptyString, wxICON_WARNING | wxOK);
- msg_dlg.ShowModal();
- return false;
- }
-
- *output_value = k_value;
- return true;
-};
-
-static bool validate_input_n_value(wxString n_text, float* output_value) {
- float default_n = 1.0f;
- if (n_text.IsEmpty()) {
- *output_value = default_n;
- MessageDialog msg_dlg(nullptr, _L("Please input a valid value (N in 0.6~2.0)"), wxEmptyString, wxICON_WARNING | wxOK);
- msg_dlg.ShowModal();
- return false;
- }
-
- double n_value = 0.0;
- try {
- n_text.ToDouble(&n_value);
- }
- catch (...) {
- ;
- }
-
- if (n_value < 0.6 || n_value > 2.0) {
- *output_value = default_n;
- MessageDialog msg_dlg(nullptr, _L("Please input a valid value (N in 0.6~2.0)"), wxEmptyString, wxICON_WARNING | wxOK);
- msg_dlg.ShowModal();
- return false;
- }
-
- *output_value = n_value;
- return true;
-}
-
-EditCalibrationHistoryDialog::EditCalibrationHistoryDialog(wxWindow* parent, wxString k, wxString n, wxString material_name, wxString nozzle_dia)
- : DPIDialog(parent, wxID_ANY, _L("Edit Pressure Advance"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE)
-{
- create(k, n, material_name, nozzle_dia);
- wxGetApp().UpdateDlgDarkUI(this);
-}
-
-EditCalibrationHistoryDialog::~EditCalibrationHistoryDialog() {
-}
-
-void EditCalibrationHistoryDialog::create(const wxString& k, const wxString& n, const wxString& material_name, const wxString& nozzle_dia)
-{
- this->SetBackgroundColour(*wxWHITE);
- auto main_sizer = new wxBoxSizer(wxVERTICAL);
-
- auto top_panel = new wxPanel(this);
- auto panel_sizer = new wxBoxSizer(wxVERTICAL);
- top_panel->SetSizer(panel_sizer);
-
- auto flex_sizer = new wxFlexGridSizer(0, 2, FromDIP(15), FromDIP(30));
- flex_sizer->SetFlexibleDirection(wxBOTH);
- flex_sizer->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
-
- wxStaticText* nozzle_title = new wxStaticText(top_panel, wxID_ANY, _L("Nozzle Diameter"));
- wxStaticText* nozzle_value = new wxStaticText(top_panel, wxID_ANY, nozzle_dia);
- flex_sizer->Add(nozzle_title);
- flex_sizer->Add(nozzle_value);
-
- wxStaticText* material_name_title = new wxStaticText(top_panel, wxID_ANY, _L("Material"));
- TextInput* material_name_value = new TextInput(top_panel, material_name, "", "", wxDefaultPosition, EDIT_HISTORY_DIALOG_INPUT_SIZE, wxTE_PROCESS_ENTER);
- m_material_name = material_name.ToStdString();
- material_name_value->GetTextCtrl()->Bind(wxEVT_TEXT_ENTER, [this, material_name_value](auto& e) {
- if (!material_name_value->GetTextCtrl()->GetValue().IsEmpty())
- m_material_name = material_name_value->GetTextCtrl()->GetValue().ToStdString();
- });
- material_name_value->GetTextCtrl()->Bind(wxEVT_KILL_FOCUS, [this, material_name_value](auto& e) {
- if (!material_name_value->GetTextCtrl()->GetValue().IsEmpty())
- m_material_name = material_name_value->GetTextCtrl()->GetValue().ToStdString();
- e.Skip();
- });
- flex_sizer->Add(material_name_title);
- flex_sizer->Add(material_name_value);
-
- wxStaticText* k_title = new wxStaticText(top_panel, wxID_ANY, _L("K Factor"));
- TextInput* k_value = new TextInput(top_panel, k, "", "", wxDefaultPosition, EDIT_HISTORY_DIALOG_INPUT_SIZE, wxTE_PROCESS_ENTER);
- double double_k = 0.0;
- k_value->GetTextCtrl()->GetValue().ToDouble(&double_k);
- m_k_value = double_k;
- k_value->GetTextCtrl()->Bind(wxEVT_TEXT_ENTER, [this, k_value](auto& e) {
- float k = 0.0f;
- validate_input_k_value(k_value->GetTextCtrl()->GetValue(), &k);
- wxString k_str = wxString::Format("%.3f", k);
- k_value->GetTextCtrl()->SetValue(k_str);
- m_k_value = k;
- });
- k_value->GetTextCtrl()->Bind(wxEVT_KILL_FOCUS, [this, k_value](auto& e) {
- float k = 0.0f;
- validate_input_k_value(k_value->GetTextCtrl()->GetValue(), &k);
- wxString k_str = wxString::Format("%.3f", k);
- k_value->GetTextCtrl()->SetValue(k_str);
- m_k_value = k;
- e.Skip();
- });
- flex_sizer->Add(k_title);
- flex_sizer->Add(k_value);
-
- // Hide:
- //wxStaticText* n_title = new wxStaticText(top_panel, wxID_ANY, _L("N Factor"));
- //TextInput* n_value = new TextInput(top_panel, n, "", "", wxDefaultPosition, EDIT_HISTORY_DIALOG_INPUT_SIZE, wxTE_PROCESS_ENTER);
- //flex_sizer->Add(n_title);
- //flex_sizer->Add(n_value);
-
- panel_sizer->Add(flex_sizer);
-
- panel_sizer->AddSpacer(FromDIP(25));
-
- auto btn_sizer = new wxBoxSizer(wxHORIZONTAL);
- Button* save_btn = new Button(top_panel, _L("Save"));
- StateColor btn_bg_green(std::pair(wxColour(27, 136, 68), StateColor::Pressed),
- std::pair(wxColour(61, 203, 115), StateColor::Hovered),
- std::pair(wxColour(0, 174, 66), StateColor::Normal));
- save_btn->SetBackgroundColour(*wxWHITE);
- save_btn->SetBackgroundColor(btn_bg_green);
- save_btn->SetBorderColor(wxColour(0, 174, 66));
- save_btn->SetTextColor(wxColour("#FFFFFE"));
- save_btn->SetMinSize(wxSize(-1, FromDIP(24)));
- save_btn->SetCornerRadius(FromDIP(12));
- Button* cancel_btn = new Button(top_panel, _L("Cancel"));
- cancel_btn->SetBackgroundColour(*wxWHITE);
- cancel_btn->SetMinSize(wxSize(-1, FromDIP(24)));
- cancel_btn->SetCornerRadius(FromDIP(12));
- save_btn->Bind(wxEVT_BUTTON, &EditCalibrationHistoryDialog::on_save, this);
- cancel_btn->Bind(wxEVT_BUTTON, &EditCalibrationHistoryDialog::on_cancel, this);
- btn_sizer->AddStretchSpacer();
- btn_sizer->Add(save_btn);
- btn_sizer->AddSpacer(FromDIP(20));
- btn_sizer->Add(cancel_btn);
- panel_sizer->Add(btn_sizer, 0, wxEXPAND, 0);
-
-
- main_sizer->Add(top_panel, 1, wxEXPAND | wxALL, FromDIP(20));
-
- SetSizer(main_sizer);
- Layout();
- Fit();
- CenterOnParent();
-}
-
-float EditCalibrationHistoryDialog::get_k_value(){
- return m_k_value;
-}
-
-float EditCalibrationHistoryDialog::get_n_value(){
- return m_n_value;
-}
-
-wxString EditCalibrationHistoryDialog::get_material_name_value() {
- return m_material_name;
-}
-
-void EditCalibrationHistoryDialog::on_save(wxCommandEvent& event) {
- EndModal(wxID_OK);
-}
-
-void EditCalibrationHistoryDialog::on_cancel(wxCommandEvent& event) {
- EndModal(wxID_CANCEL);
-}
-
-void EditCalibrationHistoryDialog::on_dpi_changed(const wxRect& suggested_rect)
-{
-}
-
-}} // namespace Slic3r::GUI
diff --git a/src/slic3r/GUI/EditCalibrationHistoryDialog.hpp b/src/slic3r/GUI/EditCalibrationHistoryDialog.hpp
deleted file mode 100644
index 05be3db262..0000000000
--- a/src/slic3r/GUI/EditCalibrationHistoryDialog.hpp
+++ /dev/null
@@ -1,31 +0,0 @@
-#ifndef slic3r_EditCalibrationHistoryDialog_hpp_
-#define slic3r_EditCalibrationHistoryDialog_hpp_
-
-#include "GUI_Utils.hpp"
-
-namespace Slic3r { namespace GUI {
-
-class EditCalibrationHistoryDialog : public DPIDialog
-{
-public:
- EditCalibrationHistoryDialog(wxWindow* parent, wxString k, wxString n, wxString material_name, wxString nozzle_dia);
- ~EditCalibrationHistoryDialog();
- void on_dpi_changed(const wxRect& suggested_rect) override;
- float get_k_value();
- float get_n_value();
- wxString get_material_name_value();
-
-protected:
- void create(const wxString& k, const wxString& n, const wxString& material_name, const wxString& nozzle_dia);
- virtual void on_save(wxCommandEvent& event);
- virtual void on_cancel(wxCommandEvent& event);
-
-protected:
- float m_k_value;
- float m_n_value;
- std::string m_material_name;
-};
-
-}} // namespace Slic3r::GUI
-
-#endif
diff --git a/src/slic3r/GUI/HMSPanel.cpp b/src/slic3r/GUI/HMSPanel.cpp
index 810a53b156..9992e37af4 100644
--- a/src/slic3r/GUI/HMSPanel.cpp
+++ b/src/slic3r/GUI/HMSPanel.cpp
@@ -1,5 +1,6 @@
#include "HMS.hpp"
#include "HMSPanel.hpp"
+#include
#include
#include
#include "GUI.hpp"
@@ -231,4 +232,4 @@ bool HMSPanel::Show(bool show)
return wxPanel::Show(show);
}
-}}
\ No newline at end of file
+}}
diff --git a/src/slic3r/GUI/MainFrame.hpp b/src/slic3r/GUI/MainFrame.hpp
index a8a141ac82..9a0f3ca783 100644
--- a/src/slic3r/GUI/MainFrame.hpp
+++ b/src/slic3r/GUI/MainFrame.hpp
@@ -217,15 +217,14 @@ public:
//BBS GUI refactor
enum TabPosition
{
- tpHome = 0,
- tp3DEditor = 1,
- //tpSettings = 1,
- tpPreview = 2,
- tpMonitor = 3,
- tpProject = 4,
- tpCalibration = 5,
- toAuxiliary = 6,
- toDebugTool = 7,
+ tpHome = 0,
+ tp3DEditor = 1,
+ tpPreview = 2,
+ tpMonitor = 3,
+ tpProject = 4,
+ tpAuxiliary = 5,
+ tpCalibration = 6,
+ toDebugTool = 7,
};
//BBS: add slice&&print status update logic
diff --git a/src/slic3r/GUI/Monitor.cpp b/src/slic3r/GUI/Monitor.cpp
index 232753fca5..fade6c1429 100644
--- a/src/slic3r/GUI/Monitor.cpp
+++ b/src/slic3r/GUI/Monitor.cpp
@@ -160,162 +160,9 @@ MonitorPanel::~MonitorPanel()
{
m_side_tools = new SideTools(this, wxID_ANY);
wxBoxSizer* sizer_side_tools = new wxBoxSizer(wxVERTICAL);
-
- /* auto warning_panel = new wxPanel(this, wxID_ANY);
- warning_panel->SetBackgroundColour(wxColour(255, 111, 0));
- warning_panel->SetSize(wxSize(FromDIP(220), FromDIP(25)));
- warning_panel->SetMinSize(wxSize(FromDIP(220), FromDIP(25)));
- warning_panel->SetMaxSize(wxSize(FromDIP(220), FromDIP(25)));
- sizer_side_tools->Add(warning_panel, 0, wxEXPAND, 0);
-
- wxBoxSizer *sizer_boxh = new wxBoxSizer(wxVERTICAL);
- wxBoxSizer *sizer_boxv = new wxBoxSizer(wxHORIZONTAL);*/
-
- m_connection_info = new Button(this, wxEmptyString);
- m_connection_info->SetBackgroundColor(wxColour(255, 111, 0));
- m_connection_info->SetBorderColor(wxColour(255, 111, 0));
- m_connection_info->SetTextColor(*wxWHITE);
- m_connection_info->SetFont(::Label::Body_13);
- m_connection_info->SetCornerRadius(0);
- m_connection_info->SetSize(wxSize(FromDIP(-1), FromDIP(25)));
- m_connection_info->SetMinSize(wxSize(FromDIP(-1), FromDIP(25)));
- m_connection_info->SetMaxSize(wxSize(FromDIP(-1), FromDIP(25)));
-
-
- wxBoxSizer* connection_sizer_V = new wxBoxSizer(wxVERTICAL);
- wxBoxSizer* connection_sizer_H = new wxBoxSizer(wxHORIZONTAL);
-
- m_hyperlink = new wxHyperlinkCtrl(m_connection_info, wxID_ANY, _L("Failed to connect to the server"), wxT("https://wiki.bambulab.com/en/software/bambu-studio/failed-to-connect-printer"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE);
- m_hyperlink->SetBackgroundColour(wxColour(255, 111, 0));
-
- m_more_err_open = ScalableBitmap(this, "monitir_err_open", 16);
- m_more_err_close = ScalableBitmap(this, "monitir_err_close", 16);
- m_more_button = new ScalableButton(m_connection_info, wxID_ANY, "monitir_err_open");
- m_more_button->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) {SetCursor(wxCURSOR_HAND); });
- m_more_button->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) {SetCursor(wxCURSOR_ARROW); });
- m_more_button->Bind(wxEVT_LEFT_DOWN, [this](auto& e) {
- if (!m_more_err_state) {
- m_more_button->SetBitmap(m_more_err_close.bmp());
- Freeze();
- m_side_error_panel->Show();
- m_more_err_state = true;
- m_tabpanel->Refresh();
- m_tabpanel->Layout();
- Thaw();
- }
- else {
- m_more_button->SetBitmap(m_more_err_open.bmp());
- Freeze();
- m_side_error_panel->Hide();
- m_more_err_state = false;
- m_tabpanel->Refresh();
- m_tabpanel->Layout();
- Thaw();
- }
-
- });
-
- connection_sizer_H->Add(m_hyperlink, 0, wxALIGN_CENTER | wxALL, 5);
- connection_sizer_H->Add(m_more_button, 0, wxALIGN_CENTER | wxALL, 3);
- connection_sizer_V->Add(connection_sizer_H, 0, wxALIGN_CENTER, 0);
-
- m_connection_info->SetSizer(connection_sizer_V);
- m_connection_info->Layout();
- connection_sizer_V->Fit(m_connection_info);
-
- m_side_error_panel = new wxWindow(this,wxID_ANY);
- m_side_error_panel->SetBackgroundColour(wxColour(255,232,214));
- m_side_error_panel->SetMinSize(wxSize(-1, -1));
- m_side_error_panel->SetMaxSize(wxSize(-1, -1));
-
- m_side_error_panel->Hide();
- m_more_button->Hide();
- m_connection_info->Hide();
-
- wxBoxSizer* sizer_print_failed_info = new wxBoxSizer(wxVERTICAL);
- m_side_error_panel->SetSizer(sizer_print_failed_info);
-
- wxBoxSizer* sizer_error_code = new wxBoxSizer(wxHORIZONTAL);
- wxBoxSizer* sizer_error_desc = new wxBoxSizer(wxHORIZONTAL);
- wxBoxSizer* sizer_extra_info = new wxBoxSizer(wxHORIZONTAL);
-
- m_link_network_state = new Label(m_side_error_panel, _L("Check cloud service status"), wxALIGN_CENTER_HORIZONTAL|wxST_ELLIPSIZE_END);
- m_link_network_state->SetMinSize(wxSize(FromDIP(220), -1));
- m_link_network_state->SetMaxSize(wxSize(FromDIP(220), -1));
- m_link_network_state->SetForegroundColour(0x00AE42);
- m_link_network_state->SetFont(::Label::Body_12);
- m_link_network_state->Bind(wxEVT_LEFT_DOWN, [this](auto& e) {wxGetApp().link_to_network_check(); });
- m_link_network_state->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) {m_link_network_state->SetCursor(wxCURSOR_HAND); });
- m_link_network_state->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) {m_link_network_state->SetCursor(wxCURSOR_ARROW); });
-
- auto st_title_error_code = new wxStaticText(m_side_error_panel, wxID_ANY, _L("code"),wxDefaultPosition, wxDefaultSize, wxST_ELLIPSIZE_END);
- auto st_title_error_code_doc = new wxStaticText(m_side_error_panel, wxID_ANY, ": ");
- m_st_txt_error_code = new Label(m_side_error_panel, wxEmptyString);
- st_title_error_code->SetForegroundColour(0x909090);
- st_title_error_code_doc->SetForegroundColour(0x909090);
- m_st_txt_error_code->SetForegroundColour(0x909090);
- st_title_error_code->SetFont(::Label::Body_12);
- st_title_error_code_doc->SetFont(::Label::Body_12);
- m_st_txt_error_code->SetFont(::Label::Body_12);
- st_title_error_code->SetMinSize(wxSize(FromDIP(32), -1));
- st_title_error_code->SetMaxSize(wxSize(FromDIP(32), -1));
- m_st_txt_error_code->SetMinSize(wxSize(FromDIP(175), -1));
- m_st_txt_error_code->SetMaxSize(wxSize(FromDIP(175), -1));
- sizer_error_code->Add(st_title_error_code, 0, wxALL, 0);
- sizer_error_code->Add(st_title_error_code_doc, 0, wxALL, 0);
- sizer_error_code->Add(m_st_txt_error_code, 0, wxALL, 0);
-
-
- auto st_title_error_desc = new wxStaticText(m_side_error_panel, wxID_ANY, wxT("desc"),wxDefaultPosition, wxDefaultSize, wxST_ELLIPSIZE_END);
- auto st_title_error_desc_doc = new wxStaticText(m_side_error_panel, wxID_ANY, ": ");
- m_st_txt_error_desc = new Label(m_side_error_panel, wxEmptyString);
- st_title_error_desc->SetForegroundColour(0x909090);
- st_title_error_desc_doc->SetForegroundColour(0x909090);
- m_st_txt_error_desc->SetForegroundColour(0x909090);
- st_title_error_desc->SetFont(::Label::Body_12);
- st_title_error_desc_doc->SetFont(::Label::Body_12);
- m_st_txt_error_desc->SetFont(::Label::Body_12);
- st_title_error_desc->SetMinSize(wxSize(FromDIP(32), -1));
- st_title_error_desc->SetMaxSize(wxSize(FromDIP(32), -1));
- m_st_txt_error_desc->SetMinSize(wxSize(FromDIP(175), -1));
- m_st_txt_error_desc->SetMaxSize(wxSize(FromDIP(175), -1));
- sizer_error_desc->Add(st_title_error_desc, 0, wxALL, 0);
- sizer_error_desc->Add(st_title_error_desc_doc, 0, wxALL, 0);
- sizer_error_desc->Add(m_st_txt_error_desc, 0, wxALL, 0);
-
- auto st_title_extra_info = new wxStaticText(m_side_error_panel, wxID_ANY, wxT("info"),wxDefaultPosition, wxDefaultSize, wxST_ELLIPSIZE_END);
- auto st_title_extra_info_doc = new wxStaticText(m_side_error_panel, wxID_ANY, ": ");
- m_st_txt_extra_info = new Label(m_side_error_panel, wxEmptyString);
- st_title_extra_info->SetForegroundColour(0x909090);
- st_title_extra_info_doc->SetForegroundColour(0x909090);
- m_st_txt_extra_info->SetForegroundColour(0x909090);
- st_title_extra_info->SetFont(::Label::Body_12);
- st_title_extra_info_doc->SetFont(::Label::Body_12);
- m_st_txt_extra_info->SetFont(::Label::Body_12);
- st_title_extra_info->SetMinSize(wxSize(FromDIP(32), -1));
- st_title_extra_info->SetMaxSize(wxSize(FromDIP(32), -1));
- m_st_txt_extra_info->SetMinSize(wxSize(FromDIP(175), -1));
- m_st_txt_extra_info->SetMaxSize(wxSize(FromDIP(175), -1));
- sizer_extra_info->Add(st_title_extra_info, 0, wxALL, 0);
- sizer_extra_info->Add(st_title_extra_info_doc, 0, wxALL, 0);
- sizer_extra_info->Add(m_st_txt_extra_info, 0, wxALL, 0);
-
- sizer_print_failed_info->Add(m_link_network_state, 0, wxALIGN_CENTER, 3);
- sizer_print_failed_info->Add(sizer_error_code, 0, wxLEFT, 5);
- sizer_print_failed_info->Add(0, 0, 0, wxTOP, FromDIP(3));
- sizer_print_failed_info->Add(sizer_error_desc, 0, wxLEFT, 5);
- sizer_print_failed_info->Add(0, 0, 0, wxTOP, FromDIP(3));
- sizer_print_failed_info->Add(sizer_extra_info, 0, wxLEFT, 5);
-
- m_st_txt_error_desc->SetLabel("");
- m_st_txt_error_desc->Wrap(FromDIP(170));
-
-
-
- sizer_side_tools->Add(m_connection_info, 0, wxEXPAND, 0);
- sizer_side_tools->Add(m_side_error_panel, 0, wxEXPAND, 0);
sizer_side_tools->Add(m_side_tools, 1, wxEXPAND, 0);
m_tabpanel = new Tabbook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, sizer_side_tools, wxNB_LEFT | wxTAB_TRAVERSAL | wxNB_NOPAGETHEME);
+ m_side_tools->set_table_panel(m_tabpanel);
m_tabpanel->SetBackgroundColour(wxColour("#FEFFFF"));
m_tabpanel->Bind(wxEVT_BOOKCTRL_PAGE_CHANGED, [this](wxBookCtrlEvent& e) {
auto page = m_tabpanel->GetCurrentPage();
@@ -344,24 +191,6 @@ MonitorPanel::~MonitorPanel()
show_status((int)MonitorStatus::MONITOR_NO_PRINTER);
}
-void MonitorPanel::update_connect_err_info(int code, wxString desc, wxString info)
-{
- m_st_txt_error_code->SetLabelText(wxString::Format("%d", code));
- m_st_txt_error_desc->SetLabelText(desc);
- m_st_txt_extra_info->SetLabelText(info);
-
- m_st_txt_error_code->Wrap(FromDIP(175));
- m_st_txt_error_desc->Wrap(FromDIP(175));
- m_st_txt_extra_info->Wrap(FromDIP(175));
-
- if (code == BAMBU_NETWORK_ERR_CONNECTION_TO_PRINTER_FAILED) {
- m_link_network_state->Hide();
- }
- else if(code == BAMBU_NETWORK_ERR_CONNECTION_TO_SERVER_FAILED){
- m_link_network_state->Show();
- }
-}
-
void MonitorPanel::set_default()
{
obj = nullptr;
@@ -403,7 +232,6 @@ void MonitorPanel::msw_rescale()
/* side_tool rescale */
m_side_tools->msw_rescale();
-
m_tabpanel->Rescale();
//m_status_add_machine_panel->msw_rescale();
m_status_info_panel->msw_rescale();
@@ -411,11 +239,6 @@ void MonitorPanel::msw_rescale()
m_upgrade_panel->msw_rescale();
m_hms_panel->msw_rescale();
- m_connection_info->SetCornerRadius(0);
- m_connection_info->SetSize(wxSize(FromDIP(220), FromDIP(25)));
- m_connection_info->SetMinSize(wxSize(FromDIP(220), FromDIP(25)));
- m_connection_info->SetMaxSize(wxSize(FromDIP(220), FromDIP(25)));
-
Layout();
Refresh();
}
@@ -489,41 +312,6 @@ void MonitorPanel::on_size(wxSizeEvent &event)
Refresh();
}
- void MonitorPanel::update_status(MachineObject* obj)
-{
- if (!obj) return;
-
- /* Update Device Info */
- m_side_tools->set_current_printer_name(obj->dev_name);
-
- // update wifi signal image
- int wifi_signal_val = 0;
- if (!obj->is_connected() || obj->is_connecting()) {
- m_side_tools->set_current_printer_signal(WifiSignal::NONE);
- } else {
- if (!obj->wifi_signal.empty() && boost::ends_with(obj->wifi_signal, "dBm")) {
- try {
- wifi_signal_val = std::stoi(obj->wifi_signal.substr(0, obj->wifi_signal.size() - 3));
- }
- catch (...) {
- ;
- }
- if (wifi_signal_val > -45) {
- m_side_tools->set_current_printer_signal(WifiSignal::STRONG);
- }
- else if (wifi_signal_val <= -45 && wifi_signal_val >= -60) {
- m_side_tools->set_current_printer_signal(WifiSignal::MIDDLE);
- }
- else {
- m_side_tools->set_current_printer_signal(WifiSignal::WEAK);
- }
- }
- else {
- m_side_tools->set_current_printer_signal(WifiSignal::MIDDLE);
- }
- }
-}
-
void MonitorPanel::update_all()
{
NetworkAgent* m_agent = wxGetApp().getAgent();
@@ -561,13 +349,10 @@ void MonitorPanel::update_all()
}
m_status_info_panel->obj = obj;
- m_upgrade_panel->update(obj);
-
-
m_status_info_panel->m_media_play_ctrl->SetMachineObject(obj);
+ m_upgrade_panel->update(obj);
m_media_file_panel->SetMachineObject(obj);
-
- update_status(obj);
+ m_side_tools->update_status(obj);
if (!obj) {
show_status((int)MONITOR_NO_PRINTER);
@@ -659,10 +444,7 @@ void MonitorPanel::update_side_panel()
void MonitorPanel::show_status(int status)
{
if (!m_initialized) return;
-
- if (last_status == status)
- return;
-
+ if (last_status == status)return;
if (last_status & (int)MonitorStatus::MONITOR_CONNECTING != 0) {
NetworkAgent* agent = wxGetApp().getAgent();
json j;
@@ -684,49 +466,14 @@ void MonitorPanel::show_status(int status)
BOOST_LOG_TRIVIAL(info) << "monitor: show_status = " << status;
- if (((status & (int) MonitorStatus::MONITOR_DISCONNECTED) != 0) || ((status & (int) MonitorStatus::MONITOR_DISCONNECTED_SERVER) != 0)) {
- if ((status & (int)MonitorStatus::MONITOR_DISCONNECTED_SERVER)) {
- m_hyperlink->SetLabel(_L("Failed to connect to the server"));
- update_connect_err_info(BAMBU_NETWORK_ERR_CONNECTION_TO_SERVER_FAILED,
- _L("Failed to connect to cloud service"),
- _L("Please click on the hyperlink above to view the cloud service status"));
- }
- else {
- m_hyperlink->SetLabel(_L("Failed to connect to the printer"));
- update_connect_err_info(BAMBU_NETWORK_ERR_CONNECTION_TO_PRINTER_FAILED,
- _L("Connection to printer failed"),
- _L("Please check the network connection of the printer and Studio."));
- }
-
- m_hyperlink->Show();
- m_connection_info->SetLabel(wxEmptyString);
- m_connection_info->SetBackgroundColor(0xFF6F00);
- m_connection_info->SetBorderColor(0xFF6F00);
- m_connection_info->Show();
- m_more_button->Show();
-
-
-
+
#if !BBL_RELEASE_TO_PUBLIC
- m_upgrade_panel->update(nullptr);
+ m_upgrade_panel->update(nullptr);
#endif
- } else if ((status & (int) MonitorStatus::MONITOR_NORMAL) != 0) {
- m_connection_info->Hide();
- m_more_button->Hide();
- m_side_error_panel->Hide();
- } else if ((status & (int) MonitorStatus::MONITOR_CONNECTING) != 0) {
- m_hyperlink->Hide();
- m_connection_info->SetLabel(_L("Connecting..."));
- m_connection_info->SetBackgroundColor(0x00AE42);
- m_connection_info->SetBorderColor(0x00AE42);
- m_connection_info->Show();
- m_more_button->Hide();
- m_side_error_panel->Hide();
- }
-
- Freeze();
+Freeze();
// update panels
+ if (m_side_tools) { m_side_tools->show_status(status); };
m_status_info_panel->show_status(status);
m_hms_panel->show_status(status);
m_upgrade_panel->show_status(status);
@@ -734,31 +481,23 @@ void MonitorPanel::show_status(int status)
if ((status & (int)MonitorStatus::MONITOR_NO_PRINTER) != 0) {
set_default();
- m_side_tools->set_none_printer_mode();
- m_connection_info->Hide();
- m_side_error_panel->Hide();
- m_more_button->Hide();
- m_tabpanel->Refresh();
m_tabpanel->Layout();
-#if !BBL_RELEASE_TO_PUBLIC
- m_upgrade_panel->update(nullptr);
-#endif
- } else if (((status & (int)MonitorStatus::MONITOR_NORMAL) != 0)
- || ((status & (int)MonitorStatus::MONITOR_DISCONNECTED) != 0)
- || ((status & (int) MonitorStatus::MONITOR_DISCONNECTED_SERVER) != 0)
- || ((status & (int)MonitorStatus::MONITOR_CONNECTING) != 0)
- ) {
- if (((status & (int) MonitorStatus::MONITOR_DISCONNECTED) != 0)
- || ((status & (int) MonitorStatus::MONITOR_DISCONNECTED_SERVER) != 0)
- || ((status & (int)MonitorStatus::MONITOR_CONNECTING) != 0)) {
- m_side_tools->set_current_printer_signal(WifiSignal::NONE);
+ } else if (((status & (int)MonitorStatus::MONITOR_NORMAL) != 0)
+ || ((status & (int)MonitorStatus::MONITOR_DISCONNECTED) != 0)
+ || ((status & (int) MonitorStatus::MONITOR_DISCONNECTED_SERVER) != 0)
+ || ((status & (int)MonitorStatus::MONITOR_CONNECTING) != 0) )
+ {
+
+ if (((status & (int) MonitorStatus::MONITOR_DISCONNECTED) != 0)
+ || ((status & (int) MonitorStatus::MONITOR_DISCONNECTED_SERVER) != 0)
+ || ((status & (int)MonitorStatus::MONITOR_CONNECTING) != 0))
+ {
set_default();
}
- m_tabpanel->Refresh();
m_tabpanel->Layout();
}
Layout();
- Thaw();
+Thaw();
}
} // GUI
diff --git a/src/slic3r/GUI/Monitor.hpp b/src/slic3r/GUI/Monitor.hpp
index bb2899a232..71f2b80de2 100644
--- a/src/slic3r/GUI/Monitor.hpp
+++ b/src/slic3r/GUI/Monitor.hpp
@@ -83,9 +83,6 @@ private:
MediaFilePanel* m_media_file_panel;
UpgradePanel* m_upgrade_panel;
HMSPanel* m_hms_panel;
- Button * m_connection_info{nullptr};
- wxWindow * m_side_error_panel{nullptr};
- wxHyperlinkCtrl* m_hyperlink{nullptr};
/* side tools */
SideTools* m_side_tools{nullptr};
@@ -94,12 +91,6 @@ private:
wxStaticText* m_staticText_printer_name;
wxStaticBitmap* m_bitmap_wifi_signal;
wxBoxSizer * m_side_tools_sizer;
-
- Label* m_link_network_state;
- Label* m_st_txt_error_code;
- Label* m_st_txt_error_desc;
- Label* m_st_txt_extra_info;
-
SelectMachinePopup m_select_machine;
/* images */
@@ -110,15 +101,10 @@ private:
wxBitmap m_printer_img;
wxBitmap m_arrow_img;
- ScalableButton* m_more_button;
- bool m_more_err_state{false};
- ScalableBitmap m_more_err_open;
- ScalableBitmap m_more_err_close;
-
int last_wifi_signal = -1;
- wxTimer* m_refresh_timer = nullptr;
int last_status;
bool m_initialized { false };
+ wxTimer* m_refresh_timer = nullptr;
public:
MonitorPanel(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTAB_TRAVERSAL);
@@ -136,7 +122,6 @@ public:
void init_bitmap();
void init_timer();
void init_tabpanel();
- void update_connect_err_info(int code, wxString desc, wxString info);
Tabbook* get_tabpanel() { return m_tabpanel; };
void set_default();
wxWindow* create_side_tools();
@@ -152,7 +137,6 @@ public:
void on_size(wxSizeEvent &event);
/* update apis */
- void update_status(MachineObject* obj);
//void update_ams(MachineObject* obj);
void update_all();
@@ -165,6 +149,7 @@ public:
std::string last_conn_type = "undedefined";
};
+
} // GUI
} // Slic3r
diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp
index 68a710984c..351bdc44ce 100644
--- a/src/slic3r/GUI/Plater.cpp
+++ b/src/slic3r/GUI/Plater.cpp
@@ -1406,18 +1406,10 @@ void Sidebar::on_bed_type_change(BedType bed_type)
m_bed_type_list->SetSelection(sel_idx);
}
-void Sidebar::load_ams_list(std::string const &device, MachineObject* obj)
+std::map Sidebar::build_filament_ams_list(MachineObject* obj)
{
std::map filament_ams_list;
-
- if (!obj) {
- p->ams_list_device = device;
- BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " clear list";
- wxGetApp().preset_bundle->filament_ams_list = filament_ams_list;
- for (auto c : p->combos_filament)
- c->update();
- return;
- }
+ if (!obj) return filament_ams_list;
auto vt_tray = obj->vt_tray;
bool is_support_virtual_tray = obj->is_function_supported(PrinterFunction::FUNC_VIRTUAL_TYAY);
@@ -1426,8 +1418,8 @@ void Sidebar::load_ams_list(std::string const &device, MachineObject* obj)
vt_tray_config.set_key_value("filament_id", new ConfigOptionStrings{ vt_tray.setting_id });
vt_tray_config.set_key_value("tag_uid", new ConfigOptionStrings{ vt_tray.tag_uid });
vt_tray_config.set_key_value("filament_type", new ConfigOptionStrings{ vt_tray.type });
- vt_tray_config.set_key_value("tray_name", new ConfigOptionStrings{std::string("Ext")});
- vt_tray_config.set_key_value("filament_colour", new ConfigOptionStrings{into_u8(wxColour("#" + vt_tray.color).GetAsString(wxC2S_HTML_SYNTAX))});
+ vt_tray_config.set_key_value("tray_name", new ConfigOptionStrings{ std::string("Ext") });
+ vt_tray_config.set_key_value("filament_colour", new ConfigOptionStrings{ into_u8(wxColour("#" + vt_tray.color).GetAsString(wxC2S_HTML_SYNTAX)) });
vt_tray_config.set_key_value("filament_exist", new ConfigOptionBools{ true });
filament_ams_list.emplace(VIRTUAL_TRAY_ID, std::move(vt_tray_config));
@@ -1438,19 +1430,35 @@ void Sidebar::load_ams_list(std::string const &device, MachineObject* obj)
char n = ams.first.front() - '0' + 'A';
for (auto tray : ams.second->trayList) {
BOOST_LOG_TRIVIAL(info) << __FUNCTION__
- << boost::format(": ams %1% tray %2% id %3% color %4%") % ams.first % tray.first % tray.second->setting_id % tray.second->color;
+ << boost::format(": ams %1% tray %2% id %3% color %4%") % ams.first % tray.first % tray.second->setting_id % tray.second->color;
char t = tray.first.front() - '0' + '1';
DynamicPrintConfig tray_config;
- tray_config.set_key_value("filament_id", new ConfigOptionStrings{tray.second->setting_id});
+ tray_config.set_key_value("filament_id", new ConfigOptionStrings{ tray.second->setting_id });
tray_config.set_key_value("tag_uid", new ConfigOptionStrings{ tray.second->tag_uid });
- tray_config.set_key_value("filament_type", new ConfigOptionStrings{tray.second->type});
- tray_config.set_key_value("tray_name", new ConfigOptionStrings{std::string(1, n) + std::string(1, t)});
- tray_config.set_key_value("filament_colour", new ConfigOptionStrings{into_u8(wxColour("#" + tray.second->color).GetAsString(wxC2S_HTML_SYNTAX))});
- tray_config.set_key_value("filament_exist", new ConfigOptionBools{tray.second->is_exists});
+ tray_config.set_key_value("filament_type", new ConfigOptionStrings{ tray.second->type });
+ tray_config.set_key_value("tray_name", new ConfigOptionStrings{ std::string(1, n) + std::string(1, t) });
+ tray_config.set_key_value("filament_colour", new ConfigOptionStrings{ into_u8(wxColour("#" + tray.second->color).GetAsString(wxC2S_HTML_SYNTAX)) });
+ tray_config.set_key_value("filament_exist", new ConfigOptionBools{ tray.second->is_exists });
filament_ams_list.emplace(((n - 'A') * 4 + t - '1'), std::move(tray_config));
}
}
+ return filament_ams_list;
+}
+
+void Sidebar::load_ams_list(std::string const &device, MachineObject* obj)
+{
+ std::map filament_ams_list = build_filament_ams_list(obj);
+
+ if (!obj) {
+ p->ams_list_device = device;
+ BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " clear list";
+ wxGetApp().preset_bundle->filament_ams_list = filament_ams_list;
+ for (auto c : p->combos_filament)
+ c->update();
+ return;
+ }
+
p->ams_list_device = device;
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(": %1% items") % filament_ams_list.size();
wxGetApp().preset_bundle->filament_ams_list = filament_ams_list;
@@ -10789,9 +10797,11 @@ void Plater::send_calibration_job_finished(wxCommandEvent & evt)
auto calibration_panel = p->main_frame->m_calibration;
if (calibration_panel) {
auto curr_wizard = static_cast(calibration_panel->get_tabpanel()->GetPage(evt.GetInt()));
- curr_wizard->show_send_progress_bar(false);
- curr_wizard->show_page(curr_wizard->get_curr_page()->get_next_page());
+ wxCommandEvent event(EVT_CALIBRATION_JOB_FINISHED);
+ event.SetEventObject(curr_wizard);
+ wxPostEvent(curr_wizard, event);
}
+ evt.Skip();
}
void Plater::print_job_finished(wxCommandEvent &evt)
diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp
index de29ca4ea6..a3d8b3739a 100644
--- a/src/slic3r/GUI/Plater.hpp
+++ b/src/slic3r/GUI/Plater.hpp
@@ -127,6 +127,7 @@ public:
// BBS
void on_bed_type_change(BedType bed_type);
void load_ams_list(std::string const & device, MachineObject* obj);
+ std::map build_filament_ams_list(MachineObject* obj);
void sync_ams_list();
ObjectList* obj_list();
@@ -331,7 +332,7 @@ public:
void export_gcode(bool prefer_removable);
void export_gcode_3mf(bool export_all = false);
void send_gcode_finish(wxString name);
- void export_core_3mf();
+ void export_core_3mf();
static TriangleMesh combine_mesh_fff(const ModelObject& mo, int instance_id, std::function notify_func = {});
void export_stl(bool extended = false, bool selection_only = false);
//BBS: remove amf
diff --git a/src/slic3r/GUI/PresetComboBoxes.cpp b/src/slic3r/GUI/PresetComboBoxes.cpp
index e79cc7e3c1..0ce3f3e61d 100644
--- a/src/slic3r/GUI/PresetComboBoxes.cpp
+++ b/src/slic3r/GUI/PresetComboBoxes.cpp
@@ -1522,16 +1522,12 @@ void GUI::CalibrateFilamentComboBox::OnSelect(wxCommandEvent &evt)
}
m_is_compatible = true;
static_cast(m_parent)->Enable(true);
- std::string selected_name = evt.GetString().ToUTF8().data();
- selected_name = Preset::remove_suffix_modified(selected_name);
- m_selected_preset = m_collection->find_preset(selected_name);
- std::string preset_name = m_collection->get_preset_name_by_alias(selected_name);
- m_selected_preset = m_collection->find_preset(preset_name);
- SimpleEvent e(EVT_CALIBRATION_TRAY_SELECTION_CHANGED);
- auto cali_tab = wxGetApp().mainframe->m_calibration->get_tabpanel();
- auto calibration_wizard = static_cast(cali_tab->GetPage(cali_tab->GetSelection()));
- e.SetEventObject(calibration_wizard);
- wxPostEvent(calibration_wizard, e);
+ std::string preset_name = m_collection->get_preset_name_by_alias(evt.GetString().ToUTF8().data());
+ m_selected_preset = m_collection->find_preset(preset_name);
+
+ wxCommandEvent e(EVT_CALI_TRAY_CHANGED);
+ e.SetEventObject(m_parent);
+ wxPostEvent(m_parent, e);
}
} // namespace Slic3r
diff --git a/src/slic3r/GUI/StatusPanel.cpp b/src/slic3r/GUI/StatusPanel.cpp
index 8db4279202..d4ab741d37 100644
--- a/src/slic3r/GUI/StatusPanel.cpp
+++ b/src/slic3r/GUI/StatusPanel.cpp
@@ -4,6 +4,8 @@
#include "Widgets/Label.hpp"
#include "Widgets/Button.hpp"
#include "Widgets/StepCtrl.hpp"
+#include "Widgets/SideTools.hpp"
+
#include "BitmapCache.hpp"
#include "GUI_App.hpp"
@@ -101,6 +103,510 @@ static std::vector message_containing_retry{
#define AXIS_MIN_SIZE (wxSize(FromDIP(220), FromDIP(220)))
#define EXTRUDER_IMAGE_SIZE (wxSize(FromDIP(48), FromDIP(76)))
+PrintingTaskPanel::PrintingTaskPanel(wxWindow* parent, PrintingTaskType type)
+ : wxPanel(parent, wxID_ANY,wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL)
+{
+ m_type = type;
+ create_panel(this);
+ SetBackgroundColour(*wxWHITE);
+}
+
+PrintingTaskPanel::~PrintingTaskPanel()
+{
+}
+
+
+void PrintingTaskPanel::create_panel(wxWindow* parent)
+{
+ wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
+ wxBoxSizer *bSizer_printing_title = new wxBoxSizer(wxHORIZONTAL);
+
+ m_panel_printing_title = new wxPanel(parent, wxID_ANY, wxDefaultPosition, wxSize(-1, PAGE_TITLE_HEIGHT), wxTAB_TRAVERSAL);
+ m_panel_printing_title->SetBackgroundColour(STATUS_TITLE_BG);
+
+ m_staticText_printing = new wxStaticText(m_panel_printing_title, wxID_ANY ,_L("Printing Progress"));
+ m_staticText_printing->Wrap(-1);
+ m_staticText_printing->SetFont(PAGE_TITLE_FONT);
+ m_staticText_printing->SetForegroundColour(PAGE_TITLE_FONT_COL);
+
+ bSizer_printing_title->Add(m_staticText_printing, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, PAGE_TITLE_LEFT_MARGIN);
+ bSizer_printing_title->Add(0, 0, 1, wxEXPAND, 0);
+
+ m_panel_printing_title->SetSizer(bSizer_printing_title);
+ m_panel_printing_title->Layout();
+ bSizer_printing_title->Fit(m_panel_printing_title);
+
+ m_bitmap_thumbnail = new wxStaticBitmap(parent, wxID_ANY, m_thumbnail_placeholder.bmp(), wxDefaultPosition, TASK_THUMBNAIL_SIZE, 0);
+
+
+
+ wxBoxSizer *bSizer_subtask_info = new wxBoxSizer(wxVERTICAL);
+ wxBoxSizer *bSizer_task_name = new wxBoxSizer(wxVERTICAL);
+ wxBoxSizer *bSizer_task_name_hor = new wxBoxSizer(wxHORIZONTAL);
+ wxPanel* task_name_panel = new wxPanel(parent);
+
+ m_staticText_subtask_value = new wxStaticText(task_name_panel, wxID_ANY, _L("N/A"), wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT | wxST_ELLIPSIZE_END);
+ m_staticText_subtask_value->Wrap(-1);
+ #ifdef __WXOSX_MAC__
+ m_staticText_subtask_value->SetFont(::Label::Body_13);
+ #else
+ m_staticText_subtask_value->SetFont(wxFont(13, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxT("HarmonyOS Sans SC")));
+ #endif
+ m_staticText_subtask_value->SetForegroundColour(wxColour(44, 44, 46));
+
+ m_bitmap_static_use_time = new wxStaticBitmap(task_name_panel, wxID_ANY, m_bitmap_use_time.bmp(), wxDefaultPosition, wxSize(FromDIP(16), FromDIP(16)));
+
+ m_staticText_consumption_of_time = new wxStaticText(task_name_panel, wxID_ANY, "0m", wxDefaultPosition, wxDefaultSize, 0);
+ m_staticText_consumption_of_time->SetFont(::Label::Body_12);
+ m_staticText_consumption_of_time->SetForegroundColour(wxColour(0x68, 0x68, 0x68));
+ m_staticText_consumption_of_time->Wrap(-1);
+
+
+ m_bitmap_static_use_weight = new wxStaticBitmap(task_name_panel, wxID_ANY, m_bitmap_use_weight.bmp(), wxDefaultPosition, wxSize(FromDIP(16), FromDIP(16)));
+
+
+ m_staticText_consumption_of_weight = new wxStaticText(task_name_panel, wxID_ANY, "0g", wxDefaultPosition, wxDefaultSize, 0);
+ m_staticText_consumption_of_weight->SetFont(::Label::Body_12);
+ m_staticText_consumption_of_weight->SetForegroundColour(wxColour(0x68, 0x68, 0x68));
+ m_staticText_consumption_of_weight->Wrap(-1);
+
+ bSizer_task_name_hor->Add(m_staticText_subtask_value, 1, wxALL | wxEXPAND, 0);
+ bSizer_task_name_hor->Add(0, 0, 1, wxEXPAND, 0);
+ bSizer_task_name_hor->Add(m_bitmap_static_use_time, 0, wxALIGN_CENTER_VERTICAL, 0);
+ bSizer_task_name_hor->Add(m_staticText_consumption_of_time, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, FromDIP(3));
+ bSizer_task_name_hor->Add(0, 0, 0, wxLEFT, FromDIP(20));
+ bSizer_task_name_hor->Add(m_bitmap_static_use_weight, 0, wxALIGN_CENTER_VERTICAL, 0);
+ bSizer_task_name_hor->Add(m_staticText_consumption_of_weight, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, FromDIP(3));
+ bSizer_task_name_hor->Add(0, 0, 0, wxRIGHT, FromDIP(10));
+
+
+ task_name_panel->SetSizer(bSizer_task_name_hor);
+ task_name_panel->Layout();
+ task_name_panel->Fit();
+
+ bSizer_task_name->Add(task_name_panel, 0, wxEXPAND, FromDIP(5));
+
+
+ /* wxFlexGridSizer *fgSizer_task = new wxFlexGridSizer(2, 2, 0, 0);
+ fgSizer_task->AddGrowableCol(0);
+ fgSizer_task->SetFlexibleDirection(wxVERTICAL);
+ fgSizer_task->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);*/
+
+ m_printing_stage_value = new wxStaticText(parent, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT | wxST_ELLIPSIZE_END);
+ m_printing_stage_value->Wrap(-1);
+ #ifdef __WXOSX_MAC__
+ m_printing_stage_value->SetFont(::Label::Body_11);
+ #else
+ m_printing_stage_value->SetFont(wxFont(11, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxT("HarmonyOS Sans SC")));
+ #endif
+
+ m_printing_stage_value->SetForegroundColour(STAGE_TEXT_COL);
+
+
+ m_staticText_profile_value = new wxStaticText(parent, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT | wxST_ELLIPSIZE_END);
+ m_staticText_profile_value->Wrap(-1);
+#ifdef __WXOSX_MAC__
+ m_staticText_profile_value->SetFont(::Label::Body_11);
+#else
+ m_staticText_profile_value->SetFont(wxFont(11, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxT("HarmonyOS Sans SC")));
+#endif
+
+ m_staticText_profile_value->SetForegroundColour(0x6B6B6B);
+
+
+ auto m_panel_progress = new wxPanel(parent, wxID_ANY);
+ m_panel_progress->SetBackgroundColour(*wxWHITE);
+ auto m_sizer_progressbar = new wxBoxSizer(wxHORIZONTAL);
+ m_gauge_progress = new ProgressBar(m_panel_progress, wxID_ANY, 100, wxDefaultPosition, wxDefaultSize);
+ m_gauge_progress->SetValue(0);
+ m_gauge_progress->SetHeight(PROGRESSBAR_HEIGHT);
+ m_gauge_progress->SetMaxSize(wxSize(FromDIP(600), -1));
+ m_panel_progress->SetSizer(m_sizer_progressbar);
+ m_panel_progress->Layout();
+ m_panel_progress->SetSize(wxSize(-1, FromDIP(24)));
+ m_panel_progress->SetMaxSize(wxSize(-1, FromDIP(24)));
+
+ wxBoxSizer *bSizer_task_btn = new wxBoxSizer(wxHORIZONTAL);
+
+ bSizer_task_btn->Add(FromDIP(10), 0, 0);
+
+ m_button_pause_resume = new ScalableButton(m_panel_progress, wxID_ANY, "print_control_pause", wxEmptyString, wxDefaultSize, wxDefaultPosition, wxBU_EXACTFIT | wxNO_BORDER,true);
+
+ m_button_pause_resume->Bind(wxEVT_ENTER_WINDOW, [this](auto &e) {
+ if (m_button_pause_resume->GetToolTipText() == _L("Pause")) {
+ m_button_pause_resume->SetBitmap_("print_control_pause_hover");
+ }
+
+ if (m_button_pause_resume->GetToolTipText() == _L("Resume")) {
+ m_button_pause_resume->SetBitmap_("print_control_resume_hover");
+ }
+ });
+
+ m_button_pause_resume->Bind(wxEVT_LEAVE_WINDOW, [this](auto &e) {
+ auto buf = m_button_pause_resume->GetClientData();
+ if (m_button_pause_resume->GetToolTipText() == _L("Pause")) {
+ m_button_pause_resume->SetBitmap_("print_control_pause");
+ }
+
+ if (m_button_pause_resume->GetToolTipText() == _L("Resume")) {
+ m_button_pause_resume->SetBitmap_("print_control_resume");
+ }
+ });
+
+ m_button_abort = new ScalableButton(m_panel_progress, wxID_ANY, "print_control_stop", wxEmptyString, wxDefaultSize, wxDefaultPosition, wxBU_EXACTFIT | wxNO_BORDER, true);
+ m_button_abort->SetToolTip(_L("Stop"));
+
+ m_button_abort->Bind(wxEVT_ENTER_WINDOW, [this](auto &e) {
+ m_button_abort->SetBitmap_("print_control_stop_hover");
+ });
+
+ m_button_abort->Bind(wxEVT_LEAVE_WINDOW, [this](auto &e) {
+ m_button_abort->SetBitmap_("print_control_stop"); }
+ );
+
+ m_sizer_progressbar->Add(m_gauge_progress, 1, wxALIGN_CENTER_VERTICAL, 0);
+ m_sizer_progressbar->Add(0, 0, 0, wxEXPAND|wxLEFT, FromDIP(18));
+ m_sizer_progressbar->Add(m_button_pause_resume, 0, wxALL, FromDIP(5));
+ m_sizer_progressbar->Add(0, 0, 0, wxEXPAND|wxLEFT, FromDIP(18));
+ m_sizer_progressbar->Add(m_button_abort, 0, wxALL, FromDIP(5));
+
+ wxBoxSizer *bSizer_buttons = new wxBoxSizer(wxHORIZONTAL);
+ wxBoxSizer *bSizer_text = new wxBoxSizer(wxHORIZONTAL);
+ wxPanel* penel_bottons = new wxPanel(parent);
+ wxPanel* penel_text = new wxPanel(penel_bottons);
+
+ penel_text->SetBackgroundColour(*wxWHITE);
+ penel_bottons->SetBackgroundColour(*wxWHITE);
+
+ wxBoxSizer *sizer_percent = new wxBoxSizer(wxVERTICAL);
+ sizer_percent->Add(0, 0, 1, wxEXPAND, 0);
+
+ wxBoxSizer *sizer_percent_icon = new wxBoxSizer(wxVERTICAL);
+ sizer_percent_icon->Add(0, 0, 1, wxEXPAND, 0);
+
+
+ m_staticText_progress_percent = new wxStaticText(penel_text, wxID_ANY, L("0"), wxDefaultPosition, wxDefaultSize, 0);
+ m_staticText_progress_percent->SetFont(::Label::Head_18);
+ m_staticText_progress_percent->SetMaxSize(wxSize(-1, FromDIP(20)));
+ m_staticText_progress_percent->SetForegroundColour(wxColour(0, 174, 66));
+
+ m_staticText_progress_percent_icon = new wxStaticText(penel_text, wxID_ANY, L("%"), wxDefaultPosition, wxDefaultSize, 0);
+ m_staticText_progress_percent_icon->SetFont(::Label::Body_11);
+ m_staticText_progress_percent_icon->SetMaxSize(wxSize(-1, FromDIP(13)));
+ m_staticText_progress_percent_icon->SetForegroundColour(wxColour(0, 174, 66));
+
+ sizer_percent->Add(m_staticText_progress_percent, 0, 0, 0);
+
+ #ifdef __WXOSX_MAC__
+ sizer_percent_icon->Add(m_staticText_progress_percent_icon, 0, wxBOTTOM, FromDIP(2));
+ #else
+ sizer_percent_icon->Add(m_staticText_progress_percent_icon, 0, 0, 0);
+ #endif
+
+
+ m_staticText_progress_left = new wxStaticText(penel_text, wxID_ANY, L("N/A"), wxDefaultPosition, wxDefaultSize, 0);
+ m_staticText_progress_left->Wrap(-1);
+ m_staticText_progress_left->SetFont(wxFont(12, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxT("HarmonyOS Sans SC")));
+ m_staticText_progress_left->SetForegroundColour(wxColour(146, 146, 146));
+
+ //fgSizer_task->Add(bSizer_buttons, 0, wxEXPAND, 0);
+ //fgSizer_task->Add(0, 0, 0, wxEXPAND, FromDIP(5));
+
+ wxPanel* panel_button_block = new wxPanel(penel_bottons, wxID_ANY);
+ panel_button_block->SetMinSize(wxSize(TASK_BUTTON_SIZE.x * 2 + FromDIP(5) * 4, -1));
+ panel_button_block->SetMinSize(wxSize(TASK_BUTTON_SIZE.x * 2 + FromDIP(5) * 4, -1));
+ panel_button_block->SetSize(wxSize(TASK_BUTTON_SIZE.x * 2 + FromDIP(5) * 2, -1));
+ panel_button_block->SetBackgroundColour(*wxWHITE);
+
+ m_staticText_layers = new wxStaticText(penel_text, wxID_ANY, _L("Layer: N/A"));
+ m_staticText_layers->SetFont(wxFont(12, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxT("HarmonyOS Sans SC")));
+ m_staticText_layers->SetForegroundColour(wxColour(146, 146, 146));
+ m_staticText_layers->Hide();
+
+ //bSizer_text->Add(m_staticText_progress_percent, 0, wxALL, 0);
+ bSizer_text->Add(sizer_percent, 0, wxEXPAND, 0);
+ bSizer_text->Add(sizer_percent_icon, 0, wxEXPAND, 0);
+ bSizer_text->Add(0, 0, 1, wxEXPAND, 0);
+ bSizer_text->Add(m_staticText_layers, 0, wxALIGN_CENTER | wxALL, 0);
+ bSizer_text->Add(0, 0, 0, wxLEFT, FromDIP(20));
+ bSizer_text->Add(m_staticText_progress_left, 0, wxALIGN_CENTER | wxALL, 0);
+
+ penel_text->SetMaxSize(wxSize(FromDIP(600), -1));
+ penel_text->SetSizer(bSizer_text);
+ penel_text->Layout();
+
+ bSizer_buttons->Add(penel_text, 1, wxEXPAND | wxALL, 0);
+ bSizer_buttons->Add(panel_button_block, 0, wxALIGN_CENTER | wxALL, 0);
+
+ penel_bottons->SetSizer(bSizer_buttons);
+ penel_bottons->Layout();
+
+ StateColor btn_bg_green(std::pair(AMS_CONTROL_DISABLE_COLOUR, StateColor::Disabled), std::pair(wxColour(27, 136, 68), StateColor::Pressed),
+ std::pair(wxColour(61, 203, 115), StateColor::Hovered), std::pair(AMS_CONTROL_BRAND_COLOUR, StateColor::Normal));
+ StateColor btn_bd_green(std::pair(AMS_CONTROL_WHITE_COLOUR, StateColor::Disabled), std::pair(AMS_CONTROL_BRAND_COLOUR, StateColor::Enabled));
+
+ m_button_market_scoring = new Button(parent, _L("Immediately score"));
+ m_button_market_scoring->SetBackgroundColor(btn_bg_green);
+ m_button_market_scoring->SetBorderColor(btn_bd_green);
+ m_button_market_scoring->SetTextColor(wxColour("#FFFFFE"));
+ m_button_market_scoring->SetSize(wxSize(FromDIP(128), FromDIP(26)));
+ m_button_market_scoring->SetMinSize(wxSize(-1, FromDIP(26)));
+ m_button_market_scoring->SetCornerRadius(FromDIP(13));
+
+ wxBoxSizer *bSizer_market_scoring = new wxBoxSizer(wxHORIZONTAL);
+ bSizer_market_scoring->Add(m_button_market_scoring);
+ bSizer_market_scoring->Add(0, 0, 1, wxEXPAND, 0);
+ m_button_market_scoring->Hide();
+
+ bSizer_subtask_info->Add(0, 0, 0, wxEXPAND | wxTOP, FromDIP(14));
+ bSizer_subtask_info->Add(bSizer_task_name, 0, wxEXPAND|wxRIGHT, FromDIP(18));
+ bSizer_subtask_info->Add(m_staticText_profile_value, 0, wxEXPAND | wxTOP, FromDIP(5));
+ bSizer_subtask_info->Add(m_printing_stage_value, 0, wxEXPAND | wxTOP, FromDIP(5));
+ bSizer_subtask_info->Add(bSizer_market_scoring, 0, wxEXPAND | wxTOP, FromDIP(5));
+ bSizer_subtask_info->Add(penel_bottons, 0, wxEXPAND | wxTOP, FromDIP(10));
+ bSizer_subtask_info->Add(m_panel_progress, 0, wxEXPAND|wxRIGHT, FromDIP(25));
+
+
+ m_printing_sizer = new wxBoxSizer(wxHORIZONTAL);
+ m_printing_sizer->SetMinSize(wxSize(PAGE_MIN_WIDTH, -1));
+ m_printing_sizer->Add(m_bitmap_thumbnail, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT | wxLEFT, FromDIP(12));
+ m_printing_sizer->Add(FromDIP(8), 0, 0, wxEXPAND, 0);
+ m_printing_sizer->Add(bSizer_subtask_info, 1, wxALL | wxEXPAND, 0);
+
+
+ m_staticline = new wxPanel( parent, wxID_ANY);
+ m_staticline->SetBackgroundColour(wxColour(238,238,238));
+ m_staticline->Layout();
+ m_staticline->Hide();
+
+ m_panel_error_txt = new wxPanel(parent, wxID_ANY);
+ m_panel_error_txt->SetBackgroundColour(*wxWHITE);
+
+ wxBoxSizer *static_text_sizer = new wxBoxSizer(wxHORIZONTAL);
+ wxBoxSizer *text_sizer = new wxBoxSizer(wxHORIZONTAL);
+
+ m_error_text = new ErrorMsgStaticText(m_panel_error_txt);
+ m_error_text->SetForegroundColour(wxColour(255, 0, 0));
+ text_sizer->Add(m_error_text, 1, wxEXPAND|wxLEFT, FromDIP(17));
+
+ m_button_clean = new Button(m_panel_error_txt, _L("Clear"));
+ StateColor clean_bg(std::pair(wxColour(255, 255, 255), StateColor::Disabled), std::pair(wxColour(206, 206, 206), StateColor::Pressed),
+ std::pair(wxColour(238, 238, 238), StateColor::Hovered), std::pair(wxColour(255, 255, 255), StateColor::Enabled),
+ std::pair(wxColour(255, 255, 255), StateColor::Normal));
+ StateColor clean_bd(std::pair(wxColour(144, 144, 144), StateColor::Disabled), std::pair(wxColour(38, 46, 48), StateColor::Enabled));
+ StateColor clean_text(std::pair(wxColour(144, 144, 144), StateColor::Disabled), std::pair(wxColour(38, 46, 48), StateColor::Enabled));
+
+
+ m_button_clean->SetBackgroundColor(clean_bg);
+ m_button_clean->SetBorderColor(clean_bd);
+ m_button_clean->SetTextColor(clean_text);
+ m_button_clean->SetFont(Label::Body_10);
+ m_button_clean->SetMinSize(TASK_BUTTON_SIZE2);
+
+ static_text_sizer->Add(text_sizer, 1, wxEXPAND, 0);
+ static_text_sizer->Add( FromDIP(10), 0, 0, 0, 0 );
+ static_text_sizer->Add(m_button_clean, 0, wxALIGN_CENTRE_VERTICAL|wxRIGHT, FromDIP(5));
+
+ m_panel_error_txt->SetSizer(static_text_sizer);
+ m_panel_error_txt->Hide();
+
+ sizer->Add(m_panel_printing_title, 0, wxEXPAND | wxALL, 0);
+ sizer->Add(0, FromDIP(12), 0);
+ sizer->Add(m_printing_sizer, 0, wxEXPAND | wxALL, 0);
+ sizer->Add(0, 0, 0, wxTOP, FromDIP(15));
+ sizer->Add(m_staticline, 0, wxEXPAND | wxALL, FromDIP(10));
+ sizer->Add(m_panel_error_txt, 0, wxEXPAND | wxALL, 0);
+ sizer->Add(0, FromDIP(12), 0);
+
+ if (m_type == CALIBRATION) {
+ m_panel_printing_title->Hide();
+ m_bitmap_thumbnail->Hide();
+ task_name_panel->Hide();
+ m_staticText_profile_value->Hide();
+ }
+
+ parent->SetSizer(sizer);
+ parent->Layout();
+ parent->Fit();
+}
+
+void PrintingTaskPanel::msw_rescale()
+{
+ m_panel_printing_title->SetSize(wxSize(-1, FromDIP(PAGE_TITLE_HEIGHT)));
+ m_printing_sizer->SetMinSize(wxSize(PAGE_MIN_WIDTH, -1));
+ m_staticText_printing->SetMinSize(wxSize(PAGE_TITLE_TEXT_WIDTH, PAGE_TITLE_HEIGHT));
+ m_gauge_progress->SetHeight(PROGRESSBAR_HEIGHT);
+ m_gauge_progress->Rescale();
+ m_button_abort->msw_rescale();
+ m_bitmap_thumbnail->SetSize(TASK_THUMBNAIL_SIZE);
+}
+
+void PrintingTaskPanel::init_bitmaps()
+{
+ m_thumbnail_placeholder = ScalableBitmap(this, "monitor_placeholder", 120);
+ m_bitmap_use_time = ScalableBitmap(this, "print_info_time", 16);
+ m_bitmap_use_weight = ScalableBitmap(this, "print_info_weight", 16);
+}
+
+void PrintingTaskPanel::init_scaled_buttons()
+{
+ m_button_clean->SetMinSize(wxSize(FromDIP(48), FromDIP(24)));
+ m_button_clean->SetCornerRadius(FromDIP(12));
+}
+
+void PrintingTaskPanel::error_info_reset()
+{
+ if (m_panel_error_txt->IsShown()) {
+ m_staticline->Hide();
+ m_panel_error_txt->Hide();
+ m_panel_error_txt->GetParent()->Layout();
+ m_error_text->SetLabel(wxEmptyString);
+ }
+}
+
+void PrintingTaskPanel::show_error_msg(wxString msg)
+{
+ m_staticline->Show();
+ m_panel_error_txt->Show();
+ m_error_text->SetLabel(msg);
+}
+
+void PrintingTaskPanel::reset_printing_value()
+{
+ m_bitmap_thumbnail->SetBitmap(m_thumbnail_placeholder.bmp());
+}
+
+void PrintingTaskPanel::enable_pause_resume_button(bool enable, std::string type)
+{
+ if (!enable) {
+ m_button_pause_resume->Enable(false);
+
+ if (type == "pause_disable") {
+ m_button_pause_resume->SetBitmap_("print_control_pause_disable");
+ }
+ else if (type == "resume_disable") {
+ m_button_pause_resume->SetBitmap_("print_control_resume_disable");
+ }
+ }
+ else {
+ m_button_pause_resume->Enable(true);
+ if (type == "resume") {
+ m_button_pause_resume->SetBitmap_("print_control_resume");
+ if (m_button_pause_resume->GetToolTipText() != _L("Resume")) { m_button_pause_resume->SetToolTip(_L("Resume")); }
+ }
+ else if (type == "pause") {
+ m_button_pause_resume->SetBitmap_("print_control_pause");
+ if (m_button_pause_resume->GetToolTipText() != _L("Pause")) { m_button_pause_resume->SetToolTip(_L("Pause")); }
+ }
+ }
+}
+
+void PrintingTaskPanel::enable_abort_button(bool enable)
+{
+ if (!enable) {
+ m_button_abort->Enable(false);
+ m_button_abort->SetBitmap_("print_control_stop_disable");
+ }
+ else {
+ m_button_abort->Enable(true);
+ m_button_abort->SetBitmap_("print_control_stop");
+ }
+}
+
+void PrintingTaskPanel::update_subtask_name(wxString name)
+{
+ m_staticText_subtask_value->SetLabelText(name);
+}
+
+void PrintingTaskPanel::update_stage_value(wxString stage, int val)
+{
+ m_printing_stage_value->SetLabelText(stage);
+ m_gauge_progress->SetValue(val);
+}
+
+void PrintingTaskPanel::update_progress_percent(wxString percent, wxString icon)
+{
+ m_staticText_progress_percent->SetLabelText(percent);
+ m_staticText_progress_percent_icon->SetLabelText(icon);
+}
+
+void PrintingTaskPanel::update_left_time(wxString time)
+{
+ m_staticText_progress_left->SetLabelText(time);
+}
+
+void PrintingTaskPanel::update_left_time(int mc_left_time)
+{
+ // update gcode progress
+ std::string left_time;
+ wxString left_time_text = NA_STR;
+
+ try {
+ left_time = get_bbl_monitor_time_dhm(mc_left_time);
+ }
+ catch (...) {
+ ;
+ }
+
+ if (!left_time.empty()) left_time_text = wxString::Format("-%s", left_time);
+ update_left_time(left_time_text);
+}
+
+void PrintingTaskPanel::update_layers_num(bool show, wxString num)
+{
+ if (show) {
+ m_staticText_layers->Show(true);
+ m_staticText_layers->SetLabelText(num);
+ }
+ else {
+ m_staticText_layers->Show(false);
+ m_staticText_layers->SetLabelText(num);
+ }
+}
+
+void PrintingTaskPanel::show_priting_use_info(bool show, wxString time /*= wxEmptyString*/, wxString weight /*= wxEmptyString*/)
+{
+ if (show) {
+ if (!m_staticText_consumption_of_time->IsShown()) {
+ m_bitmap_static_use_time->Show();
+ m_staticText_consumption_of_time->Show();
+ }
+
+ if (!m_staticText_consumption_of_weight->IsShown()) {
+ m_bitmap_static_use_weight->Show();
+ m_staticText_consumption_of_weight->Show();
+ }
+
+ m_staticText_consumption_of_time->SetLabelText(time);
+ m_staticText_consumption_of_weight->SetLabelText(weight);
+ }
+ else {
+ m_staticText_consumption_of_time->SetLabelText("0m");
+ m_staticText_consumption_of_weight->SetLabelText("0g");
+ if (m_staticText_consumption_of_time->IsShown()) {
+ m_bitmap_static_use_time->Hide();
+ m_staticText_consumption_of_time->Hide();
+ }
+
+ if (m_staticText_consumption_of_weight->IsShown()) {
+ m_bitmap_static_use_weight->Hide();
+ m_staticText_consumption_of_weight->Hide();
+ } }
+}
+
+
+void PrintingTaskPanel::show_profile_info(bool show, wxString profile /*= wxEmptyString*/)
+{
+ if (show) {
+ if (!m_staticText_profile_value->IsShown()) { m_staticText_profile_value->Show(); }
+ m_staticText_profile_value->SetLabelText(profile);
+ }
+ else {
+ m_staticText_profile_value->SetLabelText(wxEmptyString);
+ m_staticText_profile_value->Hide();
+ }
+}
+
StatusBasePanel::StatusBasePanel(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, long style, const wxString &name)
: wxScrolledWindow(parent, id, pos, size, wxHSCROLL | wxVSCROLL)
{
@@ -136,13 +642,8 @@ StatusBasePanel::StatusBasePanel(wxWindow *parent, wxWindowID id, const wxPoint
m_panel_separotor1->SetMaxSize(wxSize(-1, PAGE_SPACING));
m_monitoring_sizer->Add(m_panel_separotor1, 0, wxEXPAND, 0);
- m_project_task_panel = new wxPanel(this);
- m_project_task_panel->SetBackgroundColour(*wxWHITE);
-
- auto m_project_task_sizer = create_project_task_page(m_project_task_panel);
- m_project_task_panel->SetSizer(m_project_task_sizer);
- m_project_task_panel->Layout();
- m_project_task_sizer->Fit(m_project_task_panel);
+ m_project_task_panel = new PrintingTaskPanel(this, PrintingTaskType::PRINGINT);
+ m_project_task_panel->init_bitmaps();
m_monitoring_sizer->Add(m_project_task_panel, 0, wxALL | wxEXPAND , 0);
// auto m_panel_separotor2 = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
@@ -191,7 +692,6 @@ StatusBasePanel::~StatusBasePanel()
void StatusBasePanel::init_bitmaps()
{
static Slic3r::GUI::BitmapCache cache;
- m_item_placeholder = create_scaled_bitmap("monitor_placeholder", nullptr, 60);
m_bitmap_item_prediction = create_scaled_bitmap("monitor_item_prediction", nullptr, 16);
m_bitmap_item_cost = create_scaled_bitmap("monitor_item_cost", nullptr, 16);
m_bitmap_item_print = create_scaled_bitmap("monitor_item_print", nullptr, 18);
@@ -202,9 +702,7 @@ void StatusBasePanel::init_bitmaps()
m_bitmap_fan_off = ScalableBitmap(this, "monitor_fan_off", 22);
m_bitmap_speed = ScalableBitmap(this, "monitor_speed", 24);
m_bitmap_speed_active = ScalableBitmap(this, "monitor_speed_active", 24);
- m_bitmap_use_time = ScalableBitmap(this, "print_info_time", 16);
- m_bitmap_use_weight = ScalableBitmap(this, "print_info_weight", 16);
- m_thumbnail_placeholder = ScalableBitmap(this, "monitor_placeholder", 120);
+
m_thumbnail_brokenimg = ScalableBitmap(this, "monitor_brokenimg", 120);
m_thumbnail_sdcard = ScalableBitmap(this, "monitor_sdcard_thumbnail", 120);
//m_bitmap_camera = create_scaled_bitmap("monitor_camera", nullptr, 18);
@@ -314,332 +812,6 @@ wxBoxSizer *StatusBasePanel::create_monitoring_page()
return sizer;
}
-wxBoxSizer *StatusBasePanel::create_project_task_page(wxWindow *parent)
-{
- wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
- wxBoxSizer *bSizer_printing_title = new wxBoxSizer(wxHORIZONTAL);
-
- m_panel_printing_title = new wxPanel(parent, wxID_ANY, wxDefaultPosition, wxSize(-1, PAGE_TITLE_HEIGHT), wxTAB_TRAVERSAL);
- m_panel_printing_title->SetBackgroundColour(STATUS_TITLE_BG);
-
- m_staticText_printing = new Label(m_panel_printing_title, _L("Printing Progress"));
- m_staticText_printing->Wrap(-1);
- m_staticText_printing->SetFont(PAGE_TITLE_FONT);
- m_staticText_printing->SetForegroundColour(PAGE_TITLE_FONT_COL);
- bSizer_printing_title->Add(m_staticText_printing, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, PAGE_TITLE_LEFT_MARGIN);
-
- bSizer_printing_title->Add(0, 0, 1, wxEXPAND, 0);
-
- m_panel_printing_title->SetSizer(bSizer_printing_title);
- m_panel_printing_title->Layout();
- bSizer_printing_title->Fit(m_panel_printing_title);
-
- sizer->Add(m_panel_printing_title, 0, wxEXPAND | wxALL, 0);
- sizer->Add(0, FromDIP(12), 0);
-
- m_printing_sizer = new wxBoxSizer(wxHORIZONTAL);
-
- m_printing_sizer->SetMinSize(wxSize(PAGE_MIN_WIDTH, -1));
- m_bitmap_thumbnail = new wxStaticBitmap(parent, wxID_ANY, m_thumbnail_placeholder.bmp(), wxDefaultPosition, TASK_THUMBNAIL_SIZE, 0);
-
- m_printing_sizer->Add(m_bitmap_thumbnail, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT | wxLEFT, FromDIP(12));
-
- m_printing_sizer->Add(FromDIP(8), 0, 0, wxEXPAND, 0);
-
- wxBoxSizer *bSizer_subtask_info = new wxBoxSizer(wxVERTICAL);
-
- wxBoxSizer *bSizer_task_name = new wxBoxSizer(wxVERTICAL);
-
- wxBoxSizer *bSizer_task_name_hor = new wxBoxSizer(wxHORIZONTAL);
- wxPanel* task_name_panel = new wxPanel(parent);
-
- m_staticText_subtask_value = new wxStaticText(task_name_panel, wxID_ANY, _L("N/A"), wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT | wxST_ELLIPSIZE_END);
- m_staticText_subtask_value->Wrap(-1);
- #ifdef __WXOSX_MAC__
- m_staticText_subtask_value->SetFont(::Label::Body_13);
- #else
- m_staticText_subtask_value->SetFont(wxFont(13, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxT("HarmonyOS Sans SC")));
- #endif
- m_staticText_subtask_value->SetForegroundColour(wxColour(44, 44, 46));
-
- m_bitmap_static_use_time = new wxStaticBitmap(task_name_panel, wxID_ANY, m_bitmap_use_time.bmp(), wxDefaultPosition, wxSize(FromDIP(16), FromDIP(16)));
-
- m_staticText_consumption_of_time = new wxStaticText(task_name_panel, wxID_ANY, "0m", wxDefaultPosition, wxDefaultSize, 0);
- m_staticText_consumption_of_time->SetFont(::Label::Body_12);
- m_staticText_consumption_of_time->SetForegroundColour(wxColour(0x68, 0x68, 0x68));
- m_staticText_consumption_of_time->Wrap(-1);
-
-
- m_bitmap_static_use_weight = new wxStaticBitmap(task_name_panel, wxID_ANY, m_bitmap_use_weight.bmp(), wxDefaultPosition, wxSize(FromDIP(16), FromDIP(16)));
-
-
- m_staticText_consumption_of_weight = new wxStaticText(task_name_panel, wxID_ANY, "0g", wxDefaultPosition, wxDefaultSize, 0);
- m_staticText_consumption_of_weight->SetFont(::Label::Body_12);
- m_staticText_consumption_of_weight->SetForegroundColour(wxColour(0x68, 0x68, 0x68));
- m_staticText_consumption_of_weight->Wrap(-1);
-
- bSizer_task_name_hor->Add(m_staticText_subtask_value, 1, wxALL | wxEXPAND, 0);
- bSizer_task_name_hor->Add(0, 0, 1, wxEXPAND, 0);
- bSizer_task_name_hor->Add(m_bitmap_static_use_time, 0, wxALIGN_CENTER_VERTICAL, 0);
- bSizer_task_name_hor->Add(m_staticText_consumption_of_time, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, FromDIP(3));
- bSizer_task_name_hor->Add(0, 0, 0, wxLEFT, FromDIP(20));
- bSizer_task_name_hor->Add(m_bitmap_static_use_weight, 0, wxALIGN_CENTER_VERTICAL, 0);
- bSizer_task_name_hor->Add(m_staticText_consumption_of_weight, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, FromDIP(3));
- bSizer_task_name_hor->Add(0, 0, 0, wxRIGHT, FromDIP(10));
-
-
- task_name_panel->SetSizer(bSizer_task_name_hor);
- task_name_panel->Layout();
- task_name_panel->Fit();
-
- bSizer_task_name->Add(task_name_panel, 0, wxEXPAND, FromDIP(5));
-
-
- /* wxFlexGridSizer *fgSizer_task = new wxFlexGridSizer(2, 2, 0, 0);
- fgSizer_task->AddGrowableCol(0);
- fgSizer_task->SetFlexibleDirection(wxVERTICAL);
- fgSizer_task->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);*/
-
- m_printing_stage_value = new wxStaticText(parent, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT | wxST_ELLIPSIZE_END);
- m_printing_stage_value->Wrap(-1);
- #ifdef __WXOSX_MAC__
- m_printing_stage_value->SetFont(::Label::Body_11);
- #else
- m_printing_stage_value->SetFont(wxFont(11, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxT("HarmonyOS Sans SC")));
- #endif
-
- m_printing_stage_value->SetForegroundColour(STAGE_TEXT_COL);
-
-
- m_staticText_profile_value = new wxStaticText(parent, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT | wxST_ELLIPSIZE_END);
- m_staticText_profile_value->Wrap(-1);
-#ifdef __WXOSX_MAC__
- m_staticText_profile_value->SetFont(::Label::Body_11);
-#else
- m_staticText_profile_value->SetFont(wxFont(11, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxT("HarmonyOS Sans SC")));
-#endif
-
- m_staticText_profile_value->SetForegroundColour(0x6B6B6B);
-
-
- auto m_panel_progress = new wxPanel(parent, wxID_ANY);
- m_panel_progress->SetBackgroundColour(*wxWHITE);
- auto m_sizer_progressbar = new wxBoxSizer(wxHORIZONTAL);
- m_gauge_progress = new ProgressBar(m_panel_progress, wxID_ANY, 100, wxDefaultPosition, wxDefaultSize);
- m_gauge_progress->SetValue(0);
- m_gauge_progress->SetHeight(PROGRESSBAR_HEIGHT);
- m_gauge_progress->SetMaxSize(wxSize(FromDIP(600), -1));
- m_panel_progress->SetSizer(m_sizer_progressbar);
- m_panel_progress->Layout();
- m_panel_progress->SetSize(wxSize(-1, FromDIP(24)));
- m_panel_progress->SetMaxSize(wxSize(-1, FromDIP(24)));
-
- wxBoxSizer *bSizer_task_btn = new wxBoxSizer(wxHORIZONTAL);
-
- bSizer_task_btn->Add(FromDIP(10), 0, 0);
-
- /* m_button_report = new Button(m_panel_progress, _L("Report"));
- StateColor report_bg(std::pair(wxColour(255, 255, 255), StateColor::Disabled), std::pair(wxColour(206, 206, 206), StateColor::Pressed),
- std::pair(wxColour(238, 238, 238), StateColor::Hovered), std::pair(wxColour(255, 255, 255), StateColor::Enabled),
- std::pair(wxColour(255, 255, 255), StateColor::Normal));
- m_button_report->SetBackgroundColor(report_bg);
- m_button_report->SetMinSize(TASK_BUTTON_SIZE2);
- StateColor report_bd(std::pair(wxColour(144, 144, 144), StateColor::Disabled), std::pair(wxColour(38, 46, 48), StateColor::Enabled));
- m_button_report->SetBorderColor(report_bd);
- StateColor report_text(std::pair(wxColour(144, 144, 144), StateColor::Disabled), std::pair(wxColour(38, 46, 48), StateColor::Enabled));
- m_button_report->SetTextColor(report_text);
- m_button_report->SetFont(Label::Body_10);
- m_button_report->Hide();
- m_sizer_progressbar->Add(m_button_report, 0, wxALL, FromDIP(5));*/
-
- m_button_pause_resume = new ScalableButton(m_panel_progress, wxID_ANY, "print_control_pause", wxEmptyString, wxDefaultSize, wxDefaultPosition, wxBU_EXACTFIT | wxNO_BORDER,true);
-
- m_button_pause_resume->Bind(wxEVT_ENTER_WINDOW, [this](auto &e) {
- if (m_button_pause_resume->GetToolTipText() == _L("Pause")) {
- m_button_pause_resume->SetBitmap_("print_control_pause_hover");
- }
-
- if (m_button_pause_resume->GetToolTipText() == _L("Resume")) {
- m_button_pause_resume->SetBitmap_("print_control_resume_hover");
- }
- });
-
- m_button_pause_resume->Bind(wxEVT_LEAVE_WINDOW, [this](auto &e) {
- auto buf = m_button_pause_resume->GetClientData();
- if (m_button_pause_resume->GetToolTipText() == _L("Pause")) {
- m_button_pause_resume->SetBitmap_("print_control_pause");
- }
-
- if (m_button_pause_resume->GetToolTipText() == _L("Resume")) {
- m_button_pause_resume->SetBitmap_("print_control_resume");
- }
- });
-
- m_button_abort = new ScalableButton(m_panel_progress, wxID_ANY, "print_control_stop", wxEmptyString, wxDefaultSize, wxDefaultPosition, wxBU_EXACTFIT | wxNO_BORDER, true);
- m_button_abort->SetToolTip(_L("Stop"));
-
- m_button_abort->Bind(wxEVT_ENTER_WINDOW, [this](auto &e) {
- m_button_abort->SetBitmap_("print_control_stop_hover");
- });
-
- m_button_abort->Bind(wxEVT_LEAVE_WINDOW, [this](auto &e) {
- m_button_abort->SetBitmap_("print_control_stop"); }
- );
-
- m_sizer_progressbar->Add(m_gauge_progress, 1, wxALIGN_CENTER_VERTICAL, 0);
- m_sizer_progressbar->Add(0, 0, 0, wxEXPAND|wxLEFT, FromDIP(18));
- m_sizer_progressbar->Add(m_button_pause_resume, 0, wxALL, FromDIP(5));
- m_sizer_progressbar->Add(0, 0, 0, wxEXPAND|wxLEFT, FromDIP(18));
- m_sizer_progressbar->Add(m_button_abort, 0, wxALL, FromDIP(5));
-
- //fgSizer_task->Add(bSizer_task_btn, 0, wxEXPAND, 0);
-
- wxBoxSizer *bSizer_buttons = new wxBoxSizer(wxHORIZONTAL);
- wxBoxSizer *bSizer_text = new wxBoxSizer(wxHORIZONTAL);
- wxPanel* penel_bottons = new wxPanel(parent);
- wxPanel* penel_text = new wxPanel(penel_bottons);
-
- penel_text->SetBackgroundColour(*wxWHITE);
- penel_bottons->SetBackgroundColour(*wxWHITE);
-
- wxBoxSizer *sizer_percent = new wxBoxSizer(wxVERTICAL);
- sizer_percent->Add(0, 0, 1, wxEXPAND, 0);
-
- wxBoxSizer *sizer_percent_icon = new wxBoxSizer(wxVERTICAL);
- sizer_percent_icon->Add(0, 0, 1, wxEXPAND, 0);
-
-
- m_staticText_progress_percent = new wxStaticText(penel_text, wxID_ANY, L("0"), wxDefaultPosition, wxDefaultSize, 0);
- m_staticText_progress_percent->SetFont(::Label::Head_18);
- m_staticText_progress_percent->SetMaxSize(wxSize(-1, FromDIP(20)));
- m_staticText_progress_percent->SetForegroundColour(wxColour(0, 174, 66));
-
- m_staticText_progress_percent_icon = new wxStaticText(penel_text, wxID_ANY, L("%"), wxDefaultPosition, wxDefaultSize, 0);
- m_staticText_progress_percent_icon->SetFont(::Label::Body_11);
- m_staticText_progress_percent_icon->SetMaxSize(wxSize(-1, FromDIP(13)));
- m_staticText_progress_percent_icon->SetForegroundColour(wxColour(0, 174, 66));
-
- sizer_percent->Add(m_staticText_progress_percent, 0, 0, 0);
-
- #ifdef __WXOSX_MAC__
- sizer_percent_icon->Add(m_staticText_progress_percent_icon, 0, wxBOTTOM, FromDIP(2));
- #else
- sizer_percent_icon->Add(m_staticText_progress_percent_icon, 0, 0, 0);
- #endif
-
-
- m_staticText_progress_left = new wxStaticText(penel_text, wxID_ANY, L("N/A"), wxDefaultPosition, wxDefaultSize, 0);
- m_staticText_progress_left->Wrap(-1);
- m_staticText_progress_left->SetFont(wxFont(12, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxT("HarmonyOS Sans SC")));
- m_staticText_progress_left->SetForegroundColour(wxColour(146, 146, 146));
-
- //fgSizer_task->Add(bSizer_buttons, 0, wxEXPAND, 0);
- //fgSizer_task->Add(0, 0, 0, wxEXPAND, FromDIP(5));
-
- wxPanel* panel_button_block = new wxPanel(penel_bottons, wxID_ANY);
- panel_button_block->SetMinSize(wxSize(TASK_BUTTON_SIZE.x * 2 + FromDIP(5) * 4, -1));
- panel_button_block->SetMinSize(wxSize(TASK_BUTTON_SIZE.x * 2 + FromDIP(5) * 4, -1));
- panel_button_block->SetSize(wxSize(TASK_BUTTON_SIZE.x * 2 + FromDIP(5) * 2, -1));
- panel_button_block->SetBackgroundColour(*wxWHITE);
-
- m_staticText_layers = new wxStaticText(penel_text, wxID_ANY, _L("Layer: N/A"));
- m_staticText_layers->SetFont(wxFont(12, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxT("HarmonyOS Sans SC")));
- m_staticText_layers->SetForegroundColour(wxColour(146, 146, 146));
- m_staticText_layers->Hide();
-
- //bSizer_text->Add(m_staticText_progress_percent, 0, wxALL, 0);
- bSizer_text->Add(sizer_percent, 0, wxEXPAND, 0);
- bSizer_text->Add(sizer_percent_icon, 0, wxEXPAND, 0);
- bSizer_text->Add(0, 0, 1, wxEXPAND, 0);
- bSizer_text->Add(m_staticText_layers, 0, wxALIGN_CENTER | wxALL, 0);
- bSizer_text->Add(0, 0, 0, wxLEFT, FromDIP(20));
- bSizer_text->Add(m_staticText_progress_left, 0, wxALIGN_CENTER | wxALL, 0);
-
- penel_text->SetMaxSize(wxSize(FromDIP(600), -1));
- penel_text->SetSizer(bSizer_text);
- penel_text->Layout();
-
- bSizer_buttons->Add(penel_text, 1, wxEXPAND | wxALL, 0);
- bSizer_buttons->Add(panel_button_block, 0, wxALIGN_CENTER | wxALL, 0);
-
- penel_bottons->SetSizer(bSizer_buttons);
- penel_bottons->Layout();
-
- StateColor btn_bg_green(std::pair(AMS_CONTROL_DISABLE_COLOUR, StateColor::Disabled), std::pair(wxColour(27, 136, 68), StateColor::Pressed),
- std::pair(wxColour(61, 203, 115), StateColor::Hovered), std::pair(AMS_CONTROL_BRAND_COLOUR, StateColor::Normal));
- StateColor btn_bd_green(std::pair(AMS_CONTROL_WHITE_COLOUR, StateColor::Disabled), std::pair(AMS_CONTROL_BRAND_COLOUR, StateColor::Enabled));
-
- m_button_market_scoring = new Button(parent, _L("Immediately score"));
- m_button_market_scoring->SetBackgroundColor(btn_bg_green);
- m_button_market_scoring->SetBorderColor(btn_bd_green);
- m_button_market_scoring->SetTextColor(wxColour("#FFFFFE"));
- m_button_market_scoring->SetSize(wxSize(FromDIP(128), FromDIP(26)));
- m_button_market_scoring->SetMinSize(wxSize(-1, FromDIP(26)));
- m_button_market_scoring->SetCornerRadius(FromDIP(13));
-
- wxBoxSizer *bSizer_market_scoring = new wxBoxSizer(wxHORIZONTAL);
- bSizer_market_scoring->Add(m_button_market_scoring);
- bSizer_market_scoring->Add(0, 0, 1, wxEXPAND, 0);
- m_button_market_scoring->Hide();
-
- bSizer_subtask_info->Add(0, 0, 0, wxEXPAND | wxTOP, FromDIP(14));
- bSizer_subtask_info->Add(bSizer_task_name, 0, wxEXPAND|wxRIGHT, FromDIP(18));
- bSizer_subtask_info->Add(m_staticText_profile_value, 0, wxEXPAND | wxTOP, FromDIP(5));
- bSizer_subtask_info->Add(m_printing_stage_value, 0, wxEXPAND | wxTOP, FromDIP(5));
- bSizer_subtask_info->Add(bSizer_market_scoring, 0, wxEXPAND | wxTOP, FromDIP(5));
- bSizer_subtask_info->Add(penel_bottons, 0, wxEXPAND | wxTOP, FromDIP(10));
- bSizer_subtask_info->Add(m_panel_progress, 0, wxEXPAND|wxRIGHT, FromDIP(25));
-
- m_printing_sizer->Add(bSizer_subtask_info, 1, wxALL | wxEXPAND, 0);
-
- sizer->Add(m_printing_sizer, 0, wxEXPAND | wxALL, 0);
-
- m_staticline = new wxPanel( parent, wxID_ANY);
- m_staticline->SetBackgroundColour(wxColour(238,238,238));
- m_staticline->Layout();
- m_staticline->Hide();
-
- sizer->Add(0, 0, 0, wxTOP, FromDIP(15));
- sizer->Add(m_staticline, 0, wxEXPAND|wxALL, FromDIP(10));
-
- m_panel_error_txt = new wxPanel(parent, wxID_ANY);
- m_panel_error_txt->SetBackgroundColour(*wxWHITE);
-
- wxBoxSizer *static_text_sizer = new wxBoxSizer(wxHORIZONTAL);
- wxBoxSizer *text_sizer = new wxBoxSizer(wxHORIZONTAL);
-
- m_error_text = new ErrorMsgStaticText(m_panel_error_txt);
- m_error_text->SetForegroundColour(wxColour(255, 0, 0));
- text_sizer->Add(m_error_text, 1, wxEXPAND|wxLEFT, FromDIP(17));
-
- m_button_clean = new Button(m_panel_error_txt, _L("Clear"));
- StateColor clean_bg(std::pair(wxColour(255, 255, 255), StateColor::Disabled), std::pair(wxColour(206, 206, 206), StateColor::Pressed),
- std::pair(wxColour(238, 238, 238), StateColor::Hovered), std::pair(wxColour(255, 255, 255), StateColor::Enabled),
- std::pair(wxColour(255, 255, 255), StateColor::Normal));
- StateColor clean_bd(std::pair(wxColour(144, 144, 144), StateColor::Disabled), std::pair(wxColour(38, 46, 48), StateColor::Enabled));
- StateColor clean_text(std::pair(wxColour(144, 144, 144), StateColor::Disabled), std::pair(wxColour(38, 46, 48), StateColor::Enabled));
-
-
- m_button_clean->SetBackgroundColor(clean_bg);
- m_button_clean->SetBorderColor(clean_bd);
- m_button_clean->SetTextColor(clean_text);
- m_button_clean->SetFont(Label::Body_10);
- m_button_clean->SetMinSize(TASK_BUTTON_SIZE2);
-
- static_text_sizer->Add(text_sizer, 1, wxEXPAND, 0);
- static_text_sizer->Add( FromDIP(10), 0, 0, 0, 0 );
- static_text_sizer->Add(m_button_clean, 0, wxALIGN_CENTRE_VERTICAL|wxRIGHT, FromDIP(5));
-
- m_panel_error_txt->SetSizer(static_text_sizer);
- m_panel_error_txt->Hide();
- sizer->Add(m_panel_error_txt, 0, wxEXPAND | wxALL,0);
- sizer->Add(0, FromDIP(12), 0);
-
- m_tasklist_sizer = new wxBoxSizer(wxVERTICAL);
- sizer->Add(m_tasklist_sizer, 0, wxEXPAND | wxALL, 0);
- return sizer;
-}
-
wxBoxSizer *StatusBasePanel::create_machine_control_page(wxWindow *parent)
{
wxBoxSizer *bSizer_right = new wxBoxSizer(wxVERTICAL);
@@ -1247,16 +1419,8 @@ StatusPanel::StatusPanel(wxWindow *parent, wxWindowID id, const wxPoint &pos, co
: StatusBasePanel(parent, id, pos, size, style)
, m_fan_control_popup(new FanControlPopup(this))
{
- create_tasklist_info();
- update_tasklist_info();
-
init_scaled_buttons();
-
- //m_buttons.push_back(m_button_report);
- //m_buttons.push_back(m_button_pause_resume);
- //m_buttons.push_back(m_button_abort);
m_buttons.push_back(m_button_unload);
- m_buttons.push_back(m_button_clean);
m_buttons.push_back(m_bpButton_z_10);
m_buttons.push_back(m_bpButton_z_1);
m_buttons.push_back(m_bpButton_z_down_1);
@@ -1272,11 +1436,9 @@ StatusPanel::StatusPanel(wxWindow *parent, wxWindowID id, const wxPoint &pos, co
m_switch_cham_fan->SetValue(false);
/* set default enable state */
- m_button_pause_resume->Enable(false);
- m_button_pause_resume->SetBitmap_("print_control_resume_disable");
+ m_project_task_panel->enable_pause_resume_button(false, "resume_disable");
+ m_project_task_panel->enable_abort_button(false);
- m_button_abort->Enable(false);
- m_button_abort->SetBitmap_("print_control_stop_disable");
Bind(wxEVT_WEBREQUEST_STATE, &StatusPanel::on_webrequest_state, this);
@@ -1291,16 +1453,14 @@ StatusPanel::StatusPanel(wxWindow *parent, wxWindowID id, const wxPoint &pos, co
// Connect Events
- //m_bitmap_thumbnail->Connect(wxEVT_ENTER_WINDOW, wxMouseEventHandler(StatusPanel::on_thumbnail_enter), NULL, this);
- //m_bitmap_thumbnail->Connect(wxEVT_LEAVE_WINDOW, wxMouseEventHandler(StatusPanel::on_thumbnail_leave), NULL, this);
- m_bitmap_thumbnail->Connect(wxEVT_LEFT_DOWN, wxMouseEventHandler(StatusPanel::refresh_thumbnail_webrequest), NULL, this);
+ m_project_task_panel->get_bitmap_thumbnail()->Connect(wxEVT_LEFT_DOWN, wxMouseEventHandler(StatusPanel::refresh_thumbnail_webrequest), NULL, this);
+ m_project_task_panel->get_pause_resume_button()->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_subtask_pause_resume), NULL, this);
+ m_project_task_panel->get_abort_button()->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_subtask_abort), NULL, this);
+ m_project_task_panel->get_market_scoring_button()->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_market_scoring), NULL, this);
+ m_project_task_panel->get_clean_button()->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_print_error_clean), NULL, this);
+
m_setting_button->Connect(wxEVT_LEFT_DOWN, wxMouseEventHandler(StatusPanel::on_camera_enter), NULL, this);
m_setting_button->Connect(wxEVT_LEFT_DCLICK, wxMouseEventHandler(StatusPanel::on_camera_enter), NULL, this);
- m_project_task_panel->Connect(wxEVT_LEAVE_WINDOW, wxMouseEventHandler(StatusPanel::on_thumbnail_leave), NULL, this);
- m_button_pause_resume->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_subtask_pause_resume), NULL, this);
- m_button_abort->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_subtask_abort), NULL, this);
- m_button_clean->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_print_error_clean), NULL, this);
- m_button_market_scoring->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_market_scoring), NULL, this);
m_tempCtrl_bed->Connect(wxEVT_KILL_FOCUS, wxFocusEventHandler(StatusPanel::on_bed_temp_kill_focus), NULL, this);
m_tempCtrl_bed->Connect(wxEVT_SET_FOCUS, wxFocusEventHandler(StatusPanel::on_bed_temp_set_focus), NULL, this);
m_tempCtrl_nozzle->Connect(wxEVT_KILL_FOCUS, wxFocusEventHandler(StatusPanel::on_nozzle_temp_kill_focus), NULL, this);
@@ -1339,15 +1499,14 @@ StatusPanel::StatusPanel(wxWindow *parent, wxWindowID id, const wxPoint &pos, co
StatusPanel::~StatusPanel()
{
// Disconnect Events
- //m_bitmap_thumbnail->Disconnect(wxEVT_ENTER_WINDOW, wxMouseEventHandler(StatusPanel::on_thumbnail_enter), NULL, this);
- //m_bitmap_thumbnail->Disconnect(wxEVT_LEAVE_WINDOW, wxMouseEventHandler(StatusPanel::on_thumbnail_leave), NULL, this);
- m_bitmap_thumbnail->Disconnect(wxEVT_LEFT_DOWN, wxMouseEventHandler(StatusPanel::refresh_thumbnail_webrequest), NULL, this);
+ m_project_task_panel->get_bitmap_thumbnail()->Disconnect(wxEVT_LEFT_DOWN, wxMouseEventHandler(StatusPanel::refresh_thumbnail_webrequest), NULL, this);
+ m_project_task_panel->get_pause_resume_button()->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_subtask_pause_resume), NULL, this);
+ m_project_task_panel->get_abort_button()->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_subtask_abort), NULL, this);
+ m_project_task_panel->get_market_scoring_button()->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_market_scoring), NULL, this);
+ m_project_task_panel->get_clean_button()->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_print_error_clean), NULL, this);
+
m_setting_button->Disconnect(wxEVT_LEFT_DOWN, wxMouseEventHandler(StatusPanel::on_camera_enter), NULL, this);
m_setting_button->Disconnect(wxEVT_LEFT_DCLICK, wxMouseEventHandler(StatusPanel::on_camera_enter), NULL, this);
- m_button_pause_resume->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_subtask_pause_resume), NULL, this);
- m_button_abort->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_subtask_abort), NULL, this);
- m_button_clean->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_print_error_clean), NULL, this);
- m_button_market_scoring->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_market_scoring), NULL, this);
m_tempCtrl_bed->Disconnect(wxEVT_KILL_FOCUS, wxFocusEventHandler(StatusPanel::on_bed_temp_kill_focus), NULL, this);
m_tempCtrl_bed->Disconnect(wxEVT_SET_FOCUS, wxFocusEventHandler(StatusPanel::on_bed_temp_set_focus), NULL, this);
m_tempCtrl_nozzle->Disconnect(wxEVT_KILL_FOCUS, wxFocusEventHandler(StatusPanel::on_nozzle_temp_kill_focus), NULL, this);
@@ -1384,14 +1543,7 @@ StatusPanel::~StatusPanel()
void StatusPanel::init_scaled_buttons()
{
- // m_button_report->SetMinSize(wxSize(FromDIP(48), FromDIP(24)));
- // m_button_report->SetCornerRadius(FromDIP(12));
- //m_button_pause_resume->SetMinSize(wxSize(FromDIP(48), FromDIP(24)));
- //m_button_pause_resume->SetCornerRadius(FromDIP(12));
- //m_button_abort->SetMinSize(wxSize(FromDIP(48), FromDIP(24)));
- //m_button_abort->SetCornerRadius(FromDIP(12));
- m_button_clean->SetMinSize(wxSize(FromDIP(48), FromDIP(24)));
- m_button_clean->SetCornerRadius(FromDIP(12));
+ m_project_task_panel->init_scaled_buttons();
m_button_unload->SetMinSize(wxSize(-1, FromDIP(24)));
m_button_unload->SetCornerRadius(FromDIP(12));
m_bpButton_z_10->SetMinSize(Z_BUTTON_SIZE);
@@ -1408,43 +1560,6 @@ void StatusPanel::init_scaled_buttons()
m_bpButton_e_down_10->SetCornerRadius(FromDIP(12));
}
-void StatusPanel::create_tasklist_info()
-{
- m_tasklist_caption_sizer = new wxBoxSizer(wxHORIZONTAL);
- m_text_tasklist_caption = new wxStaticText(this, wxID_ANY, _L("Printing List"), wxDefaultPosition, wxDefaultSize, 0);
- m_text_tasklist_caption->Wrap(-1);
- m_text_tasklist_caption->SetFont(Label::Body_16);
- m_text_tasklist_caption->SetForegroundColour(GROUP_TITLE_FONT_COL);
-
- m_tasklist_caption_sizer->Add(m_text_tasklist_caption, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, GROUP_TITLE_LEFT_MARGIN);
-
- auto staticline = new StaticLine(this);
- staticline->SetLineColour(GROUP_STATIC_LINE_COL);
- m_tasklist_caption_sizer->Add(staticline, 1, wxRIGHT | wxLEFT | wxALIGN_CENTER_VERTICAL, GROUP_TITLE_LINE_MARGIN);
- m_tasklist_caption_sizer->Add(GROUP_TITLE_RIGHT_MARGIN - GROUP_TITLE_LINE_MARGIN, 0, 0, wxEXPAND, 0);
-
- m_tasklist_sizer->Add(m_tasklist_caption_sizer, 0, wxEXPAND | wxALL, 0);
-
- show_task_list_info(false);
-}
-
-void StatusPanel::show_task_list_info(bool show)
-{
- if (show) {
- m_tasklist_sizer->Show(m_tasklist_caption_sizer);
- } else {
- m_tasklist_sizer->Hide(m_tasklist_caption_sizer);
- }
- Layout();
-
-}
-
-void StatusPanel::update_tasklist_info()
-{
- // BBS do not show tasklist
- return;
-}
-
void StatusPanel::on_market_scoring(wxCommandEvent &event) {
if (obj && obj->get_modeltask() && obj->get_modeltask()->design_id > 0) {
market_model_scoring_page(obj->get_modeltask()->design_id);
@@ -1475,10 +1590,7 @@ void StatusPanel::on_subtask_abort(wxCommandEvent &event)
void StatusPanel::error_info_reset()
{
- m_staticline->Hide();
- m_panel_error_txt->Hide();
- m_panel_error_txt->GetParent()->Layout();
- m_error_text->SetLabel("");
+ m_project_task_panel->error_info_reset();
before_error_code = 0;
}
@@ -1499,15 +1611,15 @@ void StatusPanel::on_webrequest_state(wxWebRequestEvent &evt)
case wxWebRequest::State_Completed: {
wxImage img(*evt.GetResponse().GetStream());
img_list.insert(std::make_pair(m_request_url, img));
- wxImage resize_img = img.Scale(m_bitmap_thumbnail->GetSize().x, m_bitmap_thumbnail->GetSize().y, wxIMAGE_QUALITY_HIGH);
- m_bitmap_thumbnail->SetBitmap(resize_img);
+ wxImage resize_img = img.Scale(m_project_task_panel->get_bitmap_thumbnail()->GetSize().x, m_project_task_panel->get_bitmap_thumbnail()->GetSize().y, wxIMAGE_QUALITY_HIGH);
+ m_project_task_panel->get_bitmap_thumbnail()->SetBitmap(resize_img);
task_thumbnail_state = ThumbnailState::TASK_THUMBNAIL;
break;
}
case wxWebRequest::State_Failed:
case wxWebRequest::State_Cancelled:
case wxWebRequest::State_Unauthorized: {
- m_bitmap_thumbnail->SetBitmap(m_thumbnail_brokenimg.bmp());
+ m_project_task_panel->get_bitmap_thumbnail()->SetBitmap(m_thumbnail_brokenimg.bmp());
task_thumbnail_state = ThumbnailState::BROKEN_IMG;
break;
}
@@ -1517,6 +1629,24 @@ void StatusPanel::on_webrequest_state(wxWebRequestEvent &evt)
}
}
+void StatusPanel::refresh_thumbnail_webrequest(wxMouseEvent& event)
+{
+ if (!obj) return;
+ if (task_thumbnail_state != ThumbnailState::BROKEN_IMG) return;
+
+ if (obj->slice_info) {
+ m_request_url = wxString(obj->slice_info->thumbnail_url);
+ if (!m_request_url.IsEmpty()) {
+ web_request = wxWebSession::GetDefault().CreateRequest(this, m_request_url);
+ BOOST_LOG_TRIVIAL(trace) << "monitor: create new webrequest, state = " << web_request.GetState() << ", url = " << m_request_url;
+ if (web_request.GetState() == wxWebRequest::State_Idle)
+ web_request.Start();
+ BOOST_LOG_TRIVIAL(trace) << "monitor: start new webrequest, state = " << web_request.GetState() << ", url = " << m_request_url;
+ }
+ }
+}
+
+
bool StatusPanel::is_task_changed(MachineObject* obj)
{
if (!obj)
@@ -1553,10 +1683,7 @@ void StatusPanel::update(MachineObject *obj)
update_temp_ctrl(obj);
update_misc_ctrl(obj);
- // BBS hide tasklist info
- // update_tasklist(obj);
update_ams(obj);
-
update_cali(obj);
if (obj) {
@@ -1680,18 +1807,9 @@ void StatusPanel::market_model_scoring_page(int design_id)
void StatusPanel::show_error_message(MachineObject* obj, wxString msg, std::string print_error_str)
{
if (msg.IsEmpty()) {
- if (m_panel_error_txt->IsShown()) {
- error_info_reset();
- }
- if (m_print_error_dlg != nullptr) {
- /*if (m_print_error_dlg->IsShown()) {
- m_print_error_dlg->on_hide();
- }*/
- }
+ error_info_reset();
} else {
- m_error_text->SetLabel(msg);
- m_staticline->Show();
- m_panel_error_txt->Show();
+ m_project_task_panel->show_error_msg(msg);
auto it = std::find(message_containing_retry.begin(), message_containing_retry.end(), print_error_str);
@@ -1788,7 +1906,6 @@ void StatusPanel::show_printing_status(bool ctrl_area, bool temp_area)
m_switch_printing_fan->Enable();
m_switch_cham_fan->Enable();
m_bpButton_xy->Enable();
- m_text_tasklist_caption->SetForegroundColour(GROUP_TITLE_FONT_COL);
m_bpButton_z_10->Enable();
m_bpButton_z_1->Enable();
m_bpButton_z_down_1->Enable();
@@ -2320,23 +2437,6 @@ void StatusPanel::update_cali(MachineObject *obj)
}
}
-void StatusPanel::update_left_time(int mc_left_time)
-{
- // update gcode progress
- std::string left_time;
- wxString left_time_text = NA_STR;
-
- try {
- left_time = get_bbl_monitor_time_dhm(mc_left_time);
- } catch (...) {
- ;
- }
- if (!left_time.empty()) left_time_text = wxString::Format("-%s", left_time);
-
- // update current subtask progress
- m_staticText_progress_left->SetLabelText(left_time_text);
-}
-
void StatusPanel::update_basic_print_data(bool def)
{
if (def) {
@@ -2345,31 +2445,10 @@ void StatusPanel::update_basic_print_data(bool def)
wxString prediction = wxString::Format("%s", get_bbl_time_dhms(obj->slice_info->prediction));
wxString weight = wxString::Format("%.2fg", obj->slice_info->weight);
- if (!m_staticText_consumption_of_time->IsShown()) {
- m_bitmap_static_use_time->Show();
- m_staticText_consumption_of_time->Show();
- }
-
- if (!m_staticText_consumption_of_weight->IsShown()) {
- m_bitmap_static_use_weight->Show();
- m_staticText_consumption_of_weight->Show();
- }
-
- m_staticText_consumption_of_time->SetLabelText(prediction);
- m_staticText_consumption_of_weight->SetLabelText(weight);
- } else {
- if (m_staticText_consumption_of_time->IsShown()) {
- m_bitmap_static_use_time->Hide();
- m_staticText_consumption_of_time->Hide();
- }
-
- if (m_staticText_consumption_of_weight->IsShown()) {
- m_bitmap_static_use_weight->Hide();
- m_staticText_consumption_of_weight->Hide();
- }
-
- m_staticText_consumption_of_time->SetLabelText("0m");
- m_staticText_consumption_of_weight->SetLabelText("0g");
+ m_project_task_panel->show_priting_use_info(true, prediction, weight);
+ }
+ else {
+ m_project_task_panel->show_priting_use_info(false, "0m", "0g");
}
}
@@ -2398,10 +2477,10 @@ void StatusPanel::update_subtask(MachineObject *obj)
if (!obj) return;
if (obj->is_support_layer_num) {
- m_staticText_layers->Show();
+ m_project_task_panel->update_layers_num(true);
}
else {
- m_staticText_layers->Hide();
+ m_project_task_panel->update_layers_num(false);
}
update_model_info();
@@ -2411,12 +2490,9 @@ void StatusPanel::update_subtask(MachineObject *obj)
reset_printing_values();
} else if (obj->is_in_printing() || obj->print_status == "FINISH") {
if (obj->is_in_prepare() || obj->print_status == "SLICING") {
- m_button_market_scoring->Hide();
- m_button_abort->Enable(false);
- m_button_abort->SetBitmap_("print_control_stop_disable");
-
- m_button_pause_resume->Enable(false);
- m_button_pause_resume->SetBitmap_("print_control_pause_disable");
+ m_project_task_panel->get_market_scoring_button()->Hide();
+ m_project_task_panel->enable_abort_button(false);
+ m_project_task_panel->enable_pause_resume_button(false, "pause_disable");
wxString prepare_text;
bool show_percent = true;
@@ -2435,99 +2511,86 @@ void StatusPanel::update_subtask(MachineObject *obj)
if (obj->gcode_file_prepare_percent >= 0 && obj->gcode_file_prepare_percent <= 100 && show_percent)
prepare_text += wxString::Format("(%d%%)", obj->gcode_file_prepare_percent);
- m_printing_stage_value->SetLabelText(prepare_text);
- m_gauge_progress->SetValue(0);
- m_staticText_progress_percent->SetLabelText(NA_STR);
- m_staticText_progress_percent_icon->SetLabelText(wxEmptyString);
- m_staticText_progress_left->SetLabel(NA_STR);
- m_staticText_layers->SetLabelText(wxString::Format(_L("Layer: %s"), NA_STR));
- wxString subtask_text = wxString::Format("%s", GUI::from_u8(obj->subtask_name));
- m_staticText_subtask_value->SetLabelText(subtask_text);
+
+ m_project_task_panel->update_stage_value(prepare_text, 0);
+ m_project_task_panel->update_progress_percent(NA_STR, wxEmptyString);
+ m_project_task_panel->update_left_time(NA_STR);
+ m_project_task_panel->update_layers_num(true, wxString::Format(_L("Layer: %s"), NA_STR));
+ m_project_task_panel->update_subtask_name(wxString::Format("%s", GUI::from_u8(obj->subtask_name)));
if (obj->get_modeltask() && obj->get_modeltask()->design_id > 0) {
- if (!m_staticText_profile_value->IsShown()) { m_staticText_profile_value->Show(); }
- m_staticText_profile_value->SetLabelText(wxString::FromUTF8(obj->get_modeltask()->profile_name));
+ m_project_task_panel->show_profile_info(true, wxString::FromUTF8(obj->get_modeltask()->profile_name));
}
else {
- m_staticText_profile_value->SetLabelText(wxEmptyString);
- m_staticText_profile_value->Hide();
+ m_project_task_panel->show_profile_info(false);
}
update_basic_print_data(false);
} else {
if (obj->can_resume()) {
- m_button_pause_resume->SetBitmap_("print_control_resume");
- if (m_button_pause_resume->GetToolTipText() != _L("Resume")) { m_button_pause_resume->SetToolTip(_L("Resume")); }
+ m_project_task_panel->enable_pause_resume_button(true, "resume");
+
} else {
- m_button_pause_resume->SetBitmap_("print_control_pause");
- if (m_button_pause_resume->GetToolTipText() != _L("Pause")) { m_button_pause_resume->SetToolTip(_L("Pause")); }
+ m_project_task_panel->enable_pause_resume_button(true, "pause");
}
if (obj->print_status == "FINISH") {
- m_button_abort->Enable(false);
- m_button_abort->SetBitmap_("print_control_stop_disable");
- m_button_pause_resume->Enable(false);
- m_button_pause_resume->SetBitmap_("print_control_resume_disable");
- if (wxGetApp().has_model_mall()) {
- bool is_market_task = obj->get_modeltask() && obj->get_modeltask()->design_id > 0;
- if (is_market_task) {
- m_button_market_scoring->Show();
- BOOST_LOG_TRIVIAL(info) << "SHOW_SCORE_BTU: design_id [" << obj->get_modeltask()->design_id << "] print_finish [" << m_print_finish << "]";
- if (!m_print_finish && IsShownOnScreen()) {
- m_print_finish = true;
- int job_id = obj->get_modeltask()->job_id;
- if (wxGetApp().app_config->get("not_show_score_dialog") != "1" && rated_model_id.find(job_id) == rated_model_id.end()) {
- MessageDialog dlg(this, _L("Please give a score for your favorite Bambu Market model."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Score"),
- wxYES_NO | wxYES_DEFAULT | wxCENTRE);
- dlg.show_dsa_button();
- int old_design_id = obj->get_modeltask()->design_id;
- auto res = dlg.ShowModal();
- if (dlg.get_checkbox_state()) { wxGetApp().app_config->set("not_show_score_dialog", "1"); }
- if (res == wxID_YES) { market_model_scoring_page(old_design_id); }
- rated_model_id.insert(job_id);
- BOOST_LOG_TRIVIAL(info) << "SHOW_SCORE_DLG: design_id [" << old_design_id << "] print_finish [" << m_print_finish << "] not_show ["
- << wxGetApp().app_config->get("not_show_score_dialog") << "] job_id [" << job_id << "]";
- }
+
+ m_project_task_panel->enable_abort_button(false);
+ m_project_task_panel->enable_pause_resume_button(false, "resume_disable");
+
+ bool is_market_task = obj->get_modeltask() && obj->get_modeltask()->design_id > 0;
+ if (is_market_task) {
+ m_project_task_panel->get_market_scoring_button()->Show();
+ BOOST_LOG_TRIVIAL(info) << "SHOW_SCORE_BTU: design_id [" << obj->get_modeltask()->design_id << "] print_finish [" << m_print_finish << "]";
+ if (!m_print_finish && IsShownOnScreen()) {
+ m_print_finish = true;
+ int job_id = obj->get_modeltask()->job_id;
+ if (wxGetApp().app_config->get("not_show_score_dialog") != "1" && rated_model_id.find(job_id) == rated_model_id.end()) {
+ MessageDialog dlg(this, _L("Please give a score for your favorite Bambu Market model."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Score"),
+ wxYES_NO | wxYES_DEFAULT | wxCENTRE);
+ dlg.show_dsa_button();
+ int old_design_id = obj->get_modeltask()->design_id;
+ auto res = dlg.ShowModal();
+ if (dlg.get_checkbox_state()) { wxGetApp().app_config->set("not_show_score_dialog", "1"); }
+ if (res == wxID_YES) { market_model_scoring_page(old_design_id); }
+ rated_model_id.insert(job_id);
+ BOOST_LOG_TRIVIAL(info) << "SHOW_SCORE_DLG: design_id [" << old_design_id << "] print_finish [" << m_print_finish << "] not_show ["
+ << wxGetApp().app_config->get("not_show_score_dialog") << "] job_id [" << job_id << "]";
}
- } else {
- m_button_market_scoring->Hide();
}
+ } else {
+ m_project_task_panel->get_market_scoring_button()->Hide();
}
} else {
- m_button_abort->Enable(true);
- m_button_abort->SetBitmap_("print_control_stop");
- m_button_pause_resume->Enable(true);
- m_button_market_scoring->Hide();
+ m_project_task_panel->enable_abort_button(true);
+ m_project_task_panel->get_market_scoring_button()->Hide();
if (m_print_finish) {
m_print_finish = false;
}
}
// update printing stage
- m_printing_stage_value->SetLabelText(obj->get_curr_stage());
- update_left_time(obj->mc_left_time);
+
+ m_project_task_panel->update_left_time(obj->mc_left_time);
if (obj->subtask_) {
- m_gauge_progress->SetValue(obj->subtask_->task_progress);
- m_staticText_progress_percent->SetLabelText(wxString::Format("%d", obj->subtask_->task_progress));
- m_staticText_progress_percent_icon->SetLabelText("%");
- m_staticText_layers->SetLabelText(wxString::Format(_L("Layer: %d/%d"), obj->curr_layer, obj->total_layers));
+ m_project_task_panel->update_stage_value(obj->get_curr_stage(), obj->subtask_->task_progress);
+ m_project_task_panel->update_progress_percent(wxString::Format("%d", obj->subtask_->task_progress), "%");
+ m_project_task_panel->update_layers_num(true, wxString::Format(_L("Layer: %d/%d"), obj->curr_layer, obj->total_layers));
} else {
- m_gauge_progress->SetValue(0);
- m_staticText_progress_percent->SetLabelText(NA_STR);
- m_staticText_progress_percent_icon->SetLabelText(wxEmptyString);
- m_staticText_layers->SetLabelText(wxString::Format(_L("Layer: %s"), NA_STR));
+ m_project_task_panel->update_stage_value(obj->get_curr_stage(), 0);
+ m_project_task_panel->update_progress_percent(NA_STR, wxEmptyString);
+ m_project_task_panel->update_layers_num(true, wxString::Format(_L("Layer: %s"), NA_STR));
}
}
- wxString subtask_text = wxString::Format("%s", GUI::from_u8(obj->subtask_name));
- m_staticText_subtask_value->SetLabelText(subtask_text);
+
+ m_project_task_panel->update_subtask_name(wxString::Format("%s", GUI::from_u8(obj->subtask_name)));
if (obj->get_modeltask() && obj->get_modeltask()->design_id > 0) {
- if(!m_staticText_profile_value->IsShown()){ m_staticText_profile_value->Show();}
- m_staticText_profile_value->SetLabelText(wxString::FromUTF8(obj->get_modeltask()->profile_name));
+ m_project_task_panel->show_profile_info(wxString::FromUTF8(obj->get_modeltask()->profile_name));
}
else {
- m_staticText_profile_value->SetLabelText(wxEmptyString);
- m_staticText_profile_value->Hide();
+ m_project_task_panel->show_profile_info(false);
}
//update thumbnail
@@ -2569,8 +2632,8 @@ void StatusPanel::update_cloud_subtask(MachineObject *obj)
std::map::iterator it = img_list.find(m_request_url);
if (it != img_list.end()) {
img = it->second;
- wxImage resize_img = img.Scale(m_bitmap_thumbnail->GetSize().x, m_bitmap_thumbnail->GetSize().y);
- m_bitmap_thumbnail->SetBitmap(resize_img);
+ wxImage resize_img = img.Scale(m_project_task_panel->get_bitmap_thumbnail()->GetSize().x, m_project_task_panel->get_bitmap_thumbnail()->GetSize().y);
+ m_project_task_panel->get_bitmap_thumbnail()->SetBitmap(resize_img);
task_thumbnail_state = ThumbnailState::TASK_THUMBNAIL;
BOOST_LOG_TRIVIAL(trace) << "web_request: use cache image";
} else {
@@ -2589,7 +2652,7 @@ void StatusPanel::update_sdcard_subtask(MachineObject *obj)
if (!obj) return;
if (!m_load_sdcard_thumbnail) {
- m_bitmap_thumbnail->SetBitmap(m_thumbnail_sdcard.bmp());
+ m_project_task_panel->get_bitmap_thumbnail()->SetBitmap(m_thumbnail_sdcard.bmp());
task_thumbnail_state = ThumbnailState::SDCARD_THUMBNAIL;
m_load_sdcard_thumbnail = true;
}
@@ -2597,24 +2660,21 @@ void StatusPanel::update_sdcard_subtask(MachineObject *obj)
void StatusPanel::reset_printing_values()
{
- m_button_pause_resume->Enable(false);
- m_button_pause_resume->SetBitmap_("print_control_pause_disable");
+ m_project_task_panel->enable_pause_resume_button(false, "pause_disable");
+ m_project_task_panel->enable_abort_button(false);
+ m_project_task_panel->reset_printing_value();
+ m_project_task_panel->update_subtask_name(NA_STR);
+ m_project_task_panel->show_profile_info(false);
+ m_project_task_panel->update_stage_value(wxEmptyString, 0);
+ m_project_task_panel->update_progress_percent(NA_STR, wxEmptyString);
- m_button_abort->Enable(false);
- m_button_abort->SetBitmap_("print_control_stop_disable");
- m_gauge_progress->SetValue(0);
- m_staticText_subtask_value->SetLabelText(NA_STR);
- m_staticText_profile_value->SetLabelText(wxEmptyString);
- m_staticText_profile_value->Hide();
- m_button_market_scoring->Hide();
+ m_project_task_panel->get_market_scoring_button()->Hide();
update_basic_print_data(false);
- m_printing_stage_value->SetLabelText("");
- m_staticText_progress_left->SetLabelText(NA_STR);
- m_staticText_layers->SetLabelText(wxString::Format(_L("Layer: %s"), NA_STR));
- m_staticText_progress_percent->SetLabelText(NA_STR);
- m_staticText_progress_percent_icon->SetLabelText(wxEmptyString);
- m_bitmap_thumbnail->SetBitmap(m_thumbnail_placeholder.bmp());
+ m_project_task_panel->update_left_time(NA_STR);
+ m_project_task_panel->update_layers_num(true, wxString::Format(_L("Layer: %s"), NA_STR));
+
+
task_thumbnail_state = ThumbnailState::PLACE_HOLDER;
m_start_loading_thumbnail = false;
m_load_sdcard_thumbnail = false;
@@ -3373,54 +3433,6 @@ void StatusPanel::on_lamp_switch(wxCommandEvent &event)
}
}
-void StatusPanel::on_thumbnail_enter(wxMouseEvent &event)
-{
- if (obj) {
- if (!obj->slice_info || !obj->subtask_) return;
- /* do not popup when print status is failed */
- if (obj->print_status.compare("FAILED") == 0) {
- return;
- }
-
- if (m_slice_info_popup && m_slice_info_popup->IsShown())
- return;
- if (obj->slice_info) {
- m_slice_info_popup = std::make_shared(this, m_bitmap_thumbnail->GetBitmap(), obj->slice_info);
- wxWindow *ctrl = (wxWindow *) event.GetEventObject();
- wxPoint pos = ctrl->ClientToScreen(wxPoint(0, 0));
- wxSize sz = ctrl->GetSize();
- m_slice_info_popup->Position(pos, wxSize(sz.x / 2, sz.y / 2));
- m_slice_info_popup->Popup();
- }
- }
-}
-
-void StatusPanel::on_thumbnail_leave(wxMouseEvent &event)
-{
- if (obj && m_slice_info_popup) {
- if (!m_bitmap_thumbnail->GetRect().Contains(event.GetPosition())) {
- m_slice_info_popup->Dismiss();
- }
- }
-}
-
-void StatusPanel::refresh_thumbnail_webrequest(wxMouseEvent &event)
-{
- if (!obj) return;
- if (task_thumbnail_state != ThumbnailState::BROKEN_IMG) return;
-
- if (obj->slice_info) {
- m_request_url = wxString(obj->slice_info->thumbnail_url);
- if (!m_request_url.IsEmpty()) {
- web_request = wxWebSession::GetDefault().CreateRequest(this, m_request_url);
- BOOST_LOG_TRIVIAL(trace) << "monitor: create new webrequest, state = " << web_request.GetState() << ", url = " << m_request_url;
- if (web_request.GetState() == wxWebRequest::State_Idle)
- web_request.Start();
- BOOST_LOG_TRIVIAL(trace) << "monitor: start new webrequest, state = " << web_request.GetState() << ", url = "<< m_request_url;
- }
- }
-}
-
void StatusPanel::on_switch_vcamera(wxMouseEvent &event)
{
//if (!obj) return;
@@ -3558,7 +3570,6 @@ void StatusPanel::show_status(int status)
|| ((status & (int)MonitorStatus::MONITOR_CONNECTING) != 0)
|| ((status & (int)MonitorStatus::MONITOR_NO_PRINTER) != 0)
) {
- m_text_tasklist_caption->SetForegroundColour(DISCONNECT_TEXT_COL);
show_printing_status(false, false);
m_calibration_btn->Disable();
m_options_btn->Disable();
@@ -3636,7 +3647,7 @@ void StatusPanel::rescale_camera_icons()
void StatusPanel::on_sys_color_changed()
{
- m_button_abort->msw_rescale();
+ m_project_task_panel->msw_rescale();
m_bitmap_speed.msw_rescale();
m_bitmap_speed_active.msw_rescale();
m_switch_speed->SetImages(m_bitmap_speed, m_bitmap_speed);
@@ -3649,15 +3660,11 @@ void StatusPanel::on_sys_color_changed()
void StatusPanel::msw_rescale()
{
init_bitmaps();
-
+ m_project_task_panel->init_bitmaps();
+ m_project_task_panel->msw_rescale();
m_panel_monitoring_title->SetSize(wxSize(-1, FromDIP(PAGE_TITLE_HEIGHT)));
m_staticText_monitoring->SetMinSize(wxSize(PAGE_TITLE_TEXT_WIDTH, PAGE_TITLE_HEIGHT));
m_bmToggleBtn_timelapse->Rescale();
- m_panel_printing_title->SetSize(wxSize(-1, FromDIP(PAGE_TITLE_HEIGHT)));
- m_staticText_printing->SetMinSize(wxSize(PAGE_TITLE_TEXT_WIDTH, PAGE_TITLE_HEIGHT));
- m_bitmap_thumbnail->SetSize(TASK_THUMBNAIL_SIZE);
- m_printing_sizer->SetMinSize(wxSize(PAGE_MIN_WIDTH, -1));
- m_gauge_progress->SetHeight(PROGRESSBAR_HEIGHT);
m_panel_control_title->SetSize(wxSize(-1, FromDIP(PAGE_TITLE_HEIGHT)));
m_staticText_control->SetMinSize(wxSize(-1, PAGE_TITLE_HEIGHT));
m_bpButton_xy->SetBitmap(m_bitmap_axis_home);
@@ -3670,7 +3677,7 @@ void StatusPanel::msw_rescale()
for (Button *btn : m_buttons) { btn->Rescale(); }
init_scaled_buttons();
- m_gauge_progress->Rescale();
+
m_bpButton_xy->Rescale();
m_tempCtrl_nozzle->SetMinSize(TEMP_CTRL_MIN_SIZE);
m_tempCtrl_nozzle->Rescale();
diff --git a/src/slic3r/GUI/StatusPanel.hpp b/src/slic3r/GUI/StatusPanel.hpp
index 37c6de093d..d5953fa53d 100644
--- a/src/slic3r/GUI/StatusPanel.hpp
+++ b/src/slic3r/GUI/StatusPanel.hpp
@@ -40,15 +40,6 @@ class StepIndicator;
namespace Slic3r {
namespace GUI {
-enum MonitorStatus {
- MONITOR_UNKNOWN = 0,
- MONITOR_NORMAL = 1 << 1,
- MONITOR_NO_PRINTER = 1 << 2,
- MONITOR_DISCONNECTED = 1 << 3,
- MONITOR_DISCONNECTED_SERVER = 1 << 4,
- MONITOR_CONNECTING = 1 << 5,
-};
-
enum CameraRecordingStatus {
RECORDING_NONE,
RECORDING_OFF_NORMAL,
@@ -65,6 +56,79 @@ enum CameraTimelapseStatus {
TIMELAPSE_ON_HOVER,
};
+enum PrintingTaskType {
+ PRINGINT,
+ CALIBRATION,
+};
+
+class PrintingTaskPanel : public wxPanel
+{
+public:
+ PrintingTaskPanel(wxWindow* parent, PrintingTaskType type);
+ ~PrintingTaskPanel();
+ void create_panel(wxWindow* parent);
+
+private:
+ MachineObject* m_obj;
+ ScalableBitmap m_thumbnail_placeholder;
+ ScalableBitmap m_bitmap_use_time;
+ ScalableBitmap m_bitmap_use_weight;
+
+ wxPanel * m_panel_printing_title;
+ wxPanel* m_staticline;
+ wxPanel* m_panel_error_txt;
+
+ wxBoxSizer* m_printing_sizer;
+ wxStaticText * m_staticText_printing;
+ wxStaticText* m_staticText_subtask_value;
+ wxStaticText* m_staticText_consumption_of_time;
+ wxStaticText* m_staticText_consumption_of_weight;
+ wxStaticText* m_printing_stage_value;
+ wxStaticText* m_staticText_profile_value;
+ wxStaticText* m_staticText_progress_percent;
+ wxStaticText* m_staticText_progress_percent_icon;
+ wxStaticText* m_staticText_progress_left;
+ wxStaticText* m_staticText_layers;
+ wxStaticBitmap* m_bitmap_thumbnail;
+ wxStaticBitmap* m_bitmap_static_use_time;
+ wxStaticBitmap* m_bitmap_static_use_weight;
+ ScalableButton* m_button_pause_resume;
+ ScalableButton* m_button_abort;
+ Button* m_button_market_scoring;
+ Button* m_button_clean;
+
+ ProgressBar* m_gauge_progress;
+ ErrorMsgStaticText* m_error_text;
+ PrintingTaskType m_type;
+
+public:
+ void init_bitmaps();
+ void init_scaled_buttons();
+ void error_info_reset();
+ void show_error_msg(wxString msg);
+ void reset_printing_value();
+ void msw_rescale();
+
+public:
+ void enable_pause_resume_button(bool enable, std::string type);
+ void enable_abort_button(bool enable);
+ void update_subtask_name(wxString name);
+ void update_stage_value(wxString stage, int val);
+ void update_progress_percent(wxString percent, wxString icon);
+ void update_left_time(wxString time);
+ void update_left_time(int mc_left_time);
+ void update_layers_num(bool show, wxString num = wxEmptyString);
+ void show_priting_use_info(bool show, wxString time = wxEmptyString, wxString weight = wxEmptyString);
+ void show_profile_info(bool show, wxString profile = wxEmptyString);
+
+public:
+ ScalableButton* get_abort_button() {return m_button_abort;};
+ ScalableButton* get_pause_resume_button() {return m_button_pause_resume;};
+ Button* get_market_scoring_button() {return m_button_market_scoring;};
+ Button* get_clean_button() {return m_button_clean;};
+ wxStaticBitmap* get_bitmap_thumbnail() {return m_bitmap_thumbnail;};
+};
+
class StatusBasePanel : public wxScrolledWindow
{
protected:
@@ -208,7 +272,7 @@ protected:
StepIndicator* m_calibration_flow;
wxPanel * m_machine_ctrl_panel;
- wxPanel * m_project_task_panel;
+ PrintingTaskPanel * m_project_task_panel;
// Virtual event handlers, override them in your derived class
virtual void on_subtask_pause_resume(wxCommandEvent &event) { event.Skip(); }
@@ -239,7 +303,6 @@ public:
void init_bitmaps();
wxBoxSizer *create_monitoring_page();
- wxBoxSizer *create_project_task_page(wxWindow *parent);
wxBoxSizer *create_machine_control_page(wxWindow *parent);
wxBoxSizer *create_temp_axis_group(wxWindow *parent);
diff --git a/src/slic3r/GUI/UpgradePanel.cpp b/src/slic3r/GUI/UpgradePanel.cpp
index 6e1fe6f47e..fd66268adb 100644
--- a/src/slic3r/GUI/UpgradePanel.cpp
+++ b/src/slic3r/GUI/UpgradePanel.cpp
@@ -1,4 +1,5 @@
#include "UpgradePanel.hpp"
+#include
#include
#include
#include "GUI.hpp"
diff --git a/src/slic3r/GUI/Widgets/SideTools.cpp b/src/slic3r/GUI/Widgets/SideTools.cpp
index 6d382cd18c..3deef5b55a 100644
--- a/src/slic3r/GUI/Widgets/SideTools.cpp
+++ b/src/slic3r/GUI/Widgets/SideTools.cpp
@@ -1,18 +1,23 @@
#include "SideTools.hpp"
+#include "bambu_networking.hpp"
#include
#include