From 8711e9fa3726f9d8ea2db386d80f950d4f2e340c Mon Sep 17 00:00:00 2001 From: supermerill Date: Sun, 30 Aug 2020 01:28:53 +0200 Subject: [PATCH] retraction calibration: now with multiple temperature update the html --- .../calibration/retraction/retraction.html | 38 ++++-- .../calibration/retraction/retraction.jpg | Bin 0 -> 38303 bytes .../GUI/CalibrationRetractionDialog.cpp | 113 ++++++++++-------- .../GUI/CalibrationRetractionDialog.hpp | 3 +- src/slic3r/GUI/MainFrame.cpp | 4 +- 5 files changed, 97 insertions(+), 61 deletions(-) create mode 100644 resources/calibration/retraction/retraction.jpg diff --git a/resources/calibration/retraction/retraction.html b/resources/calibration/retraction/retraction.html index 7a745d4d9..4beeeab61 100644 --- a/resources/calibration/retraction/retraction.html +++ b/resources/calibration/retraction/retraction.html @@ -20,12 +20,36 @@ -

it's preferable to have done the flow and temperature calibration. -This calibration will help you to choose the right retraction legnth for your extrudr and the current filament.

-

This test will print some retraction test patches -

The goal is to choose the highest temperature possible that doesn't produce artifacts.

-

First, you have to analyse the tower. Each floor has the according temperature written on it.

+

How to

+

It's preferable to have done the flow and temperature calibration. +This calibration will help you to choose the right retraction length for your extruder and the current filament.

+

This test will print a test piece with an increasing retraction length for each millimetre printed in the z axis.

+

Step & Height

+

If you have a direct extruder, it's best to try with a 0.1mm increment and ~ 15 mm height, as it's not common to need more than a mm of retraction. +

If you have a Bowden extruder, it's best to try with a 0.5mm increment and ~ 15 mm height, as it's not uncommon to need more than 6mm of retraction. You can also use a 0.2 mm increment and a higher height. Be careful, as a high retraction length will greatly increase the risk of a nozzle clog if you have many of them. +

Start temp & Decrease temp step

+

By default, it uses the current temp for only one test. So you don't have to touch it unless you also want to optimise the temperature to prevent stringing.

+

In the temperature calibration, you got an interval of temperature where your print is "good enough".

+

Here, you want to start at the highest temperature acceptable. If you already set it into your filament temperature, you can keep "current" as the Start temp parameter. If you haven't set it yet, select the maximum temperature in the Start temp combo box field.

+

After that, choose an option in the "Temp decr" field that won't reduce the temperature too low. "3x10" means that it will print three tests, with the first one at the max temp and each other ones with 10C less temperature.

+

Remove filament slowdown

+This button will change your settings in filament/cooling to disable all features that trigger when a layer is too small to be able to cool down in time. With these algorithms disabled, your print will be more challenging in terms of retraction, so it's a good stress test. To re-enable them, remove all modifications from the filament tab (the little orange 'back arrow"). +

Results

+

When the test pieces are printed, you can count the millimetre with the ridges on the sides of the print towers. I count them with my nail. When you're at the height where there are no more strings, you can write down the millimetre number. Multiply it by your step parameter (0.2, 0.2, 0.5 or 1) and you have your retraction length number. You can add 20% more length to have a little margin.

+

If you have multiple prints with different temperatures, you need to choose the best print, the one with the least amount of stringing, unless the decrease in stringing isn't big enough to warrant the decrease in temperature. +

Example

+ + + + + + + +
In this print, the last little string happen at the height of ~10. As I've used a 0.5 step, it means that I need at least 5mm of retraction, but I'll set it to 6 to be sure to remove almost all stringing. +
+

Notes

-

The retraction speed should be set to the maximum value your extruder/drivers/firmware can reliably support.

+

The retraction speed should be set to the maximum value your extruder/drivers/firmware can reliably support, with a safety margin. 50mm/s for retraction and 20mm/s for unretraction is a good start for pla.

+

Licence for models used for this calibration test: CC BY-SA 3.0

- + \ No newline at end of file diff --git a/resources/calibration/retraction/retraction.jpg b/resources/calibration/retraction/retraction.jpg new file mode 100644 index 0000000000000000000000000000000000000000..93e70fc19c43835e26510d84126ac5760a6444ea GIT binary patch literal 38303 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 literal 0 HcmV?d00001 diff --git a/src/slic3r/GUI/CalibrationRetractionDialog.cpp b/src/slic3r/GUI/CalibrationRetractionDialog.cpp index 63e7bd3b8..6eae18472 100644 --- a/src/slic3r/GUI/CalibrationRetractionDialog.cpp +++ b/src/slic3r/GUI/CalibrationRetractionDialog.cpp @@ -27,17 +27,21 @@ void CalibrationRetractionDialog::create_buttons(wxStdDialogButtonSizer* buttons steps->SetToolTip(_(L("Each militer add this value to the retraction value. "))); steps->SetSelection(1); wxString choices_nb[] = { "2","4","6","8","10","15","20","25" }; - nb_steps = new wxComboBox(this, wxID_ANY, wxString{ "10" }, wxDefaultPosition, wxDefaultSize, 8, choices_nb); + nb_steps = new wxComboBox(this, wxID_ANY, wxString{ "15" }, wxDefaultPosition, wxDefaultSize, 8, choices_nb); nb_steps->SetToolTip(_(L("Select the number milimeters for the tower."))); - nb_steps->SetSelection(4); + nb_steps->SetSelection(5); //wxString choices_start[] = { "current","260","250","240","230","220","210" }; //start_step = new wxComboBox(this, wxID_ANY, wxString{ "current" }, wxDefaultPosition, wxDefaultSize, 7, choices_start); //start_step->SetToolTip(_(L("Select the highest temperature to test for."))); //start_step->SetSelection(0); - //wxString choices_decr[] = { "one test","2x10°","3x10°","4x10°","3x5°","5x5°" }; - //decr_temp = new wxComboBox(this, wxID_ANY, wxString{ "current" }, wxDefaultPosition, wxDefaultSize, 6, choices_decr); - //decr_temp->SetToolTip(_(L("Select the number tower to print, and by how many degrees C to decrease each time."))); - //decr_temp->SetSelection(0); + const DynamicPrintConfig* filament_config = this->gui_app->get_tab(Preset::TYPE_FILAMENT)->get_config(); + int temp = int((2 + filament_config->option("temperature")->get_at(0)) / 5) * 5; + auto size = wxSize(4 * em_unit(), wxDefaultCoord); + temp_start = new wxTextCtrl(this, wxID_ANY, std::to_string(temp), wxDefaultPosition, size); + wxString choices_decr[] = { "one test","2x10°","3x10°","4x10°","3x5°","5x5°" }; + decr_temp = new wxComboBox(this, wxID_ANY, wxString{ "current" }, wxDefaultPosition, wxDefaultSize, 6, choices_decr); + decr_temp->SetToolTip(_(L("Select the number tower to print, and by how many degrees C to decrease each time."))); + decr_temp->SetSelection(0); buttons->Add(new wxStaticText(this, wxID_ANY, wxString{ "step:" })); buttons->Add(steps); @@ -46,12 +50,12 @@ void CalibrationRetractionDialog::create_buttons(wxStdDialogButtonSizer* buttons buttons->Add(nb_steps); buttons->AddSpacer(20); - //buttons->Add(new wxStaticText(this, wxID_ANY, wxString{ "start temp:" })); - //buttons->Add(start_step); - //buttons->AddSpacer(15); - //buttons->Add(new wxStaticText(this, wxID_ANY, wxString{ "temp decr:" })); - //buttons->Add(decr_temp); - //buttons->AddSpacer(20); + buttons->Add(new wxStaticText(this, wxID_ANY, wxString{ "start temp:" })); + buttons->Add(temp_start); + buttons->AddSpacer(15); + buttons->Add(new wxStaticText(this, wxID_ANY, wxString{ "temp decr:" })); + buttons->Add(decr_temp); + buttons->AddSpacer(20); wxButton* bt = new wxButton(this, wxID_FILE1, _(L("Remove fil. slowdown"))); bt->Bind(wxEVT_BUTTON, &CalibrationRetractionDialog::remove_slowdown, this); @@ -95,18 +99,20 @@ void CalibrationRetractionDialog::create_geometry(wxCommandEvent& event_args) { size_t nb_retract = nb_steps->GetSelection() < 4 ? ((int(nb_steps->GetSelection()) + 1) * 2) : ((int(nb_steps->GetSelection()) - 2) * 5); size_t nb_items = 1; - //if (start_step->GetSelection() == 1) { - // nb_items = 2; - //} else if (start_step->GetSelection() == 2 || start_step->GetSelection() == 4) { - // nb_items = 3; - //} else if (start_step->GetSelection() == 3) { - // nb_items = 4; - //} else if (start_step->GetSelection() == 5) { - // nb_items = 5; - //} - + if (decr_temp->GetSelection() == 1) { + nb_items = 2; + } else if (decr_temp->GetSelection() == 2 || decr_temp->GetSelection() == 4) { + nb_items = 3; + } else if (decr_temp->GetSelection() == 3) { + nb_items = 4; + } else if (decr_temp->GetSelection() == 5) { + nb_items = 5; + } + int temp_decr = (decr_temp->GetSelection() < 4) ? 10 : 5; + std::vector items; + for (size_t i = 0; i < nb_items; i++) items.emplace_back(Slic3r::resources_dir() + "/calibration/retraction/retraction_calibration.amf"); std::vector objs_idx = plat->load_files(items, true, false, false); @@ -115,9 +121,12 @@ void CalibrationRetractionDialog::create_geometry(wxCommandEvent& event_args) { const DynamicPrintConfig* print_config = this->gui_app->get_tab(Preset::TYPE_PRINT)->get_config(); const DynamicPrintConfig* printer_config = this->gui_app->get_tab(Preset::TYPE_PRINTER)->get_config(); const DynamicPrintConfig* filament_config = this->gui_app->get_tab(Preset::TYPE_FILAMENT)->get_config(); - + double retraction_start = 0; - int temp = filament_config->option("temperature")->get_at(0); + std::string str = temp_start->GetValue().ToStdString(); + int temp = int((2 + filament_config->option("temperature")->get_at(0)) / 5) * 5; + if (str.find_first_not_of("0123456789") == std::string::npos) + temp = std::atoi(str.c_str()); double retraction_steps = 0.01; if (steps->GetSelection() == 0) @@ -154,12 +163,18 @@ void CalibrationRetractionDialog::create_geometry(wxCommandEvent& event_args) { //add sub-part after scale float zshift = (1 - scale) / 2 + 0.4 * scale; float zscale_number = (first_layer_height + layer_height) / 0.4; - std::vector part_tower; - //add_part(model.objects[objs_idx[0]], Slic3r::resources_dir()+"/calibration/filament_temp/t215.amf", Vec3d{ 0,0,zshift-5.2*scale }, Vec3d{ scale,scale,scale }); - //model.objects[objs_idx[0]]->volumes[1]->rotate(PI/2, Vec3d(0, 0, 1)); - //model.objects[objs_idx[0]]->volumes[1]->rotate(-PI / 2, Vec3d(1, 0, 0)); - for (size_t num_retract = 0; num_retract < nb_retract; num_retract++) { - part_tower.push_back(add_part(model.objects[objs_idx[0]], Slic3r::resources_dir()+"/calibration/retraction/retraction_calibration_pillar.amf", Vec3d{ 0,0,zshift + scale * num_retract }, Vec3d{ scale,scale,scale })); + std::vector < std::vector> part_tower; + for (size_t id_item = 0; id_item < nb_items; id_item++) { + part_tower.emplace_back(); + int mytemp = temp - temp_decr * id_item; + if (mytemp > 285) mytemp = 285; + if (mytemp < 180) mytemp = 180; + add_part(model.objects[objs_idx[id_item]], Slic3r::resources_dir() + "/calibration/filament_temp/t"+ std::to_string(mytemp) + ".amf", Vec3d{ 0,0,zshift - 5.2 * scale }, Vec3d{ scale,scale,scale }); + model.objects[objs_idx[id_item]]->volumes[1]->rotate(PI / 2, Vec3d(0, 0, 1)); + model.objects[objs_idx[id_item]]->volumes[1]->rotate(-PI / 2, Vec3d(1, 0, 0)); + for (int num_retract = 0; num_retract < nb_retract; num_retract++) { + part_tower.back().push_back(add_part(model.objects[objs_idx[id_item]], Slic3r::resources_dir() + "/calibration/retraction/retraction_calibration_pillar.amf", Vec3d{ 0,0,zshift + scale * num_retract }, Vec3d{ scale,scale,scale })); + } } /// --- translate ---; @@ -168,8 +183,14 @@ void CalibrationRetractionDialog::create_geometry(wxCommandEvent& event_args) { const float brim_width = std::max(print_config->option("brim_width")->value, nozzle_diameter * 5.); Vec2d bed_size = BoundingBoxf(bed_shape->values).size(); Vec2d bed_min = BoundingBoxf(bed_shape->values).min; - float offsety = 2 + 22 * 1 + extruder_clearance_radius->value + brim_width + (brim_width > extruder_clearance_radius->value ? brim_width - extruder_clearance_radius->value : 0); - model.objects[objs_idx[0]]->translate({ bed_min.x() + bed_size.x() / 2, bed_min.y() + bed_size.y() / 2, 0 }); + float offset = 4 + 26 * 1 + extruder_clearance_radius->value + brim_width + (brim_width > extruder_clearance_radius->value ? brim_width - extruder_clearance_radius->value : 0); + if (nb_items == 1) { + model.objects[objs_idx[0]]->translate({ bed_min.x() + bed_size.x() / 2, bed_min.y() + bed_size.y() / 2, 0 }); + } else { + for (size_t i = 0; i < nb_items; i++) { + model.objects[objs_idx[i]]->translate({ bed_min.x() + bed_size.x() / 2 + (i%2 ==0 ? -offset/2: offset/2), bed_min.y() + bed_size.y() / 2 + ( (i/2) % 2 == 0 ? -1 : 1) * offset * (((i / 2) + 1) / 2), 0 }); + } + } @@ -178,18 +199,6 @@ void CalibrationRetractionDialog::create_geometry(wxCommandEvent& event_args) { //speed double perimeter_speed = print_config->option("perimeter_speed")->value; double external_perimeter_speed = print_config->option("external_perimeter_speed")->get_abs_value(perimeter_speed); - //filament test - //const ConfigOptionInts* fil_conf = filament_config->option("slowdown_below_layer_time"); - //ConfigOptionInts* new_fil_conf = new ConfigOptionInts(); - //new_fil_conf->default_value = 5; - //new_fil_conf->values = fil_conf->values; - //new_fil_conf->values[0] = 0; - //model.objects[objs_idx[i]]->config.set_key_value("slowdown_below_layer_time", new_fil_conf); - //fil_conf = filament_config->option("temperature"); - //new_fil_conf = new ConfigOptionInts(); - //new_fil_conf->values = fil_conf->values; - //new_fil_conf->values[0] = 150; - //model.objects[objs_idx[i]]->config.set_key_value("temperature", new_fil_conf); //brim to have some time to build up pressure in the nozzle model.objects[objs_idx[i]]->config.set_key_value("brim_width", new ConfigOptionFloat(0)); model.objects[objs_idx[i]]->config.set_key_value("perimeters", new ConfigOptionInt(2)); @@ -207,14 +216,16 @@ void CalibrationRetractionDialog::create_geometry(wxCommandEvent& event_args) { model.objects[objs_idx[i]]->config.set_key_value("gap_fill", new ConfigOptionBool(false)); model.objects[objs_idx[i]]->config.set_key_value("first_layer_height", new ConfigOptionFloatOrPercent(nozzle_diameter / 2., false)); model.objects[objs_idx[i]]->config.set_key_value("layer_height", new ConfigOptionFloat(nozzle_diameter / 2.)); + //temp + model.objects[objs_idx[i]]->config.set_key_value("print_temperature", new ConfigOptionInt(int(temp - temp_decr * i))); //set retraction override - int num_part = 0; - for (ModelObject* part : part_tower) { - model.objects[objs_idx[i]]->volumes[num_part + 1]->config.set_key_value("print_retract_length", new ConfigOptionFloat(retraction_start + num_part * retraction_steps)); - model.objects[objs_idx[i]]->volumes[num_part + 1]->config.set_key_value("small_perimeter_speed", new ConfigOptionFloatOrPercent(external_perimeter_speed, false)); - model.objects[objs_idx[i]]->volumes[num_part + 1]->config.set_key_value("perimeter_speed", new ConfigOptionFloat(std::min(external_perimeter_speed, perimeter_speed))); - model.objects[objs_idx[i]]->volumes[num_part + 1]->config.set_key_value("external_perimeter_speed", new ConfigOptionFloatOrPercent(external_perimeter_speed, false)); - model.objects[objs_idx[i]]->volumes[num_part + 1]->config.set_key_value("small_perimeter_speed", new ConfigOptionFloatOrPercent(external_perimeter_speed, false)); + size_t num_part = 0; + for (ModelObject* part : part_tower[i]) { + model.objects[objs_idx[i]]->volumes[num_part + 2]->config.set_key_value("print_retract_length", new ConfigOptionFloat(retraction_start + num_part * retraction_steps)); + model.objects[objs_idx[i]]->volumes[num_part + 2]->config.set_key_value("small_perimeter_speed", new ConfigOptionFloatOrPercent(external_perimeter_speed, false)); + model.objects[objs_idx[i]]->volumes[num_part + 2]->config.set_key_value("perimeter_speed", new ConfigOptionFloat(std::min(external_perimeter_speed, perimeter_speed))); + model.objects[objs_idx[i]]->volumes[num_part + 2]->config.set_key_value("external_perimeter_speed", new ConfigOptionFloatOrPercent(external_perimeter_speed, false)); + model.objects[objs_idx[i]]->volumes[num_part + 2]->config.set_key_value("small_perimeter_speed", new ConfigOptionFloatOrPercent(external_perimeter_speed, false)); //model.objects[objs_idx[i]]->volumes[num_part + 1]->config.set_key_value("infill_speed", new ConfigOptionFloat(std::min(print_config->option("infill_speed")->value, 10.*scale))); num_part++; } diff --git a/src/slic3r/GUI/CalibrationRetractionDialog.hpp b/src/slic3r/GUI/CalibrationRetractionDialog.hpp index 1146ec7b7..1e481eb89 100644 --- a/src/slic3r/GUI/CalibrationRetractionDialog.hpp +++ b/src/slic3r/GUI/CalibrationRetractionDialog.hpp @@ -20,7 +20,8 @@ protected: wxComboBox* steps; wxComboBox* nb_steps; - wxComboBox* start_step; + //wxComboBox* start_step; + wxTextCtrl* temp_start; wxComboBox* decr_temp; }; diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 1d8349712..ac9da7552 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -775,13 +775,13 @@ void MainFrame::init_menubar() [this](wxCommandEvent&) { wxGetApp().flow_ratio_dialog(); }); append_menu_item(calibrationMenu, wxID_ANY, _(L("Filament temperature calibration")), _(L("Create a test print to help you to set your filament temperature.")), [this](wxCommandEvent&) { wxGetApp().filament_temperature_dialog(); }); + append_menu_item(calibrationMenu, wxID_ANY, _(L("Extruder retraction calibration")), _(L("Create a test print to help you to set your retraction length.")), + [this](wxCommandEvent&) { wxGetApp().calibration_retraction_dialog(); }); calibrationMenu->AppendSeparator(); append_menu_item(calibrationMenu, wxID_ANY, _(L("Bridge flow calibration")), _(L("Create a test print to help you to set your bridge flow ratio.")), [this](wxCommandEvent&) { wxGetApp().bridge_tuning_dialog(); }); append_menu_item(calibrationMenu, wxID_ANY, _(L("Ironing pattern calibration")), _(L("Create a test print to help you to set your over-bridge flow ratio and ironing pattern.")), [this](wxCommandEvent&) { wxGetApp().over_bridge_dialog(); }); - append_menu_item(calibrationMenu, wxID_ANY, _(L("Extruder retraction calibration")), _(L("Create a test print to help you to set your retraction length.")), - [this](wxCommandEvent&) { wxGetApp().calibration_retraction_dialog(); }); calibrationMenu->AppendSeparator(); append_menu_item(calibrationMenu, wxID_ANY, _(L("Calibration cube")), _(L("Print a calibration cube, for various calibration goals.")), [this](wxCommandEvent&) { wxGetApp().calibration_cube_dialog(); });