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 0000000000..e2fd5cd370 Binary files /dev/null and b/resources/calib/input_shaping/fast_input_shaping_test.stl differ diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index d480a7445d..c53a077b87 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -3769,13 +3769,22 @@ LayerResult GCode::process_layer( sprintf(buf, "; Calib_Retraction_tower: Z_HEIGHT: %g, length:%g\n", print_z, _length); gcode += buf; } else if (print.calib_mode() == CalibMode::Calib_Input_shaping_freq) { - gcode += writer().set_input_shaping('A', print.calib_params().step, m_layer_index < 2 ? 0.f : (print.calib_params().start) + ((print.calib_params().end)-(print.calib_params().start)) * (m_layer_index - 2) / (m_layer_count - 3)); + if (m_layer_index == 1){ + gcode += writer().set_input_shaping('A', print.calib_params().start, 0.f); + } else { + if (print.calib_params().freqStartX == print.calib_params().freqStartY && print.calib_params().freqEndX == print.calib_params().freqEndY) { + gcode += writer().set_input_shaping('A', 0.f, (print.calib_params().freqStartX) + ((print.calib_params().freqEndX)-(print.calib_params().freqStartX)) * (m_layer_index - 2) / (m_layer_count - 3)); + } else { + gcode += writer().set_input_shaping('X', 0.f, (print.calib_params().freqStartX) + ((print.calib_params().freqEndX)-(print.calib_params().freqStartX)) * (m_layer_index - 2) / (m_layer_count - 3)); + gcode += writer().set_input_shaping('Y', 0.f, (print.calib_params().freqStartY) + ((print.calib_params().freqEndY)-(print.calib_params().freqStartY)) * (m_layer_index - 2) / (m_layer_count - 3)); + } + } } else if (print.calib_mode() == CalibMode::Calib_Input_shaping_damp) { if (m_layer_index == 1){ - gcode += writer().set_input_shaping('X', 0.f, print.calib_params().start); - gcode += writer().set_input_shaping('Y', 0.f, print.calib_params().end); + gcode += writer().set_input_shaping('X', 0.f, print.calib_params().freqStartX); + gcode += writer().set_input_shaping('Y', 0.f, print.calib_params().freqStartY); } else { - gcode += writer().set_input_shaping('A', float(m_layer_index) / float(m_layer_count), 0.f); + gcode += writer().set_input_shaping('A', print.calib_params().start + ((print.calib_params().end)-(print.calib_params().start)) * (m_layer_index) / (m_layer_count), 0.f); } } diff --git a/src/libslic3r/calib.hpp b/src/libslic3r/calib.hpp index 7cdad011d7..df78fe90b3 100644 --- a/src/libslic3r/calib.hpp +++ b/src/libslic3r/calib.hpp @@ -33,7 +33,8 @@ struct Calib_Params Calib_Params() : mode(CalibMode::Calib_None){}; double start, end, step; bool print_numbers; - + double freqStartX, freqEndX, freqStartY, freqEndY; + int test_model; std::vector 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; };