From dd2e3241f8aadb54eab53a592b2b3996868a16f7 Mon Sep 17 00:00:00 2001 From: supermerill Date: Mon, 3 Aug 2020 23:48:59 +0200 Subject: [PATCH] new retraction calibration had to add an override from region to ~gcode writer (and gcode), maybe I have to think about a better system that the current system that will began to transform into a spaghetti monster --- .../calibration/retraction/retraction.html | 31 +++ .../retraction/retraction_calibration.amf | Bin 0 -> 6380 bytes .../retraction_calibration_pillar.amf | Bin 0 -> 16657 bytes src/libslic3r/GCode.cpp | 17 +- src/libslic3r/GCodeWriter.cpp | 13 + src/libslic3r/GCodeWriter.hpp | 3 + src/libslic3r/PrintConfig.cpp | 10 + src/libslic3r/PrintConfig.hpp | 2 + src/libslic3r/SVG.cpp | 22 +- src/libslic3r/SVG.hpp | 6 +- src/slic3r/CMakeLists.txt | 2 + .../GUI/CalibrationOverBridgeDialog.cpp | 6 +- .../GUI/CalibrationRetractionDialog.cpp | 248 ++++++++++++++++++ .../GUI/CalibrationRetractionDialog.hpp | 30 +++ src/slic3r/GUI/CalibrationTempDialog.cpp | 18 +- src/slic3r/GUI/GUI_App.cpp | 5 + src/slic3r/GUI/GUI_App.hpp | 1 + src/slic3r/GUI/MainFrame.cpp | 2 + src/slic3r/GUI/Preset.cpp | 1 + 19 files changed, 393 insertions(+), 24 deletions(-) create mode 100644 resources/calibration/retraction/retraction.html create mode 100644 resources/calibration/retraction/retraction_calibration.amf create mode 100644 resources/calibration/retraction/retraction_calibration_pillar.amf create mode 100644 src/slic3r/GUI/CalibrationRetractionDialog.cpp create mode 100644 src/slic3r/GUI/CalibrationRetractionDialog.hpp diff --git a/resources/calibration/retraction/retraction.html b/resources/calibration/retraction/retraction.html new file mode 100644 index 000000000..7a745d4d9 --- /dev/null +++ b/resources/calibration/retraction/retraction.html @@ -0,0 +1,31 @@ + + + + + Retraction Calibration + + + + + + + + + +
+

Retraction Calibration

+
+ +
needs:FlowTemp
+
+
+ +

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.

+

Notes

+

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

+ + diff --git a/resources/calibration/retraction/retraction_calibration.amf b/resources/calibration/retraction/retraction_calibration.amf new file mode 100644 index 0000000000000000000000000000000000000000..f465c9a1c35fc94af1f2db4cb1cc03347bffd47f GIT binary patch literal 6380 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 BRtW$A literal 0 HcmV?d00001 diff --git a/resources/calibration/retraction/retraction_calibration_pillar.amf b/resources/calibration/retraction/retraction_calibration_pillar.amf new file mode 100644 index 0000000000000000000000000000000000000000..9ae58aa061d7e69bbe2d12cbbd6c7faae2e52f0c GIT binary patch literal 16657 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 literal 0 HcmV?d00001 diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 18496ce51..e0af20a63 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -234,9 +234,12 @@ std::string Wipe::wipe(GCode &gcodegen, bool toolchange) double wipe_speed = gcodegen.writer().config.travel_speed.value * 0.8; // get the retraction length - double length = toolchange - ? gcodegen.writer().tool()->retract_length_toolchange() - : gcodegen.writer().tool()->retract_length(); + double length = gcodegen.writer().tool()->retract_length(); + if (toolchange) { + length = gcodegen.writer().tool()->retract_length_toolchange(); + } else if (gcodegen.writer().config_region && gcodegen.writer().config_region->print_retract_length.value >= 0) { + length = gcodegen.writer().config_region->print_retract_length.value; + } // Shorten the retraction length by the amount already retracted before wipe. length *= (1. - gcodegen.writer().tool()->retract_before_wipe()); @@ -2501,7 +2504,7 @@ void GCode::process_layer( m_layer = layers[instance_to_print.layer_id].layer(); } for (ObjectByExtruder::Island &island : instance_to_print.object_by_extruder.islands) { - const auto& by_region_specific = + const std::vector& by_region_specific = is_anything_overridden ? island.by_region_per_copy(by_region_per_copy_cache, static_cast(instance_to_print.instance_id), @@ -3732,8 +3735,9 @@ std::string GCode::extrude_perimeters(const Print &print, const std::vectorconfig()); + m_writer.apply_print_region_config(print.regions()[®ion - &by_region.front()]->config()); for (const ExtrusionEntity *ee : region.perimeters) gcode += this->extrude_entity(*ee, "", -1., &lower_layer_edge_grid); } @@ -3745,8 +3749,9 @@ std::string GCode::extrude_infill(const Print &print, const std::vectorconfig().infill_first == is_infill_first) { + if (!region.infills.empty() && print.regions()[®ion - &by_region.front()]->config().infill_first == is_infill_first) { m_config.apply(print.regions()[®ion - &by_region.front()]->config()); + m_writer.apply_print_region_config(print.regions()[®ion - &by_region.front()]->config()); ExtrusionEntitiesPtr extrusions { region.infills }; chain_and_reorder_extrusion_entities(extrusions, &m_last_pos); for (const ExtrusionEntity *fill : extrusions) { diff --git a/src/libslic3r/GCodeWriter.cpp b/src/libslic3r/GCodeWriter.cpp index 1ac899f77..a9bdefdf0 100644 --- a/src/libslic3r/GCodeWriter.cpp +++ b/src/libslic3r/GCodeWriter.cpp @@ -26,6 +26,11 @@ void GCodeWriter::apply_print_config(const PrintConfig &print_config) print_config.machine_max_acceleration_extruding.values.front() : 0); } +void GCodeWriter::apply_print_region_config(const PrintRegionConfig& print_region_config) +{ + config_region = &print_region_config; +} + void GCodeWriter::set_extruders(std::vector extruder_ids) { std::sort(extruder_ids.begin(), extruder_ids.end()); @@ -474,6 +479,14 @@ std::string GCodeWriter::retract(bool before_wipe) { double factor = before_wipe ? m_tool->retract_before_wipe() : 1.; assert(factor >= 0. && factor <= 1. + EPSILON); + //check for override + if (config_region && config_region->print_retract_length >= 0) { + return this->_retract( + factor * config_region->print_retract_length, + factor * m_tool->retract_restart_extra(), + "retract" + ); + } return this->_retract( factor * m_tool->retract_length(), factor * m_tool->retract_restart_extra(), diff --git a/src/libslic3r/GCodeWriter.hpp b/src/libslic3r/GCodeWriter.hpp index 954fe4570..976b5e010 100644 --- a/src/libslic3r/GCodeWriter.hpp +++ b/src/libslic3r/GCodeWriter.hpp @@ -15,6 +15,8 @@ public: static std::string PausePrintCode; GCodeConfig config; bool multiple_extruders; + // override from region + const PrintRegionConfig* config_region = nullptr; GCodeWriter() : multiple_extruders(false), m_extrusion_axis("E"), m_tool(nullptr), @@ -28,6 +30,7 @@ public: std::string extrusion_axis() const { return m_extrusion_axis; } void apply_print_config(const PrintConfig &print_config); + void apply_print_region_config(const PrintRegionConfig& print_region_config); // Extruders are expected to be sorted in an increasing order. void set_extruders(std::vector extruder_ids); const std::vector& extruders() const { return m_extruders; } diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index d50985bb7..3f605079a 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -2463,6 +2463,7 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("Retraction is not triggered when travel moves are shorter than this length."); def->sidetext = L("mm"); def->mode = comAdvanced; + def->min = 0; def->set_default_value(new ConfigOptionFloats { 2. }); def = this->add("retract_before_wipe", coPercents); @@ -2488,8 +2489,16 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("When retraction is triggered, filament is pulled back by the specified amount " "(the length is measured on raw filament, before it enters the extruder)."); def->sidetext = L("mm (zero to disable)"); + def->min = 0; def->set_default_value(new ConfigOptionFloats { 2. }); + def = this->add("print_retract_length", coFloat); + def->label = L("Retraction length"); + def->category = OptionCategory::width; + def->tooltip = L("Override the retract_length settign from the printer config. Used for calibration. Set negative to disable"); + def->mode = comExpert; + def->set_default_value(new ConfigOptionFloat( -1.f)); + def = this->add("retract_length_toolchange", coFloats); def->label = L("Length"); def->full_label = L("Retraction Length (Toolchange)"); @@ -2498,6 +2507,7 @@ void PrintConfigDef::init_fff_params() "the extruder)."); def->sidetext = L("mm (zero to disable)"); def->mode = comExpert; + def->min = 0; def->set_default_value(new ConfigOptionFloats { 10. }); def = this->add("retract_lift", coFloats); diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 698b3d3d0..ebf341e35 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -681,6 +681,7 @@ public: // Total number of perimeters. ConfigOptionInt perimeters; ConfigOptionPercent print_extrusion_multiplier; + ConfigOptionFloat print_retract_length; ConfigOptionFloatOrPercent small_perimeter_speed; ConfigOptionEnum solid_fill_pattern; ConfigOptionFloat solid_infill_below_area; @@ -768,6 +769,7 @@ protected: OPT_PTR(perimeter_speed); OPT_PTR(perimeters); OPT_PTR(print_extrusion_multiplier); + OPT_PTR(print_retract_length); OPT_PTR(small_perimeter_speed); OPT_PTR(solid_fill_pattern); OPT_PTR(solid_infill_below_area); diff --git a/src/libslic3r/SVG.cpp b/src/libslic3r/SVG.cpp index 6e4b973ea..1bebfe797 100644 --- a/src/libslic3r/SVG.cpp +++ b/src/libslic3r/SVG.cpp @@ -154,16 +154,30 @@ SVG::draw_outline(const Surfaces &surfaces, std::string stroke_outer, std::strin } void -SVG::draw(const SurfacesPtr &surfaces, std::string fill, const float fill_opacity) +SVG::draw(const SurfacesPtr& surfaces, std::string fill, const float fill_opacity) { for (SurfacesPtr::const_iterator it = surfaces.begin(); it != surfaces.end(); ++it) this->draw(*(*it), fill, fill_opacity); } -void -SVG::draw_outline(const SurfacesPtr &surfaces, std::string stroke_outer, std::string stroke_holes, coordf_t stroke_width) +void +SVG::draw_outline(const SurfacesPtr& surfaces, std::string stroke_outer, std::string stroke_holes, coordf_t stroke_width) { - for (SurfacesPtr::const_iterator it = surfaces.begin(); it != surfaces.end(); ++ it) + for (SurfacesPtr::const_iterator it = surfaces.begin(); it != surfaces.end(); ++it) + draw_outline(*(*it), stroke_outer, stroke_holes, stroke_width); +} + +void +SVG::draw(const SurfacesConstPtr& surfaces, std::string fill, const float fill_opacity) +{ + for (SurfacesConstPtr::const_iterator it = surfaces.begin(); it != surfaces.end(); ++it) + this->draw(*(*it), fill, fill_opacity); +} + +void +SVG::draw_outline(const SurfacesConstPtr& surfaces, std::string stroke_outer, std::string stroke_holes, coordf_t stroke_width) +{ + for (SurfacesConstPtr::const_iterator it = surfaces.begin(); it != surfaces.end(); ++it) draw_outline(*(*it), stroke_outer, stroke_holes, stroke_width); } diff --git a/src/libslic3r/SVG.hpp b/src/libslic3r/SVG.hpp index c1b387554..780f2e0ea 100644 --- a/src/libslic3r/SVG.hpp +++ b/src/libslic3r/SVG.hpp @@ -53,8 +53,10 @@ public: void draw_outline(const Surface &surface, std::string stroke_outer = "black", std::string stroke_holes = "blue", coordf_t stroke_width = 0); void draw(const Surfaces &surfaces, std::string fill = "grey", const float fill_opacity=1.f); void draw_outline(const Surfaces &surfaces, std::string stroke_outer = "black", std::string stroke_holes = "blue", coordf_t stroke_width = 0); - void draw(const SurfacesPtr &surfaces, std::string fill = "grey", const float fill_opacity=1.f); - void draw_outline(const SurfacesPtr &surfaces, std::string stroke_outer = "black", std::string stroke_holes = "blue", coordf_t stroke_width = 0); + void draw(const SurfacesPtr& surfaces, std::string fill = "grey", const float fill_opacity = 1.f); + void draw_outline(const SurfacesPtr& surfaces, std::string stroke_outer = "black", std::string stroke_holes = "blue", coordf_t stroke_width = 0); + void draw(const SurfacesConstPtr& surfaces, std::string fill = "grey", const float fill_opacity = 1.f); + void draw_outline(const SurfacesConstPtr& surfaces, std::string stroke_outer = "black", std::string stroke_holes = "blue", coordf_t stroke_width = 0); void draw(const Polygon &polygon, std::string fill = "grey"); void draw_outline(const Polygon &polygon, std::string stroke = "black", coordf_t stroke_width = 0); diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index 82dfc3a17..bd9136981 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -32,6 +32,8 @@ set(SLIC3R_GUI_SOURCES GUI/CalibrationOverBridgeDialog.hpp GUI/CalibrationTempDialog.cpp GUI/CalibrationTempDialog.hpp + GUI/CalibrationRetractionDialog.cpp + GUI/CalibrationRetractionDialog.hpp GUI/ConfigSnapshotDialog.cpp GUI/ConfigSnapshotDialog.hpp GUI/3DScene.cpp diff --git a/src/slic3r/GUI/CalibrationOverBridgeDialog.cpp b/src/slic3r/GUI/CalibrationOverBridgeDialog.cpp index 1e58a7f4b..7418ed7b2 100644 --- a/src/slic3r/GUI/CalibrationOverBridgeDialog.cpp +++ b/src/slic3r/GUI/CalibrationOverBridgeDialog.cpp @@ -41,11 +41,11 @@ void CalibrationOverBridgeDialog::create_geometry(wxCommandEvent& event_args) { assert(objs_idx.size() == 6); const DynamicPrintConfig* print_config = this->gui_app->get_tab(Preset::TYPE_PRINT)->get_config(); - const DynamicPrintConfig* printerConfig = this->gui_app->get_tab(Preset::TYPE_PRINTER)->get_config(); + const DynamicPrintConfig* printer_config = this->gui_app->get_tab(Preset::TYPE_PRINTER)->get_config(); /// --- scale --- // model is created for a 0.4 nozzle, scale xy with nozzle size. - const ConfigOptionFloats* nozzle_diameter_config = printerConfig->option("nozzle_diameter"); + const ConfigOptionFloats* nozzle_diameter_config = printer_config->option("nozzle_diameter"); assert(nozzle_diameter_config->values.size() > 0); float nozzle_diameter = nozzle_diameter_config->values[0]; float xyz_scale = (0.2 + nozzle_diameter) / 0.6; @@ -68,7 +68,7 @@ void CalibrationOverBridgeDialog::create_geometry(wxCommandEvent& event_args) { /// --- translate ---; const ConfigOptionFloat* extruder_clearance_radius = print_config->option("extruder_clearance_radius"); - const ConfigOptionPoints* bed_shape = printerConfig->option("bed_shape"); + const ConfigOptionPoints* bed_shape = printer_config->option("bed_shape"); const float brim_width = print_config->option("brim_width")->getFloat(); Vec2d bed_size = BoundingBoxf(bed_shape->values).size(); Vec2d bed_min = BoundingBoxf(bed_shape->values).min; diff --git a/src/slic3r/GUI/CalibrationRetractionDialog.cpp b/src/slic3r/GUI/CalibrationRetractionDialog.cpp new file mode 100644 index 000000000..63e7bd3b8 --- /dev/null +++ b/src/slic3r/GUI/CalibrationRetractionDialog.cpp @@ -0,0 +1,248 @@ +#include "CalibrationRetractionDialog.hpp" +#include "I18N.hpp" +#include "libslic3r/Utils.hpp" +#include "GUI.hpp" +#include "GUI_ObjectList.hpp" +#include "Tab.hpp" +#include +#include +#include +#include "wxExtensions.hpp" + +#if ENABLE_SCROLLABLE +static wxSize get_screen_size(wxWindow* window) +{ + const auto idx = wxDisplay::GetFromWindow(window); + wxDisplay display(idx != wxNOT_FOUND ? idx : 0u); + return display.GetClientArea().GetSize(); +} +#endif // ENABLE_SCROLLABLE + +namespace Slic3r { +namespace GUI { + +void CalibrationRetractionDialog::create_buttons(wxStdDialogButtonSizer* buttons){ + wxString choices_steps[] = { "0.1","0.2","0.5","1" }; + steps = new wxComboBox(this, wxID_ANY, wxString{ "0.2" }, wxDefaultPosition, wxDefaultSize, 4, choices_steps); + 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->SetToolTip(_(L("Select the number milimeters for the tower."))); + nb_steps->SetSelection(4); + //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); + + buttons->Add(new wxStaticText(this, wxID_ANY, wxString{ "step:" })); + buttons->Add(steps); + buttons->AddSpacer(15); + buttons->Add(new wxStaticText(this, wxID_ANY, wxString{ "height:" })); + 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); + + wxButton* bt = new wxButton(this, wxID_FILE1, _(L("Remove fil. slowdown"))); + bt->Bind(wxEVT_BUTTON, &CalibrationRetractionDialog::remove_slowdown, this); + buttons->Add(bt); + + buttons->AddSpacer(30); + + bt = new wxButton(this, wxID_FILE1, _(L("Generate"))); + bt->Bind(wxEVT_BUTTON, &CalibrationRetractionDialog::create_geometry, this); + buttons->Add(bt); +} + +void CalibrationRetractionDialog::remove_slowdown(wxCommandEvent& event_args) { + + const DynamicPrintConfig* filament_config = this->gui_app->get_tab(Preset::TYPE_FILAMENT)->get_config(); + DynamicPrintConfig new_filament_config = *filament_config; //make a copy + + 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; + new_filament_config.set_key_value("slowdown_below_layer_time", new_fil_conf); + + fil_conf = filament_config->option("fan_below_layer_time"); new_fil_conf = new ConfigOptionInts(); + new_fil_conf->default_value = 60; + new_fil_conf->values = fil_conf->values; + new_fil_conf->values[0] = 0; + new_filament_config.set_key_value("fan_below_layer_time", new_fil_conf); + + this->gui_app->get_tab(Preset::TYPE_FILAMENT)->load_config(new_filament_config); + this->main_frame->plater()->on_config_change(new_filament_config); + this->gui_app->get_tab(Preset::TYPE_FILAMENT)->update_dirty(); + +} + +void CalibrationRetractionDialog::create_geometry(wxCommandEvent& event_args) { + Plater* plat = this->main_frame->plater(); + Model& model = plat->model(); + plat->reset(); + + 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; + //} + + + std::vector items; + items.emplace_back(Slic3r::resources_dir() + "/calibration/retraction/retraction_calibration.amf"); + std::vector objs_idx = plat->load_files(items, true, false, false); + + + assert(objs_idx.size() == nb_items); + 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); + + double retraction_steps = 0.01; + if (steps->GetSelection() == 0) + retraction_steps = 0.1; + if (steps->GetSelection() == 1) + retraction_steps = 0.2; + if (steps->GetSelection() == 2) + retraction_steps = 0.5; + if (steps->GetSelection() == 3) + retraction_steps = 1; + if (steps->GetSelection() == 4) + retraction_steps = 2; + + /// --- scale --- + // model is created for a 0.4 nozzle, scale xy with nozzle size. + const ConfigOptionFloats* nozzle_diameter_config = printer_config->option("nozzle_diameter"); + assert(nozzle_diameter_config->values.size() > 0); + float nozzle_diameter = nozzle_diameter_config->values[0]; + float xyScale = nozzle_diameter / 0.4; + //scale z to have 6 layers + const ConfigOptionFloatOrPercent* first_layer_height_setting = print_config->option("first_layer_height"); + double first_layer_height = first_layer_height_setting->get_abs_value(nozzle_diameter); + first_layer_height = nozzle_diameter / 2; //TODO remove and use the user's first_layer_height + double layer_height = nozzle_diameter / 2.; + first_layer_height = std::max(first_layer_height, nozzle_diameter / 2.); + + float scale = nozzle_diameter / 0.4; + //do scaling + if (scale < 0.9 || 1.2 < scale) { + for (size_t i = 0; i < nb_items; i++) + model.objects[objs_idx[i]]->scale(scale, scale, scale); + } + + //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 })); + } + + /// --- translate ---; + const ConfigOptionFloat* extruder_clearance_radius = print_config->option("extruder_clearance_radius"); + const ConfigOptionPoints* bed_shape = printer_config->option("bed_shape"); + 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 }); + + + + /// --- custom config --- + for (size_t i = 0; i < nb_items; i++) { + //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)); + model.objects[objs_idx[i]]->config.set_key_value("external_perimeters_first", new ConfigOptionBool(false)); + model.objects[objs_idx[i]]->config.set_key_value("bottom_solid_layers", new ConfigOptionInt(0)); + model.objects[objs_idx[i]]->volumes[0]->config.set_key_value("bottom_solid_layers", new ConfigOptionInt(2)); + //model.objects[objs_idx[i]]->volumes[1]->config.set_key_value("bottom_solid_layers", new ConfigOptionInt(2)); + model.objects[objs_idx[i]]->config.set_key_value("top_solid_layers", new ConfigOptionInt(0)); + model.objects[objs_idx[i]]->config.set_key_value("fill_density", new ConfigOptionPercent(0)); + //model.objects[objs_idx[i]]->config.set_key_value("fill_pattern", new ConfigOptionEnum(ipRectilinear)); + model.objects[objs_idx[i]]->config.set_key_value("only_one_perimeter_top", new ConfigOptionBool(false)); + model.objects[objs_idx[i]]->config.set_key_value("overhangs", new ConfigOptionBool(false)); + model.objects[objs_idx[i]]->config.set_key_value("thin_walls", new ConfigOptionBool(true)); + model.objects[objs_idx[i]]->config.set_key_value("thin_walls_min_width", new ConfigOptionFloatOrPercent(2,true)); + 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.)); + //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)); + //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++; + } + } + + /// --- main config, please modify object config when possible --- + if (nb_items > 1) { + DynamicPrintConfig new_print_config = *print_config; //make a copy + new_print_config.set_key_value("complete_objects", new ConfigOptionBool(true)); + //if skirt, use only one + if (print_config->option("skirts")->getInt() > 0 && print_config->option("skirt_height")->getInt() > 0) { + new_print_config.set_key_value("complete_objects_one_skirt", new ConfigOptionBool(true)); + } + this->gui_app->get_tab(Preset::TYPE_PRINT)->load_config(new_print_config); + plat->on_config_change(new_print_config); + this->gui_app->get_tab(Preset::TYPE_PRINT)->update_dirty(); + } + + //update plater + plat->changed_objects(objs_idx); + //update everything, easier to code. + ObjectList* obj = this->gui_app->obj_list(); + obj->update_after_undo_redo(); + + + plat->reslice(); + plat->select_view_3D("Preview"); +} + +} // namespace GUI +} // namespace Slic3r diff --git a/src/slic3r/GUI/CalibrationRetractionDialog.hpp b/src/slic3r/GUI/CalibrationRetractionDialog.hpp new file mode 100644 index 000000000..1146ec7b7 --- /dev/null +++ b/src/slic3r/GUI/CalibrationRetractionDialog.hpp @@ -0,0 +1,30 @@ +#ifndef slic3r_GUI_CalibrationRetractionDialog_hpp_ +#define slic3r_GUI_CalibrationRetractionDialog_hpp_ + +#include "CalibrationAbstractDialog.hpp" + +namespace Slic3r { +namespace GUI { + +class CalibrationRetractionDialog : public CalibrationAbstractDialog +{ + +public: + CalibrationRetractionDialog(GUI_App* app, MainFrame* mainframe) : CalibrationAbstractDialog(app, mainframe, "Flow calibration") { create("/calibration/retraction/retraction.html", wxSize(900, 500)); } + virtual ~CalibrationRetractionDialog() {} + +protected: + void create_buttons(wxStdDialogButtonSizer* sizer) override; + void remove_slowdown(wxCommandEvent& event_args); + void create_geometry(wxCommandEvent& event_args); + + wxComboBox* steps; + wxComboBox* nb_steps; + wxComboBox* start_step; + wxComboBox* decr_temp; +}; + +} // namespace GUI +} // namespace Slic3r + +#endif diff --git a/src/slic3r/GUI/CalibrationTempDialog.cpp b/src/slic3r/GUI/CalibrationTempDialog.cpp index 7d72f0da9..b4874a01d 100644 --- a/src/slic3r/GUI/CalibrationTempDialog.cpp +++ b/src/slic3r/GUI/CalibrationTempDialog.cpp @@ -57,12 +57,12 @@ void CalibrationTempDialog::create_geometry(wxCommandEvent& event_args) { Slic3r::resources_dir()+"/calibration/filament_temp/Smart_compact_temperature_calibration_item.amf"}, true, false, false); assert(objs_idx.size() == 1); - const DynamicPrintConfig* printConfig = this->gui_app->get_tab(Preset::TYPE_PRINT)->get_config(); - const DynamicPrintConfig* filamentConfig = this->gui_app->get_tab(Preset::TYPE_FILAMENT)->get_config(); - const DynamicPrintConfig* printerConfig = this->gui_app->get_tab(Preset::TYPE_PRINTER)->get_config(); + const DynamicPrintConfig* print_config = this->gui_app->get_tab(Preset::TYPE_PRINT)->get_config(); + const DynamicPrintConfig* filament_config = this->gui_app->get_tab(Preset::TYPE_FILAMENT)->get_config(); + const DynamicPrintConfig* printer_config = this->gui_app->get_tab(Preset::TYPE_PRINTER)->get_config(); // -- get temps - const ConfigOptionInts* temperature_config = filamentConfig->option("temperature"); + const ConfigOptionInts* temperature_config = filament_config->option("temperature"); assert(temperature_config->values.size() >= 1); int idx_steps = steps->GetSelection(); int idx_up = nb_up->GetSelection(); @@ -76,7 +76,7 @@ void CalibrationTempDialog::create_geometry(wxCommandEvent& event_args) { /// --- scale --- //model is created for a 0.4 nozzle, scale xy with nozzle size. - const ConfigOptionFloats* nozzle_diameter_config = printerConfig->option("nozzle_diameter"); + const ConfigOptionFloats* nozzle_diameter_config = printer_config->option("nozzle_diameter"); assert(nozzle_diameter_config->values.size() > 0); float nozzle_diameter = nozzle_diameter_config->values[0]; float xyzScale = nozzle_diameter / 0.4; @@ -107,13 +107,13 @@ void CalibrationTempDialog::create_geometry(wxCommandEvent& event_args) { /// --- translate --- - const ConfigOptionPoints* bed_shape = printerConfig->option("bed_shape"); + const ConfigOptionPoints* bed_shape = printer_config->option("bed_shape"); Vec2d bed_size = BoundingBoxf(bed_shape->values).size(); Vec2d bed_min = BoundingBoxf(bed_shape->values).min; model.objects[objs_idx[0]]->translate({ bed_min.x() + bed_size.x() / 2, bed_min.y() + bed_size.y() / 2, 0 }); /// --- main config, please modify object config when possible --- - DynamicPrintConfig new_print_config = *printConfig; //make a copy + DynamicPrintConfig new_print_config = *print_config; //make a copy new_print_config.set_key_value("complete_objects", new ConfigOptionBool(false)); /// -- generate the heat change gcode @@ -129,7 +129,7 @@ void CalibrationTempDialog::create_geometry(wxCommandEvent& event_args) { //new_printer_config.set_key_value("layer_gcode", new ConfigOptionString(str_layer_gcode)); /// --- custom config --- - float brim_width = printConfig->option("brim_width")->value; + float brim_width = print_config->option("brim_width")->value; if (brim_width < nozzle_diameter * 8) { model.objects[objs_idx[0]]->config.set_key_value("brim_width", new ConfigOptionFloat(nozzle_diameter * 8)); } @@ -152,7 +152,7 @@ void CalibrationTempDialog::create_geometry(wxCommandEvent& event_args) { //plat->on_config_change(new_printer_config); plat->changed_objects(objs_idx); this->gui_app->get_tab(Preset::TYPE_PRINT)->update_dirty(); - this->gui_app->get_tab(Preset::TYPE_PRINTER)->update_dirty(); + //this->gui_app->get_tab(Preset::TYPE_PRINTER)->update_dirty(); plat->is_preview_shown(); //update everything, easier to code. ObjectList* obj = this->gui_app->obj_list(); diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index c1ecf3232..9bce10bb7 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -46,6 +46,7 @@ #include "CalibrationFlowDialog.hpp" #include "CalibrationOverBridgeDialog.hpp" #include "CalibrationTempDialog.hpp" +#include "CalibrationRetractionDialog.hpp" #include "ConfigSnapshotDialog.hpp" #include "FreeCADDialog.hpp" #include "FirmwareDialog.hpp" @@ -602,6 +603,10 @@ void GUI_App::calibration_cube_dialog() { change_calibration_dialog(nullptr, new CalibrationCubeDialog(this, mainframe)); } +void GUI_App::calibration_retraction_dialog() +{ + change_calibration_dialog(nullptr, new CalibrationRetractionDialog(this, mainframe)); +} void GUI_App::freecad_script_dialog() { change_calibration_dialog(nullptr, new FreeCADDialog(this, mainframe)); diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index 38fd60b09..933406a53 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -139,6 +139,7 @@ public: void bridge_tuning_dialog(); void over_bridge_dialog(); void calibration_cube_dialog(); + void calibration_retraction_dialog(); void freecad_script_dialog(); //void support_tuning(); //have to do multiple, in a submenu void load_project(wxWindow *parent, wxString& input_file) const; diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index bd746f308..1d8349712 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -780,6 +780,8 @@ void MainFrame::init_menubar() [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(); }); diff --git a/src/slic3r/GUI/Preset.cpp b/src/slic3r/GUI/Preset.cpp index 4a70e61e7..d25629223 100644 --- a/src/slic3r/GUI/Preset.cpp +++ b/src/slic3r/GUI/Preset.cpp @@ -539,6 +539,7 @@ const std::vector& Preset::print_options() , "curve_smoothing_angle_convex" , "curve_smoothing_angle_concave", "print_extrusion_multiplier", + "print_retract_length", "external_perimeter_cut_corners", "external_perimeter_overlap", "perimeter_bonding",