From 3662b5139c9ae43a3084bcc46a57002eceaf8ed3 Mon Sep 17 00:00:00 2001 From: Ian Bassi Date: Wed, 26 Mar 2025 17:54:07 -0300 Subject: [PATCH] FastTower and Granular Parameters Co-Authored-By: Rodrigo <162915171+rf47@users.noreply.github.com> --- .../input_shaping/fast_input_shaping_test.stl | Bin 0 -> 67284 bytes src/libslic3r/GCode.cpp | 17 +- src/libslic3r/calib.hpp | 5 +- src/slic3r/GUI/Plater.cpp | 8 +- src/slic3r/GUI/calib_dlg.cpp | 170 +++++++++++++----- src/slic3r/GUI/calib_dlg.hpp | 14 +- 6 files changed, 154 insertions(+), 60 deletions(-) create mode 100644 resources/calib/input_shaping/fast_input_shaping_test.stl diff --git a/resources/calib/input_shaping/fast_input_shaping_test.stl b/resources/calib/input_shaping/fast_input_shaping_test.stl new file mode 100644 index 0000000000000000000000000000000000000000..e2fd5cd370c4404744b0faecef41f07902cafed9 GIT binary patch literal 67284 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 accelerations; std::vector speeds; @@ -338,4 +339,4 @@ private: const double m_glyph_padding_vertical{1}; }; -} // namespace Slic3 \ No newline at end of file +} // namespace Slic3r \ No newline at end of file diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 8ae6998305..d01bff010b 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -10158,7 +10158,7 @@ void Plater::calib_input_shaping_freq(const Calib_Params& params) if (params.mode != CalibMode::Calib_Input_shaping_freq) return; - add_model(false, Slic3r::resources_dir() + "/calib/input_shaping/ringing_tower.stl"); + add_model(false, Slic3r::resources_dir() + (params.test_model < 1 ? "/calib/input_shaping/ringing_tower.stl" : "/calib/input_shaping/fast_input_shaping_test.stl")); auto print_config = &wxGetApp().preset_bundle->prints.get_edited_preset().config; auto filament_config = &wxGetApp().preset_bundle->filaments.get_edited_preset().config; filament_config->set_key_value("slow_down_layer_time", new ConfigOptionFloats { 2.0 }); @@ -10169,7 +10169,9 @@ void Plater::calib_input_shaping_freq(const Calib_Params& params) print_config->set_key_value("top_shell_layers", new ConfigOptionInt(0)); print_config->set_key_value("bottom_shell_layers", new ConfigOptionInt(1)); print_config->set_key_value("sparse_infill_density", new ConfigOptionPercent(0)); + print_config->set_key_value("detect_thin_wall", new ConfigOptionBool(false)); print_config->set_key_value("spiral_mode", new ConfigOptionBool(true)); + print_config->set_key_value("spiral_mode_smooth", new ConfigOptionBool(true)); model().objects[0]->config.set_key_value("brim_type", new ConfigOptionEnum(btOuterOnly)); model().objects[0]->config.set_key_value("brim_width", new ConfigOptionFloat(3.0)); model().objects[0]->config.set_key_value("brim_object_gap", new ConfigOptionFloat(0.0)); @@ -10191,7 +10193,7 @@ void Plater::calib_input_shaping_damp(const Calib_Params& params) if (params.mode != CalibMode::Calib_Input_shaping_damp) return; - add_model(false, Slic3r::resources_dir() + "/calib/input_shaping/ringing_tower.stl"); + add_model(false, Slic3r::resources_dir() + (params.test_model < 1 ? "/calib/input_shaping/ringing_tower.stl" : "/calib/input_shaping/fast_input_shaping_test.stl")); auto print_config = &wxGetApp().preset_bundle->prints.get_edited_preset().config; auto filament_config = &wxGetApp().preset_bundle->filaments.get_edited_preset().config; filament_config->set_key_value("slow_down_layer_time", new ConfigOptionFloats { 2.0 }); @@ -10202,7 +10204,9 @@ void Plater::calib_input_shaping_damp(const Calib_Params& params) print_config->set_key_value("top_shell_layers", new ConfigOptionInt(0)); print_config->set_key_value("bottom_shell_layers", new ConfigOptionInt(1)); print_config->set_key_value("sparse_infill_density", new ConfigOptionPercent(0)); + print_config->set_key_value("detect_thin_wall", new ConfigOptionBool(false)); print_config->set_key_value("spiral_mode", new ConfigOptionBool(true)); + print_config->set_key_value("spiral_mode_smooth", new ConfigOptionBool(true)); model().objects[0]->config.set_key_value("brim_type", new ConfigOptionEnum(btOuterOnly)); model().objects[0]->config.set_key_value("brim_width", new ConfigOptionFloat(3.0)); model().objects[0]->config.set_key_value("brim_object_gap", new ConfigOptionFloat(0.0)); diff --git a/src/slic3r/GUI/calib_dlg.cpp b/src/slic3r/GUI/calib_dlg.cpp index 1cb6564f57..d9d80fa5d2 100644 --- a/src/slic3r/GUI/calib_dlg.cpp +++ b/src/slic3r/GUI/calib_dlg.cpp @@ -722,7 +722,7 @@ Retraction_Test_Dlg::Retraction_Test_Dlg(wxWindow* parent, wxWindowID id, Plater auto end_length_sizer = new wxBoxSizer(wxHORIZONTAL); auto end_length_text = new wxStaticText(this, wxID_ANY, end_length_str, wxDefaultPosition, st_size, wxALIGN_LEFT); m_tiEnd = new TextInput(this, std::to_string(2), _L("mm"), "", wxDefaultPosition, ti_size, wxTE_CENTRE); - m_tiEnd->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC));//m_tiStart->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC)); + m_tiStart->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC)); end_length_sizer->Add(end_length_text, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2); end_length_sizer->Add(m_tiEnd, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2); settings_sizer->Add(end_length_sizer); @@ -798,37 +798,64 @@ Input_Shaping_Freq_Test_Dlg::Input_Shaping_Freq_Test_Dlg(wxWindow* parent, wxWin wxBoxSizer* v_sizer = new wxBoxSizer(wxVERTICAL); SetSizer(v_sizer); + // Model selection + wxString m_rbModelChoices[] = { _L("Ringing Tower"), _L("Fast Tower") }; + int m_rbModelNChoices = sizeof(m_rbModelChoices) / sizeof(wxString); + m_rbModel = new wxRadioBox(this, wxID_ANY, _L("Test model"), wxDefaultPosition, wxDefaultSize, m_rbModelNChoices, m_rbModelChoices, 1, wxRA_SPECIFY_ROWS); + m_rbModel->SetSelection(0); + v_sizer->Add(m_rbModel, 0, wxALL | wxEXPAND, 5); + // Settings // - wxString start_length_str = _L("Start: "); - wxString end_length_str = _L("End: "); - auto text_size = wxWindow::GetTextExtent(start_length_str); - text_size.IncTo(wxWindow::GetTextExtent(end_length_str)); + wxString start_x_str = _L("Start X: "); + wxString end_x_str = _L("End X: "); + wxString start_y_str = _L("Start Y: "); + wxString end_y_str = _L("End Y: "); + auto text_size = wxWindow::GetTextExtent(start_x_str); + text_size.IncTo(wxWindow::GetTextExtent(end_x_str)); + text_size.IncTo(wxWindow::GetTextExtent(start_y_str)); + text_size.IncTo(wxWindow::GetTextExtent(end_y_str)); text_size.x = text_size.x * 1.5; wxStaticBoxSizer* settings_sizer = new wxStaticBoxSizer(wxVERTICAL, this, _L("Frequency settings")); auto st_size = FromDIP(wxSize(text_size.x, -1)); auto ti_size = FromDIP(wxSize(90, -1)); - auto start_length_sizer = new wxBoxSizer(wxHORIZONTAL); - auto start_length_text = new wxStaticText(this, wxID_ANY, start_length_str, wxDefaultPosition, st_size, wxALIGN_LEFT); - m_tiStart = new TextInput(this, std::to_string(15), _L("HZ"), "", wxDefaultPosition, ti_size, wxTE_CENTRE); - m_tiStart->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC)); - auto end_length_text = new wxStaticText(this, wxID_ANY, end_length_str, wxDefaultPosition, st_size, wxALIGN_LEFT); - m_tiEnd = new TextInput(this, std::to_string(45), _L("HZ"), "", wxDefaultPosition, ti_size, wxTE_CENTRE); - m_tiEnd->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC)); + // X axis frequencies + auto x_freq_sizer = new wxBoxSizer(wxHORIZONTAL); + auto start_x_text = new wxStaticText(this, wxID_ANY, start_x_str, wxDefaultPosition, st_size, wxALIGN_LEFT); + m_tiFreqStartX = new TextInput(this, std::to_string(15), _L("HZ"), "", wxDefaultPosition, ti_size, wxTE_CENTRE); + m_tiFreqStartX->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC)); + auto end_x_text = new wxStaticText(this, wxID_ANY, end_x_str, wxDefaultPosition, st_size, wxALIGN_LEFT); + m_tiFreqEndX = new TextInput(this, std::to_string(60), _L("HZ"), "", wxDefaultPosition, ti_size, wxTE_CENTRE); + m_tiFreqEndX->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC)); - start_length_sizer->Add(start_length_text, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2); - start_length_sizer->Add(m_tiStart, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2); - start_length_sizer->Add(end_length_text, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2); - start_length_sizer->Add(m_tiEnd, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2); - settings_sizer->Add(start_length_sizer); + x_freq_sizer->Add(start_x_text, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2); + x_freq_sizer->Add(m_tiFreqStartX, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2); + x_freq_sizer->Add(end_x_text, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2); + x_freq_sizer->Add(m_tiFreqEndX, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2); + settings_sizer->Add(x_freq_sizer); + + // Y axis frequencies + auto y_freq_sizer = new wxBoxSizer(wxHORIZONTAL); + auto start_y_text = new wxStaticText(this, wxID_ANY, start_y_str, wxDefaultPosition, st_size, wxALIGN_LEFT); + m_tiFreqStartY = new TextInput(this, std::to_string(15), _L("HZ"), "", wxDefaultPosition, ti_size, wxTE_CENTRE); + m_tiFreqStartY->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC)); + auto end_y_text = new wxStaticText(this, wxID_ANY, end_y_str, wxDefaultPosition, st_size, wxALIGN_LEFT); + m_tiFreqEndY = new TextInput(this, std::to_string(60), _L("HZ"), "", wxDefaultPosition, ti_size, wxTE_CENTRE); + m_tiFreqEndY->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC)); + + y_freq_sizer->Add(start_y_text, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2); + y_freq_sizer->Add(m_tiFreqStartY, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2); + y_freq_sizer->Add(end_y_text, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2); + y_freq_sizer->Add(m_tiFreqEndY, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2); + settings_sizer->Add(y_freq_sizer); // Damping Factor wxString damping_factor_str = _L("Damp: "); auto damping_factor_sizer = new wxBoxSizer(wxHORIZONTAL); auto damping_factor_text = new wxStaticText(this, wxID_ANY, damping_factor_str, wxDefaultPosition, st_size, wxALIGN_LEFT); - m_tiDampingFactor = new TextInput(this, wxString::Format("%.2f", 0.15), "", "", wxDefaultPosition, ti_size, wxTE_CENTRE); + m_tiDampingFactor = new TextInput(this, wxString::Format("%.2f", 0.35), "", "", wxDefaultPosition, ti_size, wxTE_CENTRE); m_tiDampingFactor->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC)); damping_factor_sizer->Add(damping_factor_text, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2); @@ -872,26 +899,33 @@ Input_Shaping_Freq_Test_Dlg::~Input_Shaping_Freq_Test_Dlg() { void Input_Shaping_Freq_Test_Dlg::on_start(wxCommandEvent& event) { bool read_double = false; - read_double = m_tiStart->GetTextCtrl()->GetValue().ToDouble(&m_params.start); - read_double = read_double && m_tiEnd->GetTextCtrl()->GetValue().ToDouble(&m_params.end); + read_double = m_tiFreqStartX->GetTextCtrl()->GetValue().ToDouble(&m_params.freqStartX); + read_double = read_double && m_tiFreqEndX->GetTextCtrl()->GetValue().ToDouble(&m_params.freqEndX); + read_double = read_double && m_tiFreqStartY->GetTextCtrl()->GetValue().ToDouble(&m_params.freqStartY); + read_double = read_double && m_tiFreqEndY->GetTextCtrl()->GetValue().ToDouble(&m_params.freqEndY); + read_double = read_double && m_tiDampingFactor->GetTextCtrl()->GetValue().ToDouble(&m_params.start); - double dampingFactor = 0.0; - bool read_damping = m_tiDampingFactor->GetTextCtrl()->GetValue().ToDouble(&dampingFactor); - - if (!read_double || m_params.start < 0 || m_params.end > 500|| m_params.end < m_params.start) { - MessageDialog msg_dlg(nullptr, _L("Please input valid values:\nStart > 0\nEnd < 500\nStart < End"), wxEmptyString, wxICON_WARNING | wxOK); + if (!read_double || + m_params.freqStartX < 0 || m_params.freqEndX > 500 || + m_params.freqStartY < 0 || m_params.freqEndX > 500 || + m_params.freqStartX >= m_params.freqEndX || + m_params.freqStartY >= m_params.freqEndY) { + MessageDialog msg_dlg(nullptr, _L("Please input valid values\n(0 < FreqStart < FreqEnd < 500"), wxEmptyString, wxICON_WARNING | wxOK); msg_dlg.ShowModal(); return; } - if (!read_damping || dampingFactor < 0 || dampingFactor >= 1) { + if (m_params.start < 0 || m_params.start >= 1) { MessageDialog msg_dlg(nullptr, _L("Please input a valid damping factor (0 < Damping/zeta factor <= 1)"), wxEmptyString, wxICON_WARNING | wxOK); msg_dlg.ShowModal(); return; } - m_params.step = dampingFactor; m_params.mode = CalibMode::Calib_Input_shaping_freq; + + // Set model type based on selection + m_params.test_model = m_rbModel->GetSelection() == 0 ? 0 : 1; // 0 = Ringing Tower, 1 = Fast Tower + m_plater->calib_input_shaping_freq(m_params); EndModal(wxID_OK); } @@ -899,7 +933,6 @@ void Input_Shaping_Freq_Test_Dlg::on_start(wxCommandEvent& event) { void Input_Shaping_Freq_Test_Dlg::on_dpi_changed(const wxRect& suggested_rect) { this->Refresh(); Fit(); - } // Input_Shaping_Damp_Test_Dlg @@ -911,31 +944,57 @@ Input_Shaping_Damp_Test_Dlg::Input_Shaping_Damp_Test_Dlg(wxWindow* parent, wxWin wxBoxSizer* v_sizer = new wxBoxSizer(wxVERTICAL); SetSizer(v_sizer); + // Model selection + wxString m_rbModelChoices[] = { _L("Ringing Tower"), _L("Fast Tower") }; + int m_rbModelNChoices = sizeof(m_rbModelChoices) / sizeof(wxString); + m_rbModel = new wxRadioBox(this, wxID_ANY, _L("Test model"), wxDefaultPosition, wxDefaultSize, m_rbModelNChoices, m_rbModelChoices, 1, wxRA_SPECIFY_ROWS); + m_rbModel->SetSelection(0); + v_sizer->Add(m_rbModel, 0, wxALL | wxEXPAND, 5); + // Settings // - wxString start_length_str = _L("X: "); - wxString end_length_str = _L("Y: "); - auto text_size = wxWindow::GetTextExtent(start_length_str); - text_size.IncTo(wxWindow::GetTextExtent(end_length_str)); + wxString freq_x_str = _L("Freq X: "); + wxString freq_y_str = _L("Freq Y: "); + wxString damp_start_str = _L("Start damp: "); + wxString damp_end_str = _L("End damp: "); + auto text_size = wxWindow::GetTextExtent(freq_x_str); + text_size.IncTo(wxWindow::GetTextExtent(freq_y_str)); + text_size.IncTo(wxWindow::GetTextExtent(damp_start_str)); + text_size.IncTo(wxWindow::GetTextExtent(damp_end_str)); text_size.x = text_size.x * 1.5; wxStaticBoxSizer* settings_sizer = new wxStaticBoxSizer(wxVERTICAL, this, _L("Frequency settings")); auto st_size = FromDIP(wxSize(text_size.x, -1)); auto ti_size = FromDIP(wxSize(90, -1)); - auto start_length_sizer = new wxBoxSizer(wxHORIZONTAL); - auto start_length_text = new wxStaticText(this, wxID_ANY, start_length_str, wxDefaultPosition, st_size, wxALIGN_LEFT); - m_tiStart = new TextInput(this, std::to_string(40), _L("HZ"), "", wxDefaultPosition, ti_size, wxTE_CENTRE); - m_tiStart->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC)); - auto end_length_text = new wxStaticText(this, wxID_ANY, end_length_str, wxDefaultPosition, st_size, wxALIGN_LEFT); - m_tiEnd = new TextInput(this, std::to_string(40), _L("HZ"), "", wxDefaultPosition, ti_size, wxTE_CENTRE); - m_tiEnd->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC)); + auto freq_sizer = new wxBoxSizer(wxHORIZONTAL); + auto freq_x_text = new wxStaticText(this, wxID_ANY, freq_x_str, wxDefaultPosition, st_size, wxALIGN_LEFT); + m_tiFreqX = new TextInput(this, std::to_string(30), _L("HZ"), "", wxDefaultPosition, ti_size, wxTE_CENTRE); + m_tiFreqX->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC)); + auto freq_y_text = new wxStaticText(this, wxID_ANY, freq_y_str, wxDefaultPosition, st_size, wxALIGN_LEFT); + m_tiFreqY = new TextInput(this, std::to_string(30), _L("HZ"), "", wxDefaultPosition, ti_size, wxTE_CENTRE); + m_tiFreqY->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC)); - start_length_sizer->Add(start_length_text, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2); - start_length_sizer->Add(m_tiStart, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2); - start_length_sizer->Add(end_length_text, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2); - start_length_sizer->Add(m_tiEnd, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2); - settings_sizer->Add(start_length_sizer); + freq_sizer->Add(freq_x_text, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2); + freq_sizer->Add(m_tiFreqX, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2); + freq_sizer->Add(freq_y_text, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2); + freq_sizer->Add(m_tiFreqY, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2); + settings_sizer->Add(freq_sizer); + + // Damping Factor Start and End + auto damp_sizer = new wxBoxSizer(wxHORIZONTAL); + auto damp_start_text = new wxStaticText(this, wxID_ANY, damp_start_str, wxDefaultPosition, st_size, wxALIGN_LEFT); + m_tiDampingFactorStart = new TextInput(this, wxString::Format("%.2f", 0.00), "", "", wxDefaultPosition, ti_size, wxTE_CENTRE); + m_tiDampingFactorStart->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC)); + auto damp_end_text = new wxStaticText(this, wxID_ANY, damp_end_str, wxDefaultPosition, st_size, wxALIGN_LEFT); + m_tiDampingFactorEnd = new TextInput(this, wxString::Format("%.2f", 0.40), "", "", wxDefaultPosition, ti_size, wxTE_CENTRE); + m_tiDampingFactorEnd->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC)); + + damp_sizer->Add(damp_start_text, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2); + damp_sizer->Add(m_tiDampingFactorStart, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2); + damp_sizer->Add(damp_end_text, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2); + damp_sizer->Add(m_tiDampingFactorEnd, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2); + settings_sizer->Add(damp_sizer); // Add a note to explain users to use their previously calculated frequency auto note_text = new wxStaticText(this, wxID_ANY, _L("Note: Set frequencies to the previously calculated values"), @@ -974,16 +1033,32 @@ Input_Shaping_Damp_Test_Dlg::~Input_Shaping_Damp_Test_Dlg() { void Input_Shaping_Damp_Test_Dlg::on_start(wxCommandEvent& event) { bool read_double = false; - read_double = m_tiStart->GetTextCtrl()->GetValue().ToDouble(&m_params.start); - read_double = read_double && m_tiEnd->GetTextCtrl()->GetValue().ToDouble(&m_params.end); + read_double = m_tiFreqX->GetTextCtrl()->GetValue().ToDouble(&m_params.freqStartX); + read_double = read_double && m_tiFreqY->GetTextCtrl()->GetValue().ToDouble(&m_params.freqStartY); + read_double = read_double && m_tiDampingFactorStart->GetTextCtrl()->GetValue().ToDouble(&m_params.start); + read_double = read_double && m_tiDampingFactorEnd->GetTextCtrl()->GetValue().ToDouble(&m_params.end); + - if (!read_double || m_params.start < 0 || m_params.start > 500 || m_params.end < 0 || m_params.end > 500) { + if (!read_double || + m_params.freqStartX < 0 || m_params.freqStartX > 500 || + m_params.freqStartY < 0 || m_params.freqStartY > 500 ) { MessageDialog msg_dlg(nullptr, _L("Please input valid values\n(0 < Freq < 500"), wxEmptyString, wxICON_WARNING | wxOK); msg_dlg.ShowModal(); return; } + if (m_params.start < 0 || m_params.end > 1 + || m_params.start >= m_params.end) { + MessageDialog msg_dlg(nullptr, _L("Please input a valid damping factor (0 <= DampingStart < DampingEnd <= 1)"), wxEmptyString, wxICON_WARNING | wxOK); + msg_dlg.ShowModal(); + return; + } + m_params.mode = CalibMode::Calib_Input_shaping_damp; + + // Set model type based on selection + m_params.test_model = m_rbModel->GetSelection() == 0 ? 0 : 1; // 0 = Ringing Tower, 1 = Fast Tower + m_plater->calib_input_shaping_damp(m_params); EndModal(wxID_OK); } @@ -991,7 +1066,6 @@ void Input_Shaping_Damp_Test_Dlg::on_start(wxCommandEvent& event) { void Input_Shaping_Damp_Test_Dlg::on_dpi_changed(const wxRect& suggested_rect) { this->Refresh(); Fit(); - } }} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/calib_dlg.hpp b/src/slic3r/GUI/calib_dlg.hpp index cf9ce0b022..a12eabd3ce 100644 --- a/src/slic3r/GUI/calib_dlg.hpp +++ b/src/slic3r/GUI/calib_dlg.hpp @@ -137,8 +137,11 @@ protected: virtual void on_start(wxCommandEvent& event); Calib_Params m_params; - TextInput* m_tiStart; - TextInput* m_tiEnd; + wxRadioBox* m_rbModel; + TextInput* m_tiFreqStartX; + TextInput* m_tiFreqEndX; + TextInput* m_tiFreqStartY; + TextInput* m_tiFreqEndY; TextInput* m_tiDampingFactor; Button* m_btnStart; Plater* m_plater; @@ -156,8 +159,11 @@ protected: virtual void on_start(wxCommandEvent& event); Calib_Params m_params; - TextInput* m_tiStart; - TextInput* m_tiEnd; + wxRadioBox* m_rbModel; + TextInput* m_tiFreqX; + TextInput* m_tiFreqY; + TextInput* m_tiDampingFactorStart; + TextInput* m_tiDampingFactorEnd; Button* m_btnStart; Plater* m_plater; };