Files
QIDIStudio/src/slic3r/GUI/CalibrationPanel.cpp
2024-09-20 17:57:41 +08:00

298 lines
11 KiB
C++

#include <wx/dcgraph.h>
#include "GUI.hpp"
#include "GUI_App.hpp"
#include "MainFrame.hpp"
#include "CalibrationPanel.hpp"
#include "I18N.hpp"
#include "Tab.hpp"
namespace Slic3r { namespace GUI {
#define REFRESH_INTERVAL 1000
#define INITIAL_NUMBER_OF_MACHINES 0
#define LIST_REFRESH_INTERVAL 200
#define MACHINE_LIST_REFRESH_INTERVAL 2000
wxDEFINE_EVENT(EVT_FINISHED_UPDATE_MLIST, wxCommandEvent);
wxDEFINE_EVENT(EVT_UPDATE_USER_MLIST, wxCommandEvent);
wxString get_calibration_type_name(CalibMode cali_mode)
{
switch (cali_mode) {
case CalibMode::Calib_PA_Line:
//w29
return _L("Pressure Advance");
case CalibMode::Calib_Flow_Rate:
return _L("Flow Rate");
case CalibMode::Calib_Vol_speed_Tower:
return _L("Max Volumetric Speed");
case CalibMode::Calib_Temp_Tower:
return _L("Temperature");
case CalibMode::Calib_Retraction_tower:
return _L("Retraction");
default:
return "";
}
}
//w29
CalibrationPanel::CalibrationPanel(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style)
//w29
: wxPanel(parent, id, pos, size, style)
{
SetBackgroundColour(*wxWHITE);
init_tabpanel();
wxBoxSizer* sizer_main = new wxBoxSizer(wxVERTICAL);
sizer_main->Add(m_tabpanel, 1, wxEXPAND, 0);
SetSizerAndFit(sizer_main);
Layout();
init_timer();
//w29
}
//w29
void CalibrationPanel::create_preset_box(wxWindow* parent, wxBoxSizer* sizer_side_tools) {
PresetBundle* m_preset_bundle = wxGetApp().preset_bundle;
auto panel = this;
m_printer_choice = new TabPresetComboBox(panel, Slic3r::Preset::TYPE_PRINTER);
m_printer_choice->set_selection_changed_function([this](int selection) {
if (!m_printer_choice->selection_is_changed_according_to_physical_printers())
{
if (!m_printer_choice->is_selected_physical_printer())
wxGetApp().preset_bundle->physical_printers.unselect_printer();
std::string preset_name = m_printer_choice->GetString(selection).ToUTF8().data();
Slic3r::GUI::Tab* printer_tab = Slic3r::GUI::wxGetApp().get_tab(Preset::Type::TYPE_PRINTER);
printer_tab->select_preset(Preset::remove_suffix_modified(preset_name));
m_filament_choice->update();
m_print_choice->update();
}
});
m_filament_choice = new TabPresetComboBox(panel, Slic3r::Preset::TYPE_FILAMENT);
m_filament_choice->set_selection_changed_function([this](int selection) {
if (!m_filament_choice->selection_is_changed_according_to_physical_printers())
{
if (!m_filament_choice->is_selected_physical_printer())
wxGetApp().preset_bundle->physical_printers.unselect_printer();
std::string preset_name = m_filament_choice->GetString(selection).ToUTF8().data();
if (preset_name.find("PETG") != std::string::npos && m_tabpanel->GetSelection() == 1) {
wxMessageBox("PETG filaments are not suitable for pressure advance calibration", "Warning", wxOK | wxICON_ERROR);
}
Slic3r::GUI::Tab* filament_tab = Slic3r::GUI::wxGetApp().get_tab(Preset::Type::TYPE_FILAMENT);
filament_tab->select_preset(preset_name);
const std::string& name = wxGetApp().preset_bundle->filaments.get_selected_preset_name();
{
Preset* preset = wxGetApp().preset_bundle->filaments.find_preset(name, false);
if (preset)
{
if (preset->is_compatible) wxGetApp().preset_bundle->set_filament_preset(0, name);
}
wxGetApp().sidebar().combos_filament()[0]->update();
}
}
});
m_print_choice = new TabPresetComboBox(panel, Slic3r::Preset::TYPE_PRINT);
m_print_choice->set_selection_changed_function([this](int selection) {
if (!m_print_choice->selection_is_changed_according_to_physical_printers())
{
if (!m_print_choice->is_selected_physical_printer())
wxGetApp().preset_bundle->physical_printers.unselect_printer();
std::string preset_name = m_print_choice->GetString(selection).ToUTF8().data();
Slic3r::GUI::Tab* print_tab = Slic3r::GUI::wxGetApp().get_tab(Preset::Type::TYPE_PRINT);
print_tab->select_preset(Preset::remove_suffix_modified(preset_name));
}
});
wxPanel* m_printer_panel = new wxPanel(parent);
ScalableButton* m_printer_icon = new ScalableButton(m_printer_panel, wxID_ANY, "printer");
Label* m_printer_title = new Label(m_printer_panel, _L("Printer"), LB_PROPAGATE_MOUSE_EVENT);
m_printer_icon->SetForegroundColour(m_printer_icon->GetForegroundColour());
wxBoxSizer* h_printer_sizer = new wxBoxSizer(wxHORIZONTAL);
m_printer_panel->SetSizer(h_printer_sizer);
h_printer_sizer->Add(FromDIP(10), 0, 0, 0, 0);
h_printer_sizer->Add(m_printer_icon, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL);
h_printer_sizer->Add(m_printer_title, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT, 5);
h_printer_sizer->AddStretchSpacer(1);
wxPanel* m_filament_panel = new wxPanel(parent);
ScalableButton* m_filament_icon = new ScalableButton(m_filament_panel, wxID_ANY, "filament");
Label* m_filament_title = new Label(m_filament_panel, _L("Filament"), LB_PROPAGATE_MOUSE_EVENT);
m_filament_icon->SetForegroundColour(m_filament_icon->GetForegroundColour());
wxBoxSizer* h_filament_sizer = new wxBoxSizer(wxHORIZONTAL);
m_filament_panel->SetSizer(h_filament_sizer);
h_filament_sizer->Add(FromDIP(10), 0, 0, 0, 0);
h_filament_sizer->Add(m_filament_icon, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL);
h_filament_sizer->Add(m_filament_title, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT, 5);
h_filament_sizer->AddStretchSpacer(1);
wxPanel* m_process_panel = new wxPanel(parent);
ScalableButton* m_process_icon = new ScalableButton(m_process_panel, wxID_ANY, "process");
Label* m_process_title = new Label(m_process_panel, _L("Process"), LB_PROPAGATE_MOUSE_EVENT);
m_process_icon->SetForegroundColour(m_process_icon->GetForegroundColour());
wxBoxSizer* h_process_sizer = new wxBoxSizer(wxHORIZONTAL);
m_process_panel->SetSizer(h_process_sizer);
h_process_sizer->Add(FromDIP(10), 0, 0, 0, 0);
h_process_sizer->Add(m_process_icon, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL);
h_process_sizer->Add(m_process_title, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT, 5);
h_process_sizer->AddStretchSpacer(1);
wxColour bg(241, 241, 241);
m_printer_icon->SetBackgroundColour(bg);
m_filament_icon->SetBackgroundColour(bg);
m_process_icon->SetBackgroundColour(bg);
m_printer_title->SetBackgroundColour(bg);
m_filament_title->SetBackgroundColour(bg);
m_process_title->SetBackgroundColour(bg);
m_printer_panel->SetBackgroundColour(bg);
m_filament_panel->SetBackgroundColour(bg);
m_process_panel->SetBackgroundColour(bg);
sizer_side_tools->Add(m_printer_panel, 0, wxEXPAND);
sizer_side_tools->AddSpacer(10);
sizer_side_tools->Add(m_printer_choice, 0, wxEXPAND | wxLEFT | wxRIGHT, 5);
sizer_side_tools->Add(m_filament_panel, 0, wxEXPAND | wxTOP | wxBottom, 10);
sizer_side_tools->AddSpacer(10);
sizer_side_tools->Add(m_filament_choice, 0, wxEXPAND | wxLEFT | wxRIGHT, 5);
sizer_side_tools->Add(m_process_panel, 0, wxEXPAND | wxTOP | wxBottom, 10);
sizer_side_tools->AddSpacer(10);
sizer_side_tools->Add(m_print_choice, 0, wxEXPAND | wxLEFT | wxRIGHT, 5);
wxStaticLine* line = new wxStaticLine(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL);
line->SetForegroundColour(bg);
line->SetBackgroundColour(bg);
sizer_side_tools->Add(line, 0, wxEXPAND | wxTOP, 10);
sizer_side_tools->Layout();
this->Layout();
this->Refresh();
m_printer_choice->update();
m_filament_choice->update();
m_print_choice->update();
Layout();
Refresh();
}
void CalibrationPanel::init_tabpanel() {
//w29
wxBoxSizer* sizer_side_tools = new wxBoxSizer(wxVERTICAL);
sizer_side_tools->SetMinSize(wxSize(250, -1));
//w29
create_preset_box(this, sizer_side_tools);
m_tabpanel = new Tabbook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, sizer_side_tools, wxNB_LEFT | wxTAB_TRAVERSAL | wxNB_NOPAGETHEME);
m_printer_choice->update();
m_filament_choice->update();
m_print_choice->update();
//w29
m_tabpanel->SetBackgroundColour(*wxWHITE);
m_cali_panels[0] = new FlowRateWizard(m_tabpanel);
m_cali_panels[1] = new PressureAdvanceWizard(m_tabpanel);
//w29
m_cali_panels[2] = new MaxVolumetricSpeedWizard(m_tabpanel);
for (int i = 0; i < (int)CALI_MODE_COUNT; i++) {
bool selected = false;
if (i == 0)
selected = true;
//w29
/*m_tabpanel->AddPage(m_cali_panels[i],
get_calibration_type_name(m_cali_panels[i]->get_calibration_mode()),
"",
selected);*/
if (i == 1) {
m_tabpanel->AddPage(m_cali_panels[i],
get_calibration_type_name(CalibMode::Calib_PA_Line),
"",
selected);
}
else if( i == 0){
selected = true;
m_tabpanel->AddPage(m_cali_panels[i],
get_calibration_type_name(CalibMode::Calib_Flow_Rate),
"",
selected);
}
else {
m_tabpanel->AddPage(m_cali_panels[i],
get_calibration_type_name(m_cali_panels[i]->get_calibration_mode()),
"",
selected);
}
}
for (int i = 0; i < (int)CALI_MODE_COUNT; i++)
m_tabpanel->SetPageImage(i, "");
auto padding_size = m_tabpanel->GetBtnsListCtrl()->GetPaddingSize(0);
m_tabpanel->GetBtnsListCtrl()->SetPaddingSize({ FromDIP(15), padding_size.y });
m_initialized = true;
}
void CalibrationPanel::init_timer()
{
m_refresh_timer = new wxTimer();
m_refresh_timer->SetOwner(this);
m_refresh_timer->Start(REFRESH_INTERVAL);
wxPostEvent(this, wxTimerEvent());
}
//w29
bool CalibrationPanel::Show(bool show) {
if (show) {
m_refresh_timer->Stop();
m_refresh_timer->SetOwner(this);
m_refresh_timer->Start(REFRESH_INTERVAL);
wxPostEvent(this, wxTimerEvent());
DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager();
if (dev) {
//set a default machine when obj is null
obj = dev->get_selected_machine();
if (obj == nullptr) {
dev->load_last_machine();
obj = dev->get_selected_machine();
if (obj)
GUI::wxGetApp().sidebar().load_ams_list(obj->dev_id, obj);
}
else {
obj->reset_update_time();
}
}
}
else {
m_refresh_timer->Stop();
}
return wxPanel::Show(show);
}
//w29
void CalibrationPanel::msw_rescale()
{
for (int i = 0; i < (int)CALI_MODE_COUNT; i++) {
m_cali_panels[i]->msw_rescale();
}
}
CalibrationPanel::~CalibrationPanel() {
if (m_refresh_timer)
m_refresh_timer->Stop();
delete m_refresh_timer;
}
}}