From 9a7c22cfc00a6e2c4a3481649e5e0e8711d2dd6b Mon Sep 17 00:00:00 2001 From: Merill Date: Tue, 19 Dec 2023 10:27:01 +0100 Subject: [PATCH 01/28] update Archwiki link on readme supermerill/superslicer#4005 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6b7231be075..9387aaddabe 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ [![you can get this shield at shields.io](https://img.shields.io/discord/771316156203270154?color=7289da&logo=discord&logoColor=white)](https://github.com/supermerill/SuperSlicer/issues/611#issuecomment-907833287) [![you can get this shield at shields.io](https://img.shields.io/reddit/subreddit-subscribers/slic3r)](https://reddit.com/r/slic3r) [![you can get this shield at shields.io](https://img.shields.io/github/discussions/supermerill/superslicer)](https://github.com/supermerill/SuperSlicer/discussions) -[![Packaging status](https://repology.org/badge/tiny-repos/superslicer.svg)](https://repology.org/project/superslicer/versions) [![you can get this shield at shields.io](https://img.shields.io/chocolatey/v/superslicer)](https://community.chocolatey.org/packages/superslicer) [![you can get this shield at shields.io](https://img.shields.io/homebrew/cask/v/superslicer)](https://formulae.brew.sh/cask/superslicer) [![you can get this shield at shields.io](https://img.shields.io/archlinux/v/community/x86_64/superslicer)](https://archlinux.org/packages/community/x86_64/superslicer/) +[![Packaging status](https://repology.org/badge/tiny-repos/superslicer.svg)](https://repology.org/project/superslicer/versions) [![you can get this shield at shields.io](https://img.shields.io/chocolatey/v/superslicer)](https://community.chocolatey.org/packages/superslicer) [![you can get this shield at shields.io](https://img.shields.io/homebrew/cask/v/superslicer)](https://formulae.brew.sh/cask/superslicer) [![you can get this shield at shields.io](https://img.shields.io/archlinux/v/community/x86_64/superslicer)](https://archlinux.org/packages/extra/x86_64/superslicer/) # SuperSlicer **A PrusaSlicer fork (which is a slic3r fork)** (previously Slic3r++) From 94cb2397304a139c89bd9de17014dbf32c5deb7b Mon Sep 17 00:00:00 2001 From: legend069 <40685552+legend069@users.noreply.github.com> Date: Wed, 24 Jan 2024 22:58:03 +1100 Subject: [PATCH 02/28] SET_VELOCITY_LIMIT ACCEL_TO_DECEL klipper support added. gcode now emmits SET_VELOCITY_LIMIT instead of m204 commands with the decleration value "work arounds" are mentioned a fair bit in Voron discord. "work around" is also using custom_gcode figured i'll add it quickly. --- resources/ui_layout/default/print.ui | 2 ++ resources/ui_layout/example/print.ui | 2 ++ src/libslic3r/GCodeWriter.cpp | 46 ++++++++++++++++++++++++++- src/libslic3r/GCodeWriter.hpp | 6 ++++ src/libslic3r/Preset.cpp | 2 ++ src/libslic3r/Print.cpp | 2 ++ src/libslic3r/PrintConfig.cpp | 29 +++++++++++++++-- src/libslic3r/PrintConfig.hpp | 2 ++ src/slic3r/GUI/ConfigManipulation.cpp | 3 ++ 9 files changed, 91 insertions(+), 3 deletions(-) diff --git a/resources/ui_layout/default/print.ui b/resources/ui_layout/default/print.ui index 39807c5bef4..bb2a7711634 100644 --- a/resources/ui_layout/default/print.ui +++ b/resources/ui_layout/default/print.ui @@ -359,6 +359,8 @@ group:Pressure equalizer (experimental) group:label_width$9:sidetext_width$8:Acceleration control (advanced) line:Default acceleration setting:width$4:default_acceleration + setting:width$6:deceleration_match_to_er_acceleration + setting:width$2:deceleration_factor line:Perimeter acceleration setting:width$4:perimeter_acceleration setting:width$4:external_perimeter_acceleration diff --git a/resources/ui_layout/example/print.ui b/resources/ui_layout/example/print.ui index 86badd553a9..be0f9afc5d7 100644 --- a/resources/ui_layout/example/print.ui +++ b/resources/ui_layout/example/print.ui @@ -353,6 +353,8 @@ group:Autospeed (advanced) group:label_width$9:sidetext_width$8:Acceleration control (advanced) line:Default acceleration setting:width$4:default_acceleration + setting:width$6:deceleration_match_to_er_acceleration + setting:width$2:deceleration_factor line:Perimeter acceleration setting:width$4:perimeter_acceleration setting:width$4:external_perimeter_acceleration diff --git a/src/libslic3r/GCodeWriter.cpp b/src/libslic3r/GCodeWriter.cpp index dd3fc8909c0..278f943d402 100644 --- a/src/libslic3r/GCodeWriter.cpp +++ b/src/libslic3r/GCodeWriter.cpp @@ -278,6 +278,14 @@ void GCodeWriter::set_acceleration(uint32_t acceleration) m_current_acceleration = acceleration; } +void GCodeWriter::set_pressure(double pressure)// adding it in now for future commits of pressure advance numbers. +{ + if (pressure == m_current_pressure) + return; + + m_current_pressure = pressure; +} + void GCodeWriter::set_travel_acceleration(uint32_t acceleration) { //only gcfMarlinFirmware and gcfRepRap can use the travel accel @@ -315,7 +323,17 @@ std::string GCodeWriter::write_acceleration(){ } else if (FLAVOR_IS(gcfMarlinFirmware) || FLAVOR_IS(gcfRepRap)) { // M204: Set printing & travel acceleration gcode << "M204 P" << m_current_acceleration << " T" << (m_current_travel_acceleration > 0 ? m_current_travel_acceleration : m_current_acceleration); - } else { // gcfMarlinLegacy + } else if (FLAVOR_IS(gcfKlipper)){ + if (this->config.deceleration_match_to_er_acceleration == true){ + gcode << "SET_VELOCITY_LIMIT ACCEL=" << m_current_acceleration <<" ACCEL_TO_DECEL=" << m_current_acceleration * this->config.deceleration_factor.value / 100 /*<< " SQUARE_CORNER_VELOCITY="*/; //GUI will need to be "cleaned up" before adding in square corner feature since it will add ~12 boxes. + } + else{ + gcode << "SET_VELOCITY_LIMIT ACCEL=" << m_current_acceleration;//maybe have else statement still use m204 commands? + //gcode << "M204 S" << m_current_acceleration; what are the P/T parameters for?? >:( + // https://www.klipper3d.org/G-Codes.html#g-code-commands + } + } + else { // gcfMarlinLegacy // M204: Set default acceleration gcode << "M204 S" << m_current_acceleration; } @@ -325,6 +343,32 @@ std::string GCodeWriter::write_acceleration(){ return gcode.str(); } +std::string GCodeWriter::write_pressure(){// adding it in now for future commits of pressure advance numbers. + if (m_current_pressure == m_last_pressure || m_current_pressure == 0) + return ""; + + m_last_pressure = m_current_pressure; + + std::ostringstream gcode; + if (FLAVOR_IS(gcfRepetier)) { + // M20? + } else if(FLAVOR_IS(gcfLerdge) || FLAVOR_IS(gcfSprinter)){ + // M20? + } else if (FLAVOR_IS(gcfMarlinFirmware) || FLAVOR_IS(gcfRepRap)) { + // M900 https://marlinfw.org/docs/gcode/M900.html + gcode << "M900 K" << m_current_pressure; + } else if (FLAVOR_IS(gcfKlipper)){ + gcode << "SET_PRESSURE_ADVANCE ADVANCE=" << m_current_pressure ; + } + else { // anythign missing? + + } + if (this->config.gcode_comments) gcode << " ; adjust pressure"; + gcode << "\n"; + + return gcode.str(); +} + std::string GCodeWriter::reset_e(bool force) { if (FLAVOR_IS(gcfMach3) diff --git a/src/libslic3r/GCodeWriter.hpp b/src/libslic3r/GCodeWriter.hpp index 7d46974a7e1..185f2a78f37 100644 --- a/src/libslic3r/GCodeWriter.hpp +++ b/src/libslic3r/GCodeWriter.hpp @@ -21,6 +21,8 @@ class GCodeWriter { multiple_extruders(false), m_extrusion_axis("E"), m_tool(nullptr), m_single_extruder_multi_material(false), m_last_acceleration(0), m_current_acceleration(0), m_current_speed(0), + m_current_travel_acceleration(0),m_last_fan_speed(0), m_last_temperature(0),m_last_temperature_with_offset(0),//stops a couple compiler warnings + m_last_pressure(0), m_current_pressure(0), m_last_bed_temperature(0), m_last_bed_temperature_reached(true), m_lifted(0) {} @@ -48,8 +50,10 @@ class GCodeWriter { std::string set_bed_temperature(uint32_t temperature, bool wait = false); void set_acceleration(uint32_t acceleration); void set_travel_acceleration(uint32_t acceleration); + void set_pressure(double pressure); uint32_t get_acceleration() const; std::string write_acceleration(); + std::string write_pressure(); std::string reset_e(bool force = false); std::string update_progress(uint32_t num, uint32_t tot, bool allow_100 = false) const; // return false if this extruder was already selected @@ -103,6 +107,8 @@ class GCodeWriter { uint32_t m_current_acceleration; uint32_t m_current_travel_acceleration; double m_current_speed; + double m_current_pressure; + double m_last_pressure; uint8_t m_last_fan_speed; int16_t m_last_temperature; int16_t m_last_temperature_with_offset; diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 60c4ab3e0d3..8abef6106aa 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -572,6 +572,8 @@ static std::vector s_Preset_print_options { "top_solid_infill_acceleration", "travel_acceleration", "travel_deceleration_use_target", + "deceleration_match_to_er_acceleration", + "deceleration_factor", // skirt "skirts", "skirt_distance", diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index ecf364e8b8b..fe5af472200 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -199,6 +199,8 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver& /* ne "threads", "travel_acceleration", "travel_deceleration_use_target", + "deceleration_match_to_er_acceleration", + "deceleration_factor", "travel_speed", "travel_speed_z", "use_firmware_retraction", diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 1d8700dd169..68ae6a17909 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -5880,13 +5880,36 @@ void PrintConfigDef::init_fff_params() def->set_default_value(new ConfigOptionFloatOrPercent(1500, false)); def = this->add("travel_deceleration_use_target", coBool); - def->label = L("Decelerate with target acceleration"); + def->label = L("Decelerate with travel acceleration"); def->full_label = L("Use target acceleration for travel deceleration"); def->category = OptionCategory::speed; - def->tooltip = L("If selected, the deceleration of a travel will use the acceleration value of the extrusion that will be printed after it (if any) "); + def->tooltip = L("If selected, the travel move going to start the extrusion will use this acceleration value."); def->mode = comExpert | comSuSi; def->set_default_value(new ConfigOptionBool(true)); + def = this->add("deceleration_match_to_er_acceleration", coBool); + def->label = L("Enable ER deceleration"); + def->full_label = L("Use factor of ER acceleration for decelerations"); + def->category = OptionCategory::speed; + def->tooltip = L("If enabled gcode will set the deceleration value to deceleration_factor of the extrusion roles acceleration value, if disabled it will continue to use the firmwares deceleration value. " + "\n this is mainly used for klippers InputShaping algorithm" + "\n note: only supported with klipper firmware!"); + def->mode = comExpert | comSuSi; + def->set_default_value(new ConfigOptionBool(true)); + + def = this->add("deceleration_factor", coPercent); + def->label = L("Deceleration factor"); + def->full_label = L("Use percentage of ER acceleration for decelerations"); + def->category = OptionCategory::speed; + def->tooltip = L("choose your deceration rate" + "\nthis is mainly used for klippers InputShaping algorithm" + "\nfeel free to experiment with changing this value and let us know the results."); + def->min = 1; + def->max = 100; + def->sidetext = "%"; + def->mode = comExpert | comSuSi; + def->set_default_value(new ConfigOptionPercent(50)); + def = this->add("travel_speed", coFloat); def->label = L("Travel"); def->full_label = L("Travel speed"); @@ -7910,6 +7933,8 @@ std::unordered_set prusa_export_to_remove_keys = { "top_solid_infill_acceleration", "travel_acceleration", "travel_deceleration_use_target", +"deceleration_match_to_er_acceleration", +"deceleration_factor", "travel_speed_z", "wipe_advanced_algo", "wipe_advanced_multiplier", diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 24949305e2c..6fc54189cf0 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -1106,6 +1106,8 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionString, color_change_gcode)) ((ConfigOptionString, pause_print_gcode)) ((ConfigOptionString, template_custom_gcode)) + ((ConfigOptionBool, deceleration_match_to_er_acceleration)) + ((ConfigOptionPercent, deceleration_factor)) ) #ifdef HAS_PRESSURE_EQUALIZER diff --git a/src/slic3r/GUI/ConfigManipulation.cpp b/src/slic3r/GUI/ConfigManipulation.cpp index 0ee54d26a50..b4a4187f7b9 100644 --- a/src/slic3r/GUI/ConfigManipulation.cpp +++ b/src/slic3r/GUI/ConfigManipulation.cpp @@ -540,6 +540,7 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig* config) toggle_field(el, config->opt_bool("milling_post_process")); bool have_default_acceleration = config->option("default_acceleration")->value > 0; + bool have_decleration_enabled = config->option("deceleration_match_to_er_acceleration")->value; for (auto el : { "perimeter_acceleration", "external_perimeter_acceleration", "thin_walls_acceleration" }) toggle_field(el, have_default_acceleration && have_perimeters); toggle_field("infill_acceleration", have_default_acceleration && have_infill); @@ -549,6 +550,8 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig* config) toggle_field("support_material_acceleration", have_default_acceleration && (have_support_material || have_brim || have_skirt)); toggle_field("support_material_interface_acceleration", have_default_acceleration && have_support_material && have_support_interface); toggle_field("brim_acceleration", have_default_acceleration && (have_brim || have_skirt)); + toggle_field("deceleration_match_to_er_acceleration", have_default_acceleration);// i guess this is enough checks? is there other firmware that supports decleration values ? and is it better to leave the firmware check for in gcodewriter? + toggle_field("deceleration_factor", have_default_acceleration && have_decleration_enabled); for (auto el : { "bridge_acceleration", "bridge_internal_acceleration", "overhangs_acceleration", "gap_fill_acceleration", "travel_acceleration", "travel_deceleration_use_target", "first_layer_acceleration" }) toggle_field(el, have_default_acceleration); From bfdff0dded7e8ba5f145b680a35214cfc8d33273 Mon Sep 17 00:00:00 2001 From: legend069 <40685552+legend069@users.noreply.github.com> Date: Mon, 29 Jan 2024 23:55:19 +1100 Subject: [PATCH 03/28] small changes updated tooltip for travel_deceleration_use_target and deceleration_factor removed deceleration_match_to_er_acceleration improvements for deceleration_factor. --- resources/ui_layout/default/print.ui | 1 - resources/ui_layout/example/print.ui | 1 - src/libslic3r/GCode.cpp | 4 ++-- src/libslic3r/GCodeWriter.cpp | 2 +- src/libslic3r/Preset.cpp | 1 - src/libslic3r/Print.cpp | 1 - src/libslic3r/PrintConfig.cpp | 20 +++++++------------- src/libslic3r/PrintConfig.hpp | 1 - src/slic3r/GUI/ConfigManipulation.cpp | 6 +++--- 9 files changed, 13 insertions(+), 24 deletions(-) diff --git a/resources/ui_layout/default/print.ui b/resources/ui_layout/default/print.ui index bb2a7711634..525528b84b3 100644 --- a/resources/ui_layout/default/print.ui +++ b/resources/ui_layout/default/print.ui @@ -359,7 +359,6 @@ group:Pressure equalizer (experimental) group:label_width$9:sidetext_width$8:Acceleration control (advanced) line:Default acceleration setting:width$4:default_acceleration - setting:width$6:deceleration_match_to_er_acceleration setting:width$2:deceleration_factor line:Perimeter acceleration setting:width$4:perimeter_acceleration diff --git a/resources/ui_layout/example/print.ui b/resources/ui_layout/example/print.ui index be0f9afc5d7..df1f5fb3cd6 100644 --- a/resources/ui_layout/example/print.ui +++ b/resources/ui_layout/example/print.ui @@ -353,7 +353,6 @@ group:Autospeed (advanced) group:label_width$9:sidetext_width$8:Acceleration control (advanced) line:Default acceleration setting:width$4:default_acceleration - setting:width$6:deceleration_match_to_er_acceleration setting:width$2:deceleration_factor line:Perimeter acceleration setting:width$4:perimeter_acceleration diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 1bd8201931a..c971dae58aa 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -5615,7 +5615,7 @@ std::string GCode::_before_extrude(const ExtrusionPath &path, const std::string // compute speed here to be able to know it for travel_deceleration_use_target speed = _compute_speed_mm_per_sec(path, speed); - if (m_config.travel_deceleration_use_target){ + if (m_config.travel_deceleration_use_target == true && m_config.deceleration_factor == 0){ if (travel_acceleration <= acceleration || travel_acceleration == 0 || acceleration == 0) { m_writer.set_travel_acceleration((uint32_t)floor(acceleration + 0.5)); m_writer.set_acceleration((uint32_t)floor(acceleration + 0.5)); @@ -5630,7 +5630,7 @@ std::string GCode::_before_extrude(const ExtrusionPath &path, const std::string Polyline poly_start = this->travel_to(gcode, path.first_point(), path.role()); coordf_t length = poly_start.length(); // compute some numbers - double previous_accel = m_writer.get_acceleration(); // in mm/s² + double previous_accel = m_writer.get_acceleration(); // in mm/s² // isn't used anywhere? double previous_speed = m_writer.get_speed(); // in mm/s double travel_speed = m_config.get_computed_value("travel_speed"); // first, the acceleration distance diff --git a/src/libslic3r/GCodeWriter.cpp b/src/libslic3r/GCodeWriter.cpp index 278f943d402..3f077549422 100644 --- a/src/libslic3r/GCodeWriter.cpp +++ b/src/libslic3r/GCodeWriter.cpp @@ -324,7 +324,7 @@ std::string GCodeWriter::write_acceleration(){ // M204: Set printing & travel acceleration gcode << "M204 P" << m_current_acceleration << " T" << (m_current_travel_acceleration > 0 ? m_current_travel_acceleration : m_current_acceleration); } else if (FLAVOR_IS(gcfKlipper)){ - if (this->config.deceleration_match_to_er_acceleration == true){ + if (this->config.deceleration_factor > 0){ gcode << "SET_VELOCITY_LIMIT ACCEL=" << m_current_acceleration <<" ACCEL_TO_DECEL=" << m_current_acceleration * this->config.deceleration_factor.value / 100 /*<< " SQUARE_CORNER_VELOCITY="*/; //GUI will need to be "cleaned up" before adding in square corner feature since it will add ~12 boxes. } else{ diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 8abef6106aa..fda4a6a0720 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -572,7 +572,6 @@ static std::vector s_Preset_print_options { "top_solid_infill_acceleration", "travel_acceleration", "travel_deceleration_use_target", - "deceleration_match_to_er_acceleration", "deceleration_factor", // skirt "skirts", diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index fe5af472200..8563741064a 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -199,7 +199,6 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver& /* ne "threads", "travel_acceleration", "travel_deceleration_use_target", - "deceleration_match_to_er_acceleration", "deceleration_factor", "travel_speed", "travel_speed_z", diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 68ae6a17909..1f7d3d947ce 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -5883,17 +5883,10 @@ void PrintConfigDef::init_fff_params() def->label = L("Decelerate with travel acceleration"); def->full_label = L("Use target acceleration for travel deceleration"); def->category = OptionCategory::speed; - def->tooltip = L("If selected, the travel move going to start the extrusion will use this acceleration value."); - def->mode = comExpert | comSuSi; - def->set_default_value(new ConfigOptionBool(true)); - - def = this->add("deceleration_match_to_er_acceleration", coBool); - def->label = L("Enable ER deceleration"); - def->full_label = L("Use factor of ER acceleration for decelerations"); - def->category = OptionCategory::speed; - def->tooltip = L("If enabled gcode will set the deceleration value to deceleration_factor of the extrusion roles acceleration value, if disabled it will continue to use the firmwares deceleration value. " - "\n this is mainly used for klippers InputShaping algorithm" - "\n note: only supported with klipper firmware!"); + //def->tooltip = L("If selected, the deceleration of a travel will use the acceleration value of the extrusion that will be printed after it (if any) ") + def->tooltip = L("if enabled, the travel move will use the upcoming extrusion roles acceleration value as the travel acceleration value before it starts the extrusion role" + "\nit inserts the acceleration change at the 'midway' point of the travel move" + "\nthis might help with 'ringing' artifacts that get generated from travel moves"); def->mode = comExpert | comSuSi; def->set_default_value(new ConfigOptionBool(true)); @@ -5902,9 +5895,11 @@ void PrintConfigDef::init_fff_params() def->full_label = L("Use percentage of ER acceleration for decelerations"); def->category = OptionCategory::speed; def->tooltip = L("choose your deceration rate" + "\n set 0 to disable \tNOTE: only supported with klipper firmware!" + "\nIf higher than 0 sliced gcode will set the deceleration value to deceleration_factor of the extrusion roles acceleration value, if disabled it will continue to use the firmwares deceleration value for all declerations" "\nthis is mainly used for klippers InputShaping algorithm" "\nfeel free to experiment with changing this value and let us know the results."); - def->min = 1; + def->min = 0; def->max = 100; def->sidetext = "%"; def->mode = comExpert | comSuSi; @@ -7933,7 +7928,6 @@ std::unordered_set prusa_export_to_remove_keys = { "top_solid_infill_acceleration", "travel_acceleration", "travel_deceleration_use_target", -"deceleration_match_to_er_acceleration", "deceleration_factor", "travel_speed_z", "wipe_advanced_algo", diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 6fc54189cf0..133168407ab 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -1106,7 +1106,6 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionString, color_change_gcode)) ((ConfigOptionString, pause_print_gcode)) ((ConfigOptionString, template_custom_gcode)) - ((ConfigOptionBool, deceleration_match_to_er_acceleration)) ((ConfigOptionPercent, deceleration_factor)) ) diff --git a/src/slic3r/GUI/ConfigManipulation.cpp b/src/slic3r/GUI/ConfigManipulation.cpp index b4a4187f7b9..d6089a09fd2 100644 --- a/src/slic3r/GUI/ConfigManipulation.cpp +++ b/src/slic3r/GUI/ConfigManipulation.cpp @@ -540,7 +540,7 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig* config) toggle_field(el, config->opt_bool("milling_post_process")); bool have_default_acceleration = config->option("default_acceleration")->value > 0; - bool have_decleration_enabled = config->option("deceleration_match_to_er_acceleration")->value; + bool have_decleration_enabled = config->option("deceleration_factor")->value <= 0; for (auto el : { "perimeter_acceleration", "external_perimeter_acceleration", "thin_walls_acceleration" }) toggle_field(el, have_default_acceleration && have_perimeters); toggle_field("infill_acceleration", have_default_acceleration && have_infill); @@ -550,11 +550,11 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig* config) toggle_field("support_material_acceleration", have_default_acceleration && (have_support_material || have_brim || have_skirt)); toggle_field("support_material_interface_acceleration", have_default_acceleration && have_support_material && have_support_interface); toggle_field("brim_acceleration", have_default_acceleration && (have_brim || have_skirt)); - toggle_field("deceleration_match_to_er_acceleration", have_default_acceleration);// i guess this is enough checks? is there other firmware that supports decleration values ? and is it better to leave the firmware check for in gcodewriter? - toggle_field("deceleration_factor", have_default_acceleration && have_decleration_enabled); + toggle_field("deceleration_factor", have_default_acceleration);// i guess this is enough checks? is there other firmware that supports decleration values ? and is it better to leave the firmware check for in gcodewriter? for (auto el : { "bridge_acceleration", "bridge_internal_acceleration", "overhangs_acceleration", "gap_fill_acceleration", "travel_acceleration", "travel_deceleration_use_target", "first_layer_acceleration" }) toggle_field(el, have_default_acceleration); + toggle_field("travel_deceleration_use_target", have_default_acceleration && have_decleration_enabled ); // for default speed, it needs at least a dependent field with a % toggle_field("default_speed", config->option("perimeter_speed")->percent || config->option("solid_infill_speed")->percent || From cb1e6944bc14ccaafadb7cd2e9d83d599163f7a2 Mon Sep 17 00:00:00 2001 From: legend069 <40685552+legend069@users.noreply.github.com> Date: Wed, 7 Feb 2024 17:37:36 +1100 Subject: [PATCH 04/28] improvements seems to work well now. updated tooltip for deceleration_factor. --- src/libslic3r/GCode.cpp | 10 +++++++--- src/libslic3r/GCodeWriter.cpp | 3 ++- src/libslic3r/PrintConfig.cpp | 1 + 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index c971dae58aa..c94dc99f1e6 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -5614,9 +5614,9 @@ std::string GCode::_before_extrude(const ExtrusionPath &path, const std::string // compute speed here to be able to know it for travel_deceleration_use_target speed = _compute_speed_mm_per_sec(path, speed); - - if (m_config.travel_deceleration_use_target == true && m_config.deceleration_factor == 0){ + if (m_config.travel_deceleration_use_target == true && m_config.gcode_flavor != gcfKlipper){ if (travel_acceleration <= acceleration || travel_acceleration == 0 || acceleration == 0) { + //m_writer.set_travel_acceleration((uint32_t)floor(travel_acceleration + 0.5)); m_writer.set_travel_acceleration((uint32_t)floor(acceleration + 0.5)); m_writer.set_acceleration((uint32_t)floor(acceleration + 0.5)); // go to first point of extrusion path (stop at midpoint to let us set the decel speed) @@ -5633,6 +5633,7 @@ std::string GCode::_before_extrude(const ExtrusionPath &path, const std::string double previous_accel = m_writer.get_acceleration(); // in mm/s² // isn't used anywhere? double previous_speed = m_writer.get_speed(); // in mm/s double travel_speed = m_config.get_computed_value("travel_speed"); + double deccel_factor = m_config.get_computed_value("deceleration_factor"); // first, the acceleration distance const double extrude2travel_speed_diff = previous_speed >= travel_speed ? 0 : (travel_speed - previous_speed); const double seconds_to_go_travel_speed = (extrude2travel_speed_diff / travel_acceleration); @@ -5666,6 +5667,7 @@ std::string GCode::_before_extrude(const ExtrusionPath &path, const std::string // don't use it if the travel speed isn't high enough vs next speed cant_use_deceleration = cant_use_deceleration || dist_to_go_extrude_speed < coordf_t(SCALED_EPSILON); if (cant_use_deceleration) { + //m_writer.set_travel_acceleration((uint32_t)floor(travel_acceleration + 0.5)); ? m_writer.set_travel_acceleration((uint32_t)floor(acceleration + 0.5)); m_writer.set_acceleration((uint32_t)floor(acceleration + 0.5)); this->write_travel_to(gcode, poly_start, "move to first " + description + " point (minimum acceleration)"); @@ -5699,7 +5701,8 @@ std::string GCode::_before_extrude(const ExtrusionPath &path, const std::string this->write_travel_to(gcode, poly_start, "move to first " + description + " point (acceleration)"); //travel acceleration should be already set at startup via special gcode, and so it's automatically used by G0. gcode += "; decel to extrusion\n"; - m_writer.set_travel_acceleration((uint32_t)floor(acceleration + 0.5)); + m_writer.set_travel_acceleration((uint32_t)floor(travel_acceleration * deccel_factor )); + //m_writer.set_acceleration((uint32_t)floor(acceleration * deccel_factor )); this->write_travel_to(gcode, poly_end, "move to first " + description + " point (deceleration)"); // restore travel accel and ensure the new extrusion accel is set m_writer.set_travel_acceleration((uint32_t)floor(travel_acceleration + 0.5)); @@ -5707,6 +5710,7 @@ std::string GCode::_before_extrude(const ExtrusionPath &path, const std::string gcode += "; end travel\n"; } } else { + //m_writer.set_travel_acceleration((uint32_t)floor(travel_acceleration + 0.5)); m_writer.set_acceleration((uint32_t)floor(acceleration + 0.5)); } } diff --git a/src/libslic3r/GCodeWriter.cpp b/src/libslic3r/GCodeWriter.cpp index 3f077549422..36c8dc5b06e 100644 --- a/src/libslic3r/GCodeWriter.cpp +++ b/src/libslic3r/GCodeWriter.cpp @@ -297,6 +297,7 @@ void GCodeWriter::set_travel_acceleration(uint32_t acceleration) return; m_current_travel_acceleration = acceleration; + m_current_acceleration = acceleration;// theres a bug with this, setting travel accel needs to reset the current accel so it can get written. } uint32_t GCodeWriter::get_acceleration() const @@ -305,7 +306,7 @@ uint32_t GCodeWriter::get_acceleration() const } std::string GCodeWriter::write_acceleration(){ - if (m_current_acceleration == m_last_acceleration || m_current_acceleration == 0) + if (m_current_acceleration == m_last_acceleration || m_current_acceleration == 0 /*|| m_current_acceleration == m_current_travel_acceleration*/ ) return ""; m_last_acceleration = m_current_acceleration; diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 1f7d3d947ce..ef71b2af23e 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -5898,6 +5898,7 @@ void PrintConfigDef::init_fff_params() "\n set 0 to disable \tNOTE: only supported with klipper firmware!" "\nIf higher than 0 sliced gcode will set the deceleration value to deceleration_factor of the extrusion roles acceleration value, if disabled it will continue to use the firmwares deceleration value for all declerations" "\nthis is mainly used for klippers InputShaping algorithm" + "\n for marlin firmware this only adjust the deceleration rate for travel movements" "\nfeel free to experiment with changing this value and let us know the results."); def->min = 0; def->max = 100; From 36aac66ab195ba0c5247c6c90eb6f56ab23d04cc Mon Sep 17 00:00:00 2001 From: legend069 <40685552+legend069@users.noreply.github.com> Date: Sun, 11 Feb 2024 00:00:37 +1100 Subject: [PATCH 05/28] Revert "improvements" This reverts commit cb1e6944bc14ccaafadb7cd2e9d83d599163f7a2. --- src/libslic3r/GCode.cpp | 10 +++------- src/libslic3r/GCodeWriter.cpp | 3 +-- src/libslic3r/PrintConfig.cpp | 1 - 3 files changed, 4 insertions(+), 10 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index c94dc99f1e6..c971dae58aa 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -5614,9 +5614,9 @@ std::string GCode::_before_extrude(const ExtrusionPath &path, const std::string // compute speed here to be able to know it for travel_deceleration_use_target speed = _compute_speed_mm_per_sec(path, speed); - if (m_config.travel_deceleration_use_target == true && m_config.gcode_flavor != gcfKlipper){ + + if (m_config.travel_deceleration_use_target == true && m_config.deceleration_factor == 0){ if (travel_acceleration <= acceleration || travel_acceleration == 0 || acceleration == 0) { - //m_writer.set_travel_acceleration((uint32_t)floor(travel_acceleration + 0.5)); m_writer.set_travel_acceleration((uint32_t)floor(acceleration + 0.5)); m_writer.set_acceleration((uint32_t)floor(acceleration + 0.5)); // go to first point of extrusion path (stop at midpoint to let us set the decel speed) @@ -5633,7 +5633,6 @@ std::string GCode::_before_extrude(const ExtrusionPath &path, const std::string double previous_accel = m_writer.get_acceleration(); // in mm/s² // isn't used anywhere? double previous_speed = m_writer.get_speed(); // in mm/s double travel_speed = m_config.get_computed_value("travel_speed"); - double deccel_factor = m_config.get_computed_value("deceleration_factor"); // first, the acceleration distance const double extrude2travel_speed_diff = previous_speed >= travel_speed ? 0 : (travel_speed - previous_speed); const double seconds_to_go_travel_speed = (extrude2travel_speed_diff / travel_acceleration); @@ -5667,7 +5666,6 @@ std::string GCode::_before_extrude(const ExtrusionPath &path, const std::string // don't use it if the travel speed isn't high enough vs next speed cant_use_deceleration = cant_use_deceleration || dist_to_go_extrude_speed < coordf_t(SCALED_EPSILON); if (cant_use_deceleration) { - //m_writer.set_travel_acceleration((uint32_t)floor(travel_acceleration + 0.5)); ? m_writer.set_travel_acceleration((uint32_t)floor(acceleration + 0.5)); m_writer.set_acceleration((uint32_t)floor(acceleration + 0.5)); this->write_travel_to(gcode, poly_start, "move to first " + description + " point (minimum acceleration)"); @@ -5701,8 +5699,7 @@ std::string GCode::_before_extrude(const ExtrusionPath &path, const std::string this->write_travel_to(gcode, poly_start, "move to first " + description + " point (acceleration)"); //travel acceleration should be already set at startup via special gcode, and so it's automatically used by G0. gcode += "; decel to extrusion\n"; - m_writer.set_travel_acceleration((uint32_t)floor(travel_acceleration * deccel_factor )); - //m_writer.set_acceleration((uint32_t)floor(acceleration * deccel_factor )); + m_writer.set_travel_acceleration((uint32_t)floor(acceleration + 0.5)); this->write_travel_to(gcode, poly_end, "move to first " + description + " point (deceleration)"); // restore travel accel and ensure the new extrusion accel is set m_writer.set_travel_acceleration((uint32_t)floor(travel_acceleration + 0.5)); @@ -5710,7 +5707,6 @@ std::string GCode::_before_extrude(const ExtrusionPath &path, const std::string gcode += "; end travel\n"; } } else { - //m_writer.set_travel_acceleration((uint32_t)floor(travel_acceleration + 0.5)); m_writer.set_acceleration((uint32_t)floor(acceleration + 0.5)); } } diff --git a/src/libslic3r/GCodeWriter.cpp b/src/libslic3r/GCodeWriter.cpp index 36c8dc5b06e..3f077549422 100644 --- a/src/libslic3r/GCodeWriter.cpp +++ b/src/libslic3r/GCodeWriter.cpp @@ -297,7 +297,6 @@ void GCodeWriter::set_travel_acceleration(uint32_t acceleration) return; m_current_travel_acceleration = acceleration; - m_current_acceleration = acceleration;// theres a bug with this, setting travel accel needs to reset the current accel so it can get written. } uint32_t GCodeWriter::get_acceleration() const @@ -306,7 +305,7 @@ uint32_t GCodeWriter::get_acceleration() const } std::string GCodeWriter::write_acceleration(){ - if (m_current_acceleration == m_last_acceleration || m_current_acceleration == 0 /*|| m_current_acceleration == m_current_travel_acceleration*/ ) + if (m_current_acceleration == m_last_acceleration || m_current_acceleration == 0) return ""; m_last_acceleration = m_current_acceleration; diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index ef71b2af23e..1f7d3d947ce 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -5898,7 +5898,6 @@ void PrintConfigDef::init_fff_params() "\n set 0 to disable \tNOTE: only supported with klipper firmware!" "\nIf higher than 0 sliced gcode will set the deceleration value to deceleration_factor of the extrusion roles acceleration value, if disabled it will continue to use the firmwares deceleration value for all declerations" "\nthis is mainly used for klippers InputShaping algorithm" - "\n for marlin firmware this only adjust the deceleration rate for travel movements" "\nfeel free to experiment with changing this value and let us know the results."); def->min = 0; def->max = 100; From fd0a500e4d781a9132a588471087cbebf1e7bc7c Mon Sep 17 00:00:00 2001 From: legend069 <40685552+legend069@users.noreply.github.com> Date: Sun, 11 Feb 2024 00:00:41 +1100 Subject: [PATCH 06/28] Revert "small changes" This reverts commit bfdff0dded7e8ba5f145b680a35214cfc8d33273. --- resources/ui_layout/default/print.ui | 1 + resources/ui_layout/example/print.ui | 1 + src/libslic3r/GCode.cpp | 4 ++-- src/libslic3r/GCodeWriter.cpp | 2 +- src/libslic3r/Preset.cpp | 1 + src/libslic3r/Print.cpp | 1 + src/libslic3r/PrintConfig.cpp | 20 +++++++++++++------- src/libslic3r/PrintConfig.hpp | 1 + src/slic3r/GUI/ConfigManipulation.cpp | 6 +++--- 9 files changed, 24 insertions(+), 13 deletions(-) diff --git a/resources/ui_layout/default/print.ui b/resources/ui_layout/default/print.ui index 525528b84b3..bb2a7711634 100644 --- a/resources/ui_layout/default/print.ui +++ b/resources/ui_layout/default/print.ui @@ -359,6 +359,7 @@ group:Pressure equalizer (experimental) group:label_width$9:sidetext_width$8:Acceleration control (advanced) line:Default acceleration setting:width$4:default_acceleration + setting:width$6:deceleration_match_to_er_acceleration setting:width$2:deceleration_factor line:Perimeter acceleration setting:width$4:perimeter_acceleration diff --git a/resources/ui_layout/example/print.ui b/resources/ui_layout/example/print.ui index df1f5fb3cd6..be0f9afc5d7 100644 --- a/resources/ui_layout/example/print.ui +++ b/resources/ui_layout/example/print.ui @@ -353,6 +353,7 @@ group:Autospeed (advanced) group:label_width$9:sidetext_width$8:Acceleration control (advanced) line:Default acceleration setting:width$4:default_acceleration + setting:width$6:deceleration_match_to_er_acceleration setting:width$2:deceleration_factor line:Perimeter acceleration setting:width$4:perimeter_acceleration diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index c971dae58aa..1bd8201931a 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -5615,7 +5615,7 @@ std::string GCode::_before_extrude(const ExtrusionPath &path, const std::string // compute speed here to be able to know it for travel_deceleration_use_target speed = _compute_speed_mm_per_sec(path, speed); - if (m_config.travel_deceleration_use_target == true && m_config.deceleration_factor == 0){ + if (m_config.travel_deceleration_use_target){ if (travel_acceleration <= acceleration || travel_acceleration == 0 || acceleration == 0) { m_writer.set_travel_acceleration((uint32_t)floor(acceleration + 0.5)); m_writer.set_acceleration((uint32_t)floor(acceleration + 0.5)); @@ -5630,7 +5630,7 @@ std::string GCode::_before_extrude(const ExtrusionPath &path, const std::string Polyline poly_start = this->travel_to(gcode, path.first_point(), path.role()); coordf_t length = poly_start.length(); // compute some numbers - double previous_accel = m_writer.get_acceleration(); // in mm/s² // isn't used anywhere? + double previous_accel = m_writer.get_acceleration(); // in mm/s² double previous_speed = m_writer.get_speed(); // in mm/s double travel_speed = m_config.get_computed_value("travel_speed"); // first, the acceleration distance diff --git a/src/libslic3r/GCodeWriter.cpp b/src/libslic3r/GCodeWriter.cpp index 3f077549422..278f943d402 100644 --- a/src/libslic3r/GCodeWriter.cpp +++ b/src/libslic3r/GCodeWriter.cpp @@ -324,7 +324,7 @@ std::string GCodeWriter::write_acceleration(){ // M204: Set printing & travel acceleration gcode << "M204 P" << m_current_acceleration << " T" << (m_current_travel_acceleration > 0 ? m_current_travel_acceleration : m_current_acceleration); } else if (FLAVOR_IS(gcfKlipper)){ - if (this->config.deceleration_factor > 0){ + if (this->config.deceleration_match_to_er_acceleration == true){ gcode << "SET_VELOCITY_LIMIT ACCEL=" << m_current_acceleration <<" ACCEL_TO_DECEL=" << m_current_acceleration * this->config.deceleration_factor.value / 100 /*<< " SQUARE_CORNER_VELOCITY="*/; //GUI will need to be "cleaned up" before adding in square corner feature since it will add ~12 boxes. } else{ diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index fda4a6a0720..8abef6106aa 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -572,6 +572,7 @@ static std::vector s_Preset_print_options { "top_solid_infill_acceleration", "travel_acceleration", "travel_deceleration_use_target", + "deceleration_match_to_er_acceleration", "deceleration_factor", // skirt "skirts", diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 8563741064a..fe5af472200 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -199,6 +199,7 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver& /* ne "threads", "travel_acceleration", "travel_deceleration_use_target", + "deceleration_match_to_er_acceleration", "deceleration_factor", "travel_speed", "travel_speed_z", diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 1f7d3d947ce..68ae6a17909 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -5883,10 +5883,17 @@ void PrintConfigDef::init_fff_params() def->label = L("Decelerate with travel acceleration"); def->full_label = L("Use target acceleration for travel deceleration"); def->category = OptionCategory::speed; - //def->tooltip = L("If selected, the deceleration of a travel will use the acceleration value of the extrusion that will be printed after it (if any) ") - def->tooltip = L("if enabled, the travel move will use the upcoming extrusion roles acceleration value as the travel acceleration value before it starts the extrusion role" - "\nit inserts the acceleration change at the 'midway' point of the travel move" - "\nthis might help with 'ringing' artifacts that get generated from travel moves"); + def->tooltip = L("If selected, the travel move going to start the extrusion will use this acceleration value."); + def->mode = comExpert | comSuSi; + def->set_default_value(new ConfigOptionBool(true)); + + def = this->add("deceleration_match_to_er_acceleration", coBool); + def->label = L("Enable ER deceleration"); + def->full_label = L("Use factor of ER acceleration for decelerations"); + def->category = OptionCategory::speed; + def->tooltip = L("If enabled gcode will set the deceleration value to deceleration_factor of the extrusion roles acceleration value, if disabled it will continue to use the firmwares deceleration value. " + "\n this is mainly used for klippers InputShaping algorithm" + "\n note: only supported with klipper firmware!"); def->mode = comExpert | comSuSi; def->set_default_value(new ConfigOptionBool(true)); @@ -5895,11 +5902,9 @@ void PrintConfigDef::init_fff_params() def->full_label = L("Use percentage of ER acceleration for decelerations"); def->category = OptionCategory::speed; def->tooltip = L("choose your deceration rate" - "\n set 0 to disable \tNOTE: only supported with klipper firmware!" - "\nIf higher than 0 sliced gcode will set the deceleration value to deceleration_factor of the extrusion roles acceleration value, if disabled it will continue to use the firmwares deceleration value for all declerations" "\nthis is mainly used for klippers InputShaping algorithm" "\nfeel free to experiment with changing this value and let us know the results."); - def->min = 0; + def->min = 1; def->max = 100; def->sidetext = "%"; def->mode = comExpert | comSuSi; @@ -7928,6 +7933,7 @@ std::unordered_set prusa_export_to_remove_keys = { "top_solid_infill_acceleration", "travel_acceleration", "travel_deceleration_use_target", +"deceleration_match_to_er_acceleration", "deceleration_factor", "travel_speed_z", "wipe_advanced_algo", diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 133168407ab..6fc54189cf0 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -1106,6 +1106,7 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionString, color_change_gcode)) ((ConfigOptionString, pause_print_gcode)) ((ConfigOptionString, template_custom_gcode)) + ((ConfigOptionBool, deceleration_match_to_er_acceleration)) ((ConfigOptionPercent, deceleration_factor)) ) diff --git a/src/slic3r/GUI/ConfigManipulation.cpp b/src/slic3r/GUI/ConfigManipulation.cpp index d6089a09fd2..b4a4187f7b9 100644 --- a/src/slic3r/GUI/ConfigManipulation.cpp +++ b/src/slic3r/GUI/ConfigManipulation.cpp @@ -540,7 +540,7 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig* config) toggle_field(el, config->opt_bool("milling_post_process")); bool have_default_acceleration = config->option("default_acceleration")->value > 0; - bool have_decleration_enabled = config->option("deceleration_factor")->value <= 0; + bool have_decleration_enabled = config->option("deceleration_match_to_er_acceleration")->value; for (auto el : { "perimeter_acceleration", "external_perimeter_acceleration", "thin_walls_acceleration" }) toggle_field(el, have_default_acceleration && have_perimeters); toggle_field("infill_acceleration", have_default_acceleration && have_infill); @@ -550,11 +550,11 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig* config) toggle_field("support_material_acceleration", have_default_acceleration && (have_support_material || have_brim || have_skirt)); toggle_field("support_material_interface_acceleration", have_default_acceleration && have_support_material && have_support_interface); toggle_field("brim_acceleration", have_default_acceleration && (have_brim || have_skirt)); - toggle_field("deceleration_factor", have_default_acceleration);// i guess this is enough checks? is there other firmware that supports decleration values ? and is it better to leave the firmware check for in gcodewriter? + toggle_field("deceleration_match_to_er_acceleration", have_default_acceleration);// i guess this is enough checks? is there other firmware that supports decleration values ? and is it better to leave the firmware check for in gcodewriter? + toggle_field("deceleration_factor", have_default_acceleration && have_decleration_enabled); for (auto el : { "bridge_acceleration", "bridge_internal_acceleration", "overhangs_acceleration", "gap_fill_acceleration", "travel_acceleration", "travel_deceleration_use_target", "first_layer_acceleration" }) toggle_field(el, have_default_acceleration); - toggle_field("travel_deceleration_use_target", have_default_acceleration && have_decleration_enabled ); // for default speed, it needs at least a dependent field with a % toggle_field("default_speed", config->option("perimeter_speed")->percent || config->option("solid_infill_speed")->percent || From 30740c08e2b30cedac63e74b8c9bd1e52d260a67 Mon Sep 17 00:00:00 2001 From: legend069 <40685552+legend069@users.noreply.github.com> Date: Sun, 11 Feb 2024 00:00:45 +1100 Subject: [PATCH 07/28] Revert "SET_VELOCITY_LIMIT ACCEL_TO_DECEL klipper support added." This reverts commit 94cb2397304a139c89bd9de17014dbf32c5deb7b. --- resources/ui_layout/default/print.ui | 2 -- resources/ui_layout/example/print.ui | 2 -- src/libslic3r/GCodeWriter.cpp | 46 +-------------------------- src/libslic3r/GCodeWriter.hpp | 6 ---- src/libslic3r/Preset.cpp | 2 -- src/libslic3r/Print.cpp | 2 -- src/libslic3r/PrintConfig.cpp | 29 ++--------------- src/libslic3r/PrintConfig.hpp | 2 -- src/slic3r/GUI/ConfigManipulation.cpp | 3 -- 9 files changed, 3 insertions(+), 91 deletions(-) diff --git a/resources/ui_layout/default/print.ui b/resources/ui_layout/default/print.ui index bb2a7711634..39807c5bef4 100644 --- a/resources/ui_layout/default/print.ui +++ b/resources/ui_layout/default/print.ui @@ -359,8 +359,6 @@ group:Pressure equalizer (experimental) group:label_width$9:sidetext_width$8:Acceleration control (advanced) line:Default acceleration setting:width$4:default_acceleration - setting:width$6:deceleration_match_to_er_acceleration - setting:width$2:deceleration_factor line:Perimeter acceleration setting:width$4:perimeter_acceleration setting:width$4:external_perimeter_acceleration diff --git a/resources/ui_layout/example/print.ui b/resources/ui_layout/example/print.ui index be0f9afc5d7..86badd553a9 100644 --- a/resources/ui_layout/example/print.ui +++ b/resources/ui_layout/example/print.ui @@ -353,8 +353,6 @@ group:Autospeed (advanced) group:label_width$9:sidetext_width$8:Acceleration control (advanced) line:Default acceleration setting:width$4:default_acceleration - setting:width$6:deceleration_match_to_er_acceleration - setting:width$2:deceleration_factor line:Perimeter acceleration setting:width$4:perimeter_acceleration setting:width$4:external_perimeter_acceleration diff --git a/src/libslic3r/GCodeWriter.cpp b/src/libslic3r/GCodeWriter.cpp index 278f943d402..dd3fc8909c0 100644 --- a/src/libslic3r/GCodeWriter.cpp +++ b/src/libslic3r/GCodeWriter.cpp @@ -278,14 +278,6 @@ void GCodeWriter::set_acceleration(uint32_t acceleration) m_current_acceleration = acceleration; } -void GCodeWriter::set_pressure(double pressure)// adding it in now for future commits of pressure advance numbers. -{ - if (pressure == m_current_pressure) - return; - - m_current_pressure = pressure; -} - void GCodeWriter::set_travel_acceleration(uint32_t acceleration) { //only gcfMarlinFirmware and gcfRepRap can use the travel accel @@ -323,17 +315,7 @@ std::string GCodeWriter::write_acceleration(){ } else if (FLAVOR_IS(gcfMarlinFirmware) || FLAVOR_IS(gcfRepRap)) { // M204: Set printing & travel acceleration gcode << "M204 P" << m_current_acceleration << " T" << (m_current_travel_acceleration > 0 ? m_current_travel_acceleration : m_current_acceleration); - } else if (FLAVOR_IS(gcfKlipper)){ - if (this->config.deceleration_match_to_er_acceleration == true){ - gcode << "SET_VELOCITY_LIMIT ACCEL=" << m_current_acceleration <<" ACCEL_TO_DECEL=" << m_current_acceleration * this->config.deceleration_factor.value / 100 /*<< " SQUARE_CORNER_VELOCITY="*/; //GUI will need to be "cleaned up" before adding in square corner feature since it will add ~12 boxes. - } - else{ - gcode << "SET_VELOCITY_LIMIT ACCEL=" << m_current_acceleration;//maybe have else statement still use m204 commands? - //gcode << "M204 S" << m_current_acceleration; what are the P/T parameters for?? >:( - // https://www.klipper3d.org/G-Codes.html#g-code-commands - } - } - else { // gcfMarlinLegacy + } else { // gcfMarlinLegacy // M204: Set default acceleration gcode << "M204 S" << m_current_acceleration; } @@ -343,32 +325,6 @@ std::string GCodeWriter::write_acceleration(){ return gcode.str(); } -std::string GCodeWriter::write_pressure(){// adding it in now for future commits of pressure advance numbers. - if (m_current_pressure == m_last_pressure || m_current_pressure == 0) - return ""; - - m_last_pressure = m_current_pressure; - - std::ostringstream gcode; - if (FLAVOR_IS(gcfRepetier)) { - // M20? - } else if(FLAVOR_IS(gcfLerdge) || FLAVOR_IS(gcfSprinter)){ - // M20? - } else if (FLAVOR_IS(gcfMarlinFirmware) || FLAVOR_IS(gcfRepRap)) { - // M900 https://marlinfw.org/docs/gcode/M900.html - gcode << "M900 K" << m_current_pressure; - } else if (FLAVOR_IS(gcfKlipper)){ - gcode << "SET_PRESSURE_ADVANCE ADVANCE=" << m_current_pressure ; - } - else { // anythign missing? - - } - if (this->config.gcode_comments) gcode << " ; adjust pressure"; - gcode << "\n"; - - return gcode.str(); -} - std::string GCodeWriter::reset_e(bool force) { if (FLAVOR_IS(gcfMach3) diff --git a/src/libslic3r/GCodeWriter.hpp b/src/libslic3r/GCodeWriter.hpp index 185f2a78f37..7d46974a7e1 100644 --- a/src/libslic3r/GCodeWriter.hpp +++ b/src/libslic3r/GCodeWriter.hpp @@ -21,8 +21,6 @@ class GCodeWriter { multiple_extruders(false), m_extrusion_axis("E"), m_tool(nullptr), m_single_extruder_multi_material(false), m_last_acceleration(0), m_current_acceleration(0), m_current_speed(0), - m_current_travel_acceleration(0),m_last_fan_speed(0), m_last_temperature(0),m_last_temperature_with_offset(0),//stops a couple compiler warnings - m_last_pressure(0), m_current_pressure(0), m_last_bed_temperature(0), m_last_bed_temperature_reached(true), m_lifted(0) {} @@ -50,10 +48,8 @@ class GCodeWriter { std::string set_bed_temperature(uint32_t temperature, bool wait = false); void set_acceleration(uint32_t acceleration); void set_travel_acceleration(uint32_t acceleration); - void set_pressure(double pressure); uint32_t get_acceleration() const; std::string write_acceleration(); - std::string write_pressure(); std::string reset_e(bool force = false); std::string update_progress(uint32_t num, uint32_t tot, bool allow_100 = false) const; // return false if this extruder was already selected @@ -107,8 +103,6 @@ class GCodeWriter { uint32_t m_current_acceleration; uint32_t m_current_travel_acceleration; double m_current_speed; - double m_current_pressure; - double m_last_pressure; uint8_t m_last_fan_speed; int16_t m_last_temperature; int16_t m_last_temperature_with_offset; diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 8abef6106aa..60c4ab3e0d3 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -572,8 +572,6 @@ static std::vector s_Preset_print_options { "top_solid_infill_acceleration", "travel_acceleration", "travel_deceleration_use_target", - "deceleration_match_to_er_acceleration", - "deceleration_factor", // skirt "skirts", "skirt_distance", diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index fe5af472200..ecf364e8b8b 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -199,8 +199,6 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver& /* ne "threads", "travel_acceleration", "travel_deceleration_use_target", - "deceleration_match_to_er_acceleration", - "deceleration_factor", "travel_speed", "travel_speed_z", "use_firmware_retraction", diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 68ae6a17909..1d8700dd169 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -5880,36 +5880,13 @@ void PrintConfigDef::init_fff_params() def->set_default_value(new ConfigOptionFloatOrPercent(1500, false)); def = this->add("travel_deceleration_use_target", coBool); - def->label = L("Decelerate with travel acceleration"); + def->label = L("Decelerate with target acceleration"); def->full_label = L("Use target acceleration for travel deceleration"); def->category = OptionCategory::speed; - def->tooltip = L("If selected, the travel move going to start the extrusion will use this acceleration value."); + def->tooltip = L("If selected, the deceleration of a travel will use the acceleration value of the extrusion that will be printed after it (if any) "); def->mode = comExpert | comSuSi; def->set_default_value(new ConfigOptionBool(true)); - def = this->add("deceleration_match_to_er_acceleration", coBool); - def->label = L("Enable ER deceleration"); - def->full_label = L("Use factor of ER acceleration for decelerations"); - def->category = OptionCategory::speed; - def->tooltip = L("If enabled gcode will set the deceleration value to deceleration_factor of the extrusion roles acceleration value, if disabled it will continue to use the firmwares deceleration value. " - "\n this is mainly used for klippers InputShaping algorithm" - "\n note: only supported with klipper firmware!"); - def->mode = comExpert | comSuSi; - def->set_default_value(new ConfigOptionBool(true)); - - def = this->add("deceleration_factor", coPercent); - def->label = L("Deceleration factor"); - def->full_label = L("Use percentage of ER acceleration for decelerations"); - def->category = OptionCategory::speed; - def->tooltip = L("choose your deceration rate" - "\nthis is mainly used for klippers InputShaping algorithm" - "\nfeel free to experiment with changing this value and let us know the results."); - def->min = 1; - def->max = 100; - def->sidetext = "%"; - def->mode = comExpert | comSuSi; - def->set_default_value(new ConfigOptionPercent(50)); - def = this->add("travel_speed", coFloat); def->label = L("Travel"); def->full_label = L("Travel speed"); @@ -7933,8 +7910,6 @@ std::unordered_set prusa_export_to_remove_keys = { "top_solid_infill_acceleration", "travel_acceleration", "travel_deceleration_use_target", -"deceleration_match_to_er_acceleration", -"deceleration_factor", "travel_speed_z", "wipe_advanced_algo", "wipe_advanced_multiplier", diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 6fc54189cf0..24949305e2c 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -1106,8 +1106,6 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionString, color_change_gcode)) ((ConfigOptionString, pause_print_gcode)) ((ConfigOptionString, template_custom_gcode)) - ((ConfigOptionBool, deceleration_match_to_er_acceleration)) - ((ConfigOptionPercent, deceleration_factor)) ) #ifdef HAS_PRESSURE_EQUALIZER diff --git a/src/slic3r/GUI/ConfigManipulation.cpp b/src/slic3r/GUI/ConfigManipulation.cpp index b4a4187f7b9..0ee54d26a50 100644 --- a/src/slic3r/GUI/ConfigManipulation.cpp +++ b/src/slic3r/GUI/ConfigManipulation.cpp @@ -540,7 +540,6 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig* config) toggle_field(el, config->opt_bool("milling_post_process")); bool have_default_acceleration = config->option("default_acceleration")->value > 0; - bool have_decleration_enabled = config->option("deceleration_match_to_er_acceleration")->value; for (auto el : { "perimeter_acceleration", "external_perimeter_acceleration", "thin_walls_acceleration" }) toggle_field(el, have_default_acceleration && have_perimeters); toggle_field("infill_acceleration", have_default_acceleration && have_infill); @@ -550,8 +549,6 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig* config) toggle_field("support_material_acceleration", have_default_acceleration && (have_support_material || have_brim || have_skirt)); toggle_field("support_material_interface_acceleration", have_default_acceleration && have_support_material && have_support_interface); toggle_field("brim_acceleration", have_default_acceleration && (have_brim || have_skirt)); - toggle_field("deceleration_match_to_er_acceleration", have_default_acceleration);// i guess this is enough checks? is there other firmware that supports decleration values ? and is it better to leave the firmware check for in gcodewriter? - toggle_field("deceleration_factor", have_default_acceleration && have_decleration_enabled); for (auto el : { "bridge_acceleration", "bridge_internal_acceleration", "overhangs_acceleration", "gap_fill_acceleration", "travel_acceleration", "travel_deceleration_use_target", "first_layer_acceleration" }) toggle_field(el, have_default_acceleration); From 662de8938bbc5a027569ab8d9c45cfcb6c3e7115 Mon Sep 17 00:00:00 2001 From: legend069 <40685552+legend069@users.noreply.github.com> Date: Sun, 11 Feb 2024 00:51:14 +1100 Subject: [PATCH 08/28] pressure advance calibration tool initial upload, still alot of work to-do! generates and slices model just fine. few bugs to workout, mainly with CalibrationPressureAdvDialog.cpp model sizing and what not per_objects_gcode i'm wanting to be a 'powerfull' tool that can be used, later it will be used to insert the smooth_time bits aswell. need help with inserting the per_objects_gcode where it's supposed to be :upside_down: currently it only writes it all at the start of the file(helps verifying it's correct) --- resources/calibration/filament_pressure/0.3mf | Bin 0 -> 1846 bytes resources/calibration/filament_pressure/1.3mf | Bin 0 -> 1645 bytes resources/calibration/filament_pressure/2.3mf | Bin 0 -> 1981 bytes resources/calibration/filament_pressure/3.3mf | Bin 0 -> 1994 bytes resources/calibration/filament_pressure/4.3mf | Bin 0 -> 1904 bytes resources/calibration/filament_pressure/5.3mf | Bin 0 -> 2002 bytes resources/calibration/filament_pressure/6.3mf | Bin 0 -> 2009 bytes resources/calibration/filament_pressure/7.3mf | Bin 0 -> 1737 bytes resources/calibration/filament_pressure/8.3mf | Bin 0 -> 2042 bytes resources/calibration/filament_pressure/9.3mf | Bin 0 -> 2003 bytes .../calibration/filament_pressure/90_bend.3mf | Bin 0 -> 1749 bytes .../filament_pressure/90_bend_V2.3mf | Bin 0 -> 1868 bytes .../filament_pressure/base_plate.3mf | Bin 0 -> 1660 bytes .../filament_pressure/filament_pressure.html | 41 ++ .../filament_pressure/pa_border_b.3mf | Bin 0 -> 1671 bytes .../filament_pressure/pa_border_s.3mf | Bin 0 -> 1679 bytes .../calibration/filament_pressure/point.3mf | Bin 0 -> 1642 bytes resources/localization/list.txt | 1 + resources/ui_layout/default/print.ui | 1 + resources/ui_layout/example/print.ui | 1 + src/libslic3r/GCode.cpp | 50 ++ src/libslic3r/GCodeWriter.cpp | 26 + src/libslic3r/GCodeWriter.hpp | 6 + src/libslic3r/Layer.cpp | 19 + src/libslic3r/Preset.cpp | 1 + src/libslic3r/Print.cpp | 1 + src/libslic3r/PrintConfig.cpp | 12 + src/libslic3r/PrintConfig.hpp | 55 +- src/slic3r/CMakeLists.txt | 2 + .../GUI/CalibrationPressureAdvDialog.cpp | 556 ++++++++++++++++++ .../GUI/CalibrationPressureAdvDialog.hpp | 36 ++ src/slic3r/GUI/GUI_App.cpp | 5 + src/slic3r/GUI/GUI_App.hpp | 1 + src/slic3r/GUI/MainFrame.cpp | 2 + 34 files changed, 799 insertions(+), 17 deletions(-) create mode 100644 resources/calibration/filament_pressure/0.3mf create mode 100644 resources/calibration/filament_pressure/1.3mf create mode 100644 resources/calibration/filament_pressure/2.3mf create mode 100644 resources/calibration/filament_pressure/3.3mf create mode 100644 resources/calibration/filament_pressure/4.3mf create mode 100644 resources/calibration/filament_pressure/5.3mf create mode 100644 resources/calibration/filament_pressure/6.3mf create mode 100644 resources/calibration/filament_pressure/7.3mf create mode 100644 resources/calibration/filament_pressure/8.3mf create mode 100644 resources/calibration/filament_pressure/9.3mf create mode 100644 resources/calibration/filament_pressure/90_bend.3mf create mode 100644 resources/calibration/filament_pressure/90_bend_V2.3mf create mode 100644 resources/calibration/filament_pressure/base_plate.3mf create mode 100644 resources/calibration/filament_pressure/filament_pressure.html create mode 100644 resources/calibration/filament_pressure/pa_border_b.3mf create mode 100644 resources/calibration/filament_pressure/pa_border_s.3mf create mode 100644 resources/calibration/filament_pressure/point.3mf create mode 100644 src/slic3r/GUI/CalibrationPressureAdvDialog.cpp create mode 100644 src/slic3r/GUI/CalibrationPressureAdvDialog.hpp diff --git a/resources/calibration/filament_pressure/0.3mf b/resources/calibration/filament_pressure/0.3mf new file mode 100644 index 0000000000000000000000000000000000000000..f18107e0e8281f4ecefcd353be1ad3d275b1cf12 GIT binary patch literal 1846 zcmWIWW@gc4U|`??Vg`mI^2aLwLxBK;2!pYUzHv%!eoAVN9++fg5MYSn0V`!lW`@vn z!(;Pj8;I1tTk@Cvi7m5Pd?UxL=_@bAsrg3NHyHYzKH|=zmi7I0`Fca&OIJ;1ewvUV zKfm~0`^((A?|013Ir1gnEoV)XQ|)`>5`Xn>vZLD8;^3n4-#>%zeVdvi!%&{=IB&|W z{MvdE|4mO9U%!_0;&|P1n~U4)BDU_CT^6$}7dN zCowyo%RLk|cJ|^aX1njkpWH0}D@%y$QsRtBM*}NWgEcE} z7c9+M`1t;dAL+r@pB3craH7f}@=-KlxV_u$f`ed^Sb*8m3EYU(Bwn zkolGQ{z|ALlWy6a!Y_4>`|hZJ;C%nS(|-OJ|Ne8{wLhb|mS##Ank|e>@7`s7@X@!2 z4{u*@>QK4YS|q+((YIBawXxu`#^k)1u!(1Gw1sB!ytpY;Q$DpukE6C!{kXa=m*2yz z1jgqbd1snx${5b?DG(0kQj6ny6r}I@aiT^2gi|w>BdrCiCaV3oFC544NaM%GD?4{y zZFYaLG;rFY$nU{Lh(xBFxk8z*h9OsA$AGS<9U$CLLso7rX zc$@uUS7W}Q_L_pjx)wJa?V2~gJ~Ugt(1W|?!@aE^4xZyYx30U9N&XVkd|SR7mIrT^ zUY4AGwua}0E?XhDq_~Ppp0iZ$61M&`^JMNgonzg(DDTyw3DTb7Mk!vOxwgJe)=@a` zQ+mV8C*no$irD)hLMQdKE;7Y%o>UPL^vL8t@uZk>-I6-TN9NBi&#Mydzqn7qo%@pC z&M%kRKh9V+JFmScGU}Yjr3Y^gc^~w>;E=C)MYr+myouVqi8`~gk}u!X@D=41s=CKy z5)M=&$IHj-!0JC~^6%5yXM1EUl4cgFe1ERUkv{p3z4W$EMXP4NDrHzSY13Q|r|DA* zpScAdy6f|yS9;^5V}&y|m^3T;@n>$GwAT3ZBO4aa=w%v`r!6LEmS?J#=c$}N<7+Nj zD(q!mcv5-BqDz$tr)zcjTONr04{V69XAD5eq#Pl7mtmPy7???;o%8cbQu9jULn;eW zi(~aFa&tiWG=vF~Ki@$phPgp!y^a_N*lGXZQw+}x7Ij%t%D*oE0e4Hutu$Y?g){Z; zZZE$S>bOyCPpZ-9zr4Zk)7~EuJeI<2_G#IgB@8ADx85)>TC}cW!tUj(PyhNVqR1(C z?8=Eo4Lhx=XBgs^8@V{VD@pt^Yllp==+?^1wkvM0+7+&*z!>B>)7j{@>)v)h|Gp!q z&&=KYP0>mJ=;una)25exo!Mw|#p;c{hI~|k{gslQb5g#0I7^Rg`?B&!N8r7!agVQL zI$u69TXV-bmg{q()>(D`*uDABelDqlOL^n(U;q1b;>7OnCO2mMD|0g_7PxWY=DGhT zCttpjWhq#w!p6P;oOt!e}!zs8ajSavd@dXgSZd z&-upgyH}bzB=%N()T(WqkXOIqr=q9p{d>9^8gk`n-;$pdRNV-?qq*#$HEXJ(;{@Y< zk}=B@PQ9&SU;a3&a>u0=#_2)!Eh;}wsu{D zzT>g;=#R4u%k=6tEUIJs)qLxq%lw+z+>dp`daveXZ9N(Mr0a~X_LQergEW=q95k zKXj9^CPoR2#JCh%d7vAP8d2zmqePnoMzq~vfw(!qn~hBe>U>C;KsZo48DKOIG}=$F d!u7F(SXbB}e2{d2H!GOO4Accu4+=d71^`pQ`E39I literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/1.3mf b/resources/calibration/filament_pressure/1.3mf new file mode 100644 index 0000000000000000000000000000000000000000..dd8f331777cdd958faca0ed394aaf231542546ae GIT binary patch literal 1645 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 TI>4J1EXxek1yTGVY>3RFEycMpm8FtL~ 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 literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/5.3mf b/resources/calibration/filament_pressure/5.3mf new file mode 100644 index 0000000000000000000000000000000000000000..37135fa686054839c97f3b2ca723f1f731a187c8 GIT binary patch literal 2002 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 T9pKFh<}m|xfz*RSkAVRI<&(vC literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/8.3mf b/resources/calibration/filament_pressure/8.3mf new file mode 100644 index 0000000000000000000000000000000000000000..8804502d5dc5a843e711f7cce55469b7cb8a139c GIT binary patch literal 2042 zcmZ{l3pCW}8^?bJ!xB5zRJ6k^V>8Se*OfG`Gn_Wc7`K|Dq9K#UU1k~~l64&+cMiGV zV%-h7tSlK*7?<27`cp`hajSo#JxBfjzjJ=i^Lu~q`#$G=KhJZ%58i~APYD13!Ot%M zbWZl5KJ7ga01Bw%l+~|XcfCS#L4UD400eLl`?3^}=iBvZXS*oVno!$3{Z9s$25F3Y zq%MY|W)Lt2MGn&gOwIok(m9|L!J_*u<(xeKB)AgOVK2Kp>dE$F2+416jC0sVtJwZ3 z$xJ(aSkJrC{Ncd}Q-?X}jzQ(7Pxm!#Wyk`}3yhc=cMROmf6_IpQ{Z8N?}Ui$aazN* zt+K1{d=x!(&*+qK8(!ae3aVe>HBK!kX^+sbvbBknFfwDToPC9qC$7!F*R!Oex`WhC zi@I3ZO=M?3pI$de_nbH=4$p*zDGWrN`B5zmH_lntvc53el(7CZSGr^hkNOGu!fsQN z8x#U=$+LS~DrI!S-sev^j<0?*&QSTCEZj4%`{$S#|Dy6kZIVqHQ&US#lTz;NMhTpM z;NdvBbKWc;Hg-cB{}+&zLPLY;pkBn%e5wBebMB3$k#QoFS)%2kgYd`v^Hy9}PuxFh zH6e4QXmK@T@>F;e~Y6;G42lO@)XOE@|%jW&vMKqGi2?K z8i6ujJ^yKIrP3aNUA!Gpxnmf^_{=7X$xtNT2B{CpqfJ}q%hn1 zicajdLt?ZTIc~pTbfDIgi3DOw1sH5cZ?3F%B8B_vlTD5f5MB!waq4Z3C6_d2ji=k6 zt6n2ZEqBcp2i9QRK(1!9#gxPhgfxRFzqZa-nlm8gqi~!yKq#7vzzCfXb?U#jjOn=c zA0I!|J!;v^1Gzd^uKG(K@{NU$E3}7ly0|U5_zk#dwO4So(hHLZrUzujV9gRr5(K zaZ>#i4@x-o+~G&ZLW9f=bcI&ILA8}Q!`Y+Ry~gC18ixfE7#0Yn`9fuAT?~gH)1Qpu z6i1&6!dQ)E-cK#-G08W&Se0sT(xaH4sF)*i6$xzxNW%e(4RzM0-eHRQj{%F4dv7M= zldjz{IU9)Lxad1Z;m3aSBtp+O1yEGnnyiy8Wt2(?^IEDSA*T>aW?_cO!eM0}5(+0KCd>GE_>zQ6H<059OdZYQ9=9 zykBG5B})7GBpmP~yf<9TAd`Z^<<-tT-TNs_z#!AIvJ~LO>%G zk&AxfukXgTU7$8jyKh}iXGPlFoqpe}y2&}Y3dA`kXnR}9sYAMzv@2DTHa3>{z1Lcq zx%CM-AL&20nGok6Qqty}3+G?Z#3T3~xSJ-SZr6G}$Qor*lT>PuRM<0FC)o_wW;5sC z!`hRm%l3kOIS*sYLlM&8R*?^?HxTBq(V&2TRIXgE4Zn?rgs#sfZxE#Ef#dRo}6?JXAhsyjQ-OlLX zkFkm;Wa!y*_NUI+J`VY~*sVt1{m48Artg16Cj1%MMGumTr!soS?w}Ip*=1C*hl&*4 zE!3(434SW{2s^|aUKwyJLgNqPO?W^`!2jz;u)T`~eD*sWzVA&E-}R=wEx@;t_m|(d zk^g5gN_v!k@z<&V~31(pc literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/9.3mf b/resources/calibration/filament_pressure/9.3mf new file mode 100644 index 0000000000000000000000000000000000000000..58fe1bbf199caf3c2ad2101b58878f2098fd9815 GIT binary patch literal 2003 zcmZ{l3p~^N8^?df=CU|DHCh*A|3=C^w~^diN|+Iaa-3TKnhax@bU|q|Ws+7de`lCQ z<&q}3bqF09P6gpWDh{-1)DR+(8UBqevTKw^#R_dj6<8>#Q35VZzpXA|n)(!+z_gK=y zh>3M*A(XZ$#zyG6;D7l5Qj{FKF!P9&yMg%B3Yg+vu5qS{KF>D>I6cxX36fy;KD3XC zeLZ($YQL=pf+beav(dl~U665|(?qw6EbgEW3MyPT=OYx!Q+|o$+^C%SL&#}CUA1Sy z;oo~oXATm>BG1&Mjbl_kwrS-%8gu&c-nbR)DJ>@8&130j?lnHJqJ*e$y;JR0NA=~< z2marQmRKvdoU}*HYX(S!n;pm+o1kHRu2hPYDC5L4V*o z%PN@2W6x?;`XAHrAdU4kakketeGv#!Y+dl2eH0pT%$w3C!UWPYIn+Tc)!8IfpvPX- zdDG?H^JlMk==$f|jcfIC2e%|c)Iu-5w%-9OQ5h^;J9%02ES;)L-w=H~F@P>M#9IcT z&7p55bu#7xpoVf`@Hv0tL{|4Z^_UDrP?^r8_Av`P47FM zes@ZZE2mzYjZ6wH%tY8%2~B76l@=b3?sJZ|pXr!v3NFaOY_1ada$zM=7Fs9XrOELyyZ*$&cq9GFz<_wK}hctcNzz4VAV#I+oxO%gd1`OK|P))AljbhC@B zg;|@e9eg@)4B4$*FIBoj%ih9<6aTrHn4zvv)(tDVteTN_eiv&o%r5F~xTH*QQ$wOA z))6D^cJi2q%k*kar43VRKPlL&uBtLA&L~TKv7cv%zy`t;Zbt zv!20wuIlCS1N&J?*rfIY)UdpG#5D41m+7w_s?}jv-v07aE9l;8%GjMjCbk;G2ais) z_(&Mm67b7c?#k~5LU1b-M8V5I@J&J1EGmefV+bjNK#Bultto@IzwWs0#m?FbZtj;FTideBXHX7?O=7Bft6A4aDGghHt2?Fe15qy=#pkrLkhVP(t%~$vZSGJnkrXoVlg4UG7$~N*_YAORK}mCz1QX=u}0yr-p=Rk3;Z;JkZAey=~~&9$ijPuuYN-YT|^c@CY%U2 zG+44rsGu^-jLM~`2q{mL8jN7)I+W@hd#n3}@iatj^!u%+;+Ui}rJqo{cMiPN*U>>n z9i2Hm78=v*A=*++Q?BiG z_vSXpli%L8@y-5}tPTk#Rc#VE-*1vU0SXLGm*$>^%qH~JJLSY?LWlLeFLslNJig~h zQk%Z+mC;+D6R|MfC3OOLf41$f?<)*0f{Ha|#_c8LwDh$&7a5Q~@NZ*gqx8qlF8U=7 zKMozl4?{<~1^7Pm%J%y{^FKBt;)iB*kWRMmldmk)_sLh34e>+SDB$HY<6IyRJ?Zh6 rnJmA^O22*ctE6QoK>pq*zw{LL)dIj$80P~18kGfPfu;3J^Z?*5BsNjL literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/90_bend.3mf b/resources/calibration/filament_pressure/90_bend.3mf new file mode 100644 index 0000000000000000000000000000000000000000..d7be1abe72eeb7ecc4af7c8658712b463cfb1e4f GIT binary patch literal 1749 zcmWIWW@gc4U|`??Vg?3}f`4NFp+JB^gu&QF-#8^VKP5Fs4@@#L2rz8o1S@4=VusLj z!=m$N8%Wf?Tk@CvbhX-zJFlFb)Uv+6{x0d`yls+6_EnKL zkBiThZ=Cz(-OhC<7D%3{B;g zvdXg9KGme?f(8Hm@>|;vQNW}o+`Zd z%8FfO_^+a;-l#N}@As)m2||x=`mbMSa-~_yDj;|9!i#EF4>vU=mF5SnY1LUWZOKH_ zlrQcpwHLVTfAjI_?QogJDfb=u?=rGm>=o5%U#1}Rzv!m(t8*;M(n_}%249$Mu5y3X zwyfR9*U5fcqGR-`chPZ4qjTwBF4wl~|M%CnbotbGMK4XRJlpT^a$;L>cKC+*$Ij(c zya_egQ(N)lljY)_@(%MhT!}Fd^;r$ov zdoR5ZH}BGXE^@tBwjtf<(aG+c4ih^fJ8VBoYnsU!+fVU%7!&uw?9#)NZY??;1^*Yc z9XAUUXt$Z^@-O{tWHO)l>DeIoe5t}Ur1d=m<6uUl+hadOuN-lNZcDa}8+_IuM; zbM`%YHqVbKU0CBZ2)r8mYjJ$BFM*gP~=c0fj z^^h3LM)j7-o12uE2gv+kak8m&zrWJ@)MEXT?0pRnFUtp@EO@gbE3sl~B+6}dT}Y!t!-$v*EO6vN!0vtCCG1njhb@F|9828+5ZDdk_6|A4!t zF=6-e z)u(@b6;b4rJ9gznqlTT<)H4im%Z*$d-jyVNnYBZvT6AmWW!n|ESM3T{Q(z2ooat%lanuB$+8rz+slj^WX0DWPlE*+H!#TJi&Arn_4Pm`D5$s@Az`!`8dRzM zXSog;2(+B%+UI;@_uVT^9TIyhK5ErAPROg@@Ke##_5M9w4Gp>Sv~S7J3aV}d-qBok z(3&+>(Q$(DKFOHn38&sxu`hp|Rk`ER3gh%3`xccSCskQ%&n5QH@bM2@eu%y3%@(_; zxj%bk*>dxCDc|wfdGyCwhGlwn8y3~E{c65-&}DwjZ0^UpVZB%LvbLTKe$sVDS9{9S zHNV^31h)3crm{xNwNLuEO|O?}odV-?#~+(Jriur6GcxHi;3{ZkpdM=g(x7m_EOsR@ zie0D{26U5AlOMXtSQDcJMq+e69@-t mCj*S;fkt~eD_kEth*iu6;e(_Dyjj6KW}q&RdQj*wFaQ9Fy5d;? literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/90_bend_V2.3mf b/resources/calibration/filament_pressure/90_bend_V2.3mf new file mode 100644 index 0000000000000000000000000000000000000000..46f53a5158f2f1ec7c7c4873be850746f387e9a7 GIT binary patch literal 1868 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 literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/filament_pressure.html b/resources/calibration/filament_pressure/filament_pressure.html new file mode 100644 index 00000000000..019e9cee723 --- /dev/null +++ b/resources/calibration/filament_pressure/filament_pressure.html @@ -0,0 +1,41 @@ + + + + + Pressure Advance Calibration + + + + + + + + + + + +
+

Pressure/Linear Advance

+
+ + +
Needs:Bed Leveling and Layer Squish to be perfect
+
+
+ +

this test is still in development, beta should work "ok" for now though.
your current print settings will need to be saved before clicking "generate" since it uses the saved values to create the model

+

note: this test will auto pull all your currently loaded config parameters and generate a model for you to print!
for to help with firmware speed/processing limitations it's reccomended to have most extrusion roles similar set to speeds.

+ +

How to tune your printer for Pressure/Linear Advance

+

todo add detaisl here

+

Advice

+

Before doing this test, it's preferable to tune everything else first!
i would reccomended setting XXXX to the same speeds, XXX to a slow speed, and everything else you can send it with.

+

note: having large variance with ER speeds can reduce print quality/dimensional accuracy this is effect is mainly caused by the inner perimeter getting pulled closer to the external perimeter as it cools down, since each perimeter would be at different temperatues.

+

TODO add things about PA and setting first layer correctly
add notes about fan speed and disabling fan speed for this test, or do i have check box in GUI that would auto change relavent UI tab?

+
    +
  • bullet points
  • +
+

Notes

+

TODO: add cred for andrew ellis testing method

+ + diff --git a/resources/calibration/filament_pressure/pa_border_b.3mf b/resources/calibration/filament_pressure/pa_border_b.3mf new file mode 100644 index 0000000000000000000000000000000000000000..808c25c8c950b36030c63c7d4cafa6312ac2e553 GIT binary patch literal 1671 zcmWIWW@gc4U|`??Vg`l{0_=?cp+JB^gu&QF-#8^VKP5Fs4@@#L2rw*V2PAc8fJFy7IqLoTtgH~o0_w`5$X&pE*BlJ@IeZz{$s$5>-saxe| zn7`jUb7T7F*~{0dx?f0M{Hy8HTz}3lL7~3?11_Ar66ck_&c6PXb*Q7az@2{9T9Y&j z1G7`^FOKYZEw%FMimc6(S0yK2?W|kXYBJePOl>Ng*bkeuI){^2%$F^Qy}Zqroy}zH zoc6E?%NKih&;RUXFSm<3)v7V4HzR&&+UE9$PV*dBXH8-|{cy%Nb@!*OKB^t-M30#i zowJ|$Io>BW>hQ)=m53uxo}^C^my&YylUnkM_sg-g>4x@;ZroihQ?00#$nw&ao%Qe4 z8DbiS=b7*Q`O%j>g-6Qmf_uz^FIJzuUuY|Ri0u+ADpQ(qQ(&c(*--`Kja*jQD@!Eyk&*uB2_?zwAORGC&`}Fvu-JUpqmAWkyuPIr@nt5Ay9stsa+nvZK`b&U1XH{1Mj+WyU6y#6n1 z07|Oo2+_L?OZCFQR3Gh}pI4HaR}vpmS&&*Bt5=bm14{TI&;#K+&r`)kCCmJ>Ew5Fb6h+A&t;_$8{@yo0oGS#A6 zD=*uwxV>suxS9fEkmF2equZ`~+x`6ej+{O-ck?$zC;g+JE6q-uUix)rqsbMkH})Fx zQ3du_N_x&o`R?H?J+ke~${!tp_qN78zLM#D`NV9^9p_lC&xu-R)%|1l=0E$nqz*3S zjlX~W@6(AByT6;?ECB0)jL%?Jsj&CsAq?LW(P$UvawJl8(w8@umbY3h*JTk%n=wsAsU{f3{4p04-r z>1t@mm8X46epXO*Bk+#qvV+#FsfvyhjQ2^#EKfM~wu*iEYXw@dks$Ihca&N3|1tJ|=sj_p_Tt%EM}Yi4sl z)(z{unwPcpWbl)&GrHPSp04@b<|eSUPd1e`Vy=DC$8CDOOzRXFpF958+%Z)=z?+dt zmjPGNCH)!HSHykyh&<#h4HVKSq z(`13TIl!BZO$X|HNSHu4%uq2H%>#{gNmjT%aAl#&2H}IG1H4(mJZ1)F29SDC=rJ$= E07LVpU;qFB literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/pa_border_s.3mf b/resources/calibration/filament_pressure/pa_border_s.3mf new file mode 100644 index 0000000000000000000000000000000000000000..0f1d4fd0ca8419e4d036169b530bae6876372808 GIT binary patch literal 1679 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 literal 0 HcmV?d00001 diff --git a/resources/localization/list.txt b/resources/localization/list.txt index 8eb97365b74..39cb74d0df2 100644 --- a/resources/localization/list.txt +++ b/resources/localization/list.txt @@ -12,6 +12,7 @@ src/slic3r/GUI/CalibrationCubeDialog.cpp src/slic3r/GUI/CalibrationFlowDialog.cpp src/slic3r/GUI/CalibrationOverBridgeDialog.cpp src/slic3r/GUI/CalibrationRetractionDialog.cpp +src/slic3r/GUI/CalibrationPressureAdvDialog.cpp src/slic3r/GUI/CalibrationTempDialog.cpp src/slic3r/GUI/ConfigManipulation.cpp src/slic3r/GUI/ConfigSnapshotDialog.cpp diff --git a/resources/ui_layout/default/print.ui b/resources/ui_layout/default/print.ui index 39807c5bef4..36c94fcc4f5 100644 --- a/resources/ui_layout/default/print.ui +++ b/resources/ui_layout/default/print.ui @@ -495,6 +495,7 @@ group:Output file setting:full_width:output_filename_format group:Other gcode_substitutions + setting:per_objects_gcode group:Post-processing script setting:full_width:height$5:post_process post_process_explanation diff --git a/resources/ui_layout/example/print.ui b/resources/ui_layout/example/print.ui index 86badd553a9..ab88c99ed9a 100644 --- a/resources/ui_layout/example/print.ui +++ b/resources/ui_layout/example/print.ui @@ -489,6 +489,7 @@ group:Output file setting:full_width:output_filename_format group:Other gcode_substitutions + setting:per_objects_gcode group:Post-processing script setting:full_width:height$5:post_process post_process_explanation diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 1bd8201931a..274560343a9 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -815,6 +815,7 @@ namespace DoExport { if (ret.size() < MAX_TAGS_COUNT) check(_(L("Color Change G-code")), GCodeWriter::get_default_color_change_gcode(config)); if (ret.size() < MAX_TAGS_COUNT) check(_(L("Pause Print G-code")), GCodeWriter::get_default_pause_gcode(config)); if (ret.size() < MAX_TAGS_COUNT) check(_(L("Template Custom G-code")), config.template_custom_gcode.value); + //if (ret.size() < MAX_TAGS_COUNT) check(_(L("Per object G-code")), config.per_objects_gcode.value); //not needed yet ? if (ret.size() < MAX_TAGS_COUNT) { for (const std::string& value : config.start_filament_gcode.values) { check(_(L("Filament Start G-code")), value); @@ -1422,6 +1423,54 @@ void GCode::_do_export(Print& print_mod, GCodeOutputStream &file, ThumbnailsGene file.write_format("; first layer extrusion width = %.2fmm\n", region.flow(*first_object, frPerimeter, first_layer_height, 0).width()); file.write_format("\n"); } + + size_t nb_parts_per_object = 0; + size_t nb_parts_per_target_volume = 0; + std::string volume_config_per_object_gcode = ""; + + if (print.default_region_config().per_objects_gcode.value != "") {// mabye add check for project name/ base object name ? user doesn't normally add models inside another model. + + std::string per_object_target_name = print.default_region_config().per_objects_gcode.value;// pull main config object names to apply modifer gcode to + std::istringstream iss(per_object_target_name); + std::vector target_objects; + + file.write("; target object name: " + per_object_target_name + "\n"); + if (!per_object_target_name.empty() && per_object_target_name.back() != ',') { + throw Slic3r::SlicingError(_(L("no ending comma found, fix per object in main print settings config! each object you want to apply settings to much be seperated by a comma!"))); + } + std::string search_for_comma; + while (std::getline(iss, search_for_comma, ',')) { + target_objects.push_back(search_for_comma); + } + + for (PrintObject* print_object : print.objects()) { //loop though main objects + std::string volume_name = ""; + auto part_details = print_object->model_object()->volumes; + + for (const auto& volume : part_details) {//loop though object volumes - object parts + volume_name = volume->name; + + for (const auto& target_object : target_objects) {//loop though each volume + if (volume_name == target_object) { + nb_parts_per_target_volume++; + auto volume_config = volume->config.option("per_objects_gcode");//pull per volume config + if (volume_config) {//failsafe check, maybe user forgot to add the manipulator in + volume_config_per_object_gcode = volume->config.opt_serialize("per_objects_gcode"); + file.writeln(volume_config_per_object_gcode); + m_writer.set_per_object_gcode(volume_config_per_object_gcode); + } + break; + } + } + + nb_parts_per_object++; + } + } + } + + file.write("; Total parts per object: " + std::to_string(nb_parts_per_object) + "\n"); + file.write("; Total parts per target volume: " + std::to_string(nb_parts_per_target_volume) + "\n"); + BoundingBoxf3 global_bounding_box; size_t nb_items = 0; for (PrintObject *print_object : print.objects()) { @@ -1476,6 +1525,7 @@ void GCode::_do_export(Print& print_mod, GCodeOutputStream &file, ThumbnailsGene file.write("M486 T" + std::to_string(nb_items) + "\n"); } if (this->config().gcode_label_objects) { + file.write("; Total objects to print: " + std::to_string(nb_items) + "\n"); file.write_format( "; plater:{\"center\":[%f,%f,%f],\"boundingbox_center\":[%f,%f,%f],\"boundingbox_size\":[%f,%f,%f]}\n", global_bounding_box.center().x(), global_bounding_box.center().y(), 0., global_bounding_box.center().x(), global_bounding_box.center().y(), global_bounding_box.center().z(), diff --git a/src/libslic3r/GCodeWriter.cpp b/src/libslic3r/GCodeWriter.cpp index dd3fc8909c0..7fe7773ea9e 100644 --- a/src/libslic3r/GCodeWriter.cpp +++ b/src/libslic3r/GCodeWriter.cpp @@ -278,6 +278,32 @@ void GCodeWriter::set_acceleration(uint32_t acceleration) m_current_acceleration = acceleration; } + +void GCodeWriter::set_per_object_gcode(std::string per_object) +{ + if (per_object == m_current_per_object_gcode) + return; + + m_current_per_object_gcode = per_object; +} + +std::string GCodeWriter::write_per_object_gcode(){ + if (m_current_per_object_gcode == m_last_per_object_gcode || m_current_per_object_gcode == "") + return ""; + + m_last_per_object_gcode = m_current_per_object_gcode; + + std::ostringstream gcode; + + + gcode << m_current_per_object_gcode; + if (this->config.gcode_comments) gcode << " ; added per_object_gcode"; + gcode << "\n"; + + return gcode.str(); +} + + void GCodeWriter::set_travel_acceleration(uint32_t acceleration) { //only gcfMarlinFirmware and gcfRepRap can use the travel accel diff --git a/src/libslic3r/GCodeWriter.hpp b/src/libslic3r/GCodeWriter.hpp index 7d46974a7e1..1b65c8a5860 100644 --- a/src/libslic3r/GCodeWriter.hpp +++ b/src/libslic3r/GCodeWriter.hpp @@ -21,6 +21,8 @@ class GCodeWriter { multiple_extruders(false), m_extrusion_axis("E"), m_tool(nullptr), m_single_extruder_multi_material(false), m_last_acceleration(0), m_current_acceleration(0), m_current_speed(0), + m_current_travel_acceleration(0),m_last_fan_speed(0), m_last_temperature(0),m_last_temperature_with_offset(0),//stops a couple compiler warnings + //m_current_gcode_per_object(""),m_last_per_object_gcode(""), m_last_bed_temperature(0), m_last_bed_temperature_reached(true), m_lifted(0) {} @@ -50,6 +52,8 @@ class GCodeWriter { void set_travel_acceleration(uint32_t acceleration); uint32_t get_acceleration() const; std::string write_acceleration(); + void set_per_object_gcode(std::string per_object); + std::string write_per_object_gcode(); std::string reset_e(bool force = false); std::string update_progress(uint32_t num, uint32_t tot, bool allow_100 = false) const; // return false if this extruder was already selected @@ -103,6 +107,8 @@ class GCodeWriter { uint32_t m_current_acceleration; uint32_t m_current_travel_acceleration; double m_current_speed; + std::string m_current_per_object_gcode; + std::string m_last_per_object_gcode; uint8_t m_last_fan_speed; int16_t m_last_temperature; int16_t m_last_temperature_with_offset; diff --git a/src/libslic3r/Layer.cpp b/src/libslic3r/Layer.cpp index 6195d21941c..a44006d030a 100644 --- a/src/libslic3r/Layer.cpp +++ b/src/libslic3r/Layer.cpp @@ -220,6 +220,25 @@ void Layer::make_perimeters() && config.fuzzy_skin == other_config.fuzzy_skin && config.fuzzy_skin_thickness == other_config.fuzzy_skin_thickness && config.fuzzy_skin_point_dist == other_config.fuzzy_skin_point_dist + + && config.bridge_acceleration == other_config.bridge_acceleration + && config.bridge_internal_acceleration == other_config.bridge_internal_acceleration + && config.brim_acceleration == other_config.brim_acceleration + && config.default_acceleration == other_config.default_acceleration + && config.external_perimeter_acceleration == other_config.external_perimeter_acceleration + && config.first_layer_acceleration == other_config.first_layer_acceleration + && config.gap_fill_acceleration == other_config.gap_fill_acceleration + && config.infill_acceleration == other_config.infill_acceleration + && config.ironing_acceleration == other_config.ironing_acceleration + && config.overhangs_acceleration == other_config.overhangs_acceleration + && config.perimeter_acceleration == other_config.perimeter_acceleration + && config.solid_infill_acceleration == other_config.solid_infill_acceleration + && config.support_material_acceleration == other_config.support_material_acceleration + && config.support_material_interface_acceleration == other_config.support_material_interface_acceleration + && config.thin_walls_acceleration == other_config.thin_walls_acceleration + && config.top_solid_infill_acceleration == other_config.top_solid_infill_acceleration//compiles fine with moving them here, how to properly test this ? + && config.per_objects_gcode == other_config.per_objects_gcode + ) { layerms.push_back(other_layerm); done[it - m_regions.begin()] = true; diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 60c4ab3e0d3..2e00a6ec8de 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -628,6 +628,7 @@ static std::vector s_Preset_print_options { "gcode_substitutions", "infill_extruder", "solid_infill_extruder", "support_material_extruder", "support_material_interface_extruder", "ooze_prevention", "standby_temperature_delta", "interface_shells", + "per_objects_gcode", // width & spacing "extrusion_spacing", "extrusion_width", diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index ecf364e8b8b..3ff8cbea103 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -69,6 +69,7 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver& /* ne "chamber_temperature", "before_layer_gcode", "between_objects_gcode", + "per_objects_gcode", "bridge_acceleration", "bridge_internal_acceleration", "bridge_fan_speed", diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 1d8700dd169..289878f06fe 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -663,6 +663,18 @@ void PrintConfigDef::init_fff_params() def->mode = comExpert | comPrusa; def->set_default_value(new ConfigOptionString("")); + def = this->add("per_objects_gcode", coString); + def->label = L("Per object G-code"); + def->category = OptionCategory::customgcode; + def->tooltip = L("This code is inserted at the start of every object. it's main advantage is when you use it as a object modifer(right click on a model to add it there)" + "\nadd here the model names you want to insert the gocde for eg:'90_bend.3mf' if you have several seperate them with ',' no spaces in any target file name!" + "\nthe code will search for that object name and insert the custom gcode per that object only."); + def->multiline = true; + def->full_width = true; + def->height = 10; + def->mode = comExpert | comPrusa; + def->set_default_value(new ConfigOptionString("")); + def = this->add("bottom_solid_layers", coInt); //TRN To be shown in Print Settings "Bottom solid layers" def->label = L("Bottom"); diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 24949305e2c..2304019e155 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -930,6 +930,27 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionFloat, top_solid_min_thickness)) ((ConfigOptionFloatOrPercent, top_solid_infill_speed)) ((ConfigOptionBool, wipe_into_infill)) + + + ((ConfigOptionFloatOrPercent, bridge_acceleration)) + ((ConfigOptionFloatOrPercent, bridge_internal_acceleration)) + ((ConfigOptionFloatOrPercent, brim_acceleration)) + ((ConfigOptionFloatOrPercent, default_acceleration)) + ((ConfigOptionFloatOrPercent, external_perimeter_acceleration)) + ((ConfigOptionFloatOrPercent, first_layer_acceleration)) + ((ConfigOptionFloatOrPercent, gap_fill_acceleration)) + ((ConfigOptionFloatOrPercent, infill_acceleration)) + ((ConfigOptionFloatOrPercent, ironing_acceleration)) + ((ConfigOptionFloatOrPercent, overhangs_acceleration)) + ((ConfigOptionFloatOrPercent, perimeter_acceleration)) + ((ConfigOptionFloatOrPercent, solid_infill_acceleration)) + ((ConfigOptionFloatOrPercent, support_material_acceleration)) + ((ConfigOptionFloatOrPercent, support_material_interface_acceleration)) + ((ConfigOptionFloatOrPercent, thin_walls_acceleration)) + ((ConfigOptionFloatOrPercent, top_solid_infill_acceleration)) + ((ConfigOptionFloatOrPercent, travel_acceleration)) //compiles fine with moving them here, how to properly test this ? + + ((ConfigOptionString, per_objects_gcode)) ) @@ -1131,11 +1152,11 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( ((ConfigOptionFloatOrPercent, avoid_crossing_perimeters_max_detour)) ((ConfigOptionPoints, bed_shape)) ((ConfigOptionInts, bed_temperature)) - ((ConfigOptionFloatOrPercent, bridge_acceleration)) - ((ConfigOptionFloatOrPercent, bridge_internal_acceleration)) + //((ConfigOptionFloatOrPercent, bridge_acceleration)) + //((ConfigOptionFloatOrPercent, bridge_internal_acceleration)) ((ConfigOptionInts, bridge_fan_speed)) ((ConfigOptionInts, bridge_internal_fan_speed)) - ((ConfigOptionFloatOrPercent, brim_acceleration)) + //((ConfigOptionFloatOrPercent, brim_acceleration)) ((ConfigOptionInts, chamber_temperature)) ((ConfigOptionBool, complete_objects)) ((ConfigOptionFloat, parallel_objects_step)) @@ -1144,12 +1165,12 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( ((ConfigOptionEnum, complete_objects_sort)) ((ConfigOptionFloats, colorprint_heights)) //((ConfigOptionBools, cooling)) - ((ConfigOptionFloatOrPercent, default_acceleration)) + //((ConfigOptionFloatOrPercent, default_acceleration)) ((ConfigOptionInts, disable_fan_first_layers)) ((ConfigOptionEnum, draft_shield)) ((ConfigOptionFloat, duplicate_distance)) ((ConfigOptionBool, enforce_retract_first_layer)) - ((ConfigOptionFloatOrPercent, external_perimeter_acceleration)) + //((ConfigOptionFloatOrPercent, external_perimeter_acceleration)) ((ConfigOptionInts, external_perimeter_fan_speed)) ((ConfigOptionFloat, extruder_clearance_height)) ((ConfigOptionFloat, extruder_clearance_radius)) @@ -1162,18 +1183,18 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( ((ConfigOptionStrings, filament_notes)) ((ConfigOptionPercents, filament_max_overlap)) ((ConfigOptionPercents, filament_shrink)) - ((ConfigOptionFloatOrPercent, first_layer_acceleration)) + //((ConfigOptionFloatOrPercent, first_layer_acceleration)) ((ConfigOptionInts, first_layer_bed_temperature)) ((ConfigOptionFloatOrPercent, first_layer_speed)) ((ConfigOptionFloatOrPercent, first_layer_infill_speed)) ((ConfigOptionFloat, first_layer_min_speed)) ((ConfigOptionInts, first_layer_temperature)) ((ConfigOptionInts, full_fan_speed_layer)) - ((ConfigOptionFloatOrPercent, gap_fill_acceleration)) + //((ConfigOptionFloatOrPercent, gap_fill_acceleration)) ((ConfigOptionInts, gap_fill_fan_speed)) - ((ConfigOptionFloatOrPercent, infill_acceleration)) + //((ConfigOptionFloatOrPercent, infill_acceleration)) ((ConfigOptionInts, infill_fan_speed)) - ((ConfigOptionFloatOrPercent, ironing_acceleration)) + //((ConfigOptionFloatOrPercent, ironing_acceleration)) ((ConfigOptionFloat, lift_min)) ((ConfigOptionInts, max_fan_speed)) ((ConfigOptionFloatsOrPercents, max_layer_height)) @@ -1193,9 +1214,9 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( ((ConfigOptionBool, only_retract_when_crossing_perimeters)) ((ConfigOptionBool, ooze_prevention)) ((ConfigOptionString, output_filename_format)) - ((ConfigOptionFloatOrPercent, overhangs_acceleration)) + //((ConfigOptionFloatOrPercent, overhangs_acceleration)) ((ConfigOptionInts, overhangs_fan_speed)) - ((ConfigOptionFloatOrPercent, perimeter_acceleration)) + //((ConfigOptionFloatOrPercent, perimeter_acceleration)) ((ConfigOptionInts, perimeter_fan_speed)) ((ConfigOptionStrings, post_process)) ((ConfigOptionString, print_custom_variables)) @@ -1217,15 +1238,15 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( ((ConfigOptionInt, skirts)) ((ConfigOptionFloats, slowdown_below_layer_time)) ((ConfigOptionBool, spiral_vase)) - ((ConfigOptionFloatOrPercent, solid_infill_acceleration)) + //((ConfigOptionFloatOrPercent, solid_infill_acceleration)) ((ConfigOptionInts, solid_infill_fan_speed)) ((ConfigOptionInt, standby_temperature_delta)) - ((ConfigOptionFloatOrPercent, support_material_acceleration)) + //((ConfigOptionFloatOrPercent, support_material_acceleration)) ((ConfigOptionInts, support_material_fan_speed)) - ((ConfigOptionFloatOrPercent, support_material_interface_acceleration)) + //((ConfigOptionFloatOrPercent, support_material_interface_acceleration)) ((ConfigOptionInts, support_material_interface_fan_speed)) ((ConfigOptionInts, temperature)) - ((ConfigOptionFloatOrPercent, thin_walls_acceleration)) + //((ConfigOptionFloatOrPercent, thin_walls_acceleration)) ((ConfigOptionInt, threads)) ((ConfigOptionPoints, thumbnails)) ((ConfigOptionString, thumbnails_color)) @@ -1238,8 +1259,8 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( ((ConfigOptionFloat, time_start_gcode)) ((ConfigOptionFloat, time_toolchange)) ((ConfigOptionInts, top_fan_speed)) - ((ConfigOptionFloatOrPercent, top_solid_infill_acceleration)) - ((ConfigOptionFloatOrPercent, travel_acceleration)) + //((ConfigOptionFloatOrPercent, top_solid_infill_acceleration)) + //((ConfigOptionFloatOrPercent, travel_acceleration)) ((ConfigOptionBool, travel_deceleration_use_target)) ((ConfigOptionBools, wipe)) ((ConfigOptionBool, wipe_tower)) diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index c11f860c59b..97a4520446d 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -38,6 +38,8 @@ set(SLIC3R_GUI_SOURCES GUI/CalibrationTempDialog.hpp GUI/CalibrationRetractionDialog.cpp GUI/CalibrationRetractionDialog.hpp + GUI/CalibrationPressureAdvDialog.cpp + GUI/CalibrationPressureAdvDialog.hpp GUI/ConfigSnapshotDialog.cpp GUI/ConfigSnapshotDialog.hpp GUI/CreateMMUTiledCanvas.cpp diff --git a/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp b/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp new file mode 100644 index 00000000000..61b188b0e36 --- /dev/null +++ b/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp @@ -0,0 +1,556 @@ +#include "CalibrationPressureAdvDialog.hpp" +#include "I18N.hpp" +#include "libslic3r/Utils.hpp" +#include "libslic3r/CustomGCode.hpp" +#include "libslic3r/Model.hpp" +#include "libslic3r/AppConfig.hpp" +#include "GLCanvas3D.hpp" +#include "GUI.hpp" +#include "GUI_ObjectList.hpp" +#include "Plater.hpp" +#include "Tab.hpp" +#include +#include +#include +#include "wxExtensions.hpp" +#include "Jobs/ArrangeJob.hpp" +#include + + +#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 CalibrationPressureAdvDialog::create_buttons(wxStdDialogButtonSizer* buttons){ + + wxString choices_first_layerPA[] = { + "0.025", + "0.030", + "0.035", + "0.040", + "0.045", + "0.050" + }; + firstPa = new wxComboBox(this, wxID_ANY, wxString{ "0.040" }, wxDefaultPosition, wxDefaultSize, 6, choices_first_layerPA); + firstPa->SetToolTip(_L("Select the first layer PA value to be used for the first layer only.")); + firstPa->SetSelection(3);// starting at 0! + + + wxString choices_start_PA[] = { + "0.0", + "0.010", + "0.020", + "0.030", + "0.040", + "0.050" + }; + startPa = new wxComboBox(this, wxID_ANY, wxString{ "0.0" }, wxDefaultPosition, wxDefaultSize, 6, choices_start_PA); + startPa->SetToolTip(_L("Select the starting PA value to be used.")); + startPa->SetSelection(0); + + wxString choices_end_PA[] = { + "0.10", + "0.20", + "0.30", + "0.40", + "0.50", + "0.60", + "0.70", + "0.80", + "0.90", + "1.00" + }; + endPa = new wxComboBox(this, wxID_ANY, wxString{ "0.10" }, wxDefaultPosition, wxDefaultSize, 10, choices_end_PA); + endPa->SetToolTip(_L("Select the ending PA value to be used.")); + endPa->SetSelection(0); + + wxString choices_increment_PA[] = { + "0.0010",///1000 hits + "0.0025", + "0.005", //200 hits + "0.006", + "0.007", + "0.01",//100 hits + "0.1"//10 hits + }; + paIncrement = new wxComboBox(this, wxID_ANY, wxString{ "0.0025" }, wxDefaultPosition, wxDefaultSize, 7, choices_increment_PA); + paIncrement->SetToolTip(_L("Select the PA increment amount.")); + paIncrement->SetSelection(1); + + wxString choices_extrusion_role[] = { + "InternalInfill", + "BridgeInfill", + "ExternalPerimeter", + "GapFill", + "InternalBridgeInfill", + "Ironing", + "OverhangPerimeter", + "Perimeter", + "SolidInfill", + "SupportMaterial", + "SupportMaterialInterface", + "ThinWall", + "TopSolidInfill" + }; + erPa = new wxComboBox(this, wxID_ANY, wxString{ "InternalInfill" }, wxDefaultPosition, wxDefaultSize, 13, choices_extrusion_role); + erPa->SetToolTip(_L("Select the extrusion role you want to generate a calibration for")); + erPa->SetSelection(0); + + + wxString number_of_runs[] = {"1","2","3","4","5"}; + nbRuns = new wxComboBox(this, wxID_ANY, wxString{ "1" }, wxDefaultPosition, wxDefaultSize, 5, number_of_runs); + nbRuns->SetToolTip(_L("Select the number of tests to generate, max 2 is reccomended due to bed size limits")); + nbRuns->SetSelection(0); + + + // TODO : add another row of boxes for the 2nd/3rd ect of tests to create, user adjust parameters of new row for the 2nd/3rd test + // this will allow multi plate PA tests to be run + + + buttons->Add(new wxStaticText(this, wxID_ANY, _L("Number of tests to create: "))); + buttons->Add(nbRuns); + buttons->AddSpacer(15); + buttons->Add(new wxStaticText(this, wxID_ANY, _L("First Layers PA value: "))); + buttons->Add(firstPa); + buttons->AddSpacer(15); + buttons->Add(new wxStaticText(this, wxID_ANY, _L("Starting PA value: "))); + buttons->Add(startPa); + buttons->AddSpacer(15); + buttons->Add(new wxStaticText(this, wxID_ANY, _L("Ending PA value: "))); + buttons->Add(endPa); + buttons->AddSpacer(15); + buttons->Add(new wxStaticText(this, wxID_ANY, _L("PA increments: "))); + buttons->Add(paIncrement); + buttons->AddSpacer(15); + buttons->Add(new wxStaticText(this, wxID_ANY, _L("Extrusion role: "))); + buttons->Add(erPa); + buttons->AddSpacer(25); + + + wxButton* bt = new wxButton(this, wxID_FILE1, _L("Generate")); + bt->Bind(wxEVT_BUTTON, &CalibrationPressureAdvDialog::create_geometry, this); + buttons->Add(bt); + //this->CenterOnParent(); +} + +void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { + /* + firstPa + startPa + endPa + paIncrement + erPa + */ + double first_pa, start_pa, end_pa, pa_increment = 0.01; + + first_pa = firstPa->GetValue().ToDouble(&first_pa); + if (!firstPa->GetValue().ToDouble(&first_pa)) { + first_pa = 0.025; + } + start_pa = startPa->GetValue().ToDouble(&start_pa); + if (!startPa->GetValue().ToDouble(&start_pa)) { + start_pa = 0.0; + } + end_pa = endPa->GetValue().ToDouble(&end_pa); + if (!endPa->GetValue().ToDouble(&end_pa)) { + end_pa = 1.0; + } + pa_increment = paIncrement->GetValue().ToDouble(&pa_increment); + if (!paIncrement->GetValue().ToDouble(&pa_increment)) { + pa_increment = 0.05; + } + size_t nb_runs = 1; + if (nbRuns->GetSelection() == 1) { + nb_runs = 2; + } else if (nbRuns->GetSelection() == 2) { + nb_runs = 3; + } else if (nbRuns->GetSelection() == 3) { + nb_runs = 4; + } else if (nbRuns->GetSelection() == 4) { + nb_runs = 5; + } + else{ + nb_runs = 1; + } + + std::string extrusion_role = erPa->GetValue().ToStdString(); + std::string choice_extrusion_role[] = { + "InternalInfill", + "BridgeInfill", + "ExternalPerimeter", + "GapFill", + "InternalBridgeInfill", + "Ironing", + "OverhangPerimeter", + "Perimeter", + "SolidInfill", + "SupportMaterial", + "SupportMaterialInterface", + "ThinWall", + "TopSolidInfill" + }; + + std::unordered_map er_width_ToOptionKey = { + {"InternalInfill", "infill_extrusion_width"}, + //{"BridgeInfill", "placeholder"},//special calc required + {"ExternalPerimeter", "external_perimeter_extrusion_width"}, + //{"GapFill", "placeholder"},//special calc required + //{"InternalBridgeInfill", "placeholder"},//special calc required, not sure how to process these for the width since they're not a static value + {"Ironing", "top_infill_extrusion_width"}, + {"OverhangPerimeter", "overhangs_width"}, + {"Perimeter", "perimeter_extrusion_width"}, + {"SolidInfill", "solid_infill_extrusion_width"}, + {"SupportMaterial", "support_material_extrusion_width"}, + {"SupportMaterialInterface", "support_material_extrusion_width"}, + {"ThinWall", "external_perimeter_extrusion_width"}, + {"TopSolidInfill", "top_infill_extrusion_width"} + }; + + std::unordered_map er_accel_ToOptionKey = { + {"InternalInfill", "infill_acceleration"}, + {"BridgeInfill", "bridge_acceleration"}, + {"ExternalPerimeter", "external_perimeter_acceleration"}, + {"GapFill", "gap_fill_acceleration"}, + {"InternalBridgeInfill", "bridge_internal_acceleration"}, + {"Ironing", "ironing_acceleration"}, + {"OverhangPerimeter", "overhangs_acceleration"}, + {"Perimeter", "perimeter_acceleration"}, + {"SolidInfill", "solid_infill_acceleration"}, + {"SupportMaterial", "support_material_acceleration"}, + {"SupportMaterialInterface", "support_material_interface_acceleration"}, + {"ThinWall", "top_solid_infill_acceleration"}, + {"TopSolidInfill", "top_solid_infill_acceleration"} + }; + + std::unordered_map er_speed_ToOptionKey = { + {"InternalInfill", "infill_speed"}, + {"BridgeInfill", "bridge_speed"}, + {"ExternalPerimeter", "external_perimeter_speed"}, + {"GapFill", "gap_fill_speed"}, + {"InternalBridgeInfill", "bridge_speed_internal"}, + {"Ironing", "ironing_speed"}, + {"OverhangPerimeter", "overhangs_speed"}, + {"Perimeter", "perimeter_speed"}, + {"SolidInfill", "solid_infill_speed"}, + {"SupportMaterial", "support_material_speed"}, + {"SupportMaterialInterface", "support_material_interface_speed"}, + {"ThinWall", "thin_walls_speed"}, + {"TopSolidInfill", "top_solid_infill_speed"} + }; + +/* +struct ExtrusionSettings {// think a map is better? + std::string extrusionWidth; + std::string acceleration; + std::string speed; +}; + + std::unordered_map extrusionRoleToOptionKey = { + {"InternalInfill", {"infill_extrusion_width", "infill_acceleration", "placeholder"}}, + //{"BridgeInfill", {"placeholder", "bridge_acceleration", "placeholder"}},//special calc required + {"ExternalPerimeter", {"external_perimeter_extrusion_width", "external_perimeter_acceleration"}}, + //{"GapFill", {"placeholder", "gap_fill_acceleration"}},//special calc required + //{"InternalBridgeInfill", {"placeholder", "bridge_internal_acceleration"}},//special calc required + {"Ironing", {"top_infill_extrusion_width", "ironing_acceleration"}}, + {"OverhangPerimeter", {"overhangs_width", "overhangs_acceleration"}}, + {"Perimeter", {"perimeter_extrusion_width", "perimeter_acceleration"}}, + {"SolidInfill", {"solid_infill_extrusion_width", "solid_infill_acceleration"}}, + {"SupportMaterial", {"support_material_extrusion_width", "support_material_acceleration"}}, + {"SupportMaterialInterface", {"support_material_extrusion_width", "support_material_interface_acceleration"}}, + {"ThinWall", {"external_perimeter_extrusion_width", "thin_walls_acceleration"}}, + {"TopSolidInfill", {"top_infill_extrusion_width", "top_solid_infill_acceleration"}} + };*/ + + int countincrements = 0; + int sizeofarray = static_cast((end_pa - start_pa) / pa_increment) + 1; + std::vector pa_values(sizeofarray); + std::vector c_pa_values_c(sizeofarray); + + double incremented_pa_value = start_pa; + while (incremented_pa_value <= end_pa + pa_increment / 2) {//this makes a number to be used to load x number of 90 bend models for the PA test. + + double rounded_Pa = std::round(incremented_pa_value * 100000.0) / 100000.0; + pa_values[countincrements] = rounded_Pa;//store PA numbers in array to be used later. // this might be where it's not getting the 0.1 number ? + c_pa_values_c[countincrements] = rounded_Pa; + countincrements++; + incremented_pa_value += pa_increment; + // is there a limit of how many models SS can load ? might be good to set a failsafe just so it won't load 10k+ models... + } + + bool has_to_arrange = false; + Plater* plat = this->main_frame->plater(); + Model& model = plat->model(); + if (!plat->new_project(L("Pressure calibration"))) + return; + + bool autocenter = gui_app->app_config->get("autocenter") == "1"; + if (autocenter) { + //disable auto-center for this calibration. + gui_app->app_config->set("autocenter", "0"); + } + + std::vector items; + for (size_t i = 0; i < nb_runs; i++){ + items.emplace_back((boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "base_plate.3mf").string()); + } + std::vector objs_idx = plat->load_files(items, true, false, false, false); + assert(objs_idx.size() == nb_runs); + const DynamicPrintConfig* print_config = this->gui_app->get_tab(Preset::TYPE_FFF_PRINT)->get_config(); + const DynamicPrintConfig* filament_config = this->gui_app->get_tab(Preset::TYPE_FFF_FILAMENT)->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. + // NOTE: can't stretch 90 bend models since that will mess with part positioning and it won't have it's perfect 90° bend anymore + 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; + double first_layer_height = print_config->get_abs_value("first_layer_height", nozzle_diameter); + GCodeFlavor flavor = printer_config->option>("gcode_flavor")->value; + + //get ER widths, ER accell, ER speeds + double er_width = print_config->get_abs_value("solid_infill_extrusion_width", nozzle_diameter); + double er_accel = print_config->get_abs_value("solid_infill_acceleration", nozzle_diameter); + double er_speed = print_config->get_abs_value("solid_infill_speed", nozzle_diameter); + + double default_er_width = print_config->get_abs_value("extrusion_width", nozzle_diameter); + double default_er_accel = print_config->get_abs_value("default_acceleration", nozzle_diameter); + double default_er_speed = print_config->get_abs_value("default_speed", nozzle_diameter); + + + for (int i = 0; i < sizeof(choice_extrusion_role) / sizeof(choice_extrusion_role[0]); i++) { + + if (er_width_ToOptionKey.find(extrusion_role) != er_width_ToOptionKey.end()) { + + er_width = print_config->get_abs_value(er_width_ToOptionKey[extrusion_role].c_str(), nozzle_diameter);//look at maps at match speed/width ect to the selecter ER role + er_speed = print_config->get_abs_value(er_speed_ToOptionKey[extrusion_role].c_str(), nozzle_diameter); + er_accel = print_config->get_abs_value(er_accel_ToOptionKey[extrusion_role].c_str(), nozzle_diameter); + + //potential BUG if any of the values are 0 everything else would fail, need to pull the default value too and assign that? + + er_width = er_width * 100 / nozzle_diameter; + er_width = std::round(er_width * 100.0) / 100.0; // Change number to percentage and round + } else { + er_width = print_config->get_abs_value("solid_infill_extrusion_width", nozzle_diameter); //used for gapfill_width/bridges selection. + er_width = er_width * 100 / nozzle_diameter; + er_width = std::round(er_width * 100.0) / 100.0; // Change number to percentage and round + + } + + } + + //base scale for model/parts + if (xyzScale < 0.9 || 1.1 < xyzScale) { + model.objects[objs_idx[0]]->scale(xyzScale, xyzScale * 0.5, xyzScale); + } else { + xyzScale = 1; + model.objects[objs_idx[0]]->scale(xyzScale, xyzScale * 0.5, xyzScale); + } + + float zshift = (1 - xyzScale) / 2; + std::vector < std::vector> pressure_tower; + + for (size_t id_item = 0; id_item < nb_runs; id_item++) { + pressure_tower.emplace_back(); + double xpos = 22 * xyzScale; + double ypos = 22 * xyzScale; + double xpos_stretch = 1.5 * xyzScale; + double ypos_stretch = 2.5 * xyzScale; + double x_total = xpos*countincrements; + double y_total = ypos*countincrements; + double initial_model_height = 0.2; + double z_scale_factor = first_layer_height / initial_model_height; // BUG: output error if first layer height is lower than base layer height? + // this can cause the numbers to not "show up" on the preview because the z scale is calculated wrong. + // ie; first_layer_height=0.1 and base_layer_height =0.20 + + double new_z_world_coords = first_layer_height / 2.0 -0.10;//"-0.10" needed for some reason, otherwise it messes up the positioning of the models + double new_num_z_world_coords = first_layer_height / 2.0 + new_z_world_coords; + + for (int nb_bends = 0; nb_bends <= countincrements -1; nb_bends++){ + pressure_tower.back().push_back(add_part(model.objects[objs_idx[id_item]], + (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "90_bend_v2.3mf").string(), + Vec3d{ 0, nb_bends * 5 * xyzScale, 0.5 }, Vec3d{ xyzScale, xyzScale/**1.43*/, xyzScale*6.0})); + } + + + for (int nb_bends = 0; nb_bends <= countincrements;nb_bends++){ + if(nb_bends == countincrements / 2 ) { + add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border_s.3mf").string(), + Vec3d{ 1.4 , nb_bends * 5 * xyzScale, new_z_world_coords }, Vec3d{ xyzScale*1.43, (nb_bends+0.5) * xyzScale / 2, z_scale_factor });// left sides border + } + if(nb_bends == countincrements / 2 ) { + add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border_s.3mf").string(), + Vec3d{ 51.5 , nb_bends * 5 * xyzScale, new_z_world_coords }, Vec3d{ xyzScale *14, (nb_bends+0.5) * xyzScale / 2, z_scale_factor });// right sides border + } + } + + for (int nb_bends = 0; nb_bends < countincrements;nb_bends++){ + std::string pa_values_string = std::to_string(pa_values[nb_bends]); + std::string threemf =".3mf"; + xpos = 22 * xyzScale;//reset x coords for numbers position. + int pa_number = pa_values[nb_bends]; + if(nb_bends == 0) { + add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border_b.3mf").string(), + Vec3d{ 10.9 , nb_bends -1.5 , new_z_world_coords }, Vec3d{ 1 * 1.58 *xyzScale, xyzScale+1, z_scale_factor });//bottom border + }if(nb_bends == countincrements -1) { + add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border_b.3mf").string(), + Vec3d{ 10.9 , ypos +1.0 , new_z_world_coords }, Vec3d{ 1 * 1.58 *xyzScale, xyzScale+1, z_scale_factor });//top border + } + + + for (int j = 0; j < 7; ++j) { // loop though new array starting from begining, not sure how the code will respond with a positive array list? ie ; 100.2 this moves decimal point thus breaking the code from loading model since "..3mf" not a real file... + + std::string numered3mfpath = pa_values_string[j] + threemf; + + if (pa_values_string[j] == '.') { + + add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "point.3mf").string(), + Vec3d{ xpos , ypos -3.6 , new_num_z_world_coords }, Vec3d{ xyzScale, xyzScale+1.5, z_scale_factor }); + xpos = xpos+1.5; + } + else if (std::isdigit(pa_values_string[j])) { + + + add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / numered3mfpath).string(), + Vec3d{ xpos , ypos , new_num_z_world_coords }, Vec3d{ xyzScale, xyzScale, z_scale_factor }); + // position in printer //scale model + xpos = xpos+2.8; + } + } + + ypos = ypos+5;//might need to change this for larger tests? + } + x_total = xpos*countincrements; + y_total = ypos; + //i++; + } + + + /// --- translate --- + //bool autocenter = gui_app->app_config->get("autocenter") == "1"; + has_to_arrange = true; + /*if (!autocenter) { + 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, 5 * xyzScale - 5 }); + }*/ + + /// --- main config, modify object config when possible --- + DynamicPrintConfig new_print_config = *print_config; + new_print_config.set_key_value("complete_objects", new ConfigOptionBool(true)); //should be false?, check later + //new_print_config.set_key_value("gap_fill_enabled", new ConfigOptionBool(false)); + new_print_config.set_key_value("top_solid_layers", new ConfigOptionInt(0)); //BUG: top layers set to 0 the top layer has a "void" where the top layer would normally be, this might be a config thing that needs to get changed or a slicing bug + new_print_config.set_key_value("bottom_solid_layers", new ConfigOptionInt(1)); + new_print_config.set_key_value("fill_density", new ConfigOptionPercent(0)); + new_print_config.set_key_value("min_width_top_surface", new ConfigOptionFloatOrPercent(0.0,false)); + new_print_config.set_key_value("avoid_crossing_perimeters", new ConfigOptionBool(false)); + new_print_config.set_key_value("per_objects_gcode", new ConfigOptionString("90_bend_v2.3mf,"));// this is the model other parts in code will search for and insert the PA/ect numbers + + for (int16_t i = 1; i < countincrements; i++) { + /* + gcfRepRap, + gcfSprinter, + gcfRepetier, + gcfTeacup, + gcfMakerWare, + gcfMarlinLegacy, + gcfMarlinFirmware, + gcfLerdge, + gcfKlipper, + gcfSailfish, + gcfMach3, + gcfMachinekit, + gcfSmoothie, + gcfNoExtrusion*/ + + + if (gcfKlipper == flavor) {// gcfKlipper + + //thought about adding in the lines here, but then thought of "per_objects_gcode" + //i don't like how the custom_gcode makes the gcode preview a solid color, makes it hard to view/ check things. + } + else if (gcfMarlinFirmware == flavor) { + } + else if (gcfSprinter == flavor) { + } + else if (gcfRepetier == flavor) { + } + else if (gcfTeacup == flavor) { + } + else if (gcfMakerWare == flavor) { + } + + + } + + /// --- custom config --- // this part is for forcing each model to have x print modifiers + for (size_t i = 0; i < nb_runs; i++) { + size_t num_part = 0; + const int extra_vol = 1; + for (ModelObject* part : pressure_tower[i]) {//loop though each part/volume and assign the modifers + + model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("perimeter_extrusion_width", new ConfigOptionFloatOrPercent(er_width, true)); + model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("external_perimeter_extrusion_width", new ConfigOptionFloatOrPercent(er_width, true)); + + model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("perimeter_speed", new ConfigOptionFloatOrPercent(er_speed, false)); + model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("external_perimeter_speed", new ConfigOptionFloatOrPercent(er_speed, false)); + model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("gap_fill_speed", new ConfigOptionFloatOrPercent(er_speed, false)); + + model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("perimeter_acceleration", new ConfigOptionFloatOrPercent(er_accel, false)); + model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("external_perimeter_acceleration", new ConfigOptionFloatOrPercent(er_accel, false)); + model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("gap_fill_acceleration", new ConfigOptionFloatOrPercent(er_accel, false)); + //model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("between_objects_gcode", new ConfigOptionString("SET_PRESSURE_ADVANCE ADVANCE=" + std::to_string(pa_values[num_part]))); // "between_objects_gcode" has validation and ect, figured it was easier to make a new thing. + model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("per_objects_gcode", new ConfigOptionString("SET_PRESSURE_ADVANCE ADVANCE=" + std::to_string(pa_values[num_part]))); + + num_part++; + } + } + + //update plater + this->gui_app->get_tab(Preset::TYPE_FFF_PRINT)->load_config(new_print_config); + plat->on_config_change(new_print_config); + //this->gui_app->get_tab(Preset::TYPE_PRINTER)->load_config(new_printer_config); + //plat->on_config_change(new_printer_config); + plat->changed_objects(objs_idx); + this->gui_app->get_tab(Preset::TYPE_FFF_PRINT)->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(); + obj->update_after_undo_redo(); + + + // arrange if needed, after new settings, to take them into account + if (has_to_arrange) { + //update print config (done at reslice but we need it here) + if (plat->printer_technology() == ptFFF) + plat->fff_print().apply(plat->model(), *plat->config()); + std::shared_ptr fake_statusbar = std::make_shared(); + ArrangeJob arranger(std::dynamic_pointer_cast(fake_statusbar), plat); + arranger.prepare_all(); + arranger.process(); + arranger.finalize(); + } + + + // need to add if statement to check if loaded model is within print bounds? + plat->reslice(); //forces a slice of plater. + + if (autocenter) { + //re-enable auto-center after this calibration. + gui_app->app_config->set("autocenter", "1"); + } +} + +} // namespace GUI +} // namespace Slic3r diff --git a/src/slic3r/GUI/CalibrationPressureAdvDialog.hpp b/src/slic3r/GUI/CalibrationPressureAdvDialog.hpp new file mode 100644 index 00000000000..bb7a6dfb430 --- /dev/null +++ b/src/slic3r/GUI/CalibrationPressureAdvDialog.hpp @@ -0,0 +1,36 @@ +#ifndef slic3r_GUI_CalibrationPressureAdvDialog_hpp_ +#define slic3r_GUI_CalibrationPressureAdvDialog_hpp_ + +#include "CalibrationAbstractDialog.hpp" +//pressure advance PressureAdv +namespace Slic3r { +namespace GUI { + +class CalibrationPressureAdvDialog : public CalibrationAbstractDialog +{ + +public: + CalibrationPressureAdvDialog(GUI_App* app, MainFrame* mainframe) : CalibrationAbstractDialog(app, mainframe, "Pressure calibration") + { create(boost::filesystem::path("calibration") / "filament_pressure", "filament_pressure.html", wxSize(1300, 600)); } + virtual ~CalibrationPressureAdvDialog(){ } + +protected: + void create_buttons(wxStdDialogButtonSizer* sizer) override; + void create_geometry(wxCommandEvent& event_args); + + //i've set choice boxes for now just to save me typing numbers in when i want to test it :) + wxComboBox* firstPa; //first layer PA -user manual entry + wxComboBox* startPa; //starting PA value -user manual entry + //wxTextCtrl* firstPa; //edit to suit for manual data entry, + wxComboBox* endPa; //ending PA value -user manual entry + wxComboBox* paIncrement;//increment PA by this value -user manual entry~~ or have drop down box ? + wxComboBox* erPa; //extrusion role Pressure/Linear Advance -user choice select + wxComboBox* nbRuns; + // add checkbox/s for "smooth_time" + +}; + +} // namespace GUI +} // namespace Slic3r + +#endif diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 2f32d045059..da11623cf45 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -66,6 +66,7 @@ #include "CalibrationOverBridgeDialog.hpp" #include "CalibrationTempDialog.hpp" #include "CalibrationRetractionDialog.hpp" +#include "CalibrationPressureAdvDialog.hpp" #include "ConfigSnapshotDialog.hpp" #include "CreateMMUTiledCanvas.hpp" #include "FreeCADDialog.hpp" @@ -1945,6 +1946,10 @@ void GUI_App::calibration_retraction_dialog() { change_calibration_dialog(nullptr, new CalibrationRetractionDialog(this, mainframe)); } +void GUI_App::calibration_pressureadv_dialog() +{ + change_calibration_dialog(nullptr, new CalibrationPressureAdvDialog(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 d512004dbbf..8ed99d7bf78 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -256,6 +256,7 @@ class GUI_App : public wxApp void over_bridge_dialog(); void calibration_cube_dialog(); void calibration_retraction_dialog(); + void calibration_pressureadv_dialog(); void freecad_script_dialog(); void tiled_canvas_dialog(); //void support_tuning(); //have to do multiple, in a submenu diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 82b52fb6f32..afcba4f7e3e 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -1956,6 +1956,8 @@ void MainFrame::init_menubar_as_editor() [this](wxCommandEvent&) { wxGetApp().filament_temperature_dialog(); }); append_menu_item(m_calibration_menu, 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(); }); + append_menu_item(m_calibration_menu, wxID_ANY, _(L("Pressure calibration")), _(L("Create a model for tuning Pressure Linear advance.")), + [this](wxCommandEvent&) { wxGetApp().calibration_pressureadv_dialog(); }); m_calibration_menu->AppendSeparator(); append_menu_item(m_calibration_menu, 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(); }); From f88193233e0a94120f1444bb5ef62e9f9d69437e Mon Sep 17 00:00:00 2001 From: legend069 <40685552+legend069@users.noreply.github.com> Date: Thu, 7 Mar 2024 03:49:45 +1100 Subject: [PATCH 09/28] 3mf files update made new 3mf models for the new scaling method i'm using might put them in another folder later --- .../calibration/filament_pressure/90_bend.3mf | Bin 1749 -> 0 bytes .../filament_pressure/90_bend_0.1.3mf | Bin 0 -> 1874 bytes .../filament_pressure/90_bend_0.2.3mf | Bin 0 -> 1878 bytes .../filament_pressure/90_bend_0.3.3mf | Bin 0 -> 1869 bytes .../filament_pressure/90_bend_0.4.3mf | Bin 0 -> 1865 bytes .../filament_pressure/90_bend_0.5.3mf | Bin 0 -> 1897 bytes .../filament_pressure/90_bend_0.6.3mf | Bin 0 -> 1899 bytes .../filament_pressure/90_bend_0.7.3mf | Bin 0 -> 1896 bytes .../filament_pressure/90_bend_0.8.3mf | Bin 0 -> 1895 bytes .../filament_pressure/90_bend_0.9.3mf | Bin 0 -> 1897 bytes .../filament_pressure/90_bend_1.0.3mf | Bin 0 -> 1899 bytes .../filament_pressure/90_bend_1.1.3mf | Bin 0 -> 1896 bytes .../filament_pressure/90_bend_1.2.3mf | Bin 0 -> 1899 bytes .../filament_pressure/90_bend_1.3.3mf | Bin 0 -> 1896 bytes .../filament_pressure/90_bend_1.4.3mf | Bin 0 -> 1896 bytes .../filament_pressure/90_bend_1.5.3mf | Bin 0 -> 1899 bytes .../filament_pressure/90_bend_1.6.3mf | Bin 0 -> 1896 bytes .../filament_pressure/90_bend_1.7.3mf | Bin 0 -> 1898 bytes .../filament_pressure/90_bend_1.8.3mf | Bin 0 -> 1896 bytes .../filament_pressure/90_bend_1.9.3mf | Bin 0 -> 1894 bytes .../filament_pressure/90_bend_2.0.3mf | Bin 0 -> 1895 bytes .../filament_pressure/90_bend_V2.3mf | Bin 1868 -> 0 bytes .../filament_pressure/base_plate.3mf | Bin 1660 -> 1663 bytes .../filament_pressure/pa_border_b.3mf | Bin 1671 -> 1678 bytes .../filament_pressure/pa_border_s.3mf | Bin 1679 -> 1672 bytes 25 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 resources/calibration/filament_pressure/90_bend.3mf create mode 100644 resources/calibration/filament_pressure/90_bend_0.1.3mf create mode 100644 resources/calibration/filament_pressure/90_bend_0.2.3mf create mode 100644 resources/calibration/filament_pressure/90_bend_0.3.3mf create mode 100644 resources/calibration/filament_pressure/90_bend_0.4.3mf create mode 100644 resources/calibration/filament_pressure/90_bend_0.5.3mf create mode 100644 resources/calibration/filament_pressure/90_bend_0.6.3mf create mode 100644 resources/calibration/filament_pressure/90_bend_0.7.3mf create mode 100644 resources/calibration/filament_pressure/90_bend_0.8.3mf create mode 100644 resources/calibration/filament_pressure/90_bend_0.9.3mf create mode 100644 resources/calibration/filament_pressure/90_bend_1.0.3mf create mode 100644 resources/calibration/filament_pressure/90_bend_1.1.3mf create mode 100644 resources/calibration/filament_pressure/90_bend_1.2.3mf create mode 100644 resources/calibration/filament_pressure/90_bend_1.3.3mf create mode 100644 resources/calibration/filament_pressure/90_bend_1.4.3mf create mode 100644 resources/calibration/filament_pressure/90_bend_1.5.3mf create mode 100644 resources/calibration/filament_pressure/90_bend_1.6.3mf create mode 100644 resources/calibration/filament_pressure/90_bend_1.7.3mf create mode 100644 resources/calibration/filament_pressure/90_bend_1.8.3mf create mode 100644 resources/calibration/filament_pressure/90_bend_1.9.3mf create mode 100644 resources/calibration/filament_pressure/90_bend_2.0.3mf delete mode 100644 resources/calibration/filament_pressure/90_bend_V2.3mf diff --git a/resources/calibration/filament_pressure/90_bend.3mf b/resources/calibration/filament_pressure/90_bend.3mf deleted file mode 100644 index d7be1abe72eeb7ecc4af7c8658712b463cfb1e4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1749 zcmWIWW@gc4U|`??Vg?3}f`4NFp+JB^gu&QF-#8^VKP5Fs4@@#L2rz8o1S@4=VusLj z!=m$N8%Wf?Tk@CvbhX-zJFlFb)Uv+6{x0d`yls+6_EnKL zkBiThZ=Cz(-OhC<7D%3{B;g zvdXg9KGme?f(8Hm@>|;vQNW}o+`Zd z%8FfO_^+a;-l#N}@As)m2||x=`mbMSa-~_yDj;|9!i#EF4>vU=mF5SnY1LUWZOKH_ zlrQcpwHLVTfAjI_?QogJDfb=u?=rGm>=o5%U#1}Rzv!m(t8*;M(n_}%249$Mu5y3X zwyfR9*U5fcqGR-`chPZ4qjTwBF4wl~|M%CnbotbGMK4XRJlpT^a$;L>cKC+*$Ij(c zya_egQ(N)lljY)_@(%MhT!}Fd^;r$ov zdoR5ZH}BGXE^@tBwjtf<(aG+c4ih^fJ8VBoYnsU!+fVU%7!&uw?9#)NZY??;1^*Yc z9XAUUXt$Z^@-O{tWHO)l>DeIoe5t}Ur1d=m<6uUl+hadOuN-lNZcDa}8+_IuM; zbM`%YHqVbKU0CBZ2)r8mYjJ$BFM*gP~=c0fj z^^h3LM)j7-o12uE2gv+kak8m&zrWJ@)MEXT?0pRnFUtp@EO@gbE3sl~B+6}dT}Y!t!-$v*EO6vN!0vtCCG1njhb@F|9828+5ZDdk_6|A4!t zF=6-e z)u(@b6;b4rJ9gznqlTT<)H4im%Z*$d-jyVNnYBZvT6AmWW!n|ESM3T{Q(z2ooat%lanuB$+8rz+slj^WX0DWPlE*+H!#TJi&Arn_4Pm`D5$s@Az`!`8dRzM zXSog;2(+B%+UI;@_uVT^9TIyhK5ErAPROg@@Ke##_5M9w4Gp>Sv~S7J3aV}d-qBok z(3&+>(Q$(DKFOHn38&sxu`hp|Rk`ER3gh%3`xccSCskQ%&n5QH@bM2@eu%y3%@(_; zxj%bk*>dxCDc|wfdGyCwhGlwn8y3~E{c65-&}DwjZ0^UpVZB%LvbLTKe$sVDS9{9S zHNV^31h)3crm{xNwNLuEO|O?}odV-?#~+(Jriur6GcxHi;3{ZkpdM=g(x7m_EOsR@ zie0D{26U5AlOMXtSQDcJMq+e69@-t mCj*S;fkt~eD_kEth*iu6;e(_Dyjj6KW}q&RdQj*wFaQ9Fy5d;? diff --git a/resources/calibration/filament_pressure/90_bend_0.1.3mf b/resources/calibration/filament_pressure/90_bend_0.1.3mf new file mode 100644 index 0000000000000000000000000000000000000000..b0416961f8c1502cbe323252b61053341f50cdac GIT binary patch literal 1874 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 P<}m|xfz*RSkAVRIrEwct literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/90_bend_0.3.3mf b/resources/calibration/filament_pressure/90_bend_0.3.3mf new file mode 100644 index 0000000000000000000000000000000000000000..6cb92a7e5f4fbb2f8a7a46ff9a45a4348bbbe86d GIT binary patch literal 1869 zcmWIWW@gc4U|`??Vg`m&hFJmsp+JB^gu&QF-#8^VKP5Fs4@@#L2r#_m1}kN#VusLj z!+i7S7zo&I5BkqsbiRRCM_$`QFLX(qR%q@y?PMRPqsO_(2ecsrWG8awP#hdJr_13#`gSlIKSKKbSRO{(gN2G3hr7l_dYFE~h zNw$vXYR?+Z$$5J_{&IKO4Ri6fOp6Vnd+In%JMYTtKe7B4Yske~ma(iLa7z4%Dc<+4 z#H{r4`RN|~Z}SRoTbV3hCN;P2d5$p}855G;EPWBB8r^zRRgae=O^WZPy4p&s#Q-DSIm1dVHfw=Bb-0- z-n7bm;Be?J@OB^vYiZR}pF=+n}#k9_#H(NFH4+_jVS#S7vdDx4JM zTh}tZxtx!k;YsuDs}0SfPcH9xU@OBgAwT`dL9S1Z>iNf8yO|45_9Uk{#Y8Ee6_V_V zE^G>ITOzLFY_2Gq_Dyj5gfEg@qDC8&K3)r0v66As>K!ThM_#VGVDaJ1f#ro6T1%3r ztq{$+!yYq#&M%IqOeWSlC00hCh;ffS)>^pQ;+A_(lFs6r1u=(iWvFafe$tco3h$XS zagT(8vX<;@o?df-At00OmEZg*zRQNkkF_;i@cw;hyQb{h32y7&HC~B*$Nl%d+;bUQ z&L!_`Iv+$#*tK45o{9YGT@^EJyNFQ9v~^`Ece z0VsKwBSh~qEbj^f^KP_reqKpxUP*jNWkG6jtX@TK4k-JEFhR2II|#)vH|VU_5d#4` z?H_!K;hDjrE=x-J*X2LpZYjBy=Bu`FrrzD{<(EPoH;U~^HTwLQH~4+p`y+zKQkcy? zEnBmM!DQjq8|Foe)>TZ{y?piQUtdKOIpvOBInk(Lr#1BqL)>yB7l(HxiC<>zkf|2k zT6x)a#qCwQ!qpTQgB)i%8{Kx@+wSMzcjWY$xtqT!I_V$%TxoXN^wO_08%?fQy|LGj zk1DXgQqpry%6AWE>5*+;R{rP+ytg&(@s&*H%O_@Q?l{MCeNNOmtL`7WH~-nsC3SEq zZ~Xo1f1ggA*!|t)#*BYuZU)5yH!j>f_y6SN%U7~21?%=QqXt>=wa3$7LBhi#-inV}wT%<<>NosU^mM&{ zPgg@jt~~8q^0R`f8-aH;mmRcbO;vQ9V7yN1e_}uZw=8mbrB*Ms~ z%YdtZmw|e$0Z4Tt5Fpn9i3#1+tdJGHz DnIH{F literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/90_bend_0.4.3mf b/resources/calibration/filament_pressure/90_bend_0.4.3mf new file mode 100644 index 0000000000000000000000000000000000000000..7bbf7f0f6942df95944f9c90821076a7dfcee620 GIT binary patch literal 1865 zcmWIWW@gc4U|`??Vg`msIfW1ZLxBK;2!pYUzHv%!eoAVN9++fg5MX%A4OYrf#tfn7 zhTYD)ZNO7|uit&)?u6! zVP~Vl@7ezIuXnJu`$hiH>tY<$j72V|t>U)&vr0X^cXz?>-Tv~Qmpxuo#&Cy^wQAa@ z4PXB@+IF|`#RYHNC%tR$mx${>1oJbj-)T-x=GU=%UG=b?(eICf%efn2n;d*YuZJox zc`@+8v@HE+Cq=r+&!{>O=)6P%5gsxA8Dwk+tv zvSmSGIj8Jrf12OCEA;TfYbpv!X^$jt^fK}`_3llG)ppemEjz-W#B%lT1ZQ21<&&&* zb6pzi!ZwMWn7E#O$B%!!=Oz@tII8eVStg;xy(v~R%I?jrcW>8?<_9=WvZ?7cqnUYqfo!?%k*WR1H=Cb`S_Vg zyj)P~v-?1|?~CB;PA_gBKfXSmOC*J{vtmObr{IlV@20y(dgghDl+OgsbB*MACHL&X zgWXRbv97uISmf~MCvr(`69Zf47XMzrf25naV$a7*CZ~-u=7gUx`rsj=Qqere{OHp& zo^xln+~{s@5ZLjzUhTo;BPmK7sv{c?oPKmF&xoC6epyF%=k$raoOOj;(~L8xw4H8Q zTynL)ttwF}%~0g-xqYjaiL<>b-O0ClY4p}TB6n9cTL0eUQE;@x_haZ~OP?PhuhuGw zzx`Ogc}>*3)B7Lnd|~|kzr@m*L&JREco#tG4bJHE=JD7%r1||q|X1rpr$qk3l-fP8|JcL);F1@+)SYw!3Z`vHO%W=6= z-+Ow6GD|Pi>tEG<>Z#UJ##>J>&dqN4*7UkcT47u8t7R>EzmIE4Eve1($(C4R`*CHZ zgHP|4?95LWa}(L6&YA{TZkXb3%CaLYcZn45K3#{)lcjdfcz?%SdEx)JSLZD@Z@e?# zTyU${lYcjlO`e_{`uY1^W$%Jx#!|aDA71I@Ov{@&?a)%mhcO!@KG$05OI516K0dQ2 zOSDmF2CJHnlH(?m5<~wM>0qB2sj1aBk|JidG`-6dJ0BhV&i|dFUPsv5cOPDx2cYCz zju5@euzV{F%(v0b`FSO&c_r~7l?AEAv3eD`IiRc?!UV~(?;sSz+@P~wM+^k)w14m^ zhGzzgx-2Q>Uzh)YyQSn-ny=cznR<7(mtP8X+$gpu)#&qI-r)CX?~e!`OJO$qv~0~1 z29t$bZ6&ysr_fU4jBlvoafr-d}H_BD@`2|dn-O_)izGZtKaZb(bM(*JzWhA zx$?Ac$TF z_RsL~4_khSz39yryQsN8dt}*i^L8oU@z{Cv$61DDdUYEX)v^6*zID)Le$8y|$GTy? zSM##Ao(z7{bw*cv%F{K!+uQ`U_Q|HQM$ENO`nXN6muZ~><8#L!n>(h82Y53w=`!Fd z+-0C1YXH)qaKJ3;B`}J5s1^ovlTni&y2)4*qXb4`+ySjm&<#h8D0IV7qD=xL+Fr9j z+#KM|#-;;xJ|s*a9H^ZPFq#J%?YCLs`q)9N=WGx@NIJlq70hD>>H?_;g&qR~05eVs AkpKVy literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/90_bend_0.5.3mf b/resources/calibration/filament_pressure/90_bend_0.5.3mf new file mode 100644 index 0000000000000000000000000000000000000000..78be36c305872add2c5374fd9d083930b7fe76f6 GIT binary patch literal 1897 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 literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/90_bend_0.7.3mf b/resources/calibration/filament_pressure/90_bend_0.7.3mf new file mode 100644 index 0000000000000000000000000000000000000000..bde6a9b72afa9f4205ef7d7e9f7a9567ac8fc003 GIT binary patch literal 1896 zcmZ`)3pmqV82`I$L`f>QTpL-*+*i5AP`QLrdK4=5zAePj1Y-3i~1~jz6am;KhOVtpL5Q8-gD0HeShb5aS##J0RTXJ{s(}(n?kC; z7C&iV17K*QYv>n<^Fv`^zoif$4S?7DHU)?x3;L#q6OODWZC-}_B@)~i#VYei@h;k1 z?OxPLhKOvr(dP?76S-|+U`Ik)okn4UdcvI9I4fJi3A9a1-$i`Fjy{$7#8)vMp)}HEs{x zGL*yocjwYok%bqb7iA7=d1j{ilm=)#;N(EeW_eO4875M}>Cacm%2)JF!AV}b-Vx^d zeIdAdzH9QW%GgX_;hLOS>tvqjhD%f&{{wc2mUn=pFo7PPOg0`r@o^F_`sC*~<5Q%x zv4JL?jnWL+gWXI$#j=rHS_h^L$O ztk=5Sr*__h&EDLO85tUR_iUZY7cCmw8NCU91;gd)YvqQ@b#POa{dBWt@P^mZs&_uz zhsJqR+BzOL<*3T`ab!_i$e2Nm%h$`f*BoWcGfQn#nt9IqQBQ8HP%uM|yKVv*l(L zU`K+!+&w=b43Q$}U9YQU!5J5(CHin?e>JEv&@r53 zXHa5Vj&Dc~aC9w2tj0$X$K&bNER;?BQLU^f{T-3bQ`*g=>#u=LhpIJwqR}KH;|S1Z z7Bd5;ce48$i9V#=jG=>ziIH7771X~p$wuzTGCcxRm}Q=LI3vX_>vrL${rybJty6S^ z_6BggvrZME3G80h)Jfu24Q7X6;UOj=dyYzeieXZsK~+E&BA~G?t|>2;**5l;14Y>u zjPcPezS2@r5jOTcD4XZuTk$zb=lw0-I?WiR&qUW(>_M0w6OMgowhEJ4AFa$a8%)hN zlR2LGwAr(v)w8cJ5o~ua%}eH0R77(LLJ>sh6=Sls6+3K+=_sk^UK(FfWXGONmC$I< zSsK`44&<_g*5dB4mOr#!KTqq!2pl#Pg$?y_4-Z0xc)?BwVg$@~7hYiW*n$EmNR~ZA zPufD8C#CM;@3zqEcDn^R=LvO8%x7m z%nQ4U=pI|tgpgL52!k%$>P!2blNqm>l#=i2*19hy!{M)uoB7NKMjVq-OQ@=6kR>NH zk*(-dwF=L8Javl~=lZVHyPxBaXnC2vwVW;5M)oW=N#IqM%s!D&ti8F$=Y8AUKx%5j zv{8G;PlBCZh;(~X2m4n;S_>y&*SfRSB1<6)Y3;xE2QtZd$b5oPm=IlkkMoZ!R=EfwYX#;5BH1&ajVN$#8T&NP8w0Jo?DO zlQNU23=YK7A>Df`Uhr5z0qpF3>RB-VLT9Z_PGq)Zzs|v=x7dKv2DguwnL66(19yJJ z+DVrtE2BV%D3-@39>bD^i`9e%t#~DIL^&4+Az>Zh|K5J3#fwGFYXJ@`D}nrqO0c*D zSnhdg`YreTpUEh{A{pBj%gu7aGoCHS`l0Kv420|+b_6Pa%UdjWa?@DG#wBNqSw literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/90_bend_0.8.3mf b/resources/calibration/filament_pressure/90_bend_0.8.3mf new file mode 100644 index 0000000000000000000000000000000000000000..8669360bf51e3a7cee5c57441e4a34621eae48d6 GIT binary patch literal 1895 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 literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/90_bend_1.0.3mf b/resources/calibration/filament_pressure/90_bend_1.0.3mf new file mode 100644 index 0000000000000000000000000000000000000000..ca752bb3f981c2bdefee9d2ff1d5fcc20c2e2fe8 GIT binary patch literal 1899 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 literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/90_bend_1.3.3mf b/resources/calibration/filament_pressure/90_bend_1.3.3mf new file mode 100644 index 0000000000000000000000000000000000000000..1ae9dfffab6682a86b8b23976164ad25d45fb029 GIT binary patch literal 1896 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 literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/90_bend_1.5.3mf b/resources/calibration/filament_pressure/90_bend_1.5.3mf new file mode 100644 index 0000000000000000000000000000000000000000..b2b5a8fa211f4920c7c17be426890894a6ffd700 GIT binary patch literal 1899 zcmZ`)3pmqj82`K9&ZHvJigh#hg&fyqhGdqz)+&UNnF*7qv%-p_8{xFkx=2=%)DmXu zkWwyl8_lIALWgoWZZpxb=sAx%=l?zb_kF(ad%ySlzTf-)zSk8cA*l}lfb8NA0H!;I z=f5t0N`Nw8Y-ea37#1FgBN%*>Vt^7L4fM#njg)ENSd-;_YB zgSPlMU_TFl*Tdwtz_ET<+85znaZ9w(4!NvJh}g6InIW%^h+toh@^)5o1pX{stFR$? zn=tZD)&g9MSrB6Tlsr2e)eg!$q7Te??A?@WbsZe6qhVL0RUTR!K|PD@>~AtBw~dnv zW3>lYKQilw$=3uBKf*3yqWG__lF(hI^i=&&>M0sI87TED&}OGrdT0_>XjH5@PdYKzSaNmDY??M2fi2sEme{oJ@tD6u z!22_LiqD}s?lup4dt!Wluen+jO!tq&d_))%))PKqyR@ckt+1zKtSx128B5+*cEW;0(g-r43d53wdr4igX7*gcYelZdYgxtyn4Gw_%78d-tn zhgFj7wOKqjWtr7rbD3htM`$iQ-l%qt(zL{|`d z>j{-dD2JF5P8VTr$FpV}=N>(KkKjQwza;y90Ux6p(}7l9)o3-`J6O$6IUb*w2~vDH z!m9M`=^@yH!HQHvSg#*0F%ij6UBywUt}Ht3uy)Fc;Xf(%22apeOX_6&KpOj3s2o-@|OM^8zw46 zy+S-KC`eD0szPi;wUI8EWEY-hrH{@rNy_&rj!3OG**?nVCadSA6e;c8vUB(zWsVh1 zo?(%gPDmA4RmCM7yMd=n9?Tl{ImU_R)%WYIjo*?hZ{#9vdQ`%M;dyQNJnYul+Nnt$ zd`3_1;PlaS~J8< z(27>0MCi0{z_dFy?+^81-->S*2B|u9-^(}4LwLoRK=FIeRZnPJsYJi1%7qS3S{N_7q4H~Up z{W4I(^zXcaT)^aJG4I#NoWkR&<&1lE!YO5l+@_b@SMgA|PG&ve!!WY586h2>%qj(+ zP$`aWwZ7Ap&)TcgwM#jYZ?0ksEzSwbnO~mCt5@Cz`SRb) z_ot07mhi=qLg?|9h|SP(_6WC^VQ@EiItE=wfFt;9WsSQ$b2JlgeXG;krY9t zAhv`Na~Ue!r3U#bm=dK?{wb1I{+64NtX6S+T<5p=RN|?kS;!uH{yTjrbW=>wbilyT zIG$U#c3!2W6b^z&HGaDOAj7ZrbDRvL4qE>eHUe`;Pp1C-#CXaQJr198C5co zpB}@p^x5+prNfA2>_yLSCo{rXiQ?UiR?w_0l+^oawG-- literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/90_bend_1.6.3mf b/resources/calibration/filament_pressure/90_bend_1.6.3mf new file mode 100644 index 0000000000000000000000000000000000000000..56455a8fc687b4cef7df741db832bad44469c444 GIT binary patch literal 1896 zcmZ`)4LH+V82_UUV>OmY$m&+Bm^CTW&37t`%}0r%(zc?ZSlCFGN(qq^V|{pHi3m-T z<|5o=mXE2Gk3MKCY4X{o)V1ijkGl7Np8xwk=bZPv=bYdB{?1Flsmw7206=Z(2Y`2g zjr{w}2Lt8<=8k6O#Gnu&iGunel>it3hW;=G(p9E)u9pkG3k}}@TuFlLk9_3r5MHNzGBjQ68_M5TH zK<&y66n@yd%Fy|cftJiSo7_s)cpzvVVY#c;bX?sw_9UmAZYi`<&&V*LgG=06jO#_X zR*rKyq+oxMuJ$`ATa#XcE8=zxJBj-uas#)Tj8S9f*&MGn_cx?tAAM7shph1L@kMlo zat~EXBtAXRjxqyG#8&gSbE4Oe+s~D$Bg1nFD!)|?HpFdD#}2LNA31BmlJtFW(R^9c z3_T**@)<*o5$YVjLGaLbzI*WY`(&$@Qtyei9OGjVQC}u^xz_TwEY#pOx1&oR*5U?g zB_)PVoBHJ#F-Rx&N`1|f@{8xOL#|eDKcQRW$Xtv_R8fwfU_{>q@cC)WO%iNHaL@Nx zlTS;S+8-8%Vyoi!)G-fr!sOv*^^CD;`+yuIu#U>Egc zsY6an^Pe03d7rr1BCqfTBEhQq@p+=}HSxL}$2)MB>g?6l0TZBrarIqs@X^*wX0~NG zran(Ol}t9#&9De=#&wT^0@nGeTz0J*d?IwatGxuu5-v@IC)kc?_G&G-kt#;@Gukaj zh=JKsP1jPpHvuOvtNSqewS2^FyFXLI1P{rm157mogl`HBbBCd88|M5`enE>YB*-y5 zrhcx;Bff7Bg$}I+5sJ5DZYVy;H6uySZAY(exP`*wGLdlnnd*CR=VLn`pJ)-=Ie$b# zBJ0MZn9}+O3{v`qBnwHsAvDoCDExt1oN-dnm1?@~f+ZXcyWD2T!ZlhtiGxiv7QgGP z5tZTdl?{&hqCuENYc)?)`%hZKr)a&)Atabe3a0Myq#Y)O`Jy6&C<uW&3{<4^&5&9&?Bo+jm4m3VTX^D(9xrle)iFj&@bNox#MVtOdrXl?qX_c&e(_?%?*%bJ{x8GpqVzE<>CVia kz)!6?6ZVOJ*QqKj!9OGbD5eQG5Lhv$GSw9J3iJTrAE~S*QUCw| literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/90_bend_1.7.3mf b/resources/calibration/filament_pressure/90_bend_1.7.3mf new file mode 100644 index 0000000000000000000000000000000000000000..12802a324b41b4e212b27224386fb87498e200c4 GIT binary patch literal 1898 zcmWIWW@gc4U|`??Vg`o5Jda8Lp+JB^gu&QF-#8^VKP5Fs4@@#L2r#hmf|W8%XNJ&A z!+rDT7zo&I5Bkqsbe`?Z^+%#hrfUW1PhDm9{Defl)6wHxXSB|)f6p`Hjasi~z~*+A zKWX=7n%g|BYSF}SYYmz5eG_BPhft#*Ot&!Vp{ldqL5T_ww~-P!Nm zR=an$`4hgc5^TO5vgv)>y9Kc~P2(cW7RmBEz1rBWGw)5+Q&zifTYH6bH^QvceM7H@ zF5dEr^Vyy2OfN&c^XvTdZzbN(S(3?;vf8C~*{mb)`lUb1{9Y%sl+D^_SxR6?&Y2L6 zi&vapd-;8RzwB3fV6?4F)?^l+JGxbDI|DB)cydGg=GLgKQmY@&lNWsPuAQe!(Q9Gr z8Dkre?_hD9?MI+dFIBK9?e(% zI;Ble`BuiRRJ{lj@A=Ebmb}l;+gIDl=)Kd&B`Cn2Q%LHg$|9#0!>R2`ye!?`Y8DI9 z3qS1Ez3S}uM}2PAj`=SfjdLV(-o)Hy|LkOI(U5+IH*$uWfkpiSulr9I%5R=x(Ldod zZ_OXYb1}EuPF#0Z5S~zAp6Drb_@7hXcjfS_0mtsj`diMo)SGutsj;El>7Vlf>4ht2 ztL)Zb^fohV+_d$=^}VeEav#-~pYt!14s#C6=AI$_^Pk$Ls}p!r^xJ-x8qb@&mm^Yj z@#^U3rQ5#FsDEMf{^+^0CV#GHynofbcF&$dznojX%NfqwJQsPUvPa}254*Owg~aa9 zZ1rv3=`u2WGxRq-N?`pgDKjTyT1~+^1-^5-XVQ-!JjHtM-06hReyuaQ9M`wr3^~Lj zFeR!X=i@PjnRjJlcBQzRZd-FqvCV41m+vXD3%;2xa@ip4dti>Xo#Zdp%Da(#4}Ltl6cld1BSGfVfr%X~hk{cPMh6G027WeUGj5}5TH zzD+sySylPWilv`Yt9VVlA}7q;J}2jyRExMnvFoWlKfBt#FFjLTCVHl8^?z9dP%<`0h~8yb#uf%<>}cowypq(s zlK7Cyg4E(zy^7o%P~HwFU5Q<@L&{?k|1_E~4Kll{GGlNB4mXz|Z%YVS#QgSQJ zS8d@;y}R4XFNHd86x)+(^!YDu@cXp)M+A?hFq?f^wq^-~$-=ES%!?MStC+BR`RdcZ zzKSSv${o9MqEW+6Yw8(>xaCGJ4)015zs%YpQ!To+^0MuU+pBhkt0^!BInH!8y6w8R z-Os=8$muh4H-A%f(m(pS((JV9rC(<@nq0AZW3M3}RbYRmr01NJ?;g(5Bip{L{LvA3 zZ)@D+E1AxhPt4ZbagOEsoTznH-9L73{fln|`1{xYKAkwR`@6}F8UM=M42lJA zT)27e|H;XhuVh&Y*6n3R4YJ~EkEg+cj2jqa@kOaQ#rk?65)@S2jF2$e3=OK({3aX3u7-wOdD^$+X9ZO^0`F)pJ7~?C zs^~buc%Nj<@`O`wtJs%6&Z^vTX@zlmkbR5FkCUpbwdWH1XZZMsEkDFw^k$1))ZCvv zvTV6|yOi&E>^%D8EW6+hd zZUS5TWK&rq=GrHH+@{ydv`&HXx#N$`9aF^vycwBv8E}>UGEk2-0BKM-VAcf^7%cJgg8m2Y9ow=|G(i2@?nhY9|AX j=7C20AA~-3kV+0P$-n@T4)A7W1Bo#MAxJ$a^cWZbFYFV| literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/90_bend_1.8.3mf b/resources/calibration/filament_pressure/90_bend_1.8.3mf new file mode 100644 index 0000000000000000000000000000000000000000..f8394870bcbdc7f69499fea14c9a16a2df56d192 GIT binary patch literal 1896 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 literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/90_bend_2.0.3mf b/resources/calibration/filament_pressure/90_bend_2.0.3mf new file mode 100644 index 0000000000000000000000000000000000000000..d0c9ccf03f064f62cc3edd14c3607ebb13701a69 GIT binary patch literal 1895 zcmZ`)2{hDQ6#p}fq-7*avX*L!8571DvLuWo6o(`-WN9##h-^cYC9)jV3=#%~G|eCl z#+I5Pp+cr)tR)J`?laN(4!-aI&i~%?-n;L<_kQ>O-ZevkxL^PPY+3mM03lxHx4ia2 zfZc$izPzH-6;CI$2mFuZ03ZO@_CKaT3TRd5TG25*s*q!cYL;*{_+MF{#0*~@KqS&R zb>6$^?Ng(0YJztmy%v6bge7H^UOFP=2%;Pisw}LG#ryvpD0L^0#E8zrC|zop>eC_I z<+=GgjIYCk{q&(wEg`0q(>I_z(|97QW2ARpAT-eq8E9Ac(m^!gHA`>kWcH)ES!-|P zZAimV9dr?qbyG63{_ea%YL0t1WhCd$ep-4oMOVG6vP?Toc+q#*zs*-r-@R~JmmH&s z_it2-$E8<9V22G0&RCAeS<(yLWphQV`ZHm(CE3&Oz1;jDP)Fw}lVD<&(L`WM@Nnv= zp!3TGse`S|o!nE|yHX4BRbQQqmfS66Z$1nm^nRJI{*jx*Pn62gNTzC4NK1;>D9Y!$n(EZc8!G&;-Yuha zs6`-hq86x*A>~ak#e0rht3iM56Gev)c5*ONSmuLhITsVs`3yudOvpO;P`^Caf`j{5 zuB#ByYhZLV0#!z-A}D(}^h#J1(37d#?%OK+@D&L2(BMy-VH!;rDrUbszK{tbqmvm- zb#>3=E122%$3N@|A9ZOi2BDuXh&xR-swuu-JRz9OP+Ck=DN<$0|A@pw@1Av5x69|a7j5v?)}C+nzt-p4~rB{ zTD^sKskxuWw`R4z@v%Gp=w5VfbJSyp;)gv&^-0eQ^6Scr1I!gmcO*wux8mStvCC~W z_RAo%b*$cE32*<)YJnA2+v<5@e9;(Rd&@vCw2vJ;;ED&E*p{5DgdST}0KvT3xE=w~ zlAYNhZRKhqsGsAvv)HqjFVeT$`P9J&cj3&kt8Hg>N`+pa6($$ATZ}u8*Yh_zfs`lm z9_Ii`56GP=*zDqf#7g2L`rNPG(!3Il9Zlg-ts|)n-~v%W|M-}%!_>WUu^>TmV7q4i z$HM1U2cV&bY$Bcqg1IweN-DNY2&5c;TzW? zdg=wQUp-~2U?%3wC-MbWhpS$D)BVHcEnFY)HpS|(GnJ%;>aC)*-0k+CKP(O;CB^<$ z>P%nqH$eD6I$OJ1mR}{ecettXhfp^_=JTGF_7^g~70B$dXb&HGI9sxz;^SDwh_nV3 z`gZfyS_CBW&DJWt&PrxSM2rYE;OCL+;fa{gC$rKJVcgTV0l}ReLfcKT>LwX8~K$*|1AbgHf7-P{0##L zIYAuFZB5X2{7Hewa~4Z+4C%~}Vp4_8P#l~v;QyX}v9*hZt!Oq5n+t)+rb4i`1lZ_# zefn+m{GZ7vvMCwguT`6k&esQOqw{rP6WJ6tUhdU1o1ws9xwYf3VzSy<+Y|V!x2=VJ e_TP0pY)kGx5&+oKW+-kjdknPF*!FDn0N@{nWGrR? literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/90_bend_V2.3mf b/resources/calibration/filament_pressure/90_bend_V2.3mf deleted file mode 100644 index 46f53a5158f2f1ec7c7c4873be850746f387e9a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1868 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 GO%VXp%XIqy delta 834 zcmey*^M|KCz?+#xmw|zS1Be+Iggc}8{zHKPg9wAMi@tG6ZhlH?jvkm~WDsDeUIJqdDswKVAJGa1QhvxQ93jghKWd(nlddYF6n}w#bI}9#2==i)~jCjG$`Ptb^?dpuKGT+-~ zvJw(2p5EDh=TzgTcl*vWn!el3oodyW!7*Zvv9!`x6Ap>D!js;& z=6(HO@M5KU@0tvY?tSYfRPJ3gKQH)?TmAO!Q*^Cw{=BBTDQxnyx(|D zf8O)!qPFkfzuQ-{E@Pfd#k`a|-b+{Pwa_@Ay-2|3( z)q46jTSXm<+o-;4N!e4T4=w`p-~IXNd~$Q{(nT6V^1ok-8@*-Pvz6aF>2{XBj#_8)rs~u(iY2K7u^22%j&j~lKiIp5A~L@?bfS{Px^f={+rI; z|N87C-NgsZvQCC6uUNBu*;M_@3Vr-_a?9@sJ3W)TcO`D_k;dttO}hUq;ZQ6PUX{aB zlJaotVaDFMZe9!mMfOJ}C#AQFr`NssxQNeYLZ(!@rz~r0#IcBzX_a4E^WNUqxc8S0 zHNA6e{>!Ao!~#n8lT}&uIN@n~atvz<Swk4*CX2C|3-Yl-QhR_m8#w(-O^#zz F1OP5Pcf|kz diff --git a/resources/calibration/filament_pressure/pa_border_b.3mf b/resources/calibration/filament_pressure/pa_border_b.3mf index 808c25c8c950b36030c63c7d4cafa6312ac2e553..cdfe1d0f40c5917a233277068d778f5ff6207604 100644 GIT binary patch delta 793 zcmV+!1LpjP4UP>GP)h>@EdT%j2mk;8004`{w2F}uD1W;G00000005m;O>dkq5Iv_- z|AXb8jls*8SCCw)NWE05+MFX}OhN@18M8|I>pKQ-vKs}ZTUPsldGp?z8GE+4dFnfK zP-bfNP~s>EF;aunbvrzic(x76@y+$;Pere5)gb^6Q;8p~9ru(@@=^6-3i?(WJ?X{< zQulOM_kUuT8zJp%fQ3qJ6lGzQ(2!v?53Mb6-*#QwE2|84ocm5VIW>^GpUc89?fVO5 zdI4;$=w783v-|Nvp3&%fmKMt4nbM=9>O!VUiM|uowsOfoTk>B`U0TDb^CVEj?C58b z7aE$BoQ;xtuxhX_J5IwGLwBzV=!K|-6=)E>Du3~>)^-Xb`#i$UkMFRC(P-49%mEf6 ze9gm34K)(*uEeAYdL&rb0I6pq)#UDgd@psU&4bbNh}ycuY!Q8Zf|lnc{&JhbYj=B# z=^9B-L)Rr;{Z`U0G!gc8M{!?iQ!8^{9ZfI$6-@8%?!J93ah^2^&!U`UlBFcBV@5=s zbAOU@7E6{_ahO3}$JHEs54CzKaroj>O^=H_c!tB`TDsSm-W{)|}2GNW_DT!}Z@GBnlGF6DRPY+PS|=BH#D8A4$SRMbbr__&3o#hW;I z;`lrccHxFDD4pQI#Rks%^L*f91LqP2T@ZBsw)6119tX4=e7=4z9pD4@4V>5Yxb1v> z9RixcKm1vBQ_7#?g06GK9qNLf&8woC+pd0@9H|Uts`8vPtVoeC zIjV$k77D_4X_h5Xs;V7d$3)Ru)uWZy4H7VR96yarDj_0HvWPV#u2@C#SSF-yQpOq2 z(kzzi%q!?355B;y`_F}6e*v@h0y6>xi^a5xlPv`{0lSlA1!MvJlgR~C0Wgyu1~(BP X1poj50000`O9lr30000ilV%1XF3ffE delta 786 zcmV+t1MU2d4TlX9P)h>@EdT%j2mk;8006KM2LX{1D1Wp900000005;`O>dkq5Iv_- z|AXb8Sz|sHSV3~BBK1k_OA+nD!?}<%LWoh^`gJG;+>Ane$&vU0TDjbtG8COCo3>rqzM_l0a zI`d2DDlBAD3_sU|I9w0B5;kg8SsL91yXO;ylf7JYp}=H~_da=XV@cza9P z63Na(mnBvH25Dv*PMzIB+?PsMpzq6*>3P4R>BHUKx32|_d6MxsNxZZU6ECU*;fc@( z&wtNEuoqz*CZRy|Vh+Fi3Z4q;zxaglah6BVcvx&pm)x%00z47K^K6%7c;O*>w$bDd ze(nO_UX(03ts}hu4)ORd&a&7Fe5ke-yCm{`pYP|iR&l=m1^UL&`yp?fY{um5O`~#y ztlBB%&T-C`IbsiW&Q|j(FQ=xhUM2_lz`4wXmkB@eBEJStKtbwz zaVdg$A9EgO=`tqr#z03FUOPz8*lGNvDGr%1;9eP4+>3%BMG|C6s<0MODdT+|EHf`> zvpo7jxAs35fBgls{Q@%r1h5bX0h2TZHUYGgYXxKh_LI;BQ~@cIB?dPU83h0U00000 QP)h~}00000C6jFiA-Pj#Q2+n{ diff --git a/resources/calibration/filament_pressure/pa_border_s.3mf b/resources/calibration/filament_pressure/pa_border_s.3mf index 0f1d4fd0ca8419e4d036169b530bae6876372808..baf634479558412f218141813812dac189bc5bcc 100644 GIT binary patch delta 834 zcmV-I1HJr@4TueYP)h>@EdT%j2mk;8001g+Lka)?|NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5CEwM00000006ZD00000005;`%Wm5+5ImLsb0(jeSV`@3)pUwF%rY^1F*f+vj zrr6!95_`cFH=K05g^K>FO#_se=N=z^e8)9P`T<55_P7wx>%te%DZ=q1_y{FC5X@|d z)YBkgv`4FG`+pM`}Vb>sSJfkvd~j`#JxD?!Yi_(@Kls?0Y#E$0UpkNF^Aus zf~Si5FFs*>oaNCoUKZQZCATZL08a$*UKnhmB99BaMbDU~zbT@?5AX#2L9$Kg+ZQEE za&LxzBI^B+px9(ZUO2T6g#5q3e@f<+%u398HXn&`6*%&j>{YW$gCnAQXimC!SRwns zo@}xY?fE48$hQBaRcAQdIl)D%xMacM0kC}WDh_unpTpq|KOT`YT~s>3z3b2Mp^Fth zn<(m{p!K(&htqX9q+Q{2^|R?9AF{9DoUX%vt>^3NY|Dsz$iBkobRF)b&Lun4&)ru$ zsoY&I*)mJ)#V*;|%qqoHH|k}2C`fjx2tv=#6XnHGq&yMg^vHQu$RyY$Jmt%%C~E^P zS$OR*L1TvzB@EdT%j2mk;8004|2z~le_|NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5CF*s00000006uK00000006C3QE!_t5Pt5Y{Rhi?HU>i=M9{uWmG&}e z+WK4>bF@r=5tyjmuiqJ*CaFZbY)cd+*x!BMcX#$ByLoDV8?uLCtaX>u!1F1APU*7l z9&$RFif!r5^~Voct4nAIg1a%NkH+*n&PVkKtsK3!R)ZdOWjv)@9+s`_rb;R^4amZk z9)Jr!*l=G^GIh1dXXU%I5v(1iu2Dy))_1(gU{1VPABkt8e>DuH+#Vm{dCeldsN zT?tP)^XS^)7rAuyCZULSM;+Y7%Fx^He-lAtr)A!;i*#r?KzmUumzI{=$ zB==^2C_|!+*jV)Yp+V{;={9w${}B5B4F6G*ujE!@&a?ZQm{%1!>SX*?Gc$uDqqyZdY>nY-&5UuKQH_!&Q&X<0GVP5CliN?8`Z5CM}Z2o?ot$|P)oi87R7wXMQU z>PB8x8)(VGYljUQJB%nl!Z8GX#Y7=W7A28j=_U Date: Thu, 7 Mar 2024 23:52:42 +1100 Subject: [PATCH 10/28] moved files new folder needed a more clear description of path when reading code, considering adding a "wave 90 bend" model, the "wave" style should make it more obvious between PA values instead of focusing on the corner. removed other border file, easier to use 1 model for the border. --- .../filament_pressure/90_bend_0.1.3mf | Bin 1874 -> 0 bytes .../filament_pressure/90_bend_0.2.3mf | Bin 1878 -> 0 bytes .../filament_pressure/90_bend_0.3.3mf | Bin 1869 -> 0 bytes .../filament_pressure/90_bend_0.4.3mf | Bin 1865 -> 0 bytes .../filament_pressure/90_bend_0.5.3mf | Bin 1897 -> 0 bytes .../filament_pressure/90_bend_0.6.3mf | Bin 1899 -> 0 bytes .../filament_pressure/90_bend_0.7.3mf | Bin 1896 -> 0 bytes .../filament_pressure/90_bend_0.8.3mf | Bin 1895 -> 0 bytes .../filament_pressure/90_bend_0.9.3mf | Bin 1897 -> 0 bytes .../filament_pressure/90_bend_1.0.3mf | Bin 1899 -> 0 bytes .../filament_pressure/90_bend_1.1.3mf | Bin 1896 -> 0 bytes .../filament_pressure/90_bend_1.2.3mf | Bin 1899 -> 0 bytes .../filament_pressure/90_bend_1.3.3mf | Bin 1896 -> 0 bytes .../filament_pressure/90_bend_1.4.3mf | Bin 1896 -> 0 bytes .../filament_pressure/90_bend_1.5.3mf | Bin 1899 -> 0 bytes .../filament_pressure/90_bend_1.6.3mf | Bin 1896 -> 0 bytes .../filament_pressure/90_bend_1.7.3mf | Bin 1898 -> 0 bytes .../filament_pressure/90_bend_1.8.3mf | Bin 1896 -> 0 bytes .../filament_pressure/90_bend_1.9.3mf | Bin 1894 -> 0 bytes .../filament_pressure/90_bend_2.0.3mf | Bin 1895 -> 0 bytes .../{pa_border_s.3mf => pa_border.3mf} | Bin .../filament_pressure/pa_border_b.3mf | Bin 1678 -> 0 bytes .../scaled_with_nozzle_size/90_bend_0.10.3mf | Bin 0 -> 1882 bytes .../scaled_with_nozzle_size/90_bend_0.20.3mf | Bin 0 -> 1880 bytes .../scaled_with_nozzle_size/90_bend_0.30.3mf | Bin 0 -> 1875 bytes .../scaled_with_nozzle_size/90_bend_0.40.3mf | Bin 0 -> 1868 bytes .../scaled_with_nozzle_size/90_bend_0.50.3mf | Bin 0 -> 1891 bytes .../scaled_with_nozzle_size/90_bend_0.60.3mf | Bin 0 -> 1896 bytes .../scaled_with_nozzle_size/90_bend_0.70.3mf | Bin 0 -> 1896 bytes .../scaled_with_nozzle_size/90_bend_0.80.3mf | Bin 0 -> 1891 bytes .../scaled_with_nozzle_size/90_bend_0.90.3mf | Bin 0 -> 1899 bytes .../scaled_with_nozzle_size/90_bend_1.00.3mf | Bin 0 -> 1895 bytes .../scaled_with_nozzle_size/90_bend_1.10.3mf | Bin 0 -> 1908 bytes .../scaled_with_nozzle_size/90_bend_1.20.3mf | Bin 0 -> 1904 bytes .../scaled_with_nozzle_size/90_bend_1.30.3mf | Bin 0 -> 1905 bytes .../scaled_with_nozzle_size/90_bend_1.40.3mf | Bin 0 -> 1894 bytes .../scaled_with_nozzle_size/90_bend_1.50.3mf | Bin 0 -> 1894 bytes .../scaled_with_nozzle_size/90_bend_1.60.3mf | Bin 0 -> 1895 bytes .../scaled_with_nozzle_size/90_bend_1.70.3mf | Bin 0 -> 1898 bytes .../scaled_with_nozzle_size/90_bend_1.80.3mf | Bin 0 -> 1904 bytes .../scaled_with_nozzle_size/90_bend_1.90.3mf | Bin 0 -> 1894 bytes .../scaled_with_nozzle_size/90_bend_2.00.3mf | Bin 0 -> 1890 bytes 42 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 resources/calibration/filament_pressure/90_bend_0.1.3mf delete mode 100644 resources/calibration/filament_pressure/90_bend_0.2.3mf delete mode 100644 resources/calibration/filament_pressure/90_bend_0.3.3mf delete mode 100644 resources/calibration/filament_pressure/90_bend_0.4.3mf delete mode 100644 resources/calibration/filament_pressure/90_bend_0.5.3mf delete mode 100644 resources/calibration/filament_pressure/90_bend_0.6.3mf delete mode 100644 resources/calibration/filament_pressure/90_bend_0.7.3mf delete mode 100644 resources/calibration/filament_pressure/90_bend_0.8.3mf delete mode 100644 resources/calibration/filament_pressure/90_bend_0.9.3mf delete mode 100644 resources/calibration/filament_pressure/90_bend_1.0.3mf delete mode 100644 resources/calibration/filament_pressure/90_bend_1.1.3mf delete mode 100644 resources/calibration/filament_pressure/90_bend_1.2.3mf delete mode 100644 resources/calibration/filament_pressure/90_bend_1.3.3mf delete mode 100644 resources/calibration/filament_pressure/90_bend_1.4.3mf delete mode 100644 resources/calibration/filament_pressure/90_bend_1.5.3mf delete mode 100644 resources/calibration/filament_pressure/90_bend_1.6.3mf delete mode 100644 resources/calibration/filament_pressure/90_bend_1.7.3mf delete mode 100644 resources/calibration/filament_pressure/90_bend_1.8.3mf delete mode 100644 resources/calibration/filament_pressure/90_bend_1.9.3mf delete mode 100644 resources/calibration/filament_pressure/90_bend_2.0.3mf rename resources/calibration/filament_pressure/{pa_border_s.3mf => pa_border.3mf} (100%) delete mode 100644 resources/calibration/filament_pressure/pa_border_b.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.10.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.20.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.30.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.40.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.50.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.60.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.70.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.80.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.90.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.00.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.10.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.20.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.30.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.40.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.50.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.60.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.70.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.80.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.90.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_2.00.3mf diff --git a/resources/calibration/filament_pressure/90_bend_0.1.3mf b/resources/calibration/filament_pressure/90_bend_0.1.3mf deleted file mode 100644 index b0416961f8c1502cbe323252b61053341f50cdac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1874 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 P<}m|xfz*RSkAVRIrEwct diff --git a/resources/calibration/filament_pressure/90_bend_0.3.3mf b/resources/calibration/filament_pressure/90_bend_0.3.3mf deleted file mode 100644 index 6cb92a7e5f4fbb2f8a7a46ff9a45a4348bbbe86d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1869 zcmWIWW@gc4U|`??Vg`m&hFJmsp+JB^gu&QF-#8^VKP5Fs4@@#L2r#_m1}kN#VusLj z!+i7S7zo&I5BkqsbiRRCM_$`QFLX(qR%q@y?PMRPqsO_(2ecsrWG8awP#hdJr_13#`gSlIKSKKbSRO{(gN2G3hr7l_dYFE~h zNw$vXYR?+Z$$5J_{&IKO4Ri6fOp6Vnd+In%JMYTtKe7B4Yske~ma(iLa7z4%Dc<+4 z#H{r4`RN|~Z}SRoTbV3hCN;P2d5$p}855G;EPWBB8r^zRRgae=O^WZPy4p&s#Q-DSIm1dVHfw=Bb-0- z-n7bm;Be?J@OB^vYiZR}pF=+n}#k9_#H(NFH4+_jVS#S7vdDx4JM zTh}tZxtx!k;YsuDs}0SfPcH9xU@OBgAwT`dL9S1Z>iNf8yO|45_9Uk{#Y8Ee6_V_V zE^G>ITOzLFY_2Gq_Dyj5gfEg@qDC8&K3)r0v66As>K!ThM_#VGVDaJ1f#ro6T1%3r ztq{$+!yYq#&M%IqOeWSlC00hCh;ffS)>^pQ;+A_(lFs6r1u=(iWvFafe$tco3h$XS zagT(8vX<;@o?df-At00OmEZg*zRQNkkF_;i@cw;hyQb{h32y7&HC~B*$Nl%d+;bUQ z&L!_`Iv+$#*tK45o{9YGT@^EJyNFQ9v~^`Ece z0VsKwBSh~qEbj^f^KP_reqKpxUP*jNWkG6jtX@TK4k-JEFhR2II|#)vH|VU_5d#4` z?H_!K;hDjrE=x-J*X2LpZYjBy=Bu`FrrzD{<(EPoH;U~^HTwLQH~4+p`y+zKQkcy? zEnBmM!DQjq8|Foe)>TZ{y?piQUtdKOIpvOBInk(Lr#1BqL)>yB7l(HxiC<>zkf|2k zT6x)a#qCwQ!qpTQgB)i%8{Kx@+wSMzcjWY$xtqT!I_V$%TxoXN^wO_08%?fQy|LGj zk1DXgQqpry%6AWE>5*+;R{rP+ytg&(@s&*H%O_@Q?l{MCeNNOmtL`7WH~-nsC3SEq zZ~Xo1f1ggA*!|t)#*BYuZU)5yH!j>f_y6SN%U7~21?%=QqXt>=wa3$7LBhi#-inV}wT%<<>NosU^mM&{ zPgg@jt~~8q^0R`f8-aH;mmRcbO;vQ9V7yN1e_}uZw=8mbrB*Ms~ z%YdtZmw|e$0Z4Tt5Fpn9i3#1+tdJGHz DnIH{F diff --git a/resources/calibration/filament_pressure/90_bend_0.4.3mf b/resources/calibration/filament_pressure/90_bend_0.4.3mf deleted file mode 100644 index 7bbf7f0f6942df95944f9c90821076a7dfcee620..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1865 zcmWIWW@gc4U|`??Vg`msIfW1ZLxBK;2!pYUzHv%!eoAVN9++fg5MX%A4OYrf#tfn7 zhTYD)ZNO7|uit&)?u6! zVP~Vl@7ezIuXnJu`$hiH>tY<$j72V|t>U)&vr0X^cXz?>-Tv~Qmpxuo#&Cy^wQAa@ z4PXB@+IF|`#RYHNC%tR$mx${>1oJbj-)T-x=GU=%UG=b?(eICf%efn2n;d*YuZJox zc`@+8v@HE+Cq=r+&!{>O=)6P%5gsxA8Dwk+tv zvSmSGIj8Jrf12OCEA;TfYbpv!X^$jt^fK}`_3llG)ppemEjz-W#B%lT1ZQ21<&&&* zb6pzi!ZwMWn7E#O$B%!!=Oz@tII8eVStg;xy(v~R%I?jrcW>8?<_9=WvZ?7cqnUYqfo!?%k*WR1H=Cb`S_Vg zyj)P~v-?1|?~CB;PA_gBKfXSmOC*J{vtmObr{IlV@20y(dgghDl+OgsbB*MACHL&X zgWXRbv97uISmf~MCvr(`69Zf47XMzrf25naV$a7*CZ~-u=7gUx`rsj=Qqere{OHp& zo^xln+~{s@5ZLjzUhTo;BPmK7sv{c?oPKmF&xoC6epyF%=k$raoOOj;(~L8xw4H8Q zTynL)ttwF}%~0g-xqYjaiL<>b-O0ClY4p}TB6n9cTL0eUQE;@x_haZ~OP?PhuhuGw zzx`Ogc}>*3)B7Lnd|~|kzr@m*L&JREco#tG4bJHE=JD7%r1||q|X1rpr$qk3l-fP8|JcL);F1@+)SYw!3Z`vHO%W=6= z-+Ow6GD|Pi>tEG<>Z#UJ##>J>&dqN4*7UkcT47u8t7R>EzmIE4Eve1($(C4R`*CHZ zgHP|4?95LWa}(L6&YA{TZkXb3%CaLYcZn45K3#{)lcjdfcz?%SdEx)JSLZD@Z@e?# zTyU${lYcjlO`e_{`uY1^W$%Jx#!|aDA71I@Ov{@&?a)%mhcO!@KG$05OI516K0dQ2 zOSDmF2CJHnlH(?m5<~wM>0qB2sj1aBk|JidG`-6dJ0BhV&i|dFUPsv5cOPDx2cYCz zju5@euzV{F%(v0b`FSO&c_r~7l?AEAv3eD`IiRc?!UV~(?;sSz+@P~wM+^k)w14m^ zhGzzgx-2Q>Uzh)YyQSn-ny=cznR<7(mtP8X+$gpu)#&qI-r)CX?~e!`OJO$qv~0~1 z29t$bZ6&ysr_fU4jBlvoafr-d}H_BD@`2|dn-O_)izGZtKaZb(bM(*JzWhA zx$?Ac$TF z_RsL~4_khSz39yryQsN8dt}*i^L8oU@z{Cv$61DDdUYEX)v^6*zID)Le$8y|$GTy? zSM##Ao(z7{bw*cv%F{K!+uQ`U_Q|HQM$ENO`nXN6muZ~><8#L!n>(h82Y53w=`!Fd z+-0C1YXH)qaKJ3;B`}J5s1^ovlTni&y2)4*qXb4`+ySjm&<#h8D0IV7qD=xL+Fr9j z+#KM|#-;;xJ|s*a9H^ZPFq#J%?YCLs`q)9N=WGx@NIJlq70hD>>H?_;g&qR~05eVs AkpKVy diff --git a/resources/calibration/filament_pressure/90_bend_0.5.3mf b/resources/calibration/filament_pressure/90_bend_0.5.3mf deleted file mode 100644 index 78be36c305872add2c5374fd9d083930b7fe76f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1897 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 diff --git a/resources/calibration/filament_pressure/90_bend_0.7.3mf b/resources/calibration/filament_pressure/90_bend_0.7.3mf deleted file mode 100644 index bde6a9b72afa9f4205ef7d7e9f7a9567ac8fc003..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1896 zcmZ`)3pmqV82`I$L`f>QTpL-*+*i5AP`QLrdK4=5zAePj1Y-3i~1~jz6am;KhOVtpL5Q8-gD0HeShb5aS##J0RTXJ{s(}(n?kC; z7C&iV17K*QYv>n<^Fv`^zoif$4S?7DHU)?x3;L#q6OODWZC-}_B@)~i#VYei@h;k1 z?OxPLhKOvr(dP?76S-|+U`Ik)okn4UdcvI9I4fJi3A9a1-$i`Fjy{$7#8)vMp)}HEs{x zGL*yocjwYok%bqb7iA7=d1j{ilm=)#;N(EeW_eO4875M}>Cacm%2)JF!AV}b-Vx^d zeIdAdzH9QW%GgX_;hLOS>tvqjhD%f&{{wc2mUn=pFo7PPOg0`r@o^F_`sC*~<5Q%x zv4JL?jnWL+gWXI$#j=rHS_h^L$O ztk=5Sr*__h&EDLO85tUR_iUZY7cCmw8NCU91;gd)YvqQ@b#POa{dBWt@P^mZs&_uz zhsJqR+BzOL<*3T`ab!_i$e2Nm%h$`f*BoWcGfQn#nt9IqQBQ8HP%uM|yKVv*l(L zU`K+!+&w=b43Q$}U9YQU!5J5(CHin?e>JEv&@r53 zXHa5Vj&Dc~aC9w2tj0$X$K&bNER;?BQLU^f{T-3bQ`*g=>#u=LhpIJwqR}KH;|S1Z z7Bd5;ce48$i9V#=jG=>ziIH7771X~p$wuzTGCcxRm}Q=LI3vX_>vrL${rybJty6S^ z_6BggvrZME3G80h)Jfu24Q7X6;UOj=dyYzeieXZsK~+E&BA~G?t|>2;**5l;14Y>u zjPcPezS2@r5jOTcD4XZuTk$zb=lw0-I?WiR&qUW(>_M0w6OMgowhEJ4AFa$a8%)hN zlR2LGwAr(v)w8cJ5o~ua%}eH0R77(LLJ>sh6=Sls6+3K+=_sk^UK(FfWXGONmC$I< zSsK`44&<_g*5dB4mOr#!KTqq!2pl#Pg$?y_4-Z0xc)?BwVg$@~7hYiW*n$EmNR~ZA zPufD8C#CM;@3zqEcDn^R=LvO8%x7m z%nQ4U=pI|tgpgL52!k%$>P!2blNqm>l#=i2*19hy!{M)uoB7NKMjVq-OQ@=6kR>NH zk*(-dwF=L8Javl~=lZVHyPxBaXnC2vwVW;5M)oW=N#IqM%s!D&ti8F$=Y8AUKx%5j zv{8G;PlBCZh;(~X2m4n;S_>y&*SfRSB1<6)Y3;xE2QtZd$b5oPm=IlkkMoZ!R=EfwYX#;5BH1&ajVN$#8T&NP8w0Jo?DO zlQNU23=YK7A>Df`Uhr5z0qpF3>RB-VLT9Z_PGq)Zzs|v=x7dKv2DguwnL66(19yJJ z+DVrtE2BV%D3-@39>bD^i`9e%t#~DIL^&4+Az>Zh|K5J3#fwGFYXJ@`D}nrqO0c*D zSnhdg`YreTpUEh{A{pBj%gu7aGoCHS`l0Kv420|+b_6Pa%UdjWa?@DG#wBNqSw diff --git a/resources/calibration/filament_pressure/90_bend_0.8.3mf b/resources/calibration/filament_pressure/90_bend_0.8.3mf deleted file mode 100644 index 8669360bf51e3a7cee5c57441e4a34621eae48d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1895 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 diff --git a/resources/calibration/filament_pressure/90_bend_1.0.3mf b/resources/calibration/filament_pressure/90_bend_1.0.3mf deleted file mode 100644 index ca752bb3f981c2bdefee9d2ff1d5fcc20c2e2fe8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1899 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 diff --git a/resources/calibration/filament_pressure/90_bend_1.3.3mf b/resources/calibration/filament_pressure/90_bend_1.3.3mf deleted file mode 100644 index 1ae9dfffab6682a86b8b23976164ad25d45fb029..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1896 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 diff --git a/resources/calibration/filament_pressure/90_bend_1.5.3mf b/resources/calibration/filament_pressure/90_bend_1.5.3mf deleted file mode 100644 index b2b5a8fa211f4920c7c17be426890894a6ffd700..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1899 zcmZ`)3pmqj82`K9&ZHvJigh#hg&fyqhGdqz)+&UNnF*7qv%-p_8{xFkx=2=%)DmXu zkWwyl8_lIALWgoWZZpxb=sAx%=l?zb_kF(ad%ySlzTf-)zSk8cA*l}lfb8NA0H!;I z=f5t0N`Nw8Y-ea37#1FgBN%*>Vt^7L4fM#njg)ENSd-;_YB zgSPlMU_TFl*Tdwtz_ET<+85znaZ9w(4!NvJh}g6InIW%^h+toh@^)5o1pX{stFR$? zn=tZD)&g9MSrB6Tlsr2e)eg!$q7Te??A?@WbsZe6qhVL0RUTR!K|PD@>~AtBw~dnv zW3>lYKQilw$=3uBKf*3yqWG__lF(hI^i=&&>M0sI87TED&}OGrdT0_>XjH5@PdYKzSaNmDY??M2fi2sEme{oJ@tD6u z!22_LiqD}s?lup4dt!Wluen+jO!tq&d_))%))PKqyR@ckt+1zKtSx128B5+*cEW;0(g-r43d53wdr4igX7*gcYelZdYgxtyn4Gw_%78d-tn zhgFj7wOKqjWtr7rbD3htM`$iQ-l%qt(zL{|`d z>j{-dD2JF5P8VTr$FpV}=N>(KkKjQwza;y90Ux6p(}7l9)o3-`J6O$6IUb*w2~vDH z!m9M`=^@yH!HQHvSg#*0F%ij6UBywUt}Ht3uy)Fc;Xf(%22apeOX_6&KpOj3s2o-@|OM^8zw46 zy+S-KC`eD0szPi;wUI8EWEY-hrH{@rNy_&rj!3OG**?nVCadSA6e;c8vUB(zWsVh1 zo?(%gPDmA4RmCM7yMd=n9?Tl{ImU_R)%WYIjo*?hZ{#9vdQ`%M;dyQNJnYul+Nnt$ zd`3_1;PlaS~J8< z(27>0MCi0{z_dFy?+^81-->S*2B|u9-^(}4LwLoRK=FIeRZnPJsYJi1%7qS3S{N_7q4H~Up z{W4I(^zXcaT)^aJG4I#NoWkR&<&1lE!YO5l+@_b@SMgA|PG&ve!!WY586h2>%qj(+ zP$`aWwZ7Ap&)TcgwM#jYZ?0ksEzSwbnO~mCt5@Cz`SRb) z_ot07mhi=qLg?|9h|SP(_6WC^VQ@EiItE=wfFt;9WsSQ$b2JlgeXG;krY9t zAhv`Na~Ue!r3U#bm=dK?{wb1I{+64NtX6S+T<5p=RN|?kS;!uH{yTjrbW=>wbilyT zIG$U#c3!2W6b^z&HGaDOAj7ZrbDRvL4qE>eHUe`;Pp1C-#CXaQJr198C5co zpB}@p^x5+prNfA2>_yLSCo{rXiQ?UiR?w_0l+^oawG-- diff --git a/resources/calibration/filament_pressure/90_bend_1.6.3mf b/resources/calibration/filament_pressure/90_bend_1.6.3mf deleted file mode 100644 index 56455a8fc687b4cef7df741db832bad44469c444..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1896 zcmZ`)4LH+V82_UUV>OmY$m&+Bm^CTW&37t`%}0r%(zc?ZSlCFGN(qq^V|{pHi3m-T z<|5o=mXE2Gk3MKCY4X{o)V1ijkGl7Np8xwk=bZPv=bYdB{?1Flsmw7206=Z(2Y`2g zjr{w}2Lt8<=8k6O#Gnu&iGunel>it3hW;=G(p9E)u9pkG3k}}@TuFlLk9_3r5MHNzGBjQ68_M5TH zK<&y66n@yd%Fy|cftJiSo7_s)cpzvVVY#c;bX?sw_9UmAZYi`<&&V*LgG=06jO#_X zR*rKyq+oxMuJ$`ATa#XcE8=zxJBj-uas#)Tj8S9f*&MGn_cx?tAAM7shph1L@kMlo zat~EXBtAXRjxqyG#8&gSbE4Oe+s~D$Bg1nFD!)|?HpFdD#}2LNA31BmlJtFW(R^9c z3_T**@)<*o5$YVjLGaLbzI*WY`(&$@Qtyei9OGjVQC}u^xz_TwEY#pOx1&oR*5U?g zB_)PVoBHJ#F-Rx&N`1|f@{8xOL#|eDKcQRW$Xtv_R8fwfU_{>q@cC)WO%iNHaL@Nx zlTS;S+8-8%Vyoi!)G-fr!sOv*^^CD;`+yuIu#U>Egc zsY6an^Pe03d7rr1BCqfTBEhQq@p+=}HSxL}$2)MB>g?6l0TZBrarIqs@X^*wX0~NG zran(Ol}t9#&9De=#&wT^0@nGeTz0J*d?IwatGxuu5-v@IC)kc?_G&G-kt#;@Gukaj zh=JKsP1jPpHvuOvtNSqewS2^FyFXLI1P{rm157mogl`HBbBCd88|M5`enE>YB*-y5 zrhcx;Bff7Bg$}I+5sJ5DZYVy;H6uySZAY(exP`*wGLdlnnd*CR=VLn`pJ)-=Ie$b# zBJ0MZn9}+O3{v`qBnwHsAvDoCDExt1oN-dnm1?@~f+ZXcyWD2T!ZlhtiGxiv7QgGP z5tZTdl?{&hqCuENYc)?)`%hZKr)a&)Atabe3a0Myq#Y)O`Jy6&C<uW&3{<4^&5&9&?Bo+jm4m3VTX^D(9xrle)iFj&@bNox#MVtOdrXl?qX_c&e(_?%?*%bJ{x8GpqVzE<>CVia kz)!6?6ZVOJ*QqKj!9OGbD5eQG5Lhv$GSw9J3iJTrAE~S*QUCw| diff --git a/resources/calibration/filament_pressure/90_bend_1.7.3mf b/resources/calibration/filament_pressure/90_bend_1.7.3mf deleted file mode 100644 index 12802a324b41b4e212b27224386fb87498e200c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1898 zcmWIWW@gc4U|`??Vg`o5Jda8Lp+JB^gu&QF-#8^VKP5Fs4@@#L2r#hmf|W8%XNJ&A z!+rDT7zo&I5Bkqsbe`?Z^+%#hrfUW1PhDm9{Defl)6wHxXSB|)f6p`Hjasi~z~*+A zKWX=7n%g|BYSF}SYYmz5eG_BPhft#*Ot&!Vp{ldqL5T_ww~-P!Nm zR=an$`4hgc5^TO5vgv)>y9Kc~P2(cW7RmBEz1rBWGw)5+Q&zifTYH6bH^QvceM7H@ zF5dEr^Vyy2OfN&c^XvTdZzbN(S(3?;vf8C~*{mb)`lUb1{9Y%sl+D^_SxR6?&Y2L6 zi&vapd-;8RzwB3fV6?4F)?^l+JGxbDI|DB)cydGg=GLgKQmY@&lNWsPuAQe!(Q9Gr z8Dkre?_hD9?MI+dFIBK9?e(% zI;Ble`BuiRRJ{lj@A=Ebmb}l;+gIDl=)Kd&B`Cn2Q%LHg$|9#0!>R2`ye!?`Y8DI9 z3qS1Ez3S}uM}2PAj`=SfjdLV(-o)Hy|LkOI(U5+IH*$uWfkpiSulr9I%5R=x(Ldod zZ_OXYb1}EuPF#0Z5S~zAp6Drb_@7hXcjfS_0mtsj`diMo)SGutsj;El>7Vlf>4ht2 ztL)Zb^fohV+_d$=^}VeEav#-~pYt!14s#C6=AI$_^Pk$Ls}p!r^xJ-x8qb@&mm^Yj z@#^U3rQ5#FsDEMf{^+^0CV#GHynofbcF&$dznojX%NfqwJQsPUvPa}254*Owg~aa9 zZ1rv3=`u2WGxRq-N?`pgDKjTyT1~+^1-^5-XVQ-!JjHtM-06hReyuaQ9M`wr3^~Lj zFeR!X=i@PjnRjJlcBQzRZd-FqvCV41m+vXD3%;2xa@ip4dti>Xo#Zdp%Da(#4}Ltl6cld1BSGfVfr%X~hk{cPMh6G027WeUGj5}5TH zzD+sySylPWilv`Yt9VVlA}7q;J}2jyRExMnvFoWlKfBt#FFjLTCVHl8^?z9dP%<`0h~8yb#uf%<>}cowypq(s zlK7Cyg4E(zy^7o%P~HwFU5Q<@L&{?k|1_E~4Kll{GGlNB4mXz|Z%YVS#QgSQJ zS8d@;y}R4XFNHd86x)+(^!YDu@cXp)M+A?hFq?f^wq^-~$-=ES%!?MStC+BR`RdcZ zzKSSv${o9MqEW+6Yw8(>xaCGJ4)015zs%YpQ!To+^0MuU+pBhkt0^!BInH!8y6w8R z-Os=8$muh4H-A%f(m(pS((JV9rC(<@nq0AZW3M3}RbYRmr01NJ?;g(5Bip{L{LvA3 zZ)@D+E1AxhPt4ZbagOEsoTznH-9L73{fln|`1{xYKAkwR`@6}F8UM=M42lJA zT)27e|H;XhuVh&Y*6n3R4YJ~EkEg+cj2jqa@kOaQ#rk?65)@S2jF2$e3=OK({3aX3u7-wOdD^$+X9ZO^0`F)pJ7~?C zs^~buc%Nj<@`O`wtJs%6&Z^vTX@zlmkbR5FkCUpbwdWH1XZZMsEkDFw^k$1))ZCvv zvTV6|yOi&E>^%D8EW6+hd zZUS5TWK&rq=GrHH+@{ydv`&HXx#N$`9aF^vycwBv8E}>UGEk2-0BKM-VAcf^7%cJgg8m2Y9ow=|G(i2@?nhY9|AX j=7C20AA~-3kV+0P$-n@T4)A7W1Bo#MAxJ$a^cWZbFYFV| diff --git a/resources/calibration/filament_pressure/90_bend_1.8.3mf b/resources/calibration/filament_pressure/90_bend_1.8.3mf deleted file mode 100644 index f8394870bcbdc7f69499fea14c9a16a2df56d192..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1896 zcmZ`)3pmqj82_WW3z0^ILUK0}$*o0lncHeoMzIwq*KLi7(j3VpBv#lX<=VxiHAHlj z%EG2?Y>~(g>gdL()gi~C=R9=I|9k%L`+VQ`e((2vzxVxpueZC{8e;$eBo}`Ga4H`) zUs(PW0A;{pkEumyL{up1gvk#n0w@5Iaz9Lge6b~6j_`~svsSQUxc#k}^F@}MI({8w zLE2x|dh6~$kIl7+yt>irpo)B2?XW=|i|o<8CL-1~#DSBrf7Sz$9>oZp3}jnxhX$=v z@gA*4%HDaa=?0^Yz&&UXC%!P}|IGo>@t&OF@b$o1+o+!ju+;mzs0I z<8=;ur8e&6l)s*-T}P05l%^PAX;-I3VQ%1@o#D;TYd#?9jNvYhPmgq^Ba)2#{+fsv z-&D)0Du6$?t`=!cCq8I}GjvO9clOQP?Iog{AYAVDMpLwtUBa1Tmae=^RCInDw7{}+ z3nBRGThLKZ@u>V%|I3rbbAnDc(Mv`=pHSD6jyq-rM)J&EU6@C)i4Wlo{=xjboCWQX zt$Qh2`8+vKVAu-qLB6{Z1?4*hF^5RKdHU zTu;bp{`9HthQx7+=FO+@cp16jjq@Q1m@Dto@kcVAo2m~JUg;X_!y1mttvwkT9o#ax z{xs3{mbC!c9#^jO4} z|4_w&9Yv}s(Q7QBzKS(aHJFF901Y;RVOY;N^_d8_3W!Qu&iPL~9n$ynd)3htXd%1q zNnR+qJ>BId{Sa^TlKAfpl)&yg&>rW}u4enMQ|DtHl*~qA9v=+Y=4|N9NxmbwfzS&I zpBh#Z%xHSAptU62g!PlwN{h5U1dWQsq9U_WCTc_`1v`ND)GNJWGSrA??suwJxsQVI=jHr9qCa*hJ_!}G zny$E223VF-xjSO7)x_nrRNn0RHmj^Hwdo1FGg;r>Aio?@Qr28fK~mX+E#0NFF;3%IYlI)!DGsRFnIUMQ%sr4+YcH1z8s^N8<>qF5 zvE*LM#?(Y8g;2?eEMY`h zh64FmJN3t(_cpa#GC=vVau6+Rc zYo>;HL}c@pm#+673wnSGlcc(9N#fs#1MPcCP8G@Uj1Oe>MTS#pet)KS8yj94yY+Xf zivsn61`6a)b~rlKV3H+Tqa`xoB%q|_Z}4^(5j6(>@9kG#zSx;XEyUs1N&x<)5-cwP zR(oEVeyctIXEK6+Nk-0cxmoReWuR6&UlBI&FJY4gEuGohU0mE~`S?qiEOnOm1b%AS h<*V1j-p+JB^gu&QF-#8^VKP5Fs4@@#L2rzK)f|W8%W`@v9 z!%yeUF%XH}9`v7aXZ8WMv<5+w*;+y7Q&*Y2J|QtV;G;yNr0UOK_qfZ_CLJ?baZ-ud z?)#i#`EM3CuR7nhP`B(Uz5leOa*D+!;o8XZa?6<^Pt~5hI=#F<^7iyig$#FkEq8{$ zs`&6X@XqOJ{c+LV3*~=%RW8c^yCJ92JTzuSCWBb~m*y|br^@VjJB&-Wp7M+~_r2?- z%HA}my>0QFH+N>w|Jtuc>hIsXNA|V4W!k=lGc6hK z`!`Qewrf1%_{G=$4)5QRl2=CR2X$)W3ZH$QQ?u{h;rxnP-#@CC_VdKXeLb45dBx{& zhuK=&yGHt^*PgFrece8Lc7FW93L%v#T(8tZw-zrh5#Js2>B8Oi&@H#$Kk5<_T_9fk zVY~KIXTKMl{VngE|MWm|8;@Dp$+yjQit;iCj9)bhY!H4fxM@k8)FoN(j?XMHaSk8b zExhxjmG1K~stGWjwD8Ih&{L9Lu(~d0T2)Oi|DOwzE ze*SjWYs31JssC2*ovr!f-ivp$y3gj^vrsqV|D|~#_`GGSWutD{y9@HW?_dxEVPqh7RkkgW-ldD<^odh%HC&nCVF}ZZl z)wVz?eZEic<+%qvw?)**B^oAkHyZ~fdR=Ud6M&I5v%IB%*mOII*%34S$8 z+HFRl_p`LBttL^1C(f9wFWATNP&6QZl2QH6B@cTwKgY+gZBAM>`_s>;uwyZoD%|fH zaeA32CB76ZjM;I}@5mOf)jK*SJ>{Er)oa_iL*3g=G`8%#EgGmJ`Fy3c7-Oljlz};C zLtpEplLlUwR*0N#HTs-h`GGa><9(?gU)TdsGBrnt-ep*(76xYOXy^RAlGMDC_>jti z)Z$pZirgGfz7Ao6Rax2YOZQ)G4 zyW7hzg*t8&+mmYa`7dwq`?U8*1dpXKn|)fgW(kAI!mT&Vix#b`n6P{K>eIiziYRi* z9lLU(QNvDa>KTT( z?Q_1d`|g#d4vD=LAGK;5C*;*{_^IgWdjFoThK5{u+PCCq1ywf!?`SSNXw90c=s3Z6 zpJdGPgi~*;*q1-fs@!pDg>ib2eT&MEld7z>=Mwv8`1pq{Kg3@2W{X|a+@C$NY`J;6 zl<#=#Jo@7-!!o_P4U6j7el_1Z=rX@%Huq!Qu->bASzAvAKj}K7t3BoEn%`}10$clJ zQ&}VC+9!S7rq|1~PJ!{c(eLX;3&|)&mk4^#D{01G>qm z$q(IRtcg(qBQaiuRyOE{qec|E;V982fe~#StPnQ`c(bwTK%EZ>69@-tCj*S;fkyie egg$nVN)|B5zyOjC@MdKLi7^8qNIfX@7#IM*@)pSe diff --git a/resources/calibration/filament_pressure/90_bend_2.0.3mf b/resources/calibration/filament_pressure/90_bend_2.0.3mf deleted file mode 100644 index d0c9ccf03f064f62cc3edd14c3607ebb13701a69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1895 zcmZ`)2{hDQ6#p}fq-7*avX*L!8571DvLuWo6o(`-WN9##h-^cYC9)jV3=#%~G|eCl z#+I5Pp+cr)tR)J`?laN(4!-aI&i~%?-n;L<_kQ>O-ZevkxL^PPY+3mM03lxHx4ia2 zfZc$izPzH-6;CI$2mFuZ03ZO@_CKaT3TRd5TG25*s*q!cYL;*{_+MF{#0*~@KqS&R zb>6$^?Ng(0YJztmy%v6bge7H^UOFP=2%;Pisw}LG#ryvpD0L^0#E8zrC|zop>eC_I z<+=GgjIYCk{q&(wEg`0q(>I_z(|97QW2ARpAT-eq8E9Ac(m^!gHA`>kWcH)ES!-|P zZAimV9dr?qbyG63{_ea%YL0t1WhCd$ep-4oMOVG6vP?Toc+q#*zs*-r-@R~JmmH&s z_it2-$E8<9V22G0&RCAeS<(yLWphQV`ZHm(CE3&Oz1;jDP)Fw}lVD<&(L`WM@Nnv= zp!3TGse`S|o!nE|yHX4BRbQQqmfS66Z$1nm^nRJI{*jx*Pn62gNTzC4NK1;>D9Y!$n(EZc8!G&;-Yuha zs6`-hq86x*A>~ak#e0rht3iM56Gev)c5*ONSmuLhITsVs`3yudOvpO;P`^Caf`j{5 zuB#ByYhZLV0#!z-A}D(}^h#J1(37d#?%OK+@D&L2(BMy-VH!;rDrUbszK{tbqmvm- zb#>3=E122%$3N@|A9ZOi2BDuXh&xR-swuu-JRz9OP+Ck=DN<$0|A@pw@1Av5x69|a7j5v?)}C+nzt-p4~rB{ zTD^sKskxuWw`R4z@v%Gp=w5VfbJSyp;)gv&^-0eQ^6Scr1I!gmcO*wux8mStvCC~W z_RAo%b*$cE32*<)YJnA2+v<5@e9;(Rd&@vCw2vJ;;ED&E*p{5DgdST}0KvT3xE=w~ zlAYNhZRKhqsGsAvv)HqjFVeT$`P9J&cj3&kt8Hg>N`+pa6($$ATZ}u8*Yh_zfs`lm z9_Ii`56GP=*zDqf#7g2L`rNPG(!3Il9Zlg-ts|)n-~v%W|M-}%!_>WUu^>TmV7q4i z$HM1U2cV&bY$Bcqg1IweN-DNY2&5c;TzW? zdg=wQUp-~2U?%3wC-MbWhpS$D)BVHcEnFY)HpS|(GnJ%;>aC)*-0k+CKP(O;CB^<$ z>P%nqH$eD6I$OJ1mR}{ecettXhfp^_=JTGF_7^g~70B$dXb&HGI9sxz;^SDwh_nV3 z`gZfyS_CBW&DJWt&PrxSM2rYE;OCL+;fa{gC$rKJVcgTV0l}ReLfcKT>LwX8~K$*|1AbgHf7-P{0##L zIYAuFZB5X2{7Hewa~4Z+4C%~}Vp4_8P#l~v;QyX}v9*hZt!Oq5n+t)+rb4i`1lZ_# zefn+m{GZ7vvMCwguT`6k&esQOqw{rP6WJ6tUhdU1o1ws9xwYf3VzSy<+Y|V!x2=VJ e_TP0pY)kGx5&+oKW+-kjdknPF*!FDn0N@{nWGrR? diff --git a/resources/calibration/filament_pressure/pa_border_s.3mf b/resources/calibration/filament_pressure/pa_border.3mf similarity index 100% rename from resources/calibration/filament_pressure/pa_border_s.3mf rename to resources/calibration/filament_pressure/pa_border.3mf diff --git a/resources/calibration/filament_pressure/pa_border_b.3mf b/resources/calibration/filament_pressure/pa_border_b.3mf deleted file mode 100644 index cdfe1d0f40c5917a233277068d778f5ff6207604..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1678 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 literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.40.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.40.3mf new file mode 100644 index 0000000000000000000000000000000000000000..70dd9d8936527328a3bb1f27409bc21009aaf436 GIT binary patch literal 1868 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 ZBbWrzKz4vPD;r3R83;k@L7~UM003nI5as{? literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.60.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.60.3mf new file mode 100644 index 0000000000000000000000000000000000000000..d4414a24389a793e637f5b0ed36bf9a32f15a823 GIT binary patch literal 1896 zcmWIWW@gc4U|`??Vg?4=wUt5tp+JB^gu&QF-#8^VKP5Fs4@@#L2r#hof|W8%Wrom8 z!*Ay;u@I=8H}#qPgzq!EcV2FqIX!eqtz_ob$GS>(=bGlO>j?z2J6|?T=XW-1+L4^Q<#dbC*APJ^g(Ble+<(*O&_I zMW48ydVH`{{hyMRnPu$ZkM0&@=r3y7tY$*Qlzmg!dk1` zXlhfb?&M7mz5kt@^gk;rpLcoKL$U>WR|~`SR>c|Gs860@sI1TO-Z`1S$}?3YE?pTrZR>`^Q;wN+KV;{3IaL#t zTE}5q6?6AsdVJ^gri%2%NmY?w4w}r7ymQlZr~j+gimeR(!s=X)E;OI}$(UK?CsrZo z+xe9(rtkej@r~D>l)2Q&F!?A5SvZOXaXkxsT=!&|^z1ahNlPQQWyRS3^!a^{wmB>RN>lFyj0KsnNdz#&a-F1>R-Nf=C-{NsJ?ziUi@*` zo7fY}X6&sju?xH1_tRCc{QlfKF^A^&{@c0N>eR2^(nY5;t$tR#j9kvZcWY~>w9J~A zhYQ~7vHxKcUu&^LW`e%SqXgEUB7AwZ%<^}%J5Gn$8S{m$D@cpwYA^S6N#&{IJ*6eQ zs^P&Eh9lLP3y(-SUeZWx$|~h$EfNk1?O4R0VtV~gj)U{r+Z`tzEHAPZ=7zo&D|KL*$&kPoISyIZsF8={{OUbP?U$uoZ z_3myjzZB}YQEX4D(dWOs!SB=F9}zs3!ff_w*_tH`CJVRTFfUrPu42OO<*QHs`YNKx zDR=D3iAD`Ot*K`i;+7k^IJ_%K{4#5YOtt9N%FDJZZm-%EuBN~kI-TY0_N&o2QO0(0ZmwuhuXmZ8sjlG6^RDu1KlAd!?zI!-Jk8Jz0@<&JDy{&PN zuVgx3J~3N!$2pekbE4K+b^qAC`OkhXse?;-Gc>4D`_FP6G7xAv z&$Z9_#_qdUnmQ!*R(#Z|ZJdx-zu~8%r|bQDx*8gCwKTfK$)}Bl3pW)*lw)_x#(VH!HQFDLx$g<_; z?NYwuvGeGUvkc4h>NYH@WBb*7>!8d0n%Ufsb;EkE=4EX?8T_Q{jIQ>Sr)z$evl=Z-%%cT5!z@MdJvWx!ST%RoKW0Hi_TfLRkrVAKRqEez-; zqb5Ield&d735>*e9a`O>8;%-L=!T<2n*>I*aj`<&9N^8yrUP|8BupS2sGSTjng<%~ gzYzM^K`Pn6Bm)CTI>4Ki4J5`4gdp{x&|_c#0PLa}@Bjb+ literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.70.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.70.3mf new file mode 100644 index 0000000000000000000000000000000000000000..e3f3e98bab214395290973607fe5ed9693fcb892 GIT binary patch literal 1896 zcmWIWW@gc4U|`??Vj##oxAH#}2r!5+7`x~jr{w0Rq~_>>Nk#?%26kSE(y7c4dTF?C z{t^oT+w)$Z)4%NFn_08+-+ZO7kJ*D@bwp32BST(sevi!WI<*QS^C$H(-<%x1#v|-Uz=nx%PE?s`jpA)g^X(2OgcS3#fC5d~>f_4S_wPx4HMy3bb>>fN z+9Q^ldYL6sA30UNZOZ@ku<}Je`*OWvA)iarWz%n+KRKV@`UkJPT!+2;uj>mx2gUzc zzGPm8gyFK@-e80a)smxW1ePY356|OrPUCidbmkvGES>k%6 zQczuUL3;Uz?b=tf{a)N$Ar-GyYrtF1=3nObZgOP6dcFrY&pqb!Wh(f{d})asf99En zAG|yEG(6%jeD=i5rB24EyG5?Q^3X!_fX8)DR!L7U)PJb?eDkrZm*2Z6Jn%d5-{8aS z3s-Kxos_};eok-ugH2m6^k;J`UT}Ku6+7=uY6NfOS>1#@5n%?I;m1lGZ$5aZ@w;h@c&+99-LH+W*8RQU%bnb=bm89N9j%;_ zOa6*%tk$!rPM4ZvDfuQPdb8w{oj1c4ENd0h2sz_cbvx%<$+Er!Vn&^}t(o~haAhnv zF^!j4=&q|a{hjHhj8w<8f1lEflLh=5(p*mcsdPJBsrflS?cf@VYrd6or^;+Pz2~Xr zsW#nc&Chu$rZ{<>&Z$jFg{+%HEc_E9*M`16v&Ukw2cKeiX0WKsl2ZP4`46~TN^Yh3sx6$U zcXxaFrBKI>VtZ1JKL6znexLUKh~TjlX0uPr)+}K#S-ACvdC{VE6%%$ZUw!)5R}n={ zxnoyOG-}vsO+CX9x7^6Z;ay4MmsvYxsztX}UbbCvd)2ORH3h~X$C=JXw_W$P`}y}B zIeljC=5LBl`bR%knw>Vi^y|z^0=03hb|x^qiCO-NRXWWZRdOKRN>MZH;?; zCDZxxiP@Sv&aqsd6SdB&`^WChfA(`p9bC#AfB*X5rxPc3e>b@?<6oJZL9xJ%3pdaG zKRNmGl`Koay1mS(K~{Y2@ibVFaRY-az9==PSYHoBf`W>h5fVn5p+S|}f0pZzfk4Z7 zu6@oocHh0y)FH9A;-gk=GSt+w^*w)+sPPcl@!rW2$(7HzSiS1Fo`P2I{c}APou!%$h&~qb7iAVL&$- zHTj{Nj5RSzU?j%t(CP-=aMXxGHykC}Bru|lixuML0B<%n9jNmmVFKYm?PP$_JkV(W fh0wgal07K! literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.80.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.80.3mf new file mode 100644 index 0000000000000000000000000000000000000000..802393609ddc39bd5e04f48e1f2e00e191996db1 GIT binary patch literal 1891 zcmWIWW@gc4U|`??Vg?4q^Y3T>hXMfx5e8!yedCne{FKxjJuu10Ai%)R3s%Z7ff+(C z4L_Z?#6l#t-1{^CiOp;|_oghUzT9OpdzzbZr2DZQLQyte30^O2YVUKGt(w$1(`l|w z(1XXt=W1`12G`WSi+Zkee5K^CNe2Bw?%$GD%>K7gWwX^T$)CTT_Mdk(zp|;6;f}v* zWzegV4}U#vPWJi7UGFHI(YE;0kqbW)?|!VaD_ZzWFrvn==Muk0cde8_`a9{+N$WCi zFPrSu$70E^>uz~-_xJxg`oCUYcsu2##Rk(odp&g1_?OSMSzfpzeW8NvEKS3{Rdao& zK8Za&HS35_{jMYXXWg28c;!`<2}iE{n0ds{d9ui7jiVQ|Z)*4Geb01Ruxmco3fA>I zANifPj+|64ebwvHiuvjlKYm;9Q9hSBWwOlq4^0#GEo)b##QXFA{qX71srHqX6N4X0 z&uSI^aM*^+@}aPY%#jOxj~`o{QD45&TS({9bkX!k{gd;{Isdekmmi5Q|8+h3dbsmf zXRfUm3>Nuj`}1Epy`Ve%z4z^=?}z{Xjlb^|#HnUN)&u&3pt?BI>3nG0ETX4NJ zv`$*G+WN=s>z{V2e7U+}&OEVN1KxBt?cHqOJ@-#I&-Wnmk*kPg=V#$VOXB1%%}6~` z$*8Bl;D_@Z(;c$b_V<{46oe`Z1>7TdWZmhzQ}TGz9q-RN=fitftMjCIvxw!l{Ap|a ze{)u)=Oj1IJC@en4>qk`E8l)LNT2s*_A)*HZzef;H+yswF2w&nVz&K_K=t)A^6HP* z-q@`>JL%oCi$5cBtIyXz;rf5~q^?L!?w9_zR|C!R=NLyz{grvJ^!c2_lMZn1mbqhY z5wY`->#m_l=o&XgI-98#(|0gLk%JUGO5RWj)XbL3mgdeejj-;9#32-x0oIM-{FS=qeh zIj46s=iaSP*fRRvy_2I3E{T;q%$nM}Tk$PhrvI*$=g?K8X07P5UpqtmgRCHb?@%ALC;c*Du6pgKK)aeYIX z*WBX69JX18nY+Th7mGIQ)D$znGUQNquvHTMXSMj@o{%5;X$Ke0n!RlwPpamb*hr~e zrJ>yBLONx}a@X{HX9`44_@Hq~IO3wlO-pV4a~TutjBjpK@ZK?H!_-YzdUtrl$~|`v zPYIQCJ$q4*~U#djS2pY`CfegI02<_OWd49n5Nz#JXzoS#>cnpYAZQdy8% z9IIE6n*++!Axx0W{0>4f%nds0b;LlxPWuO+Vt8h-sLPU4{&o2exLZnYrTMBYoT+zr zd-NX zX71*1icb1RKUbQaHof%g%tn(dR&VSzNzx&;36+ z`SO)4OToIm%&0+DeC_cxSdei8gDk!%HK$l#4@823iklGyUv!%XzMS z&Np`7z0%YnvA5!*R&C>iy!s746+K<=-_zC5kSkC7mi(-s>PFxl&1DCzSyL4qCm8RO zj9H#=>TMPK^2b?~J1(s-P7ktgQTcIFm9_R>&f6JU1xN)r#xNryUk5tYoBZ? zYs6gpq>tP5dYRTKFg|zuvAJWacz`z}lP&|UVqXU8u?8Rw3J1(eKmwx@fNEhtHyJhg zp__~~F-l-0#!Jwe2HkMfh(b3UCE6q~qK%am;^qKvHZ~oo^C4jZ;Xv(VfYChAX#a}P d#|~1-2qu9vkR9O7$_5f+211Z}Q0Or*003^_7100y literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.90.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.90.3mf new file mode 100644 index 0000000000000000000000000000000000000000..c8915c80977dcc3a4485b422480f4b11b70164eb GIT binary patch literal 1899 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 literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.10.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.10.3mf new file mode 100644 index 0000000000000000000000000000000000000000..06f9975daba62563824c4693b908708ea447b795 GIT binary patch literal 1908 zcmZ{l3p|s17{}km<}zcG9J$3QQrOsbgf1*pTICwaWiE|~5fe&s?dsa0NF!>dNXm5# z(U3MPquiSklT+)$aSey)d_L-&_w#w5=Y2o_|MR^6_xn7*&tr)f64nL)Ky>j2fNLi* zr508$I3NRHOi`F)e*VXZzR2$u1i%3i*!QhKj?l8F+OtS^^ktkw@MBU>ONQNaEK^mw zOMh?8qqZG*m7-e|i%61Aw>Bj3CZj32TwQ0Xx$KtSX8z6DVphv1LT{5ni(BDrkxB>j z;>PW5_Q8`*$>vIZO7yzf!4t11(tH(x5D%P7s-fWQIT_TWq1&CW+((+{Z|!KSh_EeV zWJ)^adjqnB@tE-^kxdbBX|GYA!^!2O8&zrhC4~(pVS5d_=}8Ohwf&X;{;A#u#V;8K z_*T!!W`(ds6T-pWI76(ByJFflblTMlnEgH3pl|OL7u-i*DJCYUM{UY$dagmjV)yI9 ztj8%=DGeiNBUj;jvuYQPe!i?JAT!dy(-n3Jn-XVE#@6$AZi)KMxWqvHdSSH?htIap zisZAa=0Dy~vGABvZ|>WM#cUp!^@ayB5&J%v@y4Hwy|CCzD-xIHaQW-JTu@K5rNqAN zk&Y+w1n*@da8&Wh+wr4nyrmHMq8x6m@<3(9}mTW=HXsqg7cJYe~>!doS`G(0TJq`RHnagqGnw8tk!bG+TG?|a(ZK8 zGJhe8=i47k}T(Dw$k ze3iByCRozWPXBoI7^v=XBUG~1E;-5JWN~!3yhufDoRnZ4v%V%S{FGv0VZbS8#tyzQ znK{szTevYtUi6T*v3Pg-7TvwB(rUhzw@J5*Nim}mR^w5H6F2J=bS%%T*OlA1xyP83 zu){knrj##+k5MA~wZL8|CtYhQjW(}FpNBq^4>9Y3akI!a*#%=5enj<1Rop`p#PLsV zP7RS*u8Y}+EDYy$hCEF(hT?ldFCpB&9F|W~6^e`R-iOL;Rp#^|x^^1|obhr6*&A=C za_DZc%4O-;{sL;-W!!Kry?Y!ZN{F1flsd~&fbsD3b6;fHth=OplY2AtnP^066+%<< zI#o9~tTEm3Yw4YnwujA+AW_8(yGOyYF5$OvGi(;}P{U;mf^OvmK^B<4739LRLR5#M z%|v83jC{>v&p9ZEM>&3b0NFJsY`IF}qPEEP9}-`?C~-#ok8dMb>->zo@(Nx3qK?Mk0NwMQoi-u0rJv(WNqdxwt!BBDlUHL{>rgV%l_gDxT? z1QLCNP{<{_gbE5;W>m6*ikQ?Y-k<}IeJ);W(pBBx5q(jvCiKhJvr);UbH&rD=4QOt z+8P?lA)XT+!vUwetopX()o%wARdLCf+VxH}*JmG3i_ivr!YaA>7%yw1*iBO{YT&aR zx1{s~7Iw4-k-!h7yN*((4O_2UkYV&&gL8>gVLE$|mI|TA?oXFCX^mhvYOUssc@b^`r#i*tIOY{KXA5u>xSpWb4 literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.20.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.20.3mf new file mode 100644 index 0000000000000000000000000000000000000000..2ba7117cff7141d8adcdfdd3f2ff69b18684ad9e GIT binary patch literal 1904 zcmWIWW@gc4U|`??Vg?3*`TRWpp+JB^gu&QF-#8^VKP5Fs4@@#L2r#hof|WANWrom8 z!+rDT7zo&I5Bkqsbe@eT&Mxdi%qow)A**i9QNC6otYsIL5awA|n||P)YNk*5)w7BR z>*jq=dp2`!in+h;kty%U)27>|aPlwP<0a<`&jm67^Em)d)U%l^)(+1L9(ea~Lido`D$<>pS` zbvIx0ib$KFZdCTJ^gIT=d0YLrvA(^%dv|_(aS&T(Oi|pW+8JD@{w`UtyH+G{UQWf# zH;-F7g)VHi`f+#KCr$N#o-1VJ)awLz%h{~0)xSIHpHOH2(6hUT-BC*Dx#XoUcTK*S z>nNV%KEhP^L-E|4JEH3M?U^Pvs1!X`;cPm4rqHq|ls9#y^m5Nx=VZFoeNuW^%=BCS zv^Uht_}nW~4i6r^oUg|@<8l7A&0 zc%Qdyvuw1k-M3?X!G_HT8sF+z>{#5Z)*AvN?`>^SL7oipty*98H%^h)@>j6fs+oXdV!d*!+si@JeIgTT^>ZgMeyj z!|W4ssR?JMT4h!>Z@JDH-ORdo%Tu)pNJ4O^!Eu9xSJew~@M z|6WOMVu=RRTe)MpJ|4<%V_m+_DJ)CRn)8mw>Smf*ug%O{)>XPG3jz$IFI-RCyxiE5 zNq33xc57zo9SpaeU(K4`@gT6<<8hpCZxD~s=QGj){f-uluLLzeKa=ErzVuABDRMz->+J(jvNuPF-ep+!76xYT zXy^RAlGMDC_>jti)Z$pZirgGf4i901Rax2YOZQ)G4yW7hzg*t8&+mmYa`7dwq`?U8*1dpXKn|)fgW(kAI!mT&Vix#b` zn6P{K>eIiziYRi*9lLU(QNvDa>KTT(?Q_1d`|g#d4vD=LAGK;5C*;*{_^IgWdjFoThK5{u+PCCq1ywf! z?`SSNXw90c=s3Z6pJdGPgi~*;*q1-fs@!pDg>ib2eT&MEld7z>=Mwv8`1pq{Kg3@2 zW{X|a+@C$NY`J;6l<#=#Jo@7-!!o_P4U6j7el_1Z=rX@%Huq!Qu->bASzAvAKj}K7 zt3BoEn%`}10$clJQ&}VC+9!S7rq|1~PJ!{c(eLX;3&| z)(8?9H3C!%1G>qm$q(IRtcg(qBQf5GRy*j1qec|E;V982fe~#&tPnQ`c(bwTK%EZ> r69@-tCj*S;fkrzM8(bedh{Xpc85ls)0p6@&S!SRvka|$)F)#oCM}ige literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.30.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.30.3mf new file mode 100644 index 0000000000000000000000000000000000000000..31490cbc46d2c2185875806be680d8025ddc6106 GIT binary patch literal 1905 zcmZ`)3pmqj82`_*xg?X@ER<8EFxo^exrERnO;VQDZO)mrXs!_^r*e&kCR-x4dV1NREw$(?UICc62!3X(Wf&dr*mHBQ8Tn8`e9Cr>Wdz*r%&|yxNT>|mxOt}$? zjy23k+sQv@Ur&pcyS$o)HN|%cqw;Q69LMH3Ds6iGY>57)h|^G0Q>*Tr!&na zM$@eMYJiYVb#x2dQ4>BhYyWCG$43_kI_`Wp#Z>)Jkb?gGfm{4n$A+KPU=xRNt@^l5 zCq-p%L}Z=f+&a(8_n+se7c&d?n-D)R^Kg0nR!N_p`=(GCbE0wc=7fvW&gp4j94{lT z#b?^LiaNASFt9-(+XiiS_g1enbH`*^&#srp5-qRy;dj5ycv{@NA&C_{g^o3oNx<$t zuW&B+M6N+aOAd(gKD_aUQdNH}PVF?oxu*3_G7D>&XdoI|!Knj)+$ETd^A2Y&`eTT)=O>!=VS42nco8TFH|`HY*-~ zeG2xw$`}j$fO@I?%`wXhvGW0O^j(aJh5tnFITG$;cyQS4mqNNN!GUU+IKsxz)L4GU zayJP_V?(dwB@S!qf&{&*z6R!m@g%peN$un0%QAboM+jHDE#67ac!RFbIK%Db#P6(y zX$4?2FF4FX4kg-8Ts(mB4H^lHkT#$=jEJ%_QSck}qij!OBMf7k(+mIRws?!x<+T?t z%*uk-`Z&?GW6w*B(aqwHlvLjvA4>bvdBm0dGQUhE9bF2d)bfU(A}46_E@zP(yAIv5 zN`i56t62nbP)IGVB)D@sx0{aN9UY%>LXsm)%G09?6UNHhRR;pnEGQ)V7GW zYJYH`L84s2N!CVQySQ>RTS<9;H++^ADeC>oEdomZAU#ti--WEQ1@5r1!>Wm4PMlFB zHp!+O^R{6HE}0<>WmTD;V}Y2qciw10<}lU7zb^6kT*7jD+YN>v2Zr#Ttd zaj$WfT>S~K(IhiJ8!*f&Z8JV|vmiLBGWRa$^OS;yq&PCZ;jrkuH zTzjM%s#qGr-+ue`oeFoYbs(&Dx(({JUG+uhJ&7z1mr*jUu|vP^Q-~2~>x<9aV#5~G z5lij09=?_>{_#x+rz*(+R+%7AbZKvA>EXT>q79#&vFTCMidMQufoYtmvSjwL6rwgq z2H({>H;|khCp2uMeGS}cK!&wFZ*Th6K;^f1o5+P%gO@`_e$|)u12XA($na+fK4g95 zf?R+~8nlQ}$r4nA%RH$k2C(SArD|;2D&Mw5U4mB!Pi#I%Ng_oQ&1g8}#YpVx& zO&=fhJ=?bT%_e58nK(hiItg8)awzvm7F~7u^hpd_Lb%YnvICA>F69Kj9_GyR^Zz zKbEVflQNM1<-$%_X`&iI`~bu9*hCpJL9AdMXvkVraw%2W1p^Y(1OBfGs4jgha$Yas z@M}we|I!kcT!5b=FE78JBmZYH!hb2o?xnu-bMWPf`Z@Trw84K#o4okqn_Vyvi0;z! s7cp7fEZqtG&?}eH4u<^e2VGdnewP5SaO{E+|9%Rd_gb)DKo0=^0h|^qr2qf` literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.40.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.40.3mf new file mode 100644 index 0000000000000000000000000000000000000000..317d409fc190a3fb257d5aecb8f1f4214eef36b4 GIT binary patch literal 1894 zcmZ`)3pkW%6#k7nnQ@EBeF}{-LuTA_ncP_!5}`)5Gg_@E_gmyrgrSIBQzD}zOoQBt z5Mj2M+;eGY?37z$?Xa8HM9)5I_xqpkoag($bI$ku?>X;(uy))$2mk;CHYNZ(oGC0 zCMC%5;LYh`8Qnb-Pd|U6%)W3B246~eqO4&n4{0_@mL6sefABa!WDUU`QkoP8j1&)x zNHftGNzaswW$u@!3;EjgMIP?6nFu~HYNxU{_5eiQ%0Ry^EgC8OJaRUqZ&|L0(%9gH zI1PDGa3Qt-SYdpu|E%>@N9VZ|XPfbm<7F=DtEG194@gbg`G)d5N!c<+ z4uEaJLgem?GGepyH$mYozgE|<4Kw?1tw0bE@UGo#7)FD%j zx#|s_7&ll&*ZTP*BPG193bL2bg8Fm`tX$g=v7d#$m3r9Yrt&e;BSUJnXS%1NI6EE! zY4dbgtF;;|sao?8qQsvvPaep^hfx4)fR4(o(IWijDVfrqcbfx+HGhq8s)4 znK`mnXxrFg+uVIT%lE>^k*NY!Y@oron-Lw z*N`VCQ+I=-Tr_d`_7k+0KuJx+Y;Am+mgalQ0(28*cw7J zY#K(7iz!yNIJirMQPLW%D=hVwHDmEyn98vq+S)<%@ALI;pFyHBV+S54#bYi-2s ztt>iP9Wqd-cNeqTgLgfuZKn)5u7IZzofPViwu{&L;-xHi&bW<~v+z?I%eRGT@1nIA z=M=HqNG;%u?Egk;i49VFnECkz5_|(aox{!(0!|=9&-rk8?F`!F^Zcd)3Y>av+cZUu z_p`w;SMMV`&5MH|6@HV#@qr^=_NsSskZ)^4`i^3%q#6lYtj{7x7Q7bP#5(ZYI-l;9 z7X#=!lp$UJqKeRK4W$pd*Zz=%2`Y5ZI%D9*`!ag~T&b41>3ra+<=i^Ch@F(Mek0Q8 z{d!kbB`zmSj+xe|MN`6Iht#(2o&xd;?2tw~D@>6CKAXI6BSStiLl)t&YkwnD1U;kj!o%|NT@*rlmy0b7JuG%=PQZf1-!7 z*MluJ14M^j4O72#W%Sd|>Wf7+ac_q#V1Sk$UOZCJ^>m?j^sck%(aOTc?&8+ zTCY&6rfB?cLd|AF4R2|&iO{CdrF|D;uK7k+uEK0ACdLtPxI&26%Fpl5hYvZ9soiTa zjb|Knq0_kz_F zdA@VL^?SywpR}`kfqTfP%AzQ~wYZTM^TNnHVLHNv_{R4vrR&IaQV(MPjhXVlu2_mv zQsoJ}#|lhNFV!H4pb8}}28K;e%#_C3ae)xP|NZ&pwm$6AhUVb#V;_M2&rCLA-m#T- f_P>7o97~?B5&$^cSUX-m&O7dnhhxt{4*>oF{>U30 literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.50.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.50.3mf new file mode 100644 index 0000000000000000000000000000000000000000..6992e6a0a3aca4061d2962db035dbddefd64fe9d GIT binary patch literal 1894 zcmWIWW@gc4U|`??Vg`m8)tPetp+JB^gu&QF-#8^VKP5Fs4@@#L2r#hof|W8%W`@v9 z!%yeUF%XH}9`v7aXSUokQ-h|mVAog6g07~?Hs%Ux$tfEwHi^GqeQ=(;)MZCsG08I@ zEuY)H*?H2=etU1J$l-|Zv3@Ha3woEVd0zT`#$?a1GAFzGUmxtUtM#O~58RzGSzVLA z`nv4R$r;@jGqcUUB*%NUe_bp6VcUyks}hQ&8jhy^RfxI2c;f4yM`rDcdbVWk>}7ea zBFv8GYJ(TddGY4A{AVZgcei_uav5_&)f;X#ZBJh8q0njlHa$g}x3|f+IiXhFRo!scm9I`rS8Jy`>T<=MIP|J3 z?8%dKU1>+1pT8OS@9#e-wUMt`;%Gq&tC!u;zvgGHpWVHqAEfWx6)eB`GA=K6+OJR36N;8C zbeS18Pi}>QC zb>2{=Zf4EY9$lw$6i#hiNmOWq6D1NaeLjSeUS@}@UFxepDSn4vO}l!d=2go*vyE4ErH{m!e!hKjhgkL2 z)X+0=wpRJ8*S`PhtydgB_m0n@>u%p~#K@%XO_F_CGpo-ouIifM3D1JeM_lardIcBC zo-^0Ac8kfx@SPBsD*V9qQ-m+CmRbIec89mPoiX3NmFAR9BQ+&dC4}+d zN=6SwX=BxA98GSV!Xc}(H73knpye!5tFYSgxjM5{mYy;j^Gg@$6FVoVtFE8;%qB5& zLvx<)PPSQ(124@8Gsp}(R^S-tmKAPG&cvpf%$aWVJxlD&sg-#@GBvbMo%+67VN30- zBV{|fnXNfj9ZH+(K6zD-)~t?HrqfxPQP~fVO7dP>u5PX06MRf7Z}}Y2vKeeE=c+Mo z*Ph2A*EaR}@tT?H#^ux4;~$9qU)|_m&k%r;sX0RQF2gdlFfda`JLl(>q~?{xhg24% z7RTyU0YEb6kPlz(0R1MZfRTWP*(3uo%x z-Clkv)N!NOo>ZgHe|dx7r@cQScr1n4?9;L}OBhTRZoOe%v}j$$gx$+mpZ@h#M3GbO z*p(BF8g^P!&oIO-H*#@!SCaT;)()9!(XEx2ZCBi0wJTgrficK&rnAv)*S+n2{(VPI zpP9S)o1&Bc(a)7;r%f;YIv3v8M{ajK9m-5Enzy9~>#EISCO>WHiSLS9=EO6t(&2#@x zPQH94%TlmzFEeV86<>Qi4HjhFz#xk+O3f+O*8`EDpyFnPgwbYbP^I>t^fsq)mLMt0|!%-s&-Efp>lfZ~J4pxYp1H9STbfC_Mgb9QLwUYrx^FX8h f2SOh^NF@uHWMBYE2Y9oxfy9`B5TqUydJGHzDGdu= literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.60.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.60.3mf new file mode 100644 index 0000000000000000000000000000000000000000..71c89d2145c7b2dc8fa07ecb4fecccf83f8349c6 GIT binary patch literal 1895 zcmWIWW@gc4U|`??Vg`oW6I>hqLxBK;2!pYUzHv%!eoAVN9++fg5MW^E1uJEk!VIC8 zhM&%xV;~Z{J?KB<&g=uvOdktwnXMIMK6RDZYmOfEg^vuGjJ-a8-7Eg4a*3hrm6VAG z?d+c4X`ea!%je=?YxkS{q1V$|DyLX%5{-@A+Ak@2_1@h{=jYq)@t?hJ%2wtFWhYKd z4r-tKp8t`j+0O^2Q(x>}cw5`Qq*s2L@4dd?F)KE*i^Z4h{la`IX+GN#$=hD3OIE(x zm9=D&t>d}axr^uI-2E+o*~$9Ntf@x6d^w?U^Ove^-hJ3>p7Z^wivuR`ot+}#e$;E3 z(=*?>+M%7A|IUj1&&kT=Ymb`jAY^{*yh50i)Dnqm&0S$9!xBsGEEjBiwaty4e-}3OKP%M()Jx5su6y_E_&#ZVztA+58B5MvpW8BjVt+a3pSJSyBlG=#O?Q93blnft z)>#=67nf~a&i+jG!qLs&SLPo4{qEnt*VB7CCLQnDbY!XHkvkr0hjbrVlsUUSR!XUq z31)n8Q}$1;_s=fFJ-m$^UPWVA`XS9bWZ#GJov1}l#{OKsLI zjB7Z}t?^GFoiFd`$?g3N!W{+u$EK)XkX}(}U39Vc^p5QhqtB)Hb}z5*JkThu_&@Q1 zy!-aJNjZyH?pbPgKiIT%asKmZu5mJ#f|s51|7M~i7ulnm5a)8eQ&%oh@!P7I_x+A- zy|G%kJL%n{tCi8YKhMM$t^EJ$*)pzuX19+2dZaa5^!bTpw@Y|FEPXC>xTj^h+PZ=b z#f{C|tm8ju$Jji6kj?s2Nt>^1g8$}|5J`+TzysAThNqaAyK6|9mzWCvcG zXu!*|Tuh-k$7jk6WezFToPfo73mo#AU-1}zX5AyBW`h+c`-`zVo>fn-C$-}Ivy}K3PvSs@3T6zBL&zVL0V@mEGy0MUB%Xfpk zL=lof$p(Ydj8Il`=)wE z=Cw$78f$am$Td9Nv{AewnpHrdo7s88)Ajy6T@4Mn^0aTs&kCw;1m4kHcF>wN zRnc*R@jl6z1@_ z+yu7v$)>VK%(YMYxJ|E@X`KS&bH^W>JEn>Ucr!BTGT1`2LOYV zr5e+7p9-J`pd3t4{s)5mN&AsMr4*n7fT2H4fmE4Uo$b{^&Dx;m`^{-enOSDB8~z~a zMmXv$Iz0u;@!s52wFGO0+l~7W5%~s^qx&HZiDoU2jf`MdD-+gtb#&x}x)$gal(Z?( zBKz~Uhmu}c3;em@W>$yE^=anS63+^m-cTkh{^gT80rab*`QG4koT%rSPPuVy6Ql)O z&bM>gBzn-#D)HLYTgDub=|6WMo7V1m*w-9acuik$Ujv>?oDhF5f41m5`L^?lsNyAK zjuf+68|qt2k*_5V`oYwBxIeFx=?Q<%wf}^39bQeCEXyyp)TUshw>WFq#B>J);13Ct zg~VcF!t?BF^(*i_Zkk;CBzs7%dO|bn8?NK*hKVPOb$^V5{%W)oQSeg=8nE$86K=7T zmcIN!9*;7H_6(vh8L{Mk*@*Qb52#pnNqE-_-|6l!{`36i4B5-0q$gKIw66k;Qhnbe znc;!Uys_u>eB&Pk4>$BV7^jJ&N>hE`-}Rka*&8`67Ju`zTpW8mPT4AZtw+X?Cp@6J z{Swv+Sq(pX5}e563m5&U%s$$7=D0<{snjic&W|!1n%NDJW{{6Bq^$N)nfAIE!DN(a ztw2>kadh#tdBC6yf!sx9>C6V@mpKdZ%^flU&VTvoOM z4f%3R{bj1F2INm*6_$m#``xgm##~ieHyT|e%D4_)ix1aa2Xk8e%9fpMr8zDa_*69o zwDCRfl8J4&6;_L*XgJsmL&BGJ>je5Gin2_`syEsYhC1S@MA$~PXpwFcLW!wAxUF%h zx>uMP7@T9)$*Lryn6$EDTNeld&rC}gt?Ux^IqO6t{H5=Ofi%7-2IQhG{a`mYBMeiA z%-aJ4M(mhSmOT7cjc;gR()s>(*`xt1H$70y4i>! z{fiuRxL!*A@tLFY?HN{St0_O3!k7XjTE4 z9&NZrQx$7t@gf7SK!UnM)?ww6pkBzykXK|E!<$!-J@>-ex7n3yFi2)2Q&7TZ^5@3I zP5v?#UvrAG0QAj@&h>|Gl^jW|%`I%17*jJ)&~4%}qv6(Tl3RgYxn>TwLm_)cuU2V? zt5?uDoAO>4)OZ={OL^E`!I-^vtUK-McD}KtHM2})U~lqxgl^Gd-agSMeuqf=X(mXClt2ZM zn#HJW4l2@xHpPdgDkq;R-p6#-_Ha+c!Rn3-uZfIKq#nOBZm`Ai4G#f_>xPj<`v!uK zcDi>P{mrD+si9?)bBq%y#DX l1b%6yxv)?EyACX|l>aFKKr)TrDhHB`$;>o~y#ze~_y^3mAddh5 literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.80.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.80.3mf new file mode 100644 index 0000000000000000000000000000000000000000..6ce9f6fc688a43c7dfe7f38fcde02a19c96d26d0 GIT binary patch literal 1904 zcmWIWW@gc4U|`??Vg?3I$t~~xLxBK;2!pYUzHv%!eoAVN9++fg5Mbcs1uJEk%M78H zhR5d5u@b1wTl$av$?r4mhPw}N-I}g-sdi<^*2=yfLrzh7ZG+V&`}Y|id$TFmXLHu4 z2}kYb6{kI$F*jxYyxYetPbRMUt*3s4yF=Of;`Gw*GbVe6<~iBb{`p{+{X58vuVJ^L zy1$n!|33RJ^_!nAW@j6INsia_|FZV{scGfGM_XsHbv){>n@}flVXl13k(s-qo-SEC zds*JnNz4alw6`hGeRJn`e$_&0{(;Mzs{>`QhmLgOs+lRwu^TJUeGvd;&HLutBh;2_g@923wO&Uzcfvc zDO~<|?U|F`qf94Rym~Gux38|z^pOm^<*A1(+*4|Nn%kYqp8mM-RbRiiM&h-&W!gU> zx8p1|_PkDgKUhTAFPi`TVDaVh#g(V$w9NXo>G6xdbN-ZXZ;vl4cmMNq$$mR4{jW#) zHK*`7cM9g3*aqk`il4u=HP`X?!+-z&pSR?+=#LO&Tc?xq$Zb-Q`PxZyqc2Rkw5Z2f zP21u8s|Wevr_wD-#k7vApXFcl@LWRr^C$Oavi^L-Fpn)xMpY#APm2k&e(J$KwIh{{ z5pfa^_zRys$+P(RYvN26jZ7h^Q7yjO*pua0I;TGsaTQ_ISnjR&4dEB;q_pzki6 zzrTO6?Vi%SoM!Lsef#E_rN*6MS}`>(+V6$;YlYATM_yHd94tn%#E zJ$655&yCkV_H3fBQTgXjd(LgEea64*%>TFV(zy0n>^h!SI&-?{bC<0b{T26pnus~+O9%7wL>p_qvM>v4{npc~ zg$*T}`sX*vg<8;@o~js?lS~21oI4tXv0k1A-O1tPED|eU{G1edV5;58J6u zBZFsdb9w$YZMn`F-ON{&eOi2ht-Nz@D(l3uG#~L9yzh8Z<0pJur2n_FxVGf&_Stzl zJ$$YU?jGLJ$|<>IZ}*FN+~?l;G#k%#RKI;DZ9@9yT!-FPF^!NjVqb3Md@I?ae8EYr zaJTV>M(qW*OIH3A612$@+_~d=z~U*aGk>0*eU`_`f_avr=I7^{yz0x&?4QN9Ice4G zPd3xuR*FvFB9M3D(ShDo4LdnSJ5N`fSygbntm*h?o@rOTww;p^Uv8pt-{|&R*T_~z z@4FFhcY3>a6m@qPmY=uii7}ZJbfI$5nHpdIT@Jec;+f~yF$SPyZ;lYX%dqS%49woq z&iQ#Isd**wA(aKG#j$!7xjCR59>N64+3z3}!`z^=UPlZB?6iOIDTZeTi@Gc+bEm~JG zVfXUYr+1=e{b#J?$f8UYQXXbAHrs$-9^mC=zY12!;&TKTfV)e#eLq4j&{z^&DIVs;goTW#$ zeOdXVBk#Vwe?B4umKbO?OrM&U?um62Iabov(lN&Ss zmAM%d3*5MH^W6WFlP_P%vJ|Y_%ZwUi#n&EBg9RBkFv#MIQge#+^*|&jsJIy+VYC?< zRH^-Exegf!w4CSK=X_)L-78HU5_>B?YSlJQ$gAJ*Q_<7){ykj{4Y~5PZ^_RJs%`|{ z(Oh=Wnl)9?af0za$(ZE{r`}evFMpg>x#Q9bGehX5 z;j#I%4Mb|+E&0p-#Fp7ip3~*RKA)-Ij52Tiim^PFIrB%y0hipmzwcPBJ$KJyU0a)R z@c8pNzZ0LU?XF&_{aj)9zMR=}4ElxK%@*mNdZww~d}}A?&fS0iXs*8P6vo#u+fMzw z*IV;__q)?0Ki^yJeQ|5;?%;VD+4eeF_js)Ju3TX3*1zTVi!pVhKl39V-<3r{(?dhA z1)c0uc)skBhPw3khtGd3dTIXEY33~E=##5AU&$!j9Dic-`&&r@T$dKk3_EtQO!0Eq zr(KV{rY7~&+a9x@88z$hzDp_-j%@vSxx2NkO0&(cYg^!^K#AB_mpdFv^Nm)p>hE~u zcQ||Io;>Zo$xg9njb!=&{jSEUHAv-d-sLwZ@rAqn;WJ}mhiYlFhEU!S*B8q?1$P(v2=C%@lJj10 z+yC8z{NNMQ=UkW^c+$0X0)8CJKX8t;RE*D z)b3?%?F%b-t)tU?`q{QR88hy^21}Ov%$@%xbH-gG>F5J{I`o8R-`(W!Cf2%sPS5tF z_uI~N?cCh{JbCL++xnBK|8{Slt@-0Y#=KSChjZ>(u$!6vQaq4--m=BAQMt@+SAM~U zqQ>TJn;$%gbC9Xopb(#O^x!F0zIV0U@^^GPyw&Zj`NH%H%3|5t#T$LxdFpgeSqU+> zbm%y+-IUNYbQdu3y0O6RuEW7r-c`m&F0gO9Ra|G3u;80f(iH*QTMp-D+GJKXZ+Xt? z-ORan+Y`2oes}NWsDn#lB@eTv_U=}C%a-ZCYvuW?KP8Lp<4f)yy0MUB%Xb64LkN~-tCwEva!lK|lkuxUi}3=vNk;XvE)^u5`eS}MVVmr!RTjOeO{Zg{IDTx} z$Q5iZ^zzo-E~S#nBR~7xSVdip&L%{zOnK|G$6~4DuQNHvl_Xhe)ME}_SDerxI^n}y z?aEDhk33qEw3l@neRi+>z?%25n)lCl_5hSj%@Lw^8J4MqftfnmIX|x?HLoN-q_QBj zI99JBHwTojLzp1>`5lB}m>YD~>xhAXo%Rnt#qi8vQI{p9{Oj@`aJQ7)O7m4)I8*QL z_VP=ijvK}Hq#Awx%NzVY?fntKV=2sLpO&pz!eFv+>kadwMe8ai>|Vb5^slcXikx!C zuAFGpu+y4)h9Pdbk&DB-lEg2wcF0tVZmqm*yW;k$UEyj9j6sewosDk0?rrz;?>ln( z%-qf26rJ>sey%h-ZF=d~nT;k_tlrpb$VU~}Un%K1C*`|`v-HTeFDrj^1m4>k_xMVt z^W_t>HFun2xjrXqomKab-JAdH=aM?OlsEqV^}kOiPVD|}a%0B7GB<-_fg2ZYp8J1t z^5rX8mV$MAnNfqR_}b%Xupr|G23dSjYEH4f9*6`56*nU!j5b4qDz*PC*C7Lemh)Wu zoNw&Dd!?yEVsFJqt=h&3dG#B9Dtfx!zo)CAAy=OEE%{kN)s4VAn#&Gav!*IKPB7jl z8M8d$)Y~fd<&U!}cU)RwoE~J~qVnUUDr@bz#QqsR{$a}xu@}ABViz^{XOApfZr(2C zJ03fa{y599Os{UkqB^!;&9@G^%&(cv{a81w_iA3&)|0_cy3XioPkFlLcbl8Q);`%( z)`+?GNgucA^)jtfV0`ZQV{^w;@c?f|CS3+xCBF>RV+}wW6b_j6fCNT80M){PZZc}} zLpK>~VwAv0j8~zR4Z7i|5ru9zO0-E}L>mVy#LWTTY-~DE=R?8-!hzb!0Hb-J(f$LW dj~%3v1xzw9fTRPwS=m5h%s>cI4+=d71^@|V5J><4 literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_2.00.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_2.00.3mf new file mode 100644 index 0000000000000000000000000000000000000000..31df1df8cc034555643c82d67c8cb1c597174d2f GIT binary patch literal 1890 zcmZ`)2{hDQ6#v^s4KhlStXZ-RKFTD*M6yO?IU`DDgkuTApbwEEsv%3ZIU*XQIreR+ zA!IBwV$=w26Iu)@%UBwpiOzTA``$b6-t&L&zWd()ckl0AJ1ZVuC;$LE)&~F>WMhx6 zZ8iuX3h0<>>LC3CktjcnUy=)e0DMBfOaUyy9pIs*|M&B+9$K zxmgya-c@1=Q_MGt3eSh(QfhhLg(-KX*(cy;gjX$e{l4WSEsphPbTix-rwTooF4}}n z>1I~**J2qEn!zs@)LCcG=Tp{1kSImk_D>SL%n!LPvY*%V?;?6B+B_qJK*D#MS)6? zJ1Juyh;@)6Il{aV=-Mlp9w~CWE_T9&%PpNT&^zMglj)QBV~<%?J9jSZ1lxpUWbL47 zQ5VFGp>(S@pviO03ZFzrL)4d5r0ugp@5qt&TN z|EiN|PrHKGh8p|!u6oyC=R4rKYLwK|{?UT7-640*zzeN}oR88QN$^1&b#d=5!oK!a zEOXO05QS#Mu!wZs}7 z&jwO?5UglSmT3W-Z`3n#n7)@xa23}Vja`uLgbJF=GacKf^%zsQ(x4`7I=Rkku*;zu zY8)!CUm4juG1oLa_1;=47Fxtpj{%8&d@riWQNSdLM<3vxgM2W}cUc;ZxNqh1w&Xv1)BvVV+r}(ezWP#GU)cvypJb_Xu{kn&N>= z3(0#Vim1JzK8+%&>YgyQ>u5&Ht#frM^#M6rnb!}FwsjlWOt4Lbn~b4sd~9G0V7G

J8509%7&^Ly?{Gj+thd(?J<|rAbDkPZN%X5l993|XC+xK zdw8~q_Q=VWgwwWn+IxC&)eCYbG&_Do==K~LSnjPnOglDZq%4EDY(zufqDa^@?+k6P zn=54{o_SO2&Y=0240h$JG*Eb7OvRF%#mTpCpvub97_SA-iOZ4nGovaGTlM)+a_|(L zC;QLgFLW~_`SA?jh=zd@olEvc@d_-mB3~561Dj=S>x6IP51y(qMBtWgNrC(Wn&d~# z8#`Eiz(bAbio$5n^0n8krul#83NWBfw}%3JYsn5DlX{_Q>Eq=qH_RZlccf5!E;yr$ zvvnG`xe2mdlW Date: Fri, 8 Mar 2024 00:21:24 +1100 Subject: [PATCH 11/28] big scaling improvements managed to fix scaling issue with different nozzle sizes. tested with fair few combinations of nozzle sizes, layer height, base layer height, extrusion role widths. seems solid on that part now. added "verify" extended feature, this is just for users to see what ER roles need a new PA value scaling of the borders can still be improved though. it's decent enough for now, but on larger nozzle sizes the borders/numbers get a touch too large and you get "overhangs" TODO: bug test, for any values that get used if percent/float ect TODO: find calculation for external/internal bridges, overhang, ironing, support material/interface TODO: add more info to .html file. --- src/libslic3r/Flow.cpp | 2 +- src/libslic3r/GCode.cpp | 3 +- src/libslic3r/Layer.cpp | 2 + .../GUI/CalibrationPressureAdvDialog.cpp | 531 +++++++++++++----- .../GUI/CalibrationPressureAdvDialog.hpp | 4 +- 5 files changed, 385 insertions(+), 157 deletions(-) diff --git a/src/libslic3r/Flow.cpp b/src/libslic3r/Flow.cpp index 269c1cb3b53..b61aad3606d 100644 --- a/src/libslic3r/Flow.cpp +++ b/src/libslic3r/Flow.cpp @@ -519,7 +519,7 @@ float Flow::rounded_rectangle_extrusion_spacing(float width, float height, float #else if (width == height && width == 0) return 0.f; - float out = width - height * float(1. - 0.25 * PI) * m_spacing_ratio; + float out = width - height * float(1. - 0.25 * PI) * m_spacing_ratio;//this calculates the real spacing for widths. i need this one. if (out <= 0.f) throw FlowErrorNegativeSpacing(); return out; diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 274560343a9..c4067a0515c 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -1449,6 +1449,7 @@ void GCode::_do_export(Print& print_mod, GCodeOutputStream &file, ThumbnailsGene for (const auto& volume : part_details) {//loop though object volumes - object parts volume_name = volume->name; + file.writeln(volume_name);//write file name at start/end of next loop for (const auto& target_object : target_objects) {//loop though each volume if (volume_name == target_object) { @@ -1462,7 +1463,7 @@ void GCode::_do_export(Print& print_mod, GCodeOutputStream &file, ThumbnailsGene break; } } - + file.writeln(volume_name); nb_parts_per_object++; } } diff --git a/src/libslic3r/Layer.cpp b/src/libslic3r/Layer.cpp index a44006d030a..d8b8a449024 100644 --- a/src/libslic3r/Layer.cpp +++ b/src/libslic3r/Layer.cpp @@ -238,6 +238,8 @@ void Layer::make_perimeters() && config.thin_walls_acceleration == other_config.thin_walls_acceleration && config.top_solid_infill_acceleration == other_config.top_solid_infill_acceleration//compiles fine with moving them here, how to properly test this ? && config.per_objects_gcode == other_config.per_objects_gcode + && config.external_perimeter_extrusion_spacing == other_config.external_perimeter_extrusion_spacing + && config.perimeter_extrusion_spacing == other_config.perimeter_extrusion_spacing ) { layerms.push_back(other_layerm); diff --git a/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp b/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp index 61b188b0e36..4a28f1aef87 100644 --- a/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp +++ b/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp @@ -31,6 +31,9 @@ namespace GUI { void CalibrationPressureAdvDialog::create_buttons(wxStdDialogButtonSizer* buttons){ + const DynamicPrintConfig* printer_config = this->gui_app->get_tab(Preset::TYPE_PRINTER)->get_config(); + GCodeFlavor flavor = printer_config->option>("gcode_flavor")->value; //there a better way to only load the flavor ? + wxString choices_first_layerPA[] = { "0.025", "0.030", @@ -75,13 +78,14 @@ void CalibrationPressureAdvDialog::create_buttons(wxStdDialogButtonSizer* button wxString choices_increment_PA[] = { "0.0010",///1000 hits "0.0025", + "0.0035", "0.005", //200 hits "0.006", "0.007", "0.01",//100 hits "0.1"//10 hits }; - paIncrement = new wxComboBox(this, wxID_ANY, wxString{ "0.0025" }, wxDefaultPosition, wxDefaultSize, 7, choices_increment_PA); + paIncrement = new wxComboBox(this, wxID_ANY, wxString{ "0.0025" }, wxDefaultPosition, wxDefaultSize, 8, choices_increment_PA); paIncrement->SetToolTip(_L("Select the PA increment amount.")); paIncrement->SetSelection(1); @@ -98,9 +102,15 @@ void CalibrationPressureAdvDialog::create_buttons(wxStdDialogButtonSizer* button "SupportMaterial", "SupportMaterialInterface", "ThinWall", - "TopSolidInfill" + "TopSolidInfill", + "FirstLayer", + "Verify"//if this selected, disable/hide other buttons? + // 'verify' this choice will require the user to manually add in the PA numbers with the GUI from their realworld tests. + // the code will then load a 90_bend for each ER role, and give each bend seperate ER speed/width/ect values + // when printed and user added in the PA numbers correctly. it should make it easy to spot what ER roles need adjusting. + //TODO: once the main pressure advance feature is added, this can pull that values and insert here to save the manual adding in the numbers. }; - erPa = new wxComboBox(this, wxID_ANY, wxString{ "InternalInfill" }, wxDefaultPosition, wxDefaultSize, 13, choices_extrusion_role); + erPa = new wxComboBox(this, wxID_ANY, wxString{ "InternalInfill" }, wxDefaultPosition, wxDefaultSize, 15, choices_extrusion_role); erPa->SetToolTip(_L("Select the extrusion role you want to generate a calibration for")); erPa->SetSelection(0); @@ -109,29 +119,40 @@ void CalibrationPressureAdvDialog::create_buttons(wxStdDialogButtonSizer* button nbRuns = new wxComboBox(this, wxID_ANY, wxString{ "1" }, wxDefaultPosition, wxDefaultSize, 5, number_of_runs); nbRuns->SetToolTip(_L("Select the number of tests to generate, max 2 is reccomended due to bed size limits")); nbRuns->SetSelection(0); - + + enableST = new wxCheckBox(this, wxID_ANY, _L(""), wxDefaultPosition, wxDefaultSize ); + enableST->SetToolTip(_L("generate smooth time values")); + enableST->SetValue(false); // TODO : add another row of boxes for the 2nd/3rd ect of tests to create, user adjust parameters of new row for the 2nd/3rd test // this will allow multi plate PA tests to be run + + std::string prefix = (gcfMarlinFirmware == flavor) ? " LA " : ((gcfKlipper == flavor || gcfRepRap == flavor) ? " PA " : "unsupported firmware type"); + - buttons->Add(new wxStaticText(this, wxID_ANY, _L("Number of tests to create: "))); + buttons->Add(new wxStaticText(this, wxID_ANY, _L("Number of tests: "))); buttons->Add(nbRuns); buttons->AddSpacer(15); - buttons->Add(new wxStaticText(this, wxID_ANY, _L("First Layers PA value: "))); + buttons->Add(new wxStaticText(this, wxID_ANY, _L("First Layers" + prefix + "value: "))); buttons->Add(firstPa); buttons->AddSpacer(15); - buttons->Add(new wxStaticText(this, wxID_ANY, _L("Starting PA value: "))); + buttons->Add(new wxStaticText(this, wxID_ANY, _L("Starting" + prefix + "value: "))); buttons->Add(startPa); buttons->AddSpacer(15); - buttons->Add(new wxStaticText(this, wxID_ANY, _L("Ending PA value: "))); + buttons->Add(new wxStaticText(this, wxID_ANY, _L("Ending" + prefix + "value: "))); buttons->Add(endPa); buttons->AddSpacer(15); - buttons->Add(new wxStaticText(this, wxID_ANY, _L("PA increments: "))); + buttons->Add(new wxStaticText(this, wxID_ANY, _L(prefix + "increments: "))); buttons->Add(paIncrement); buttons->AddSpacer(15); buttons->Add(new wxStaticText(this, wxID_ANY, _L("Extrusion role: "))); buttons->Add(erPa); + if (gcfKlipper == flavor) { + buttons->AddSpacer(15); + buttons->Add(new wxStaticText(this, wxID_ANY, _L("Smooth time: "))); + buttons->Add(enableST); + } buttons->AddSpacer(25); @@ -148,10 +169,14 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { endPa paIncrement erPa + enableST */ double first_pa, start_pa, end_pa, pa_increment = 0.01; - + bool smooth_time = enableST->IsChecked(); + size_t nb_runs = nbRuns->GetSelection(); + nb_runs=nb_runs+1; first_pa = firstPa->GetValue().ToDouble(&first_pa); + if (!firstPa->GetValue().ToDouble(&first_pa)) { first_pa = 0.025; } @@ -166,20 +191,7 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { pa_increment = paIncrement->GetValue().ToDouble(&pa_increment); if (!paIncrement->GetValue().ToDouble(&pa_increment)) { pa_increment = 0.05; - } - size_t nb_runs = 1; - if (nbRuns->GetSelection() == 1) { - nb_runs = 2; - } else if (nbRuns->GetSelection() == 2) { - nb_runs = 3; - } else if (nbRuns->GetSelection() == 3) { - nb_runs = 4; - } else if (nbRuns->GetSelection() == 4) { - nb_runs = 5; - } - else{ - nb_runs = 1; - } + } std::string extrusion_role = erPa->GetValue().ToStdString(); std::string choice_extrusion_role[] = { @@ -195,7 +207,8 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { "SupportMaterial", "SupportMaterialInterface", "ThinWall", - "TopSolidInfill" + "TopSolidInfill", + "FirstLayer"//i've got added them all right? }; std::unordered_map er_width_ToOptionKey = { @@ -203,7 +216,7 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { //{"BridgeInfill", "placeholder"},//special calc required {"ExternalPerimeter", "external_perimeter_extrusion_width"}, //{"GapFill", "placeholder"},//special calc required - //{"InternalBridgeInfill", "placeholder"},//special calc required, not sure how to process these for the width since they're not a static value + //{"InternalBridgeInfill", "placeholder"},//special calc required, TODO:find out where/how this is calculated {"Ironing", "top_infill_extrusion_width"}, {"OverhangPerimeter", "overhangs_width"}, {"Perimeter", "perimeter_extrusion_width"}, @@ -211,7 +224,9 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { {"SupportMaterial", "support_material_extrusion_width"}, {"SupportMaterialInterface", "support_material_extrusion_width"}, {"ThinWall", "external_perimeter_extrusion_width"}, - {"TopSolidInfill", "top_infill_extrusion_width"} + {"TopSolidInfill", "top_infill_extrusion_width"}, + {"FirstLayer", "first_layer_extrusion_width"} + }; std::unordered_map er_accel_ToOptionKey = { @@ -227,7 +242,26 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { {"SupportMaterial", "support_material_acceleration"}, {"SupportMaterialInterface", "support_material_interface_acceleration"}, {"ThinWall", "top_solid_infill_acceleration"}, - {"TopSolidInfill", "top_solid_infill_acceleration"} + {"TopSolidInfill", "top_solid_infill_acceleration"}, + {"FirstLayer", "first_layer_acceleration"} + }; + + std::unordered_map er_spacing_ToOptionKey = { + {"InternalInfill", "infill_extrusion_spacing"}, + //{"BridgeInfill", "placeholder"}, + {"ExternalPerimeter", "external_perimeter_extrusion_spacing"}, + //{"GapFill", "placeholder"},//special calc required for commented ones + //{"InternalBridgeInfill", "placeholder"}, + //{"Ironing", "ironing_spacing"}, TOFIX? TYPE: coFloat + {"Ironing", "top_infill_extrusion_spacing"}, + {"OverhangPerimeter", "external_perimeter_extrusion_spacing"}, + {"Perimeter", "perimeter_extrusion_spacing"}, + {"SolidInfill", "solid_infill_extrusion_spacing"}, + {"SupportMaterial", "external_perimeter_extrusion_spacing"}, //TOFIX? TYPE: coFloat + {"SupportMaterialInterface", "external_perimeter_extrusion_spacing"}, //TOFIX? TYPE: coFloat + {"ThinWall", "external_perimeter_extrusion_spacing"}, + {"TopSolidInfill", "top_infill_extrusion_spacing"}, + {"FirstLayer", "first_layer_extrusion_spacing"} }; std::unordered_map er_speed_ToOptionKey = { @@ -243,11 +277,12 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { {"SupportMaterial", "support_material_speed"}, {"SupportMaterialInterface", "support_material_interface_speed"}, {"ThinWall", "thin_walls_speed"}, - {"TopSolidInfill", "top_solid_infill_speed"} + {"TopSolidInfill", "top_solid_infill_speed"}, + {"FirstLayer", "first_layer_speed"} }; /* -struct ExtrusionSettings {// think a map is better? +struct ExtrusionSettings {// think a struct is better instead of all the maps ? std::string extrusionWidth; std::string acceleration; std::string speed; @@ -270,20 +305,25 @@ struct ExtrusionSettings {// think a map is better? };*/ int countincrements = 0; - int sizeofarray = static_cast((end_pa - start_pa) / pa_increment) + 1; + int sizeofarray = static_cast((end_pa - start_pa) / pa_increment) + 2;//'+2' needed for odd/even numbers std::vector pa_values(sizeofarray); std::vector c_pa_values_c(sizeofarray); double incremented_pa_value = start_pa; while (incremented_pa_value <= end_pa + pa_increment / 2) {//this makes a number to be used to load x number of 90 bend models for the PA test. - - double rounded_Pa = std::round(incremented_pa_value * 100000.0) / 100000.0; - pa_values[countincrements] = rounded_Pa;//store PA numbers in array to be used later. // this might be where it's not getting the 0.1 number ? - c_pa_values_c[countincrements] = rounded_Pa; - countincrements++; - incremented_pa_value += pa_increment; - // is there a limit of how many models SS can load ? might be good to set a failsafe just so it won't load 10k+ models... - } + if (incremented_pa_value <= end_pa) { + double rounded_Pa = std::round(incremented_pa_value * 1000000.0) / 1000000.0; + pa_values[countincrements] = rounded_Pa;//store PA numbers in array to be used later. + c_pa_values_c[countincrements] = rounded_Pa; + countincrements++; + incremented_pa_value += pa_increment; + } + else { + pa_values[countincrements] = end_pa; + countincrements++;//failsafe if werid input numbers are provided that can't add the "ending pa" number to the array. + break; } + + }// is there a limit of how many models SS can load ? might be good to set a failsafe just so it won't load 10k+ models... bool has_to_arrange = false; Plater* plat = this->main_frame->plater(); @@ -308,130 +348,265 @@ struct ExtrusionSettings {// think a map is better? 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. - // NOTE: can't stretch 90 bend models since that will mess with part positioning and it won't have it's perfect 90° bend anymore + //models is created for nozzles from 0.1-2mm walls should be nozzle_size*4 spaced, scale xy model by widths down is futher 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; + double nozzle_diameter = nozzle_diameter_config->values[0];//get extruderID too? double first_layer_height = print_config->get_abs_value("first_layer_height", nozzle_diameter); + double base_layer_height = print_config->get_computed_value("layer_height",0); GCodeFlavor flavor = printer_config->option>("gcode_flavor")->value; - //get ER widths, ER accell, ER speeds double er_width = print_config->get_abs_value("solid_infill_extrusion_width", nozzle_diameter); double er_accel = print_config->get_abs_value("solid_infill_acceleration", nozzle_diameter); double er_speed = print_config->get_abs_value("solid_infill_speed", nozzle_diameter); + double er_spacing = print_config->get_abs_value("external_perimeter_extrusion_spacing",1.0); double default_er_width = print_config->get_abs_value("extrusion_width", nozzle_diameter); - double default_er_accel = print_config->get_abs_value("default_acceleration", nozzle_diameter); double default_er_speed = print_config->get_abs_value("default_speed", nozzle_diameter); + double default_er_accel = print_config->get_abs_value("default_acceleration", nozzle_diameter); + double default_er_spacing = print_config->get_abs_value("extrusion_spacing", nozzle_diameter); + double spacing_ratio = print_config->get_abs_value("perimeter_overlap",1.0); + double spacing_ratio_external = print_config->get_abs_value("external_perimeter_overlap",1.0); + double filament_max_overlap = filament_config->get_computed_value("filament_max_overlap",0);//maybe check for extruderID ? + + if (extrusion_role == "Verify") { + countincrements = 13; + er_width = default_er_width; + er_spacing = default_er_spacing; + er_width = er_width * 100 / nozzle_diameter; + er_width = std::round(er_width * 100.0) / 100.0; // Change number to percentage and round + } + else{ + for (int i = 0; i < sizeof(choice_extrusion_role) / sizeof(choice_extrusion_role[0]); i++) { + + if (er_width_ToOptionKey.find(extrusion_role) != er_width_ToOptionKey.end()) { + + er_width = print_config->get_abs_value(er_width_ToOptionKey[extrusion_role].c_str(), nozzle_diameter);//look at maps at match speed/width ect to the selecter ER role + er_speed = print_config->get_abs_value(er_speed_ToOptionKey[extrusion_role].c_str(), nozzle_diameter);//need to load this here?? + er_accel = print_config->get_abs_value(er_accel_ToOptionKey[extrusion_role].c_str(), nozzle_diameter);//need to load this here?? + er_spacing = print_config->get_abs_value(er_spacing_ToOptionKey[extrusion_role].c_str(), nozzle_diameter); + + //potential BUG if any of the values are 0 everything else would fail, need to pull the default value too and assign that? + if(er_width == 0){er_width =default_er_width; } + if(er_speed == 0){er_speed =default_er_speed; } + if(er_accel == 0){er_accel =default_er_accel; } + if(er_spacing == 0){er_spacing = default_er_spacing; } + + er_width = er_width * 100 / nozzle_diameter; + er_width = std::round(er_width * 100.0) / 100.0; + } else { + er_width = print_config->get_abs_value("solid_infill_extrusion_width", nozzle_diameter); //used for gapfill_width/bridges selection. TODO: add the bits for this here since gapfill/bridges need special calculations + er_width = er_width * 100 / nozzle_diameter; + er_width = std::round(er_width * 100.0) / 100.0; // Change number to percentage and round - - for (int i = 0; i < sizeof(choice_extrusion_role) / sizeof(choice_extrusion_role[0]); i++) { + } - if (er_width_ToOptionKey.find(extrusion_role) != er_width_ToOptionKey.end()) { + } + } + - er_width = print_config->get_abs_value(er_width_ToOptionKey[extrusion_role].c_str(), nozzle_diameter);//look at maps at match speed/width ect to the selecter ER role - er_speed = print_config->get_abs_value(er_speed_ToOptionKey[extrusion_role].c_str(), nozzle_diameter); - er_accel = print_config->get_abs_value(er_accel_ToOptionKey[extrusion_role].c_str(), nozzle_diameter); + //-- magical scaling is done here :) + //the 90_bend models need to be scaled correctly so there is no 'gapfill' since gapfill will effect results. + double xyzScale = nozzle_diameter / 0.4; + double er_width_to_scale = magical_scaling(nozzle_diameter,er_width,filament_max_overlap,spacing_ratio,spacing_ratio_external,base_layer_height,er_spacing); + //-- magical scaling + std::vector < std::vector> pressure_tower; - //potential BUG if any of the values are 0 everything else would fail, need to pull the default value too and assign that? - - er_width = er_width * 100 / nozzle_diameter; - er_width = std::round(er_width * 100.0) / 100.0; // Change number to percentage and round - } else { - er_width = print_config->get_abs_value("solid_infill_extrusion_width", nozzle_diameter); //used for gapfill_width/bridges selection. - er_width = er_width * 100 / nozzle_diameter; - er_width = std::round(er_width * 100.0) / 100.0; // Change number to percentage and round + std::string nozzle_diameter_str = std::to_string(nozzle_diameter); + nozzle_diameter_str.erase(nozzle_diameter_str.find_last_not_of('0') + 2, std::string::npos); - } + if (nozzle_diameter_str.back() == '.') {//if nozzle_diameter_str broke fix it by adding '0' to end, prob not needed? + nozzle_diameter_str += '0'; } - //base scale for model/parts - if (xyzScale < 0.9 || 1.1 < xyzScale) { - model.objects[objs_idx[0]]->scale(xyzScale, xyzScale * 0.5, xyzScale); - } else { - xyzScale = 1; - model.objects[objs_idx[0]]->scale(xyzScale, xyzScale * 0.5, xyzScale); - } + /*size_t decimal_pos = nozzle_diameter_str.find('.'); + // maybe adjust for this ? + // some users might have 0.0x nozzle size. if that's the case then they should just need to create the file and it should load. ie; 90_bend_0.450.3mf + if (decimal_pos != std::string::npos) { + size_t non_zero_pos = nozzle_diameter_str.find_first_not_of('0', decimal_pos + 2); + nozzle_diameter_str.erase(non_zero_pos, std::string::npos); + }*/ - float zshift = (1 - xyzScale) / 2; - std::vector < std::vector> pressure_tower; + std::string bend_90_nozzle_size_3mf = "90_bend_" + nozzle_diameter_str + ".3mf"; for (size_t id_item = 0; id_item < nb_runs; id_item++) { + pressure_tower.emplace_back(); - double xpos = 22 * xyzScale; - double ypos = 22 * xyzScale; - double xpos_stretch = 1.5 * xyzScale; - double ypos_stretch = 2.5 * xyzScale; - double x_total = xpos*countincrements; - double y_total = ypos*countincrements; + double initial_model_height = 0.2; - double z_scale_factor = first_layer_height / initial_model_height; // BUG: output error if first layer height is lower than base layer height? - // this can cause the numbers to not "show up" on the preview because the z scale is calculated wrong. - // ie; first_layer_height=0.1 and base_layer_height =0.20 + double initial_90_bend_x = 41.20;//fusion=41.200 mm + double initial_90_bend_y = 20.93;//fusion=20.930 mm + double initial_number_x = 2.06;//fusion=2.063 mm + double initial_number_y = 4.12;//fusion=4.125 mm + double initial_border_x = 1.6;//fusion= 1.6mm + + double z_scaled_model_height = initial_model_height * (first_layer_height / initial_model_height); + double xy_scaled_90_bend_x = initial_90_bend_x * er_width_to_scale; + double xy_scaled_y = initial_90_bend_y * er_width_to_scale; + double xy_scaled_x = initial_border_x * er_width_to_scale; //maybe the right border x can be scaled with numbers ? + double xy_scaled_number_x = initial_number_x * er_width_to_scale; + double xy_scaled_number_y = initial_number_y * er_width_to_scale; + + + double thickness_offset = nozzle_diameter * er_width_to_scale * 2; + double z_scale_90_bend = xyzScale * 1.8 / initial_model_height; + double z_scale_factor = 0.0; + double new_z_world_coords = first_layer_height / 2.0 -base_layer_height; + + if(base_layer_height <= first_layer_height){//normal conditions firstlayer is greater than base + z_scale_factor = first_layer_height / initial_model_height; + }else{ + z_scale_factor = first_layer_height + first_layer_height; + } + // BUG: output error if first layer height is lower than base layer height + // this can cause the numbers to not "show up" on the preview because the z scale is calculated wrong. + // ie; first_layer_height=0.1 and base_layer_height =0.20 + - double new_z_world_coords = first_layer_height / 2.0 -0.10;//"-0.10" needed for some reason, otherwise it messes up the positioning of the models - double new_num_z_world_coords = first_layer_height / 2.0 + new_z_world_coords; + + std::vector bend_90_positions; + std::vector number_positions; - for (int nb_bends = 0; nb_bends <= countincrements -1; nb_bends++){ - pressure_tower.back().push_back(add_part(model.objects[objs_idx[id_item]], - (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "90_bend_v2.3mf").string(), - Vec3d{ 0, nb_bends * 5 * xyzScale, 0.5 }, Vec3d{ xyzScale, xyzScale/**1.43*/, xyzScale*6.0})); - } + if (extrusion_role == "Verify") { + + int nb_bends = 0; + for (const std::string& role : choice_extrusion_role) {//dynamic add and scale each 90bend model per extrusion role. + if (er_width_ToOptionKey.find(role) != er_width_ToOptionKey.end()) { - for (int nb_bends = 0; nb_bends <= countincrements;nb_bends++){ - if(nb_bends == countincrements / 2 ) { - add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border_s.3mf").string(), - Vec3d{ 1.4 , nb_bends * 5 * xyzScale, new_z_world_coords }, Vec3d{ xyzScale*1.43, (nb_bends+0.5) * xyzScale / 2, z_scale_factor });// left sides border + er_width = std::round((print_config->get_abs_value(er_width_ToOptionKey[role].c_str(), nozzle_diameter) * 100 / nozzle_diameter) * 100.0) / 100.0; + er_spacing = print_config->get_abs_value(er_spacing_ToOptionKey[role].c_str(), nozzle_diameter); + er_width_to_scale = magical_scaling(nozzle_diameter, er_width, filament_max_overlap, spacing_ratio, spacing_ratio_external, base_layer_height, er_spacing); + thickness_offset = nozzle_diameter * er_width_to_scale * 2; + + pressure_tower.back().push_back(add_part(model.objects[objs_idx[id_item]], + (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "scaled_with_nozzle_size" / bend_90_nozzle_size_3mf).string(), + Vec3d{ -0.8, (initial_90_bend_y/2) * nb_bends , xyzScale - base_layer_height }, Vec3d{ er_width_to_scale, er_width_to_scale, z_scale_90_bend })); + + Eigen::Vector3d modelPosition(0, (initial_90_bend_y/2) * nb_bends, xyzScale - base_layer_height ); + bend_90_positions.push_back(modelPosition); + nb_bends++; + } + else{ + er_width = std::round((default_er_width * 100 / nozzle_diameter) * 100.0) / 100.0; + er_spacing = default_er_spacing; + er_width_to_scale = magical_scaling(nozzle_diameter, er_width, filament_max_overlap, spacing_ratio, spacing_ratio_external, base_layer_height, er_spacing); + thickness_offset = nozzle_diameter * er_width_to_scale * 2; + + pressure_tower.back().push_back(add_part(model.objects[objs_idx[id_item]], + (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "scaled_with_nozzle_size" / bend_90_nozzle_size_3mf).string(), + Vec3d{ -0.8, (initial_90_bend_y/2) * nb_bends , xyzScale - base_layer_height }, Vec3d{ er_width_to_scale, er_width_to_scale, z_scale_90_bend })); + + Eigen::Vector3d modelPosition(-0.8, (initial_90_bend_y/2) * nb_bends, xyzScale - base_layer_height ); + bend_90_positions.push_back(modelPosition); + nb_bends++; + + } + } - if(nb_bends == countincrements / 2 ) { - add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border_s.3mf").string(), - Vec3d{ 51.5 , nb_bends * 5 * xyzScale, new_z_world_coords }, Vec3d{ xyzScale *14, (nb_bends+0.5) * xyzScale / 2, z_scale_factor });// right sides border + } + else{//not verify + for (int nb_bends = 0; nb_bends <= countincrements -1; nb_bends++){ + + pressure_tower.back().push_back(add_part(model.objects[objs_idx[id_item]], + (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "scaled_with_nozzle_size" / bend_90_nozzle_size_3mf).string(), + Vec3d{ -0.8, double(nb_bends) * (thickness_offset*2) *2 , xyzScale - base_layer_height }, Vec3d{ er_width_to_scale, er_width_to_scale, z_scale_90_bend })); + + Eigen::Vector3d modelPosition(-0.8, double(nb_bends) * (thickness_offset*2) *2, xyzScale - base_layer_height ); + bend_90_positions.push_back(modelPosition); } } - for (int nb_bends = 0; nb_bends < countincrements;nb_bends++){ - std::string pa_values_string = std::to_string(pa_values[nb_bends]); - std::string threemf =".3mf"; - xpos = 22 * xyzScale;//reset x coords for numbers position. - int pa_number = pa_values[nb_bends]; - if(nb_bends == 0) { - add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border_b.3mf").string(), - Vec3d{ 10.9 , nb_bends -1.5 , new_z_world_coords }, Vec3d{ 1 * 1.58 *xyzScale, xyzScale+1, z_scale_factor });//bottom border - }if(nb_bends == countincrements -1) { - add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border_b.3mf").string(), - Vec3d{ 10.9 , ypos +1.0 , new_z_world_coords }, Vec3d{ 1 * 1.58 *xyzScale, xyzScale+1, z_scale_factor });//top border + for (int nb_bends = 0; nb_bends <= countincrements;nb_bends++){ + bool enable_old_border = true; + if(enable_old_border == true){ + if(nb_bends == countincrements / 2 ) {//half way point load borders + + double offset_y = 2 * thickness_offset * 2; + const double magical_transformation_x_pos = 20.6;//what is this, and how is this calculated ? >:( + const double magical_transformation_y_pos = 10.47;//load a model without moving its pos to find see what it is.the number doesn't seem to change regardless of layer heights/nozzle size + Eigen::Vector3d bend_pos_first = bend_90_positions[0]; + Eigen::Vector3d bend_pos_mid = bend_90_positions[nb_bends]; + Eigen::Vector3d bend_pos_last = bend_90_positions[countincrements-1]; + + double left_border_pos_x = (-xy_scaled_90_bend_x / 2) + (xy_scaled_x / 2); + double total_height = (bend_pos_first.y() + magical_transformation_y_pos) + (bend_pos_last.y()+ magical_transformation_y_pos) - 0.8 + offset_y; + double scaled_border_y = ((total_height / initial_90_bend_y) *100) + offset_y; + + double right_pos_border_x = xy_scaled_90_bend_x-(xy_scaled_x / 2); + double scaled_y = (initial_border_x*(xy_scaled_x * 1.5)) / initial_90_bend_y; + double right_border_scaled_x = (xy_scaled_90_bend_x / initial_border_x) * 100 + (xy_scaled_x * 2) ;//maybe scale with numbers? + double bottom_border_pos_x = (initial_border_x * right_border_scaled_x * 0.01) / 2 -0.8; + + //---------- + add_part(model.objects[objs_idx[id_item]], + (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border.3mf").string(), + Vec3d{ left_border_pos_x + magical_transformation_x_pos, bend_pos_mid.y(), new_z_world_coords }, + /*scale*/Vec3d{ xy_scaled_x * 1.5, scaled_border_y*0.01, z_scale_factor }); // Left border + //---------- + add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border.3mf").string(),//maybe the right border x can be scaled with numbers ? + Vec3d{ right_pos_border_x + magical_transformation_x_pos , bend_pos_mid.y(), new_z_world_coords }, + /*scale*/Vec3d{ right_border_scaled_x*0.01, scaled_border_y*0.01 , z_scale_factor });// right border + //---------- + add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border.3mf").string(), + Vec3d{ bottom_border_pos_x + magical_transformation_x_pos , bend_pos_first.y() - (offset_y / 1.8) - magical_transformation_y_pos , new_z_world_coords }, + /*scale*/Vec3d{ (right_border_scaled_x*2)*0.01, scaled_y, z_scale_factor });//bottom border + //---------- + add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border.3mf").string(), + Vec3d{ bottom_border_pos_x + magical_transformation_x_pos , bend_pos_last.y() - magical_transformation_y_pos + xy_scaled_y +(offset_y/2), new_z_world_coords }, + /*scale*/Vec3d{ (right_border_scaled_x*2)*0.01, scaled_y, z_scale_factor });//top border + // position in printer coords are half of scaled size + // scale model in percentage from original models xy values! + //---------- + } } - - - for (int j = 0; j < 7; ++j) { // loop though new array starting from begining, not sure how the code will respond with a positive array list? ie ; 100.2 this moves decimal point thus breaking the code from loading model since "..3mf" not a real file... + } - std::string numered3mfpath = pa_values_string[j] + threemf; - - if (pa_values_string[j] == '.') { - add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "point.3mf").string(), - Vec3d{ xpos , ypos -3.6 , new_num_z_world_coords }, Vec3d{ xyzScale, xyzScale+1.5, z_scale_factor }); - xpos = xpos+1.5; + + if (extrusion_role != "Verify") { + for (int nb_bends = 0; nb_bends < countincrements; nb_bends++){ + + if (nb_bends % 2 == 1) { // Skip generating every second number + continue; } - else if (std::isdigit(pa_values_string[j])) { + Eigen::Vector3d bend_90_pos = bend_90_positions[nb_bends]; + const double magical_transformation_num_x_pos = 1.03; + const double magical_transformation_num_y_pos = -2.06; + const double magical_transformation_z_pos = 0.12;//0.1 is the transformation value, but set slightly higher so numbers would be "inside" right border - add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / numered3mfpath).string(), - Vec3d{ xpos , ypos , new_num_z_world_coords }, Vec3d{ xyzScale, xyzScale, z_scale_factor }); - // position in printer //scale model - xpos = xpos+2.8; + double bend_90_y = bend_90_pos.y() - magical_transformation_num_y_pos; + double bend_90_x = bend_90_pos.x() + magical_transformation_num_x_pos; + double xpos_initial = bend_90_x + magical_transformation_num_x_pos + (xy_scaled_90_bend_x/2); + double ypos = bend_90_y + xy_scaled_y -(xy_scaled_number_y/2); + double xpos = xpos_initial; + + std::string pa_values_string = std::to_string(pa_values[nb_bends]); + std::string threemf =".3mf"; + + for (int j = 0; j < 7; ++j) {//not sure how the code will respond with a positive array list? ie ; 100.2 this moves decimal point thus breaking the code from loading model since "..3mf" not a real file + + std::string numered3mfpath = pa_values_string[j] + threemf; + + if (pa_values_string[j] == '.') { + + add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "point.3mf").string(), + Vec3d{ xpos + xy_scaled_number_x + xyzScale + nozzle_diameter , ypos - xy_scaled_number_y , z_scaled_model_height - magical_transformation_z_pos }, Vec3d{ xyzScale, xyzScale+(xyzScale/2), z_scale_factor }); + + xpos = xpos + xy_scaled_number_x + xyzScale + nozzle_diameter; + } + else if (std::isdigit(pa_values_string[j])) { + + add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / numered3mfpath).string(), + Vec3d{ xpos + xyzScale + xy_scaled_number_x + nozzle_diameter, ypos + nozzle_diameter, z_scaled_model_height - magical_transformation_z_pos }, Vec3d{ xyzScale, xyzScale, z_scale_factor }); + + xpos = xpos + xyzScale + xy_scaled_number_x + nozzle_diameter; + } } } - - ypos = ypos+5;//might need to change this for larger tests? } - x_total = xpos*countincrements; - y_total = ypos; - //i++; } @@ -447,16 +622,20 @@ struct ExtrusionSettings {// think a map is better? /// --- main config, modify object config when possible --- DynamicPrintConfig new_print_config = *print_config; - new_print_config.set_key_value("complete_objects", new ConfigOptionBool(true)); //should be false?, check later - //new_print_config.set_key_value("gap_fill_enabled", new ConfigOptionBool(false)); + new_print_config.set_key_value("complete_objects", new ConfigOptionBool(false)); //true is required for multi tests on single plate. + new_print_config.set_key_value("gap_fill_enabled", new ConfigOptionBool(true)); //should be false?, enabled for testing new_print_config.set_key_value("top_solid_layers", new ConfigOptionInt(0)); //BUG: top layers set to 0 the top layer has a "void" where the top layer would normally be, this might be a config thing that needs to get changed or a slicing bug new_print_config.set_key_value("bottom_solid_layers", new ConfigOptionInt(1)); new_print_config.set_key_value("fill_density", new ConfigOptionPercent(0)); new_print_config.set_key_value("min_width_top_surface", new ConfigOptionFloatOrPercent(0.0,false)); + new_print_config.set_key_value("bottom_fill_pattern", new ConfigOptionEnum(ipMonotonicWGapFill)); + new_print_config.set_key_value("seam_position", new ConfigOptionEnum(spRear));//BUG: should be fixed in 2.7 merge/SS 2.5.59.7, when this is changed the "perimeters & shell" doesn't turn red indicating a change. new_print_config.set_key_value("avoid_crossing_perimeters", new ConfigOptionBool(false)); - new_print_config.set_key_value("per_objects_gcode", new ConfigOptionString("90_bend_v2.3mf,"));// this is the model other parts in code will search for and insert the PA/ect numbers + new_print_config.set_key_value("perimeter_overlap", new ConfigOptionPercent(100)); + new_print_config.set_key_value("external_perimeter_overlap", new ConfigOptionPercent(100)); + new_print_config.set_key_value("per_objects_gcode", new ConfigOptionString(bend_90_nozzle_size_3mf+","));// this is the model other parts in code will search for and insert the PA/ect numbers - for (int16_t i = 1; i < countincrements; i++) { + for (size_t i = 0; i < nb_runs; i++) { /* gcfRepRap, gcfSprinter, @@ -473,45 +652,63 @@ struct ExtrusionSettings {// think a map is better? gcfSmoothie, gcfNoExtrusion*/ + size_t num_part = 0; + const int extra_vol = 1; + for (ModelObject* part : pressure_tower[i]) {//loop though each part/volume and assign the modifers - if (gcfKlipper == flavor) {// gcfKlipper + std::string er_role =""; + if (extrusion_role == "Verify") { + er_role = choice_extrusion_role[num_part]; + if (er_width_ToOptionKey.find(er_role) != er_width_ToOptionKey.end()) { - //thought about adding in the lines here, but then thought of "per_objects_gcode" - //i don't like how the custom_gcode makes the gcode preview a solid color, makes it hard to view/ check things. - } - else if (gcfMarlinFirmware == flavor) { - } - else if (gcfSprinter == flavor) { - } - else if (gcfRepetier == flavor) { - } - else if (gcfTeacup == flavor) { - } - else if (gcfMakerWare == flavor) { - } + er_width = std::round((print_config->get_abs_value(er_width_ToOptionKey[er_role].c_str(), nozzle_diameter) * 100 / nozzle_diameter) * 100.0) / 100.0; + er_speed = print_config->get_abs_value(er_speed_ToOptionKey[er_role].c_str(), nozzle_diameter); + er_accel = print_config->get_abs_value(er_accel_ToOptionKey[er_role].c_str(), nozzle_diameter); + } + else{ + er_width = std::round((default_er_width * 100 / nozzle_diameter) * 100.0) / 100.0; + er_speed = default_er_speed; + er_accel = default_er_accel; + } + } - } + std::string set_advance_prefix =""; + if (gcfKlipper == flavor) { + if(smooth_time == false){ + set_advance_prefix = "SET_PRESSURE_ADVANCE ADVANCE="; + } + else{ + set_advance_prefix = "SET_PRESSURE_ADVANCE SMOOTH_TIME="; + } + } + else if (gcfMarlinFirmware == flavor) { + set_advance_prefix = "M900 K"; + } + else if(gcfRepRap == flavor){ + set_advance_prefix = "M572 S"; + } - /// --- custom config --- // this part is for forcing each model to have x print modifiers - for (size_t i = 0; i < nb_runs; i++) { - size_t num_part = 0; - const int extra_vol = 1; - for (ModelObject* part : pressure_tower[i]) {//loop though each part/volume and assign the modifers + er_width = (er_width == 0) ? std::round((default_er_width * 100 / nozzle_diameter) * 100.0) / 100.0 : er_width; + er_speed = (er_speed == 0) ? default_er_speed : er_speed; + er_accel = (er_accel == 0) ? default_er_accel : er_accel; - model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("perimeter_extrusion_width", new ConfigOptionFloatOrPercent(er_width, true)); - model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("external_perimeter_extrusion_width", new ConfigOptionFloatOrPercent(er_width, true)); + /// --- custom config --- // this is for forcing each model to have x print modifiers + model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("perimeter_extrusion_width", new ConfigOptionFloatOrPercent(er_width, true)); + model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("external_perimeter_extrusion_width", new ConfigOptionFloatOrPercent(er_width, true));//TODO: check widths and ect breaks if any values are in mm/percentage model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("perimeter_speed", new ConfigOptionFloatOrPercent(er_speed, false)); model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("external_perimeter_speed", new ConfigOptionFloatOrPercent(er_speed, false)); model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("gap_fill_speed", new ConfigOptionFloatOrPercent(er_speed, false)); - model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("perimeter_acceleration", new ConfigOptionFloatOrPercent(er_accel, false)); model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("external_perimeter_acceleration", new ConfigOptionFloatOrPercent(er_accel, false)); model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("gap_fill_acceleration", new ConfigOptionFloatOrPercent(er_accel, false)); - //model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("between_objects_gcode", new ConfigOptionString("SET_PRESSURE_ADVANCE ADVANCE=" + std::to_string(pa_values[num_part]))); // "between_objects_gcode" has validation and ect, figured it was easier to make a new thing. - model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("per_objects_gcode", new ConfigOptionString("SET_PRESSURE_ADVANCE ADVANCE=" + std::to_string(pa_values[num_part]))); - + if (extrusion_role == "Verify") { + model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("per_objects_gcode", new ConfigOptionString(set_advance_prefix +"\n; " + er_role ));//user manual type in values + } + else{ + model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("per_objects_gcode", new ConfigOptionString(set_advance_prefix + std::to_string(pa_values[num_part]))); + } num_part++; } } @@ -543,8 +740,9 @@ struct ExtrusionSettings {// think a map is better? } - // need to add if statement to check if loaded model is within print bounds? - plat->reslice(); //forces a slice of plater. + if (extrusion_role != "Verify") {//don't auto slice so user can manual add PA values + plat->reslice(); //forces a slice of plater. + } if (autocenter) { //re-enable auto-center after this calibration. @@ -552,5 +750,30 @@ struct ExtrusionSettings {// think a map is better? } } +double CalibrationPressureAdvDialog::magical_scaling(double nozzle_diameter, double er_width, double filament_max_overlap, double spacing_ratio, double spacing_ratio_external, double base_layer_height, double er_spacing ){ + + double xyzScale = nozzle_diameter / 0.4; + double er_width_decimal = er_width * nozzle_diameter / 100.0;//models are generated to be default width of x4 lines for the walls ie; 0.4mm nozzle is 1.6mm thick walls + double er_width_to_scale =1.0; + double overlap_ratio = 1; + if (filament_max_overlap) {overlap_ratio = filament_max_overlap;} + + spacing_ratio = std::min(overlap_ratio * 0.5f, spacing_ratio_external / 2.0); + double new_scale_spacing = er_width_decimal-base_layer_height*float(1. -0.25 *PI)* spacing_ratio; + double spacing_value = std::round((new_scale_spacing / nozzle_diameter) * 100); //spacing_value = Round((Spacing / Max Nozzle Diameter) * 100) + er_spacing = (std::round(spacing_value * 10000) / 10000) *0.01; + + + if (xyzScale > 4 ) { + er_width_to_scale = 1.0; + } + else{ + er_width_to_scale = er_spacing -(nozzle_diameter/2*0.01);//need to scale slightly under to help with models being correct TODO: test more configurations of nozzle sizes/layer heights + //if use has the 'wrong' min layer height for a nozzle size, the model will get filled with "gapfill" not a normal extrusion, need to test more for what variables 'break' it + } + + return er_width_to_scale; +} + } // namespace GUI } // namespace Slic3r diff --git a/src/slic3r/GUI/CalibrationPressureAdvDialog.hpp b/src/slic3r/GUI/CalibrationPressureAdvDialog.hpp index bb7a6dfb430..b191d332c40 100644 --- a/src/slic3r/GUI/CalibrationPressureAdvDialog.hpp +++ b/src/slic3r/GUI/CalibrationPressureAdvDialog.hpp @@ -11,12 +11,13 @@ class CalibrationPressureAdvDialog : public CalibrationAbstractDialog public: CalibrationPressureAdvDialog(GUI_App* app, MainFrame* mainframe) : CalibrationAbstractDialog(app, mainframe, "Pressure calibration") - { create(boost::filesystem::path("calibration") / "filament_pressure", "filament_pressure.html", wxSize(1300, 600)); } + { create(boost::filesystem::path("calibration") / "filament_pressure", "filament_pressure.html", wxSize(1600, 600)); Centre(wxBOTH);} virtual ~CalibrationPressureAdvDialog(){ } protected: void create_buttons(wxStdDialogButtonSizer* sizer) override; void create_geometry(wxCommandEvent& event_args); + double magical_scaling(double, double, double, double, double, double, double ); //i've set choice boxes for now just to save me typing numbers in when i want to test it :) wxComboBox* firstPa; //first layer PA -user manual entry @@ -26,6 +27,7 @@ class CalibrationPressureAdvDialog : public CalibrationAbstractDialog wxComboBox* paIncrement;//increment PA by this value -user manual entry~~ or have drop down box ? wxComboBox* erPa; //extrusion role Pressure/Linear Advance -user choice select wxComboBox* nbRuns; + wxCheckBox* enableST; // add checkbox/s for "smooth_time" }; From d5e5ad2e5d6cbd9d9e3746d3b5cfd573e76a9984 Mon Sep 17 00:00:00 2001 From: legend069 <40685552+legend069@users.noreply.github.com> Date: Sun, 14 Apr 2024 18:34:50 +1000 Subject: [PATCH 12/28] small changes for positioning/scaling fixed GUI prompt for "unsupported firmware type" need to figure out the math required for the right border so it will be scaled with the numbers.. math is hard :( --- .../GUI/CalibrationPressureAdvDialog.cpp | 247 ++++++++++-------- .../GUI/CalibrationPressureAdvDialog.hpp | 3 +- 2 files changed, 136 insertions(+), 114 deletions(-) diff --git a/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp b/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp index 4a28f1aef87..c18a1a3841a 100644 --- a/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp +++ b/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp @@ -16,7 +16,7 @@ #include "Jobs/ArrangeJob.hpp" #include - +#pragma optimize("", off) #if ENABLE_SCROLLABLE static wxSize get_screen_size(wxWindow* window) { @@ -130,36 +130,39 @@ void CalibrationPressureAdvDialog::create_buttons(wxStdDialogButtonSizer* button std::string prefix = (gcfMarlinFirmware == flavor) ? " LA " : ((gcfKlipper == flavor || gcfRepRap == flavor) ? " PA " : "unsupported firmware type"); - - buttons->Add(new wxStaticText(this, wxID_ANY, _L("Number of tests: "))); - buttons->Add(nbRuns); - buttons->AddSpacer(15); - buttons->Add(new wxStaticText(this, wxID_ANY, _L("First Layers" + prefix + "value: "))); - buttons->Add(firstPa); - buttons->AddSpacer(15); - buttons->Add(new wxStaticText(this, wxID_ANY, _L("Starting" + prefix + "value: "))); - buttons->Add(startPa); - buttons->AddSpacer(15); - buttons->Add(new wxStaticText(this, wxID_ANY, _L("Ending" + prefix + "value: "))); - buttons->Add(endPa); - buttons->AddSpacer(15); - buttons->Add(new wxStaticText(this, wxID_ANY, _L(prefix + "increments: "))); - buttons->Add(paIncrement); - buttons->AddSpacer(15); - buttons->Add(new wxStaticText(this, wxID_ANY, _L("Extrusion role: "))); - buttons->Add(erPa); - if (gcfKlipper == flavor) { + if (prefix != "unsupported firmware type"){ + buttons->Add(new wxStaticText(this, wxID_ANY, _L("Number of tests: "))); + buttons->Add(nbRuns); buttons->AddSpacer(15); - buttons->Add(new wxStaticText(this, wxID_ANY, _L("Smooth time: "))); - buttons->Add(enableST); - } - buttons->AddSpacer(25); - + buttons->Add(new wxStaticText(this, wxID_ANY, _L("First Layers" + prefix + "value: "))); + buttons->Add(firstPa); + buttons->AddSpacer(15); + buttons->Add(new wxStaticText(this, wxID_ANY, _L("Starting" + prefix + "value: "))); + buttons->Add(startPa); + buttons->AddSpacer(15); + buttons->Add(new wxStaticText(this, wxID_ANY, _L("Ending" + prefix + "value: "))); + buttons->Add(endPa); + buttons->AddSpacer(15); + buttons->Add(new wxStaticText(this, wxID_ANY, _L(prefix + "increments: "))); + buttons->Add(paIncrement); + buttons->AddSpacer(15); + buttons->Add(new wxStaticText(this, wxID_ANY, _L("Extrusion role: "))); + buttons->Add(erPa); + if (gcfKlipper == flavor) { + buttons->AddSpacer(15); + buttons->Add(new wxStaticText(this, wxID_ANY, _L("Smooth time: "))); + buttons->Add(enableST); + } + buttons->AddSpacer(25); - wxButton* bt = new wxButton(this, wxID_FILE1, _L("Generate")); - bt->Bind(wxEVT_BUTTON, &CalibrationPressureAdvDialog::create_geometry, this); - buttons->Add(bt); - //this->CenterOnParent(); + wxButton* bt = new wxButton(this, wxID_FILE1, _L("Generate")); + bt->Bind(wxEVT_BUTTON, &CalibrationPressureAdvDialog::create_geometry, this); + buttons->Add(bt); + //this->CenterOnParent(); + } + else{ + buttons->Add(new wxStaticText(this, wxID_ANY, _L(prefix))); + } } void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { @@ -440,13 +443,15 @@ struct ExtrusionSettings {// think a struct is better instead of all the maps ? double initial_number_x = 2.06;//fusion=2.063 mm double initial_number_y = 4.12;//fusion=4.125 mm double initial_border_x = 1.6;//fusion= 1.6mm + double initial_point_xy = 0.69;//fusion = 0.687 mm double z_scaled_model_height = initial_model_height * (first_layer_height / initial_model_height); double xy_scaled_90_bend_x = initial_90_bend_x * er_width_to_scale; double xy_scaled_y = initial_90_bend_y * er_width_to_scale; double xy_scaled_x = initial_border_x * er_width_to_scale; //maybe the right border x can be scaled with numbers ? - double xy_scaled_number_x = initial_number_x * er_width_to_scale; - double xy_scaled_number_y = initial_number_y * er_width_to_scale; + double xy_scaled_number_x = initial_number_x * xyzScale * er_width_to_scale; + double xy_scaled_number_y = initial_number_y * xyzScale * er_width_to_scale; + double xy_scaled_point_xy = initial_point_xy * xyzScale * er_width_to_scale; double thickness_offset = nozzle_diameter * er_width_to_scale * 2; @@ -462,6 +467,7 @@ struct ExtrusionSettings {// think a struct is better instead of all the maps ? // BUG: output error if first layer height is lower than base layer height // this can cause the numbers to not "show up" on the preview because the z scale is calculated wrong. // ie; first_layer_height=0.1 and base_layer_height =0.20 + //BUG: if first/base layer height are both .02 numbers don't show up when sliced. doesn't happen with windows, it did for linux ? @@ -507,104 +513,121 @@ struct ExtrusionSettings {// think a struct is better instead of all the maps ? } } else{//not verify - for (int nb_bends = 0; nb_bends <= countincrements -1; nb_bends++){ + for (int nb_bends = 0; nb_bends < countincrements; nb_bends++){ + //const double magical_transformation_y_pos = 10.47; pressure_tower.back().push_back(add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "scaled_with_nozzle_size" / bend_90_nozzle_size_3mf).string(), Vec3d{ -0.8, double(nb_bends) * (thickness_offset*2) *2 , xyzScale - base_layer_height }, Vec3d{ er_width_to_scale, er_width_to_scale, z_scale_90_bend })); - Eigen::Vector3d modelPosition(-0.8, double(nb_bends) * (thickness_offset*2) *2, xyzScale - base_layer_height ); + Eigen::Vector3d modelPosition(-0.8, (double(nb_bends) * (thickness_offset*2) *2) , xyzScale - base_layer_height ); bend_90_positions.push_back(modelPosition); } } - for (int nb_bends = 0; nb_bends <= countincrements;nb_bends++){ - bool enable_old_border = true; - if(enable_old_border == true){ - if(nb_bends == countincrements / 2 ) {//half way point load borders - - double offset_y = 2 * thickness_offset * 2; - const double magical_transformation_x_pos = 20.6;//what is this, and how is this calculated ? >:( - const double magical_transformation_y_pos = 10.47;//load a model without moving its pos to find see what it is.the number doesn't seem to change regardless of layer heights/nozzle size - Eigen::Vector3d bend_pos_first = bend_90_positions[0]; - Eigen::Vector3d bend_pos_mid = bend_90_positions[nb_bends]; - Eigen::Vector3d bend_pos_last = bend_90_positions[countincrements-1]; - - double left_border_pos_x = (-xy_scaled_90_bend_x / 2) + (xy_scaled_x / 2); - double total_height = (bend_pos_first.y() + magical_transformation_y_pos) + (bend_pos_last.y()+ magical_transformation_y_pos) - 0.8 + offset_y; - double scaled_border_y = ((total_height / initial_90_bend_y) *100) + offset_y; - - double right_pos_border_x = xy_scaled_90_bend_x-(xy_scaled_x / 2); - double scaled_y = (initial_border_x*(xy_scaled_x * 1.5)) / initial_90_bend_y; - double right_border_scaled_x = (xy_scaled_90_bend_x / initial_border_x) * 100 + (xy_scaled_x * 2) ;//maybe scale with numbers? - double bottom_border_pos_x = (initial_border_x * right_border_scaled_x * 0.01) / 2 -0.8; - - //---------- - add_part(model.objects[objs_idx[id_item]], - (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border.3mf").string(), - Vec3d{ left_border_pos_x + magical_transformation_x_pos, bend_pos_mid.y(), new_z_world_coords }, - /*scale*/Vec3d{ xy_scaled_x * 1.5, scaled_border_y*0.01, z_scale_factor }); // Left border - //---------- - add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border.3mf").string(),//maybe the right border x can be scaled with numbers ? - Vec3d{ right_pos_border_x + magical_transformation_x_pos , bend_pos_mid.y(), new_z_world_coords }, - /*scale*/Vec3d{ right_border_scaled_x*0.01, scaled_border_y*0.01 , z_scale_factor });// right border - //---------- - add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border.3mf").string(), - Vec3d{ bottom_border_pos_x + magical_transformation_x_pos , bend_pos_first.y() - (offset_y / 1.8) - magical_transformation_y_pos , new_z_world_coords }, - /*scale*/Vec3d{ (right_border_scaled_x*2)*0.01, scaled_y, z_scale_factor });//bottom border - //---------- - add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border.3mf").string(), - Vec3d{ bottom_border_pos_x + magical_transformation_x_pos , bend_pos_last.y() - magical_transformation_y_pos + xy_scaled_y +(offset_y/2), new_z_world_coords }, - /*scale*/Vec3d{ (right_border_scaled_x*2)*0.01, scaled_y, z_scale_factor });//top border - // position in printer coords are half of scaled size - // scale model in percentage from original models xy values! - //---------- - } - } - } + for (int nb_bends = 0; nb_bends < countincrements;nb_bends++){ + if(nb_bends == 1 ) {//only load once. this onyl determines when the borders get loaded, keeping at top of list makes it easier to scroll down to. it can't be '0' since it needs the numbers positions! + double offset_y = 2 * thickness_offset * 2; + double offset_x = 2; - if (extrusion_role != "Verify") { - for (int nb_bends = 0; nb_bends < countincrements; nb_bends++){ + const double magical_transformation_x_pos = 20.6;//what is this, and how is this calculated ? >:( + const double magical_transformation_y_pos = 10.47;//load a model without moving its pos to find see what it is.the number doesn't seem to change regardless of layer heights/nozzle size + Eigen::Vector3d bend_pos_first = bend_90_positions[0]; + Eigen::Vector3d bend_pos_mid = bend_90_positions[countincrements/2]; + Eigen::Vector3d bend_pos_last = bend_90_positions[countincrements-1]; - if (nb_bends % 2 == 1) { // Skip generating every second number - continue; - } + Eigen::Vector3d numer_pos_first = number_positions[0]; + Eigen::Vector3d numer_pos_last = number_positions[6]; + double total_width = numer_pos_first.x() + numer_pos_last.x() + xy_scaled_number_x; + + double scaled_border_x = (total_width - numer_pos_first.x()) / initial_border_x; + + double left_border_pos_x = (-xy_scaled_90_bend_x / 2) + (xy_scaled_x / 2); + double total_height = bend_pos_first.y() + bend_pos_last.y() + xy_scaled_y; + + double scaled_border_y = ((total_height / initial_90_bend_y) *100) + offset_y; + + double right_pos_border_x = xy_scaled_90_bend_x-(xy_scaled_x / 2); + double scaled_y = (initial_border_x*(xy_scaled_x * 1.5)) / initial_90_bend_y; + double right_border_scaled_x = (xy_scaled_90_bend_x / initial_border_x) * 100 + (xy_scaled_x * 2) ;//maybe scale with numbers? + double bottom_border_pos_x = (initial_border_x * right_border_scaled_x * 0.01) / 2 -0.8; + + //---------- + add_part(model.objects[objs_idx[id_item]], + (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border.3mf").string(), + Vec3d{ left_border_pos_x + magical_transformation_x_pos, bend_pos_mid.y(), new_z_world_coords }, + /*scale*/Vec3d{ xy_scaled_x * 1.5, scaled_border_y*0.01, z_scale_factor }); // Left border + //---------- + add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border.3mf").string(),//maybe the right border x can be scaled with numbers ? + Vec3d{ right_pos_border_x + magical_transformation_x_pos , bend_pos_mid.y(), new_z_world_coords }, //need to fix numbers before i start on this. + /*scale*/Vec3d{ right_border_scaled_x*0.01, scaled_border_y*0.01 , z_scale_factor });// right border //target for default input paramters = 14.78 + + bool enable_top_bottom = true; + if(enable_top_bottom == true){//remove later + //---------- + add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border.3mf").string(), + Vec3d{ bottom_border_pos_x + magical_transformation_x_pos , bend_pos_first.y() - (xy_scaled_y /1.8), new_z_world_coords }, + /*scale*/Vec3d{ (right_border_scaled_x*2)*0.01, scaled_y, z_scale_factor });//bottom border + //---------- + add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border.3mf").string(), + Vec3d{ bottom_border_pos_x + magical_transformation_x_pos , bend_pos_last.y() + (xy_scaled_y /1.8) , new_z_world_coords }, + /*scale*/Vec3d{ (right_border_scaled_x*2)*0.01, scaled_y, z_scale_factor });//top border + } + // position in printer coords are half of scaled size! + // scale model in percentage from original models xy values! + //---------- + } + //} - Eigen::Vector3d bend_90_pos = bend_90_positions[nb_bends]; - const double magical_transformation_num_x_pos = 1.03; - const double magical_transformation_num_y_pos = -2.06; - const double magical_transformation_z_pos = 0.12;//0.1 is the transformation value, but set slightly higher so numbers would be "inside" right border + if (extrusion_role != "Verify") {// possible to load the words for each ER role? - double bend_90_y = bend_90_pos.y() - magical_transformation_num_y_pos; - double bend_90_x = bend_90_pos.x() + magical_transformation_num_x_pos; - double xpos_initial = bend_90_x + magical_transformation_num_x_pos + (xy_scaled_90_bend_x/2); - double ypos = bend_90_y + xy_scaled_y -(xy_scaled_number_y/2); - double xpos = xpos_initial; - - std::string pa_values_string = std::to_string(pa_values[nb_bends]); - std::string threemf =".3mf"; - - for (int j = 0; j < 7; ++j) {//not sure how the code will respond with a positive array list? ie ; 100.2 this moves decimal point thus breaking the code from loading model since "..3mf" not a real file + if (nb_bends % 2 == 1) { // Skip generating every second number + continue; + } - std::string numered3mfpath = pa_values_string[j] + threemf; - - if (pa_values_string[j] == '.') { + Eigen::Vector3d bend_90_pos = bend_90_positions[nb_bends]; + const double magical_transformation_y_pos = 10.47; + const double magical_transformation_num_x_pos = 1.03; + const double magical_transformation_num_y_pos = 2.06;// -2.03 + const double magical_transformation_z_pos = 0.12;//0.1 is the transformation value, but set slightly higher so numbers would be "inside" right border this might be dependant on z_scale_factor - add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "point.3mf").string(), - Vec3d{ xpos + xy_scaled_number_x + xyzScale + nozzle_diameter , ypos - xy_scaled_number_y , z_scaled_model_height - magical_transformation_z_pos }, Vec3d{ xyzScale, xyzScale+(xyzScale/2), z_scale_factor }); + double bend_90_y = bend_90_pos.y() + magical_transformation_y_pos + (xy_scaled_y/2); + double bend_90_x = bend_90_pos.x() + magical_transformation_num_x_pos; + double xpos_initial = bend_90_x + (xy_scaled_90_bend_x/2) - xy_scaled_number_x + nozzle_diameter; + double ypos_inital = bend_90_y /*+ (xy_scaled_number_y/2)*/; + double ypos_point = bend_90_y - (xy_scaled_number_y/2) - nozzle_diameter; - xpos = xpos + xy_scaled_number_x + xyzScale + nozzle_diameter; - } - else if (std::isdigit(pa_values_string[j])) { - - add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / numered3mfpath).string(), - Vec3d{ xpos + xyzScale + xy_scaled_number_x + nozzle_diameter, ypos + nozzle_diameter, z_scaled_model_height - magical_transformation_z_pos }, Vec3d{ xyzScale, xyzScale, z_scale_factor }); + double xpos = xpos_initial; + double ypos = ypos_inital; + + std::string pa_values_string = std::to_string(pa_values[nb_bends]); + std::string threemf =".3mf"; + + for (int j = 0; j < 7; ++j) {//not sure how the code will respond with a positive array list? ie ; 100.2 this moves decimal point thus breaking the code from loading model since "..3mf" not a real file + + std::string numered3mfpath = pa_values_string[j] + threemf; - xpos = xpos + xyzScale + xy_scaled_number_x + nozzle_diameter; + if (pa_values_string[j] == '.') { + + add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "point.3mf").string(), + Vec3d{ xpos + xy_scaled_number_x + nozzle_diameter , ypos_point, z_scaled_model_height - magical_transformation_z_pos }, Vec3d{ xyzScale, xyzScale+(xyzScale/2), z_scale_factor }); + + Eigen::Vector3d modelPosition(xpos + xy_scaled_number_x + nozzle_diameter + magical_transformation_num_x_pos, ypos_point, z_scaled_model_height - magical_transformation_z_pos ); + number_positions.push_back(modelPosition); + xpos = xpos + xy_scaled_point_xy + (nozzle_diameter * 2 ); + } + else if (std::isdigit(pa_values_string[j])) { + + add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / numered3mfpath).string(), + Vec3d{ xpos + xy_scaled_number_x + nozzle_diameter, ypos, z_scaled_model_height - magical_transformation_z_pos }, Vec3d{ xyzScale * er_width_to_scale, xyzScale * er_width_to_scale, z_scale_factor }); + + Eigen::Vector3d modelPosition(xpos + xy_scaled_number_x + nozzle_diameter + magical_transformation_num_x_pos, ypos, z_scaled_model_height - magical_transformation_z_pos ); + number_positions.push_back(modelPosition); + xpos = xpos + xy_scaled_number_x + nozzle_diameter; + } } - } } } } @@ -670,7 +693,6 @@ struct ExtrusionSettings {// think a struct is better instead of all the maps ? er_speed = default_er_speed; er_accel = default_er_accel; } - } std::string set_advance_prefix =""; @@ -704,10 +726,10 @@ struct ExtrusionSettings {// think a struct is better instead of all the maps ? model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("external_perimeter_acceleration", new ConfigOptionFloatOrPercent(er_accel, false)); model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("gap_fill_acceleration", new ConfigOptionFloatOrPercent(er_accel, false)); if (extrusion_role == "Verify") { - model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("per_objects_gcode", new ConfigOptionString(set_advance_prefix +"\n; " + er_role ));//user manual type in values + model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("per_objects_gcode", new ConfigOptionString(set_advance_prefix + "\n; " + er_role ));//user manual type in values } else{ - model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("per_objects_gcode", new ConfigOptionString(set_advance_prefix + std::to_string(pa_values[num_part]))); + model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("per_objects_gcode", new ConfigOptionString(set_advance_prefix + std::to_string(pa_values[num_part]) + "\n; " + extrusion_role )); } num_part++; } @@ -777,3 +799,4 @@ double CalibrationPressureAdvDialog::magical_scaling(double nozzle_diameter, dou } // namespace GUI } // namespace Slic3r +#pragma optimize("", on) \ No newline at end of file diff --git a/src/slic3r/GUI/CalibrationPressureAdvDialog.hpp b/src/slic3r/GUI/CalibrationPressureAdvDialog.hpp index b191d332c40..4521e07daba 100644 --- a/src/slic3r/GUI/CalibrationPressureAdvDialog.hpp +++ b/src/slic3r/GUI/CalibrationPressureAdvDialog.hpp @@ -27,8 +27,7 @@ class CalibrationPressureAdvDialog : public CalibrationAbstractDialog wxComboBox* paIncrement;//increment PA by this value -user manual entry~~ or have drop down box ? wxComboBox* erPa; //extrusion role Pressure/Linear Advance -user choice select wxComboBox* nbRuns; - wxCheckBox* enableST; - // add checkbox/s for "smooth_time" + wxCheckBox* enableST; // checkbox for "smooth_time" - klipper only feature? }; From 41b0922bfb03c84205757ae210368b5636f5a32d Mon Sep 17 00:00:00 2001 From: legend069 <40685552+legend069@users.noreply.github.com> Date: Sun, 21 Apr 2024 21:51:36 +1000 Subject: [PATCH 13/28] right border now scales with numbers! need to re-adjust scale for left/top/bottom now, since larger nozzle sizes can prevent bottom solid layers forming. --- .../GUI/CalibrationPressureAdvDialog.cpp | 101 +++++++++--------- 1 file changed, 51 insertions(+), 50 deletions(-) diff --git a/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp b/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp index c18a1a3841a..dfb3aa100ff 100644 --- a/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp +++ b/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp @@ -448,7 +448,7 @@ struct ExtrusionSettings {// think a struct is better instead of all the maps ? double z_scaled_model_height = initial_model_height * (first_layer_height / initial_model_height); double xy_scaled_90_bend_x = initial_90_bend_x * er_width_to_scale; double xy_scaled_y = initial_90_bend_y * er_width_to_scale; - double xy_scaled_x = initial_border_x * er_width_to_scale; //maybe the right border x can be scaled with numbers ? + double xy_scaled_x = initial_border_x * er_width_to_scale; double xy_scaled_number_x = initial_number_x * xyzScale * er_width_to_scale; double xy_scaled_number_y = initial_number_y * xyzScale * er_width_to_scale; double xy_scaled_point_xy = initial_point_xy * xyzScale * er_width_to_scale; @@ -527,7 +527,7 @@ struct ExtrusionSettings {// think a struct is better instead of all the maps ? for (int nb_bends = 0; nb_bends < countincrements;nb_bends++){ - if(nb_bends == 1 ) {//only load once. this onyl determines when the borders get loaded, keeping at top of list makes it easier to scroll down to. it can't be '0' since it needs the numbers positions! + if(nb_bends == 1 && extrusion_role != "Verify") {//only load once. this onyl determines when the borders get loaded, keeping at top of list makes it easier to scroll down to. it can't be '0' since it needs the numbers positions! double offset_y = 2 * thickness_offset * 2; double offset_x = 2; @@ -538,20 +538,21 @@ struct ExtrusionSettings {// think a struct is better instead of all the maps ? Eigen::Vector3d bend_pos_mid = bend_90_positions[countincrements/2]; Eigen::Vector3d bend_pos_last = bend_90_positions[countincrements-1]; - Eigen::Vector3d numer_pos_first = number_positions[0]; - Eigen::Vector3d numer_pos_last = number_positions[6]; - double total_width = numer_pos_first.x() + numer_pos_last.x() + xy_scaled_number_x; - - double scaled_border_x = (total_width - numer_pos_first.x()) / initial_border_x; + Eigen::Vector3d number_pos_first = number_positions[0]; + Eigen::Vector3d number_pos_mid = number_positions[3]; + Eigen::Vector3d number_pos_last = number_positions[6]; + double numbers_total_width = (number_pos_last.x() + (xy_scaled_number_x / 2)) - (number_pos_first.x() - (xy_scaled_number_x / 2)); + //double scaled_border_x = numbers_total_width + xy_scaled_number_x; + double scaled_border_x_percentage = ((numbers_total_width + xy_scaled_number_x) / initial_border_x) * 100; double left_border_pos_x = (-xy_scaled_90_bend_x / 2) + (xy_scaled_x / 2); double total_height = bend_pos_first.y() + bend_pos_last.y() + xy_scaled_y; double scaled_border_y = ((total_height / initial_90_bend_y) *100) + offset_y; - double right_pos_border_x = xy_scaled_90_bend_x-(xy_scaled_x / 2); + double right_pos_border_x = number_pos_mid.x(); double scaled_y = (initial_border_x*(xy_scaled_x * 1.5)) / initial_90_bend_y; - double right_border_scaled_x = (xy_scaled_90_bend_x / initial_border_x) * 100 + (xy_scaled_x * 2) ;//maybe scale with numbers? + double right_border_scaled_x = (xy_scaled_90_bend_x / initial_border_x) * 100 + (xy_scaled_x * 2) ; double bottom_border_pos_x = (initial_border_x * right_border_scaled_x * 0.01) / 2 -0.8; //---------- @@ -560,9 +561,9 @@ struct ExtrusionSettings {// think a struct is better instead of all the maps ? Vec3d{ left_border_pos_x + magical_transformation_x_pos, bend_pos_mid.y(), new_z_world_coords }, /*scale*/Vec3d{ xy_scaled_x * 1.5, scaled_border_y*0.01, z_scale_factor }); // Left border //---------- - add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border.3mf").string(),//maybe the right border x can be scaled with numbers ? - Vec3d{ right_pos_border_x + magical_transformation_x_pos , bend_pos_mid.y(), new_z_world_coords }, //need to fix numbers before i start on this. - /*scale*/Vec3d{ right_border_scaled_x*0.01, scaled_border_y*0.01 , z_scale_factor });// right border //target for default input paramters = 14.78 + add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border.3mf").string(), + Vec3d{ right_pos_border_x + magical_transformation_x_pos , bend_pos_mid.y(), new_z_world_coords }, + /*scale*/Vec3d{ scaled_border_x_percentage*0.01 , scaled_border_y*0.01 , z_scale_factor });// right border bool enable_top_bottom = true; if(enable_top_bottom == true){//remove later @@ -583,51 +584,51 @@ struct ExtrusionSettings {// think a struct is better instead of all the maps ? if (extrusion_role != "Verify") {// possible to load the words for each ER role? - if (nb_bends % 2 == 1) { // Skip generating every second number - continue; - } + if (nb_bends % 2 == 1) { // Skip generating every second number + continue; + } - Eigen::Vector3d bend_90_pos = bend_90_positions[nb_bends]; - const double magical_transformation_y_pos = 10.47; - const double magical_transformation_num_x_pos = 1.03; - const double magical_transformation_num_y_pos = 2.06;// -2.03 - const double magical_transformation_z_pos = 0.12;//0.1 is the transformation value, but set slightly higher so numbers would be "inside" right border this might be dependant on z_scale_factor + Eigen::Vector3d bend_90_pos = bend_90_positions[nb_bends]; + const double magical_transformation_y_pos = 10.47; + const double magical_transformation_num_x_pos = 1.03; + const double magical_transformation_num_y_pos = 2.06;// -2.03 + const double magical_transformation_z_pos = 0.12;//0.1 is the transformation value, but set slightly higher so numbers would be "inside" right border this might be dependant on z_scale_factor - double bend_90_y = bend_90_pos.y() + magical_transformation_y_pos + (xy_scaled_y/2); - double bend_90_x = bend_90_pos.x() + magical_transformation_num_x_pos; - double xpos_initial = bend_90_x + (xy_scaled_90_bend_x/2) - xy_scaled_number_x + nozzle_diameter; - double ypos_inital = bend_90_y /*+ (xy_scaled_number_y/2)*/; - double ypos_point = bend_90_y - (xy_scaled_number_y/2) - nozzle_diameter; + double bend_90_y = bend_90_pos.y() + magical_transformation_y_pos + (xy_scaled_y/2); + double bend_90_x = bend_90_pos.x() + magical_transformation_num_x_pos; + double xpos_initial = bend_90_x + (xy_scaled_90_bend_x/2) - xy_scaled_number_x + nozzle_diameter; + double ypos_inital = bend_90_y /*+ (xy_scaled_number_y/2)*/; + double ypos_point = bend_90_y - (xy_scaled_number_y/2) - nozzle_diameter; - double xpos = xpos_initial; - double ypos = ypos_inital; - - std::string pa_values_string = std::to_string(pa_values[nb_bends]); - std::string threemf =".3mf"; + double xpos = xpos_initial; + double ypos = ypos_inital; - for (int j = 0; j < 7; ++j) {//not sure how the code will respond with a positive array list? ie ; 100.2 this moves decimal point thus breaking the code from loading model since "..3mf" not a real file + std::string pa_values_string = std::to_string(pa_values[nb_bends]); + std::string threemf =".3mf"; + + for (int j = 0; j < 7; ++j) {//not sure how the code will respond with a positive array list? ie ; 100.2 this moves decimal point thus breaking the code from loading model since "..3mf" not a real file - std::string numered3mfpath = pa_values_string[j] + threemf; + std::string numered3mfpath = pa_values_string[j] + threemf; + + if (pa_values_string[j] == '.') { + + add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "point.3mf").string(), + Vec3d{ xpos + xy_scaled_number_x + nozzle_diameter , ypos_point, z_scaled_model_height - magical_transformation_z_pos }, Vec3d{ xyzScale * er_width_to_scale, xyzScale+(xyzScale/2), z_scale_factor }); + + Eigen::Vector3d modelPosition(xpos + xy_scaled_number_x + nozzle_diameter + magical_transformation_num_x_pos, ypos_point, z_scaled_model_height - magical_transformation_z_pos ); + number_positions.push_back(modelPosition); + xpos = xpos + xy_scaled_point_xy + (nozzle_diameter * 2 ); + } + else if (std::isdigit(pa_values_string[j])) { + + add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / numered3mfpath).string(), + Vec3d{ xpos + xy_scaled_number_x + nozzle_diameter, ypos, z_scaled_model_height - magical_transformation_z_pos }, Vec3d{ xyzScale * er_width_to_scale, xyzScale * er_width_to_scale, z_scale_factor }); - if (pa_values_string[j] == '.') { - - add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "point.3mf").string(), - Vec3d{ xpos + xy_scaled_number_x + nozzle_diameter , ypos_point, z_scaled_model_height - magical_transformation_z_pos }, Vec3d{ xyzScale, xyzScale+(xyzScale/2), z_scale_factor }); - - Eigen::Vector3d modelPosition(xpos + xy_scaled_number_x + nozzle_diameter + magical_transformation_num_x_pos, ypos_point, z_scaled_model_height - magical_transformation_z_pos ); - number_positions.push_back(modelPosition); - xpos = xpos + xy_scaled_point_xy + (nozzle_diameter * 2 ); - } - else if (std::isdigit(pa_values_string[j])) { - - add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / numered3mfpath).string(), - Vec3d{ xpos + xy_scaled_number_x + nozzle_diameter, ypos, z_scaled_model_height - magical_transformation_z_pos }, Vec3d{ xyzScale * er_width_to_scale, xyzScale * er_width_to_scale, z_scale_factor }); - - Eigen::Vector3d modelPosition(xpos + xy_scaled_number_x + nozzle_diameter + magical_transformation_num_x_pos, ypos, z_scaled_model_height - magical_transformation_z_pos ); - number_positions.push_back(modelPosition); - xpos = xpos + xy_scaled_number_x + nozzle_diameter; - } + Eigen::Vector3d modelPosition(xpos + xy_scaled_number_x + nozzle_diameter + magical_transformation_num_x_pos, ypos, z_scaled_model_height - magical_transformation_z_pos ); + number_positions.push_back(modelPosition); + xpos = xpos + xy_scaled_number_x + nozzle_diameter; } + } } } } From 36eb3f2e9f23c0ee45322579a1a4fc264f81a3bf Mon Sep 17 00:00:00 2001 From: legend069 <40685552+legend069@users.noreply.github.com> Date: Sun, 5 May 2024 01:07:14 +1000 Subject: [PATCH 14/28] small changes to the border scale and prefill for 'before_layer_gcode' added prefill value for 'before_layer_gcode' --- src/libslic3r/GCode.cpp | 2 +- .../GUI/CalibrationPressureAdvDialog.cpp | 74 ++++++++++--------- 2 files changed, 41 insertions(+), 35 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index c4067a0515c..fdb9ee1487a 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -1458,7 +1458,7 @@ void GCode::_do_export(Print& print_mod, GCodeOutputStream &file, ThumbnailsGene if (volume_config) {//failsafe check, maybe user forgot to add the manipulator in volume_config_per_object_gcode = volume->config.opt_serialize("per_objects_gcode"); file.writeln(volume_config_per_object_gcode); - m_writer.set_per_object_gcode(volume_config_per_object_gcode); + m_writer.set_per_object_gcode(volume_config_per_object_gcode);//need to check if "per_objects_gcode" contains '\n' split string and write it the write new line and write remaining of string till next "\n" } break; } diff --git a/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp b/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp index dfb3aa100ff..cf4c980a753 100644 --- a/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp +++ b/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp @@ -447,7 +447,7 @@ struct ExtrusionSettings {// think a struct is better instead of all the maps ? double z_scaled_model_height = initial_model_height * (first_layer_height / initial_model_height); double xy_scaled_90_bend_x = initial_90_bend_x * er_width_to_scale; - double xy_scaled_y = initial_90_bend_y * er_width_to_scale; + double xy_scaled_90_bend_y = initial_90_bend_y * er_width_to_scale; double xy_scaled_x = initial_border_x * er_width_to_scale; double xy_scaled_number_x = initial_number_x * xyzScale * er_width_to_scale; double xy_scaled_number_y = initial_number_y * xyzScale * er_width_to_scale; @@ -490,7 +490,7 @@ struct ExtrusionSettings {// think a struct is better instead of all the maps ? (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "scaled_with_nozzle_size" / bend_90_nozzle_size_3mf).string(), Vec3d{ -0.8, (initial_90_bend_y/2) * nb_bends , xyzScale - base_layer_height }, Vec3d{ er_width_to_scale, er_width_to_scale, z_scale_90_bend })); - Eigen::Vector3d modelPosition(0, (initial_90_bend_y/2) * nb_bends, xyzScale - base_layer_height ); + Eigen::Vector3d modelPosition(-0.8, (initial_90_bend_y/2) * nb_bends, xyzScale - base_layer_height ); bend_90_positions.push_back(modelPosition); nb_bends++; } @@ -529,8 +529,8 @@ struct ExtrusionSettings {// think a struct is better instead of all the maps ? if(nb_bends == 1 && extrusion_role != "Verify") {//only load once. this onyl determines when the borders get loaded, keeping at top of list makes it easier to scroll down to. it can't be '0' since it needs the numbers positions! - double offset_y = 2 * thickness_offset * 2; - double offset_x = 2; + const double extra_size_y = xy_scaled_90_bend_y / 4; + const double extra_size_x = xy_scaled_number_x; const double magical_transformation_x_pos = 20.6;//what is this, and how is this calculated ? >:( const double magical_transformation_y_pos = 10.47;//load a model without moving its pos to find see what it is.the number doesn't seem to change regardless of layer heights/nozzle size @@ -542,40 +542,44 @@ struct ExtrusionSettings {// think a struct is better instead of all the maps ? Eigen::Vector3d number_pos_mid = number_positions[3]; Eigen::Vector3d number_pos_last = number_positions[6]; double numbers_total_width = (number_pos_last.x() + (xy_scaled_number_x / 2)) - (number_pos_first.x() - (xy_scaled_number_x / 2)); - //double scaled_border_x = numbers_total_width + xy_scaled_number_x; - double scaled_border_x_percentage = ((numbers_total_width + xy_scaled_number_x) / initial_border_x) * 100; - double left_border_pos_x = (-xy_scaled_90_bend_x / 2) + (xy_scaled_x / 2); - double total_height = bend_pos_first.y() + bend_pos_last.y() + xy_scaled_y; + double scaled_r_border_x_percentage = ((numbers_total_width + extra_size_x) / initial_border_x) * 100; + double scaled_r_border_x_mm = (scaled_r_border_x_percentage / 100) * initial_border_x; + double scaled_tb_border_x = scaled_r_border_x_mm + xy_scaled_90_bend_x; + double scaled_tb_border_x_percentage = ((scaled_tb_border_x /* + extra_size_x*/) / initial_border_x) * 100; + + + double total_height = (bend_pos_last.y() + (xy_scaled_90_bend_y / 2)) - (bend_pos_first.y() - (xy_scaled_90_bend_y / 2)); + double scaled_border_y_percentage = ((total_height + extra_size_y) / initial_90_bend_y) * 100; + double border_scaled_y = (initial_border_x*(xy_scaled_x * 1.5)) / initial_90_bend_y;//need to fix for larger nozzle sizes. - double scaled_border_y = ((total_height / initial_90_bend_y) *100) + offset_y; - double right_pos_border_x = number_pos_mid.x(); - double scaled_y = (initial_border_x*(xy_scaled_x * 1.5)) / initial_90_bend_y; - double right_border_scaled_x = (xy_scaled_90_bend_x / initial_border_x) * 100 + (xy_scaled_x * 2) ; - double bottom_border_pos_x = (initial_border_x * right_border_scaled_x * 0.01) / 2 -0.8; + double right_border_pos_x = number_pos_mid.x(); + double top_border_x_pos = ((number_pos_last.x() + (xy_scaled_number_x / 2)) + (bend_pos_first.x() - (xy_scaled_90_bend_x / 2))) / 2; + double left_border_pos_x = bend_pos_first.x() - (xy_scaled_90_bend_x / 2); //---------- add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border.3mf").string(), - Vec3d{ left_border_pos_x + magical_transformation_x_pos, bend_pos_mid.y(), new_z_world_coords }, - /*scale*/Vec3d{ xy_scaled_x * 1.5, scaled_border_y*0.01, z_scale_factor }); // Left border + Vec3d{ left_border_pos_x + magical_transformation_x_pos, bend_pos_mid.y(), new_z_world_coords }, //need to fix to adjust for nozzle_diameter since it breaks bottom_solid_layers + /*scale*/Vec3d{ xy_scaled_x * 1.5, scaled_border_y_percentage*0.01, z_scale_factor }); // Left border //---------- add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border.3mf").string(), - Vec3d{ right_pos_border_x + magical_transformation_x_pos , bend_pos_mid.y(), new_z_world_coords }, - /*scale*/Vec3d{ scaled_border_x_percentage*0.01 , scaled_border_y*0.01 , z_scale_factor });// right border + Vec3d{ right_border_pos_x + magical_transformation_x_pos , bend_pos_mid.y(), new_z_world_coords }, + /*scale*/Vec3d{ scaled_r_border_x_percentage*0.01 , scaled_border_y_percentage*0.01 , z_scale_factor });// right border bool enable_top_bottom = true; if(enable_top_bottom == true){//remove later - //---------- - add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border.3mf").string(), - Vec3d{ bottom_border_pos_x + magical_transformation_x_pos , bend_pos_first.y() - (xy_scaled_y /1.8), new_z_world_coords }, - /*scale*/Vec3d{ (right_border_scaled_x*2)*0.01, scaled_y, z_scale_factor });//bottom border - //---------- - add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border.3mf").string(), - Vec3d{ bottom_border_pos_x + magical_transformation_x_pos , bend_pos_last.y() + (xy_scaled_y /1.8) , new_z_world_coords }, - /*scale*/Vec3d{ (right_border_scaled_x*2)*0.01, scaled_y, z_scale_factor });//top border - } + //---------- + add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border.3mf").string(), + Vec3d{ top_border_x_pos + magical_transformation_x_pos , bend_pos_first.y() - (xy_scaled_90_bend_y /1.8), new_z_world_coords }, //need to fix to adjust for nozzle_diameter since it breaks bottom_solid_layers + /*scale*/Vec3d{ scaled_tb_border_x_percentage*0.01, border_scaled_y, z_scale_factor });//bottom border + //---------- + add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border.3mf").string(), + Vec3d{ top_border_x_pos + magical_transformation_x_pos , bend_pos_last.y() + (xy_scaled_90_bend_y /1.8) , new_z_world_coords }, //need to fix to adjust for nozzle_diameter since it breaks bottom_solid_layers + /*scale*/Vec3d{ scaled_tb_border_x_percentage*0.01, border_scaled_y, z_scale_factor });//top border + } + // position in printer coords are half of scaled size! // scale model in percentage from original models xy values! //---------- @@ -594,7 +598,7 @@ struct ExtrusionSettings {// think a struct is better instead of all the maps ? const double magical_transformation_num_y_pos = 2.06;// -2.03 const double magical_transformation_z_pos = 0.12;//0.1 is the transformation value, but set slightly higher so numbers would be "inside" right border this might be dependant on z_scale_factor - double bend_90_y = bend_90_pos.y() + magical_transformation_y_pos + (xy_scaled_y/2); + double bend_90_y = bend_90_pos.y() + magical_transformation_y_pos + (xy_scaled_90_bend_y/2); double bend_90_x = bend_90_pos.x() + magical_transformation_num_x_pos; double xpos_initial = bend_90_x + (xy_scaled_90_bend_x/2) - xy_scaled_number_x + nozzle_diameter; double ypos_inital = bend_90_y /*+ (xy_scaled_number_y/2)*/; @@ -646,6 +650,7 @@ struct ExtrusionSettings {// think a struct is better instead of all the maps ? /// --- main config, modify object config when possible --- DynamicPrintConfig new_print_config = *print_config; + DynamicPrintConfig new_printer_config = *printer_config; new_print_config.set_key_value("complete_objects", new ConfigOptionBool(false)); //true is required for multi tests on single plate. new_print_config.set_key_value("gap_fill_enabled", new ConfigOptionBool(true)); //should be false?, enabled for testing new_print_config.set_key_value("top_solid_layers", new ConfigOptionInt(0)); //BUG: top layers set to 0 the top layer has a "void" where the top layer would normally be, this might be a config thing that needs to get changed or a slicing bug @@ -658,6 +663,7 @@ struct ExtrusionSettings {// think a struct is better instead of all the maps ? new_print_config.set_key_value("perimeter_overlap", new ConfigOptionPercent(100)); new_print_config.set_key_value("external_perimeter_overlap", new ConfigOptionPercent(100)); new_print_config.set_key_value("per_objects_gcode", new ConfigOptionString(bend_90_nozzle_size_3mf+","));// this is the model other parts in code will search for and insert the PA/ect numbers + new_printer_config.set_key_value("before_layer_gcode", new ConfigOptionString("{if layer_num == 0} SET_PRESSURE_ADVANCE ADVANCE=" + std::to_string(first_pa) + " {endif}")); for (size_t i = 0; i < nb_runs; i++) { /* @@ -727,10 +733,10 @@ struct ExtrusionSettings {// think a struct is better instead of all the maps ? model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("external_perimeter_acceleration", new ConfigOptionFloatOrPercent(er_accel, false)); model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("gap_fill_acceleration", new ConfigOptionFloatOrPercent(er_accel, false)); if (extrusion_role == "Verify") { - model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("per_objects_gcode", new ConfigOptionString(set_advance_prefix + "\n; " + er_role ));//user manual type in values + model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("per_objects_gcode", new ConfigOptionString(set_advance_prefix + " ; " + er_role ));//user manual type in values } - else{ - model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("per_objects_gcode", new ConfigOptionString(set_advance_prefix + std::to_string(pa_values[num_part]) + "\n; " + extrusion_role )); + else{//add '\n' in? + model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("per_objects_gcode", new ConfigOptionString(set_advance_prefix + std::to_string(pa_values[num_part]) + " ; " + extrusion_role )); } num_part++; } @@ -739,11 +745,11 @@ struct ExtrusionSettings {// think a struct is better instead of all the maps ? //update plater this->gui_app->get_tab(Preset::TYPE_FFF_PRINT)->load_config(new_print_config); plat->on_config_change(new_print_config); - //this->gui_app->get_tab(Preset::TYPE_PRINTER)->load_config(new_printer_config); - //plat->on_config_change(new_printer_config); + this->gui_app->get_tab(Preset::TYPE_PRINTER)->load_config(new_printer_config); + plat->on_config_change(new_printer_config); plat->changed_objects(objs_idx); this->gui_app->get_tab(Preset::TYPE_FFF_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(); @@ -764,7 +770,7 @@ struct ExtrusionSettings {// think a struct is better instead of all the maps ? if (extrusion_role != "Verify") {//don't auto slice so user can manual add PA values - plat->reslice(); //forces a slice of plater. + //plat->reslice(); //forces a slice of plater. } if (autocenter) { From abd6e68ba2c476d30b2156bcfab7df8c6710ea41 Mon Sep 17 00:00:00 2001 From: legend069 <40685552+legend069@users.noreply.github.com> Date: Thu, 13 Jun 2024 16:05:01 +1000 Subject: [PATCH 15/28] updated to 2.5.59.11 updated to 2.5.59.11 adjusted scale in z for the 90_bend models so print would be slightly quicker. found a couple new bugs with merge regarding the auto arrange everything else seems to be ok. --- src/libslic3r/GCodeWriter.hpp | 2 + .../GUI/CalibrationPressureAdvDialog.cpp | 109 +++++++++++------- 2 files changed, 72 insertions(+), 39 deletions(-) diff --git a/src/libslic3r/GCodeWriter.hpp b/src/libslic3r/GCodeWriter.hpp index ea555f9b086..e0fef5a132a 100644 --- a/src/libslic3r/GCodeWriter.hpp +++ b/src/libslic3r/GCodeWriter.hpp @@ -93,6 +93,8 @@ class GCodeWriter { std::vector m_extruders; std::vector m_millers; std::string m_extrusion_axis = "E"; + std::string m_current_per_object_gcode; + std::string m_last_per_object_gcode; bool m_single_extruder_multi_material = false; Tool* m_tool = nullptr; uint32_t m_last_acceleration = 0; diff --git a/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp b/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp index cf4c980a753..f1845f3619d 100644 --- a/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp +++ b/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp @@ -328,7 +328,6 @@ struct ExtrusionSettings {// think a struct is better instead of all the maps ? }// is there a limit of how many models SS can load ? might be good to set a failsafe just so it won't load 10k+ models... - bool has_to_arrange = false; Plater* plat = this->main_frame->plater(); Model& model = plat->model(); if (!plat->new_project(L("Pressure calibration"))) @@ -413,7 +412,7 @@ struct ExtrusionSettings {// think a struct is better instead of all the maps ? double xyzScale = nozzle_diameter / 0.4; double er_width_to_scale = magical_scaling(nozzle_diameter,er_width,filament_max_overlap,spacing_ratio,spacing_ratio_external,base_layer_height,er_spacing); //-- magical scaling - std::vector < std::vector> pressure_tower; + //std::vector < std::vector> pressure_tower; std::string nozzle_diameter_str = std::to_string(nozzle_diameter); nozzle_diameter_str.erase(nozzle_diameter_str.find_last_not_of('0') + 2, std::string::npos); @@ -435,7 +434,7 @@ struct ExtrusionSettings {// think a struct is better instead of all the maps ? for (size_t id_item = 0; id_item < nb_runs; id_item++) { - pressure_tower.emplace_back(); + //pressure_tower.emplace_back(); double initial_model_height = 0.2; double initial_90_bend_x = 41.20;//fusion=41.200 mm @@ -455,7 +454,8 @@ struct ExtrusionSettings {// think a struct is better instead of all the maps ? double thickness_offset = nozzle_diameter * er_width_to_scale * 2; - double z_scale_90_bend = xyzScale * 1.8 / initial_model_height; + //double z_scale_90_bend = xyzScale * 1.8 / initial_model_height; + double z_scale_90_bend = (xyzScale + first_layer_height) / initial_model_height; double z_scale_factor = 0.0; double new_z_world_coords = first_layer_height / 2.0 -base_layer_height; @@ -486,11 +486,11 @@ struct ExtrusionSettings {// think a struct is better instead of all the maps ? er_width_to_scale = magical_scaling(nozzle_diameter, er_width, filament_max_overlap, spacing_ratio, spacing_ratio_external, base_layer_height, er_spacing); thickness_offset = nozzle_diameter * er_width_to_scale * 2; - pressure_tower.back().push_back(add_part(model.objects[objs_idx[id_item]], + add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "scaled_with_nozzle_size" / bend_90_nozzle_size_3mf).string(), - Vec3d{ -0.8, (initial_90_bend_y/2) * nb_bends , xyzScale - base_layer_height }, Vec3d{ er_width_to_scale, er_width_to_scale, z_scale_90_bend })); + Vec3d{ -0.8, (initial_90_bend_y/2) * nb_bends , (z_scale_factor/2) }, Vec3d{ er_width_to_scale, er_width_to_scale, z_scale_90_bend }); - Eigen::Vector3d modelPosition(-0.8, (initial_90_bend_y/2) * nb_bends, xyzScale - base_layer_height ); + Eigen::Vector3d modelPosition(-0.8, (initial_90_bend_y/2) * nb_bends, (z_scale_factor/2) ); bend_90_positions.push_back(modelPosition); nb_bends++; } @@ -500,11 +500,11 @@ struct ExtrusionSettings {// think a struct is better instead of all the maps ? er_width_to_scale = magical_scaling(nozzle_diameter, er_width, filament_max_overlap, spacing_ratio, spacing_ratio_external, base_layer_height, er_spacing); thickness_offset = nozzle_diameter * er_width_to_scale * 2; - pressure_tower.back().push_back(add_part(model.objects[objs_idx[id_item]], + add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "scaled_with_nozzle_size" / bend_90_nozzle_size_3mf).string(), - Vec3d{ -0.8, (initial_90_bend_y/2) * nb_bends , xyzScale - base_layer_height }, Vec3d{ er_width_to_scale, er_width_to_scale, z_scale_90_bend })); + Vec3d{ -0.8, (initial_90_bend_y/2) * nb_bends , (z_scale_factor/2) }, Vec3d{ er_width_to_scale, er_width_to_scale, z_scale_90_bend }); - Eigen::Vector3d modelPosition(-0.8, (initial_90_bend_y/2) * nb_bends, xyzScale - base_layer_height ); + Eigen::Vector3d modelPosition(-0.8, (initial_90_bend_y/2) * nb_bends, (z_scale_factor/2) ); bend_90_positions.push_back(modelPosition); nb_bends++; @@ -516,11 +516,11 @@ struct ExtrusionSettings {// think a struct is better instead of all the maps ? for (int nb_bends = 0; nb_bends < countincrements; nb_bends++){ //const double magical_transformation_y_pos = 10.47; - pressure_tower.back().push_back(add_part(model.objects[objs_idx[id_item]], + add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "scaled_with_nozzle_size" / bend_90_nozzle_size_3mf).string(), - Vec3d{ -0.8, double(nb_bends) * (thickness_offset*2) *2 , xyzScale - base_layer_height }, Vec3d{ er_width_to_scale, er_width_to_scale, z_scale_90_bend })); + Vec3d{ -0.8, double(nb_bends) * (thickness_offset*2) *2 , (z_scale_factor/2) }, Vec3d{ er_width_to_scale, er_width_to_scale, z_scale_90_bend }); - Eigen::Vector3d modelPosition(-0.8, (double(nb_bends) * (thickness_offset*2) *2) , xyzScale - base_layer_height ); + Eigen::Vector3d modelPosition(-0.8, double(nb_bends) * (thickness_offset*2) *2 , (z_scale_factor/2) ); bend_90_positions.push_back(modelPosition); } } @@ -532,8 +532,9 @@ struct ExtrusionSettings {// think a struct is better instead of all the maps ? const double extra_size_y = xy_scaled_90_bend_y / 4; const double extra_size_x = xy_scaled_number_x; - const double magical_transformation_x_pos = 20.6;//what is this, and how is this calculated ? >:( - const double magical_transformation_y_pos = 10.47;//load a model without moving its pos to find see what it is.the number doesn't seem to change regardless of layer heights/nozzle size + const double magical_transformation_x_pos = 20.60; //what is this, and how is this calculated ? >:( + const double magical_transformation_y_pos = 10.47; //load a model without moving its pos to find see what it is.the number doesn't seem to change regardless of layer heights/nozzle size + const double magical_transformation_z_pos = 0.1; Eigen::Vector3d bend_pos_first = bend_90_positions[0]; Eigen::Vector3d bend_pos_mid = bend_90_positions[countincrements/2]; Eigen::Vector3d bend_pos_last = bend_90_positions[countincrements-1]; @@ -551,33 +552,33 @@ struct ExtrusionSettings {// think a struct is better instead of all the maps ? double total_height = (bend_pos_last.y() + (xy_scaled_90_bend_y / 2)) - (bend_pos_first.y() - (xy_scaled_90_bend_y / 2)); double scaled_border_y_percentage = ((total_height + extra_size_y) / initial_90_bend_y) * 100; - double border_scaled_y = (initial_border_x*(xy_scaled_x * 1.5)) / initial_90_bend_y;//need to fix for larger nozzle sizes. + double border_scaled_y = (initial_border_x*(xy_scaled_x * 1.5)) / initial_90_bend_y;//TODO: need to adjust scale for larger nozzle sizes - double right_border_pos_x = number_pos_mid.x(); + double right_border_x_pos = number_pos_mid.x(); double top_border_x_pos = ((number_pos_last.x() + (xy_scaled_number_x / 2)) + (bend_pos_first.x() - (xy_scaled_90_bend_x / 2))) / 2; - double left_border_pos_x = bend_pos_first.x() - (xy_scaled_90_bend_x / 2); + double left_border_x_pos = bend_pos_first.x() - (xy_scaled_90_bend_x / 2); //---------- add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border.3mf").string(), - Vec3d{ left_border_pos_x + magical_transformation_x_pos, bend_pos_mid.y(), new_z_world_coords }, //need to fix to adjust for nozzle_diameter since it breaks bottom_solid_layers + Vec3d{ left_border_x_pos + magical_transformation_x_pos, bend_pos_mid.y(), new_z_world_coords - magical_transformation_z_pos }, //need to fix to adjust for nozzle_diameter since it breaks bottom_solid_layers /*scale*/Vec3d{ xy_scaled_x * 1.5, scaled_border_y_percentage*0.01, z_scale_factor }); // Left border //---------- add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border.3mf").string(), - Vec3d{ right_border_pos_x + magical_transformation_x_pos , bend_pos_mid.y(), new_z_world_coords }, - /*scale*/Vec3d{ scaled_r_border_x_percentage*0.01 , scaled_border_y_percentage*0.01 , z_scale_factor });// right border + Vec3d{ right_border_x_pos + magical_transformation_x_pos , bend_pos_mid.y(), new_z_world_coords - magical_transformation_z_pos }, + /*scale*/Vec3d{ scaled_r_border_x_percentage*0.01 , scaled_border_y_percentage*0.01 , z_scale_factor});// right border bool enable_top_bottom = true; if(enable_top_bottom == true){//remove later //---------- add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border.3mf").string(), - Vec3d{ top_border_x_pos + magical_transformation_x_pos , bend_pos_first.y() - (xy_scaled_90_bend_y /1.8), new_z_world_coords }, //need to fix to adjust for nozzle_diameter since it breaks bottom_solid_layers + Vec3d{ top_border_x_pos + magical_transformation_x_pos , bend_pos_first.y() - (xy_scaled_90_bend_y /1.8), new_z_world_coords - magical_transformation_z_pos }, //need to fix to adjust for nozzle_diameter since it breaks bottom_solid_layers /*scale*/Vec3d{ scaled_tb_border_x_percentage*0.01, border_scaled_y, z_scale_factor });//bottom border //---------- add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border.3mf").string(), - Vec3d{ top_border_x_pos + magical_transformation_x_pos , bend_pos_last.y() + (xy_scaled_90_bend_y /1.8) , new_z_world_coords }, //need to fix to adjust for nozzle_diameter since it breaks bottom_solid_layers - /*scale*/Vec3d{ scaled_tb_border_x_percentage*0.01, border_scaled_y, z_scale_factor });//top border + Vec3d{ top_border_x_pos + magical_transformation_x_pos , bend_pos_last.y() + (xy_scaled_90_bend_y /1.8) , new_z_world_coords - magical_transformation_z_pos }, //need to fix to adjust for nozzle_diameter since it breaks bottom_solid_layers + /*scale*/Vec3d{ scaled_tb_border_x_percentage*0.01, border_scaled_y, z_scale_factor});//top border } // position in printer coords are half of scaled size! @@ -617,7 +618,7 @@ struct ExtrusionSettings {// think a struct is better instead of all the maps ? if (pa_values_string[j] == '.') { add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "point.3mf").string(), - Vec3d{ xpos + xy_scaled_number_x + nozzle_diameter , ypos_point, z_scaled_model_height - magical_transformation_z_pos }, Vec3d{ xyzScale * er_width_to_scale, xyzScale+(xyzScale/2), z_scale_factor }); + Vec3d{ xpos + xy_scaled_number_x + nozzle_diameter , ypos_point, z_scaled_model_height - magical_transformation_z_pos }, Vec3d{ xyzScale * er_width_to_scale, xyzScale+(xyzScale/2), z_scale_factor*2 }); Eigen::Vector3d modelPosition(xpos + xy_scaled_number_x + nozzle_diameter + magical_transformation_num_x_pos, ypos_point, z_scaled_model_height - magical_transformation_z_pos ); number_positions.push_back(modelPosition); @@ -626,11 +627,11 @@ struct ExtrusionSettings {// think a struct is better instead of all the maps ? else if (std::isdigit(pa_values_string[j])) { add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / numered3mfpath).string(), - Vec3d{ xpos + xy_scaled_number_x + nozzle_diameter, ypos, z_scaled_model_height - magical_transformation_z_pos }, Vec3d{ xyzScale * er_width_to_scale, xyzScale * er_width_to_scale, z_scale_factor }); + Vec3d{ xpos + xy_scaled_number_x + nozzle_diameter /* +magical_transformation_num_x_pos */, ypos, z_scaled_model_height - magical_transformation_z_pos }, Vec3d{ xyzScale * er_width_to_scale, xyzScale * er_width_to_scale, z_scale_factor*2 }); Eigen::Vector3d modelPosition(xpos + xy_scaled_number_x + nozzle_diameter + magical_transformation_num_x_pos, ypos, z_scaled_model_height - magical_transformation_z_pos ); number_positions.push_back(modelPosition); - xpos = xpos + xy_scaled_number_x + nozzle_diameter; + xpos = xpos + xy_scaled_number_x + nozzle_diameter /* +magical_transformation_num_x_pos */; } } } @@ -640,7 +641,14 @@ struct ExtrusionSettings {// think a struct is better instead of all the maps ? /// --- translate --- //bool autocenter = gui_app->app_config->get("autocenter") == "1"; - has_to_arrange = true; + bool has_to_arrange = plat->config()->opt_float("init_z_rotate") != 0; + if (nb_runs == 1) { + //model.objects[objs_idx[0]]->translate({ bed_min.x() + bed_size.x() / 2, bed_min.y() + bed_size.y() / 2, zscale_number }); + has_to_arrange = true; + } else { + has_to_arrange = true; + } + /*if (!autocenter) { const ConfigOptionPoints* bed_shape = printer_config->option("bed_shape"); Vec2d bed_size = BoundingBoxf(bed_shape->values).size(); @@ -651,6 +659,7 @@ struct ExtrusionSettings {// think a struct is better instead of all the maps ? /// --- main config, modify object config when possible --- DynamicPrintConfig new_print_config = *print_config; DynamicPrintConfig new_printer_config = *printer_config; + new_print_config.set_key_value("brim_width", new ConfigOptionFloat(0)); new_print_config.set_key_value("complete_objects", new ConfigOptionBool(false)); //true is required for multi tests on single plate. new_print_config.set_key_value("gap_fill_enabled", new ConfigOptionBool(true)); //should be false?, enabled for testing new_print_config.set_key_value("top_solid_layers", new ConfigOptionInt(0)); //BUG: top layers set to 0 the top layer has a "void" where the top layer would normally be, this might be a config thing that needs to get changed or a slicing bug @@ -658,12 +667,16 @@ struct ExtrusionSettings {// think a struct is better instead of all the maps ? new_print_config.set_key_value("fill_density", new ConfigOptionPercent(0)); new_print_config.set_key_value("min_width_top_surface", new ConfigOptionFloatOrPercent(0.0,false)); new_print_config.set_key_value("bottom_fill_pattern", new ConfigOptionEnum(ipMonotonicWGapFill)); - new_print_config.set_key_value("seam_position", new ConfigOptionEnum(spRear));//BUG: should be fixed in 2.7 merge/SS 2.5.59.7, when this is changed the "perimeters & shell" doesn't turn red indicating a change. + new_print_config.set_key_value("seam_position", new ConfigOptionEnum(spRear)); //BUG: should be fixed in 2.7 merge/SS 2.5.59.7, when this is changed the "perimeters & shell" doesn't turn red indicating a change. new_print_config.set_key_value("avoid_crossing_perimeters", new ConfigOptionBool(false)); new_print_config.set_key_value("perimeter_overlap", new ConfigOptionPercent(100)); new_print_config.set_key_value("external_perimeter_overlap", new ConfigOptionPercent(100)); - new_print_config.set_key_value("per_objects_gcode", new ConfigOptionString(bend_90_nozzle_size_3mf+","));// this is the model other parts in code will search for and insert the PA/ect numbers - new_printer_config.set_key_value("before_layer_gcode", new ConfigOptionString("{if layer_num == 0} SET_PRESSURE_ADVANCE ADVANCE=" + std::to_string(first_pa) + " {endif}")); + new_print_config.set_key_value("per_objects_gcode", new ConfigOptionString(bend_90_nozzle_size_3mf+",")); // this is the model other parts in code will search for and insert the PA/ect numbers + + new_printer_config.set_key_value("before_layer_gcode", new ConfigOptionString("{if layer_num == 0} SET_PRESSURE_ADVANCE ADVANCE=" + std::to_string(first_pa) + " {endif}")); //maybe i can save the existing value into a variable then add to it ? + + assert(filament_temp_item_name.size() == nb_runs); + assert(model.objects.size() == nb_runs); for (size_t i = 0; i < nb_runs; i++) { /* @@ -682,9 +695,12 @@ struct ExtrusionSettings {// think a struct is better instead of all the maps ? gcfSmoothie, gcfNoExtrusion*/ - size_t num_part = 0; - const int extra_vol = 1; - for (ModelObject* part : pressure_tower[i]) {//loop though each part/volume and assign the modifers + //size_t num_part = 0; + //const int extra_vol = 1; + //for (ModelObject* part : pressure_tower[i]) {//loop though each part/volume and assign the modifers + + ModelObject *current_obj = model.objects[objs_idx[i]]; + for (int num_part = 1; num_part < countincrements+1; num_part++){ std::string er_role =""; if (extrusion_role == "Verify") { @@ -723,22 +739,35 @@ struct ExtrusionSettings {// think a struct is better instead of all the maps ? er_accel = (er_accel == 0) ? default_er_accel : er_accel; /// --- custom config --- // this is for forcing each model to have x print modifiers + //current_obj->volumes[num_part]->config.set_key_value("print_retract_length", new ConfigOptionFloat(retraction_start + num_part * retraction_steps)); + current_obj->volumes[num_part]->config.set_key_value("perimeter_extrusion_width", new ConfigOptionFloatOrPercent(er_width, true)); - model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("perimeter_extrusion_width", new ConfigOptionFloatOrPercent(er_width, true)); + /*model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("perimeter_extrusion_width", new ConfigOptionFloatOrPercent(er_width, true)); model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("external_perimeter_extrusion_width", new ConfigOptionFloatOrPercent(er_width, true));//TODO: check widths and ect breaks if any values are in mm/percentage model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("perimeter_speed", new ConfigOptionFloatOrPercent(er_speed, false)); model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("external_perimeter_speed", new ConfigOptionFloatOrPercent(er_speed, false)); model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("gap_fill_speed", new ConfigOptionFloatOrPercent(er_speed, false)); model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("perimeter_acceleration", new ConfigOptionFloatOrPercent(er_accel, false)); model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("external_perimeter_acceleration", new ConfigOptionFloatOrPercent(er_accel, false)); - model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("gap_fill_acceleration", new ConfigOptionFloatOrPercent(er_accel, false)); + model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("gap_fill_acceleration", new ConfigOptionFloatOrPercent(er_accel, false));*/ + + current_obj->volumes[num_part]->config.set_key_value("perimeter_extrusion_width", new ConfigOptionFloatOrPercent(er_width, true)); + current_obj->volumes[num_part]->config.set_key_value("external_perimeter_extrusion_width", new ConfigOptionFloatOrPercent(er_width, true));//TODO: check widths and ect breaks if any values are in mm/percentage + current_obj->volumes[num_part]->config.set_key_value("perimeter_speed", new ConfigOptionFloatOrPercent(er_speed, false)); + current_obj->volumes[num_part]->config.set_key_value("external_perimeter_speed", new ConfigOptionFloatOrPercent(er_speed, false)); + current_obj->volumes[num_part]->config.set_key_value("gap_fill_speed", new ConfigOptionFloatOrPercent(er_speed, false)); + current_obj->volumes[num_part]->config.set_key_value("perimeter_acceleration", new ConfigOptionFloatOrPercent(er_accel, false)); + current_obj->volumes[num_part]->config.set_key_value("external_perimeter_acceleration", new ConfigOptionFloatOrPercent(er_accel, false)); + current_obj->volumes[num_part]->config.set_key_value("gap_fill_acceleration", new ConfigOptionFloatOrPercent(er_accel, false)); + if (extrusion_role == "Verify") { - model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("per_objects_gcode", new ConfigOptionString(set_advance_prefix + " ; " + er_role ));//user manual type in values + //model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("per_objects_gcode", new ConfigOptionString(set_advance_prefix + " ; " + er_role ));//user manual type in values + current_obj->volumes[num_part]->config.set_key_value("per_objects_gcode", new ConfigOptionString(set_advance_prefix + " ; " + er_role ));//user manual type in values } else{//add '\n' in? - model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("per_objects_gcode", new ConfigOptionString(set_advance_prefix + std::to_string(pa_values[num_part]) + " ; " + extrusion_role )); + //model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("per_objects_gcode", new ConfigOptionString(set_advance_prefix + std::to_string(pa_values[num_part]) + " ; " + extrusion_role )); + current_obj->volumes[num_part]->config.set_key_value("per_objects_gcode", new ConfigOptionString(set_advance_prefix + std::to_string(pa_values[num_part]) + " ; " + extrusion_role )); } - num_part++; } } @@ -757,6 +786,8 @@ struct ExtrusionSettings {// think a struct is better instead of all the maps ? // arrange if needed, after new settings, to take them into account + // BUG:(borders don't slice. with 2+ generated models.) after updating to 2.5.59.11 the generating 2+ models they have "sinking label" have to click "drop to bed" to resolve, clicking "arrange" doesn't fix issue. + // BUG: disovered manually moving the model in z lettting it drop down, then trying to slice can make it crash - (exception thrown 3073 - gcode.cpp) if (has_to_arrange) { //update print config (done at reslice but we need it here) if (plat->printer_technology() == ptFFF) From fd29e2afa916d16322ca222f9931a1bc0fc8415d Mon Sep 17 00:00:00 2001 From: supermerill Date: Wed, 12 Jun 2024 16:38:15 +0200 Subject: [PATCH 16/28] new hidden setting: object_gcode allow to write some gcode each layer, when an object began to print. Useful for calibrations. --- src/libslic3r/Fill/Fill.cpp | 2 +- src/libslic3r/GCode.cpp | 23 +++++++++++++++++++++-- src/libslic3r/Preset.cpp | 4 ++-- src/libslic3r/PrintConfig.cpp | 15 ++++++++++++++- src/libslic3r/PrintConfig.hpp | 1 + src/libslic3r/PrintObject.cpp | 1 + 6 files changed, 40 insertions(+), 6 deletions(-) diff --git a/src/libslic3r/Fill/Fill.cpp b/src/libslic3r/Fill/Fill.cpp index 0a162304c2b..ffce886b93e 100644 --- a/src/libslic3r/Fill/Fill.cpp +++ b/src/libslic3r/Fill/Fill.cpp @@ -57,6 +57,7 @@ struct SurfaceFillParams : FillParams RETURN_COMPARE_NON_EQUAL(can_angle_cross); RETURN_COMPARE_NON_EQUAL(density); RETURN_COMPARE_NON_EQUAL(monotonic); + RETURN_COMPARE_NON_EQUAL(max_sparse_infill_spacing); RETURN_COMPARE_NON_EQUAL_TYPED(unsigned, connection); RETURN_COMPARE_NON_EQUAL_TYPED(unsigned, dont_adjust); @@ -79,7 +80,6 @@ struct SurfaceFillParams : FillParams RETURN_COMPARE_NON_EQUAL(config->bridge_speed_internal); RETURN_COMPARE_NON_EQUAL(config->gap_fill_speed); RETURN_COMPARE_NON_EQUAL(config->print_extrusion_multiplier); - RETURN_COMPARE_NON_EQUAL(max_sparse_infill_spacing); } if (config == nullptr || rhs.config == nullptr || max_sparse_infill_spacing == 0) RETURN_COMPARE_NON_EQUAL(flow.width()); diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index f5c8ec7fdf2..b424f49d94a 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -907,6 +907,16 @@ namespace DoExport { break; } } + if (ret.size() < MAX_TAGS_COUNT) { + std::set per_object_gcodes; + for (const PrintObject *obj : print.objects()) + per_object_gcodes.insert(obj->config().object_gcode.value); + for (const std::string &gcode : per_object_gcodes) { + check(_(L("Per object G-code")), gcode); + if (ret.size() == MAX_TAGS_COUNT) + break; + } + } return ret; } @@ -3525,8 +3535,9 @@ LayerResult GCode::process_layer( if (m_config.avoid_crossing_perimeters) m_avoid_crossing_perimeters.init_layer(*m_layer); //print object label to help the printer firmware know where it is (for removing the objects) + m_gcode_label_objects_start = ""; if (this->config().gcode_label_objects) { - m_gcode_label_objects_start = + m_gcode_label_objects_start += std::string("; printing object ") + instance_to_print.print_object.model_object()->name + " id:" + instance_id + " copy " + instance_copy + @@ -3559,6 +3570,14 @@ LayerResult GCode::process_layer( "\n"; } } + if (!instance_to_print.print_object.config().object_gcode.value.empty()) { + DynamicConfig config; + config.set_key_value("layer_num", new ConfigOptionInt(m_layer_index)); + config.set_key_value("layer_z", new ConfigOptionFloat(print_z)); + m_gcode_label_objects_start += this->placeholder_parser_process("object_gcode", + instance_to_print.print_object.config().object_gcode.value, m_writer.tool()->id(), &config) + + "\n"; + } // ask for a bigger lift for travel to object when moving to another object if (single_object_instance_idx == size_t(-1) && !first_object) set_extra_lift(m_last_layer_z, layer.id(), print.config(), m_writer, extruder_id); @@ -3636,7 +3655,7 @@ LayerResult GCode::process_layer( } } // Don't set m_gcode_label_objects_end if you don't had to write the m_gcode_label_objects_start. - if (m_gcode_label_objects_start != "") { + if (!m_gcode_label_objects_start.empty()) { m_gcode_label_objects_start = ""; } else if (this->config().gcode_label_objects) { m_gcode_label_objects_end = std::string("; stop printing object ") + instance_to_print.print_object.model_object()->name diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 69cd3d50ba0..21b491ba862 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -632,8 +632,8 @@ static std::vector s_Preset_print_options { "extruder_clearance_height", "gcode_comments", "gcode_label_objects", "output_filename_format", "post_process", "perimeter_extruder", "gcode_substitutions", "infill_extruder", "solid_infill_extruder", "support_material_extruder", "support_material_interface_extruder", - "ooze_prevention", "standby_temperature_delta", "interface_shells", - "per_objects_gcode", + "ooze_prevention", "standby_temperature_delta", "interface_shells", + "object_gcode", // width & spacing "extrusion_spacing", "extrusion_width", diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index f40c56415d5..c98416acb59 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -2777,7 +2777,7 @@ void PrintConfigDef::init_fff_params() def = this->add("gap_fill_flow_match_perimeter", coPercent); def->label = L("Cap with perimeter flow"); def->full_label = L("Gapfill: cap speed with perimeter flow"); - def->category = OptionCategory::output; + def->category = OptionCategory::speed; def->tooltip = L("A percentage of the perimeter flow (mm3/s) is used as a limit for the gap fill flow, and so the gapfill may reduce its speed when the gap fill extrusions became too thick." " This allow you to use a high gapfill speed, to print the thin gapfill quickly and reduce the difference in flow rate for the gapfill." "\nSet zero to deactivate."); @@ -3913,6 +3913,18 @@ void PrintConfigDef::init_fff_params() def->mode = comAdvancedE | comSuSi; def->set_default_value(new ConfigOptionString{ "" }); + def = this->add("object_gcode", coString); + def->label = L("Per object G-code"); + def->category = OptionCategory::advanced; + def->tooltip = L("This code is inserted each layer, when the object began to print (just after the label if any)." + " It's main advantage is when you use it as a object modifer (right click on a model)." + "\nSpecial variables: 'layer_num','layer_z'"); + def->multiline = true; + def->full_width = true; + def->height = 10; + def->mode = comExpert | comSuSi; + def->set_default_value(new ConfigOptionString("")); + def = this->add("only_one_perimeter_first_layer", coBool); def->label = L("Only one perimeter on First layer"); def->category = OptionCategory::perimeter; @@ -8211,6 +8223,7 @@ std::unordered_set prusa_export_to_remove_keys = { "min_width_top_surface", "model_precision", "no_perimeter_unsupported_algo", +"object_gcode", "only_one_perimeter_top_other_algo", "only_one_perimeter_top", "only_one_perimeter_first_layer", diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index c4f9f7e085e..fe2a229912c 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -718,6 +718,7 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionFloatOrPercent, brim_speed)) //((ConfigOptionEnum, brim_type)) ((ConfigOptionBool, clip_multipart_objects)) + ((ConfigOptionString, object_gcode)) ((ConfigOptionBool, dont_support_bridges)) ((ConfigOptionPercent, external_perimeter_cut_corners)) //((ConfigOptionBool, exact_last_layer_height)) diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index 18d68c51f4a..b0145547ae0 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -1092,6 +1092,7 @@ bool PrintObject::invalidate_state_by_config_options( || opt_key == "external_perimeters_vase" || opt_key == "gap_fill_speed" || opt_key == "infill_speed" + || opt_key == "object_gcode" || opt_key == "overhangs_speed" || opt_key == "perimeter_speed" || opt_key == "seam_position" From 3a083af3becf83960b826f43642411539288c22a Mon Sep 17 00:00:00 2001 From: supermerill Date: Wed, 12 Jun 2024 17:27:34 +0200 Subject: [PATCH 17/28] new hidden setting: region_gcode allow to write some gcode each time a region start to print something (perimeter, infill, ironing). Useful for calibrations. --- src/libslic3r/Fill/Fill.cpp | 1 + src/libslic3r/GCode.cpp | 65 ++++++++++++++++++++--------------- src/libslic3r/GCode.hpp | 1 + src/libslic3r/Layer.cpp | 1 + src/libslic3r/Preset.cpp | 1 + src/libslic3r/PrintConfig.cpp | 13 +++++++ src/libslic3r/PrintConfig.hpp | 1 + src/libslic3r/PrintObject.cpp | 1 + 8 files changed, 57 insertions(+), 27 deletions(-) diff --git a/src/libslic3r/Fill/Fill.cpp b/src/libslic3r/Fill/Fill.cpp index ffce886b93e..55e741c0982 100644 --- a/src/libslic3r/Fill/Fill.cpp +++ b/src/libslic3r/Fill/Fill.cpp @@ -80,6 +80,7 @@ struct SurfaceFillParams : FillParams RETURN_COMPARE_NON_EQUAL(config->bridge_speed_internal); RETURN_COMPARE_NON_EQUAL(config->gap_fill_speed); RETURN_COMPARE_NON_EQUAL(config->print_extrusion_multiplier); + RETURN_COMPARE_NON_EQUAL(config->region_gcode.value); } if (config == nullptr || rhs.config == nullptr || max_sparse_infill_spacing == 0) RETURN_COMPARE_NON_EQUAL(flow.width()); diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index b424f49d94a..e7f186ab9bf 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -5314,6 +5314,41 @@ std::string GCode::extrude_path_3D(const ExtrusionPath3D &path, const std::strin return gcode; } +// Apply region-specific settings +void GCode::apply_region_config(std::string &gcode) { + // modify our fullprintconfig with it. (works as all items avaialable in the regionconfig are present in this config, ie: it write everything region-defined) + m_config.apply(m_region->config()); + // pass our region config to the gcode writer + m_writer.apply_print_region_config(m_region->config()); + // perimeter-only (but won't break anything if done also in infill & ironing): pass needed settings to seam placer. + m_seam_placer.external_perimeters_first = m_region->config().external_perimeters_first.value; + // temperature override from region + if (m_config.print_temperature > 0) { + if (m_layer != nullptr && m_layer->bottom_z() < EPSILON && m_config.print_first_layer_temperature.value > 0) { + gcode += m_writer.set_temperature(m_config.print_first_layer_temperature.value, false, m_writer.tool()->id()); + } else { + gcode += m_writer.set_temperature(m_config.print_temperature.value, false, m_writer.tool()->id()); + } + } else if (m_layer != nullptr && m_layer->bottom_z() < EPSILON && m_config.first_layer_temperature.get_at(m_writer.tool()->id()) > 0) { + gcode += m_writer.set_temperature(m_config.first_layer_temperature.get_at(m_writer.tool()->id()), false, + m_writer.tool()->id()); + } else if (m_config.temperature.get_at(m_writer.tool()->id()) > 0) { // don't set it if disabled + gcode += m_writer.set_temperature(m_config.temperature.get_at(m_writer.tool()->id()), false, + m_writer.tool()->id()); + } + // apply region_gcode + if (!m_region->config().region_gcode.value.empty()) { + DynamicConfig config; + config.set_key_value("layer_num", new ConfigOptionInt(m_layer_index)); + config.set_key_value("layer_z", new ConfigOptionFloat(m_layer == nullptr ? m_last_height : m_layer->print_z)); + m_gcode_label_objects_start += this->placeholder_parser_process("region_gcode", + m_region->config().region_gcode.value, + m_writer.tool()->id(), &config) + + "\n"; + } + +} + // Extrude perimeters: Decide where to put seams (hide or align seams). std::string GCode::extrude_perimeters(const Print &print, const std::vector &by_region) { @@ -5323,17 +5358,7 @@ std::string GCode::extrude_perimeters(const Print &print, const std::vectorconfig()); - m_writer.apply_print_region_config(m_region->config()); - m_seam_placer.external_perimeters_first = m_region->config().external_perimeters_first.value; - if (m_config.print_temperature > 0) - gcode += m_writer.set_temperature(m_config.print_temperature.value, false, m_writer.tool()->id()); - else if (m_layer != nullptr && m_layer->bottom_z() < EPSILON && m_config.first_layer_temperature.get_at(m_writer.tool()->id()) > 0) - gcode += m_writer.set_temperature(m_config.first_layer_temperature.get_at(m_writer.tool()->id()), false, m_writer.tool()->id()); - else if (m_config.temperature.get_at(m_writer.tool()->id()) > 0) { // don't set it if disabled - gcode += m_writer.set_temperature(m_config.temperature.get_at(m_writer.tool()->id()), false, - m_writer.tool()->id()); - } + apply_region_config(gcode); ExtrusionEntitiesPtr extrusions{region.perimeters}; chain_and_reorder_extrusion_entities(extrusions, &m_last_pos); for (const ExtrusionEntity *ee : extrusions) { @@ -5352,14 +5377,7 @@ std::string GCode::extrude_infill(const Print& print, const std::vectorconfig().infill_first == is_infill_first)) { - m_config.apply(m_region->config()); - m_writer.apply_print_region_config(m_region->config()); - if (m_config.print_temperature > 0) - gcode += m_writer.set_temperature(m_config.print_temperature.value, false, m_writer.tool()->id()); - else if (m_layer != nullptr && m_layer->bottom_z() < EPSILON && m_config.first_layer_temperature.get_at(m_writer.tool()->id()) > 0) - gcode += m_writer.set_temperature(m_config.first_layer_temperature.get_at(m_writer.tool()->id()), false, m_writer.tool()->id()); - else if (m_config.temperature.get_at(m_writer.tool()->id()) > 0) // don't set it if disabled - gcode += m_writer.set_temperature(m_config.temperature.get_at(m_writer.tool()->id()), false, m_writer.tool()->id()); + apply_region_config(gcode); ExtrusionEntitiesPtr extrusions{ region.infills }; chain_and_reorder_extrusion_entities(extrusions, &m_last_pos); for (const ExtrusionEntity* fill : extrusions) { @@ -5378,14 +5396,7 @@ std::string GCode::extrude_ironing(const Print& print, const std::vectorconfig()); - m_writer.apply_print_region_config(m_region->config()); - if (m_config.print_temperature > 0) - gcode += m_writer.set_temperature(m_config.print_temperature.value, false, m_writer.tool()->id()); - else if (m_layer != nullptr && m_layer->bottom_z() < EPSILON && m_config.first_layer_temperature.get_at(m_writer.tool()->id()) > 0) - gcode += m_writer.set_temperature(m_config.first_layer_temperature.get_at(m_writer.tool()->id()), false, m_writer.tool()->id()); - else if (m_config.temperature.get_at(m_writer.tool()->id()) > 0) - gcode += m_writer.set_temperature(m_config.temperature.get_at(m_writer.tool()->id()), false, m_writer.tool()->id()); + apply_region_config(gcode); ExtrusionEntitiesPtr extrusions{ region.ironings }; chain_and_reorder_extrusion_entities(extrusions, &m_last_pos); for (const ExtrusionEntity* fill : extrusions) { diff --git a/src/libslic3r/GCode.hpp b/src/libslic3r/GCode.hpp index 607f6470db3..c135a1af780 100644 --- a/src/libslic3r/GCode.hpp +++ b/src/libslic3r/GCode.hpp @@ -390,6 +390,7 @@ class GCode : ExtrusionVisitorConst { // For sequential print, the instance of the object to be printing has to be defined. const size_t single_object_instance_idx); + void apply_region_config(std::string &gcode); std::string extrude_perimeters(const Print &print, const std::vector &by_region); std::string extrude_infill(const Print& print, const std::vector& by_region, bool is_infill_first); std::string extrude_ironing(const Print& print, const std::vector& by_region); diff --git a/src/libslic3r/Layer.cpp b/src/libslic3r/Layer.cpp index f15b7147927..15beed93da0 100644 --- a/src/libslic3r/Layer.cpp +++ b/src/libslic3r/Layer.cpp @@ -218,6 +218,7 @@ void Layer::make_perimeters() && config.thin_walls_speed == other_config.thin_walls_speed && config.infill_overlap == other_config.infill_overlap && config.perimeter_loop == other_config.perimeter_loop + && config.region_gcode == other_config.region_gcode && config.fuzzy_skin == other_config.fuzzy_skin && config.fuzzy_skin_thickness == other_config.fuzzy_skin_thickness diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 21b491ba862..f3bdc3e7a8b 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -634,6 +634,7 @@ static std::vector s_Preset_print_options { "infill_extruder", "solid_infill_extruder", "support_material_extruder", "support_material_interface_extruder", "ooze_prevention", "standby_temperature_delta", "interface_shells", "object_gcode", + "region_gcode", // width & spacing "extrusion_spacing", "extrusion_width", diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index c98416acb59..c9cca8d0934 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -4469,6 +4469,18 @@ void PrintConfigDef::init_fff_params() def->mode = comAdvancedE | comSuSi; def->set_default_value(new ConfigOptionFloatOrPercent(0, false)); + def = this->add("region_gcode", coString); + def->label = L("Per region G-code"); + def->category = OptionCategory::output; + def->tooltip = L("This code is inserted when a region is starting to print something (infill, perimeter, ironing)." + " It's main advantage is when you use it as a object modifer(right click on a model to add it there)" + "\nSpecial variables: 'layer_num','layer_z'"); + def->multiline = true; + def->full_width = true; + def->height = 10; + def->mode = comExpert | comSuSi; + def->set_default_value(new ConfigOptionString("")); + def = this->add("resolution", coFloat); def->label = L("Slice resolution"); def->category = OptionCategory::slicing; @@ -8254,6 +8266,7 @@ std::unordered_set prusa_export_to_remove_keys = { "printhost_client_cert_password", "raft_layer_height", "raft_interface_layer_height", +"region_gcode", "remaining_times_type", "resolution_internal", "retract_lift_first_layer", diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index fe2a229912c..4e0b1ddb05b 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -932,6 +932,7 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionPercent, print_extrusion_multiplier)) ((ConfigOptionFloat, print_retract_length)) ((ConfigOptionFloat, print_retract_lift)) + ((ConfigOptionString, region_gcode)) ((ConfigOptionFloatOrPercent, small_perimeter_speed)) ((ConfigOptionFloatOrPercent, small_perimeter_min_length)) ((ConfigOptionFloatOrPercent, small_perimeter_max_length)) diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index b0145547ae0..03afa5eaa88 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -1095,6 +1095,7 @@ bool PrintObject::invalidate_state_by_config_options( || opt_key == "object_gcode" || opt_key == "overhangs_speed" || opt_key == "perimeter_speed" + || opt_key == "region_gcode" || opt_key == "seam_position" || opt_key == "seam_preferred_direction" || opt_key == "seam_preferred_direction_jitter" From 2764258267602690642adc16d1f724869af2609c Mon Sep 17 00:00:00 2001 From: supermerill Date: Thu, 13 Jun 2024 10:47:49 +0200 Subject: [PATCH 18/28] Update to acceleration: move to object/region & cleaning alongside it. * fix all step invalidation incoherence * rename bridge_internal_* settings to internal_bridge (like orca) * reorder entries when they weren't sorted by alphanumeric order. --- src/libslic3r/Fill/Fill.cpp | 56 +++++--- src/libslic3r/Format/BBConfig.cpp | 2 +- src/libslic3r/GCode.cpp | 16 ++- src/libslic3r/GCode/CoolingBuffer.cpp | 4 +- src/libslic3r/Layer.cpp | 7 +- src/libslic3r/Preset.cpp | 6 +- src/libslic3r/Print.cpp | 87 ++++++------ src/libslic3r/Print.hpp | 2 + src/libslic3r/PrintConfig.cpp | 88 +++++++------ src/libslic3r/PrintConfig.hpp | 72 ++++------ src/libslic3r/PrintObject.cpp | 183 ++++++++++++++++---------- src/slic3r/GUI/ConfigManipulation.cpp | 2 +- src/slic3r/GUI/PresetHints.cpp | 8 +- 13 files changed, 295 insertions(+), 238 deletions(-) diff --git a/src/libslic3r/Fill/Fill.cpp b/src/libslic3r/Fill/Fill.cpp index 55e741c0982..aae9280632f 100644 --- a/src/libslic3r/Fill/Fill.cpp +++ b/src/libslic3r/Fill/Fill.cpp @@ -71,13 +71,19 @@ struct SurfaceFillParams : FillParams assert(this->config != nullptr); assert(rhs.config != nullptr); if (config != nullptr && rhs.config != nullptr) { + RETURN_COMPARE_NON_EQUAL(config->infill_acceleration); RETURN_COMPARE_NON_EQUAL(config->infill_speed); + RETURN_COMPARE_NON_EQUAL(config->solid_infill_acceleration); RETURN_COMPARE_NON_EQUAL(config->solid_infill_speed); + RETURN_COMPARE_NON_EQUAL(config->top_solid_infill_acceleration); RETURN_COMPARE_NON_EQUAL(config->top_solid_infill_speed); - RETURN_COMPARE_NON_EQUAL(config->ironing_speed); + RETURN_COMPARE_NON_EQUAL(config->default_acceleration); RETURN_COMPARE_NON_EQUAL(config->default_speed); + RETURN_COMPARE_NON_EQUAL(config->bridge_acceleration); RETURN_COMPARE_NON_EQUAL(config->bridge_speed); - RETURN_COMPARE_NON_EQUAL(config->bridge_speed_internal); + RETURN_COMPARE_NON_EQUAL(config->internal_bridge_acceleration); + RETURN_COMPARE_NON_EQUAL(config->internal_bridge_speed); + RETURN_COMPARE_NON_EQUAL(config->gap_fill_acceleration); RETURN_COMPARE_NON_EQUAL(config->gap_fill_speed); RETURN_COMPARE_NON_EQUAL(config->print_extrusion_multiplier); RETURN_COMPARE_NON_EQUAL(config->region_gcode.value); @@ -93,14 +99,23 @@ struct SurfaceFillParams : FillParams if ((config != nullptr) != (rhs.config != nullptr)) return false; if(config != nullptr && ( - config->infill_speed != rhs.config->infill_speed + config->infill_acceleration != rhs.config->infill_acceleration + || config->infill_speed != rhs.config->infill_speed + || config->solid_infill_acceleration != rhs.config->solid_infill_acceleration || config->solid_infill_speed != rhs.config->solid_infill_speed + || config->top_solid_infill_acceleration != rhs.config->top_solid_infill_acceleration || config->top_solid_infill_speed != rhs.config->top_solid_infill_speed - || config->ironing_speed != rhs.config->ironing_speed + || config->default_acceleration != rhs.config->default_acceleration || config->default_speed != rhs.config->default_speed + || config->bridge_acceleration != rhs.config->bridge_acceleration || config->bridge_speed != rhs.config->bridge_speed - || config->bridge_speed_internal != rhs.config->bridge_speed_internal - || config->gap_fill_speed != rhs.config->gap_fill_speed)) + || config->internal_bridge_acceleration != rhs.config->internal_bridge_acceleration + || config->internal_bridge_speed != rhs.config->internal_bridge_speed + || config->gap_fill_acceleration != rhs.config->gap_fill_acceleration + || config->gap_fill_speed != rhs.config->gap_fill_speed + || config->print_extrusion_multiplier != rhs.config->print_extrusion_multiplier + || config->region_gcode != rhs.config->region_gcode + )) return false; // then check params return this->extruder == rhs.extruder && @@ -766,6 +781,7 @@ void Layer::make_ironing() double line_spacing; // Height of the extrusion, to calculate the extrusion flow from. double height; + double acceleration; double speed; double angle; IroningType type; @@ -787,6 +803,10 @@ void Layer::make_ironing() return true; if (this->height > rhs.height) return false; + if (this->acceleration < rhs.acceleration) + return true; + if (this->acceleration > rhs.acceleration) + return false; if (this->speed < rhs.speed) return true; if (this->speed > rhs.speed) @@ -798,11 +818,12 @@ void Layer::make_ironing() return false; } - bool operator==(const IroningParams &rhs) const { + bool operator==(const IroningParams &rhs) const + { return this->extruder == rhs.extruder && this->just_infill == rhs.just_infill && - this->line_spacing == rhs.line_spacing && this->height == rhs.height && this->speed == rhs.speed && - this->angle == rhs.angle && - this->type == rhs.type; + this->line_spacing == rhs.line_spacing && this->height == rhs.height && + this->acceleration == rhs.acceleration && this->speed == rhs.speed && + this->angle == rhs.angle && this->type == rhs.type; } LayerRegion *layerm = nullptr; @@ -848,11 +869,16 @@ void Layer::make_ironing() ironing_params.type = config.ironing_type; ironing_params.just_infill = false; ironing_params.line_spacing = config.ironing_spacing; - ironing_params.height = default_layer_height * 0.01 * config.ironing_flowrate; - ironing_params.speed = config.ironing_speed; - ironing_params.angle = config.ironing_angle <0 ? - compute_fill_angle(config, layerm->layer()->id()) : - float(Geometry::deg2rad(config.ironing_angle.value)); + ironing_params.height = default_layer_height * 0.01 * config.ironing_flowrate; + ironing_params.acceleration = config.ironing_acceleration; + ironing_params.speed = config.ironing_speed; + if (config.ironing_angle.value >= 0) { + ironing_params.angle = float(Geometry::deg2rad(config.ironing_angle.value)); + } else { + ironing_params.angle = compute_fill_angle(config, layerm->layer()->id()); + if (config.ironing_angle.value < -1) + ironing_params.angle += float(Geometry::deg2rad(-config.ironing_angle.value)); + } ironing_params.layerm = layerm; by_extruder.emplace_back(ironing_params); } diff --git a/src/libslic3r/Format/BBConfig.cpp b/src/libslic3r/Format/BBConfig.cpp index ffb22ab40e2..78e81ae23a8 100644 --- a/src/libslic3r/Format/BBConfig.cpp +++ b/src/libslic3r/Format/BBConfig.cpp @@ -96,7 +96,7 @@ void init() //key_translation_map["bridge_angle"] = "bridge_angle"; key_translation_map["bridge_density"] = "bridge_overlap_min"; key_translation_map["bridge_no_support"] = "dont_support_bridges"; - key_translation_map["internal_bridge_speed"] = "bridge_speed_internal"; + //key_translation_map["internal_bridge_speed"] = "internal_bridge_speed"; //key_translation_map["brim_ears"] = "brim_ears"; //key_translation_map["brim_ears_detection_length"] = "brim_ears_detection_length"; //key_translation_map["brim_ears_max_angle"] = "brim_ears_max_angle"; diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index e7f186ab9bf..c053163dd38 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -1094,7 +1094,7 @@ namespace DoExport { excluded.insert(erTopSolidInfill); if (config->option("bridge_speed") != nullptr && config->get_computed_value("bridge_speed") != 0) excluded.insert(erBridgeInfill); - if (config->option("bridge_speed_internal") != nullptr && config->get_computed_value("bridge_speed_internal") != 0) + if (config->option("internal_bridge_speed") != nullptr && config->get_computed_value("internal_bridge_speed") != 0) excluded.insert(erInternalBridgeInfill); if (config->option("support_material_speed") != nullptr && config->get_computed_value("support_material_speed") != 0) excluded.insert(erSupportMaterial); @@ -5730,7 +5730,8 @@ double_t GCode::_compute_speed_mm_per_sec(const ExtrusionPath& path, double spee } else if (path.role() == erBridgeInfill) { speed = m_config.get_computed_value("bridge_speed"); } else if (path.role() == erInternalBridgeInfill) { - speed = m_config.get_computed_value("bridge_speed_internal"); + speed = m_config.get_computed_value("internal_bridge_speed"); + if(comment) *comment = "internal_bridge_speed"; } else if (path.role() == erOverhangPerimeter) { speed = m_config.get_computed_value("overhangs_speed"); } else if (path.role() == erInternalInfill) { @@ -5784,7 +5785,8 @@ double_t GCode::_compute_speed_mm_per_sec(const ExtrusionPath& path, double spee } else if (path.role() == erBridgeInfill) { speed = m_config.bridge_speed.get_abs_value(vol_speed); } else if (path.role() == erInternalBridgeInfill) { - speed = m_config.bridge_speed_internal.get_abs_value(vol_speed); + speed = m_config.internal_bridge_speed.get_abs_value(vol_speed); + if(comment) *comment = std::string("internal_bridge_speed ") + *comment; } else if (path.role() == erOverhangPerimeter) { speed = m_config.overhangs_speed.get_abs_value(vol_speed); } else if (path.role() == erInternalInfill) { @@ -5995,10 +5997,10 @@ std::string GCode::_before_extrude(const ExtrusionPath &path, const std::string } break; case erInternalBridgeInfill: - if (m_config.bridge_internal_acceleration.value > 0) { - double bridge_internal_acceleration = m_config.get_computed_value("bridge_internal_acceleration"); - if (bridge_internal_acceleration > 0) { - acceleration = bridge_internal_acceleration; + if (m_config.internal_bridge_acceleration.value > 0) { + double internal_bridge_acceleration = m_config.get_computed_value("internal_bridge_acceleration"); + if (internal_bridge_acceleration > 0) { + acceleration = internal_bridge_acceleration; break; } } diff --git a/src/libslic3r/GCode/CoolingBuffer.cpp b/src/libslic3r/GCode/CoolingBuffer.cpp index 2003c845f3d..5ea2ecb13b4 100644 --- a/src/libslic3r/GCode/CoolingBuffer.cpp +++ b/src/libslic3r/GCode/CoolingBuffer.cpp @@ -902,7 +902,7 @@ std::string CoolingBuffer::apply_layer_cooldown( } //set the fan controls default_fan_speed[ExtrusionRole::erBridgeInfill] = EXTRUDER_CONFIG(bridge_fan_speed); - default_fan_speed[ExtrusionRole::erInternalBridgeInfill] = EXTRUDER_CONFIG(bridge_internal_fan_speed); + default_fan_speed[ExtrusionRole::erInternalBridgeInfill] = EXTRUDER_CONFIG(internal_bridge_fan_speed); default_fan_speed[ExtrusionRole::erTopSolidInfill] = EXTRUDER_CONFIG(top_fan_speed); default_fan_speed[ExtrusionRole::erIroning] = default_fan_speed[ExtrusionRole::erTopSolidInfill]; default_fan_speed[ExtrusionRole::erSupportMaterialInterface] = EXTRUDER_CONFIG(support_material_interface_fan_speed); @@ -982,7 +982,7 @@ std::string CoolingBuffer::apply_layer_cooldown( fan_speeds[ExtrusionRole::erBridgeInfill] = fan_speeds[0]; } - // if bridge_internal_fan is disabled, it takes the value of bridge_fan + // if internal_bridge_fan is disabled, it takes the value of bridge_fan if (!fan_control[ExtrusionRole::erInternalBridgeInfill] && fan_control[ExtrusionRole::erBridgeInfill]) { fan_control[ExtrusionRole::erInternalBridgeInfill] = true; fan_speeds[ExtrusionRole::erInternalBridgeInfill] = fan_speeds[ExtrusionRole::erBridgeInfill]; diff --git a/src/libslic3r/Layer.cpp b/src/libslic3r/Layer.cpp index 15beed93da0..4acedd320fc 100644 --- a/src/libslic3r/Layer.cpp +++ b/src/libslic3r/Layer.cpp @@ -171,6 +171,7 @@ void Layer::make_perimeters() /// if you don't do that, objects will share the same region, and the same settings. if (config.perimeter_extruder == other_config.perimeter_extruder && config.perimeters == other_config.perimeters + && config.external_perimeter_acceleration == other_config.external_perimeter_acceleration && config.external_perimeter_extrusion_width == other_config.external_perimeter_extrusion_width && config.external_perimeter_overlap == other_config.external_perimeter_overlap && config.external_perimeter_speed == other_config.external_perimeter_speed // it os mandatory? can't this be set at gcode.cpp? @@ -182,6 +183,7 @@ void Layer::make_perimeters() && config.extra_perimeters_overhangs == other_config.extra_perimeters_overhangs && config.gap_fill_enabled == other_config.gap_fill_enabled && ((config.gap_fill_speed == other_config.gap_fill_speed) || !config.gap_fill_enabled) + && config.gap_fill_acceleration == other_config.gap_fill_acceleration && config.gap_fill_last == other_config.gap_fill_last && config.gap_fill_flow_match_perimeter == other_config.gap_fill_flow_match_perimeter && config.gap_fill_extension == other_config.gap_fill_extension @@ -196,10 +198,12 @@ void Layer::make_perimeters() && (this->id() == 0 || config.only_one_perimeter_first_layer == other_config.only_one_perimeter_first_layer) && config.only_one_perimeter_top == other_config.only_one_perimeter_top && config.only_one_perimeter_top_other_algo == other_config.only_one_perimeter_top_other_algo + && config.overhangs_acceleration == other_config.overhangs_acceleration && config.overhangs_width_speed == other_config.overhangs_width_speed && config.overhangs_width == other_config.overhangs_width && config.overhangs_reverse == other_config.overhangs_reverse && config.overhangs_reverse_threshold == other_config.overhangs_reverse_threshold + && config.perimeter_acceleration == other_config.perimeter_acceleration && config.perimeter_extrusion_width == other_config.perimeter_extrusion_width && config.perimeter_loop == other_config.perimeter_loop && config.perimeter_loop_seam == other_config.perimeter_loop_seam @@ -211,11 +215,12 @@ void Layer::make_perimeters() && config.small_perimeter_min_length == other_config.small_perimeter_min_length && config.small_perimeter_max_length == other_config.small_perimeter_max_length && config.thin_walls == other_config.thin_walls + && config.thin_walls_acceleration == other_config.thin_walls_acceleration && config.thin_walls_min_width == other_config.thin_walls_min_width && config.thin_walls_overlap == other_config.thin_walls_overlap + && config.thin_walls_speed == other_config.thin_walls_speed && config.thin_perimeters == other_config.thin_perimeters && config.thin_perimeters_all == other_config.thin_perimeters_all - && config.thin_walls_speed == other_config.thin_walls_speed && config.infill_overlap == other_config.infill_overlap && config.perimeter_loop == other_config.perimeter_loop && config.region_gcode == other_config.region_gcode diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index f3bdc3e7a8b..d157603fd10 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -523,7 +523,7 @@ static std::vector s_Preset_print_options { // speeds "default_speed", "bridge_speed", - "bridge_speed_internal", + "internal_bridge_speed", "brim_speed", "external_perimeter_speed", "first_layer_speed", @@ -559,7 +559,6 @@ static std::vector s_Preset_print_options { "fuzzy_skin_thickness", // acceleration "bridge_acceleration", - "bridge_internal_acceleration", "brim_acceleration", "default_acceleration", "external_perimeter_acceleration", @@ -567,6 +566,7 @@ static std::vector s_Preset_print_options { "first_layer_acceleration_over_raft", "gap_fill_acceleration", "infill_acceleration", + "internal_bridge_acceleration", "ironing_acceleration", "overhangs_acceleration", "perimeter_acceleration", @@ -758,10 +758,10 @@ static std::vector s_Preset_filament_options { "default_fan_speed", "max_fan_speed", "bridge_fan_speed", - "bridge_internal_fan_speed", "external_perimeter_fan_speed", "gap_fill_fan_speed", "infill_fan_speed", + "internal_bridge_fan_speed", "overhangs_fan_speed", "perimeter_fan_speed", "solid_infill_fan_speed", diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 2ccac036a49..50ad5619930 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -61,28 +61,25 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver& /* ne if (opt_keys.empty()) return false; + // Cache the plenty of parameters, which influence the G-code generator only, // or they are only notes not influencing the generated G-code. static std::unordered_set steps_gcode = { + "allow_empty_layers", "avoid_crossing_perimeters", "avoid_crossing_perimeters_max_detour", "avoid_crossing_not_first_layer", - "avoid_crossing_top", "bed_shape", "bed_temperature", "before_layer_gcode", "between_objects_gcode", - "per_objects_gcode", - "bridge_acceleration", - "bridge_internal_acceleration", "bridge_fan_speed", - "bridge_internal_fan_speed", - "brim_acceleration", "chamber_temperature", + "color_change_gcode", "colorprint_heights", "complete_objects_sort", - "cooling", - "default_acceleration", + "complete_objects_one_brim", + //"cooling", "default_fan_speed", "deretract_speed", "disable_fan_first_layers", @@ -90,8 +87,6 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver& /* ne "enforce_retract_first_layer", "end_gcode", "end_filament_gcode", - "external_perimeter_acceleration", - "external_perimeter_cut_corners", "external_perimeter_fan_speed", "extrusion_axis", "extruder_clearance_height", @@ -105,62 +100,59 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver& /* ne "fan_kickstart", "fan_speedup_overhangs", "fan_speedup_time", + "feature_gcode", "fan_percentage", "fan_printer_min_speed", "filament_colour", "filament_custom_variables", "filament_diameter", "filament_density", + "filament_load_time", "filament_notes", "filament_cost", "filament_spool_weight", - "first_layer_acceleration", - "first_layer_acceleration_over_raft", + "filament_unload_time", + "filament_wipe_advanced_pigment", "first_layer_bed_temperature", - "first_layer_flow_ratio", - "first_layer_speed", // ? delete y prusa here in 2.4 - "first_layer_speed_over_raft", - "first_layer_infill_speed", - "first_layer_min_speed", "full_fan_speed_layer", - "gap_fill_acceleration", "gap_fill_fan_speed", - "gap_fill_flow_match_perimeter", - "gap_fill_speed", "gcode_ascii", "gcode_comments", "gcode_filename_illegal_char", "gcode_label_objects", "gcode_precision_xyz", "gcode_precision_e", - "infill_acceleration", + "gcode_substitutions", "infill_fan_speed", - "ironing_acceleration", + "internal_bridge_fan_speed", "layer_gcode", + "lift_min", "max_fan_speed", "max_gcode_per_second", "max_print_height", "max_print_speed", + "max_speed_reduction", "max_volumetric_speed", "min_length", "min_print_speed", + "milling_diameter", "milling_toolchange_end_gcode", "milling_toolchange_start_gcode", - "milling_offset", - "milling_z_offset", - "milling_z_lift", "max_volumetric_extrusion_rate_slope_positive", "max_volumetric_extrusion_rate_slope_negative", "notes", "only_retract_when_crossing_perimeters", "output_filename_format", - "overhangs_acceleration", "overhangs_fan_speed", - "perimeter_acceleration", + "parallel_objects_step", + "pause_print_gcode", "post_process", - "gcode_substitutions", + "print_custom_variables", + "printer_custom_variables", "perimeter_fan_speed", "printer_notes", + "remaining_times", + "remaining_times_type", "retract_before_travel", "retract_before_wipe", "retract_layer_change", @@ -175,9 +167,9 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver& /* ne "retract_restart_extra", "retract_restart_extra_toolchange", "retract_speed", + "silent_mode", "single_extruder_multi_material_priming", "slowdown_below_layer_time", - "solid_infill_acceleration", "solid_infill_fan_speed", "support_material_acceleration", "support_material_fan_speed", @@ -187,8 +179,7 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver& /* ne "start_gcode", "start_gcode_manual", "start_filament_gcode", - "thin_walls_acceleration", - "thin_walls_speed", + "template_custom_gcode", "thumbnails", "thumbnails_color", "thumbnails_custom_color", @@ -203,17 +194,16 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver& /* ne "tool_name", "toolchange_gcode", "top_fan_speed", - "top_solid_infill_acceleration", "threads", - "travel_acceleration", - "travel_deceleration_use_target", - "travel_speed", - "travel_speed_z", "use_firmware_retraction", "use_relative_e_distances", "use_volumetric_e", "variable_layer_height", "wipe", + "wipe_advanced", + "wipe_advanced_algo", + "wipe_advanced_multiplier", + "wipe_advanced_nozzle_melted_volume", "wipe_extra_perimeter", "wipe_inside_depth", "wipe_inside_end", @@ -229,6 +219,9 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver& /* ne bool invalidated = false; for (const t_config_option_key &opt_key : opt_keys) { + //this one isn't even use in slicing, only for import. + if (opt_key == "init_z_rotate") + continue; if (steps_gcode.find(opt_key) != steps_gcode.end()) { // These options only affect G-code export or they are just notes without influence on the generated G-code, // so there is nothing to invalidate. @@ -241,23 +234,22 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver& /* ne || opt_key == "min_skirt_length" || opt_key == "ooze_prevention" || opt_key == "skirts" - || opt_key == "skirt_height" || opt_key == "skirt_brim" || opt_key == "skirt_distance" || opt_key == "skirt_distance_from_brim" + || opt_key == "skirt_extrusion_width" + || opt_key == "skirt_height" || opt_key == "wipe_tower_x" || opt_key == "wipe_tower_y" || opt_key == "wipe_tower_rotation_angle" ) { steps.emplace_back(psSkirtBrim); } else if ( - opt_key == "filament_shrink" - || opt_key == "first_layer_height" + opt_key == "bridge_precision" + || opt_key == "filament_shrink" || opt_key == "nozzle_diameter" - || opt_key == "model_precision" || opt_key == "resolution" || opt_key == "resolution_internal" - || opt_key == "slice_closing_radius" // Spiral Vase forces different kind of slicing than the normal model: // In Spiral Vase mode, holes are closed and only the largest area contour is kept at each layer. // Therefore toggling the Spiral Vase on / off requires complete reslicing. @@ -267,14 +259,13 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver& /* ne } else if ( opt_key == "complete_objects" || opt_key == "filament_type" - || opt_key == "filament_soluble" - || opt_key == "first_layer_temperature" || opt_key == "filament_loading_speed" || opt_key == "filament_loading_speed_start" || opt_key == "filament_unloading_speed" || opt_key == "filament_unloading_speed_start" || opt_key == "filament_toolchange_delay" || opt_key == "filament_cooling_moves" + || opt_key == "filament_max_wipe_tower_speed" || opt_key == "filament_minimal_purge_on_wipe_tower" || opt_key == "filament_cooling_initial_speed" || opt_key == "filament_cooling_final_speed" @@ -292,9 +283,9 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver& /* ne || opt_key == "filament_toolchange_part_fan_speed" || opt_key == "filament_dip_insertion_speed" || opt_key == "filament_dip_extraction_speed" //skinnydip params end + || opt_key == "first_layer_temperature" || opt_key == "gcode_flavor" || opt_key == "high_current_on_filament_swap" - || opt_key == "infill_first" || opt_key == "single_extruder_multi_material" || opt_key == "temperature" || opt_key == "wipe_tower" @@ -302,8 +293,10 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver& /* ne || opt_key == "wipe_tower_brim_width" || opt_key == "wipe_tower_bridging" || opt_key == "wipe_tower_no_sparse_layers" + || opt_key == "wipe_tower_per_color_wipe" || opt_key == "wipe_tower_speed" || opt_key == "wipe_tower_wipe_starting_speed" + || opt_key == "wiping_volumes_extruders" || opt_key == "wiping_volumes_matrix" || opt_key == "parking_pos_retraction" || opt_key == "cooling_tube_retraction" @@ -311,7 +304,6 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver& /* ne || opt_key == "extra_loading_move" || opt_key == "travel_speed" || opt_key == "travel_speed_z" - || opt_key == "first_layer_speed" || opt_key == "z_offset") { steps.emplace_back(psWipeTower); steps.emplace_back(psSkirtBrim); @@ -322,8 +314,7 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver& /* ne //FIXME Killing supports on any change of "filament_soluble" is rough. We should check for each object whether that is necessary. osteps.emplace_back(posSupportMaterial); } else if ( - opt_key == "first_layer_extrusion_width" - || opt_key == "arc_fitting" + opt_key == "arc_fitting" || opt_key == "arc_fitting_tolerance" || opt_key == "min_layer_height" || opt_key == "max_layer_height" @@ -334,6 +325,8 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver& /* ne osteps.emplace_back(posSimplifyPath); osteps.emplace_back(posSupportMaterial); steps.emplace_back(psSkirtBrim); + } else if (opt_key == "seam_gap" || opt_key == "seam_gap_external") { + osteps.emplace_back(posInfill); } else if (opt_key == "posSlice") osteps.emplace_back(posSlice); diff --git a/src/libslic3r/Print.hpp b/src/libslic3r/Print.hpp index 8b1bd5ecfa4..1436dab31df 100644 --- a/src/libslic3r/Print.hpp +++ b/src/libslic3r/Print.hpp @@ -46,6 +46,7 @@ namespace FillLightning { using GeneratorPtr = std::unique_ptr; }; // namespace FillLightning + // Print step IDs for keeping track of the print state. // The Print steps are applied in this order. enum PrintStep { @@ -59,6 +60,7 @@ enum PrintStep { // should be refreshed. psSlicingFinished = psSkirtBrim, psGCodeExport, + //TODO: psGCodeLoader (for params that are only used for time display and such) psCount, }; diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index c9cca8d0934..08170390ec9 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -724,20 +724,6 @@ void PrintConfigDef::init_fff_params() def->mode = comAdvancedE | comPrusa; def->set_default_value(new ConfigOptionFloatOrPercent(0,false)); - def = this->add("bridge_internal_acceleration", coFloatOrPercent); - def->label = L("Internal bridges "); - def->full_label = L("Internal bridges acceleration"); - def->category = OptionCategory::speed; - def->tooltip = L("This is the acceleration your printer will use for internal bridges. " - "\nCan be a % of the default acceleration" - "\nSet zero to use bridge acceleration for internal bridges."); - def->sidetext = L("mm/s² or %"); - def->ratio_over = "bridge_acceleration"; - def->min = 0; - def->max_literal = { -200, false }; - def->mode = comExpert | comSuSi; - def->set_default_value(new ConfigOptionFloatOrPercent(0,false)); - def = this->add("bridge_angle", coFloat); def->label = L("Bridging"); def->full_label = L("Bridging angle"); @@ -763,19 +749,6 @@ void PrintConfigDef::init_fff_params() def->is_vector_extruder = true; def->set_default_value(new ConfigOptionInts{ 100 }); - def = this->add("bridge_internal_fan_speed", coInts); - def->label = L("Infill bridges fan speed"); - def->category = OptionCategory::cooling; - def->tooltip = L("This fan speed is enforced during all infill bridges. It won't slow down the fan if it's currently running at a higher speed." - "\nSet to -1 to disable this override (Internal bridges will use Bridges fan speed)." - "\nCan be disabled by disable_fan_first_layers and increased by low layer time."); - def->sidetext = L("%"); - def->min = -1; - def->max = 100; - def->mode = comAdvancedE | comSuSi; - def->is_vector_extruder = true; - def->set_default_value(new ConfigOptionInts{ -1 }); - def = this->add("bridge_type", coEnum); def->label = L("Bridge flow baseline"); def->category = OptionCategory::width; @@ -867,17 +840,6 @@ void PrintConfigDef::init_fff_params() def->mode = comAdvancedE | comPrusa; def->set_default_value(new ConfigOptionFloatOrPercent(60, true)); - def = this->add("bridge_speed_internal", coFloatOrPercent); - def->label = L("Internal bridges"); - def->full_label = L("Internal bridge speed"); - def->category = OptionCategory::speed; - def->tooltip = L("Speed for printing the bridges that support the top layer.\nCan be a % of the bridge speed."); - def->sidetext = L("mm/s or %"); - def->ratio_over = "bridge_speed"; - def->min = 0; - def->mode = comExpert | comSuSi; - def->set_default_value(new ConfigOptionFloatOrPercent(150,true)); - def = this->add("brim_inside_holes", coBool); def->label = L("Brim inside holes"); def->category = OptionCategory::skirtBrim; @@ -3299,6 +3261,47 @@ void PrintConfigDef::init_fff_params() def->mode = comExpert | comPrusa; def->set_default_value(new ConfigOptionBool(false)); + def = this->add("internal_bridge_acceleration", coFloatOrPercent); + def->label = L("Internal bridges "); + def->full_label = L("Internal bridges acceleration"); + def->category = OptionCategory::speed; + def->tooltip = L("This is the acceleration your printer will use for internal bridges. " + "\nCan be a % of the default acceleration" + "\nSet zero to use bridge acceleration for internal bridges."); + def->sidetext = L("mm/s² or %"); + def->ratio_over = "bridge_acceleration"; + def->min = 0; + def->max_literal = { -200, false }; + def->mode = comExpert | comSuSi; + def->set_default_value(new ConfigOptionFloatOrPercent(0,false)); + def->aliases = { "bridge_internal_acceleration" }; + + def = this->add("internal_bridge_fan_speed", coInts); + def->label = L("Infill bridges fan speed"); + def->category = OptionCategory::cooling; + def->tooltip = L("This fan speed is enforced during all infill bridges. It won't slow down the fan if it's currently running at a higher speed." + "\nSet to -1 to disable this override (Internal bridges will use Bridges fan speed)." + "\nCan be disabled by disable_fan_first_layers and increased by low layer time."); + def->sidetext = L("%"); + def->min = -1; + def->max = 100; + def->mode = comAdvancedE | comSuSi; + def->is_vector_extruder = true; + def->set_default_value(new ConfigOptionInts{ -1 }); + def->aliases = { "bridge_internal_fan_speed" }; + + def = this->add("internal_bridge_speed", coFloatOrPercent); + def->label = L("Internal bridges"); + def->full_label = L("Internal bridge speed"); + def->category = OptionCategory::speed; + def->tooltip = L("Speed for printing the bridges that support the top layer.\nCan be a % of the bridge speed."); + def->sidetext = L("mm/s or %"); + def->ratio_over = "bridge_speed"; + def->min = 0; + def->mode = comExpert | comSuSi; + def->set_default_value(new ConfigOptionFloatOrPercent(150,true)); + def->aliases = { "bridge_speed_internal" }; + def = this->add("mmu_segmented_region_max_width", coFloat); def->label = L("Maximum width of a segmented region"); def->tooltip = L("Maximum width of a segmented region. Zero disables this feature."); @@ -3318,7 +3321,7 @@ void PrintConfigDef::init_fff_params() def = this->add("ironing_acceleration", coFloatOrPercent); def->label = L("Ironing"); def->full_label = L("Ironing acceleration"); - def->category = OptionCategory::speed; + def->category = OptionCategory::ironing; def->tooltip = L("This is the acceleration your printer will use for ironing. " "\nCan be a % of the top solid infill acceleration" "\nSet zero to use top solid infill acceleration for ironing."); @@ -8106,11 +8109,9 @@ std::unordered_set prusa_export_to_remove_keys = { "avoid_crossing_not_first_layer", "avoid_crossing_top", "bridge_fill_pattern", -"bridge_internal_acceleration", -"bridge_internal_fan_speed", +"bridge_precision", "bridge_overlap", "bridge_overlap_min", -"bridge_speed_internal", "bridge_type", "bridged_infill_margin", "brim_acceleration", @@ -8214,6 +8215,9 @@ std::unordered_set prusa_export_to_remove_keys = { "infill_extrusion_spacing", "infill_fan_speed", "init_z_rotate", +"internal_bridge_acceleration", +"internal_bridge_fan_speed", +"internal_bridge_speed", "ironing_acceleration", "ironing_angle", "lift_min", diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 4e0b1ddb05b..a79ab140be0 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -706,6 +706,7 @@ protected: \ PRINT_CONFIG_CLASS_DEFINE( PrintObjectConfig, + ((ConfigOptionFloatOrPercent, brim_acceleration)) ((ConfigOptionBool, brim_inside_holes)) ((ConfigOptionFloat, brim_width)) ((ConfigOptionFloat, brim_width_interior)) @@ -724,12 +725,17 @@ PRINT_CONFIG_CLASS_DEFINE( //((ConfigOptionBool, exact_last_layer_height)) ((ConfigOptionFloatOrPercent, extrusion_width)) ((ConfigOptionFloatOrPercent, extrusion_spacing)) + ((ConfigOptionBool, fill_angle_follow_model)) + ((ConfigOptionFloatOrPercent, first_layer_acceleration)) ((ConfigOptionFloatOrPercent, first_layer_acceleration_over_raft)) ((ConfigOptionFloatOrPercent, first_layer_height)) ((ConfigOptionFloatOrPercent, first_layer_extrusion_width)) ((ConfigOptionFloatOrPercent, first_layer_extrusion_spacing)) + ((ConfigOptionFloatOrPercent, first_layer_infill_speed)) + ((ConfigOptionFloat, first_layer_min_speed)) ((ConfigOptionFloat, first_layer_size_compensation)) /* elefant_foot_compensation */ ((ConfigOptionInt, first_layer_size_compensation_layers)) + ((ConfigOptionFloatOrPercent, first_layer_speed)) ((ConfigOptionFloatOrPercent, first_layer_speed_over_raft)) ((ConfigOptionFloat, hole_size_compensation)) ((ConfigOptionFloat, hole_size_threshold)) @@ -816,6 +822,7 @@ PRINT_CONFIG_CLASS_DEFINE( PrintRegionConfig, ((ConfigOptionBool, avoid_crossing_top)) + ((ConfigOptionFloatOrPercent, bridge_acceleration)) ((ConfigOptionFloat, bridge_angle)) ((ConfigOptionEnum, bridge_fill_pattern)) ((ConfigOptionEnum, bridge_type)) @@ -828,15 +835,16 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionEnum, bottom_fill_pattern)) ((ConfigOptionFloatOrPercent, bridged_infill_margin)) ((ConfigOptionFloatOrPercent, bridge_speed)) - ((ConfigOptionFloatOrPercent, bridge_speed_internal)) ((ConfigOptionFloat, curve_smoothing_precision)) ((ConfigOptionFloat, curve_smoothing_cutoff_dist)) ((ConfigOptionFloat, curve_smoothing_angle_convex)) ((ConfigOptionFloat, curve_smoothing_angle_concave)) + ((ConfigOptionFloatOrPercent, default_acceleration)) ((ConfigOptionFloatOrPercent, default_speed)) ((ConfigOptionBool, ensure_vertical_shell_thickness)) ((ConfigOptionBool, enforce_full_fill_volume)) ((ConfigOptionFloatOrPercent, external_infill_margin)) + ((ConfigOptionFloatOrPercent, external_perimeter_acceleration)) ((ConfigOptionFloatOrPercent, external_perimeter_extrusion_width)) ((ConfigOptionFloatOrPercent, external_perimeter_extrusion_spacing)) ((ConfigOptionFloatOrPercent, external_perimeter_extrusion_change_odd_layers)) @@ -866,6 +874,7 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionPercent, fill_top_flow_ratio)) ((ConfigOptionPercent, fill_smooth_distribution)) ((ConfigOptionFloatOrPercent, fill_smooth_width)) + ((ConfigOptionFloatOrPercent, gap_fill_acceleration)) ((ConfigOptionBool, gap_fill_enabled)) ((ConfigOptionFloatOrPercent, gap_fill_extension)) ((ConfigOptionPercent, gap_fill_flow_match_perimeter)) @@ -881,6 +890,7 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionBool, hole_to_polyhole)) ((ConfigOptionFloatOrPercent, hole_to_polyhole_threshold)) ((ConfigOptionBool, hole_to_polyhole_twisted)) + ((ConfigOptionFloatOrPercent, infill_acceleration)) ((ConfigOptionInt, infill_extruder)) ((ConfigOptionFloatOrPercent, infill_extrusion_width)) ((ConfigOptionFloatOrPercent, infill_extrusion_spacing)) @@ -896,8 +906,11 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionBool, infill_dense)) ((ConfigOptionEnum, infill_dense_algo)) ((ConfigOptionBool, infill_first)) + ((ConfigOptionFloatOrPercent, internal_bridge_acceleration)) + ((ConfigOptionFloatOrPercent, internal_bridge_speed)) // Ironing options ((ConfigOptionBool, ironing)) + ((ConfigOptionFloatOrPercent, ironing_acceleration)) ((ConfigOptionFloat, ironing_angle)) ((ConfigOptionEnum, ironing_type)) ((ConfigOptionPercent, ironing_flowrate)) @@ -910,6 +923,10 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionFloat, milling_speed)) ((ConfigOptionFloatOrPercent, min_width_top_surface)) // Detect bridging perimeters + ((ConfigOptionFloatOrPercent, overhangs_acceleration)) + ((ConfigOptionFloatOrPercent, overhangs_max_slope)) + ((ConfigOptionFloat, overhangs_bridge_threshold)) + ((ConfigOptionInt, overhangs_bridge_upper_layers)) ((ConfigOptionFloatOrPercent, overhangs_speed)) ((ConfigOptionInt, overhangs_speed_enforce)) ((ConfigOptionFloatOrPercent, overhangs_width)) @@ -917,6 +934,7 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionBool, overhangs_reverse)) ((ConfigOptionFloatOrPercent, overhangs_reverse_threshold)) ((ConfigOptionEnum, no_perimeter_unsupported_algo)) + ((ConfigOptionFloatOrPercent, perimeter_acceleration)) ((ConfigOptionBool, perimeter_round_corners)) ((ConfigOptionInt, perimeter_extruder)) ((ConfigOptionFloatOrPercent, perimeter_extrusion_width)) @@ -937,6 +955,7 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionFloatOrPercent, small_perimeter_min_length)) ((ConfigOptionFloatOrPercent, small_perimeter_max_length)) ((ConfigOptionEnum, solid_fill_pattern)) + ((ConfigOptionFloatOrPercent, solid_infill_acceleration)) ((ConfigOptionFloat, solid_infill_below_area)) ((ConfigOptionInt, solid_infill_extruder)) ((ConfigOptionFloatOrPercent, solid_infill_extrusion_width)) @@ -950,6 +969,7 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionPercent, thin_perimeters)) ((ConfigOptionPercent, thin_perimeters_all)) ((ConfigOptionBool, thin_walls)) + ((ConfigOptionFloatOrPercent, thin_walls_acceleration)) ((ConfigOptionFloatOrPercent, thin_walls_min_width)) ((ConfigOptionFloatOrPercent, thin_walls_overlap)) ((ConfigOptionFloatOrPercent, thin_walls_speed)) @@ -958,30 +978,12 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionFloatOrPercent, top_infill_extrusion_spacing)) ((ConfigOptionInt, top_solid_layers)) ((ConfigOptionFloat, top_solid_min_thickness)) + ((ConfigOptionFloatOrPercent, top_solid_infill_acceleration)) + ((ConfigOptionPercent, top_solid_infill_overlap)) ((ConfigOptionFloatOrPercent, top_solid_infill_speed)) + ((ConfigOptionFloatOrPercent, travel_acceleration)) + ((ConfigOptionBool, travel_deceleration_use_target)) ((ConfigOptionBool, wipe_into_infill)) - - - ((ConfigOptionFloatOrPercent, bridge_acceleration)) - ((ConfigOptionFloatOrPercent, bridge_internal_acceleration)) - ((ConfigOptionFloatOrPercent, brim_acceleration)) - ((ConfigOptionFloatOrPercent, default_acceleration)) - ((ConfigOptionFloatOrPercent, external_perimeter_acceleration)) - ((ConfigOptionFloatOrPercent, first_layer_acceleration)) - ((ConfigOptionFloatOrPercent, gap_fill_acceleration)) - ((ConfigOptionFloatOrPercent, infill_acceleration)) - ((ConfigOptionFloatOrPercent, ironing_acceleration)) - ((ConfigOptionFloatOrPercent, overhangs_acceleration)) - ((ConfigOptionFloatOrPercent, perimeter_acceleration)) - ((ConfigOptionFloatOrPercent, solid_infill_acceleration)) - ((ConfigOptionFloatOrPercent, support_material_acceleration)) - ((ConfigOptionFloatOrPercent, support_material_interface_acceleration)) - ((ConfigOptionFloatOrPercent, thin_walls_acceleration)) - ((ConfigOptionFloatOrPercent, top_solid_infill_acceleration)) - ((ConfigOptionFloatOrPercent, travel_acceleration)) //compiles fine with moving them here, how to properly test this ? - - ((ConfigOptionString, per_objects_gcode)) - ) PRINT_CONFIG_CLASS_DEFINE( @@ -1185,11 +1187,8 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( ((ConfigOptionFloatOrPercent, avoid_crossing_perimeters_max_detour)) ((ConfigOptionPoints, bed_shape)) ((ConfigOptionInts, bed_temperature)) - //((ConfigOptionFloatOrPercent, bridge_acceleration)) - //((ConfigOptionFloatOrPercent, bridge_internal_acceleration)) ((ConfigOptionInts, bridge_fan_speed)) - ((ConfigOptionInts, bridge_internal_fan_speed)) - //((ConfigOptionFloatOrPercent, brim_acceleration)) + ((ConfigOptionFloatOrPercent, bridge_precision)) ((ConfigOptionInts, chamber_temperature)) ((ConfigOptionBool, complete_objects)) ((ConfigOptionFloat, parallel_objects_step)) @@ -1198,13 +1197,11 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( ((ConfigOptionEnum, complete_objects_sort)) ((ConfigOptionFloats, colorprint_heights)) //((ConfigOptionBools, cooling)) - //((ConfigOptionFloatOrPercent, default_acceleration)) ((ConfigOptionInts, disable_fan_first_layers)) ((ConfigOptionInts, default_fan_speed)) ((ConfigOptionEnum, draft_shield)) ((ConfigOptionFloat, duplicate_distance)) ((ConfigOptionBool, enforce_retract_first_layer)) - //((ConfigOptionFloatOrPercent, external_perimeter_acceleration)) ((ConfigOptionInts, external_perimeter_fan_speed)) ((ConfigOptionFloat, extruder_clearance_height)) ((ConfigOptionFloat, extruder_clearance_radius)) @@ -1217,18 +1214,12 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( ((ConfigOptionStrings, filament_notes)) ((ConfigOptionPercents, filament_max_overlap)) ((ConfigOptionPercents, filament_shrink)) - //((ConfigOptionFloatOrPercent, first_layer_acceleration)) ((ConfigOptionInts, first_layer_bed_temperature)) - ((ConfigOptionFloatOrPercent, first_layer_speed)) - ((ConfigOptionFloatOrPercent, first_layer_infill_speed)) - ((ConfigOptionFloat, first_layer_min_speed)) ((ConfigOptionInts, first_layer_temperature)) ((ConfigOptionInts, full_fan_speed_layer)) - //((ConfigOptionFloatOrPercent, gap_fill_acceleration)) ((ConfigOptionInts, gap_fill_fan_speed)) - //((ConfigOptionFloatOrPercent, infill_acceleration)) ((ConfigOptionInts, infill_fan_speed)) - //((ConfigOptionFloatOrPercent, ironing_acceleration)) + ((ConfigOptionInts, internal_bridge_fan_speed)) ((ConfigOptionFloat, lift_min)) ((ConfigOptionInts, max_fan_speed)) ((ConfigOptionFloatsOrPercents, max_layer_height)) @@ -1237,8 +1228,6 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( ((ConfigOptionFloats, milling_diameter)) ((ConfigOptionStrings, milling_toolchange_end_gcode)) ((ConfigOptionStrings, milling_toolchange_start_gcode)) - //((ConfigOptionPoints, milling_offset)) - //((ConfigOptionFloats, milling_z_offset)) //((ConfigOptionInts, min_fan_speed)) // now fan_printer_min_speed ((ConfigOptionFloatsOrPercents, min_layer_height)) ((ConfigOptionFloats, min_print_speed)) @@ -1248,9 +1237,7 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( ((ConfigOptionBool, only_retract_when_crossing_perimeters)) ((ConfigOptionBool, ooze_prevention)) ((ConfigOptionString, output_filename_format)) - //((ConfigOptionFloatOrPercent, overhangs_acceleration)) ((ConfigOptionInts, overhangs_fan_speed)) - //((ConfigOptionFloatOrPercent, perimeter_acceleration)) ((ConfigOptionInts, perimeter_fan_speed)) ((ConfigOptionStrings, post_process)) ((ConfigOptionString, print_custom_variables)) @@ -1272,7 +1259,6 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( ((ConfigOptionInt, skirts)) ((ConfigOptionFloats, slowdown_below_layer_time)) ((ConfigOptionBool, spiral_vase)) - //((ConfigOptionFloatOrPercent, solid_infill_acceleration)) ((ConfigOptionInts, solid_infill_fan_speed)) ((ConfigOptionInt, standby_temperature_delta)) //((ConfigOptionFloatOrPercent, support_material_acceleration)) @@ -1280,7 +1266,6 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( //((ConfigOptionFloatOrPercent, support_material_interface_acceleration)) ((ConfigOptionInts, support_material_interface_fan_speed)) ((ConfigOptionInts, temperature)) - //((ConfigOptionFloatOrPercent, thin_walls_acceleration)) ((ConfigOptionInt, threads)) ((ConfigOptionPoints, thumbnails)) ((ConfigOptionString, thumbnails_color)) @@ -1294,9 +1279,6 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( ((ConfigOptionFloat, time_start_gcode)) ((ConfigOptionFloat, time_toolchange)) ((ConfigOptionInts, top_fan_speed)) - //((ConfigOptionFloatOrPercent, top_solid_infill_acceleration)) - //((ConfigOptionFloatOrPercent, travel_acceleration)) - ((ConfigOptionBool, travel_deceleration_use_target)) ((ConfigOptionBools, wipe)) ((ConfigOptionBool, wipe_tower)) ((ConfigOptionFloatOrPercent, wipe_tower_brim_width)) diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index 03afa5eaa88..80467627ba8 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -821,7 +821,7 @@ FillLightning::GeneratorPtr PrintObject::prepare_lightning_infill_data() // Called by Print::apply(). // This method only accepts PrintObjectConfig and PrintRegionConfig option keys. -bool PrintObject::invalidate_state_by_config_options( + bool PrintObject::invalidate_state_by_config_options( const ConfigOptionResolver &old_config, const ConfigOptionResolver &new_config, const std::vector &opt_keys) { if (opt_keys.empty()) @@ -831,13 +831,13 @@ bool PrintObject::invalidate_state_by_config_options( bool invalidated = false; for (const t_config_option_key& opt_key : opt_keys) { if ( - opt_key == "gap_fill_enabled" - || opt_key == "gap_fill_extension" + opt_key == "gap_fill_extension" || opt_key == "gap_fill_last" || opt_key == "gap_fill_max_width" || opt_key == "gap_fill_min_area" || opt_key == "gap_fill_min_length" || opt_key == "gap_fill_min_width" + || opt_key == "min_width_top_surface" || opt_key == "only_one_perimeter_first_layer" || opt_key == "only_one_perimeter_top" || opt_key == "only_one_perimeter_top_other_algo" @@ -846,22 +846,21 @@ bool PrintObject::invalidate_state_by_config_options( || opt_key == "overhangs_reverse" || opt_key == "overhangs_reverse_threshold" || opt_key == "overhangs_speed_enforce" + || opt_key == "perimeter_bonding" || opt_key == "perimeter_extrusion_change_odd_layers" || opt_key == "perimeter_extrusion_spacing" || opt_key == "perimeter_extrusion_width" || opt_key == "perimeter_reverse" - || opt_key == "infill_overlap" + || opt_key == "perimeter_round_corners" || opt_key == "thin_perimeters" || opt_key == "thin_perimeters_all" - || opt_key == "thin_walls" + || opt_key == "thin_walls_merge" || opt_key == "thin_walls_min_width" || opt_key == "thin_walls_overlap" || opt_key == "external_perimeters_first" || opt_key == "external_perimeters_hole" || opt_key == "external_perimeters_nothole" || opt_key == "external_perimeter_extrusion_change_odd_layers" - || opt_key == "external_perimeter_extrusion_spacing" - || opt_key == "external_perimeter_extrusion_width" || opt_key == "external_perimeters_vase" || opt_key == "perimeter_loop" || opt_key == "perimeter_loop_seam") { @@ -888,32 +887,49 @@ bool PrintObject::invalidate_state_by_config_options( steps.emplace_back(posSlice); steps.emplace_back(posPerimeters); } else if ( - opt_key == "layer_height" + // || opt_key == "exact_last_layer_height" + opt_key == "bridge_type" + || opt_key == "clip_multipart_objects" + || opt_key == "curve_smoothing_angle_concave" + || opt_key == "curve_smoothing_angle_convex" + || opt_key == "curve_smoothing_cutoff_dist" + || opt_key == "curve_smoothing_precision" + || opt_key == "dont_support_bridges" + || opt_key == "elephant_foot_min_width" //sla ? + || opt_key == "first_layer_size_compensation" + || opt_key == "first_layer_size_compensation_layers" || opt_key == "first_layer_height" + || opt_key == "hole_size_compensation" + || opt_key == "hole_size_threshold" + || opt_key == "hole_to_polyhole" + || opt_key == "hole_to_polyhole_threshold" + || opt_key == "hole_to_polyhole_twisted" + || opt_key == "layer_height" + || opt_key == "min_bead_width" + || opt_key == "min_feature_size" || opt_key == "mmu_segmented_region_max_width" - // || opt_key == "exact_last_layer_height" + || opt_key == "model_precision" + || opt_key == "overhangs_max_slope" + || opt_key == "overhangs_bridge_threshold" + || opt_key == "overhangs_bridge_upper_layers" || opt_key == "raft_contact_distance" || opt_key == "raft_interface_layer_height" || opt_key == "raft_layers" || opt_key == "raft_layer_height" - || opt_key == "slice_closing_radius" - || opt_key == "clip_multipart_objects" - || opt_key == "first_layer_size_compensation" - || opt_key == "first_layer_size_compensation_layers" - || opt_key == "elephant_foot_min_width" - || opt_key == "dont_support_bridges" + || opt_key == "perimeter_generator" || opt_key == "slice_closing_radius" || opt_key == "slicing_mode" || opt_key == "support_material_contact_distance_type" - || opt_key == "support_material_contact_distance_top" - || opt_key == "support_material_contact_distance_bottom" + || opt_key == "support_material_contact_distance" + || opt_key == "support_material_bottom_contact_distance" || opt_key == "support_material_interface_layer_height" || opt_key == "support_material_layer_height" - || opt_key == "xy_size_compensation" - || opt_key == "hole_size_compensation" - || opt_key == "hole_size_threshold" - || opt_key == "hole_to_polyhole" - || opt_key == "hole_to_polyhole_threshold") { + || opt_key == "wall_transition_length" + || opt_key == "wall_transition_filter_deviation" + || opt_key == "wall_transition_angle" + || opt_key == "wall_distribution_count" + || opt_key == "xy_inner_size_compensation" + || opt_key == "xy_size_compensation") { steps.emplace_back(posSlice); } else if (opt_key == "support_material") { steps.emplace_back(posSupportMaterial); @@ -935,17 +951,15 @@ bool PrintObject::invalidate_state_by_config_options( || opt_key == "support_material_enforce_layers" || opt_key == "support_material_extruder" || opt_key == "support_material_extrusion_width" - || opt_key == "support_material_bottom_contact_distance" || opt_key == "support_material_interface_layers" || opt_key == "support_material_bottom_interface_layers" || opt_key == "support_material_interface_angle" || opt_key == "support_material_interface_angle_increment" - || opt_key == "support_material_interface_pattern" || opt_key == "support_material_interface_contact_loops" || opt_key == "support_material_interface_extruder" + || opt_key == "support_material_interface_pattern" || opt_key == "support_material_interface_spacing" || opt_key == "support_material_pattern" - || opt_key == "support_material_interface_pattern" || opt_key == "support_material_style" || opt_key == "support_material_xy_spacing" || opt_key == "support_material_spacing" @@ -956,8 +970,7 @@ bool PrintObject::invalidate_state_by_config_options( steps.emplace_back(posSupportMaterial); } else if (opt_key == "bottom_solid_layers") { steps.emplace_back(posPrepareInfill); - if (m_print->config().spiral_vase - || opt_key == "z_step") { + if (m_print->config().spiral_vase) { // Changing the number of bottom layers when a spiral vase is enabled requires re-slicing the object again. // Otherwise, holes in the bottom layers could be filled, as is reported in GH #5528. steps.emplace_back(posSlice); @@ -973,9 +986,10 @@ bool PrintObject::invalidate_state_by_config_options( || opt_key == "infill_every_layers" || opt_key == "infill_dense" || opt_key == "infill_dense_algo" - || opt_key == "infill_not_connected" || opt_key == "infill_only_where_needed" + || opt_key == "ironing" || opt_key == "ironing_type" + || opt_key == "over_bridge_flow_ratio" || opt_key == "solid_infill_below_area" || opt_key == "solid_infill_extruder" || opt_key == "solid_infill_every_layers" @@ -984,10 +998,10 @@ bool PrintObject::invalidate_state_by_config_options( || opt_key == "top_solid_min_thickness") { steps.emplace_back(posPrepareInfill); } else if ( - opt_key == "top_fill_pattern" - || opt_key == "bottom_fill_pattern" + opt_key == "bottom_fill_pattern" || opt_key == "bridge_fill_pattern" - || opt_key == "solid_fill_pattern" + || opt_key == "bridge_overlap" + || opt_key == "bridge_overlap_min" || opt_key == "enforce_full_fill_volume" || opt_key == "fill_aligned_z" || opt_key == "fill_angle" @@ -1004,17 +1018,20 @@ bool PrintObject::invalidate_state_by_config_options( || opt_key == "infill_connection_bridge" || opt_key == "infill_connection_solid" || opt_key == "infill_connection_top" - || opt_key == "seam_gap" - || opt_key == "seam_gap_external" + || opt_key == "ironing_angle" + || opt_key == "ironing_flowrate" + || opt_key == "ironing_spacing" + || opt_key == "solid_fill_pattern" + || opt_key == "top_fill_pattern" || opt_key == "top_infill_extrusion_spacing" || opt_key == "top_infill_extrusion_width" ) { steps.emplace_back(posInfill); - } else if (opt_key == "fill_pattern") { - steps.emplace_back(posInfill); + } else if (opt_key == "fill_pattern") { + steps.emplace_back(posInfill); - const auto *old_fill_pattern = old_config.option>(opt_key); - const auto *new_fill_pattern = new_config.option>(opt_key); - assert(old_fill_pattern && new_fill_pattern); + const auto *old_fill_pattern = old_config.option>(opt_key); + const auto *new_fill_pattern = new_config.option>(opt_key); + assert(old_fill_pattern && new_fill_pattern); // We need to recalculate infill surfaces when infill_only_where_needed is enabled, and we are switching from // the Lightning infill to another infill or vice versa. if (m_config.infill_only_where_needed && (new_fill_pattern->value == ipLightning || old_fill_pattern->value == ipLightning)) @@ -1036,36 +1053,34 @@ bool PrintObject::invalidate_state_by_config_options( || opt_key == "bridged_infill_margin" || opt_key == "extra_perimeters" || opt_key == "extra_perimeters_odd_layers" + || opt_key == "extra_perimeters_overhangs" || opt_key == "external_infill_margin" || opt_key == "external_perimeter_overlap" || opt_key == "gap_fill_overlap" + || opt_key == "infill_overlap" || opt_key == "no_perimeter_unsupported_algo" - || opt_key == "filament_max_overlap" || opt_key == "perimeters" || opt_key == "perimeter_overlap" || opt_key == "solid_infill_extrusion_change_odd_layers" || opt_key == "solid_infill_extrusion_spacing" - || opt_key == "solid_infill_extrusion_width") { + || opt_key == "solid_infill_extrusion_width" + || opt_key == "solid_infill_overlap" + || opt_key == "top_solid_infill_overlap") { steps.emplace_back(posPerimeters); steps.emplace_back(posPrepareInfill); - } else if (opt_key == "solid_infill_extrusion_change_odd_layers" - || opt_key == "solid_infill_extrusion_spacing" - || opt_key == "solid_infill_extrusion_width") { - // This value is used for calculating perimeter - infill overlap, thus perimeters need to be recalculated. - steps.emplace_back(posPerimeters); - steps.emplace_back(posPrepareInfill); } else if ( - opt_key == "external_perimeter_extrusion_width" - || opt_key == "perimeter_extruder" - || opt_key == "fuzzy_skin" - || opt_key == "fuzzy_skin_thickness" - || opt_key == "fuzzy_skin_point_dist" - || opt_key == "overhangs" - || opt_key == "thin_walls" - || opt_key == "thick_bridges") { + opt_key == "external_perimeter_extrusion_width" + || opt_key == "external_perimeter_extrusion_spacing" + || opt_key == "perimeter_extruder" + || opt_key == "fuzzy_skin" + || opt_key == "fuzzy_skin_thickness" + || opt_key == "fuzzy_skin_point_dist" + || opt_key == "thin_walls") { steps.emplace_back(posPerimeters); steps.emplace_back(posSupportMaterial); } else if (opt_key == "bridge_flow_ratio" + || opt_key == "extrusion_spacing" + || opt_key == "extrusion_width" || opt_key == "first_layer_extrusion_spacing" || opt_key == "first_layer_extrusion_width") { //if (m_config.support_material_contact_distance > 0.) { @@ -1075,30 +1090,51 @@ bool PrintObject::invalidate_state_by_config_options( steps.emplace_back(posInfill); steps.emplace_back(posSupportMaterial); //} - } else if ( - opt_key == "perimeter_generator" - || opt_key == "wall_transition_length" - || opt_key == "wall_transition_filter_deviation" - || opt_key == "wall_transition_angle" - || opt_key == "wall_distribution_count" - || opt_key == "min_feature_size" - || opt_key == "min_bead_width") { - steps.emplace_back(posSlice); } else if ( opt_key == "avoid_crossing_top" + || opt_key == "bridge_acceleration" || opt_key == "bridge_speed" - || opt_key == "bridge_speed_internal" + || opt_key == "brim_acceleration" + || opt_key == "brim_speed" || opt_key == "external_perimeter_speed" - || opt_key == "external_perimeters_vase" + || opt_key == "default_acceleration" + || opt_key == "default_speed" + || opt_key == "external_perimeter_acceleration" + || opt_key == "external_perimeter_cut_corners" + || opt_key == "first_layer_acceleration" + || opt_key == "first_layer_acceleration_over_raft" + || opt_key == "first_layer_flow_ratio" + || opt_key == "first_layer_infill_speed" + || opt_key == "first_layer_min_speed" + || opt_key == "first_layer_speed" + || opt_key == "first_layer_speed_over_raft" + || opt_key == "gap_fill_acceleration" + || opt_key == "gap_fill_flow_match_perimeter" || opt_key == "gap_fill_speed" + || opt_key == "infill_acceleration" || opt_key == "infill_speed" + || opt_key == "internal_bridge_acceleration" + || opt_key == "internal_bridge_speed" + || opt_key == "ironing_acceleration" + || opt_key == "ironing_speed" + || opt_key == "milling_after_z" + || opt_key == "milling_extra_size" + || opt_key == "milling_post_process" + || opt_key == "milling_speed" || opt_key == "object_gcode" + || opt_key == "overhangs_acceleration" || opt_key == "overhangs_speed" + || opt_key == "perimeter_acceleration" || opt_key == "perimeter_speed" + || opt_key == "print_extrusion_multiplier" + || opt_key == "print_first_layer_temperature" + || opt_key == "print_retract_length" + || opt_key == "print_retract_lift" + || opt_key == "print_temperature" || opt_key == "region_gcode" || opt_key == "seam_position" - || opt_key == "seam_preferred_direction" - || opt_key == "seam_preferred_direction_jitter" + //|| opt_key == "seam_preferred_direction" + //|| opt_key == "seam_preferred_direction_jitter" || opt_key == "seam_angle_cost" || opt_key == "seam_notch_all" || opt_key == "seam_notch_angle" @@ -1109,14 +1145,20 @@ bool PrintObject::invalidate_state_by_config_options( || opt_key == "small_perimeter_speed" || opt_key == "small_perimeter_min_length" || opt_key == "small_perimeter_max_length" + || opt_key == "solid_infill_acceleration" || opt_key == "solid_infill_speed" || opt_key == "support_material_interface_speed" || opt_key == "support_material_speed" + || opt_key == "thin_walls_acceleration" || opt_key == "thin_walls_speed" - || opt_key == "top_solid_infill_speed") { + || opt_key == "top_solid_infill_acceleration" + || opt_key == "top_solid_infill_speed" + || opt_key == "travel_acceleration" + || opt_key == "travel_deceleration_use_target") { invalidated |= m_print->invalidate_step(psGCodeExport); } else if ( - opt_key == "wipe_into_infill" + opt_key == "infill_first" + || opt_key == "wipe_into_infill" || opt_key == "wipe_into_objects") { invalidated |= m_print->invalidate_step(psWipeTower); invalidated |= m_print->invalidate_step(psGCodeExport); @@ -1127,7 +1169,8 @@ bool PrintObject::invalidate_state_by_config_options( || opt_key == "brim_ears_max_angle" || opt_key == "brim_ears_pattern" || opt_key == "brim_per_object" - || opt_key == "brim_separation") { + || opt_key == "brim_separation" + || opt_key == "brim_type") { invalidated |= m_print->invalidate_step(psSkirtBrim); // Brim is printed below supports, support invalidates brim and skirt. steps.emplace_back(posSupportMaterial); diff --git a/src/slic3r/GUI/ConfigManipulation.cpp b/src/slic3r/GUI/ConfigManipulation.cpp index 741a97146d9..57036528fff 100644 --- a/src/slic3r/GUI/ConfigManipulation.cpp +++ b/src/slic3r/GUI/ConfigManipulation.cpp @@ -576,7 +576,7 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig* config) toggle_field("support_material_acceleration", have_default_acceleration && (have_support_material || have_brim || have_skirt)); toggle_field("support_material_interface_acceleration", have_default_acceleration && have_support_material && have_support_interface); toggle_field("brim_acceleration", have_default_acceleration && (have_brim || have_skirt)); - for (auto el : { "bridge_acceleration", "bridge_internal_acceleration", "overhangs_acceleration", "gap_fill_acceleration", "travel_acceleration", "travel_deceleration_use_target", "first_layer_acceleration" }) + for (auto el : { "bridge_acceleration", "internal_bridge_acceleration", "overhangs_acceleration", "gap_fill_acceleration", "travel_acceleration", "travel_deceleration_use_target", "first_layer_acceleration" }) toggle_field(el, have_default_acceleration); // for default speed, it needs at least a dependent field with a % diff --git a/src/slic3r/GUI/PresetHints.cpp b/src/slic3r/GUI/PresetHints.cpp index 305e7b642a5..2b2937bbf90 100644 --- a/src/slic3r/GUI/PresetHints.cpp +++ b/src/slic3r/GUI/PresetHints.cpp @@ -108,7 +108,7 @@ std::string PresetHints::cooling_description(const Preset &preset_fil, const Pre const int support_fan_speed = preset_fil.config.opt_int("support_material_fan_speed", 0) == 1 ? 0 : preset_fil.config.get_int("support_material_fan_speed"); const int supp_inter_fan_speed = preset_fil.config.opt_int("support_material_interface_fan_speed", 0) == 1 ? 0 : preset_fil.config.get_int("support_material_interface_fan_speed"); const int bridge_fan_speed = preset_fil.config.opt_int("bridge_fan_speed", 0) == 1 ? 0 : preset_fil.config.get_int("bridge_fan_speed"); - const int bridge_internal_fan_speed = preset_fil.config.opt_int("bridge_internal_fan_speed", 0) == 1 ? 0 : preset_fil.config.get_int("bridge_internal_fan_speed"); + const int internal_bridge_fan_speed = preset_fil.config.opt_int("internal_bridge_fan_speed", 0) == 1 ? 0 : preset_fil.config.get_int("internal_bridge_fan_speed"); const int overhangs_fan_speed = preset_fil.config.opt_int("overhangs_fan_speed", 0) == 1 ? 0 : preset_fil.config.get_int("overhangs_fan_speed"); const int gap_fill_fan_speed = preset_fil.config.opt_int("gap_fill_fan_speed", 0) == 1 ? 0 : preset_fil.config.get_int("gap_fill_fan_speed"); const int disable_fan_first_layers = preset_fil.config.opt_int("disable_fan_first_layers", 0); @@ -133,7 +133,7 @@ std::string PresetHints::cooling_description(const Preset &preset_fil, const Pre format_simple_fan_min_speed(out, min_fan_speed, default_fan_speed, _L("Solid surfaces"), solid_fan_speed); format_simple_fan_speed(out, min_fan_speed, default_fan_speed, _L("Top surfaces"), top_fan_speed); format_double_fan_min_speed(out, min_fan_speed, default_fan_speed, _L("Supports"), support_fan_speed, _L("Support interfaces"), supp_inter_fan_speed); - format_double_fan_speed(out, min_fan_speed, default_fan_speed, _L("Bridges"), bridge_fan_speed, _L("Internal bridges"), bridge_internal_fan_speed); + format_double_fan_speed(out, min_fan_speed, default_fan_speed, _L("Bridges"), bridge_fan_speed, _L("Internal bridges"), internal_bridge_fan_speed); format_simple_fan_min_speed(out, min_fan_speed, default_fan_speed, _L("Perimeter overhangs"), overhangs_fan_speed); format_simple_fan_min_speed(out, min_fan_speed, default_fan_speed, _L("Gap fills"), gap_fill_fan_speed); @@ -160,7 +160,7 @@ std::string PresetHints::cooling_description(const Preset &preset_fil, const Pre surface_list += ","; surface_list += _L("Bridges"); } - if (bridge_internal_fan_speed > 0) { + if (internal_bridge_fan_speed > 0) { surface_list += ","; surface_list += _L("Internal bridges"); } @@ -243,7 +243,7 @@ std::string PresetHints::cooling_description(const Preset &preset_fil, const Pre out += "\n\n" + _L("! 1 for the External perimeters fan speed is Deprecated, please set it to 0 to stop the fan!"); if (preset_fil.config.opt_int("bridge_fan_speed", 0) == 1) out += "\n\n" + _L("! 1 for the Bridge fan speed is Deprecated, please set it to 0 to stop the fan!"); - if (preset_fil.config.opt_int("bridge_internal_fan_speed", 0) == 1) + if (preset_fil.config.opt_int("internal_bridge_fan_speed", 0) == 1) out += "\n\n" + _L("! 1 for the Infill bridge fan speed is Deprecated, please set it to 0 to stop the fan!"); return out.ToStdString(); From ec695536c0b63c695d2d67ec76d78fd141013a2d Mon Sep 17 00:00:00 2001 From: legend069 <40685552+legend069@users.noreply.github.com> Date: Fri, 5 Jul 2024 03:16:45 +1000 Subject: [PATCH 19/28] merged commits for region_gcode --- src/libslic3r/GCode.cpp | 20 ++++++++++++++----- src/libslic3r/GCode.hpp | 2 +- src/libslic3r/Layer.cpp | 4 ++-- src/libslic3r/Preset.cpp | 1 + src/libslic3r/PrintConfig.cpp | 9 +++++++++ src/libslic3r/PrintConfig.hpp | 7 ++++--- .../GUI/CalibrationRetractionDialog.cpp | 2 ++ src/slic3r/GUI/CalibrationTempDialog.cpp | 2 ++ 8 files changed, 36 insertions(+), 11 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index c053163dd38..f5f69356095 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -1554,7 +1554,7 @@ void GCode::_do_export(Print& print_mod, GCodeOutputStream &file, ThumbnailsGene file.write_format("\n"); } - size_t nb_parts_per_object = 0; + /*size_t nb_parts_per_object = 0; size_t nb_parts_per_target_volume = 0; std::string volume_config_per_object_gcode = ""; @@ -1600,7 +1600,7 @@ void GCode::_do_export(Print& print_mod, GCodeOutputStream &file, ThumbnailsGene } file.write("; Total parts per object: " + std::to_string(nb_parts_per_object) + "\n"); - file.write("; Total parts per target volume: " + std::to_string(nb_parts_per_target_volume) + "\n"); + file.write("; Total parts per target volume: " + std::to_string(nb_parts_per_target_volume) + "\n");*/ BoundingBoxf3 global_bounding_box; size_t nb_items = 0; @@ -5231,7 +5231,7 @@ std::string GCode::extrude_path(const ExtrusionPath &path, const std::string &de const double max_gcode_per_second = this->config().max_gcode_per_second.value; double current_scaled_min_length = scaled_min_length; if (max_gcode_per_second > 0) { - current_scaled_min_length = std::max(current_scaled_min_length, scale_(_compute_speed_mm_per_sec(path, speed_mm_per_sec)) / max_gcode_per_second); + current_scaled_min_length = std::max(current_scaled_min_length, scale_(_compute_speed_mm_per_sec(path, speed_mm_per_sec,nullptr)) / max_gcode_per_second); } simplifed_path.polyline.ensure_fitting_result_valid(); if (current_scaled_min_length > 0 && !m_last_too_small.empty()) { @@ -5713,7 +5713,7 @@ std::string GCode::_extrude(const ExtrusionPath &path, const std::string &descri return gcode; } -double_t GCode::_compute_speed_mm_per_sec(const ExtrusionPath& path, double speed) { +double_t GCode::_compute_speed_mm_per_sec(const ExtrusionPath& path, double speed, std::string *comment) { float factor = 1; // set speed @@ -5725,25 +5725,34 @@ double_t GCode::_compute_speed_mm_per_sec(const ExtrusionPath& path, double spee //it's a bit hacky, so if you want to rework it, help yourself. if (path.role() == erPerimeter) { speed = m_config.get_computed_value("perimeter_speed"); + if(comment) *comment = "perimeter_speed"; } else if (path.role() == erExternalPerimeter) { speed = m_config.get_computed_value("external_perimeter_speed"); + if(comment) *comment = "external_perimeter_speed"; } else if (path.role() == erBridgeInfill) { speed = m_config.get_computed_value("bridge_speed"); + if(comment) *comment = "bridge_speed"; } else if (path.role() == erInternalBridgeInfill) { speed = m_config.get_computed_value("internal_bridge_speed"); if(comment) *comment = "internal_bridge_speed"; } else if (path.role() == erOverhangPerimeter) { speed = m_config.get_computed_value("overhangs_speed"); + if(comment) *comment = "overhangs_speed"; } else if (path.role() == erInternalInfill) { speed = m_config.get_computed_value("infill_speed"); + if(comment) *comment = "infill_speed"; } else if (path.role() == erSolidInfill) { speed = m_config.get_computed_value("solid_infill_speed"); + if(comment) *comment = "solid_infill_speed"; } else if (path.role() == erTopSolidInfill) { speed = m_config.get_computed_value("top_solid_infill_speed"); + if(comment) *comment = "top_solid_infill_speed"; } else if (path.role() == erThinWall) { speed = m_config.get_computed_value("thin_walls_speed"); + if(comment) *comment = "thin_walls_speed"; } else if (path.role() == erGapFill) { speed = m_config.get_computed_value("gap_fill_speed"); + if(comment) *comment = "gap_fill_speed"; double max_ratio = m_config.gap_fill_flow_match_perimeter.get_abs_value(1.); if (max_ratio > 0 && m_region) { //compute intended perimeter flow @@ -6055,7 +6064,8 @@ std::string GCode::_before_extrude(const ExtrusionPath &path, const std::string } // compute speed here to be able to know it for travel_deceleration_use_target - speed = _compute_speed_mm_per_sec(path, speed); + std::string speed_comment = ""; + speed = _compute_speed_mm_per_sec(path, speed, m_config.gcode_comments ? &speed_comment : nullptr); if (m_config.travel_deceleration_use_target){ if (travel_acceleration <= acceleration || travel_acceleration == 0 || acceleration == 0) { diff --git a/src/libslic3r/GCode.hpp b/src/libslic3r/GCode.hpp index c135a1af780..633197220d9 100644 --- a/src/libslic3r/GCode.hpp +++ b/src/libslic3r/GCode.hpp @@ -519,7 +519,7 @@ class GCode : ExtrusionVisitorConst { void _extrude_line(std::string& gcode_str, const Line& line, const double e_per_mm, const std::string& comment); void _extrude_line_cut_corner(std::string& gcode_str, const Line& line, const double e_per_mm, const std::string& comment, Point& last_pos, const double path_width); std::string _before_extrude(const ExtrusionPath &path, const std::string &description, double speed = -1); - double_t _compute_speed_mm_per_sec(const ExtrusionPath& path, double speed = -1); + double_t _compute_speed_mm_per_sec(const ExtrusionPath &path, double speed, std::string *comment); std::string _after_extrude(const ExtrusionPath &path); void print_machine_envelope(GCodeOutputStream &file, const Print &print); void _print_first_layer_bed_temperature(std::string &out, const Print &print, const std::string &gcode, uint16_t first_printing_extruder_id, bool wait); diff --git a/src/libslic3r/Layer.cpp b/src/libslic3r/Layer.cpp index 4acedd320fc..ce5082f02be 100644 --- a/src/libslic3r/Layer.cpp +++ b/src/libslic3r/Layer.cpp @@ -229,7 +229,7 @@ void Layer::make_perimeters() && config.fuzzy_skin_thickness == other_config.fuzzy_skin_thickness && config.fuzzy_skin_point_dist == other_config.fuzzy_skin_point_dist - && config.bridge_acceleration == other_config.bridge_acceleration + /*&& config.bridge_acceleration == other_config.bridge_acceleration && config.bridge_internal_acceleration == other_config.bridge_internal_acceleration && config.brim_acceleration == other_config.brim_acceleration && config.default_acceleration == other_config.default_acceleration @@ -245,7 +245,7 @@ void Layer::make_perimeters() && config.support_material_interface_acceleration == other_config.support_material_interface_acceleration && config.thin_walls_acceleration == other_config.thin_walls_acceleration && config.top_solid_infill_acceleration == other_config.top_solid_infill_acceleration//compiles fine with moving them here, how to properly test this ? - && config.per_objects_gcode == other_config.per_objects_gcode + && config.per_objects_gcode == other_config.per_objects_gcode */ && config.external_perimeter_extrusion_spacing == other_config.external_perimeter_extrusion_spacing && config.perimeter_extrusion_spacing == other_config.perimeter_extrusion_spacing diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index d157603fd10..cda6bb76b00 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -711,6 +711,7 @@ static std::vector s_Preset_print_options { "curve_smoothing_angle_convex", "curve_smoothing_angle_concave", "print_extrusion_multiplier", + "print_first_layer_temperature", "print_retract_length", "print_temperature", "print_retract_lift", diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 08170390ec9..16289073085 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -5745,6 +5745,14 @@ void PrintConfigDef::init_fff_params() def->mode = comExpert | comSuSi; def->set_default_value(new ConfigOptionInt(0)); + def = this->add("print_first_layer_temperature", coInt); + def->label = L("Temperature"); + def->category = OptionCategory::filament; + def->tooltip = L("Override the temperature of the extruder (for the first layer). Avoid making too many changes, it won't stop for cooling/heating. 0 to disable (using print_temperature if defined). May only work on Height range modifiers."); + def->mode = comExpert | comSuSi; + def->min = 0; + def->set_default_value(new ConfigOptionInt(0)); + def = this->add("print_retract_lift", coFloat); def->label = L("Z-lift override"); def->category = OptionCategory::filament; @@ -8261,6 +8269,7 @@ std::unordered_set prusa_export_to_remove_keys = { "perimeter_reverse", "perimeter_round_corners", "print_extrusion_multiplier", +"print_first_layer_temperature" "print_custom_variables", "print_retract_length", "print_retract_lift", diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index a79ab140be0..5361c93ffdd 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -22,7 +22,7 @@ // class DynamicConfig : public virtual ConfigBase // class DynamicPrintConfig : public DynamicConfig // class DynamicPrintAndCLIConfig : public DynamicPrintConfig -// +// my repo // #ifndef slic3r_PrintConfig_hpp_ @@ -965,6 +965,7 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionFloatOrPercent, solid_infill_speed)) ((ConfigOptionPercent, solid_infill_overlap)) ((ConfigOptionInt, solid_over_perimeters)) + ((ConfigOptionInt, print_first_layer_temperature)) ((ConfigOptionInt, print_temperature)) ((ConfigOptionPercent, thin_perimeters)) ((ConfigOptionPercent, thin_perimeters_all)) @@ -1261,9 +1262,9 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( ((ConfigOptionBool, spiral_vase)) ((ConfigOptionInts, solid_infill_fan_speed)) ((ConfigOptionInt, standby_temperature_delta)) - //((ConfigOptionFloatOrPercent, support_material_acceleration)) + ((ConfigOptionFloatOrPercent, support_material_acceleration)) ((ConfigOptionInts, support_material_fan_speed)) - //((ConfigOptionFloatOrPercent, support_material_interface_acceleration)) + ((ConfigOptionFloatOrPercent, support_material_interface_acceleration)) ((ConfigOptionInts, support_material_interface_fan_speed)) ((ConfigOptionInts, temperature)) ((ConfigOptionInt, threads)) diff --git a/src/slic3r/GUI/CalibrationRetractionDialog.cpp b/src/slic3r/GUI/CalibrationRetractionDialog.cpp index 44ea22a2d20..d4ed5b2f792 100644 --- a/src/slic3r/GUI/CalibrationRetractionDialog.cpp +++ b/src/slic3r/GUI/CalibrationRetractionDialog.cpp @@ -146,6 +146,7 @@ void CalibrationRetractionDialog::create_geometry(wxCommandEvent& event_args) { double retraction_start = 0; std::string str = temp_start->GetValue().ToStdString(); int temp = int((2 + filament_config->option("temperature")->get_at(0)) / 5) * 5; + int first_layer_temp = filament_config->option("first_layer_temperature")->get_at(0); if (str.find_first_not_of("0123456789") == std::string::npos) temp = std::atoi(str.c_str()); @@ -239,6 +240,7 @@ void CalibrationRetractionDialog::create_geometry(wxCommandEvent& event_args) { current_obj->config.set_key_value("layer_height", new ConfigOptionFloat(nozzle_diameter / 2.)); //temp current_obj->config.set_key_value("print_temperature", new ConfigOptionInt(int(temp - temp_decr * i))); + current_obj->config.set_key_value("print_first_layer_temperature", new ConfigOptionInt(first_layer_temp)); //set retraction override const int mytemp = temp - temp_decr * i; diff --git a/src/slic3r/GUI/CalibrationTempDialog.cpp b/src/slic3r/GUI/CalibrationTempDialog.cpp index b76abb26ac9..49ec3c35c40 100644 --- a/src/slic3r/GUI/CalibrationTempDialog.cpp +++ b/src/slic3r/GUI/CalibrationTempDialog.cpp @@ -71,6 +71,7 @@ void CalibrationTempDialog::create_geometry(wxCommandEvent& event_args) { // -- get temps const ConfigOptionInts* temperature_config = filament_config->option("temperature"); + const int first_layer_temperature = filament_config->option("temperature")->get_at(0); assert(temperature_config->values.size() >= 1); long nb_items_up = 1; if (!nb_up->GetValue().ToLong(&nb_items_up)) { @@ -160,6 +161,7 @@ void CalibrationTempDialog::create_geometry(wxCommandEvent& event_args) { double firstChangeHeight = print_config->get_abs_value("first_layer_height", nozzle_diameter); //model.custom_gcode_per_print_z.gcodes.emplace_back(CustomGCode::Item{ firstChangeHeight + nozzle_diameter/2, CustomGCode::Type::Custom, -1, "", "M104 S" + std::to_string(temperature) + " ; ground floor temp tower set" }); model.objects[objs_idx[0]]->config.set_key_value("print_temperature", new ConfigOptionInt(temperature)); + model.objects[objs_idx[0]]->config.set_key_value("print_first_layer_temperature", new ConfigOptionInt(first_layer_temperature)); for (int16_t i = 1; i < nb_items; i++) { model.custom_gcode_per_print_z.gcodes.emplace_back(CustomGCode::Item{ (i * 10 * xyzScale), CustomGCode::Type::Custom , -1, "", "M104 S" + std::to_string(temperature - i * step_temp) + " ; floor " + std::to_string(i) + " of the temp tower set" }); //str_layer_gcode += "\n{ elsif layer_z >= " + std::to_string(i * 10 * xyzScale) + " and layer_z <= " + std::to_string((1 + i * 10) * xyzScale) + " }\nM104 S" + std::to_string(temperature - (int8_t)nb_delta * 5 + i * 5); From a0097452097272afd616e246bc45b13618664489 Mon Sep 17 00:00:00 2001 From: legend069 <40685552+legend069@users.noreply.github.com> Date: Fri, 5 Jul 2024 03:24:58 +1000 Subject: [PATCH 20/28] patches for beta v1.00 large improvements. now possible to config multi-plate testing changed default values for test. cleaned code up a fair bit found //BUG: custom gcode ' between extrusion role changes' should that be before or after region gcode? --- .../filament_pressure/filament_pressure.html | 23 +- .../GUI/CalibrationPressureAdvDialog.cpp | 721 +++++++++--------- .../GUI/CalibrationPressureAdvDialog.hpp | 23 +- 3 files changed, 412 insertions(+), 355 deletions(-) diff --git a/resources/calibration/filament_pressure/filament_pressure.html b/resources/calibration/filament_pressure/filament_pressure.html index 019e9cee723..59389eff0b0 100644 --- a/resources/calibration/filament_pressure/filament_pressure.html +++ b/resources/calibration/filament_pressure/filament_pressure.html @@ -23,14 +23,31 @@

Pressure/Linear Advance

-

this test is still in development, beta should work "ok" for now though.
your current print settings will need to be saved before clicking "generate" since it uses the saved values to create the model

-

note: this test will auto pull all your currently loaded config parameters and generate a model for you to print!
for to help with firmware speed/processing limitations it's reccomended to have most extrusion roles similar set to speeds.

+

this test is still in development, beta should work "ok" for now though.this page will be get updated along with it :)
your current print settings will need to be saved before clicking "generate" since it uses the saved values to create the model

+

note: this test will auto pull all your currently loaded config parameters and generate a model for you to print!
for to help with firmware speed/processing limitations it's reccomended to have most extrusion roles similar set to speeds.(but you don't have to!)

How to tune your printer for Pressure/Linear Advance

-

todo add detaisl here

+

to get started

+
    +
  • select the number of tests to create, if you select more than 1 for now you will have to resize the window manually(click and drag the window from the bottom right)
  • +
  • select the start/end/increment/ extrusion role values
  • +
  • each row is the config for each base test model, eg; first row = externalPerimeter second row = firstLayer
  • +
  • since each model will have it's own config one test model might be faster/slower than the others, this is expected and normal
  • +
  • i will reccomend setting 'first_layer_speed' and 'first_layer_min_speed' to the same vales
  • + +
+ +

what is this "verify" option?
+you may notice there is the "verify" option in the extrusion role dropdown, this feature currently doesn't work.(you can still use it, but any role that has gap fill will be incorrect and the test for that role should be ignored!)
+when i get it working, it's purpose is to make it easy to see what extrusion roles need it's PA values tuned. + it will create a model for each ER role, and assign that roles speed/acceleration/widths/spacing to the single model
+you can then manually add the pressure advance command into the "per region g-code" box, slice and print it. +

+

Advice

Before doing this test, it's preferable to tune everything else first!
i would reccomended setting XXXX to the same speeds, XXX to a slow speed, and everything else you can send it with.

note: having large variance with ER speeds can reduce print quality/dimensional accuracy this is effect is mainly caused by the inner perimeter getting pulled closer to the external perimeter as it cools down, since each perimeter would be at different temperatues.

+

i will reccomend setting 'first_layer_speed' and 'first_layer_min_speed' to the same vales

TODO add things about PA and setting first layer correctly
add notes about fan speed and disabling fan speed for this test, or do i have check box in GUI that would auto change relavent UI tab?

  • bullet points
  • diff --git a/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp b/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp index f1845f3619d..bba032fcf63 100644 --- a/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp +++ b/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp @@ -29,141 +29,7 @@ static wxSize get_screen_size(wxWindow* window) namespace Slic3r { namespace GUI { -void CalibrationPressureAdvDialog::create_buttons(wxStdDialogButtonSizer* buttons){ - - const DynamicPrintConfig* printer_config = this->gui_app->get_tab(Preset::TYPE_PRINTER)->get_config(); - GCodeFlavor flavor = printer_config->option>("gcode_flavor")->value; //there a better way to only load the flavor ? - - wxString choices_first_layerPA[] = { - "0.025", - "0.030", - "0.035", - "0.040", - "0.045", - "0.050" - }; - firstPa = new wxComboBox(this, wxID_ANY, wxString{ "0.040" }, wxDefaultPosition, wxDefaultSize, 6, choices_first_layerPA); - firstPa->SetToolTip(_L("Select the first layer PA value to be used for the first layer only.")); - firstPa->SetSelection(3);// starting at 0! - - - wxString choices_start_PA[] = { - "0.0", - "0.010", - "0.020", - "0.030", - "0.040", - "0.050" - }; - startPa = new wxComboBox(this, wxID_ANY, wxString{ "0.0" }, wxDefaultPosition, wxDefaultSize, 6, choices_start_PA); - startPa->SetToolTip(_L("Select the starting PA value to be used.")); - startPa->SetSelection(0); - - wxString choices_end_PA[] = { - "0.10", - "0.20", - "0.30", - "0.40", - "0.50", - "0.60", - "0.70", - "0.80", - "0.90", - "1.00" - }; - endPa = new wxComboBox(this, wxID_ANY, wxString{ "0.10" }, wxDefaultPosition, wxDefaultSize, 10, choices_end_PA); - endPa->SetToolTip(_L("Select the ending PA value to be used.")); - endPa->SetSelection(0); - - wxString choices_increment_PA[] = { - "0.0010",///1000 hits - "0.0025", - "0.0035", - "0.005", //200 hits - "0.006", - "0.007", - "0.01",//100 hits - "0.1"//10 hits - }; - paIncrement = new wxComboBox(this, wxID_ANY, wxString{ "0.0025" }, wxDefaultPosition, wxDefaultSize, 8, choices_increment_PA); - paIncrement->SetToolTip(_L("Select the PA increment amount.")); - paIncrement->SetSelection(1); - - wxString choices_extrusion_role[] = { - "InternalInfill", - "BridgeInfill", - "ExternalPerimeter", - "GapFill", - "InternalBridgeInfill", - "Ironing", - "OverhangPerimeter", - "Perimeter", - "SolidInfill", - "SupportMaterial", - "SupportMaterialInterface", - "ThinWall", - "TopSolidInfill", - "FirstLayer", - "Verify"//if this selected, disable/hide other buttons? - // 'verify' this choice will require the user to manually add in the PA numbers with the GUI from their realworld tests. - // the code will then load a 90_bend for each ER role, and give each bend seperate ER speed/width/ect values - // when printed and user added in the PA numbers correctly. it should make it easy to spot what ER roles need adjusting. - //TODO: once the main pressure advance feature is added, this can pull that values and insert here to save the manual adding in the numbers. - }; - erPa = new wxComboBox(this, wxID_ANY, wxString{ "InternalInfill" }, wxDefaultPosition, wxDefaultSize, 15, choices_extrusion_role); - erPa->SetToolTip(_L("Select the extrusion role you want to generate a calibration for")); - erPa->SetSelection(0); - - - wxString number_of_runs[] = {"1","2","3","4","5"}; - nbRuns = new wxComboBox(this, wxID_ANY, wxString{ "1" }, wxDefaultPosition, wxDefaultSize, 5, number_of_runs); - nbRuns->SetToolTip(_L("Select the number of tests to generate, max 2 is reccomended due to bed size limits")); - nbRuns->SetSelection(0); - - enableST = new wxCheckBox(this, wxID_ANY, _L(""), wxDefaultPosition, wxDefaultSize ); - enableST->SetToolTip(_L("generate smooth time values")); - enableST->SetValue(false); - - // TODO : add another row of boxes for the 2nd/3rd ect of tests to create, user adjust parameters of new row for the 2nd/3rd test - // this will allow multi plate PA tests to be run - - - std::string prefix = (gcfMarlinFirmware == flavor) ? " LA " : ((gcfKlipper == flavor || gcfRepRap == flavor) ? " PA " : "unsupported firmware type"); - - if (prefix != "unsupported firmware type"){ - buttons->Add(new wxStaticText(this, wxID_ANY, _L("Number of tests: "))); - buttons->Add(nbRuns); - buttons->AddSpacer(15); - buttons->Add(new wxStaticText(this, wxID_ANY, _L("First Layers" + prefix + "value: "))); - buttons->Add(firstPa); - buttons->AddSpacer(15); - buttons->Add(new wxStaticText(this, wxID_ANY, _L("Starting" + prefix + "value: "))); - buttons->Add(startPa); - buttons->AddSpacer(15); - buttons->Add(new wxStaticText(this, wxID_ANY, _L("Ending" + prefix + "value: "))); - buttons->Add(endPa); - buttons->AddSpacer(15); - buttons->Add(new wxStaticText(this, wxID_ANY, _L(prefix + "increments: "))); - buttons->Add(paIncrement); - buttons->AddSpacer(15); - buttons->Add(new wxStaticText(this, wxID_ANY, _L("Extrusion role: "))); - buttons->Add(erPa); - if (gcfKlipper == flavor) { - buttons->AddSpacer(15); - buttons->Add(new wxStaticText(this, wxID_ANY, _L("Smooth time: "))); - buttons->Add(enableST); - } - buttons->AddSpacer(25); - - wxButton* bt = new wxButton(this, wxID_FILE1, _L("Generate")); - bt->Bind(wxEVT_BUTTON, &CalibrationPressureAdvDialog::create_geometry, this); - buttons->Add(bt); - //this->CenterOnParent(); - } - else{ - buttons->Add(new wxStaticText(this, wxID_ANY, _L(prefix))); - } -} +//BUG: custom gcode ' between extrusion role changes' should that be before or after region gcode? void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { /* @@ -174,29 +40,7 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { erPa enableST */ - double first_pa, start_pa, end_pa, pa_increment = 0.01; - bool smooth_time = enableST->IsChecked(); - size_t nb_runs = nbRuns->GetSelection(); - nb_runs=nb_runs+1; - first_pa = firstPa->GetValue().ToDouble(&first_pa); - - if (!firstPa->GetValue().ToDouble(&first_pa)) { - first_pa = 0.025; - } - start_pa = startPa->GetValue().ToDouble(&start_pa); - if (!startPa->GetValue().ToDouble(&start_pa)) { - start_pa = 0.0; - } - end_pa = endPa->GetValue().ToDouble(&end_pa); - if (!endPa->GetValue().ToDouble(&end_pa)) { - end_pa = 1.0; - } - pa_increment = paIncrement->GetValue().ToDouble(&pa_increment); - if (!paIncrement->GetValue().ToDouble(&pa_increment)) { - pa_increment = 0.05; - } - - std::string extrusion_role = erPa->GetValue().ToStdString(); + std::string choice_extrusion_role[] = { "InternalInfill", "BridgeInfill", @@ -284,49 +128,6 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { {"FirstLayer", "first_layer_speed"} }; -/* -struct ExtrusionSettings {// think a struct is better instead of all the maps ? - std::string extrusionWidth; - std::string acceleration; - std::string speed; -}; - - std::unordered_map extrusionRoleToOptionKey = { - {"InternalInfill", {"infill_extrusion_width", "infill_acceleration", "placeholder"}}, - //{"BridgeInfill", {"placeholder", "bridge_acceleration", "placeholder"}},//special calc required - {"ExternalPerimeter", {"external_perimeter_extrusion_width", "external_perimeter_acceleration"}}, - //{"GapFill", {"placeholder", "gap_fill_acceleration"}},//special calc required - //{"InternalBridgeInfill", {"placeholder", "bridge_internal_acceleration"}},//special calc required - {"Ironing", {"top_infill_extrusion_width", "ironing_acceleration"}}, - {"OverhangPerimeter", {"overhangs_width", "overhangs_acceleration"}}, - {"Perimeter", {"perimeter_extrusion_width", "perimeter_acceleration"}}, - {"SolidInfill", {"solid_infill_extrusion_width", "solid_infill_acceleration"}}, - {"SupportMaterial", {"support_material_extrusion_width", "support_material_acceleration"}}, - {"SupportMaterialInterface", {"support_material_extrusion_width", "support_material_interface_acceleration"}}, - {"ThinWall", {"external_perimeter_extrusion_width", "thin_walls_acceleration"}}, - {"TopSolidInfill", {"top_infill_extrusion_width", "top_solid_infill_acceleration"}} - };*/ - - int countincrements = 0; - int sizeofarray = static_cast((end_pa - start_pa) / pa_increment) + 2;//'+2' needed for odd/even numbers - std::vector pa_values(sizeofarray); - std::vector c_pa_values_c(sizeofarray); - - double incremented_pa_value = start_pa; - while (incremented_pa_value <= end_pa + pa_increment / 2) {//this makes a number to be used to load x number of 90 bend models for the PA test. - if (incremented_pa_value <= end_pa) { - double rounded_Pa = std::round(incremented_pa_value * 1000000.0) / 1000000.0; - pa_values[countincrements] = rounded_Pa;//store PA numbers in array to be used later. - c_pa_values_c[countincrements] = rounded_Pa; - countincrements++; - incremented_pa_value += pa_increment; - } - else { - pa_values[countincrements] = end_pa; - countincrements++;//failsafe if werid input numbers are provided that can't add the "ending pa" number to the array. - break; } - - }// is there a limit of how many models SS can load ? might be good to set a failsafe just so it won't load 10k+ models... Plater* plat = this->main_frame->plater(); Model& model = plat->model(); @@ -340,79 +141,62 @@ struct ExtrusionSettings {// think a struct is better instead of all the maps ? } std::vector items; - for (size_t i = 0; i < nb_runs; i++){ + //for (size_t i = 0; i < nb_runs; i++){ + for (int i = 0; i < currentTestCount; i++) { items.emplace_back((boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "base_plate.3mf").string()); } std::vector objs_idx = plat->load_files(items, true, false, false, false); - assert(objs_idx.size() == nb_runs); + //assert(objs_idx.size() == nb_runs); + assert(objs_idx.size() == currentTestCount); const DynamicPrintConfig* print_config = this->gui_app->get_tab(Preset::TYPE_FFF_PRINT)->get_config(); const DynamicPrintConfig* filament_config = this->gui_app->get_tab(Preset::TYPE_FFF_FILAMENT)->get_config(); const DynamicPrintConfig* printer_config = this->gui_app->get_tab(Preset::TYPE_PRINTER)->get_config(); + + DynamicPrintConfig full_print_config; + full_print_config.apply(*print_config); + full_print_config.apply(*printer_config); + full_print_config.apply(*filament_config); // --- scale --- //models is created for nozzles from 0.1-2mm walls should be nozzle_size*4 spaced, scale xy model by widths down is futher + + GCodeFlavor flavor = printer_config->option>("gcode_flavor")->value; const ConfigOptionFloats* nozzle_diameter_config = printer_config->option("nozzle_diameter"); assert(nozzle_diameter_config->values.size() > 0); double nozzle_diameter = nozzle_diameter_config->values[0];//get extruderID too? - double first_layer_height = print_config->get_abs_value("first_layer_height", nozzle_diameter); - double base_layer_height = print_config->get_computed_value("layer_height",0); - GCodeFlavor flavor = printer_config->option>("gcode_flavor")->value; - + + double first_layer_height = full_print_config.get_computed_value("first_layer_height"); + double base_layer_height = full_print_config.get_computed_value("layer_height"); double er_width = print_config->get_abs_value("solid_infill_extrusion_width", nozzle_diameter); - double er_accel = print_config->get_abs_value("solid_infill_acceleration", nozzle_diameter); - double er_speed = print_config->get_abs_value("solid_infill_speed", nozzle_diameter); + double er_accel = full_print_config.get_computed_value("solid_infill_acceleration"); + double er_speed = full_print_config.get_computed_value("solid_infill_speed"); double er_spacing = print_config->get_abs_value("external_perimeter_extrusion_spacing",1.0); double default_er_width = print_config->get_abs_value("extrusion_width", nozzle_diameter); - double default_er_speed = print_config->get_abs_value("default_speed", nozzle_diameter); - double default_er_accel = print_config->get_abs_value("default_acceleration", nozzle_diameter); + double default_er_speed = full_print_config.get_computed_value("default_speed"); + double default_er_accel = full_print_config.get_computed_value("default_acceleration"); double default_er_spacing = print_config->get_abs_value("extrusion_spacing", nozzle_diameter); - double spacing_ratio = print_config->get_abs_value("perimeter_overlap",1.0); - double spacing_ratio_external = print_config->get_abs_value("external_perimeter_overlap",1.0); + double spacing_ratio = full_print_config.get_computed_value("perimeter_overlap"); + double spacing_ratio_external = full_print_config.get_computed_value("external_perimeter_overlap"); double filament_max_overlap = filament_config->get_computed_value("filament_max_overlap",0);//maybe check for extruderID ? - if (extrusion_role == "Verify") { - countincrements = 13; - er_width = default_er_width; - er_spacing = default_er_spacing; - er_width = er_width * 100 / nozzle_diameter; - er_width = std::round(er_width * 100.0) / 100.0; // Change number to percentage and round - } - else{ - for (int i = 0; i < sizeof(choice_extrusion_role) / sizeof(choice_extrusion_role[0]); i++) { - - if (er_width_ToOptionKey.find(extrusion_role) != er_width_ToOptionKey.end()) { - - er_width = print_config->get_abs_value(er_width_ToOptionKey[extrusion_role].c_str(), nozzle_diameter);//look at maps at match speed/width ect to the selecter ER role - er_speed = print_config->get_abs_value(er_speed_ToOptionKey[extrusion_role].c_str(), nozzle_diameter);//need to load this here?? - er_accel = print_config->get_abs_value(er_accel_ToOptionKey[extrusion_role].c_str(), nozzle_diameter);//need to load this here?? - er_spacing = print_config->get_abs_value(er_spacing_ToOptionKey[extrusion_role].c_str(), nozzle_diameter); - - //potential BUG if any of the values are 0 everything else would fail, need to pull the default value too and assign that? - if(er_width == 0){er_width =default_er_width; } - if(er_speed == 0){er_speed =default_er_speed; } - if(er_accel == 0){er_accel =default_er_accel; } - if(er_spacing == 0){er_spacing = default_er_spacing; } - - er_width = er_width * 100 / nozzle_diameter; - er_width = std::round(er_width * 100.0) / 100.0; - } else { - er_width = print_config->get_abs_value("solid_infill_extrusion_width", nozzle_diameter); //used for gapfill_width/bridges selection. TODO: add the bits for this here since gapfill/bridges need special calculations - er_width = er_width * 100 / nozzle_diameter; - er_width = std::round(er_width * 100.0) / 100.0; // Change number to percentage and round - } - - } - } + // --- translate --- + //bool autocenter = gui_app->app_config->get("autocenter") == "1"; + bool has_to_arrange = plat->config()->opt_float("init_z_rotate") != 0; + has_to_arrange = true; + + + /*if (!autocenter) { + 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, 5 * xyzScale - 5 }); + }*/ - //-- magical scaling is done here :) - //the 90_bend models need to be scaled correctly so there is no 'gapfill' since gapfill will effect results. - double xyzScale = nozzle_diameter / 0.4; - double er_width_to_scale = magical_scaling(nozzle_diameter,er_width,filament_max_overlap,spacing_ratio,spacing_ratio_external,base_layer_height,er_spacing); - //-- magical scaling - //std::vector < std::vector> pressure_tower; + std::vector < std::vector> pressure_tower; + bool smooth_time = false; std::string nozzle_diameter_str = std::to_string(nozzle_diameter); nozzle_diameter_str.erase(nozzle_diameter_str.find_last_not_of('0') + 2, std::string::npos); @@ -431,10 +215,102 @@ struct ExtrusionSettings {// think a struct is better instead of all the maps ? }*/ std::string bend_90_nozzle_size_3mf = "90_bend_" + nozzle_diameter_str + ".3mf"; + std::string extrusion_role = dynamicExtrusionRole[0]->GetValue().ToStdString(); + + for (int id_item = 0; id_item < currentTestCount; id_item++) { + //need to move this to another function..... + wxString firstPaValue = dynamicFirstPa[id_item]->GetValue(); + wxString startPaValue = dynamicStartPa[id_item]->GetValue(); + wxString endPaValue = dynamicEndPa[id_item]->GetValue(); + wxString paIncrementValue = dynamicPaIncrement[id_item]->GetValue(); + wxString erPaValue = dynamicExtrusionRole[id_item]->GetValue(); + smooth_time = dynamicEnableST[id_item]->GetValue(); + + double first_pa = wxAtof(firstPaValue); + double start_pa = wxAtof(startPaValue); + double end_pa = wxAtof(endPaValue); + double pa_increment = wxAtof(paIncrementValue); + extrusion_role = dynamicExtrusionRole[id_item]->GetValue().ToStdString(); + + int countincrements = 0; + int sizeofarray = static_cast((end_pa - start_pa) / pa_increment) + 2;//'+2' needed for odd/even numbers + std::vector pa_values(sizeofarray); + std::vector c_pa_values_c(sizeofarray); + + double incremented_pa_value = start_pa; + while (incremented_pa_value <= end_pa + pa_increment / 2) {//this makes a number to be used to load x number of 90 bend models for the PA test. + if (incremented_pa_value <= end_pa) { + double rounded_Pa = std::round(incremented_pa_value * 1000000.0) / 1000000.0; + pa_values[countincrements] = rounded_Pa;//store PA numbers in array to be used later. + c_pa_values_c[countincrements] = rounded_Pa; + countincrements++; + incremented_pa_value += pa_increment; + } + else { + pa_values[countincrements] = end_pa; + countincrements++;//failsafe if werid input numbers are provided that can't add the "ending pa" number to the array. + break; } - for (size_t id_item = 0; id_item < nb_runs; id_item++) { - - //pressure_tower.emplace_back(); + }// is there a limit of how many models SS can load ? might be good to set a failsafe just so it won't load 10k+ models... + + std::string set_advance_prefix =""; + if (gcfKlipper == flavor) { + if(smooth_time == false){ + set_advance_prefix = "SET_PRESSURE_ADVANCE ADVANCE="; + } + else{ + set_advance_prefix = "SET_PRESSURE_ADVANCE SMOOTH_TIME="; + } + } + else if (gcfMarlinFirmware == flavor) { + set_advance_prefix = "M900 K"; + } + else if(gcfRepRap == flavor){ + set_advance_prefix = "M572 S"; + } + + if (extrusion_role == "Verify") { + countincrements = 13; + er_width = default_er_width; + er_spacing = default_er_spacing; + er_width = er_width * 100 / nozzle_diameter; + er_width = std::round(er_width * 100.0) / 100.0; + } + else{ + for (int i = 0; i < sizeof(choice_extrusion_role) / sizeof(choice_extrusion_role[0]); i++) { + + if (er_width_ToOptionKey.find(extrusion_role) != er_width_ToOptionKey.end()) { + + //look at maps to match speed/width ect to the selected ER role + er_width = print_config->get_abs_value(er_width_ToOptionKey[extrusion_role].c_str(), nozzle_diameter);//look at maps to match speed/width ect to the selected ER role + er_speed = full_print_config.get_computed_value(er_speed_ToOptionKey[extrusion_role].c_str()); + er_accel = full_print_config.get_computed_value(er_accel_ToOptionKey[extrusion_role].c_str()); + er_spacing = print_config->get_abs_value(er_spacing_ToOptionKey[extrusion_role].c_str(), nozzle_diameter); + + //potential BUG if any of the values are 0 everything else would fail, need to pull the default value too and assign that? + if(er_width == 0){er_width =default_er_width; } + if(er_speed == 0){er_speed =default_er_speed; } + if(er_accel == 0){er_accel =default_er_accel; } + if(er_spacing == 0){er_spacing = default_er_spacing; } + + er_width = er_width * 100 / nozzle_diameter; + er_width = std::round(er_width * 100.0) / 100.0; + } else { + er_width = print_config->get_abs_value("solid_infill_extrusion_width", nozzle_diameter); //used for gapfill_width/bridges selection. TODO: add the bits for this here since gapfill/bridges need special calculations + er_width = er_width * 100 / nozzle_diameter; + er_width = std::round(er_width * 100.0) / 100.0; + + } + } + } + + //-- magical scaling is done here :) + //the 90_bend models need to be scaled correctly so there is no 'gapfill' since gapfill will effect results. + double xyzScale = nozzle_diameter / 0.4; + double er_width_to_scale = magical_scaling(nozzle_diameter,er_width,filament_max_overlap,spacing_ratio,spacing_ratio_external,base_layer_height,er_spacing); + //-- magical scaling + + pressure_tower.emplace_back(); double initial_model_height = 0.2; double initial_90_bend_x = 41.20;//fusion=41.200 mm @@ -481,20 +357,21 @@ struct ExtrusionSettings {// think a struct is better instead of all the maps ? if (er_width_ToOptionKey.find(role) != er_width_ToOptionKey.end()) { - er_width = std::round((print_config->get_abs_value(er_width_ToOptionKey[role].c_str(), nozzle_diameter) * 100 / nozzle_diameter) * 100.0) / 100.0; - er_spacing = print_config->get_abs_value(er_spacing_ToOptionKey[role].c_str(), nozzle_diameter); + er_width = std::round((full_print_config.get_computed_value(er_width_ToOptionKey[role].c_str(), nozzle_diameter) * 100 / nozzle_diameter) * 100.0) / 100.0; + er_spacing = full_print_config.get_computed_value(er_spacing_ToOptionKey[role].c_str(), nozzle_diameter); er_width_to_scale = magical_scaling(nozzle_diameter, er_width, filament_max_overlap, spacing_ratio, spacing_ratio_external, base_layer_height, er_spacing); thickness_offset = nozzle_diameter * er_width_to_scale * 2; add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "scaled_with_nozzle_size" / bend_90_nozzle_size_3mf).string(), Vec3d{ -0.8, (initial_90_bend_y/2) * nb_bends , (z_scale_factor/2) }, Vec3d{ er_width_to_scale, er_width_to_scale, z_scale_90_bend }); + pressure_tower.back().push_back(model.objects[objs_idx[id_item]]); Eigen::Vector3d modelPosition(-0.8, (initial_90_bend_y/2) * nb_bends, (z_scale_factor/2) ); bend_90_positions.push_back(modelPosition); nb_bends++; } - else{ + else{//ER role not found in map; ie not currently supported. er_width = std::round((default_er_width * 100 / nozzle_diameter) * 100.0) / 100.0; er_spacing = default_er_spacing; er_width_to_scale = magical_scaling(nozzle_diameter, er_width, filament_max_overlap, spacing_ratio, spacing_ratio_external, base_layer_height, er_spacing); @@ -503,6 +380,7 @@ struct ExtrusionSettings {// think a struct is better instead of all the maps ? add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "scaled_with_nozzle_size" / bend_90_nozzle_size_3mf).string(), Vec3d{ -0.8, (initial_90_bend_y/2) * nb_bends , (z_scale_factor/2) }, Vec3d{ er_width_to_scale, er_width_to_scale, z_scale_90_bend }); + pressure_tower.back().push_back(model.objects[objs_idx[id_item]]); Eigen::Vector3d modelPosition(-0.8, (initial_90_bend_y/2) * nb_bends, (z_scale_factor/2) ); bend_90_positions.push_back(modelPosition); @@ -513,12 +391,13 @@ struct ExtrusionSettings {// think a struct is better instead of all the maps ? } } else{//not verify - for (int nb_bends = 0; nb_bends < countincrements; nb_bends++){ + for (int nb_bends = 0; nb_bends < countincrements; nb_bends++){//TODO: BUG: need to fix this for the multi test plates. i should be able to have single if statement to change the "verify" role positions and only have a single 'add_part' fr the 90_bend model. //const double magical_transformation_y_pos = 10.47; add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "scaled_with_nozzle_size" / bend_90_nozzle_size_3mf).string(), Vec3d{ -0.8, double(nb_bends) * (thickness_offset*2) *2 , (z_scale_factor/2) }, Vec3d{ er_width_to_scale, er_width_to_scale, z_scale_90_bend }); + pressure_tower.back().push_back(model.objects[objs_idx[id_item]]); Eigen::Vector3d modelPosition(-0.8, double(nb_bends) * (thickness_offset*2) *2 , (z_scale_factor/2) ); bend_90_positions.push_back(modelPosition); @@ -583,10 +462,8 @@ struct ExtrusionSettings {// think a struct is better instead of all the maps ? // position in printer coords are half of scaled size! // scale model in percentage from original models xy values! - //---------- - } - //} + } if (extrusion_role != "Verify") {// possible to load the words for each ER role? if (nb_bends % 2 == 1) { // Skip generating every second number @@ -636,33 +513,17 @@ struct ExtrusionSettings {// think a struct is better instead of all the maps ? } } } - } - - - /// --- translate --- - //bool autocenter = gui_app->app_config->get("autocenter") == "1"; - bool has_to_arrange = plat->config()->opt_float("init_z_rotate") != 0; - if (nb_runs == 1) { - //model.objects[objs_idx[0]]->translate({ bed_min.x() + bed_size.x() / 2, bed_min.y() + bed_size.y() / 2, zscale_number }); - has_to_arrange = true; - } else { - has_to_arrange = true; - } - /*if (!autocenter) { - 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, 5 * xyzScale - 5 }); - }*/ - + } /// --- main config, modify object config when possible --- DynamicPrintConfig new_print_config = *print_config; DynamicPrintConfig new_printer_config = *printer_config; new_print_config.set_key_value("brim_width", new ConfigOptionFloat(0)); new_print_config.set_key_value("complete_objects", new ConfigOptionBool(false)); //true is required for multi tests on single plate. new_print_config.set_key_value("gap_fill_enabled", new ConfigOptionBool(true)); //should be false?, enabled for testing - new_print_config.set_key_value("top_solid_layers", new ConfigOptionInt(0)); //BUG: top layers set to 0 the top layer has a "void" where the top layer would normally be, this might be a config thing that needs to get changed or a slicing bug + new_print_config.set_key_value("top_solid_layers", new ConfigOptionInt(0)); + new_print_config.set_key_value("only_one_perimeter_top", new ConfigOptionBool(false)); + new_print_config.set_key_value("only_one_perimeter_first_layer", new ConfigOptionBool(true)); new_print_config.set_key_value("bottom_solid_layers", new ConfigOptionInt(1)); new_print_config.set_key_value("fill_density", new ConfigOptionPercent(0)); new_print_config.set_key_value("min_width_top_surface", new ConfigOptionFloatOrPercent(0.0,false)); @@ -671,14 +532,50 @@ struct ExtrusionSettings {// think a struct is better instead of all the maps ? new_print_config.set_key_value("avoid_crossing_perimeters", new ConfigOptionBool(false)); new_print_config.set_key_value("perimeter_overlap", new ConfigOptionPercent(100)); new_print_config.set_key_value("external_perimeter_overlap", new ConfigOptionPercent(100)); - new_print_config.set_key_value("per_objects_gcode", new ConfigOptionString(bend_90_nozzle_size_3mf+",")); // this is the model other parts in code will search for and insert the PA/ect numbers - - new_printer_config.set_key_value("before_layer_gcode", new ConfigOptionString("{if layer_num == 0} SET_PRESSURE_ADVANCE ADVANCE=" + std::to_string(first_pa) + " {endif}")); //maybe i can save the existing value into a variable then add to it ? + + //fix this later need to fix the loops + //new_printer_config.set_key_value("before_layer_gcode", new ConfigOptionString(std::string("{if layer_num == 0} ") + set_advance_prefix + std::to_string(first_pa) + " {endif}")); + + + //assert(filament_temp_item_name.size() == nb_runs); + //assert(model.objects.size() == nb_runs); + + for (int id_item = 0; id_item < currentTestCount; id_item++) { + + wxString firstPaValue = dynamicFirstPa[id_item]->GetValue(); + wxString startPaValue = dynamicStartPa[id_item]->GetValue(); + wxString endPaValue = dynamicEndPa[id_item]->GetValue(); + wxString paIncrementValue = dynamicPaIncrement[id_item]->GetValue(); + wxString erPaValue = dynamicExtrusionRole[id_item]->GetValue(); + smooth_time = dynamicEnableST[id_item]->GetValue(); + + double first_pa = wxAtof(firstPaValue); + double start_pa = wxAtof(startPaValue); + double end_pa = wxAtof(endPaValue); + double pa_increment = wxAtof(paIncrementValue); + extrusion_role = dynamicExtrusionRole[id_item]->GetValue().ToStdString(); + + int countincrements = 0; + int sizeofarray = static_cast((end_pa - start_pa) / pa_increment) + 2;//'+2' needed for odd/even numbers + std::vector pa_values(sizeofarray); + std::vector c_pa_values_c(sizeofarray); + + double incremented_pa_value = start_pa; + while (incremented_pa_value <= end_pa + pa_increment / 2) {//this makes a number to be used to load x number of 90 bend models for the PA test. + if (incremented_pa_value <= end_pa) { + double rounded_Pa = std::round(incremented_pa_value * 1000000.0) / 1000000.0; + pa_values[countincrements] = rounded_Pa;//store PA numbers in array to be used later. + c_pa_values_c[countincrements] = rounded_Pa; + countincrements++; + incremented_pa_value += pa_increment; + } + else { + pa_values[countincrements] = end_pa; + countincrements++;//failsafe if werid input numbers are provided that can't add the "ending pa" number to the array. + break; } - assert(filament_temp_item_name.size() == nb_runs); - assert(model.objects.size() == nb_runs); + }// is there a limit of how many models SS can load ? might be good to set a failsafe just so it won't load 10k+ models... - for (size_t i = 0; i < nb_runs; i++) { /* gcfRepRap, gcfSprinter, @@ -695,29 +592,29 @@ struct ExtrusionSettings {// think a struct is better instead of all the maps ? gcfSmoothie, gcfNoExtrusion*/ - //size_t num_part = 0; - //const int extra_vol = 1; - //for (ModelObject* part : pressure_tower[i]) {//loop though each part/volume and assign the modifers - - ModelObject *current_obj = model.objects[objs_idx[i]]; - for (int num_part = 1; num_part < countincrements+1; num_part++){ + size_t num_part = 0; + const int extra_vol = 1; + for (ModelObject* part : pressure_tower[id_item]) {//loop though each part/volume and assign the modifers std::string er_role =""; if (extrusion_role == "Verify") { er_role = choice_extrusion_role[num_part]; - if (er_width_ToOptionKey.find(er_role) != er_width_ToOptionKey.end()) { - - er_width = std::round((print_config->get_abs_value(er_width_ToOptionKey[er_role].c_str(), nozzle_diameter) * 100 / nozzle_diameter) * 100.0) / 100.0; - er_speed = print_config->get_abs_value(er_speed_ToOptionKey[er_role].c_str(), nozzle_diameter); - er_accel = print_config->get_abs_value(er_accel_ToOptionKey[er_role].c_str(), nozzle_diameter); - } - else{ - er_width = std::round((default_er_width * 100 / nozzle_diameter) * 100.0) / 100.0; - er_speed = default_er_speed; - er_accel = default_er_accel; - } + } + else{ + er_role = extrusion_role; + } + if (er_width_ToOptionKey.find(er_role) != er_width_ToOptionKey.end()) { + er_width = std::round((full_print_config.get_computed_value(er_width_ToOptionKey[er_role].c_str(), nozzle_diameter) * 100 / nozzle_diameter) * 100.0) / 100.0; + er_speed = full_print_config.get_computed_value(er_speed_ToOptionKey[er_role].c_str(), nozzle_diameter); + er_accel = full_print_config.get_computed_value(er_accel_ToOptionKey[er_role].c_str(), nozzle_diameter); + } + else{ + er_width = std::round((default_er_width * 100 / nozzle_diameter) * 100.0) / 100.0; + er_speed = default_er_speed; + er_accel = default_er_accel; } + std::string set_advance_prefix =""; if (gcfKlipper == flavor) { if(smooth_time == false){ @@ -739,51 +636,40 @@ struct ExtrusionSettings {// think a struct is better instead of all the maps ? er_accel = (er_accel == 0) ? default_er_accel : er_accel; /// --- custom config --- // this is for forcing each model to have x print modifiers - //current_obj->volumes[num_part]->config.set_key_value("print_retract_length", new ConfigOptionFloat(retraction_start + num_part * retraction_steps)); - current_obj->volumes[num_part]->config.set_key_value("perimeter_extrusion_width", new ConfigOptionFloatOrPercent(er_width, true)); - - /*model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("perimeter_extrusion_width", new ConfigOptionFloatOrPercent(er_width, true)); - model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("external_perimeter_extrusion_width", new ConfigOptionFloatOrPercent(er_width, true));//TODO: check widths and ect breaks if any values are in mm/percentage - model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("perimeter_speed", new ConfigOptionFloatOrPercent(er_speed, false)); - model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("external_perimeter_speed", new ConfigOptionFloatOrPercent(er_speed, false)); - model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("gap_fill_speed", new ConfigOptionFloatOrPercent(er_speed, false)); - model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("perimeter_acceleration", new ConfigOptionFloatOrPercent(er_accel, false)); - model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("external_perimeter_acceleration", new ConfigOptionFloatOrPercent(er_accel, false)); - model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("gap_fill_acceleration", new ConfigOptionFloatOrPercent(er_accel, false));*/ - - current_obj->volumes[num_part]->config.set_key_value("perimeter_extrusion_width", new ConfigOptionFloatOrPercent(er_width, true)); - current_obj->volumes[num_part]->config.set_key_value("external_perimeter_extrusion_width", new ConfigOptionFloatOrPercent(er_width, true));//TODO: check widths and ect breaks if any values are in mm/percentage - current_obj->volumes[num_part]->config.set_key_value("perimeter_speed", new ConfigOptionFloatOrPercent(er_speed, false)); - current_obj->volumes[num_part]->config.set_key_value("external_perimeter_speed", new ConfigOptionFloatOrPercent(er_speed, false)); - current_obj->volumes[num_part]->config.set_key_value("gap_fill_speed", new ConfigOptionFloatOrPercent(er_speed, false)); - current_obj->volumes[num_part]->config.set_key_value("perimeter_acceleration", new ConfigOptionFloatOrPercent(er_accel, false)); - current_obj->volumes[num_part]->config.set_key_value("external_perimeter_acceleration", new ConfigOptionFloatOrPercent(er_accel, false)); - current_obj->volumes[num_part]->config.set_key_value("gap_fill_acceleration", new ConfigOptionFloatOrPercent(er_accel, false)); + model.objects[objs_idx[id_item]]->volumes[num_part + extra_vol]->config.set_key_value("perimeter_extrusion_width", new ConfigOptionFloatOrPercent(er_width, true)); + model.objects[objs_idx[id_item]]->volumes[num_part + extra_vol]->config.set_key_value("external_perimeter_extrusion_width", new ConfigOptionFloatOrPercent(er_width, true));//TODO: check widths and ect breaks if any values are in mm/percentage + model.objects[objs_idx[id_item]]->volumes[num_part + extra_vol]->config.set_key_value("perimeter_speed", new ConfigOptionFloatOrPercent(er_speed, false)); + model.objects[objs_idx[id_item]]->volumes[num_part + extra_vol]->config.set_key_value("external_perimeter_speed", new ConfigOptionFloatOrPercent(er_speed, false)); + model.objects[objs_idx[id_item]]->volumes[num_part + extra_vol]->config.set_key_value("gap_fill_speed", new ConfigOptionFloatOrPercent(er_speed, false)); + model.objects[objs_idx[id_item]]->volumes[num_part + extra_vol]->config.set_key_value("perimeter_acceleration", new ConfigOptionFloatOrPercent(er_accel, false)); + model.objects[objs_idx[id_item]]->volumes[num_part + extra_vol]->config.set_key_value("external_perimeter_acceleration", new ConfigOptionFloatOrPercent(er_accel, false)); + model.objects[objs_idx[id_item]]->volumes[num_part + extra_vol]->config.set_key_value("gap_fill_acceleration", new ConfigOptionFloatOrPercent(er_accel, false)); if (extrusion_role == "Verify") { - //model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("per_objects_gcode", new ConfigOptionString(set_advance_prefix + " ; " + er_role ));//user manual type in values - current_obj->volumes[num_part]->config.set_key_value("per_objects_gcode", new ConfigOptionString(set_advance_prefix + " ; " + er_role ));//user manual type in values + model.objects[objs_idx[id_item]]->volumes[num_part + extra_vol]->config.set_key_value("region_gcode", new ConfigOptionString(set_advance_prefix + " ; " + er_role ));//user manual type in values + new_printer_config.set_key_value("before_layer_gcode", new ConfigOptionString(std::string("{if layer_num == 0} ") + set_advance_prefix + std::to_string(first_pa) + " {endif}")); } else{//add '\n' in? - //model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("per_objects_gcode", new ConfigOptionString(set_advance_prefix + std::to_string(pa_values[num_part]) + " ; " + extrusion_role )); - current_obj->volumes[num_part]->config.set_key_value("per_objects_gcode", new ConfigOptionString(set_advance_prefix + std::to_string(pa_values[num_part]) + " ; " + extrusion_role )); + model.objects[objs_idx[id_item]]->volumes[num_part + extra_vol]->config.set_key_value("region_gcode", new ConfigOptionString(set_advance_prefix + std::to_string(pa_values[num_part]) + " ; " + er_role )); + new_printer_config.set_key_value("before_layer_gcode", new ConfigOptionString(std::string("{if layer_num == 0} ") + set_advance_prefix + std::to_string(first_pa) + " {endif}")); } + num_part++; } - } - - //update plater - this->gui_app->get_tab(Preset::TYPE_FFF_PRINT)->load_config(new_print_config); - plat->on_config_change(new_print_config); - this->gui_app->get_tab(Preset::TYPE_PRINTER)->load_config(new_printer_config); - plat->on_config_change(new_printer_config); - plat->changed_objects(objs_idx); - this->gui_app->get_tab(Preset::TYPE_FFF_PRINT)->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(); - obj->update_after_undo_redo(); + + //update plater + this->gui_app->get_tab(Preset::TYPE_FFF_PRINT)->load_config(new_print_config); + plat->on_config_change(new_print_config); + this->gui_app->get_tab(Preset::TYPE_PRINTER)->load_config(new_printer_config); + plat->on_config_change(new_printer_config); + plat->changed_objects(objs_idx); + this->gui_app->get_tab(Preset::TYPE_FFF_PRINT)->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(); + obj->update_after_undo_redo(); + } // arrange if needed, after new settings, to take them into account // BUG:(borders don't slice. with 2+ generated models.) after updating to 2.5.59.11 the generating 2+ models they have "sinking label" have to click "drop to bed" to resolve, clicking "arrange" doesn't fix issue. @@ -801,7 +687,7 @@ struct ExtrusionSettings {// think a struct is better instead of all the maps ? if (extrusion_role != "Verify") {//don't auto slice so user can manual add PA values - //plat->reslice(); //forces a slice of plater. + plat->reslice(); //forces a slice of plater. } if (autocenter) { @@ -835,6 +721,153 @@ double CalibrationPressureAdvDialog::magical_scaling(double nozzle_diameter, dou return er_width_to_scale; } +void CalibrationPressureAdvDialog::create_buttons(wxStdDialogButtonSizer* buttons){ + const DynamicPrintConfig* printer_config = this->gui_app->get_tab(Preset::TYPE_PRINTER)->get_config(); + GCodeFlavor flavor = printer_config->option>("gcode_flavor")->value; + + std::string prefix = (gcfMarlinFirmware == flavor) ? " LA " : ((gcfKlipper == flavor || gcfRepRap == flavor) ? " PA " : "unsupported firmware type"); + + + if (prefix != "unsupported firmware type") { + + wxString number_of_runs[] = { "1", "2", "3", "4", "5" }; + nbRuns = new wxComboBox(this, wxID_ANY, wxString{ "1" }, wxDefaultPosition, wxDefaultSize, 5, number_of_runs); + nbRuns->SetToolTip(_L("Select the number of tests to generate, max 2 is recommended due to bed size limits")); + nbRuns->SetSelection(0); + nbRuns->Bind(wxEVT_COMBOBOX, &CalibrationPressureAdvDialog::on_row_change, this); + + dynamicSizer = new wxBoxSizer(wxVERTICAL); + buttons->Add(dynamicSizer, 1, wxEXPAND | wxALL, 5); + + wxBoxSizer* commonSizer = new wxBoxSizer(wxHORIZONTAL); + commonSizer->Add(new wxStaticText(this, wxID_ANY, _L("Number of tests: "))); + commonSizer->Add(nbRuns); + dynamicSizer->Add(commonSizer, 0, wxALL, 5); + currentTestCount = wxAtoi(nbRuns->GetValue()); + + + wxButton* bt = new wxButton(this, wxID_FILE1, _L("Generate")); + bt->Bind(wxEVT_BUTTON, &CalibrationPressureAdvDialog::create_geometry, this); + dynamicSizer->Add(bt, 0, wxALL, 5); + + create_row_controls(dynamicSizer, currentTestCount); + } else { + buttons->Add(new wxStaticText(this, wxID_ANY, _L(prefix))); + } + + //this->SetSizerAndFit(dynamicSizer); +} + +void CalibrationPressureAdvDialog::create_row_controls(wxBoxSizer* parent_sizer, int row_count) { + wxString choices_first_layerPA[] = { "0.025", "0.030", "0.035", "0.040", "0.045", "0.050" }; + wxString choices_start_PA[] = { "0.0", "0.010", "0.020", "0.030", "0.040", "0.050" }; + wxString choices_end_PA[] = { "0.10", "0.20", "0.30", "0.40", "0.50", "0.60", "0.70", "0.80", "0.90", "1.00" }; + wxString choices_increment_PA[] = { "0.0010", "0.0025", "0.0035", "0.005", "0.006", "0.007", "0.01", "0.1" }; + wxString choices_extrusion_role[] = { + "InternalInfill", "BridgeInfill", "ExternalPerimeter", "GapFill", "InternalBridgeInfill", + "Ironing", "OverhangPerimeter", "Perimeter", "SolidInfill", "SupportMaterial", + "SupportMaterialInterface", "ThinWall", "TopSolidInfill", "FirstLayer", "Verify" + }; + const DynamicPrintConfig* printer_config = this->gui_app->get_tab(Preset::TYPE_PRINTER)->get_config(); + GCodeFlavor flavor = printer_config->option>("gcode_flavor")->value; + std::string prefix = (gcfMarlinFirmware == flavor) ? " LA " : ((gcfKlipper == flavor || gcfRepRap == flavor) ? " PA " : "unsupported firmware type"); + + for (int i = 0; i < row_count; i++) { + wxBoxSizer* rowSizer = new wxBoxSizer(wxHORIZONTAL); + + wxComboBox* firstPaCombo = new wxComboBox(this, wxID_ANY, wxString{ "0.040" }, wxDefaultPosition, wxDefaultSize, 6, choices_first_layerPA); + //rowSizer->Add(new wxStaticText(this, wxID_ANY, _L( prefix + " Test " + std::to_string(i) + ": " ))); rowSizer->AddSpacer(5); + rowSizer->Add(new wxStaticText(this, wxID_ANY, _L("First Layers" + prefix + "value: "))); + firstPaCombo->SetToolTip(_L("Select the first layer" + prefix +" value to be used for the first layer only.")); + firstPaCombo->SetSelection(3); + rowSizer->Add(firstPaCombo); + dynamicFirstPa.push_back(firstPaCombo); + + rowSizer->AddSpacer(15); + + wxComboBox* startPaCombo = new wxComboBox(this, wxID_ANY, wxString{ "0.0" }, wxDefaultPosition, wxDefaultSize, 6, choices_start_PA); + rowSizer->Add(new wxStaticText(this, wxID_ANY, _L("Starting" + prefix + "value: "))); + startPaCombo->SetToolTip(_L("Select the starting " + prefix + " value to be used.")); + startPaCombo->SetSelection(0); + rowSizer->Add(startPaCombo); + dynamicStartPa.push_back(startPaCombo); + + rowSizer->AddSpacer(15); + + wxComboBox* endPaCombo = new wxComboBox(this, wxID_ANY, wxString{ "0.10" }, wxDefaultPosition, wxDefaultSize, 10, choices_end_PA); + rowSizer->Add(new wxStaticText(this, wxID_ANY, _L("Ending" + prefix + "value: "))); + endPaCombo->SetToolTip(_L("Select the ending " + prefix + " value to be used.")); + endPaCombo->SetSelection(0); + rowSizer->Add(endPaCombo); + dynamicEndPa.push_back(endPaCombo); + + rowSizer->AddSpacer(15); + + wxComboBox* paIncrementCombo = new wxComboBox(this, wxID_ANY, wxString{ "0.005" }, wxDefaultPosition, wxDefaultSize, 8, choices_increment_PA); + rowSizer->Add(new wxStaticText(this, wxID_ANY, _L(prefix + "increments: "))); + paIncrementCombo->SetToolTip(_L("Select the " + prefix + " increment amount.")); + paIncrementCombo->SetSelection(3); + rowSizer->Add(paIncrementCombo); + dynamicPaIncrement.push_back(paIncrementCombo); + + rowSizer->AddSpacer(15); + + wxComboBox* erPaCombo = new wxComboBox(this, wxID_ANY, wxString{ "InternalInfill" }, wxDefaultPosition, wxDefaultSize, 15, choices_extrusion_role); + rowSizer->Add(new wxStaticText(this, wxID_ANY, _L("Extrusion role: "))); + erPaCombo->SetToolTip(_L("Select the extrusion role you want to generate a calibration for")); + erPaCombo->SetSelection(0); + rowSizer->Add(erPaCombo); + dynamicExtrusionRole.push_back(erPaCombo); + + if (prefix == " PA ") {//klipper only feature ? + rowSizer->AddSpacer(15); + wxCheckBox* enableST = new wxCheckBox(this, wxID_ANY, _L(""), wxDefaultPosition, wxDefaultSize); + enableST->SetToolTip(_L("Generate smooth time values")); + enableST->SetValue(false); + rowSizer->Add(new wxStaticText(this, wxID_ANY, _L("Smooth time: "))); + rowSizer->Add(enableST); + dynamicEnableST.push_back(enableST); + } + + parent_sizer->Add(rowSizer, 0, wxALL, 5); + dynamicRowcount.push_back(rowSizer); + } +} + +void CalibrationPressureAdvDialog::on_row_change(wxCommandEvent& event) { + int new_test_count = wxAtoi(nbRuns->GetValue()); + + wxSize auto_size = GetSize(); + //wxSize auto_size = DoGetBestSize(); + + if (new_test_count > currentTestCount) { + create_row_controls(dynamicSizer, new_test_count - currentTestCount); + } else if (new_test_count < currentTestCount) { + for (int i = currentTestCount - 1; i >= new_test_count; --i) { + wxBoxSizer* row = dynamicRowcount.back(); + dynamicSizer->Detach(row); + row->Clear(true); + delete row; + dynamicRowcount.pop_back(); + dynamicFirstPa.pop_back(); + dynamicStartPa.pop_back(); + dynamicEndPa.pop_back(); + dynamicPaIncrement.pop_back(); + dynamicExtrusionRole.pop_back(); + dynamicEnableST.pop_back(); + } + } + + currentTestCount = new_test_count; + dynamicSizer->Layout(); + this->Fit(); + + //this->SetSize(1600,600); + this->SetSize(auto_size); //makes GUI flash on updating + +} + + } // namespace GUI } // namespace Slic3r #pragma optimize("", on) \ No newline at end of file diff --git a/src/slic3r/GUI/CalibrationPressureAdvDialog.hpp b/src/slic3r/GUI/CalibrationPressureAdvDialog.hpp index 4521e07daba..2516661a104 100644 --- a/src/slic3r/GUI/CalibrationPressureAdvDialog.hpp +++ b/src/slic3r/GUI/CalibrationPressureAdvDialog.hpp @@ -11,24 +11,31 @@ class CalibrationPressureAdvDialog : public CalibrationAbstractDialog public: CalibrationPressureAdvDialog(GUI_App* app, MainFrame* mainframe) : CalibrationAbstractDialog(app, mainframe, "Pressure calibration") - { create(boost::filesystem::path("calibration") / "filament_pressure", "filament_pressure.html", wxSize(1600, 600)); Centre(wxBOTH);} + { create(boost::filesystem::path("calibration") / "filament_pressure", "filament_pressure.html", wxSize(1600, 600)); Centre(wxBOTH); currentTestCount = 1; } virtual ~CalibrationPressureAdvDialog(){ } + protected: void create_buttons(wxStdDialogButtonSizer* sizer) override; + void create_row_controls(wxBoxSizer* parent_sizer, int row_count); void create_geometry(wxCommandEvent& event_args); + void on_row_change(wxCommandEvent& event); + double calc_PA_values(double, double, double); double magical_scaling(double, double, double, double, double, double, double ); //i've set choice boxes for now just to save me typing numbers in when i want to test it :) - wxComboBox* firstPa; //first layer PA -user manual entry - wxComboBox* startPa; //starting PA value -user manual entry - //wxTextCtrl* firstPa; //edit to suit for manual data entry, - wxComboBox* endPa; //ending PA value -user manual entry - wxComboBox* paIncrement;//increment PA by this value -user manual entry~~ or have drop down box ? - wxComboBox* erPa; //extrusion role Pressure/Linear Advance -user choice select wxComboBox* nbRuns; - wxCheckBox* enableST; // checkbox for "smooth_time" - klipper only feature? + std::vector dynamicFirstPa; //first layer PA -user manual entry + std::vector dynamicStartPa; //starting PA value -user manual entry + std::vector dynamicEndPa; //ending PA value -user manual entry + std::vector dynamicPaIncrement; //increment PA by this value -user manual entry~~ or have drop down box ? + std::vector dynamicExtrusionRole;//extrusion role Pressure/Linear Advance -user choice select + std::vector dynamicEnableST; // checkbox for "smooth_time" - klipper only feature? + std::vector dynamicRowcount; // To keep track of dynamically created rows + + wxBoxSizer* dynamicSizer; + int currentTestCount; }; } // namespace GUI From b22b846250bfd0396c5bc39af437a8f8313c8d73 Mon Sep 17 00:00:00 2001 From: legend069 <40685552+legend069@users.noreply.github.com> Date: Thu, 11 Jul 2024 23:55:26 +1000 Subject: [PATCH 21/28] updated with master updated to master, adjusted pressure calibration max tests to 10 --- resources/ui_layout/default/print.ui | 2 +- resources/ui_layout/example/print.ui | 2 +- src/libslic3r/GCode/WipeTower.cpp | 2 +- src/libslic3r/Layer.cpp | 2 +- src/libslic3r/PrintConfig.hpp | 1 + src/slic3r/GUI/CalibrationPressureAdvDialog.cpp | 10 +++++----- 6 files changed, 10 insertions(+), 9 deletions(-) diff --git a/resources/ui_layout/default/print.ui b/resources/ui_layout/default/print.ui index a68d3b30282..e601cfcdc42 100644 --- a/resources/ui_layout/default/print.ui +++ b/resources/ui_layout/default/print.ui @@ -384,7 +384,7 @@ group:label_width$9:sidetext_width$8:Acceleration control (advanced) setting:width$4:brim_acceleration line:Bridge acceleration setting:width$4:bridge_acceleration - setting:width$4:bridge_internal_acceleration + setting:width$4:internal_bridge_acceleration setting:width$4:overhangs_acceleration line:Other extrusions acceleration setting:width$4:gap_fill_acceleration diff --git a/resources/ui_layout/example/print.ui b/resources/ui_layout/example/print.ui index ec30f3a0aa2..e5abd9b14f7 100644 --- a/resources/ui_layout/example/print.ui +++ b/resources/ui_layout/example/print.ui @@ -366,7 +366,7 @@ group:label_width$9:sidetext_width$8:Acceleration control (advanced) setting:width$4:brim_acceleration line:Bridge acceleration setting:width$4:bridge_acceleration - setting:width$4:bridge_internal_acceleration + setting:width$4:internal_bridge_acceleration setting:width$4:overhangs_acceleration line:Other extrusions acceleration setting:width$4:gap_fill_acceleration diff --git a/src/libslic3r/GCode/WipeTower.cpp b/src/libslic3r/GCode/WipeTower.cpp index a5ab786a570..504797f7ee3 100644 --- a/src/libslic3r/GCode/WipeTower.cpp +++ b/src/libslic3r/GCode/WipeTower.cpp @@ -654,7 +654,7 @@ WipeTower::WipeTower(const PrintConfig& config, const PrintObjectConfig& default } // Read absolute value of first layer speed, if given as percentage, // it is taken over wipe_tower_speed. - m_first_layer_speed = config.first_layer_speed.get_abs_value(m_speed); + m_first_layer_speed = default_object_config.first_layer_speed.get_abs_value(m_speed); if (m_first_layer_speed == 0.f) { // just to make sure autospeed doesn't break it. m_first_layer_speed = m_speed; } diff --git a/src/libslic3r/Layer.cpp b/src/libslic3r/Layer.cpp index ce5082f02be..9ec108ce426 100644 --- a/src/libslic3r/Layer.cpp +++ b/src/libslic3r/Layer.cpp @@ -230,7 +230,7 @@ void Layer::make_perimeters() && config.fuzzy_skin_point_dist == other_config.fuzzy_skin_point_dist /*&& config.bridge_acceleration == other_config.bridge_acceleration - && config.bridge_internal_acceleration == other_config.bridge_internal_acceleration + && config.internal_bridge_acceleration == other_config.internal_bridge_acceleration && config.brim_acceleration == other_config.brim_acceleration && config.default_acceleration == other_config.default_acceleration && config.external_perimeter_acceleration == other_config.external_perimeter_acceleration diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 5361c93ffdd..f647006ffc4 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -1217,6 +1217,7 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( ((ConfigOptionPercents, filament_shrink)) ((ConfigOptionInts, first_layer_bed_temperature)) ((ConfigOptionInts, first_layer_temperature)) + //((ConfigOptionFloatOrPercent, first_layer_speed)) ((ConfigOptionInts, full_fan_speed_layer)) ((ConfigOptionInts, gap_fill_fan_speed)) ((ConfigOptionInts, infill_fan_speed)) diff --git a/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp b/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp index bba032fcf63..827a3c9b6b6 100644 --- a/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp +++ b/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp @@ -81,7 +81,7 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { {"BridgeInfill", "bridge_acceleration"}, {"ExternalPerimeter", "external_perimeter_acceleration"}, {"GapFill", "gap_fill_acceleration"}, - {"InternalBridgeInfill", "bridge_internal_acceleration"}, + {"InternalBridgeInfill", "internal_bridge_acceleration"}, {"Ironing", "ironing_acceleration"}, {"OverhangPerimeter", "overhangs_acceleration"}, {"Perimeter", "perimeter_acceleration"}, @@ -730,8 +730,8 @@ void CalibrationPressureAdvDialog::create_buttons(wxStdDialogButtonSizer* button if (prefix != "unsupported firmware type") { - wxString number_of_runs[] = { "1", "2", "3", "4", "5" }; - nbRuns = new wxComboBox(this, wxID_ANY, wxString{ "1" }, wxDefaultPosition, wxDefaultSize, 5, number_of_runs); + wxString number_of_runs[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" }; + nbRuns = new wxComboBox(this, wxID_ANY, wxString{ "1" }, wxDefaultPosition, wxDefaultSize, 10, number_of_runs); nbRuns->SetToolTip(_L("Select the number of tests to generate, max 2 is recommended due to bed size limits")); nbRuns->SetSelection(0); nbRuns->Bind(wxEVT_COMBOBOX, &CalibrationPressureAdvDialog::on_row_change, this); @@ -742,13 +742,13 @@ void CalibrationPressureAdvDialog::create_buttons(wxStdDialogButtonSizer* button wxBoxSizer* commonSizer = new wxBoxSizer(wxHORIZONTAL); commonSizer->Add(new wxStaticText(this, wxID_ANY, _L("Number of tests: "))); commonSizer->Add(nbRuns); - dynamicSizer->Add(commonSizer, 0, wxALL, 5); + dynamicSizer->Add(commonSizer, 0, wxALL, 10); currentTestCount = wxAtoi(nbRuns->GetValue()); wxButton* bt = new wxButton(this, wxID_FILE1, _L("Generate")); bt->Bind(wxEVT_BUTTON, &CalibrationPressureAdvDialog::create_geometry, this); - dynamicSizer->Add(bt, 0, wxALL, 5); + dynamicSizer->Add(bt, 0, wxALL, 10); create_row_controls(dynamicSizer, currentTestCount); } else { From 4e18c6a7e3487e86c7744bee8778583f96decae6 Mon Sep 17 00:00:00 2001 From: legend069 <40685552+legend069@users.noreply.github.com> Date: Thu, 13 Jun 2024 08:05:01 +0200 Subject: [PATCH 22/28] CalibrationPressureAdvDialog: patches for beta v1.00 large improvements. now possible to config multi-plate testing changed default values for test. cleaned code up a fair bit found //BUG: custom gcode 'between extrusion role changes' should that be before or after region gcode? adjusted scale in z for the 90_bend models so print would be slightly quicker. found a couple new bugs with merge regarding the auto arrange everything else seems to be ok. --- src/libslic3r/BuildVolume.cpp | 3 +- .../GUI/CalibrationPressureAdvDialog.cpp | 67 ++++++++++--------- 2 files changed, 37 insertions(+), 33 deletions(-) diff --git a/src/libslic3r/BuildVolume.cpp b/src/libslic3r/BuildVolume.cpp index c580e6f876e..31e853cdb79 100644 --- a/src/libslic3r/BuildVolume.cpp +++ b/src/libslic3r/BuildVolume.cpp @@ -238,7 +238,8 @@ BuildVolume::ObjectState object_state_templ(const indexed_triangle_set &its, con const stl_vertex p2 = trafo * its.vertices[tri(iedge)]; assert(sign(p1) == s[iprev]); assert(sign(p2) == s[iedge]); - assert(p1.z() * p2.z() < 0); + assert(p1.z() * p2.z() <= 0); + assert(std::abs(p2.z() - p1.z()) > EPSILON); // Edge crosses the z plane. Calculate intersection point with the plane. const float t = (world_min_z - p1.z()) / (p2.z() - p1.z()); (is_inside(Vec3f(p1.x() + (p2.x() - p1.x()) * t, p1.y() + (p2.y() - p1.y()) * t, world_min_z)) ? inside : outside) = true; diff --git a/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp b/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp index 827a3c9b6b6..42f2ecfbff3 100644 --- a/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp +++ b/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp @@ -162,8 +162,8 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { GCodeFlavor flavor = printer_config->option>("gcode_flavor")->value; const ConfigOptionFloats* nozzle_diameter_config = printer_config->option("nozzle_diameter"); - assert(nozzle_diameter_config->values.size() > 0); - double nozzle_diameter = nozzle_diameter_config->values[0];//get extruderID too? + assert(nozzle_diameter_config->size() > 0); + double nozzle_diameter = nozzle_diameter_config->get_at(0);//get extruderID too? double first_layer_height = full_print_config.get_computed_value("first_layer_height"); double base_layer_height = full_print_config.get_computed_value("layer_height"); @@ -515,31 +515,20 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { } } - /// --- main config, modify object config when possible --- + /// --- main config --- + // => settings that are for object or region should be added to the model (see below, in the for loop), not here DynamicPrintConfig new_print_config = *print_config; DynamicPrintConfig new_printer_config = *printer_config; - new_print_config.set_key_value("brim_width", new ConfigOptionFloat(0)); - new_print_config.set_key_value("complete_objects", new ConfigOptionBool(false)); //true is required for multi tests on single plate. - new_print_config.set_key_value("gap_fill_enabled", new ConfigOptionBool(true)); //should be false?, enabled for testing - new_print_config.set_key_value("top_solid_layers", new ConfigOptionInt(0)); - new_print_config.set_key_value("only_one_perimeter_top", new ConfigOptionBool(false)); - new_print_config.set_key_value("only_one_perimeter_first_layer", new ConfigOptionBool(true)); - new_print_config.set_key_value("bottom_solid_layers", new ConfigOptionInt(1)); - new_print_config.set_key_value("fill_density", new ConfigOptionPercent(0)); - new_print_config.set_key_value("min_width_top_surface", new ConfigOptionFloatOrPercent(0.0,false)); - new_print_config.set_key_value("bottom_fill_pattern", new ConfigOptionEnum(ipMonotonicWGapFill)); - new_print_config.set_key_value("seam_position", new ConfigOptionEnum(spRear)); //BUG: should be fixed in 2.7 merge/SS 2.5.59.7, when this is changed the "perimeters & shell" doesn't turn red indicating a change. new_print_config.set_key_value("avoid_crossing_perimeters", new ConfigOptionBool(false)); - new_print_config.set_key_value("perimeter_overlap", new ConfigOptionPercent(100)); - new_print_config.set_key_value("external_perimeter_overlap", new ConfigOptionPercent(100)); - + new_print_config.set_key_value("complete_objects", new ConfigOptionBool(false)); //true is required for multi tests on single plate. + //fix this later need to fix the loops //new_printer_config.set_key_value("before_layer_gcode", new ConfigOptionString(std::string("{if layer_num == 0} ") + set_advance_prefix + std::to_string(first_pa) + " {endif}")); //assert(filament_temp_item_name.size() == nb_runs); //assert(model.objects.size() == nb_runs); - + assert(objs_idx.size() == currentTestCount); for (int id_item = 0; id_item < currentTestCount; id_item++) { wxString firstPaValue = dynamicFirstPa[id_item]->GetValue(); @@ -592,6 +581,20 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { gcfSmoothie, gcfNoExtrusion*/ + // config for the this model + model.objects[objs_idx[id_item]]->config.set_key_value("bottom_fill_pattern", new ConfigOptionEnum(ipMonotonicWGapFill)); + model.objects[objs_idx[id_item]]->config.set_key_value("bottom_solid_layers", new ConfigOptionInt(1)); + model.objects[objs_idx[id_item]]->config.set_key_value("brim_width", new ConfigOptionFloat(0)); + model.objects[objs_idx[id_item]]->config.set_key_value("external_perimeter_overlap", new ConfigOptionPercent(100)); + model.objects[objs_idx[id_item]]->config.set_key_value("fill_density", new ConfigOptionPercent(0)); + model.objects[objs_idx[id_item]]->config.set_key_value("gap_fill_enabled", new ConfigOptionBool(true)); //should be false?, enabled for testing + model.objects[objs_idx[id_item]]->config.set_key_value("min_width_top_surface", new ConfigOptionFloatOrPercent(0.0,false)); + model.objects[objs_idx[id_item]]->config.set_key_value("only_one_perimeter_top", new ConfigOptionBool(false)); + model.objects[objs_idx[id_item]]->config.set_key_value("only_one_perimeter_first_layer", new ConfigOptionBool(true)); + model.objects[objs_idx[id_item]]->config.set_key_value("perimeter_overlap", new ConfigOptionPercent(100)); + model.objects[objs_idx[id_item]]->config.set_key_value("seam_position", new ConfigOptionEnum(spRear)); //BUG: should be fixed in 2.7 merge/SS 2.5.59.7, when this is changed the "perimeters & shell" doesn't turn red indicating a change. + model.objects[objs_idx[id_item]]->config.set_key_value("top_solid_layers", new ConfigOptionInt(0)); + size_t num_part = 0; const int extra_vol = 1; for (ModelObject* part : pressure_tower[id_item]) {//loop though each part/volume and assign the modifers @@ -655,22 +658,23 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { } num_part++; } - - //update plater - this->gui_app->get_tab(Preset::TYPE_FFF_PRINT)->load_config(new_print_config); - plat->on_config_change(new_print_config); - this->gui_app->get_tab(Preset::TYPE_PRINTER)->load_config(new_printer_config); - plat->on_config_change(new_printer_config); - plat->changed_objects(objs_idx); - this->gui_app->get_tab(Preset::TYPE_FFF_PRINT)->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(); - obj->update_after_undo_redo(); } + //update plater + this->gui_app->get_tab(Preset::TYPE_FFF_PRINT)->load_config(new_print_config); + plat->on_config_change(new_print_config); + this->gui_app->get_tab(Preset::TYPE_PRINTER)->load_config(new_printer_config); + plat->on_config_change(new_printer_config); + for (size_t obj_idx : objs_idx) { model.objects[obj_idx]->ensure_on_bed(); } // put at the correct z (kind of arrange-z)) + plat->changed_objects(objs_idx); + this->gui_app->get_tab(Preset::TYPE_FFF_PRINT)->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(); + obj->update_after_undo_redo(); + // arrange if needed, after new settings, to take them into account // BUG:(borders don't slice. with 2+ generated models.) after updating to 2.5.59.11 the generating 2+ models they have "sinking label" have to click "drop to bed" to resolve, clicking "arrange" doesn't fix issue. // BUG: disovered manually moving the model in z lettting it drop down, then trying to slice can make it crash - (exception thrown 3073 - gcode.cpp) @@ -685,7 +689,6 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { arranger.finalize(); } - if (extrusion_role != "Verify") {//don't auto slice so user can manual add PA values plat->reslice(); //forces a slice of plater. } From d0ac7530d2883797d1521876a5db94b77766f083 Mon Sep 17 00:00:00 2001 From: legend069 <40685552+legend069@users.noreply.github.com> Date: Tue, 23 Jul 2024 18:07:16 +1000 Subject: [PATCH 23/28] files update found issue with origin point on exported models. adjusted numbers model to be 1 line width prev was x2 line width set sizes to exact numbers --- resources/calibration/filament_pressure/0.3mf | Bin 1846 -> 1834 bytes resources/calibration/filament_pressure/1.3mf | Bin 1645 -> 1650 bytes resources/calibration/filament_pressure/2.3mf | Bin 1981 -> 1979 bytes resources/calibration/filament_pressure/3.3mf | Bin 1994 -> 1972 bytes resources/calibration/filament_pressure/4.3mf | Bin 1904 -> 1888 bytes resources/calibration/filament_pressure/5.3mf | Bin 2002 -> 1984 bytes resources/calibration/filament_pressure/6.3mf | Bin 2009 -> 2013 bytes resources/calibration/filament_pressure/7.3mf | Bin 1737 -> 1736 bytes resources/calibration/filament_pressure/8.3mf | Bin 2042 -> 2021 bytes resources/calibration/filament_pressure/9.3mf | Bin 2003 -> 2004 bytes .../filament_pressure/pa_border.3mf | Bin 1672 -> 1662 bytes .../calibration/filament_pressure/point.3mf | Bin 1642 -> 1654 bytes .../scaled_with_nozzle_size/90_bend_0.10.3mf | Bin 1882 -> 1849 bytes .../scaled_with_nozzle_size/90_bend_0.20.3mf | Bin 1880 -> 1857 bytes .../scaled_with_nozzle_size/90_bend_0.30.3mf | Bin 1875 -> 1882 bytes .../scaled_with_nozzle_size/90_bend_0.40.3mf | Bin 1868 -> 1886 bytes .../scaled_with_nozzle_size/90_bend_0.50.3mf | Bin 1891 -> 1889 bytes .../scaled_with_nozzle_size/90_bend_0.60.3mf | Bin 1896 -> 1892 bytes .../scaled_with_nozzle_size/90_bend_0.70.3mf | Bin 1896 -> 1894 bytes .../scaled_with_nozzle_size/90_bend_0.80.3mf | Bin 1891 -> 1895 bytes .../scaled_with_nozzle_size/90_bend_0.90.3mf | Bin 1899 -> 1887 bytes .../scaled_with_nozzle_size/90_bend_1.00.3mf | Bin 1895 -> 1882 bytes .../scaled_with_nozzle_size/90_bend_1.10.3mf | Bin 1908 -> 1880 bytes .../scaled_with_nozzle_size/90_bend_1.20.3mf | Bin 1904 -> 1885 bytes .../scaled_with_nozzle_size/90_bend_1.30.3mf | Bin 1905 -> 1887 bytes .../scaled_with_nozzle_size/90_bend_1.40.3mf | Bin 1894 -> 1880 bytes .../scaled_with_nozzle_size/90_bend_1.50.3mf | Bin 1894 -> 1891 bytes .../scaled_with_nozzle_size/90_bend_1.60.3mf | Bin 1895 -> 1883 bytes .../scaled_with_nozzle_size/90_bend_1.70.3mf | Bin 1898 -> 1882 bytes .../scaled_with_nozzle_size/90_bend_1.80.3mf | Bin 1904 -> 1879 bytes .../scaled_with_nozzle_size/90_bend_1.90.3mf | Bin 1894 -> 1883 bytes .../scaled_with_nozzle_size/90_bend_2.00.3mf | Bin 1890 -> 1881 bytes 32 files changed, 0 insertions(+), 0 deletions(-) diff --git a/resources/calibration/filament_pressure/0.3mf b/resources/calibration/filament_pressure/0.3mf index f18107e0e8281f4ecefcd353be1ad3d275b1cf12..138817b8e9c8d17e5fe62d48873154d142c2fbca 100644 GIT binary patch delta 995 zcmV<9104Le4yq1+P)h>@EdT%j2mk;8005aaW*-0l|NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5CGc@000000037500000006aDOK+P%5I(0;|HEo~#ypL|g5**~>ZMZE zy4Q-wIHBTU!D1!-^__uT8(J+cmEs)i-TmhK=Cv@19$u<{lAWRLil&aay|FlhI&1Qx zeu{Z7jz+*A?%%(QswRh$A-L{h{w&04Z<<~93{}!?sv>Kft~rWL)>NjOS4rI;lT7q2 zvY1)Zg6UZH*0dbX`nnJ?uZprPDiF|e;@p=B$w6%#z7898x35;pR0*;bNqLnToZX*R z@|@Zx?=yja>5xpm@+e)<NOKi4a9L#J?NjADvp8!>*Jhn8cm(r^{A4)Irv_kTtb{ zT2OSMX?Yy0dlz9Xk~|R!tCI?1{;d!ta3)?)xcKrJ_c%MX&_R2~4V&M8cYf4;m15sS zrm`J~5Y+T-1|6-Ccb_$7(>}FLe_}-*b7#=Ip0MG6Jmw!Bef)DDAGtYNnp4wpt4V)C zCI%XtOHZ+1M=ys4MKAY5li&r>^3Axw?XvI4_P!7&0W$PLf)eaE-b<96pEdUOfD z>l|KUZe6^C?s*VJPw{q84abP?XN z1--3L6(vt^lSP{^A=$`eMTFOHO!t%~vJWR4>kO-7M98}*{JFUtHfeg$3_SZ)YL>bRES<|P)h>@EdT%j2mk;8006`v#(Dq$|NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5CB>X00000003hH00000005m=U2mH(6n*Zb{RiYd12$iQ2-=sa(q1M_ zTYrEtPRqnc1SV?t>vyj)P14mgnevceAD?sXhv{v8_uMvr&Or`i-FF3H9wm`VS{0Ky`0&s0FXM;!ej~S&(0~Y9w*g%N`zne1|pS><2l@;Q$Ma+;&r2Leu2_a!|7X zqMrsKM|=X(t>~M6cpUm^@6=U60xfpjarAyczT78&@Conli9et8Pmj(^efe7orD+&3 zHlbN(i@H0(;`ZU;+t-4KB;JK`7rP-%g&PHdaMLK0Zd_K8%-DuiX$1=o@K>3Fnvo70lrS0Ls*dTw2{wnuycZg zKO)D5Kf^^c4pN7FaKkM)*g-ynv+Kf}A8|;33w-e2weZ2t3C^yIfdU`W0-rq&*g3)3 zb<-J_&3p{#Ee3H585bl(ZbKSvqy~@7o*djl&IP%mZtB928%b9(WJ>c2wd-RnAkR#7 z*h)-T=u@a&-&7LGE-KLiTnWh}6cI>i56I+m0j{KeLE<;&)1G=0kI}v$M+?$Ux%AS1 zhw+%In{J14Sz68%(%|gEOTkUhKyM+`ErIo(kt>a1EShR#)7dCZ6%7)4-U2jN(%|eK z4Gs-J1y7Qb`^ziMj2t*(nQYapp!*!re^p zjT^C&#&MXiG=m{d4{5cMtuyoDJOoKBTc#)(%Q%oJcWEVeZY0ahO*a*F6G}I6$s?Ge z(s^LZeJu}!;1>T;fM0(BvzY@k0tCb##(9&_1uh9%3;+NC0001ElLrQ50;L0!5C#^L m+5`@hkp?dT*ptBqHxbAM00000002-+1_uBD007jJ2?rs0)ylO1 diff --git a/resources/calibration/filament_pressure/1.3mf b/resources/calibration/filament_pressure/1.3mf index dd8f331777cdd958faca0ed394aaf231542546ae..7cd89f71099816a46ee63b45d48f7bdd1b66e558 100644 GIT binary patch delta 809 zcmV+^1J?ZQ4Dt+rP)h>@EdT%j2mk;8002bvJ-h$^|NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5CFyp00000005r?00000006C3!ET%|5Iv_-|G{$4USnVvSV3~BBK1^5) zW0>w$4zu7Dw;XA%WP!gmwv`y!=MG-Je1lKfwaS*Z1LfJ*pDUO-|3T6A^&S z*b6zhH{d-A)0+OFH)DsIs=(ot?{x=F`vv}Rdw_3$bbE{G97!)j=Ot7Akit$h411;U zFsqynD5yN%-F^C4;7C;aOazQ1WnGe3)&a??C?X|K!mO_Aie(Vm&640(SMsUA!HYUM zJWfeLDclY>!?~g>zaXCw;NiYZAB>)%w3nBk1t!6c`K`I2Wni#7{O`cG6Rs=W5J$F@ zxX8GFjC?!gqBqOHEnQtk{+TkTzYR9G;2-*-y_ocQ1)Z2X9Ox9f(~nLO959St2fM(* z&IJxUZv_|6I7bV7`&At5I6jYC&kIK7aE=!Ez$RAm!p;S5J+CVi_#7?pt=9oN7r4LX zb>;jEpU17&>-G7*fXtP8eP28d+H=O`^gK6af47~N`Fo$!*=?K&xMD#tolM@9l3C0Hi000000H2de n1!Mu?ldlC-0Th!21~(A|1poj50000`O9lr30000GlS~F76_0SJ delta 804 zcmV+<1Ka%a4DAemP)h>@EdT%j2mk;8007En*9iar|NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5CCfj00000005c-00000005O$+iu%141Ml^{ez%AEAmCL(C+I;$xh>T_1YjnVpE5Qhos1qH;=l1Lr2vQtu+;nHxWk42rFB2 zU*XX;WQT9AKYuEXj)fc-F988l~Xe3nx-An>S%ujj-aiO3=iLqD08mEl&*%dTm z7`l5^LNB=Fjw8dhs_?JYbqXW*bbyy1-@%5_p;v?Ik6?)LwHb8{m!_mA$G`#zJN7~i z{tZa?!gjX5@9lU%t*meof}KxLIIr-R+YCPG?JcH%lP6ueP9|IbR>B3E7|$}{VUieb zCrI4i-F^F7;XJCDU|CI?nx%wobGXJ)mXe&Yoy_7)COZb`NfP`TsU9mFJ*!j0LkJ2= zVKjULr;M&2E;@+r-H>iY|w467ceV>*O=(|B;()mxBQOzTh{I zAE*9*Sfa}iuRQ(;#Bx$hPoIa$y#4vjb_{)(bwTH$nAxfeJ%S>RwXoh$qT z2lvF|pmd&ZyNZL81#UeqY!i?3w7>_myb>2q7P$4eK2hNFw7|EX2b?T$@5c4%e1vbt zt>-)Io9hQMSMr_fGUK2;CtOKS{g`La@0@vIK1(`n1wX7MeX)JYdTcxSyb)>``XUmH z6dB`$$s{8M&pA8&;@G!KPNo>1+(D-GXez4X4eRl7zHi~YX<-T00000nv+ijWC7fh iv;|ZF50eQ7Hxd5?00000002-+1_uBD000Yi diff --git a/resources/calibration/filament_pressure/2.3mf b/resources/calibration/filament_pressure/2.3mf index fdeb8bbdd070c1b08491a72dc3ed45a35f3f8370..8c571135148623b69f78fc96826a5b88f2cd5eb1 100644 GIT binary patch delta 1141 zcmV-*1d98;54#V4P)h>@EdT%j2mk;8004WDF4O=2|NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5CE^QoRLkCCRucY&pqedhfSP+?DJdKIyW&+&CutJAAIJB zz8dPLf63W0U)+R!{`BiFSvS<8bpYH?IeVSw>)G?B>Q!{bbm*FD9H!wiAF84A!n!N^ ze$yu5tr&NTAdrFJgjnb04MOlY#%zb_- zL%&Re8qljH_}SOuEoc7SotR#wC^&`PfjwL^`amzln*(^)Kg2%%Va_-C6wuRm`NZjI zO-T=bg{?-b|6`Wjp_|R{ZSP;&hf`R8y>V_F4{qlc;Frm{g*gkE^M2%NI9PeW z!NoLLwC5rH_Q1wQzM8+2ji0cX}tRvgj-Uuxuo733qFS(j4* zkrxO#6w=@jmynW>W@!%9MWCccPIGl|NrPJCsWXxtSOf#F7B0yOsJ5C71k^3b4#f)0-NGegy+h3gNMDj8 zsd1{5I<@L2)Uid_)lE(Xv`h-A%Ygw(bLwhNak2nt8EJ*YpNKTq=w41N7DCOfm#JXo z71Z2MrB6unkg82WKrSn24%V405ea@gD-H4|M>vF{R^`!1Tz8z zdyy{FlVb)h39b+T000000O*sN24n#$lm7-(0bP?+2R9K-1^@s60000`O9lr300014 Hlbi=34{;u( delta 1152 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 J08*2w2O(s=4j2Fc delta 1156 zcmV-~1bh3m56TaJP)h>@EdT%j2mk;8005y69Nqu_|NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5CGc`00000008#`00000005O&+m72f41Mkb`wxct?2By2m%wgc76bI9 zz+!hkK$evmFMJ7n38wq?C1oiSw~;1B9wxC456MH39u{AJ-@4Yhh;eF$z9iHOh$DJF z)J^|Vl4U-*8TtC<&p(Q8s731lxSvY$I?v~$?@#z5Pb z^D+X9&xcX?VL%Ul5E5tUo4F)i)3!|~W-$`vJhlwoiQawwM?UDMW4F^y$AGP2?Yk=( z?D4#l=R6L7^}=V6Lop>fqG~5oC0N(8d2YDOKb85fLG9IWY845HnCf^YzB8an@MRQy z=x5Q-m|gA%F@frSDxemuW;1ho)`^n*+sv&X&ivyHKmPs>&xms##U#cHJfP%DzjPH` zn!?wHk_8aMGIBBDFCabgp&iDTaahhyQH27> z{u6wbG?b_?BORi=oe<*j`T5&lB{}dc%vn~uL69YGT=UFjahSTCW@(k@HH#9c>Uj+b z{`R$aD@kyTPE4=TDMSjbfdyPM`lKF+H%H=~A0=@kFOJef0FCoMayV-WccHOILqP6_ zdLdYUp`C?%8;8|`dQlqZc}^Zqz-F<-Rp`Y*0utD?+Pd0WSX}`t)?;g7m23-rgq(UQ z+#!1cDvmAGO1@2bYj{5ao5c=SftO%5JL<8uu)0z@Y%T7ma~Jvmxi#>WR6(p{p(k(U z#^8RS_mGcMyN?Wjjf-C_esfj$zYM5ihL>P}|I*$}Ed9i}P&uG3A&zk85|so7==((3 z;Nav22QO{|E?#jU9r7KFI5s^DEn=xcU7_XxLRBiNY89Hr!Xv4GE~`0!P*qE^gIJ-tT6l!4 zSExAvE!*!BjfoCr8^HS|W% z!q@LX^*=xEIBFj#{B;Y#<)H94+fGp}O@EdT%j2mk;8005cYdXxYE|NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5CCcp00000004~x00000006C5U5}eM6n*YW{SU}}CSXEBh@gF`M(RtY zs-1nUj4?B;_=vzn)BgJ23ztm1m7%P5BFzNfbI-Y7HlE~v!%JN`SJm}p+oX)|eCDV| zwt3k+rEJiJdtx8nzx^wz+gw!+fSW#L&sty3p4ZD~Rf~RCm$Ga7w$MA-*4{p^MKcsa z>Y)P`Pqv-%0-ql|KVZ(#lsaW~Syg4NwCWggo-2WJs&OB`jtfnHt~bim0@zAXy-JP2 zo-Z4DE?t{{4^l%pi0L>-lx<|nl&CAAbt%XEqcQ&}sI4{ZDhTG9&$6xB?x|~si&N$)3r4+vSBo>+Q}*uR2%r7K1M?@cy`;>)MW_1bQ4}JD-GM!vGI~P`>cv6)?&#wWbAI4MKo37t=K4EMPg6psBbfhx z&t*w}yW$4FU^gZO39sj92pW#df^Y~?<)EmB-%3&KjvEBs|Ey?wE=wAQNyBql(lt5)iEY>*3$9y4w{+7C*YI4CG%92`u5=U3cjtiN`MYG|{p%=7G`#Ve zr|Rx(npd1F$K%Yo26$dO*L}+N%y~VE3>;X0?r`vyw&38fMI6!s-@%Fl%N@?H3$Iqh zAuaI1i_M}7mOGqX_cY;<7WiT-A6Sr&aCTiz1w>vTV{TBXbxr~SD9(h9AyK~!e6B72cjgq=U=Nn9j1xOQ2ID0mf4B_m#5Z~=gxXUH+ z=98N4pLpMR&JoOFh8lV z2nAhzlTxeNnRxMX3{yB?spB|4M7b#3gUXZ}3Z-1JkB;s>1a4mxQXP)d?LF~Ed58<5 z#eW>(+b^@<12X~yncaGmlNJUp32F`i000000F9GP24n%xld=X>0Roc;2R9P(1poj5 U0000`O9lr30002~29r<+ASWE*NB{r; delta 1066 zcmV+_1l9ZC4)6|tP)h>@EdT%j2mk;8002!7B8~t5|NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5CF#w00000005l>00000005m=U2mH(6n);L{RiYd^I;$XBG_K0N_&|! zZT$hnHZ2n$5tyjkuiw33r_j}IGF56C`}mx5KMc3|=cl%Ran52G>%J=p^#bCEj`h6m z9ttwa%1z1VPaodrZO=vH0Js|q@+jr$;QJ$c6m2?`T9zV##Cmfcj9Oilx^ z_^cm<9|m;i2O)8$u9gL9>!zt&A;mzD^U#ziCp!23$Gp&uhxSI9wgk4iY@VfNvxn1- zJg1@O6O)jC4#l+Bj*d4n9YxtTrIawm5 zoLKzjUf82aht)Vv_!EcU$P%=-m@`FOX7pXlz6_{&LueRNsskG}+y zGYuumW~?pF-3b;C_xE4F6l7n8yNX8KEz@J>#tG+c8t~YSk}@iJ7>BfCfL<)YXUD}; zL4u1rF+R?s;1sR~7I2B^omvo24&bR5C2^Kz#Q9wiH}v9QAMW7({6Q*biNtmy_9)V>;zb&;jXFUjf*M{>d^a^ro#0#l{*vY(onm__)!*!qyGY$O!YN*#K0^8*x`$4dPg@_K6bnoF~hcyZz%soZ~Y#d8U- zk?x^c-Fdy@oar3hImCycbB+oUt*_q(2Rkc&9K8CTujvK{4>80+(vWXw#KF!AXV!)H z72=Q<_~30}(1o29&a9g*IHUzWc-k5GU5_ff2V>NV7DB>>_Zc zMox2faBBm#$g9fC?8s`)5pK<_Xygq8syWR3q^db8o4r4jmKwMwv9LhMIG)NHx$RuliXb z&5XM7v8${}QiST+K_UI7tEBovBh95ml1(c^N0~@K>VGDwn!9SJJt!pTugu!+BO_&3?JROq@6f=Kf}~&5u*v@XNHhO9Mt(5V%>G z?A(~AiJR@>$W3{*t5R0MTv#rnWnN3sItwojpHRNb$jWIP#98VFOoVQ{=cRk3@GFQ! zAhP4W;#s^*$GJbtgD-H4|CPaCe*v@412X~yO%EcClLiJZ3C9fp000000G*RP24n%> klcEMx0TPq<1~(D{1^@s60000`O9lr30000E2a`YtAQy}Ewg3PC diff --git a/resources/calibration/filament_pressure/5.3mf b/resources/calibration/filament_pressure/5.3mf index 37135fa686054839c97f3b2ca723f1f731a187c8..f72fc6a5aac200117efb30bdf55bb6f45ba4ff4f 100644 GIT binary patch delta 1146 zcmV-=1cm$355Nz9P)h>@EdT%j2mk;8005S#rg8uO|NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5CE(Y00000008X+00000005;}O>g5i5Iye#{SN|rmLX1x3+`7Wy#sVPyO3J3|c}a|_ZDngB^ezIksr^GKP0$-lm}O>kAiSodAQ_$Fq7 z>SSNl-Alpd=^P%|*DpVP&fC6HO#t9-EZFNbT~1Ln%2(Bjansgv=*Rv%ZDij@+o~1a zd=_$=2VjY0Kd2~)`96vh7R+5e6|AkBrf$`w28NucMxdPP!skEqKsTP+l`^dWwpujr zQaahwWhKvlW$3F}PEZbFN=-)PN~ThYwh_}*OTGR~uYXBuZ4JkUNT7(B$!C-+6B?DA z2POM%Qr(2BJ4W%2L3cmp&<;YVvZ7Bkpxy$&hw&zj@rwoDA$pV0!#{e8)6=pd zUnIYO(fqH-c=K^dD_MUaoC>s(m5X!-t`H29oBZSASc-O}Uo!MWLYKXD^@Og9T;&2= z)C%>BT9$=n8v{Qst|xMhq~*K^wY4R!NWbI{{j?$^JGdtJW(uy`f^Avwe&$*@n7PBj z=Me{Px8RT#_~0euz`+di5zeg(A0iNkw7>_ia0egE+~M51hXseUz;|@=!3^>d&aKO- zfXEAk917{k5T}rmkZx%X)kUDDMoxEiaLR&uP{drUZ)Nu?qcDTu7GK)JAs6{rP-laiMv}kg{(KII|0(y z18#MkBsU{3;v7usK;o2M5g}nexsYZfFG#nz z-e^!H+)S`?+|4dZI&ld37)WP`CrM&7$AWuXm@|}+o(hqL%|^dlcpjNIAl+c_#zwcB zJX-Elc-6@x>+Y79bKO+8`&6lt?J-p{Jn#51+@)I{mf8LsigX$LnEQU(A300000P)h~} M00000UX!s0A#BMX-v9sr delta 1164 zcmV;71ateq57G~RP)h>@EdT%j2mk;8000QgEHnTA|NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5CHQJ000000093300000005O&$!^>@5Itvr{DZ(bYoVmp(vXtNz`$Gv z2oiq)MX_xSv^2Cdoca2xqR8%6VzMpxU`u@U-m5AWWfot5-@4Yhh;eF$z9iHOh$DJF z)J^|Vl4U-*8TtC<^B+Yw)S`6&+)pKWo#*q>_b2`;IyQM-!^dG7PP4~{&X4Mj^~;Iz zc^QGl=ff!cFrWuN2#K@w&0LbMY1^g~vlt0-9$SWTqIaLa%NPB0>~_j@4A>gh-lU}2 z<9R2~c^vA0h0jn9#gu4A)lQ~Lu&!nE+;EwHD)V1W?XBU|DiSDSs{KrSr=dykWfXkq zXVK4?UG4`lf$n}PpckxWGjn>@iIV(i=2j4A{&|LnZ~wqM;+#h@iSYt2DEZPaT?Lz_ z@O7YM0mQJ3Tuk@`q(?rq!}u}|%h_q_l7v$1w&KWt^^*Mgl)z8)^hEqM(!UQ~Uk%m2 zg3pqM5@qwCEy~>q7LU)*fB#jIy5?ERgUpR9R=IH?LO07<=GHkCVN@j|r5T`COYpm| z#al^&t2;5hN>OkMqk#=vGy0@nh&M;#ou4IfBQK89LjZ&GA96Tr3hzQ=kA{HU5A{Nb z!Z-_m`PPRuf_hOJ=Xp*(oPaH2hg9grK>{VP)oLrXjj&1qEB0d>VJ+Df`T=sQ@l{_z ztYo1FRe%Oa!&c7skRPXZ124%Q?ahtEFA-L$8#$K!_GB4@tDWB?c1TeV<`>ek?V_6< zl-fpErMBhR2EMXad3aqyJl>s4 zRFddE+YJs@?r`u?znw}OT)g6-Psj&{wE+h!$fs~-UHB3s4rzf8zJmrnSh>TQb>SO; zIHUzWm_`F1tlZ(ux)d`2LgWQP3WYQ<;?f<`EKQ-h2$a;wX|4_~ZJ-u;)fvf-tmYbj z;gV!UBM%Iy{!rB*YN?cJ(G_Yjpt?j=o2aE&s!>;{*+8gTh5rX&TA{gExFjo}+iErt zs%}YkWHomSmyq=eH5*X+k{n5myGpC8R$0`w_?o=A_^SDj2{jOj!K1nGs_`;?d)+k> z(+8xb?+S?sM4J1f_lE*nHmF7-HHuq*x}(~IWD;ub`E^1y)LeK)swN3rZ#YTxmQzR= zk_SLFM!4@xNHrUJ;9%bykaBu%C+K6K9wD<$IlFgfsM)4QUXMm|kyJG?FK8x|%9Iao zbUbbK33lhR@b$M%-39ROqwWcXzur#p(op!DTToFgONak zt2m0?Qz{sXvw$&Cuh)>GnMLQUym(Q89Q5_(kc6SA;?PYa8oP0N%3PKw)Xgd;(mH1e zjjQ!0RrpdKe1TiM!NXtw1G6s#GXew%%q%mLW(F<^^A7+300000|C5~tWC1~w0tZw9 ebdy&HHxXn800000002-+1_uBD003~4p9dkGyd7o$ diff --git a/resources/calibration/filament_pressure/6.3mf b/resources/calibration/filament_pressure/6.3mf index aae82ae2b94b45b461198e604060f4a7f1b9f567..44f3f6815d01974fadf081f593d9400687b22d9a 100644 GIT binary patch delta 1184 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 diff --git a/resources/calibration/filament_pressure/7.3mf b/resources/calibration/filament_pressure/7.3mf index f21d6fb25935f57dd2c245e67c26f394a760e10e..ba5a44e6cd7c1e4d786021e9cbf1dfd16203c9fd 100644 GIT binary patch delta 905 zcmV;419tq$4ag0DP)h>@EdT%j2mk;8007m7RSEz9|NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5CHTE00000008v@00000006C4O>f&U3_W+i{)3>M75OuE0=vBo1$G%Q zY}s{?WTo|B$$>2g?SB0zTTbH*N}FNnA(8m_9!XJRi@PU()u5y7`nuI64p#w2Qj4~# z^+SmVvnM&eyM6zzP;Dg}1Yq5l_|cfdmeO84O2zt>szulK?cS_Jt7u#)riVQfX6S&0 zinfz93c{2I5k`ZqO^H?AG_{gOcGz-m8)oICCcCfWhVHlON*Tp~t!B-O)EMmca3#;7 zYpX#RD2HQzTF(*jE19@ts$s^|V$44q^PhscwuXJ98WK<45*i4=%i@1k=oeo zHZ({uobF8lXTd6F7}8A15`U{rBQY}12UvXh40{+II@!za2pb{3{T}_$gW}LP1)Y6I zA^^2RCuDC|z`GS~({>MCI~-75l{gypUMy&|m-xef{Tlw_`+H0$PkQb;ZMFQT6lSCe zv5OR{F-18xC`7s4?LK`hG0Pc?_n{cXu$#NZ+D_V59r*m^cE@bH=c4XhM%RZ>BTp6G`8gaMqX*~u#^IoSJUG{{ z4hM%h;|eiz#gq=$~C7dxv)>RTc zXQ|jQ#^p4GirPqpCSE(HAfkD=1#B(WiQr@tRxwFJ9uv;_hGc>VDUZ@XLrWCAw>ldlC9lX(OVlQ0G^ f0cw+A1~(B}1poj50000`O9lr30001Hlc)wEiYAk4 delta 906 zcmV;519kk!4ap6EP)h>@EdT%j2mk;8006D!YkdFz|NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5CDq_00000008y^00000005m<$!^;)5Iwg*|AAo761B@Rq~uZr=%ql> z<^w2_PE<&gAyG!sukUbCVyB^N7e3hHym@anaa`X%4Lv%4h-vOd+2A;gFcOlDyps*F@3${#xjZz7zbaoYq zG7R1QP(v>$r-~v;2hrf4o$3Wf>Uj?j-@m~bM*B(3VmiP`})XoEWiJ3o`Zwf4(c=liuBbVPZYWv8z2A+h2kyLla{cCX~X4 zXr>cF+}_`R{Q^3iCt0?OgR0o1LDteDXsL*Uwn(#0Ors*pIiPJw@GZG`YH;)totPhu zC`1achHjwE=z}{DPYCdFn3j1I!5j13;2;W%jef-Fx28filXD(f7$?^M|2)D3#I@kR zrA~u?JL`BwI`2X+AO}Bx#+KAU&XOfzROkYl`k&=|4|zFta7m+1B;I)ZB~_C*V^u4- zy5vKDG-vAxI>ct44vBv8&>?Mbdff6899WKUaNWL+#tAO7I4GLt%e^?TXg-JY>%twW zahewR;I;JVg5?P3*WFm0rUkyr%Lf+C=Wu?1-B@P;K+Ow;F%;4hp*9^M{n8F+n1Rw? zYp`g-6?jH_MPA%y2lNN&=0TU~lD_D61J2)Pm$aJ)oszGNuHX&{b@u>WryUL&>A|@P zb2u2Z6<3pWvfUl6capomYht&CzRYWKvYqO7>3aUMF$yY5CO8e^IE{jg?%H6J@hZqZ z^L&#RWlqbswCkbnlo*iZ)e8hlvaX$$?HG$v8o<2-ByCj%6^FGGi3C1n#2HWRhO3E@ zhqxeG{m%-1{QtTclWqkr35y8;000000QQrm1!Mv^1Cy==7L#}c4wEki gF9B@EdT%j2mk;8006`i0cijK|NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5CH!X00000000sM00000006aEOK+q&5I)aH`yY_!OoQnLnikAlR+08H z(rPz*UGZ=dMm$`>U_Mdf4E9#9yB4%DRcJFWV+z{NOT6 zG8mtEz%*inzR-P`@0+}!K~r?6$XEPg*j$jJJE~o1{0ip z{>S^b8S4!CCU%sqBmz)7cDd+r1iY8Lt=jIfYsag9RTc^Jq`#LHORgvE(_H}H)fmiH|l7xG`oc77;Qb+mfk#gL%044%lB&CVQ23Nauws+((KYUSZig6jn3VjpM;>-8_6US+`?jFAP#AP51u?4zp%2v>HT7$z=yQJr;h_x7C60Mc#I-0n)o=-YXsub5($y( zkmMVwK_k~E2bYjjAr0QCE*!a$)Q}-6%?#E1$Ed+Qr|NJ+Ojzh8)Zm{=&atE@6};$w zGNlA4C?rAy^^^crd3~-tsuU-vL4Zf4lI++|`dr}>W?+Wu1<1$|s*0r#i(}~*&^HLc zD#^TVv(8XMwMYOq)JC_eyb|&aQVF@8RLm{5%60=15;Ci46d5ySlqd~lqCO!chNt6H zNc`PsX@X+YZRAt!{u!z-C`yEwXqy;+l&TsL(olCq042%9R@DTr_6Q;MB~n1@PdHRG zjIVdS9w|>IP&uC^u%$JmGgR$*eMItPL{@_8^R6}r0denZ+!Ior4u)Qu@~(jTfY2w1 zR6s+86p|WQpH50VYK1P=2ZI#^*MwWd5`d2GygkOw>N*@;XJc6v z^A%MDQ63)slO1qg*r$|-_BqHxJ2+>7h=dG>SmCoekLnHzE2^+NYpgrT3G{pm^_JJLPq0=4+x9Qf-evuOk~0tCbo0cew;1}+Kz z5dZ)H0000Ilh+1h0#pQ(;06|xss#>{VFxb(hm(;9HxYLR00000002-+1_uBD004uN G*#{xJUon{g delta 1218 zcmV;z1U>uZ5Bd*(P)h>@EdT%j2mk;8007D0(JTM||NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5CCHl00000001Wh00000005m>%WmT~6kVr4|3P5adXSQ3%aCR^g8~`(zyFptT_I`*!0nKcw{bileShF@qR9uZsd(QFT{(KZYy7Zi@^&h7 zK2ANb_`K_d&jPyh14f*wt;UQrRb5w&7)4Kz^H}F7CtCOAANiskj?IHIO%7~TUf-mo z+2i>^o^#)S6%!w!9EvH{j!q9UokZT$`8ZZw=D(Nu&!!%&;ZQ3QDB@oG8Tf;S2EnIZ z@U9(2J7RW;A4CMY`;J>{LZYm=wEztvGT$BY!-{@Dn~i6Mv5Mm!b2k z?)0DFqokok**s{Aayr4{@#W>uZy71W6Dtlpabun*Zd8V`dn%LArBNB5B3>p%0-@*G z68zg1;yok5)twmLq$oIrt$_`kGkQ`l#JdA{>V^AV5WtT4o)MRMQ4q5oJpDi_XU@bH z5qgn-B>2?`kAXPK-7*TtJJzzH=3=zqTZfjS+@6T z9r4TNtbw;YZ~|{n=B#d*pCcZSS||7U1g@pl5q2p#de%~_>5M!II}T^nlJPvqYv^`; zE0TGz<)b9IZ}>Chc4~L+{_}dTBtAs^B$fJq9}c#3gpX(YS}#sI{l>Xad7@ny9{tWG z%t*Mju)@L00tX-b+u^jrMKcashkQFD4pxv);mo@5l|~%W0v~)M4Z5(hz?pS1QQ$*b z;4|j|D+`=i7rr-$gHb^~3iJkpxU@t<<|d@lMr!0V7YCP+QzI?vsxK6|kM?!38HOm&JXsKo$Nt&;5E zm6>aWOIU#`)NDXzj!@k!b6ONzzkqHqaKBcXR3R;`QtCJ{+lERb?@x+CnhT24hN)v+ zx0PNa%|oJlG*d$UrfJeZ92Ly`em-)4st{`FyBfSJ6jTfb^v=IREt^Dn#WCL4r7P4j zcsLwTeZ8GvR1H@39?`q$E>P9fQc|P>?d!Q?Zj|0i8VVxYxXTzS3Yar|MP%#Bxv zZ@^D!HHyZWdGTTh)1|MIv4|rc2Eq;YF?S@EdT%j2mk;8007}`5)uFZ|NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5CBvW000000003500000006aEO>f&c5IuK+{SN|rmi2ARhSXjb0rs-M zVmG}Oltd?5=);gGBkix>8EWWADM(iVnj8{~Z{C}EGo-?QWS?K!#<_}Ntotr!!Omxn z=*qsTyQiE@^6aMU^QYf`%i6vYjRW9r%-OS)my_p><+Et{xNGZj=*RvncV*vtQPuKp zI`dLa1F(2yKL{`MgT(Vg=1g5JbJo^PQ@28jfg$Iq;V36M_wgU~pc_x^MwylaTg{tS zDV6N$vXSS1GW69{O0a{N_Bx|tBU2%G+i)rCQq_M@_0LId^>A#61WY{We8zHPLZc|B zL6m(bMJKVkqvyvAy89u6Uhs-b?sU8rIs3PkjbM)ac7YFn{{_#Oa~Z@ahATV>*rzYy z*KTSHn48Sgv5E*l{WO$f#81F`D*L7%o`!z9ICYhOvry^1t~hEvXCEK-@EtuoFmI0Z zmZ9^bzW7g+QqcsAGCk@n)qp~lr^m-X|HzqN#cAM|+&vz6;>P=9(w=0JO#3kM&S1$}hG+o$_Q{*uV| zXS*qK%fP;|XccM~T{Q)0-nmKEky|9+JwY&Si)pt@zVT-jd1q>Ep<6_^jO|);6=|1T z&HF0uPL<}s9|be-&7qq~c(->?&Egc+Pn>IifCsm84e`z7T%(*t%y~U?S2$Q%;Nb5O z11_F%NDF+45eF;CM>w-C{1JgTqy;{Bg&TBXWq~v6Vxho?w7_Ss16CF|vo5>~5eIKm z=qE3AYkQ+%Y4pD1vP>ViwC!qEOW}k2gQ@ufd zEeVjP0W~QAb4^yE@5rj5<^)1L>10-DHVc;&tM=8LKuEn(>^M+nvv3JnZ%}grRFxvf zW?5#1s?yM((8osn9H~Z{O~uTVQyOaSDk89YbODVr_EbBnfo7XD659ooX6v={1hfnk zArXO;=5q8VA)saQHIgi{n5o5enr3x>+`h_p4K+^)&5}OwEWVSSdMlY5L_pFuOY411 zrvqeS*v6FO?QDP)?jR{iGY|obg8@=7FzSPm81Zs*2T7-bxo*8F2#6crKuO5kkznqQ z_7c6v-Mc6#^YojVZd!P=q+3|#&38Y%l4aiNj+qrx-Bh=GUmTpHWPgs`@Obn~-MEN+ zmlt6Qmp|e2nDd115A!82tEFh2nHR5tFbDebSS3l4o<-@3G>zQ&us^t5RA)CS{8U6? zQk>z&r@Y8KB@cN)w)ig+`0anQLIg7c1mSKH5tDfaE(uf-000000004#um)rSLz5K; zQ~`FAY6mwmW(EKN00000P)h~}00000at8na000000RR91P)h{{000000{{a63;_TD J|NsC0003i@EdT%j2mk;80078%`e^_E|NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5CEJI000000000400000005m>$!_B~5Iv`X`3Hf0)J6U*0AChzjJPJPa zQuGp|%l#lGP~C?DYQbtInbWgQl;odAwt_hF?Fe7~`U%g7a~#Da#uGfCABn$O`j@8bqoMjG zxLjx`QEuki#icvJ#r@OMk3UONrB!u^YUWmT%-lF(iJPT);6`~!Gm+CQp$yQgOYqs( z;g_0+ z{9g-yF9dNE{9J15oYn9hdTUfRi#w!lNyk=dYhjmKixheBQZrl1A)y#~?9p(ouDPC9 zq4)b?wb*vqEdkgp?vM(-I7lG{wp?wcwiZ??mAS3O^-jJDy@A~7_)4lERpbaiwagaLXON=-;K|X~u>%yBDaYze%@E$bi!pQ~Btc!sHAJPJ!ISx3vz?pTk z6$fu6Q6nL86H;j-HFBDhgGb1zkrs7T7mD0SYRQl)%^7OZSJk1aJk*?j zCpTbhs@1}d4P{Oi9wF-) zYIZw!{0%amw;Bn}Hungd4wHnRd+##v8@$|W|6A#&Zz=fQ`m z{tT)I--y(sq<}D|2Fj0D$>&Hl^JXtm^YU_l$v22=q`Di-^QOk_e2ILD)YEPrc9kIw zv=m5{QaOob(%}@oehI6k1(!6n&=mfibjggS$T1zf*AB3meMq0Q5Cy!l_0*kVd;W z$pz)>%2)V{Jop9P;!h3m-*2-+1Tz8z$awl_lX?a&37ilB00000005J*24n$3lNJY5 f0dL+9H|ouva2$?!y>7w3bBkH5R)*faD_&wG>izQT)#d$_t3^#% z4&IHpz@Gez`T63ShOnO9+omn})ol@)wp zTi&c)tjx??=d`;;SiZRNw!d<*H2+(-nPCdiy0gSr-h8w0{)x-{QNEWFEMWf11 zQnVbm^cpOiR{Za`<^Q8su1WRvDj!sO=U?Zx^Wp`LA}NPg=N!^=$|S!lb>00tAz8mg z$Zdk(mVgWMw`Mj7eZKPe(QorRi8q#M>A$FdKAYwK!?V0ky;bb_W4D$3lwLA3v*wk| z_ebllG;b2mDzuG{D5>4C_wTQz3p_(sGNhcW5k0E&i8&$iS*y;PJwBQrnzi%<_eLCk z?{_fSac}x`1G_ViUP#OryM0-8Gk+elT<6jELFe~rRBCB_-W&U7TK$`u@5Q{+@?G*c zQ^aTem#hD||IVWM+dtKuez)vGc-{TZy&9K(FSM+``sB`ooR{xrZ(cXQ?8L?G{VbMj z-@+y*XRPO~eEE@;&;MM(L#=ZkUAg5it@{w^c%^j54_g_gHTz3rZ8p~MwJ*+h6>pz# z^k&I~eA#yO^c|(K$I~C4Xn(op#Vwb>>kqGeE-l@*)E_w z>-%?jPW&`#eB*H9=g}pnPp{0o^7)FU@y>RO?ipN1g^PvkyRlr;+eUPQN0_SjV(CsX9v{mZhFcul&-Q_g3EQ z-!E>I6u+5;S&fMWlYP=FPZ Q>;t^nz!^biaypwL0GMKg8vp@EdT%j2mk;8001g+Lka)?|NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5CEwM00000006ZD00000005;`%Wm5+5ImLsb0(jeSV`@3)pUwF%rY^1F*f+vj zrr6!95_`cFH=K05g^K>FO#_se=N=z^e8)9P`T<55_P7wx>%te%DZ=q1_y{FC5X@|d z)YBkgv`4FG`+pM`}Vb>sSJfkvd~j`#JxD?!Yi_(@Kls?0Y#E$0UpkNF^Aus zf~Si5FFs*>oaNCoUKZQZCATZL08a$*UKnhmB99BaMbDU~zbT@?5AX#2L9$Kg+ZQEE za&LxzBI^B+px9(ZUO2T6g#5q3e@f<+%u398HXn&`6*%&j>{YW$gCnAQXimC!SRwns zo@}xY?fE48$hQBaRcAQdIl)D%xMacM0kC}WDh_unpTpq|KOT`YT~s>3z3b2Mp^Fth zn<(m{p!K(&htqX9q+Q{2^|R?9AF{9DoUX%vt>^3NY|Dsz$iBkobRF)b&Lun4&)ru$ zsoY&I*)mJ)#V*;|%qqoHH|k}2C`fjx2tv=#6XnHGq&yMg^vHQu$RyY$Jmt%%C~E^P zS$OR*L1TvzBHrpNkHzu4n`MOC*GN?$C=}XXpjLX@M6IZ*mx^M}ls{H+>_qF4# z7}u(6mKG}M>1jVD(zpBj*8BQh_&W8X<=1jK)dfofr`DZ#nczL`!tL4R`J0bvtl(@a zoqyRq`?m7)y)`XvUv@8>H20-%X89!(n~>fM&YDYPtx_IdDmlP>{(iCkf|LtW&t?W+ zExp>%+GlkxS$B?1M%n+=IT!wJys2@SBW1Nq?KG*ga<_YJa?`IU=;j?iBck6|-_`5G z+ObURT3FGW{|4XeXWrV?UTZt~fts9{{oXqnE7&bd6neKUSo>PO-^Y6Y>jjaDe4~9=`dm1SoYfbWD?hRI z3ZDILp|P{K*3`=hSFG1hD70Pv{(aIP?)UZYH0EplOnqsR+9j{>*5mQzo0-{Kx#G(o ztGX^f{`+^oe9^2o{O!&W49$P-5(JNQE$!5hbdb@o|D-gvrDI;s!|h=orUbt~s`#aU zvB9pR;*ZW1zIt`mhSC4X!}5vG?WWi~pYl_G@qCLuO-pYzSg*>B%&g(o6A!X5k) z{XVkIJ^ziXU0dAZ%s$aOXT*JLJa#t~H?6RK{B8A)Nb%y+Kb^mc?u#rxrudeNZ?1Lh znYsI4fjRSqZ9cDkz02+Vj<0od6&}s;eN!$AG-gM4ZT-0)MR}ipm(4WW|F_3~<>MxW z$Kfxhi8_a_p1!5=kTDCRv0!YIYs^p4c^Q&87m})X?QLRJVi8-~n&PSy{LDGxSludzV_9A&dip=T;J&*{KK;*oanzK~5u$e)n9w)B zW0GTH0VVs%0<3zR@U%VIoi&B&DbwTtRMnwHgHA| Jne54?2mth%f=&Pc delta 801 zcmV++1K#}h4C)MjP)h>@EdT%j2mk;8007(~Y$N~w|NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5CCfj00000005T)00000005O$%Wm5+5Im zMVk+x$W@|3A_a*ul74-cdc<~HrLhgz7CD@m-Q}+HyXUrlAxG$k+USA?JD(EJ(x_TL z7Id_gm(si2k00{ZC};?R^-$0!Yr6wugM5Nk47;|Ly%|hpchae?2xt(&H9!9q_R=b;f!4z&01eOl1Np}kV3706bL<|H+lJ#<&{biGld zw3v>CDPA3al~*#AAlgP)Tgxf_WQu<_b!`rZW+A~OCaa%8UTJ6mIrbopwxF$xE@OT~ zvAQ=o)uYnw+f%Cl*AQv6nEo zCnP;c)0qCTH)BU?RnTw}JMEBZzo4J)V|?@bd&=g2lkEKHykyFsAnimG(8XqFYHe4W z(+x$NhlhtRp9?Bu9z|uvJs!rs7xAFC$!{;NY6o+e>* zi|yfxI7fA}EWk6F@Z<$g?cy|vvW${nj)Kfl{1f?Z$S(BV>rJu?*|!h8Lf>n5`@j`K zZ$^86p)e!=qR!bL$<80vF9V ztb^m*Z{l#r@h!M*U7RKk=V*}+dwD|_cg}Fzx-L-UbF|2}9S825;r^@Z!g&whg4>RF z@wem!ZEnQ7m|ar-EzLoLx+xyd3LBy-ow*0qjMYdPyR= z7s*t4WvGOg1YuHznaX&?=hn|_3oV&>-EhDF){&z8tgQSn^`b0M_#tCY0N;BFln{qW zkfl{MPq3U#^5_fQx_?gm^&7M00y6>x+#+lvlN<#u32O%c000000GE?f1!Mu)leh&` f0SuE31~(D>1ONa40000`O9lr300008lT`*G6P$D+ diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.10.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.10.3mf index a43b1d3d8476e2212aa3c787c2b41fdef9ec84b0..2a28103bfe45c032e8ccf4c578f39783ca12a055 100644 GIT binary patch delta 1018 zcmV@EdT%j2mk;8007;9$Wj0Q|NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5CC8d00000003qK00000005;|O>dkq5Iwh2|AXaT+Jgb}wXlNZQbp>e zQq|_XGR7oSe5}B%lKlFP!DM$6nO)k=Vb|u(%$ql3Gf8fLpXv%7MAw&XlVWN)7>S0r zdD%Rqc#s8&@a@f~k4fF;qCx;}`V>D(x!>A$&mTq2daEvZ*Y<58E#B6)m)EQr3dZHo zfft*%ov>Yp2Dam3G&H45aa~qbSqmvTtbA@OroxGa-2WOkntofa3{x}kRV8O|7A$9yp@!8W#lK5g35?|P9u_};z#c~XPV}NXzy`%Pv9rrWllQx( zeR-+Gt}kCikG{~ai9Nd-{en$9bX@dm1!19o~me*~AK8;Uh?&1>ga6gqk0KejIL-`?MU|CVAW;N0^$BZ12W@e3Z4 z*v~kLijD8^TzJkV1N6iWzMEV;fz>Nf(Lavyfi#>ORoyAM4|+p9A;8nv@*VZT=owau z&$N1fNijLDrtHp53AJ1e22%pI!S%K-9O0vJYxT+dToCDS|8>#MU=*#D^Ovgs1vm6j*^E?X{DX4&#h1E00S1mo1?r0vWle0YUpaWG`9y+)whAusScIH+>do;AsaZ_I#`8*+Pv~dhSTT(p%YAFO;Soxqsgx?8hoIv^SI=OUc}>#PcoXt#HT(ZvET*Cnd@yL zmchUjPeWQ_kKutAuvPyqz^}iv$pbS21l@qhQIZBO31AEW000000A`an24n)L1Cu}o o7Ly7E4wJzKF9F+=@dh^$%LM=c00000P)h~}00000*ONI1At}Y@EdT%j2mk;8004E_@kjsv|NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5CHBA00000004&r00000005m<+iv4H41Jyf_8$z*vu(-OII!E7L4kQ$ zV6ofhLY9=)3ts|T4m$n%rEX2q8M(-|KvT(w$U~%`^U#0-y4)?MJ4zFhZ#-MFiQmu+f?kr zmK<8>P>S1}0@|>H&ykDQ2H|(2VtLW=fi%pFs;o)wi@gx90pJrHrA4+&q1}J#Q`?H3rhEk^s}Ck5$}p}fc>KRj^3*ukh=L;rGEv;gZ(<0+Uq2)yRa90xNB-ipZIhFN zWT1+nf_FqK=C`p_qP)n9UB1OA*-|q~u=?@TVXJhTmcL`SX`p2DOYo_wU-3;-OVg;g ziG(h8?eS}~Y+HVm-}zCs{l&75Ka5f>;XOWoKKB>1R>?71LjT zZI$m?N>u}oLkrYZf>iuT+kSMwjXFA{Z6SZbZM~H%Eu%lUQ(QHt65KxyuHqKC(U-P0 z0HIy_wbac6Vp^nMOP7xl09g8gb|i=essNtysD^;hs*P0M@aX|Mg)H)7zU$bHg#ETx zi;mp{>e#FzYAvYatCgp2*RJR9yN5_nm`JKB4PnX1!VHr#Y+FLY9p^ZsRhclJn?VUf~OlvwbpEzR0g$2vUl0=8;-hyVTq zv#0|z0t9v0@kf*21uhBh3jhEB0001olNJVK0?7lD9|jha=>!gwpaw4i{FBfIHxcXw W00000002-+1_uBD008)t7zZJGn(c1@ diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.20.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.20.3mf index de11b883ae1ece70576eef9be2dc43f2c797831d..b417e1e81eb4a4a6ed577a631f311156146c5e95 100644 GIT binary patch delta 1027 zcmV+e1pNEh4#5t8P)h>@EdT%j2mk;8006DQaV`J<|NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5CC2b00000003?S00000005;|OK+So5I(n3{{wO_?SY3e%VP!YrHa%` zrK-(2GG;cR;;{k~rTO(88Hgflk&Lt{ZZUO%SW%R#n6xaL3*NZeO9%+n+{ya zX+ST&=m+q_fbRStB+k^;vLJ2UG<6FS2BLiK8?M4Z=U)HN8{N2XH->3BdaHT!97>bj zA2<3r4t+I$35jwTPw~R2+~}zU-ZosyTIl=}o&QW~tA=A^oS=xw!eHMz3tn-_osPFqke{_|fH?B^5f|UT;U0001B@`-;|3+4vf!qKt{QK; z{_(Mao3Va`(fL3>=KkVJ`$e068U&1Lg<_1>()j7`|InkUkbtwA}x8$+#rpq8$}Vg z8Drq4oK*)72OdQkqGxva-Bs{Vkl=|ZjCVRdlE!YSjZow%4##Qnt ze|7=Y(FqcXT0Aa5lL|e<(U3IAGh!?Gkfo^#waciEPLTGx7@VmKwKs%1QXUti-6b`D zwMMbEmX}!?B-X&DrJ=c$8%fxZMxq6IS@i{ZrsO8NmOypK<=l-*_I^_-pQvfg=S66H zWFz_$N4x5#kkoLrx0|_(3-GjqbANfNn8`v7Rc7kQ{dw$BBS`MA#;d%X>ZW>{bK)r4 z0n3=1B|Gj$38gLWAmeP8(hRaHm`AkS*Wr;DvQ_^q;IBWk#{)A01g*hwEtCEQE(u-?00000003^2 xH3nn?umh7m1{RYD1rC$H1}_2QlkWyM5z_?#0000008mQ?2LJ#70N;~02O-4O^_2hs delta 1041 zcmV+s1n&F64%iNVP)h>@EdT%j2mk;8003$4lH&jW|NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5CHBA00000004yp00000005mdh(5Iv_-{{z~dfn8YJU_o-JBK1`}IrK4Ha)a0QXalo`l$M!*F6xyep=lYuGqULoEU}bYWa|ML*XC6Y~fx zAsa>>MwqNZ93gM+8PNk*p-4N&gPM`p%=Ut zvbr?H6hU`yGU!E76{7I^qT@OG(}b0 zzP5ZfHLrZiLQA7K0YA(m{ThDb`+F4X z$nZ2&-x|uloC!rkkP&S(?Qjsm6l?8jY(e|>;o-;k9IdN}792BwU1RQ39IyOjT~vO` z$||9p!6$_7wL19hEB>4#{3eu7Pbxo%hBG5OtBboaH~6y$c#;O2G$j-!=LO2dK^o%~ zNs#w{D!Dve)pP@WpldI*JD2`*8 zKT~kLrt1wj=8n-)2$VqL&7z`3H(@&D&*yzuY~5nyXX+LMq-|~sE{1MWm*b0}TBdPt z5eai^$K&I$EJwZ{X3Hac`ynz5-yNk)zb4OPaAoL zgC{3AcugD+-e))fNIv+ETE@Y|N*t(g;EXQzLp1zC8u@?_=QwAI`0QR6gDsad)5S8+*vO3Ty~THLa^kuT5E~(t|EgE0=fp?;o?U z12X~yY44Kaljj943GNF3000000ELqt24n%plY<6S0s52J1~(Dv1poj50000`O9lr3 L0002?lOP8nkV596 diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.30.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.30.3mf index 672eb5b527bb1e4cd35e5ba018ddef4f4f2dead8..5ce2a8b8c2de51592c4f77df56acad452a968cbc 100644 GIT binary patch delta 1069 zcmV+|1k(G{4%!ZXP)h>@EdT%j2mk;8000`Iof-fC|NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5CDJ;00000004&r00000005;|O>dkq5Iwh2{{wO_?ZIHfe!vRaOBJb? zN>!V4WXx4@2wh*cO-8uShzE^q zi?X@T$e@liCZ9jOdz;p60hNc~rq9TOQl~=@^zs2}(ff5NyS8tS%9m{&L`5x{;V7gU zI?NKtwu2yKd>gQkctcaFjMQaSl{F~nh|YPagf0gSz5Ou`H2tAoS*8}4trXR{)JXPl zTAAn6wZ$NR7207k?JT2wWu_cNT?wU1IqKh!`X^FrJ?tx!1WnvqKD}H?s0TT8AlpVk zqqMptU>kzneUoA@L?M*$8c{<=ewL~N;;G*!eE9wi$B1|8poi`e2RQkZu)7?ZqQ7g} z=jRIU`tlii?*sps1~%207h~F?lhErYEOU@;)pqxPT|1n-vdBm{mOsyU<9tTm-|X-k z-Q191iVQA8r=d3g1yYS^I5ETxuRG>PxRNLSf+m4mygTuY=z~RgVE^^|Kk;cVS-K%<&35RSQb&U>-b0^dYEUbM* z!F(a3NokPC)K%I5jTVj`xsckvvubx&blVWe(ZA*P85=EdskVh$XLt5|!(rvp*$&Ev9Io2Tq)CO2NXDrf; z3Tki4t1pJQ{_J%Uc)@mi*i#n82`1q&6>+qu;YNmHTL=k}m@cttFqTJN$X5S5g|oi{ zHUb11qMaF&`2{WsfDHfu00000hm$Y{WC6*Ol?GG+{FCYiH!|!600000002-+1_uBD n008&~0000000031002-+1qJ{B000930{{#G00960|Nj600&Vm~ delta 1041 zcmV+s1n&FV4$}^QP)h>@EdT%j2mk;8006&HnhgK{|NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5CHBA00000004jk00000005m<+isjN5Pfc?{sVHKxfslC1?@`}sV|kP zHqVhUCZXc80<%i<^&MZxvTe+2n@GC>j?bJqGef5M{M>hc&WTTRI}RnnUVt1vu(583 z#}X}~aWnM!(}(v(Ki0f+06fekdJ^Jz@co%R@t)3J-?C|($3}Q;?ER?j>991EiDd#7 zpN$ju!vM#A5F%$8T2Z3D?Yg$-f=@_t9y%(+@xi_Sp>7QGp}#RqPl2ta-8qyJdpO?6 zbDYL{VFK)bFigp+sJfA<;Q)cu&X9nK>8fXDHwv0LTPDuNLGVGy z>~cRK2&((8fLhR+3hE5B=Oy~tijE^k{650P_iu0yIme05d^*7mj6UVTL&b-Bei+7= zmySQo?F*j^f2C2JfFGBM@mXF$hyxqDaeAD_<><73b%{b1`uxOE&r9_2E`i_Z?hg6- zq`y6?Z;jP2&V-`D$cQ$Y9s)0dF4o#r+k*DP{r%T3CCVF;q&NxO43c+ALWoPl1iLBC zD2WK6ghznZ>fn2*`E!YaSD}1H=lJeXEfYSa zd%MU@d;HrhyC*O0-|)N{v+(~Kr9!}ae0c1CHnX+faZb2I@B%!AYLZS-iC|vO19gFe zCmS5RCiZavkbE$-`#7R;pu&PP`V20{Lg^5_&0+bkhxdsK63#h#`c!kOu?dN2Wt5SPPI=I1sS2m9{&X{Shw#@fzrL2K} zh0p+1l^_*+(xx9*;7%P^q-i00!A-p-m9o(ue05wlr!?F?4r|2?a;Gm%YXCw~+PzfG z17;ee-ODu}X#l9S1IeC1IK?!>VM_I)QM7{hj^>rC z2>84%FbT#asVe3+ET%5OdE?RsR+*gEF~$w9(~#)3sqj^J&;@Gc@(#1c12zH#zfqbD zk_Ijb?h60_00000fRi@{WCFqilRyR*lL`e6lfecr0rivd1~(Dq1poj50000`O9lr3 L0002-lQ{<=yZGf* diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.40.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.40.3mf index 70dd9d8936527328a3bb1f27409bc21009aaf436..99128146de6500b30ba4a1e9534979b45616825d 100644 GIT binary patch delta 1048 zcmV+z1n2wA4&DxbP)h>@EdT%j2mk;80064#E!_YA|NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5CDM<00000004^v00000005m=O>dkq5Iwh2|AXaT+JgauVPOT$rHa%` zrK-(20^?1n_*j8iCHeIogPq-NWhmJ_Y_Q+Vyf@D_PI~iy)YRxC`l0ID3{%I$NVL2w ztM(zoqdbrp-+cM-K5e>E)Cj=skl{xuk9*f0_@ij@!D%YqcSCoO4(}Q_D4V<;4>^}( z4_RE^^}_W%8oHj3(b!fp!%bD!RU@S6vC6rxb5%~Xe1wM|-(d`+V=o5LpJ0IEFNt?wh_)Q= z+wSG17WYH-A_nw{eokGJYRU^S-Pm(6s3$11=Uv@@^$&eF9#K_h*q_RuXV5gC;g7cw ze1qFt?9P$yW#~NA6~6_SQyPjjan0-Aa~Q1Tng6tOf&c#Q?%UT4mw^cV=#Z1xD+0oH zu}6|5^2tFIB8cL!pa}=`%np9rQaokYdnGD{$EiM$hJB;loyEP=1L6q*-iNI;eK2~? zaO@<1`r#$R#B->An#KKhX59h$%={9fwa4S zqk1wa*FG+ET}@p<7bF>nbXG9HB3@ae8gI(mEuuQ7F%x=W$!Xf8k^mkZUE6!1v%v@6mHHSU6A>Y5W! zU%u46Q(w$dcfJ{_TUzQ~-9Xb~tm^Vq^(q*$i1{pMqzDp5SeS4UGcO>59#|AdesQ3D zzW1e-6b+j5s+%D!Tyvj{nV<>df&`+B2us3{6uZJBEIRnH@L3#lI^SYbcPbCOfUWv} z3jX>7v%3Q`0tBk*E!>mx1uhAJ4FCWD0001slPLyd0nL++22=t71(W0kHWBaz00000 S002-+1_uBD008`xD+eLu3-tK_ delta 1030 zcmV+h1o`{k4$KaJP)h>@EdT%j2mk;8008uNOGp3z|NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5CHBA00000004Od00000005m*&% zEYU1#H$!)~A3qe`Q1R9Qa6gskNr>al_b2wmJ34t?!^UA6YT>b=^TVp6{ajNf<`GzY zHjLa4Fo}H}AZP9yQKGJC+ot1!k4SRvS}Mcw-hKG47W!$|T^XjMz}C?A97>7Z9k1j$ zjzcvw0d^RFreslcxRU9>Y1dLA8m973RsLGkwH{8bApsN9MbE^p6f|)*kDLv?;JuL9 zh!eZCHm2bmLo^J9O2^IS6D;NapV&pPq0AHZI1T`-dEGUA6{Qu zzMq;`J{A5#qc{OS%p>EIyn+xrHnhX|I1cmCX{r)`1uFFUj-&3E=+k`y@9_Q}`Ff|n z-l~^|!%xnHq9MqLHk$U>i=d0OcGb3^efRM2<#UOuI-?oI%*8b4ZWOcFrMS*q64sa} zF{^`^0a~kr@4n*CCBnaj^65#%2hnh5WMy@7H)er9JAfydmn3PLLg&0dn%K)j9Fq(= zuae7u(OF$?2?&VBc@DS#Zwtx2Fw_M0C@T;|SzXz;XhHC4hqyqL=Gh{Cb+xred6Wd} zgu`Srj)8hX5~LAS-Oj%0rWauOdbmZAcmOjLhE!0zy$< zoQ4Z?h_nSL3Hb6J6j&~x_R^3ADr>ZzlR+*@?J4Qt1_xf*JkmI0roGxS-?Npn1{Okp z15{OlRP0Hceq4YXbzG39h3o}4^_Eo1MtgA6l+b1WSj7ctKQ~KjEJ(YTs(HXngS30O z8DKEW zSv00000P)h~}00000>XSVOAwHt+ A%K!iX diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.50.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.50.3mf index 7435b5bf9c99d6471b239b38469bfff58a069fd5..d9ceffd6e6a4fa1c4191cf63cbf9177ac2c8f0ba 100644 GIT binary patch delta 1079 zcmV-71jzg24&e@eP)h>@EdT%j2mk;8005^hv<3hF|NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5CDJ;000000052y00000005;|O>dkq5Iv_-|AXaT+JgZD%f||mOBJb? zN>!V4WQ<9u_*j8irTgnU29sSXnGI=j*u{P`^XARi%qDk#FLi~EqU+1HNinq?j6}oR zylkFQJjjAX`0n=Ohoo+EQ6T^~eTtu@JnU_|=g*>My;YaIYx}m47H@0Y%WKvQ1>Ce>PS~zPcedkVG&H45aa~qbSqmvTtbFb(roxGaJp3FNntoqz3{x}kRrW35XcZe0si-P%rq<3EnnR zG*V?3+m4T+x;F{bg5^vy)UaBl_*W?_fsy=kfQKL7VGW~0CwkExVS(b?*m=xEllPBJ zdpcF(u`f@eN1y4J#GYM^e!-?4Ixc$k1Y!2Pt=jH?scVM=D)SV(WBBt98uwHD={|se z@BSX!lcjxWIxV%?Z^7m0hGI=z^Lliw9dz=KrkF9`57v?53SVe}`( z5zv``9!@DHjz#s;l-$yiP|MZZU`eP-<;}J(oZz!@YQYq>%1HIN-o}qwONy z&q^nUir*P^snaIHOVcftUFnJcXo+>x6}DRpmkO<0lC^HQW@>JRE0)Vd7oERu zxz550~QX_$>DYORaTqtN{LMr*rS(~e(RivQbo60f+sktz8SwU)6NNruza77`1 z)m@N|ZnCxDIw6fTx7o~cgV-NS)D)yk5!~xuVj{Qx{XE zXbP`u^jc1HhbU(ty*`iB3{+c}NON@Uax?(x&C1USDbK1#U}#84%SmYr_%K|OC~^W4yF1qpyx0|tO+##AkKutA zuvI^&;M-rb(gQOB1g9>v1(OK|E(w4Q000000054YKn7$1(37PGQ~?8%`UW>L^929^ x00000P)h~}00000{{{d6000000RR91P)h{{000000{{a63;_TD|NsC00094M@P_~Z delta 1053 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 b1~(D<1poj50000`O9lr300006lS2m~`$y^E diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.70.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.70.3mf index e3f3e98bab214395290973607fe5ed9693fcb892..40b4a4cb134dccbefd43e1c5edda40d40d04c102 100644 GIT binary patch delta 1064 zcmV+@1lRlM4(1MjP)h>@EdT%j2mk;8001fN^RfT`|NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5CDJ;00000005H%00000005;|O^=*75IrZ-{s-i}Yz_vSuZ9*Rm(@sn zi4-H+Cj0Wz)Xp>XL)Eo8;VvT% zw6ZIz_Aw`;DrrK#eE#EO)^r8b4uabuCr?V9kDfQkCuqdrHkItVp(~XuyT%KOMzmuo zq#Aql;>oTD&u2XHm`|LstyE5$s;;XB6!b*C!bUHaDuiN z9@_5pwT6eGdWFIHi+{?z#nt2&ZMw0SFz6=?bCg|w-Sv-sH=doU$caCNzw9{Eeop?p zi}5eGyCdFg>0O)7OWo-QNHw|P#1J>U9+-Q;PM-Nst&9AR_xJz&os+l}JdG1ZQ;{5K zDARz7G>j>vj6rlNr97eOd1i;-Z2>PiVQ)lXc$(rPX*@T&y0f?sW&vIt#Pfs8rVnv` z=H!5Xbo7TfuQ{R2<>qM?x3;9*_02X~QqJ7SJif!$#}j-pPTk;FP4|W6iR*{V*9ROq z@3dXXjorvNx~-N+Zt{y!*Lm7Scx}3;vKu||8!fSIy1{mj;W|UxmUOEdZkgJf;fCc} z=&JL#Ew{R8+mfzh-pWzt{qMfW6uz+9$NK7j0$Em^XRhyA=h@FmgkOQaft<^AvBKfb z6%OB5+c*ShfA}7;;7nXR%o>N`EjUdK`59bj#o^8sF0kT|k;Wx++?#sS8Ha2w{EUtT zXLqO(7+B{K1@jG$#-%|bQ(I^QG+H?3$cEJEyQsET#bl9V{@zuV1<37%;p+-=dxrFX z)>RERGNii;<(MYh3T^}$q`l1+mJ3b|Q~2vYv)2PN0t6}T^Rbf-1}+JJ4FCWD0001!lSKw(0@VYPP6if}7zGZK i&jv362$TN?Hxc*+00000002-+1_uBD000D&M+YJPu=(x) delta 1057 zcmV++1m64R4(JYlP)h>@EdT%j2mk;80001K&Z+d+)5IxUI^B<7+4A^`$xCJwpRiwR) zwA#rzGR7pV_-KKucLMCpC<9-{pjPlsKxB zeOY(UIXUXeP080Upa00(zEq6^;BL&xi`Iv|?~n3DwPN(zS`Pi#SK5<(>xX44x??4z zJ`TX*%YIOPKw0e5fH=pl);VeGrm0({)j*JQ-w2dbo%{Ijw9t+FcB4!yfUOqIMQSp; zKWyYV41IZjlp4xmn0AY!Vk1+bMB50hYdPhgO!?2Iw$^ZL3<(r5S^SK0qoGmB|MyJn7ev)K2}?g`9&`C-`(6y!`DXl++1CMY=vFSFQ0(|K?r!XhswTT-X>|EiX z?JgJm1{cpb_*y}}$clp<i# zE;xH<8k{*9>||TB8RWUyR-mSZ7AREAMta+9_H?F>z!oxz+dBgf@CsWIHN)NmdP%yqzEY$uBa4sBUY8Jpi$|{gvW}8l5v^N z^JL~v^56^H;(s;p=_j+*12X~y0BO#tlMDtf2?q@T000000F{$N24n%(lc)w%0Sc4- b1~(D<1poj50000`O9lr300006lSKz1Rkrx< diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.80.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.80.3mf index 802393609ddc39bd5e04f48e1f2e00e191996db1..ce1acea65de70b1210fa146b9a919c054a66f095 100644 GIT binary patch delta 1085 zcmV-D1j75{4(ASkP)h>@EdT%j2mk;8005S#RMP+d|NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5CDJ;00000005K&00000005;|O>d+)5IxUG`yY_^vU@OKXrO69a#=;% z%SfY{oFlMJ!ibL+m?)E9zhx+=o0Uutn(jjf`_-#gA2yYL?EbB7oL4!Fb>HQLxju1Z z$9qwC&pDY?MUUkE?vKw|+Y8w^0Pe<|yeM@(dEUrhWLu1GTl1kG`%1aIZ@o~oMK@Ii zSJMD29`6U~1wM;BKOoN3)hZ`#-86M8l^lrXJT--OCp-H1ZC>ccQ@hhmTL4>KG#6L1 z*wc9@&w1#7#l#h)1DRr@sNBg^%A#!wrD{IMpUm+uqW0!+Y>)(!m>4}H-zjL6d>SP0 zJ0&}%qf0&iK%lyxGN?r%3RO5=(aM~BuT>+7qkf*@;p-PzBhGn{qa0pgfswn^e=21s z#;2}-e{bZ|Sij5B`HTIXd4_7{1)F{vxE%EpxH<8EzUhbOp`Xr9Epigf?k_veyq}Xl zA7c214-dp!EWK;fWvMTJNUmlYMo>8Fdh*>Pbn>EqZe7rSdVKu%pPYo%F)CQ-(@Khp z9z-B0gkI1zDOntIkyKJgyQqWTPRO^M_#Z;$_%izk(Qs~bb(i2i;evc~0MBAK_VtH2 zKXa0QxFJ5g=Y;w$!>1*CaN4mR1Aa|{TP_BJyrXAQbO8v&UlVS%8qwzMPCGzX}#Au%F@yj@Cz+{lvA ziN(|*+T3G}KFVqD5KRWD$MdLPi#AR?X$EQcj+B~9H=RB6CLjcAwHD`?PCYAVO1nxF zX@J*fDD%t(h_ja-J8>?{yk#)dLt5rttp?Dnoa#n=OoD-5L_#K<${_OTp*p6t3@b^K zGKs4LKg5BEm$5Iam291bR}Y3zSu;)^eQ}IZkOk`_VGQ zX5Q=`bb(s^?-cy?AG6W}GXeybs8rIE2?j0+fDHfu00000l#@UPWC7Nbr3O?136uH; zH!}GJ00000002-+1_uBD000FC0000000031002-+1qJ{B000930{{#G00960|Nj60 DRUzp3 delta 1052 zcmV+%1mpYX4&x4gP)h>@EdT%j2mk;8001G+@0wcB+zznL?c`QsCor&VAT*Q+$1Y?po(8$Eg|mk}!`FNA_Z< zoBpvRvpTvN`TFIL&qX)XvULF5PbGO$>U8k^Nj%ApPhQuEahQgq^2E^jVcqe5K60Vv z5m*NM_x~&}`svW^l<7FIHN3q@EoKj= zojj*;sAr*nARU@1F^;O8OqJwa%av-x5`VhHzna>c!>QFIki^vZnZ!;*lN9qP#n3C+ zD~vApX+)s9p9-i2uest*&pTO?e;d_G;;5e|c=-D}yd%zOl#?9K@Pd&qIen;PUr!JH z@bc2ihpBmyQ{fw$g%j|@JPJAC6G$Ay&<^9{ILs%1r>RR4EYg=1XIU@FpLYrThIeO;zbl0iSrY}q+TA< zm}SI&c>yjjp!h?aHMku+Ki&dNAQE|T5Jy?KYTS<8bmOwzOY1(DgPxdryZrO}2V9;Ot#5T9=5PR3mA1C9j z*t;#8V(#YA`B-gx&wu0!|J}(g6nt&;kL}feQ8sU!Gg}({9N?wroWqj93A-HJH#k_i z!a>_vaBwRi4!%~9FS6obasn5;%S#rN!blt+(p$N41FfL(08fmX0cFzT8 z?@W!;mBCK7HJe7hHrobNw~&EC#%!c-o6R21(h=A~I&gbuU;(dyc1oRd!w5ZUF=@J2 zOQRKoEPQhV>M;l>Ks_QA{yL-Kyj1vEZ)U-wnwz%13}q?IU0E8sbyW*D5-fHz9@Z{R znGji!@F>y~SkWliIV&&DXplZL*|8u?xRkJ!veb>ZNL?Q1M^|K39z_X{qc~pY$--ac z!56s2|7zgVFSFJIGXex5&+nU)4F)a=2MquK00000kds6PWC7BXsRmR51(W^;Hxcy( W00000002-+1_uBD0004#Mh78rn&r#@ diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.90.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.90.3mf index c8915c80977dcc3a4485b422480f4b11b70164eb..663dcc2aa8952823014dbed59bf115007bff74d2 100644 GIT binary patch delta 1058 zcmV+-1l{}V4&M%cP)h>@EdT%j2mk;8002${AuIp?|NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5CDG-00000004{w00000005;|%Wj-76kWGc{{gw1c44r2%`k#wQ$^~g zQq^WXGR7oSJVszfNxr_06Ri$+nZC5mPf~ZZ9C2HPe zMg5SVUgmg@Zf`z)jH@OSr3K)+OVFc~r-S2k{83b_v#Wx)P1oeo=1t{zS;gu;XI%Cz zusFPFh2s($IK)L(Ul%e#RZ*5jC8TJP;yjd0xf3CjB!q$u6UlnPdrOv-`}@$ZKCM^RgI*p-?DlDM1nbbOxJUA7ZEl%a~+V%_@yCBv z@=}UpSG=^$P(lZ?k_vmu%DpMcOiVe zyF28Jmd@OCTx!xkg3E!1A}w6&IubjAP9F6Stqb}O_xInwB`DtoAt5=#G~yBV^T5YZ z&ItBNp5~t5A|(N!M|JR9XW}VAXZo_~1Qaz-hm5m=zA(8*oY(=+ijgh=ZLO&NJdbk;3gqzgOdpMjWU$=+kjb zxT}QPG2jh^is>Sdu6Wk2H6w)-87S4(jMH2cokR-hdskH^AT`&8E(=J_2~u0L60QV) zu9^!{q_U7%L| zHwAzF1+&@%GXexo10gGu5e6;^e+>Wt00000jFU(PWCG3ulTij1lN$vNlhOt+0RfW& c2R9P&1poj50000`O9lr30002}29rw%AYIYt*Z=?k delta 1061 zcmV+=1ls%G4(kqoP)h>@EdT%j2mk;8001X1hI;@1|NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5C8`a00000005W+00000005;|%WkAN6kYd7{SU~q25jDxpnEflG@F)2 z(^*Hxn1m6J5|~mtU*GqFsYg1d3r(^}VUEu^_hHvf_Vu-YZLE_V#=7rv!W>F0*@?ca zyXTxtsi!vbHZ}V*$7ubMm6p@!-0nc#$n1owgQ3KlYV!MBlo8+463xxKPso zEUxGW>3WofF7=2tb+yV#TQ^PJN+kz^oQH;^ob2q!f9Hj6JhVGyS`KVAZ!S`^*~4)s z&vEF>NhnBvhh~aaN5xL2Lh`oZO4VYHKc3@XOzq9#*k}?+V!Zkp#ZE(`6w@F@-znKC zj4pL)K%lyxGN=VFx#CvGTbYyZwQ3}>)Q=-P{PPXgh;WWT7uiL^W!bR1R|kBQ^q1tM2-8An{I5DI&qq$m`>2RditFRY`7Eh zKMee4YvM#v97J&E>@0%KwzhtpTNXRMPtTdUJekw5xn(mpk2wL|C$_m|huFJj{x})8 zV(+$WirJe-=VP_)J-^6h?z@wlDfrsxo|~(Gqr9$ICpMp^lZTg{b@Jf`xi)cwgEv<= zXuHb+zrlqI4!%~953U;n4&ET2#=)&`z`?zOI5_&qXU4&sE1X%E!Qq_)(Gi1RgR+i< zX&^W?02yRsrouDzzQ{&5rctrq7CHS$di^|k>)&q zVQH{~?k)KWG{>W*F|AA;vc}z!_7!PP`dXj6^E2muyXd-wu|pAP?qPg|0coVU zir76DoVhbKPFDsy+0<+rd2Y51sBWPZ3K=tz-Zq;#oVg>gg>>NN&cFg*0nL;;=PM)h zsKMmgy;>TrtjNq=Z#F#!;RL8hq|9AmW;C3aGWTW{%!;XQ%JWc03zje$`F2%_zz(WN z+6iZ&?aMF-cv1u*FO~@`tCei6g%@WuNZ&fy#j(d}N`);1_3c3VmCd6lvBM;-xG$n0 z_2Olo%-mTXe1Tj1uLeH-1hdWqGXexBFNS)P1qLn&2MquK00000n3FsPWC7Zfp$1d| f4U_f;Hxm5?00000002-+1_uBD000RGlRpO_hj94& diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.00.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.00.3mf index 5832fc30c0d9c571e47cca2d40f49e90a028ad8f..5c67869f28ddf1eeda8a7b41a5f434b635d3b3b7 100644 GIT binary patch delta 1045 zcmV+w1nT?e4%!ZXP)h>@EdT%j2mk;8007*n3@!iv|NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5CDG-00000004&r00000005;|TW^~%6n^fc{RiZ|Y!3#^Ef7KbGF95k zq-pDOWQ=Kc}oQr6@l!T!#7zH_m265l<4SEX^{ZC5mPf{1A&gV(Id ziuy4@y~uHh?ruMSimN8$r2*i&OVE=L$Gv5B?1@*jGpmBNP1oeYWKCtcSw-tUr%d!M zuvn~Vx#ifzw`>O)eO-tIRYh4A6&Jikl5<~D>5kX<;rFmmcl&Cin~DNkLCcG)LG1px zk>}VpS*dB@umED&@X*@u+ZS$C+L z^SR`Qt~m3~_)5OT)3hhld~E6BGogzw>Pm2VNLqFZ6Sq z`fiFd&MD&|bD0AvK91_(v(ET)g6vnJyn7n_gJ?K6vbtk%H)?@D8-ORi8QSuNj2G}} z`s(3-oFHtQL_LkcEiExI9kmUXnAlrv9T~WM4Q?aTRS)lQyENVAmOy}>OFTF$pn0S1 zB3#c5714Fc#52i%di_AKOVcftUFnGrw8XmUirOuP%aX2J;K&?ifietiEB~*?9 zuOXC77lCBOvvRE%38Y9vDYs^v`l6^L5=h^>sxkqIzAj{0K%!5O+?theC2-kXkRsK8 zV{6V;KnkhvvPtEj0s8SBoD)=ENl7AgPQ3vtbOlloO~~t|oRBM7dQ(gpqRzdl(Q7&N z9U?meLQ=<(=z(%;j?{Zsl!F1JUf)VnK$2P3NPoyxI*F>gUZoN_0q18Zwx;_}jb3u< zRAX6ejdP)#(PC>cf5vHFl-cVb=-8=HOTv_3-wgun?XnP4$EVoybC$6TCW~mCj&I^Z z@X8o@|pjQ5yf^Yu- zv(^JM0tDQt3@wul1}+JI4FCWD0001olSBq&0m+l822=w41e5;;HWKUw00000002-+ P1_uBD008&~lSc<2&`#}U delta 1066 zcmV+_1l9Z64(ASkP)h>@EdT%j2mk;8003?B(J}x3|NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5C8`a00000005K&00000005;|$&TAN5Itvr{DZ(bOCqh^kdn)wfw=@2 zO#0lQD7sq%ErvuHo&Ne%Nu-xfQ?W4i!4~KH)N$|oqj-@mAHB8~LqGNh<%z!agR14-bl^fw z19)3lai*?T1!?Q1savV!K+xyD;YcSt_wnC(p&R$@Mw*s`x0*K>s#)y* zxY5sX=&MP8C`gC)6dOh5Mo*>WZNrtS#TosPG%Am3}%NaCm;M|k+>8>|uMILJ{BCs<(QOGckc*;V6H z*T20r@@cH!gpnd=N`1fB0NjQr+r-7ShRp^FEBHb)0 zg&WX}CzLaKNFqQl>fp1h~1oufV$X5sOEb?|q5XT{Len6Pi z%K{pIv6MJ(;LF=ld=X~}ZiD5=Cg2H3A}@~OGy+ECxF5Ny#$}n8WNDTy99K`jBLRau zA^$_bZ%k7!j*~EkJ7;4NT()NVac)_RMLuWh@?=lLs>y0>JLZLS8`-MK2C{d}{BbgF z$=;c)lDVr#=VP{Yn_uX1|J}*W75r>;&&}0;Q8p{iiOr|!w8Kl!IRym?u0`D7VCM=4 zZFf1~H#oRp5C=ai=nqb;1qVAqra` zBC-G(WMg)TIf9^(!Ui?$1_~-{P@N%$I?$^<=Vt*1YA+*34bh_v^tqBJO>dC)JYi{n zFroLB+yL$IXlhI=h_o|fxWKG&cck4Q?MXNFxjR2|?$?X1TNpbOf%YE8EeuE_?N!9? zx!~-bsd2h8*vYnL)5vqPtw41P87O4T=JdAN?BUEEfi0v1w|52>@Cs;msdH{TLXTQR zn(o!qD8(Ri-`s3^48jRek4U+{%xE}WFXjHtESQ&5-BjnHjLRUb{C#1ZWl>hLjHk;y znfo(6=mNF)uLi#T1hdHlGXex{^3gGp1}+H)4FCWD0001#lQ#xr0@eeQKn50*3Iz_6 k!3Hk^2?dk#1~wA;1poj50000`O9lr3000052a`GnAmMBD_W%F@ diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.10.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.10.3mf index 06f9975daba62563824c4693b908708ea447b795..2352622f8435742789689149c2cd5e34a69b4c11 100644 GIT binary patch delta 1043 zcmV+u1nm3t4%iNVP)h>@EdT%j2mk;8000M_@09=l|NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5CDG-00000004yp00000005;|TW^~%6n^fc{RiZ|Y!3#^Eg^#TWvaB7 zNz>Nn$QaWyaf!f0ZGZia!A?RYlhUOR3FbTB`Od}mX>#{}TvyhScYWD5DI&IuEZ(p- zFPp~{4WhtXba(stQ&P7%uPgvJeTtrhIP4s!XHUGQyR zBV=^3;|2(-dy_ydXif#S8d~!d{V7GoktJRZ@bK#=tRd^r@t$`_SRm*&cJ~=?@_yg6 zudfx~_vI_^t*_);;%KUo7i`+0W4xD7;AY3#s_h`Yl^UYdYXcpTVi5+3JjK*xOVt{TMu^d**LcSkD9J?3(>}#O%P4duC$$n8`z#A zx}GWG+u;Yj&hxZN@Z5AwWfywlKU!khbV2PJ!+D05E%8z}Tr)K{!xhVUptH_jwp{9> zWlKEwc`ZkY^X9xr1YB6nV|8(W=oRZo|1E31pp*iy02yT;SloTE+oD z^1(e~z$w3QTT2|cH{hf&(5G;L5eIKBaJ~@-iX?73`Mnx%JmEmCL7$34{R*VEvWT2FZ&GRqp7H@QkDQFS+~R3bI-at|erKL6C{C8tg` zmL<+K7s?qeac1*pk_}~*p9aB#7WpPlAO((S!ExYjwm9Z)go`-KBVI&NxQ(Z&FDV7D zt%+C8g-}^NO-2Q$5%C!g8OdOp3}KqgD8VeGe&%g?5V&NTVH0O`54u3D{BH_={R6Y( z12X~y2c7SflNtst34aX$000000ELrL24n%plePv_0{R4#3IDD*00000P)h~} N00000_6Czw2OtAG+}r>F delta 1101 zcmV-T1hV_s4)hLxP)h>@EdT%j2mk;8005S2n-Bm0|NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5C8`a00000005x_00000005;|%WkAN6kT^q^AE_g=3y{Ulpxu(BF(0y z(M;BnF|LFWj}n+tI$z)Sf}Nt$FIpghsHepI!*n+{y4 zX#f^q^n>)nfX03h5@+gaRgkuBn!1%r4g@*(4M#cIxsU(M6WzFPZ#fUFU;ZbBnrSG}rnRRh>QU(8#rxd0;C=u2_}90BB(x0TgdN;03^SJn>CWXc zk}f~6j8T!vEX)ACxP!l4C0`2?yc?C{%d8Kk;mlxVm*BqW3Hj;(o-!{D(k$H(=Ldut zcv%#G#1uwvz~zMj{t#yg?uMP8ZviF{NxU!&V+I4%xE{Ib#-*8;X1gp~G*+YEiCp1B zL;i<>-)!A^Ns_Vz?wlKo;L@$FpXZh)UK|Bk2F(a+tC2lZE6}f7He(B^#{v-3WjRaR z#WuIxAoih|KTpP`*oQ5fV(#YA`CM&#&o6R+x&Pth<_f+xy60wfl+BEDqVs7wg?Q;X zr>G#&+QbD8R#rG@yYm6Rz{Lv=zE+TrS#hv}d>RM0zJ(9&6~w{4g?x4#tgLW$UA#Q! zKy<|5*P^T=p&AHIEkFv{m?<$wU=k&4P@`_3KyHKT3{muftoEG08!%9N88H}0C)z-N z&W${2d4sg)2}^?=bZyBE&>oML#+4M7i2w#BuiIn@x8x7w}xqtB%%*&~6s`p2kIK(m$ zl)4csE0?7)b$P{@Tk^D|aa2`FSS~NHyjHSx7G8X#LHf+gE>6OVGZDE_Tm~+yMB?tE z5T17-<$^^A79Z&Hp3MDO9(;jY{I3Q+{RB`;0|YGq000O8000002vjc9|NsB9+yfp0 z1eR-?50m}{E(r$>00000005zrH3nn?;{%gE1{RYD1rC$H1}_2@1(WawHWCH~00000 T002-+1_uBD000sPlQ;(;y6OD? diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.20.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.20.3mf index 2ba7117cff7141d8adcdfdd3f2ff69b18684ad9e..b63d795cd9a139e0bf832f299489ec2f3e5ad203 100644 GIT binary patch delta 1048 zcmV+z1n2wk4&4raP)h>@EdT%j2mk;8003qffGq$2|NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5CDG-00000004>u00000005;|OK+So5I(0;|AXaT+Jgb}Saw&CT&hUD zRI1vXBV%S0Djq8^QIcQZF_>hDWHzLm!!GtW-+c41nIu<#k5x$?pzVsLPAPXhN}!fa zUetFf?bU&8>DA@uPf69}P!a^!T}tnjI__P!llM@G&Z!F7HeGX2j%+G7$SYCz2O(A8 zB8w}V7F^%sk?Z-C^mU<9S`}qkRG^@xnsZ+Y?G9>o^LtpRyM49NO(l@65ap|@LG1px zlIPeqc`p@zro%98CPmpwrVKYRsQBOyF`1KRlC^@#!LHmFUoL=s{+YIWwyRDn& z=Mrwa;u$*fm48dziE7|Qo2G9ibovS1>}69n?Ooe{^hZ+UDfI{UuRCPePwAKI4gLk! z*VG*?-BZ(XsmcC=R09pCM!3;+%N-v(dDK6&F6!Uk-2C{CT?U8Dk7AGI2k*ebZ4k39 zj|AKBIEn$hT_kn1qdNSqb9hXt_aYR!`@uho#&e^qI|g@Q7T}Q}o=1*1d?#E(A=FH-0{Mbx!gGWf$Qdf z!W5YvTXJp!GDv%uO)3Ws*pKhvoS^nfY7(t;>J3z3E0Bq3LY^<>gj~qdn_}t^ZSGBt zUdn0j5ZxIVk~xmt4%AzxNV|7KIT&E-?X5Hgq?vV%?1$W>lbgERRT_~K@bnBN?sWf| z(MwOAW-LqGaW2#|TH?;;&m`-MGJhFU1jWJ2Hoh+yK(J+DCt=o&ix%{kcSed$=GK*@M6Zdd7Q~G4tF9LXV}CY+@mg3tN)wA zU;hBJ-vcuO1ZEh3ERz-nE(w1P00000004@UO$KBE%#*SPR0975lL!Yk67K~700000 S08mQ?2LJ#70Q&}$PzNBRP38>% delta 1067 zcmV+`1l0T84)6|tP)h>@EdT%j2mk;8000o54-EhR|NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5C8`a00000005l>00000005;|O>dkq5Iwh2{{wQ*1`J+4R?u9kNWE05 z+MFZScoQlFch$`y!G50iX6BilWH(QLP3;_IKU7_t6XyEFk*(;; zs(r}GsP;4=H(x$|%$ly0wFBUG$jPHphpp!g;!!rm;5L=$yP?}FS9FaRmQB%)`$DL( zhbW%tdg%o|+jxFJoUyG`PMWH&t41o>6O6g73#5}Rz56*Ww8OT!lBOvjT2<6%s!8nj zaAllB-<6|(P*4sXDKd(7S4P^&qNxj|Dlz3BPx;THuC3uv>mX3X*ytI=m4XH-#$Jl9 zRkBr>UF!LqKzBc6(2JrhRN=HmBXjbrQne(GdOpCzkMFQXoI@`M*&ktnkuRx#zmsh_ z+_&A!OD*q*>O~HjXTnS|0pE?ikOMve#a486*FW@s-FR@SGAF@Aeco}V{hWNhjo>G| zy(Qj!(pw&#m%80=Dby5(5iMG4x@T?xE}pedwgv6mySr~+b5aIrTykF0eV7W${iL9~ zeH2liYarhz5oZJ;B-#-G8fFyF`Bng7e%yBt#RSjjS8>dN{&K!#;Ok|A& zHZO$yhk$<^P24Doc?9pAE1N*s+R^vZW|7N6A8IwREuQRUSb#v_;_06*37E@$|J0T< zwViDB$Z8>9pL}EH_lvQ5WR;ArUY+;Z*3bNZMVEPRZf>UFYomRr7gyP=I7c=a{TSd& z&pC!UfjfP^xUX=qv%rDvEI7EMh=Z>cjK{4w*jeD^Dv$r2RjR#otMGo zMIh4|gI)`>&cpyABMXp0HKveQBM^xcHmG4YP*7om>IyN`fl=)>KM62UdmAxp$R1^X zV9b>|X?laS*9lvL1--Q8258SmQ)5{{q@5Yl1!j%ApzH=|FS_Z^#r2tLzut6hVRR@0 z?HMO^s3vGV{zEP>(@oI05PrDf8wT4dGYyRoXv(@+)#G0bIA zNQLB#a+yXnm3~4uGD^xcD3eX1N5!mCvT^3PIHN)N%w(6qC*81+?gExlF1VmOpK}@} zG7RE~Z{i}D=gG{Q=s_2##s6yHuRpWQ12X~y5T6eWlLH1W2?q@T000000G*RM24n%> llb;4u0ulw2^#(Q)0tNs800000P)h~}000004hNGx2OzD5<@EdT%j2mk;8006?`Dc%47|NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5CDG-00000004{w00000005;|U2mH(6n*Zb{RiZ|Y!3z-2!RONm#NZT zCQVzPBV(MFiH`_O)b`i!8tf)aGAU{zCBZ)T+;cxLH|gDfb6q(n(e-89WQe*1Iilfh zQ8tem8sq`T=KUq$7i`+0RkE4UnKDAK~Uu03@F=;TTN*t(#9_wexJdxpqnlSD-n;h3-phvcxq zjBPnSgkj>dBFPKR06nRL@1_vXVD%4MrdhV$euTjHf|xMpf^hAWoyKxdu5 zY`N4$%a(ZV^IDEl@4xdRmGHo79;=H3#H=`fC#ud_=j6lT0bhYSft>SkF~h;m1rDB9 z%QyfiK6s8;aM~|CtrZU3TX0Gk=+n5+ii4dCTwuk4B87`5zgOdh!$#=?wHAFk4uiW& zs2u~|La3O|0_lQh?OHQZNRfq7ZC!BMi=vZAA${+viUCr4UFf`k)Se)SC%8 zZSHlA-pXn35Jd(d>D!Uofokg#Y4@%vM+3;GJ@Y0Y#jI)shL(VII;pO^U8NRjfS31B z>Y4LTk6vo()MHudO>?1|(Nb?Vf2R3WP*%m;AQ(rC(2%I{FHUf%J{a{AOoALX@}dZ0 zK23dTDMjr}ylO6l%9?5N5RilL{TS!5PjDFf6zAJG$9X717O|w@FtCrQNWIZL=mNFs z-xU1%2eaSWt00000jFV0VWC6~Tvj$WF0h0&^Hxls$00000 T002-+1_uBD008|4lTimCRr2w~ delta 1067 zcmV+`1l0TA4)G3uP)h>@EdT%j2mk;8008VqE#LqD|NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5C8`a00000005o?00000005;|%WkAN6kYd7{SU~q25jDxpnEflG@F)2 z(^*Hxn1m6J5|~mtU*GqFsiL}LQl&{2Dci^AocplL$-cgSwvBa?!&vuSPMAZ9B|FiV zb@!Z;NmX`2zJB@qN7nYGY%BnGV@_U_Iv!ki6fd&nqtn)6=*PZNj_6z0FI(PC6&Gq6 zfW;O4AYG5L(4`)+rmj{wY3rt`TdCwgkn_-Rl#`wP`0qT?jfeJ5nU(`v&6|tVZ1!-x zljk_}ZPGm1M6jZ#d56n&>; zr!czIr2&EJe#)R0yyS{o9dBh$zSpXe#8N+wF!<*i%n|E2$Waa_m|)~fN}meZmE%*_ zzr8i`X{_Jmn7J#>%nA5@8iX8i1QG|)H~sKD^wZIQs>_^sv-D-fn%8sk=R*X){=)-t zm!0l*>oV0B|4E@{8b-8f?dgd*K6LToeQsOuet3NR`>&itWk{1Wj_k-wm>tA%Vy7wh z?TUMzUkF|$ECKZ54*qtfe9Z|x8bkW$1J`%aXhlczQ z10QTnoG6Ne2=1Iai(s?8t?%cSg-+~K$knX28JRP+0fE8I=)*4Ym=jQXF3UyQEVjF4 zH<8yne`)6Tld-#HSIpi$I`6CP@A*wGbALI1xtW5mjqbVG9OZS!II^aTfvo17pAD=~a~UxhNGIAr&Ye7e zY55gt&J&gfJLuMuuRwD=S{l;|Ce6wiE+}i<4QXGI=A^Inxj8>`?)QtXTNpbOf#x2@ zB@9R-%~izix!}y5sd2h8*vY15)5vqP?Lc)4tx(9AiS)YJ%;C%(fi0v1H+KdWa04_` z>YT5P(4z*EYxintw6Y>IcfHy4GYDU2fclA)xyu_3-%FW$^%l&Escy>iqb&7kT2zeM zQ5Yt6;0LK)Br>*>LIz1yl{Dt*@&e0hC0lFZ#WxzH@BFfh$})_-z@}AF0*MedFH3mn z37^G98OXTe%X>0&XL;}iZt=ew`1BLA&I2<71nfsG-;)IfE(r$>00000005qoJO*R| l;FF;SQ~?u{_69c+0|o#900000P)h~}000004+oP!2OzZO`-}hp diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.40.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.40.3mf index 317d409fc190a3fb257d5aecb8f1f4214eef36b4..074fc9f59dd83ddf6d3b5153b929ec0d54046857 100644 GIT binary patch delta 1043 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 diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.50.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.50.3mf index 6992e6a0a3aca4061d2962db035dbddefd64fe9d..ddf766e80c1f2b97117de73d0f2fd1b0a01ab2d2 100644 GIT binary patch delta 1051 zcmV+$1myeX4&x4gP)h>@EdT%j2mk;80025?@gM*H|NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5CDG-000000058!00000005;|U2mH(6n*Zb{RiZ|Y!3zuq>u>Om#NZT zCQVzPBV#))6CV+nsLik6HP{VIGAU~EkYb;E?ztZ}x9Rg53^=>G2Wr?hIgC>;RTU51{eJnlTNW6z?Zom&;GZMx_f{p{gj$q7qWHNOA5;s@#bhKmHyT>TXx9bW>4aD`ICas!J1l% zTB_)_o*yBo?oA4{pqxtT)U*;A`cueKAVyW%W5=PUV^dWLG?1)HXCndsCLxY@C$Y}%)Pw&{;f!7~&L?k_veu%DqX54Z3Q zA0Ci5T6$B{ajD7w3MK~{g0yh0Yfsz_bn>WwXkF01dwl%yJwrT+V?jB=TpTElIEygN zd5rxi$^DSg=&(ruJ*tD>nv0hV`ENo+_dNIq(Qs~5b;sat^n!SC08c_U@zn=8uNjI! z&iHVD&JgxpqMyd#=9ZYaf!+p7O#C&r0i58A@zxFX!#mv0P1m`FXk!w^WIIH=(smYZ z;QERPDsWvgA#SL_kf~K(KM?HPbWLR!dg22uv241ac8%dYxyzP#sT;1D+MD5ubSdi>x@DukwE(1RTTpy_PUUH0f{|9YHL!$g}_yR zb3ux9k1aXZ0coVY%Z$oFgR1vJKqg5_E?+`@>A?f2t>_D|OMcTb<%E18gY0ta~NHMD#fuSWJolc_bZda*A8sPK{ zrJlL}^ysCgPCb^T-Z&Sk87=i@^Jkh^_eIIy2EiywNWKXZd^p58j*@MT6S3tOCPJEr zagqe_I33@lg%p)D@~XKIDr=_6AlXnDeQvQ}5yue=eVnij!vSYxJ9Ee z7pPVLO~GIPv(y7L0t7l|@gI{61}+JI4FCWD0001xlS2k%0n(GG22=qBll=xa5%mQC V0000008mQ?2LJ#700EOl2O;!k>kR+^ delta 1083 zcmV-B1jPH}4(1MjP)h>@EdT%j2mk;8005YKX&(Ro|NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5C8`a00000005H%00000005;|%Wj-76kWGc{{gvc9_BSLf_76y>ZVfF zW*vcT5-J`eFrzeI-+RHHM;g;XO%@r<@j2%{?77K4Kevs4bri!`_gzk?;}J`Atmk$2 zn3G9Xc0xXX`tUw$doCIaz}=XWCn*nm*B#lDXp7NlYc}*_UrC4ctsC&R=%%V*avFfe zW&I#r-=mT1`NW#KTIQs!o2G7s6azudeN&*E=^AoTX;7`@=?_ z!_f1INl1r(Vv4n+awAhIinb}Ftl1p@ZjOI3wKa!hqevi$JMCv=8x4(uO@m;4Cq*YQ zy43YT0@Zz&K`jbi$inK1R^;SoEgL~B`TGD5-@m~cu?~Y6#c+fLN0WMKmiqFSU~;CRM448e9;g#R7cbuDwgvC|`}?n7aTjh$K#!M1BIfK#kjxt8Q$XI=eJU(?#Rr>0ctS;YP@R z82HE5#EIiw7{i^ju?RL@+xm8HX^2HWW$OH7PQ&V!)!2OMgx)r>)h!#uUN!UE$+#AK zwPjVzUOhT*tF7<(OD=O?o!m^q*GBi)TpVS8y<#2de436vUV7Fs$VqT%;tB_EE^yFx z=L3F)ixwPQ4#*c8aqtHD6b^2E10UQgh)WkfGY;Nd;LN%d4(}X@iWvMFlvN~D0l}#O zNFf_DCFTf%MhO#Ct7|Bbo1iK~6n!A8Ip-$>8fq>h1_S9t8_2nmCnc|u<~(6(u!C-Y zEx87o<5AL>RxoK+#&AJd;ciH~Mw*kZ>vMB{=G?CrU9~WFC<4trjIS^tg)~UR zca{fV;1>U@flq(4(E~IB1ekki9+L?ME(r$>00000005JdKn7$1)sv+LQ~?N+`UW>L z_yqs}00000P)h~}000001P1^B000000RR91P)h{{000000{{a63;_TD|NsC00010} B-y;A3 diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.60.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.60.3mf index 71c89d2145c7b2dc8fa07ecb4fecccf83f8349c6..3b62dbbac3edbf07d94453714ee6ce8721bdd3c8 100644 GIT binary patch delta 1046 zcmV+x1nK+d4%-fYP)h>@EdT%j2mk;8003V}&ba^o|NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5CDG-00000004*s00000005;|O^=%}5Iwh2|AXaT+JgaO5<&#KmujV6 zDpl>CBQR!{ijN3Pw3}bwF_;8aGFjT>ki~xU=FNxAYbB0L#p}{$X&F~t7IWD( zz+&^d5w`2ljqSJ?byY4ST;@fQmqLmLE6#lpD|ezIkH7kbs@<0>-IOt~<#BO!)r;L9 zSMnU2I_hrk}hc-Wp7JZ>#Lwls^dBLXc8ZKJ(1a9`cF6!ogsj0go%F_tDz5DA9>h~l3`C$uR z_V9r1!P1_Z4oh|NM{wEGP^^V(T?cAyp_2#wed~h${o~{JZxQyAjT11R5htUJcpj%D z;VdBz^LIhKbzSOvfF9JrZs@*MTS=oNfg zR6m@5BTSsj(-7R;l2FUNS`zA5oA=wgaDuPKfyMsSbe&s>mU@B1AaM}wO51t3mZyjq zMz=EsetZpH>vf)|Rf6ZHYbv|Y6aUc?%ccuz*BH(-v}{S1y5W|oxfyO)&I6rw{<7s# z7cE7oViS5lEEonvo+3R8h}L?iNcDM#c&mfjRog=liGYji26 zxkFTEKuG#HQZrC(O_65rnzA>5)SFvr3`jAn8krBdPAAoMH>=blN8t1fh4y&=>CsC~ zoq8+_?O`rdGg@fR=Fc$c@*=$qg4--nb9PAzlV8eU5M-`LlAW3h9loP3+c4h`hN&;i zr6|$BtL8$e>^M#CXvWiQyCrGHeBuRxAVCs%B=$2J`+nkQA{}Pf(C*!XE>Nrfn}Wao z0<+cwGXex(NzS;F4F)a=e+>Wt00000h?7JHWC6;PsRmR6{RET$1~wAy1poj50000` QO9lr30002_29rkzAXlX9l>h($ delta 1067 zcmV+`1l0T64(ASkP)h>@EdT%j2mk;8007&NMS%bR|NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5C8`a00000005K&00000005;|%Wj-76kWGc{{gvcz~(jM5wx2sQa6>V zHtPtCC!yjo0y9eU^}QGDd89EN)MSytK0fE%hnbu7^K(;wJ4e|MRo7;Od6YP^6?>B&Rw0OoNV3uAJalR?3$G_O%7~TUZ15Vv%AAe zo>EsY-()|hgy?B5;w-rAXXY0q!@cCx>m_n zVRYQ55rOKyOQ9BdnXBAs^G0UmXQgUM9QFGE58uDR8gUN29Atll1x7w``cTNW93I;4 z<)xMnL-itu)HgH}C*ZrW7jnQSkl2Z??)t~R8xKx@Rc0iZq|ZCfw4afWcM1H4cXz~} zPx_Zf=cTUrC54)37}2J+rw8UG(8aU&scpgg?*9JkmyC##$BeSXr9s5pNG8H9;y89g zM&lx6c^p##=-D0oZAgcEjTsoc)F{smDVa zvn_FdUVzIBDE<&<4sONCw~qi5h;Wa_lqb*|sBt@T(T&Tvx8YmPXN`-ee~G|>8zKK; z;2%e~UXpC01l~C-i{P@Qqi^SyMP3}zQ>M;O_B1RWS&S`UUPRZ4Ego4R_NtlRPR6y^ zt0RkI?&8&XTW$HwUvjDc>gJ{jzBby&`r;~on-%BCrrUH3@TKP*!;FNNCa!R>bAf}l zJ74fCTs-68YX$itD-L#$PvhWbTlnC;f;c|&*>SLQfwSu}xV%#!I%4o^QPz<#4Fsna zAcJg7l$aw38YOH{qi&!;ZiDI!G4z3~_MD##7^uCB7!0HnZ6N1Dp0vC{+Vg~^!4A5A zwd4k9k4H;mTEV1U8N&r-jk_W325C>asn5;%nR35eblt+(p$N41Fm7Q$8fmX0cF!4S z?@W!;mBCK7HJe7Bnr#89TgX5mV>Z(3X0wMgbp*DM4&2@uSilRQol@uAFhY-7Oq%Z1 z(rCpXQ{TMV^caK_pdOJ@f1c5BUP}F4t64BD#;Pt)Ls`C+Nm*`$8;de@qdniaMUceq zCJK4T_5#KlK2Kn2rDWsGyf~vl`pjfUsR($@EdT%j2mk;8008GUZ%Y6F|NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5CDG-00000004&r00000005;|%Z{5c6kWGc|G{!M?ZSX@UPLgnsYdFi zQq|5nGRDkM@rb}gGx_>ngPFicCZWwN66|x&J@;XAC%k`uDROj@b(2+PgsJ0UBuh~x zS@{&G~dByPl6xTV^W4MV9ATA(gDL=G^C8yOSk({M9X#&AwRZrr^Mq@%-Yd6T3ey z5fhNr7Hd-h3aT1Ho}dr19i60$-VxrbwU6B@$vh&2nR6}!cS9@3htAY@K%KL zZ9)P@sTZ$P!5Ekxdv)+#Ch{f1-kVU_Ja_&A;=z6r^hidR{xz}l)773o3E~)HHPy9zq%$v@rU1B)R(7Yv?>xOHl_GY+ZISq8u z`SX@@T{Le=rarIbD0JW57oma|R{4~VE|6h=1)ZqAXVJ-z@EX3DzJbu?x|rZ#XM}_I z)jSRWnh(yZ1!w%i+gjtmy#=R*fj)y==reH)xT^^? zjsb5W)JzwFbjGuBZ5Sz}$U>>NMx6Gdm?Tn2-%V8+fYe?WIxQfzCrEFNN;ng^ZZ1fF zk?FBH=O!S7w0GH{veN+lcmwAEwO3M;Xq`iEfC^iIOhg0ndMO9wOqSjiQ-^4CZ))^b zPJ4&w&VZ22ain&j-WntA-VJ4E0I9dP(h!hl)-|#pa+6MK>TXwQL=M3584BIu{xhSO zo;uA~7P|dhsAsg$oy?zM+-7<5HVDd4SR{;ZH-x2rOjZGlNf4x4;-{3cb?OP`i+<`0 zGbIbu^Xj<}DmzS*Tbi<+#~93M8z5mZCvlv_gu*zvqB2Rumi04i=yvWw7pT?$O~J3f zv)KbP0tDwaZ%UI81}+JI4FCWD0001olSc+*0?7lDPzDy08U+rM(FQL9`~;H%2R0Jy Y1poj50000`O9lr30002^29rt$AZje}Q2+n{ delta 1069 zcmV+|1k(H34(bknP)h>@EdT%j2mk;8001GD7Z(5j|NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5C8`a00000005T*00000005;|%WkAN6kYd7{SU~qHee{gl%RVviZq*+ zM$=hG#<&tjJW60n>3n_P3#K0Fm@YKQB87c?&bbd$H`&*J*QRz(svoMZ%?WdT;;2@3 zWz|0CWYh=B$=5HR|HzuIRJ8-(cF4(#*2lf)4e~`bVsM*E_TA7Ov@5&D3(H2d<3UJ0 z_Q2xFu2){*v&i!U;*4#jbJA3GT{TLpo*?JG7AU7$`uOj(&<^`%qf8@!trGP`YBIY& zZsa-kT{%jB4e2mU@#3i1$W$oN)I#e@PVpyG{IjX8IUH(30!d63KZD$8Xi#$OmF!xr zT8+`Ap1&hd-A@_RLX<)arxlIL$@favia7em5gz{e25ZDQ_G(c52^JXnlKM}DYRloN z?cUyM^)ys(YRJ5WX5s{VH}+Bu_yiJr+0|YD+;`)D(W%Ou1e5e-$C>tX^5;Vgzv06J z@#d4>_0f5$EB;ebPc)1e)5g;ia}(&|+56PC;C=u2`1fBq5ruz<4?LwTQk?EoC}_&k zl14l(xhRT+2aw+5><<36rFzYYe>SRymq{N?!=1s(&cS^$3+mMYJY#OiLLNis{D3fh zHx2!Nh;ib)0hb&2_(PmIxD6*iJ_1Z2lDaXA;|MMoYTS=pbwgR|CMi$TS>x*IcOr1$ zPRRc-@SCIDjpJk&LrOLlfwHxuALo|sTo(H0OkJMrX;?k78e72Joxe?N^~eUXcg_59 zGH%7*9a$Blt5@e^we>T<$YtKUo11C)+GwAD>#M80tT-n&-KJB3FFofJ<|Mo}af5@M zD;%`l<$~Yfq8SG-2jtsXaj=7Y1_!St3m?2!5SPw;b{yy&U$RO=i z#O}G^?44cz|y+rf3LL8Qqn< zphA?K9+*gc9>lR9h4TcKRa!O9%!@M`q;Hw*lw^k}E+eWEQP5o^CFMNfG*U3Z6lK6u z#pZc3^Co%l1#a=b8u;`Rv&jQ90t6wJ7Z#ERE(r$>00000005VhHwI(^*#nb61{RYF n1rC$J1}_2(1(WgyHWK^=00000002-+1_uBD000OFlR5_=rD5^y diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.80.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.80.3mf index 6ce9f6fc688a43c7dfe7f38fcde02a19c96d26d0..2e79e018a7ef3c1b37c477ee86ffc285b3532371 100644 GIT binary patch delta 1042 zcmV+t1nv9q4%ZHUP)h>@EdT%j2mk;80012HCp7>6|NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5CDA*00000004vo00000005;|TW^~%6n^fc{Rhi?*&Ylww}c4Vm#NZT zCQVzPBLhy$#3cd~wfXfs2Gc+#ld>ic3HEos^PP*Glj!b$xh&90G;Lm2F=iIUNK|Q^ z<<(=1J9!{me0Tf#Q&iTOC=h_FHpWj<9(T6grca{etySh}Q@8a&T4`O{ZdUTDJMdI? z4Y1g0-3Z&E%(tn7QCH89ksmhBYjk|`0qEVz_;+Q+}?;~zw=&0$+;5=i1^)YGOb1+^mW8j;qO z6qQubg*NptRQD!=TJVfZjw)V?82`y-Auy6JM|k-46V@;~Hlh{H2^JW>4e34+Ro3pS z`g|_LzRk~~MPJ#s$R4SBUa+aVCKauE0yn#~F6!ogv8lTw%Ci_dz5B}!>i1*(o?kc}Jo#Pb|Z z_$Kv9#@vG!1eq6vkmBQ@4nC_)Jja;63Ki{B?;k|Nxlz>}g1gZR;u!&+IaWZ`3!|49 zyOyheAI>o*)MEN+2ySjknC0kguq2FH{`+kmIKda=aE;r!={mO%EoGY^fCCPiSK7|P zrIxFSu4gK=g8y{-fmr9JYYMy25+CS@Wzz+tkF&C#G(HS#)w@?8Aqv?jLlyEM_>^nc(2pY8eLr z#RpfM0jK@KQC2u`Z@?*GpikpGBMx>ZIM;{+MGCha{9cVW9B`o4pijp!;;s^E$AC8w zDyEA-w%}R2){G2NWS~@A6HaqcbP^e)?_E_Hfy`VNHZLGECrE8gO1KcXYA#5T?y)6* z=Q<#bG4-+;^-_+=g)F@(rV7#IUf1ZgoaPQu zodF@~nHFN5r zEV75GP)%r&J)1tGq|1x!bqw?}?)!&L4I{4SWyA{{O16}Sgi|MQorJ+3mSmXuqFjm+ z4ZLb9gvySy>)2R0Jv1poj50000`O9lr3 M0002>29r<+AOr&Fo&W#< delta 1092 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 diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_2.00.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_2.00.3mf index 31df1df8cc034555643c82d67c8cb1c597174d2f..fdddb7999df6ecb581e9023ff7c991d333a3d1d8 100644 GIT binary patch delta 1072 zcmV-01kd~84%rTWP)h>@EdT%j2mk;80009Fq0j&S|NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5CD4(00000004#q00000005;|%Wj-76kVrM|G{!M?ShAS4U8b!RFS%= zRJB=;j4=rnj}e$rlCSSIm<&WRGc?I!V*A{4&wbc)6W=|5S0y^}wkw)C!NjyN;x%is zqJB(pFLEQqcekHE#Z{B>5&^jG68t2@ac@~2d*T)C%&K5*(>1v;SyNeVR?)i8DHDAQ zEEa28ZaFsbE!)AUuM3gjswm5%;)1tWa_&ni-SOIZ_&sdY-M-rBrlP=B(DLkR5W7Ea zXB zg^Vt;Y!5?qZ(^tg&8VQLrWH@{pF)%zBk^*C#jl^RhtaX+9dA#tLGW#4A5vat-Jxz? zUrT=IidWvDujE^7O;iIf*ff31cqdojX3v_kX&>8vraz)0ORzJzKcArCJi%Y?1Ne3C z@3A#nT65EJt4aTICI%XUm2jo&;Fvaa@~D4kUC_UOc=+)hT<#*ybB`He&I7~SF>0g^ zWkzP(spmvdkmnhoM|JR7XZ$(A_M1@NJq`XrG~63m-7&ZuwZWee;0ZB9TmE450zOS& zEnX9UY}h7It1-Bxr9n(b9fPGo>@Btq+~BiuWV&i`h1;d+Hn)Hd!@!B)f`jIbw)1d- zhqyaC#OSi((DeS(=LbSvnr^AUKT{fv4G(bOI!8t+om6Rk>=hPdZLRTOa(S*EQ$_crWrFX@YA?n<#8oiZM z-yyOyAS87ii5@7A=19GFML8Hi>h-NO1tghejr5mXrIV<->s2a|6L5ZqVrzQ;)Yv5_ zPBoIn);JT&`7E{;vuB+4MVY+~fwrGd1(_2BMnwJ0@FJQS)b(?Nhd~;pX=Hn@8cpLu z@CuE*awdezPLpJsXOYib2dvV_@IvYuQ3}h@cT;YY)bn#X&abgGxCdRJR{kdifBgfq z(E~FA1Op7A&yxrSE(v=L00000004%QKL%t0$djZ7R08`1lllfWGV28Z0000008mQ? q2LJ#70QUv}000000096108mQ>1^@s600RI601N>D0RR90{{R4=Yw835 delta 1062 zcmV+>1ljx94&n}fP)h>@EdT%j2mk;8002Chk2wGT|NsC0|NjsG6aX_sFEeCqZ)9a` zE^TjQWo!We5C8=Y000000055z00000005;|OOKl{5I(n3{{wQ*JPd?D1ns3-sh3Js zyXTc-n_Vg%5twMZzrHhI=doSWpeBa|`NC|Oc6V6m z=g@az@a61PUrz*h0u(p?Z-+?i)9gPr!F$&*gwmK(XUp-Sv-sHy)gSN)#lVsLwmjv|o^qcL}_syF22~ zmj0#bywvS~Nv>S)Xy&#_*z-L}Ulazvp-wwb~3KXUYRVC zxl2dqZL&p^zsPd`)w#_T{Ajd~^~FIpE6$OBPHlb+@yc_KQ9+_h4OckWxxhiwozM3b z4z3r(!H)|1i>)}=xxm4lZ}A659&y?1&yItg3!I%7Z!H8;9Wm&&FzZMR5F)YwDP&`E zi8+Fxk-`Qw>;?)dY*3vciaOA%J?AF@25K)OMh(%U4D`8>CrxjV_B>%}Frl}W+yL!= z@n~vHD~Pl+W4OSqaW|yhAni#v^|?7eQ|_0Gu3H#86oK|0#w`p;Bkfhh?m6S^ovCrU zGT6zsX4A-1vn@b%3mGV6%;xmE+3ev=9f2*R1Gjeu7VrXScd2u3JVK9JM4Il^)F{Ou zbKl%-dI-Y#PY+1BKTl{lE#>~zB$)45$Ep^mku1)lGTX+1E5a~#W0=6)lt+=f2^r;? zWIc^>bmP5@T(&8b@ g1O=1v1~wA(1poj50000`O9lr3000002a`DmAn`)+XaE2J From 4f90f10fc16d1ed0f1b5453a74ff21eda378be05 Mon Sep 17 00:00:00 2001 From: legend069 <40685552+legend069@users.noreply.github.com> Date: Tue, 30 Jul 2024 21:45:07 +1000 Subject: [PATCH 24/28] big overhall, lots of refractoring and improvements. removed a bunch of lines and cleaned up. couple new small features. loads extra number for test ID to bottom right of model. fixed scaling in xyz fixed flow calculations for scaling max height of *5 layer_height set read only for "number of tests" to create 10 is max(because of test ID feature, this can be fixed later on.) set read only for "extrusion role" select updated tooltips removed some unnecessary text from main config window on updating row count it auto populates the next rows(this is kinda buggy and could use improving) i have not done any prints with beta v1.20 yet up next: fix the welcome page and have it provide usefull information :smiley: --- .../filament_pressure/filament_pressure.html | 10 + src/libslic3r/Layer.cpp | 7 +- src/libslic3r/PrintConfig.hpp | 2 + .../GUI/CalibrationPressureAdvDialog.cpp | 740 ++++++++++-------- .../GUI/CalibrationPressureAdvDialog.hpp | 2 +- src/slic3r/GUI/ConfigManipulation.cpp | 5 +- 6 files changed, 430 insertions(+), 336 deletions(-) diff --git a/resources/calibration/filament_pressure/filament_pressure.html b/resources/calibration/filament_pressure/filament_pressure.html index 59389eff0b0..1258913b903 100644 --- a/resources/calibration/filament_pressure/filament_pressure.html +++ b/resources/calibration/filament_pressure/filament_pressure.html @@ -34,6 +34,8 @@

    How to tune your printer for Pressure/Linear Advance

  • each row is the config for each base test model, eg; first row = externalPerimeter second row = firstLayer
  • since each model will have it's own config one test model might be faster/slower than the others, this is expected and normal
  • i will reccomend setting 'first_layer_speed' and 'first_layer_min_speed' to the same vales
  • +
  • first calibration tool that supports Arachne!
  • +
  • helpfull tip: if you're wanting to run multi test on a single plate take a screenshot of the main config page(or leave it open) so you can see the matching ID label on the bottom right of the loaded model.
@@ -44,6 +46,14 @@

How to tune your printer for Pressure/Linear Advance

you can then manually add the pressure advance command into the "per region g-code" box, slice and print it.

+

known bugs:
+

    +
  • setting first layers PA value for multi test only applies the last rows value into (before_layer_gcode)
  • +
  • the first layer gets gap fill on the 90° bend models, reccomended to disable gap fill if this happens.
  • +
  • + +
+

Advice

Before doing this test, it's preferable to tune everything else first!
i would reccomended setting XXXX to the same speeds, XXX to a slow speed, and everything else you can send it with.

note: having large variance with ER speeds can reduce print quality/dimensional accuracy this is effect is mainly caused by the inner perimeter getting pulled closer to the external perimeter as it cools down, since each perimeter would be at different temperatues.

diff --git a/src/libslic3r/Layer.cpp b/src/libslic3r/Layer.cpp index 9ec108ce426..a23dbe925d9 100644 --- a/src/libslic3r/Layer.cpp +++ b/src/libslic3r/Layer.cpp @@ -246,8 +246,11 @@ void Layer::make_perimeters() && config.thin_walls_acceleration == other_config.thin_walls_acceleration && config.top_solid_infill_acceleration == other_config.top_solid_infill_acceleration//compiles fine with moving them here, how to properly test this ? && config.per_objects_gcode == other_config.per_objects_gcode */ - && config.external_perimeter_extrusion_spacing == other_config.external_perimeter_extrusion_spacing - && config.perimeter_extrusion_spacing == other_config.perimeter_extrusion_spacing + //&& config.external_perimeter_extrusion_spacing == other_config.external_perimeter_extrusion_spacing + //&& config.perimeter_extrusion_spacing == other_config.perimeter_extrusion_spacing + //&& config.first_layer_size_compensation == other_config.first_layer_size_compensation + && config.first_layer_extrusion_width == other_config.first_layer_extrusion_width + && config.first_layer_extrusion_spacing == other_config.first_layer_extrusion_spacing ) { layerms.push_back(other_layerm); diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index f647006ffc4..18e2d7494dc 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -868,6 +868,8 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionPercent, fill_density)) ((ConfigOptionEnum, fill_pattern)) ((ConfigOptionPercent, first_layer_flow_ratio)) + ((ConfigOptionFloatOrPercent, first_layer_extrusion_width)) + ((ConfigOptionFloatOrPercent, first_layer_extrusion_spacing)) ((ConfigOptionEnum, fuzzy_skin)) ((ConfigOptionFloatOrPercent, fuzzy_skin_thickness)) ((ConfigOptionFloatOrPercent, fuzzy_skin_point_dist)) diff --git a/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp b/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp index 42f2ecfbff3..b00fea036d2 100644 --- a/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp +++ b/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp @@ -30,18 +30,39 @@ namespace Slic3r { namespace GUI { //BUG: custom gcode ' between extrusion role changes' should that be before or after region gcode? +// BUG: output error if first layer height is lower than base layer height +// this can cause the numbers to not "show up" on the preview because the z scale is calculated wrong. +// ie; first_layer_height=0.1 and base_layer_height =0.20 +//BUG: if first/base layer height are both .02 numbers don't show up when sliced. doesn't happen with windows, it did for linux ? +//BUG: first_layer_height and base_layer_height both the same wil mess with numbers scale in z ? +//TODO: does marlin/reprap need other values for this? + + +/* +FlowRole string_to_flow_role(const std::string& role_str) { + static std::unordered_map role_map = { + {"InternalInfill", FlowRole::frInfill}, + {"BridgeInfill", FlowRole::frSupportMaterialInterface}, // special calc required + {"ExternalPerimeter", FlowRole::frExternalPerimeter}, + {"GapFill", FlowRole::frSupportMaterialInterface}, // special calc required + {"InternalBridgeInfill", FlowRole::frSupportMaterialInterface}, // special calc required + {"Ironing", FlowRole::frSupportMaterialInterface}, // special calc required + {"OverhangPerimeter", FlowRole::frSupportMaterialInterface}, // special calc required ? + {"Perimeter", FlowRole::frPerimeter}, + {"SolidInfill", FlowRole::frSolidInfill}, + {"SupportMaterial", FlowRole::frSupportMaterial}, + {"SupportMaterialInterface", FlowRole::frSupportMaterialInterface}, + {"ThinWall", FlowRole::frSupportMaterialInterface}, // special calc required + {"TopSolidInfill", FlowRole::frTopSolidInfill}, + {"FirstLayer", FlowRole::frSupportMaterialInterface} // special calc required + }; + + return role_map[role_str]; +}*/ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { - /* - firstPa - startPa - endPa - paIncrement - erPa - enableST - */ - std::string choice_extrusion_role[] = { + std::string choice_extrusion_role[] = { "InternalInfill", "BridgeInfill", "ExternalPerimeter", @@ -106,7 +127,7 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { {"SolidInfill", "solid_infill_extrusion_spacing"}, {"SupportMaterial", "external_perimeter_extrusion_spacing"}, //TOFIX? TYPE: coFloat {"SupportMaterialInterface", "external_perimeter_extrusion_spacing"}, //TOFIX? TYPE: coFloat - {"ThinWall", "external_perimeter_extrusion_spacing"}, + {"ThinWall", "external_perimeter_extrusion_spacing"}, //TOFIX? {"TopSolidInfill", "top_infill_extrusion_spacing"}, {"FirstLayer", "first_layer_extrusion_spacing"} }; @@ -141,12 +162,10 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { } std::vector items; - //for (size_t i = 0; i < nb_runs; i++){ for (int i = 0; i < currentTestCount; i++) { items.emplace_back((boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "base_plate.3mf").string()); } std::vector objs_idx = plat->load_files(items, true, false, false, false); - //assert(objs_idx.size() == nb_runs); assert(objs_idx.size() == currentTestCount); const DynamicPrintConfig* print_config = this->gui_app->get_tab(Preset::TYPE_FFF_PRINT)->get_config(); const DynamicPrintConfig* filament_config = this->gui_app->get_tab(Preset::TYPE_FFF_FILAMENT)->get_config(); @@ -156,29 +175,43 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { full_print_config.apply(*print_config); full_print_config.apply(*printer_config); full_print_config.apply(*filament_config); - - // --- scale --- - //models is created for nozzles from 0.1-2mm walls should be nozzle_size*4 spaced, scale xy model by widths down is futher GCodeFlavor flavor = printer_config->option>("gcode_flavor")->value; const ConfigOptionFloats* nozzle_diameter_config = printer_config->option("nozzle_diameter"); assert(nozzle_diameter_config->size() > 0); double nozzle_diameter = nozzle_diameter_config->get_at(0);//get extruderID too? + double first_layer_height = full_print_config.get_computed_value("first_layer_height"); + double first_layer_width = full_print_config.get_abs_value("first_layer_extrusion_width", nozzle_diameter); + double first_layer_extrusion_spacing = full_print_config.get_abs_value("first_layer_extrusion_spacing", nozzle_diameter); + double first_layer_flow_ratio = full_print_config.get_computed_value("first_layer_flow_ratio"); + double first_layer_size_compensation = full_print_config.get_computed_value("first_layer_size_compensation"); + double base_layer_height = full_print_config.get_computed_value("layer_height"); - double er_width = print_config->get_abs_value("solid_infill_extrusion_width", nozzle_diameter); + double er_width = full_print_config.get_abs_value("solid_infill_extrusion_width", nozzle_diameter); double er_accel = full_print_config.get_computed_value("solid_infill_acceleration"); double er_speed = full_print_config.get_computed_value("solid_infill_speed"); - double er_spacing = print_config->get_abs_value("external_perimeter_extrusion_spacing",1.0); + double er_spacing = full_print_config.get_abs_value("external_perimeter_extrusion_spacing",nozzle_diameter); - double default_er_width = print_config->get_abs_value("extrusion_width", nozzle_diameter); + double default_er_width = full_print_config.get_abs_value("extrusion_width", nozzle_diameter); double default_er_speed = full_print_config.get_computed_value("default_speed"); double default_er_accel = full_print_config.get_computed_value("default_acceleration"); - double default_er_spacing = print_config->get_abs_value("extrusion_spacing", nozzle_diameter); + double default_er_spacing = full_print_config.get_abs_value("extrusion_spacing", nozzle_diameter); double spacing_ratio = full_print_config.get_computed_value("perimeter_overlap"); double spacing_ratio_external = full_print_config.get_computed_value("external_perimeter_overlap"); - double filament_max_overlap = filament_config->get_computed_value("filament_max_overlap",0);//maybe check for extruderID ? + double filament_max_overlap = full_print_config.get_computed_value("filament_max_overlap",0);//maybe check for extruderID ? + Flow first_layer_flow = Flow::new_from_config(FlowRole::frPerimeter, *print_config, nozzle_diameter, first_layer_height, 1.f, true); + + + bool broken_config = false; + if(default_er_width == 0 || default_er_spacing == 0){//if their config is broken fix it :) + //Flow broken_config_flow = Flow::new_from_config(FlowRole::frExternalPerimeter, *print_config, nozzle_diameter, first_layer_height, spacing_ratio_external, false); + //broken_config_flow.spacing() broken_config_flow.width(); + default_er_width = nozzle_diameter; + default_er_spacing = default_er_width - base_layer_height * float(1. - 0.25 * PI) * spacing_ratio_external; //rounded_rectangle_extrusion_spacing + broken_config = true; + } // --- translate --- @@ -207,7 +240,6 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { } /*size_t decimal_pos = nozzle_diameter_str.find('.'); - // maybe adjust for this ? // some users might have 0.0x nozzle size. if that's the case then they should just need to create the file and it should load. ie; 90_bend_0.450.3mf if (decimal_pos != std::string::npos) { size_t non_zero_pos = nozzle_diameter_str.find_first_not_of('0', decimal_pos + 2); @@ -218,79 +250,73 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { std::string extrusion_role = dynamicExtrusionRole[0]->GetValue().ToStdString(); for (int id_item = 0; id_item < currentTestCount; id_item++) { - //need to move this to another function..... - wxString firstPaValue = dynamicFirstPa[id_item]->GetValue(); - wxString startPaValue = dynamicStartPa[id_item]->GetValue(); - wxString endPaValue = dynamicEndPa[id_item]->GetValue(); - wxString paIncrementValue = dynamicPaIncrement[id_item]->GetValue(); - wxString erPaValue = dynamicExtrusionRole[id_item]->GetValue(); - smooth_time = dynamicEnableST[id_item]->GetValue(); - - double first_pa = wxAtof(firstPaValue); - double start_pa = wxAtof(startPaValue); - double end_pa = wxAtof(endPaValue); - double pa_increment = wxAtof(paIncrementValue); + + auto pa_result = calc_PA_values(id_item); + std::vector pa_values = pa_result.first; + int count_increments = pa_result.second; extrusion_role = dynamicExtrusionRole[id_item]->GetValue().ToStdString(); - int countincrements = 0; - int sizeofarray = static_cast((end_pa - start_pa) / pa_increment) + 2;//'+2' needed for odd/even numbers - std::vector pa_values(sizeofarray); - std::vector c_pa_values_c(sizeofarray); - - double incremented_pa_value = start_pa; - while (incremented_pa_value <= end_pa + pa_increment / 2) {//this makes a number to be used to load x number of 90 bend models for the PA test. - if (incremented_pa_value <= end_pa) { - double rounded_Pa = std::round(incremented_pa_value * 1000000.0) / 1000000.0; - pa_values[countincrements] = rounded_Pa;//store PA numbers in array to be used later. - c_pa_values_c[countincrements] = rounded_Pa; - countincrements++; - incremented_pa_value += pa_increment; - } - else { - pa_values[countincrements] = end_pa; - countincrements++;//failsafe if werid input numbers are provided that can't add the "ending pa" number to the array. - break; } - - }// is there a limit of how many models SS can load ? might be good to set a failsafe just so it won't load 10k+ models... + /* - std::string set_advance_prefix =""; - if (gcfKlipper == flavor) { - if(smooth_time == false){ - set_advance_prefix = "SET_PRESSURE_ADVANCE ADVANCE="; - } - else{ - set_advance_prefix = "SET_PRESSURE_ADVANCE SMOOTH_TIME="; - } - } - else if (gcfMarlinFirmware == flavor) { - set_advance_prefix = "M900 K"; - } - else if(gcfRepRap == flavor){ - set_advance_prefix = "M572 S"; - } + double first_pa = wxAtof(firstPaValue); + */ if (extrusion_role == "Verify") { - countincrements = 13; + //count_increments = 13; + count_increments = sizeof(choice_extrusion_role) / sizeof(choice_extrusion_role[0]); er_width = default_er_width; er_spacing = default_er_spacing; er_width = er_width * 100 / nozzle_diameter; er_width = std::round(er_width * 100.0) / 100.0; + } else{ + /*for (const std::string& role_str : choice_extrusion_role) { + FlowRole extrusion_role = string_to_flow_role(role_str); + + switch (extrusion_role) { + case FlowRole::frExternalPerimeter: + base_flow = Flow::new_from_config(extrusion_role, *print_config, nozzle_diameter, base_layer_height, filament_max_overlap, false); + break; + case FlowRole::frPerimeter: + base_flow = Flow::new_from_config(extrusion_role, *print_config, nozzle_diameter, base_layer_height, filament_max_overlap, false); + break; + case FlowRole::frInfill: + base_flow = Flow::new_from_config(extrusion_role, *print_config, nozzle_diameter, base_layer_height, filament_max_overlap, false); + break; + case FlowRole::frSolidInfill: + base_flow = Flow::new_from_config(extrusion_role, *print_config, nozzle_diameter, base_layer_height, filament_max_overlap, false); + break; + case FlowRole::frTopSolidInfill: + base_flow = Flow::new_from_config(extrusion_role, *print_config, nozzle_diameter, base_layer_height, filament_max_overlap, false); + break; + case FlowRole::frSupportMaterial: + base_flow = Flow::new_from_config(extrusion_role, *print_config, nozzle_diameter, base_layer_height, filament_max_overlap, false); + break; + case FlowRole::frSupportMaterialInterface: + base_flow = Flow::new_from_config(extrusion_role, *print_config, nozzle_diameter, base_layer_height, filament_max_overlap, false); + break; + default: + base_flow = Flow::new_from_config(FlowRole::frExternalPerimeter, *print_config, nozzle_diameter, base_layer_height, filament_max_overlap, false);//unsupported roles. + continue; + } + break; + }*/ + for (int i = 0; i < sizeof(choice_extrusion_role) / sizeof(choice_extrusion_role[0]); i++) { if (er_width_ToOptionKey.find(extrusion_role) != er_width_ToOptionKey.end()) { //look at maps to match speed/width ect to the selected ER role - er_width = print_config->get_abs_value(er_width_ToOptionKey[extrusion_role].c_str(), nozzle_diameter);//look at maps to match speed/width ect to the selected ER role + er_width = print_config->get_abs_value(er_width_ToOptionKey[extrusion_role].c_str(), nozzle_diameter); er_speed = full_print_config.get_computed_value(er_speed_ToOptionKey[extrusion_role].c_str()); er_accel = full_print_config.get_computed_value(er_accel_ToOptionKey[extrusion_role].c_str()); er_spacing = print_config->get_abs_value(er_spacing_ToOptionKey[extrusion_role].c_str(), nozzle_diameter); - //potential BUG if any of the values are 0 everything else would fail, need to pull the default value too and assign that? - if(er_width == 0){er_width =default_er_width; } - if(er_speed == 0){er_speed =default_er_speed; } - if(er_accel == 0){er_accel =default_er_accel; } + //potential BUG if any of the values are 0 everything else would fail, pull the default value too and assign that + if(er_width == 0){er_width = default_er_width; } + if(er_speed == 0){er_speed = default_er_speed; } + if(er_accel == 0){er_accel = default_er_accel; } if(er_spacing == 0){er_spacing = default_er_spacing; } er_width = er_width * 100 / nozzle_diameter; @@ -302,228 +328,240 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { } } + if(broken_config == true){//if their config is broken fix it :) + default_er_width = nozzle_diameter; + default_er_spacing = default_er_width - base_layer_height * float(1. - 0.25 * PI) * spacing_ratio_external; //rounded_rectangle_extrusion_spacing + } } + //-- magical scaling is done here :) //the 90_bend models need to be scaled correctly so there is no 'gapfill' since gapfill will effect results. + double adjustment_factor = first_layer_flow.width() - first_layer_flow.spacing(); + double total_width_with_overlap = first_layer_flow.width() + 3 * first_layer_flow.spacing() + adjustment_factor; double xyzScale = nozzle_diameter / 0.4; - double er_width_to_scale = magical_scaling(nozzle_diameter,er_width,filament_max_overlap,spacing_ratio,spacing_ratio_external,base_layer_height,er_spacing); + double er_width_to_scale = magical_scaling(nozzle_diameter, er_width, filament_max_overlap, spacing_ratio, spacing_ratio_external, base_layer_height, er_spacing); + double er_width_to_scale_first_layer = total_width_with_overlap; //-- magical scaling pressure_tower.emplace_back(); double initial_model_height = 0.2; - double initial_90_bend_x = 41.20;//fusion=41.200 mm - double initial_90_bend_y = 20.93;//fusion=20.930 mm - double initial_number_x = 2.06;//fusion=2.063 mm - double initial_number_y = 4.12;//fusion=4.125 mm - double initial_border_x = 1.6;//fusion= 1.6mm - double initial_point_xy = 0.69;//fusion = 0.687 mm - - double z_scaled_model_height = initial_model_height * (first_layer_height / initial_model_height); - double xy_scaled_90_bend_x = initial_90_bend_x * er_width_to_scale; - double xy_scaled_90_bend_y = initial_90_bend_y * er_width_to_scale; - double xy_scaled_x = initial_border_x * er_width_to_scale; - double xy_scaled_number_x = initial_number_x * xyzScale * er_width_to_scale; - double xy_scaled_number_y = initial_number_y * xyzScale * er_width_to_scale; - double xy_scaled_point_xy = initial_point_xy * xyzScale * er_width_to_scale; - - - double thickness_offset = nozzle_diameter * er_width_to_scale * 2; - //double z_scale_90_bend = xyzScale * 1.8 / initial_model_height; - double z_scale_90_bend = (xyzScale + first_layer_height) / initial_model_height; - double z_scale_factor = 0.0; - double new_z_world_coords = first_layer_height / 2.0 -base_layer_height; - - if(base_layer_height <= first_layer_height){//normal conditions firstlayer is greater than base - z_scale_factor = first_layer_height / initial_model_height; - }else{ - z_scale_factor = first_layer_height + first_layer_height; - } - // BUG: output error if first layer height is lower than base layer height - // this can cause the numbers to not "show up" on the preview because the z scale is calculated wrong. - // ie; first_layer_height=0.1 and base_layer_height =0.20 - //BUG: if first/base layer height are both .02 numbers don't show up when sliced. doesn't happen with windows, it did for linux ? - + //models is created per nozzles size 0.1-2mm walls are nozzle_size*4 thick + //exported origin point is center of the model in xyz + double initial_90_bend_x = 42.00; //size in x= 42.0 mm, model half x=21.0 + double initial_90_bend_y = 21.0; //size in y= 21.0 mm, model half y=10.5 + double initial_number_x = 2.0; //size in x= 2.0 mm , model half x=1.0 + double initial_number_y = 4.0; //size in y= 4.0 mm , model half y=2.0 + double initial_border_x = 1.6; //size in x= 1.6 mm , model half x=0.8 + double initial_border_y = 21.0; //size in y= 21.0 mm, model half y=10.5 + double initial_point_xy = 0.60; //size in xy= 0.6mm , model half xy=0.3 'point' model origin is bottom right offset x=0.7 y= -1.7(center of model +x1,y2 for bottom right edges) + double x_offset_90_bend = 1.2; //apex of 90° bend is offset from origin + + + double z_scaled_model_height = initial_model_height * (first_layer_height / initial_model_height); //mm + double xy_scaled_90_bend_x = initial_90_bend_x * er_width_to_scale; // mm + double xy_scaled_90_bend_y = initial_90_bend_y * er_width_to_scale; // mm + double xy_scaled_border_x = er_width_to_scale_first_layer; // mm + double xy_scaled_border_y = er_width_to_scale_first_layer; // mm + double xy_scaled_number_x = initial_number_x * xyzScale * er_width_to_scale; // mm + double xy_scaled_number_y = initial_number_y * xyzScale * er_width_to_scale; // mm + double xy_scaled_point_xy = initial_point_xy * xyzScale * er_width_to_scale; // mm + + + double thickness_offset = 0.0; + double bend_90_y_pos = 0.0; + double z_scale_90_bend = (first_layer_height + (base_layer_height * 4)) / initial_model_height;//force constant 5 layer height for model + double z_90_bend_pos = (first_layer_height + (base_layer_height * 4)) / 2; + double z_scale_others = first_layer_height / initial_model_height; + double z_others_pos = first_layer_height / 2; + std::vector bend_90_positions; std::vector number_positions; + std::set added_roles; - if (extrusion_role == "Verify") { - - int nb_bends = 0; - for (const std::string& role : choice_extrusion_role) {//dynamic add and scale each 90bend model per extrusion role. - - if (er_width_ToOptionKey.find(role) != er_width_ToOptionKey.end()) { + for (int nb_90_bends = 0; nb_90_bends < count_increments; nb_90_bends++) { + std::string er_role = extrusion_role; + double y_offset = 0.0; + bool role_found = false; - er_width = std::round((full_print_config.get_computed_value(er_width_ToOptionKey[role].c_str(), nozzle_diameter) * 100 / nozzle_diameter) * 100.0) / 100.0; - er_spacing = full_print_config.get_computed_value(er_spacing_ToOptionKey[role].c_str(), nozzle_diameter); - er_width_to_scale = magical_scaling(nozzle_diameter, er_width, filament_max_overlap, spacing_ratio, spacing_ratio_external, base_layer_height, er_spacing); - thickness_offset = nozzle_diameter * er_width_to_scale * 2; - - add_part(model.objects[objs_idx[id_item]], - (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "scaled_with_nozzle_size" / bend_90_nozzle_size_3mf).string(), - Vec3d{ -0.8, (initial_90_bend_y/2) * nb_bends , (z_scale_factor/2) }, Vec3d{ er_width_to_scale, er_width_to_scale, z_scale_90_bend }); - pressure_tower.back().push_back(model.objects[objs_idx[id_item]]); - - Eigen::Vector3d modelPosition(-0.8, (initial_90_bend_y/2) * nb_bends, (z_scale_factor/2) ); - bend_90_positions.push_back(modelPosition); - nb_bends++; - } - else{//ER role not found in map; ie not currently supported. - er_width = std::round((default_er_width * 100 / nozzle_diameter) * 100.0) / 100.0; - er_spacing = default_er_spacing; - er_width_to_scale = magical_scaling(nozzle_diameter, er_width, filament_max_overlap, spacing_ratio, spacing_ratio_external, base_layer_height, er_spacing); - thickness_offset = nozzle_diameter * er_width_to_scale * 2; - - add_part(model.objects[objs_idx[id_item]], - (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "scaled_with_nozzle_size" / bend_90_nozzle_size_3mf).string(), - Vec3d{ -0.8, (initial_90_bend_y/2) * nb_bends , (z_scale_factor/2) }, Vec3d{ er_width_to_scale, er_width_to_scale, z_scale_90_bend }); - pressure_tower.back().push_back(model.objects[objs_idx[id_item]]); - - Eigen::Vector3d modelPosition(-0.8, (initial_90_bend_y/2) * nb_bends, (z_scale_factor/2) ); - bend_90_positions.push_back(modelPosition); - nb_bends++; - + if (extrusion_role == "Verify") { + y_offset = 2.0 /* * nozzle_diameter*/; + for (size_t i = 0; i < sizeof(choice_extrusion_role) / sizeof(choice_extrusion_role[0]); i++) { + er_role = choice_extrusion_role[i]; + if (er_width_ToOptionKey.find(er_role) != er_width_ToOptionKey.end() && added_roles.find(er_role) == added_roles.end()) { + //er_role = er_role; + added_roles.insert(er_role); + role_found = true; + break; + } + else{role_found = false;}//role not found and not currently supported by calibration tool. } + /*for (const std::string& role : choice_extrusion_role) { + if (er_width_ToOptionKey.find(role) != er_width_ToOptionKey.end()) { + er_role = role; + role_found = true; + break; + } + }*/ + } else { + role_found = (er_width_ToOptionKey.find(er_role) != er_width_ToOptionKey.end()); } - } - else{//not verify - for (int nb_bends = 0; nb_bends < countincrements; nb_bends++){//TODO: BUG: need to fix this for the multi test plates. i should be able to have single if statement to change the "verify" role positions and only have a single 'add_part' fr the 90_bend model. - //const double magical_transformation_y_pos = 10.47; - - add_part(model.objects[objs_idx[id_item]], - (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "scaled_with_nozzle_size" / bend_90_nozzle_size_3mf).string(), - Vec3d{ -0.8, double(nb_bends) * (thickness_offset*2) *2 , (z_scale_factor/2) }, Vec3d{ er_width_to_scale, er_width_to_scale, z_scale_90_bend }); - pressure_tower.back().push_back(model.objects[objs_idx[id_item]]); - - Eigen::Vector3d modelPosition(-0.8, double(nb_bends) * (thickness_offset*2) *2 , (z_scale_factor/2) ); - bend_90_positions.push_back(modelPosition); + + if (role_found == true && broken_config == false) { + er_width = std::round((full_print_config.get_computed_value(er_width_ToOptionKey[er_role].c_str(), nozzle_diameter) * 100 / nozzle_diameter) * 100.0) / 100.0; + er_spacing = full_print_config.get_computed_value(er_spacing_ToOptionKey[er_role].c_str(), nozzle_diameter); + } else { + er_width = std::round((default_er_width * 100 / nozzle_diameter) * 100.0) / 100.0; + er_spacing = default_er_spacing; } - } - for (int nb_bends = 0; nb_bends < countincrements;nb_bends++){ + if(broken_config == true){ + er_width_to_scale = 1; + } + else{ + er_width_to_scale = magical_scaling(nozzle_diameter, er_width, filament_max_overlap, spacing_ratio, spacing_ratio_external, base_layer_height, er_spacing); + } + + add_part(model.objects[objs_idx[id_item]], + (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "scaled_with_nozzle_size" / bend_90_nozzle_size_3mf).string(), + Vec3d{ x_offset_90_bend, bend_90_y_pos , z_90_bend_pos }, + /*scale*/Vec3d{ er_width_to_scale, er_width_to_scale, z_scale_90_bend }, false); + + pressure_tower.back().push_back(model.objects[objs_idx[id_item]]); + Eigen::Vector3d modelPosition( x_offset_90_bend, bend_90_y_pos + y_offset , z_90_bend_pos ); - if(nb_bends == 1 && extrusion_role != "Verify") {//only load once. this onyl determines when the borders get loaded, keeping at top of list makes it easier to scroll down to. it can't be '0' since it needs the numbers positions! + // thickness offset that moves each '90_bend' model in Y + //thickness_offset = ((er_width / 100) * nozzle_diameter) * 4 + (nozzle_diameter * 2);// pretty tight gap + //thickness_offset = ((er_width / 100) * nozzle_diameter) * 4 + (nozzle_diameter * 2.5); + thickness_offset = ((er_width / 100) * nozzle_diameter) * 4 + (nozzle_diameter * 4);// larger gap + bend_90_positions.push_back(modelPosition); + bend_90_y_pos = modelPosition.y() + thickness_offset; + + + } + + for (int nb_bends = 0; nb_bends < count_increments;nb_bends++){ - const double extra_size_y = xy_scaled_90_bend_y / 4; - const double extra_size_x = xy_scaled_number_x; + if(nb_bends == 1 && extrusion_role != "Verify") {//only load once. this only determines when the borders get loaded, keeping at top of list makes it easier to scroll down to. it can't be '0' since it needs the numbers positions! - const double magical_transformation_x_pos = 20.60; //what is this, and how is this calculated ? >:( - const double magical_transformation_y_pos = 10.47; //load a model without moving its pos to find see what it is.the number doesn't seem to change regardless of layer heights/nozzle size - const double magical_transformation_z_pos = 0.1; Eigen::Vector3d bend_pos_first = bend_90_positions[0]; - Eigen::Vector3d bend_pos_mid = bend_90_positions[countincrements/2]; - Eigen::Vector3d bend_pos_last = bend_90_positions[countincrements-1]; + Eigen::Vector3d bend_pos_mid = bend_90_positions[count_increments/2]; + Eigen::Vector3d bend_pos_last = bend_90_positions[count_increments-1]; Eigen::Vector3d number_pos_first = number_positions[0]; - Eigen::Vector3d number_pos_mid = number_positions[3]; - Eigen::Vector3d number_pos_last = number_positions[6]; - double numbers_total_width = (number_pos_last.x() + (xy_scaled_number_x / 2)) - (number_pos_first.x() - (xy_scaled_number_x / 2)); + Eigen::Vector3d number_pos_mid = number_positions[0]; + Eigen::Vector3d number_pos_last = number_positions[0]; - double scaled_r_border_x_percentage = ((numbers_total_width + extra_size_x) / initial_border_x) * 100; - double scaled_r_border_x_mm = (scaled_r_border_x_percentage / 100) * initial_border_x; - double scaled_tb_border_x = scaled_r_border_x_mm + xy_scaled_90_bend_x; - double scaled_tb_border_x_percentage = ((scaled_tb_border_x /* + extra_size_x*/) / initial_border_x) * 100; - + if (!number_positions.empty()) { + + for (size_t j = 0; j < number_positions.size(); j++) { + if (j == number_positions.size() / 2) { + number_pos_mid = number_positions[j]; + } + number_pos_last = number_positions[j]; + } + } + + double numbers_total_width = (number_pos_last.x() + (xy_scaled_number_x / 2)) - (number_pos_first.x() - (xy_scaled_number_x / 2));// scaled to include gap between end of 90_bend and first number,perfection double total_height = (bend_pos_last.y() + (xy_scaled_90_bend_y / 2)) - (bend_pos_first.y() - (xy_scaled_90_bend_y / 2)); - double scaled_border_y_percentage = ((total_height + extra_size_y) / initial_90_bend_y) * 100; - double border_scaled_y = (initial_border_x*(xy_scaled_x * 1.5)) / initial_90_bend_y;//TODO: need to adjust scale for larger nozzle sizes + double scalred_r_border_x_mm = numbers_total_width + (nozzle_diameter * 2); + double left_border_x_offset = (bend_pos_mid.x() - (xy_scaled_90_bend_x/2) - nozzle_diameter + ( xy_scaled_border_x / 2) ) - (bend_pos_mid.x() - (xy_scaled_90_bend_x/2));//left border is positioned slightly inside the 90_bend model this is that distance. + double tb_total_width_mm = (xy_scaled_border_x - left_border_x_offset) + xy_scaled_90_bend_x + scalred_r_border_x_mm; + + double scaled_l_border_x_percentage = xy_scaled_border_x / initial_border_x; + double scaled_r_border_x_percentage = (numbers_total_width + (nozzle_diameter * 2)) / initial_border_x ; + double scaled_lr_border_y_percentage = (total_height + xy_scaled_border_y) / initial_90_bend_y; + double scaled_tb_border_x_percentage = tb_total_width_mm / initial_border_x; + double scaled_tb_border_y_percentage = xy_scaled_border_y / initial_border_y; + + double left_border_x_pos = bend_pos_mid.x() - (xy_scaled_90_bend_x/2) - nozzle_diameter; + double right_border_x_pos = bend_pos_mid.x() + (xy_scaled_90_bend_x / 2) + (scalred_r_border_x_mm / 2); + double left_edge_pos = bend_pos_mid.x() - (xy_scaled_90_bend_x / 2) - xy_scaled_border_x + left_border_x_offset; + double right_edge_pos = (xy_scaled_90_bend_x / 2) + scalred_r_border_x_mm + bend_pos_mid.x(); + double center = (left_edge_pos + right_edge_pos) / 2; + double tb_border_x_pos = center; - double right_border_x_pos = number_pos_mid.x(); - double top_border_x_pos = ((number_pos_last.x() + (xy_scaled_number_x / 2)) + (bend_pos_first.x() - (xy_scaled_90_bend_x / 2))) / 2; - double left_border_x_pos = bend_pos_first.x() - (xy_scaled_90_bend_x / 2); - //---------- - add_part(model.objects[objs_idx[id_item]], - (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border.3mf").string(), - Vec3d{ left_border_x_pos + magical_transformation_x_pos, bend_pos_mid.y(), new_z_world_coords - magical_transformation_z_pos }, //need to fix to adjust for nozzle_diameter since it breaks bottom_solid_layers - /*scale*/Vec3d{ xy_scaled_x * 1.5, scaled_border_y_percentage*0.01, z_scale_factor }); // Left border - //---------- add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border.3mf").string(), - Vec3d{ right_border_x_pos + magical_transformation_x_pos , bend_pos_mid.y(), new_z_world_coords - magical_transformation_z_pos }, - /*scale*/Vec3d{ scaled_r_border_x_percentage*0.01 , scaled_border_y_percentage*0.01 , z_scale_factor});// right border + Vec3d{ left_border_x_pos , bend_pos_mid.y(), z_others_pos }, + /*scale*/Vec3d{ scaled_l_border_x_percentage, scaled_lr_border_y_percentage, z_scale_others }); //Left border + + add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border.3mf").string(), + Vec3d{ right_border_x_pos , bend_pos_mid.y(), z_others_pos }, + /*scale*/Vec3d{ scaled_r_border_x_percentage , scaled_lr_border_y_percentage , z_scale_others}); //right border - bool enable_top_bottom = true; - if(enable_top_bottom == true){//remove later - //---------- - add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border.3mf").string(), - Vec3d{ top_border_x_pos + magical_transformation_x_pos , bend_pos_first.y() - (xy_scaled_90_bend_y /1.8), new_z_world_coords - magical_transformation_z_pos }, //need to fix to adjust for nozzle_diameter since it breaks bottom_solid_layers - /*scale*/Vec3d{ scaled_tb_border_x_percentage*0.01, border_scaled_y, z_scale_factor });//bottom border - //---------- - add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border.3mf").string(), - Vec3d{ top_border_x_pos + magical_transformation_x_pos , bend_pos_last.y() + (xy_scaled_90_bend_y /1.8) , new_z_world_coords - magical_transformation_z_pos }, //need to fix to adjust for nozzle_diameter since it breaks bottom_solid_layers - /*scale*/Vec3d{ scaled_tb_border_x_percentage*0.01, border_scaled_y, z_scale_factor});//top border - } - // position in printer coords are half of scaled size! + add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border.3mf").string(),//on odd number of count_increments the bottom border is not joined to the side borders. fixing this bug will require + Vec3d{ tb_border_x_pos , bend_pos_first.y() - (xy_scaled_90_bend_y / 2) - (xy_scaled_border_y / 2) - nozzle_diameter, z_others_pos }, // adding more if/else statements to add the extra offset and apply this to all other calculations for the border scale and position. + /*scale*/Vec3d{ scaled_tb_border_x_percentage , scaled_tb_border_y_percentage, z_scale_others }); //bottom border + //---------- + add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border.3mf").string(), + Vec3d{ tb_border_x_pos , bend_pos_last.y() + (xy_scaled_90_bend_y / 2) + (xy_scaled_border_y / 2) + nozzle_diameter, z_others_pos }, + /*scale*/Vec3d{ scaled_tb_border_x_percentage, scaled_tb_border_y_percentage, z_scale_others}); //top border // scale model in percentage from original models xy values! + + if (id_item < 10){ //will break if max test count goes higher. + add_part(model.objects[objs_idx[id_item]],(boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / (std::to_string(id_item) + std::string(".3mf"))).string(), + Vec3d{ number_pos_mid.x(), bend_pos_first.y() - (xy_scaled_90_bend_y / 2) + (xy_scaled_number_y / 2), z_scaled_model_height }, + /*scale*/Vec3d{ xyzScale * er_width_to_scale, xyzScale * er_width_to_scale, z_scale_others * 2 }); // currentTestCount identifer + } } - if (extrusion_role != "Verify") {// possible to load the words for each ER role? - if (nb_bends % 2 == 1) { // Skip generating every second number - continue; + + if (extrusion_role != "Verify") {// possible to load the words for each ER role and slice the Er role next to it's 90_bend ? + + if (nb_bends % 2 == 1){ + continue;// Skip generating every second number } Eigen::Vector3d bend_90_pos = bend_90_positions[nb_bends]; - const double magical_transformation_y_pos = 10.47; - const double magical_transformation_num_x_pos = 1.03; - const double magical_transformation_num_y_pos = 2.06;// -2.03 - const double magical_transformation_z_pos = 0.12;//0.1 is the transformation value, but set slightly higher so numbers would be "inside" right border this might be dependant on z_scale_factor - - double bend_90_y = bend_90_pos.y() + magical_transformation_y_pos + (xy_scaled_90_bend_y/2); - double bend_90_x = bend_90_pos.x() + magical_transformation_num_x_pos; - double xpos_initial = bend_90_x + (xy_scaled_90_bend_x/2) - xy_scaled_number_x + nozzle_diameter; - double ypos_inital = bend_90_y /*+ (xy_scaled_number_y/2)*/; - double ypos_point = bend_90_y - (xy_scaled_number_y/2) - nozzle_diameter; - - double xpos = xpos_initial; - double ypos = ypos_inital; - std::string pa_values_string = std::to_string(pa_values[nb_bends]); - std::string threemf =".3mf"; - - for (int j = 0; j < 7; ++j) {//not sure how the code will respond with a positive array list? ie ; 100.2 this moves decimal point thus breaking the code from loading model since "..3mf" not a real file - std::string numered3mfpath = pa_values_string[j] + threemf; - - if (pa_values_string[j] == '.') { + double xpos = bend_90_pos.x() + (xy_scaled_90_bend_x / 2) + (xy_scaled_number_x / 2) + nozzle_diameter; + //double ypos = bend_90_pos.y() + (xy_scaled_90_bend_y / 2) - (xy_scaled_number_y / 2) + double ypos = bend_90_pos.y() + (xy_scaled_90_bend_y / 2) - (xy_scaled_number_y / 2) + (nozzle_diameter * 3); + //double ypos = bend_90_pos.y() + (xy_scaled_90_bend_y / 2) - (xy_scaled_number_y / 2) + (er_width / 100 * 2);//TODO: perfect this position so it's centered with the notch on the 90_bend + // will need to calculate that number sizing/positioning to offset it by. - add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "point.3mf").string(), - Vec3d{ xpos + xy_scaled_number_x + nozzle_diameter , ypos_point, z_scaled_model_height - magical_transformation_z_pos }, Vec3d{ xyzScale * er_width_to_scale, xyzScale+(xyzScale/2), z_scale_factor*2 }); + for (size_t j = 0; j < pa_values_string.length(); ++j) {//not sure how the code will respond with a positive array list? ie ; 100.2 this moves decimal point thus breaking the code from loading model since "..3mf" not a real file - Eigen::Vector3d modelPosition(xpos + xy_scaled_number_x + nozzle_diameter + magical_transformation_num_x_pos, ypos_point, z_scaled_model_height - magical_transformation_z_pos ); - number_positions.push_back(modelPosition); - xpos = xpos + xy_scaled_point_xy + (nozzle_diameter * 2 ); - } - else if (std::isdigit(pa_values_string[j])) { - - add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / numered3mfpath).string(), - Vec3d{ xpos + xy_scaled_number_x + nozzle_diameter /* +magical_transformation_num_x_pos */, ypos, z_scaled_model_height - magical_transformation_z_pos }, Vec3d{ xyzScale * er_width_to_scale, xyzScale * er_width_to_scale, z_scale_factor*2 }); - - Eigen::Vector3d modelPosition(xpos + xy_scaled_number_x + nozzle_diameter + magical_transformation_num_x_pos, ypos, z_scaled_model_height - magical_transformation_z_pos ); - number_positions.push_back(modelPosition); - xpos = xpos + xy_scaled_number_x + nozzle_diameter /* +magical_transformation_num_x_pos */; + if (pa_values_string[j] == '.') { + add_part(model.objects[objs_idx[id_item]],(boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "point.3mf").string(), + Vec3d{ xpos - (xy_scaled_number_x / 2), ypos /* - xy_scaled_point_xy - xyzScale*/, z_scaled_model_height },// point gets moved to wrong position on all nozzle_sizes, guessing it's exported offset position doesn't get scaled with the model. + /*scale*/Vec3d{ xyzScale * er_width_to_scale, xyzScale + (xyzScale / 2), z_scale_others * 2 }); + xpos -= (xy_scaled_number_x / 2); + + } else if (std::isdigit(pa_values_string[j])) { + add_part(model.objects[objs_idx[id_item]],(boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / (pa_values_string[j] + std::string(".3mf"))).string(), + Vec3d{ xpos, ypos, z_scaled_model_height },// might need to re size the numbers a touch. they get marked as "thin walls" + /*scale*/Vec3d{ xyzScale * er_width_to_scale, xyzScale * er_width_to_scale, z_scale_others * 2 });//TOCHECK: if any numbers get gapfill } + + Eigen::Vector3d modelPosition(xpos + (xy_scaled_number_x / 2) + nozzle_diameter + (xy_scaled_number_x / 2), ypos, z_scaled_model_height); + number_positions.push_back(modelPosition); + xpos = modelPosition.x(); } } } - } + /// --- main config --- // => settings that are for object or region should be added to the model (see below, in the for loop), not here DynamicPrintConfig new_print_config = *print_config; DynamicPrintConfig new_printer_config = *printer_config; new_print_config.set_key_value("avoid_crossing_perimeters", new ConfigOptionBool(false)); - new_print_config.set_key_value("complete_objects", new ConfigOptionBool(false)); //true is required for multi tests on single plate. - - //fix this later need to fix the loops - //new_printer_config.set_key_value("before_layer_gcode", new ConfigOptionString(std::string("{if layer_num == 0} ") + set_advance_prefix + std::to_string(first_pa) + " {endif}")); + new_print_config.set_key_value("complete_objects", new ConfigOptionBool(false)); //true is required for multi tests on single plate? + new_print_config.set_key_value("first_layer_flow_ratio", new ConfigOptionPercent(100)); + new_print_config.set_key_value("first_layer_size_compensation", new ConfigOptionFloat(0)); + new_print_config.set_key_value("xy_inner_size_compensation", new ConfigOptionFloat(0)); + new_print_config.set_key_value("xy_outer_size_compensation", new ConfigOptionFloat(0)); //assert(filament_temp_item_name.size() == nb_runs); @@ -531,39 +569,16 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { assert(objs_idx.size() == currentTestCount); for (int id_item = 0; id_item < currentTestCount; id_item++) { - wxString firstPaValue = dynamicFirstPa[id_item]->GetValue(); - wxString startPaValue = dynamicStartPa[id_item]->GetValue(); - wxString endPaValue = dynamicEndPa[id_item]->GetValue(); - wxString paIncrementValue = dynamicPaIncrement[id_item]->GetValue(); - wxString erPaValue = dynamicExtrusionRole[id_item]->GetValue(); - smooth_time = dynamicEnableST[id_item]->GetValue(); + auto pa_result = calc_PA_values(id_item); + std::vector pa_values = pa_result.first; + int count_increments = pa_result.second; + wxString firstPaValue = dynamicFirstPa[id_item]->GetValue(); double first_pa = wxAtof(firstPaValue); - double start_pa = wxAtof(startPaValue); - double end_pa = wxAtof(endPaValue); - double pa_increment = wxAtof(paIncrementValue); + smooth_time = dynamicEnableST[id_item]->GetValue(); extrusion_role = dynamicExtrusionRole[id_item]->GetValue().ToStdString(); - int countincrements = 0; - int sizeofarray = static_cast((end_pa - start_pa) / pa_increment) + 2;//'+2' needed for odd/even numbers - std::vector pa_values(sizeofarray); - std::vector c_pa_values_c(sizeofarray); - - double incremented_pa_value = start_pa; - while (incremented_pa_value <= end_pa + pa_increment / 2) {//this makes a number to be used to load x number of 90 bend models for the PA test. - if (incremented_pa_value <= end_pa) { - double rounded_Pa = std::round(incremented_pa_value * 1000000.0) / 1000000.0; - pa_values[countincrements] = rounded_Pa;//store PA numbers in array to be used later. - c_pa_values_c[countincrements] = rounded_Pa; - countincrements++; - incremented_pa_value += pa_increment; - } - else { - pa_values[countincrements] = end_pa; - countincrements++;//failsafe if werid input numbers are provided that can't add the "ending pa" number to the array. - break; } - }// is there a limit of how many models SS can load ? might be good to set a failsafe just so it won't load 10k+ models... /* gcfRepRap, @@ -581,8 +596,8 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { gcfSmoothie, gcfNoExtrusion*/ - // config for the this model - model.objects[objs_idx[id_item]]->config.set_key_value("bottom_fill_pattern", new ConfigOptionEnum(ipMonotonicWGapFill)); + // config modifers for the base model + model.objects[objs_idx[id_item]]->config.set_key_value("bottom_fill_pattern", new ConfigOptionEnum(ipMonotonicWGapFill));// ipConcentric or ipConcentricGapFill ? model.objects[objs_idx[id_item]]->config.set_key_value("bottom_solid_layers", new ConfigOptionInt(1)); model.objects[objs_idx[id_item]]->config.set_key_value("brim_width", new ConfigOptionFloat(0)); model.objects[objs_idx[id_item]]->config.set_key_value("external_perimeter_overlap", new ConfigOptionPercent(100)); @@ -590,34 +605,47 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { model.objects[objs_idx[id_item]]->config.set_key_value("gap_fill_enabled", new ConfigOptionBool(true)); //should be false?, enabled for testing model.objects[objs_idx[id_item]]->config.set_key_value("min_width_top_surface", new ConfigOptionFloatOrPercent(0.0,false)); model.objects[objs_idx[id_item]]->config.set_key_value("only_one_perimeter_top", new ConfigOptionBool(false)); - model.objects[objs_idx[id_item]]->config.set_key_value("only_one_perimeter_first_layer", new ConfigOptionBool(true)); + model.objects[objs_idx[id_item]]->config.set_key_value("only_one_perimeter_first_layer", new ConfigOptionBool(false));//, if borderers - right are scaled correctly there shouldn't be any gap fill in them. it would be nice to keep the *4 extrusion lines for the borders only. + // can this be applied to the right border only ? model.objects[objs_idx[id_item]]->config.set_key_value("perimeter_overlap", new ConfigOptionPercent(100)); - model.objects[objs_idx[id_item]]->config.set_key_value("seam_position", new ConfigOptionEnum(spRear)); //BUG: should be fixed in 2.7 merge/SS 2.5.59.7, when this is changed the "perimeters & shell" doesn't turn red indicating a change. + model.objects[objs_idx[id_item]]->config.set_key_value("seam_position", new ConfigOptionEnum(spRear)); //spRear or spCost //BUG: should be fixed in 2.7 merge/SS 2.5.59.7, when this is changed the "perimeters & shell" doesn't turn red indicating a change. model.objects[objs_idx[id_item]]->config.set_key_value("top_solid_layers", new ConfigOptionInt(0)); size_t num_part = 0; const int extra_vol = 1; - for (ModelObject* part : pressure_tower[id_item]) {//loop though each part/volume and assign the modifers + std::set added_roles; + for (ModelObject* part : pressure_tower[id_item]) {//loop though each part/volume and assign the modifers for the 90_bend model. - std::string er_role =""; + std::string er_role = extrusion_role; + bool role_found = false; if (extrusion_role == "Verify") { - er_role = choice_extrusion_role[num_part]; - } - else{ - er_role = extrusion_role; + for (size_t i = 0; i < sizeof(choice_extrusion_role) / sizeof(choice_extrusion_role[0]); i++) { + er_role = choice_extrusion_role[i]; + if (er_width_ToOptionKey.find(er_role) != er_width_ToOptionKey.end() && added_roles.find(er_role) == added_roles.end()) { + //er_role = er_role; + added_roles.insert(er_role); + role_found = true; + break; + } + else{role_found = false;}//role not found and not currently supported by calibration tool. + } + } else { + role_found = (er_width_ToOptionKey.find(er_role) != er_width_ToOptionKey.end()); } - if (er_width_ToOptionKey.find(er_role) != er_width_ToOptionKey.end()) { + + if (role_found == true && broken_config == false) { er_width = std::round((full_print_config.get_computed_value(er_width_ToOptionKey[er_role].c_str(), nozzle_diameter) * 100 / nozzle_diameter) * 100.0) / 100.0; er_speed = full_print_config.get_computed_value(er_speed_ToOptionKey[er_role].c_str(), nozzle_diameter); er_accel = full_print_config.get_computed_value(er_accel_ToOptionKey[er_role].c_str(), nozzle_diameter); - } - else{ + er_spacing = full_print_config.get_computed_value(er_spacing_ToOptionKey[er_role].c_str(), nozzle_diameter); // not needed to be applied to models? + } else { er_width = std::round((default_er_width * 100 / nozzle_diameter) * 100.0) / 100.0; er_speed = default_er_speed; er_accel = default_er_accel; + er_spacing = default_er_spacing; + er_role = std::string("default values"); } - std::string set_advance_prefix =""; if (gcfKlipper == flavor) { if(smooth_time == false){ @@ -634,11 +662,11 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { set_advance_prefix = "M572 S"; } - er_width = (er_width == 0) ? std::round((default_er_width * 100 / nozzle_diameter) * 100.0) / 100.0 : er_width; - er_speed = (er_speed == 0) ? default_er_speed : er_speed; - er_accel = (er_accel == 0) ? default_er_accel : er_accel; + /// --- custom config --- + // config for the 90_bend model - /// --- custom config --- // this is for forcing each model to have x print modifiers + model.objects[objs_idx[id_item]]->volumes[num_part + extra_vol]->config.set_key_value("first_layer_extrusion_width", new ConfigOptionFloatOrPercent(er_width, true));// need to adjust this to remove the first_layer gap fill for 90 bend models. + model.objects[objs_idx[id_item]]->volumes[num_part + extra_vol]->config.set_key_value("first_layer_extrusion_spacing", new ConfigOptionFloatOrPercent(er_spacing, false));// ^^ not getting applied to model on slicing model.objects[objs_idx[id_item]]->volumes[num_part + extra_vol]->config.set_key_value("perimeter_extrusion_width", new ConfigOptionFloatOrPercent(er_width, true)); model.objects[objs_idx[id_item]]->volumes[num_part + extra_vol]->config.set_key_value("external_perimeter_extrusion_width", new ConfigOptionFloatOrPercent(er_width, true));//TODO: check widths and ect breaks if any values are in mm/percentage model.objects[objs_idx[id_item]]->volumes[num_part + extra_vol]->config.set_key_value("perimeter_speed", new ConfigOptionFloatOrPercent(er_speed, false)); @@ -650,15 +678,17 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { if (extrusion_role == "Verify") { model.objects[objs_idx[id_item]]->volumes[num_part + extra_vol]->config.set_key_value("region_gcode", new ConfigOptionString(set_advance_prefix + " ; " + er_role ));//user manual type in values - new_printer_config.set_key_value("before_layer_gcode", new ConfigOptionString(std::string("{if layer_num == 0} ") + set_advance_prefix + std::to_string(first_pa) + " {endif}")); + //new_printer_config.set_key_value("before_layer_gcode", new ConfigOptionString(std::string("{if layer_num == 0} ") + set_advance_prefix + std::to_string(first_pa) + " {endif}")); } else{//add '\n' in? model.objects[objs_idx[id_item]]->volumes[num_part + extra_vol]->config.set_key_value("region_gcode", new ConfigOptionString(set_advance_prefix + std::to_string(pa_values[num_part]) + " ; " + er_role )); - new_printer_config.set_key_value("before_layer_gcode", new ConfigOptionString(std::string("{if layer_num == 0} ") + set_advance_prefix + std::to_string(first_pa) + " {endif}")); + //new_printer_config.set_key_value("before_layer_gcode", new ConfigOptionString(std::string("{if layer_num == 0} ") + set_advance_prefix + std::to_string(first_pa) + " {endif}"));// TOFIX: if multi tests need to adjust this to add syntax for volumes. } + new_printer_config.set_key_value("before_layer_gcode", new ConfigOptionString(std::string("{if layer_num == 0} ") + set_advance_prefix + std::to_string(first_pa) + " {endif}"));// TOFIX: if multi tests need to adjust this to add syntax for volumes. num_part++; + //model.objects[objs_idx[id_item]]->ensure_on_bed(); // put at the correct z (kind of arrange-z)) + //model.objects[objs_idx[id_item]]->center_around_origin(); } - } //update plater @@ -666,7 +696,9 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { plat->on_config_change(new_print_config); this->gui_app->get_tab(Preset::TYPE_PRINTER)->load_config(new_printer_config); plat->on_config_change(new_printer_config); - for (size_t obj_idx : objs_idx) { model.objects[obj_idx]->ensure_on_bed(); } // put at the correct z (kind of arrange-z)) + //enable it later as a safeguard, shouldn't be needed though. + //for (size_t obj_idx : objs_idx) { model.objects[obj_idx]->ensure_on_bed(); } // put at the correct z (kind of arrange-z)) + //for (size_t obj_idx : objs_idx) { model.objects[obj_idx]->center_around_origin();} plat->changed_objects(objs_idx); this->gui_app->get_tab(Preset::TYPE_FFF_PRINT)->update_dirty(); this->gui_app->get_tab(Preset::TYPE_PRINTER)->update_dirty(); @@ -677,7 +709,6 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { // arrange if needed, after new settings, to take them into account // BUG:(borders don't slice. with 2+ generated models.) after updating to 2.5.59.11 the generating 2+ models they have "sinking label" have to click "drop to bed" to resolve, clicking "arrange" doesn't fix issue. - // BUG: disovered manually moving the model in z lettting it drop down, then trying to slice can make it crash - (exception thrown 3073 - gcode.cpp) if (has_to_arrange) { //update print config (done at reslice but we need it here) if (plat->printer_technology() == ptFFF) @@ -699,69 +730,73 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { } } -double CalibrationPressureAdvDialog::magical_scaling(double nozzle_diameter, double er_width, double filament_max_overlap, double spacing_ratio, double spacing_ratio_external, double base_layer_height, double er_spacing ){ +double CalibrationPressureAdvDialog::magical_scaling(double nozzle_diameter, double er_width, double filament_max_overlap, double spacing_ratio, double spacing_ratio_external, double base_layer_height, double er_spacing) { double xyzScale = nozzle_diameter / 0.4; - double er_width_decimal = er_width * nozzle_diameter / 100.0;//models are generated to be default width of x4 lines for the walls ie; 0.4mm nozzle is 1.6mm thick walls - double er_width_to_scale =1.0; + double er_width_decimal = er_width * nozzle_diameter / 100.0;//models are generated to be default width of x4 lines for the walls ie; 0.4mm nozzle is 1.6mm thick walls + extra for ER role widths + double er_width_to_scale = 1.0; double overlap_ratio = 1; - if (filament_max_overlap) {overlap_ratio = filament_max_overlap;} + if (filament_max_overlap) { + overlap_ratio = filament_max_overlap; + } spacing_ratio = std::min(overlap_ratio * 0.5f, spacing_ratio_external / 2.0); - double new_scale_spacing = er_width_decimal-base_layer_height*float(1. -0.25 *PI)* spacing_ratio; + double new_scale_spacing = er_width_decimal - base_layer_height * float(1.0 - 0.25 * PI) * spacing_ratio; double spacing_value = std::round((new_scale_spacing / nozzle_diameter) * 100); //spacing_value = Round((Spacing / Max Nozzle Diameter) * 100) - er_spacing = (std::round(spacing_value * 10000) / 10000) *0.01; + er_spacing = (std::round(spacing_value * 10000) / 10000) * 0.01; - if (xyzScale > 4 ) { + if (xyzScale > 4) { er_width_to_scale = 1.0; - } - else{ - er_width_to_scale = er_spacing -(nozzle_diameter/2*0.01);//need to scale slightly under to help with models being correct TODO: test more configurations of nozzle sizes/layer heights + } else { + er_width_to_scale = er_spacing - (nozzle_diameter / 2 * 0.01);//need to scale slightly under to help with models being correct TODO: test more configurations of nozzle sizes/layer heights //if use has the 'wrong' min layer height for a nozzle size, the model will get filled with "gapfill" not a normal extrusion, need to test more for what variables 'break' it } return er_width_to_scale; } -void CalibrationPressureAdvDialog::create_buttons(wxStdDialogButtonSizer* buttons){ +void CalibrationPressureAdvDialog::create_buttons(wxStdDialogButtonSizer* buttons) { const DynamicPrintConfig* printer_config = this->gui_app->get_tab(Preset::TYPE_PRINTER)->get_config(); GCodeFlavor flavor = printer_config->option>("gcode_flavor")->value; std::string prefix = (gcfMarlinFirmware == flavor) ? " LA " : ((gcfKlipper == flavor || gcfRepRap == flavor) ? " PA " : "unsupported firmware type"); - if (prefix != "unsupported firmware type") { - wxString number_of_runs[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" }; - nbRuns = new wxComboBox(this, wxID_ANY, wxString{ "1" }, wxDefaultPosition, wxDefaultSize, 10, number_of_runs); - nbRuns->SetToolTip(_L("Select the number of tests to generate, max 2 is recommended due to bed size limits")); + wxString number_of_runs[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" };//setting this any higher will break loading the model for the ID + nbRuns = new wxComboBox(this, wxID_ANY, wxString{ "1" }, wxDefaultPosition, wxDefaultSize, 10, number_of_runs, wxCB_READONLY); + nbRuns->SetToolTip(_L("Select the number of tests to generate, max 6 is recommended due to bed size limits")); nbRuns->SetSelection(0); nbRuns->Bind(wxEVT_COMBOBOX, &CalibrationPressureAdvDialog::on_row_change, this); dynamicSizer = new wxBoxSizer(wxVERTICAL); - buttons->Add(dynamicSizer, 1, wxEXPAND | wxALL, 5); - + wxBoxSizer* commonSizer = new wxBoxSizer(wxHORIZONTAL); - commonSizer->Add(new wxStaticText(this, wxID_ANY, _L("Number of tests: "))); - commonSizer->Add(nbRuns); - dynamicSizer->Add(commonSizer, 0, wxALL, 10); - currentTestCount = wxAtoi(nbRuns->GetValue()); + commonSizer->Add(new wxStaticText(this, wxID_ANY, _L("Number of" + prefix + "tests: ")), 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); + commonSizer->Add(nbRuns, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); + + // Create a button for generating + wxButton* generateButton = new wxButton(this, wxID_FILE1, _L("Generate")); + generateButton->Bind(wxEVT_BUTTON, &CalibrationPressureAdvDialog::create_geometry, this); + commonSizer->Add(generateButton, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); - wxButton* bt = new wxButton(this, wxID_FILE1, _L("Generate")); - bt->Bind(wxEVT_BUTTON, &CalibrationPressureAdvDialog::create_geometry, this); - dynamicSizer->Add(bt, 0, wxALL, 10); + dynamicSizer->Add(commonSizer, 0, wxALL, 10); + buttons->Add(dynamicSizer, 1, wxEXPAND | wxALL, 5); + currentTestCount = wxAtoi(nbRuns->GetValue()); create_row_controls(dynamicSizer, currentTestCount); } else { buttons->Add(new wxStaticText(this, wxID_ANY, _L(prefix))); } - - //this->SetSizerAndFit(dynamicSizer); } void CalibrationPressureAdvDialog::create_row_controls(wxBoxSizer* parent_sizer, int row_count) { + // + //wxArrayInt + //wxArrayDouble + //wxArrayDouble choices_first_layerPA[] = { 0.025, 0.030, 0.035, 0.040, 0.045, 0.050 }; wxString choices_first_layerPA[] = { "0.025", "0.030", "0.035", "0.040", "0.045", "0.050" }; wxString choices_start_PA[] = { "0.0", "0.010", "0.020", "0.030", "0.040", "0.050" }; wxString choices_end_PA[] = { "0.10", "0.20", "0.30", "0.40", "0.50", "0.60", "0.70", "0.80", "0.90", "1.00" }; @@ -774,60 +809,63 @@ void CalibrationPressureAdvDialog::create_row_controls(wxBoxSizer* parent_sizer, const DynamicPrintConfig* printer_config = this->gui_app->get_tab(Preset::TYPE_PRINTER)->get_config(); GCodeFlavor flavor = printer_config->option>("gcode_flavor")->value; std::string prefix = (gcfMarlinFirmware == flavor) ? " LA " : ((gcfKlipper == flavor || gcfRepRap == flavor) ? " PA " : "unsupported firmware type"); + //improvements: pull retraction value and auto select a better suited start/end value. + // on new row creation auto select another ER role + // for (int i = 0; i < row_count; i++) { wxBoxSizer* rowSizer = new wxBoxSizer(wxHORIZONTAL); - wxComboBox* firstPaCombo = new wxComboBox(this, wxID_ANY, wxString{ "0.040" }, wxDefaultPosition, wxDefaultSize, 6, choices_first_layerPA); - //rowSizer->Add(new wxStaticText(this, wxID_ANY, _L( prefix + " Test " + std::to_string(i) + ": " ))); rowSizer->AddSpacer(5); + wxComboBox* firstPaCombo = new wxComboBox(this, wxID_ANY, wxString{choices_first_layerPA[3]}, wxDefaultPosition, wxDefaultSize, 6, choices_first_layerPA); rowSizer->Add(new wxStaticText(this, wxID_ANY, _L("First Layers" + prefix + "value: "))); - firstPaCombo->SetToolTip(_L("Select the first layer" + prefix +" value to be used for the first layer only.")); + firstPaCombo->SetToolTip(_L("Select the" + prefix +"value to be used for the first layer only.\n(this gets added to 'before_layer_gcode' area)")); firstPaCombo->SetSelection(3); rowSizer->Add(firstPaCombo); dynamicFirstPa.push_back(firstPaCombo); rowSizer->AddSpacer(15); - wxComboBox* startPaCombo = new wxComboBox(this, wxID_ANY, wxString{ "0.0" }, wxDefaultPosition, wxDefaultSize, 6, choices_start_PA); - rowSizer->Add(new wxStaticText(this, wxID_ANY, _L("Starting" + prefix + "value: "))); - startPaCombo->SetToolTip(_L("Select the starting " + prefix + " value to be used.")); + wxComboBox* startPaCombo = new wxComboBox(this, wxID_ANY, wxString{ choices_start_PA[0]}, wxDefaultPosition, wxDefaultSize, 6, choices_start_PA); + rowSizer->Add(new wxStaticText(this, wxID_ANY, _L("Start value: "))); + startPaCombo->SetToolTip(_L("Select the starting" + prefix + "value to be used.\n (you can manually type in values!)")); startPaCombo->SetSelection(0); rowSizer->Add(startPaCombo); dynamicStartPa.push_back(startPaCombo); rowSizer->AddSpacer(15); - wxComboBox* endPaCombo = new wxComboBox(this, wxID_ANY, wxString{ "0.10" }, wxDefaultPosition, wxDefaultSize, 10, choices_end_PA); - rowSizer->Add(new wxStaticText(this, wxID_ANY, _L("Ending" + prefix + "value: "))); - endPaCombo->SetToolTip(_L("Select the ending " + prefix + " value to be used.")); + wxComboBox* endPaCombo = new wxComboBox(this, wxID_ANY, wxString{ choices_end_PA[0] }, wxDefaultPosition, wxDefaultSize, 10, choices_end_PA); + rowSizer->Add(new wxStaticText(this, wxID_ANY, _L("End value: "))); + endPaCombo->SetToolTip(_L("Select the ending" + prefix + "value to be used.\n (you can manually type in values!)")); endPaCombo->SetSelection(0); rowSizer->Add(endPaCombo); dynamicEndPa.push_back(endPaCombo); rowSizer->AddSpacer(15); - wxComboBox* paIncrementCombo = new wxComboBox(this, wxID_ANY, wxString{ "0.005" }, wxDefaultPosition, wxDefaultSize, 8, choices_increment_PA); - rowSizer->Add(new wxStaticText(this, wxID_ANY, _L(prefix + "increments: "))); - paIncrementCombo->SetToolTip(_L("Select the " + prefix + " increment amount.")); + wxComboBox* paIncrementCombo = new wxComboBox(this, wxID_ANY, wxString{ choices_increment_PA[3] }, wxDefaultPosition, wxDefaultSize, 8, choices_increment_PA); + rowSizer->Add(new wxStaticText(this, wxID_ANY, _L("Increment by: "))); + paIncrementCombo->SetToolTip(_L("Select the incremental value.\n (you can manually type in values!)")); paIncrementCombo->SetSelection(3); rowSizer->Add(paIncrementCombo); dynamicPaIncrement.push_back(paIncrementCombo); rowSizer->AddSpacer(15); - wxComboBox* erPaCombo = new wxComboBox(this, wxID_ANY, wxString{ "InternalInfill" }, wxDefaultPosition, wxDefaultSize, 15, choices_extrusion_role); + wxComboBox* erPaCombo = new wxComboBox(this, wxID_ANY, wxString{ choices_extrusion_role[2 + i] }, wxDefaultPosition, wxDefaultSize, 15, choices_extrusion_role, wxCB_READONLY);//disable user edit this one :) rowSizer->Add(new wxStaticText(this, wxID_ANY, _L("Extrusion role: "))); erPaCombo->SetToolTip(_L("Select the extrusion role you want to generate a calibration for")); - erPaCombo->SetSelection(0); + erPaCombo->SetSelection(2+i);//improvement: pull the last rows value and go up/down from there rowSizer->Add(erPaCombo); dynamicExtrusionRole.push_back(erPaCombo); if (prefix == " PA ") {//klipper only feature ? rowSizer->AddSpacer(15); wxCheckBox* enableST = new wxCheckBox(this, wxID_ANY, _L(""), wxDefaultPosition, wxDefaultSize); - enableST->SetToolTip(_L("Generate smooth time values")); - enableST->SetValue(false); rowSizer->Add(new wxStaticText(this, wxID_ANY, _L("Smooth time: "))); + //enableST->SetToolTip(_L("Generate smooth time values")); + enableST->SetToolTip(_L("This parameter defines the duration over which extruder velocity changes are averaged, helping to smooth out rapid changes in extrusion pressure. Shorter times (e.g., 0.01 seconds) are beneficial for fast printing, while longer times (e.g., 0.4 seconds) are better for slower printing. The default value is 0.04 seconds.")); + enableST->SetValue(false); rowSizer->Add(enableST); dynamicEnableST.push_back(enableST); } @@ -870,6 +908,44 @@ void CalibrationPressureAdvDialog::on_row_change(wxCommandEvent& event) { } +std::pair, int> CalibrationPressureAdvDialog::calc_PA_values(int id_item) { + wxString firstPaValue = dynamicFirstPa[id_item]->GetValue(); + wxString startPaValue = dynamicStartPa[id_item]->GetValue(); + wxString endPaValue = dynamicEndPa[id_item]->GetValue(); + wxString paIncrementValue = dynamicPaIncrement[id_item]->GetValue(); + wxString erPaValue = dynamicExtrusionRole[id_item]->GetValue(); + + double first_pa; + firstPaValue.ToDouble(&first_pa); + + double start_pa; + startPaValue.ToDouble(&start_pa); + double end_pa; + endPaValue.ToDouble(&end_pa); + double pa_increment; + paIncrementValue.ToDouble(&pa_increment); + + int countincrements = 0; + int sizeofarray = static_cast((end_pa - start_pa) / pa_increment) + 2;//'+2' needed for odd/even numbers + std::vector pa_values(sizeofarray); + + double incremented_pa_value = start_pa; + while (incremented_pa_value <= end_pa + pa_increment / 2) { + if (incremented_pa_value <= end_pa) { + double rounded_pa = std::round(incremented_pa_value * 1000000.0) / 1000000.0; + pa_values[countincrements] = rounded_pa; + countincrements++; + incremented_pa_value += pa_increment; + } else { + pa_values[countincrements] = end_pa; + countincrements++;//failsafe if werid input numbers are provided that can't add the "ending pa" number to the array. + break; + } + }// is there a limit of how many models SS can load ? might be good to set a failsafe just so it won't load 10k+ models... + + return std::make_pair(pa_values, countincrements); +} + } // namespace GUI } // namespace Slic3r diff --git a/src/slic3r/GUI/CalibrationPressureAdvDialog.hpp b/src/slic3r/GUI/CalibrationPressureAdvDialog.hpp index 2516661a104..a1b6c8eaeb7 100644 --- a/src/slic3r/GUI/CalibrationPressureAdvDialog.hpp +++ b/src/slic3r/GUI/CalibrationPressureAdvDialog.hpp @@ -20,7 +20,7 @@ class CalibrationPressureAdvDialog : public CalibrationAbstractDialog void create_row_controls(wxBoxSizer* parent_sizer, int row_count); void create_geometry(wxCommandEvent& event_args); void on_row_change(wxCommandEvent& event); - double calc_PA_values(double, double, double); + std::pair, int> calc_PA_values(int id_item); double magical_scaling(double, double, double, double, double, double, double ); //i've set choice boxes for now just to save me typing numbers in when i want to test it :) diff --git a/src/slic3r/GUI/ConfigManipulation.cpp b/src/slic3r/GUI/ConfigManipulation.cpp index d40bf04f385..094cbf222d0 100644 --- a/src/slic3r/GUI/ConfigManipulation.cpp +++ b/src/slic3r/GUI/ConfigManipulation.cpp @@ -513,10 +513,11 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig* config) "raft_layer_height", "raft_interface_layer_height"}) toggle_field(el, have_raft); - //for default_extrusion_width/spacing, you need to ahve at least an extrusion_width with 0 + //for default_extrusion_width/spacing, you need to have at least an extrusion_width with 0 bool have_default_width = config->option("first_layer_extrusion_width")->get_float() == 0 || (config->option("perimeter_extrusion_width")->get_float() == 0 && (have_perimeters || have_brim)) || (config->option("external_perimeter_extrusion_width")->get_float() == 0 && have_perimeters) || + (config->option("first_layer_extrusion_width")->get_float() == 0 && have_perimeters) || (config->option("infill_extrusion_width")->get_float() == 0 && (have_infill || has_solid_infill)) || (config->option("solid_infill_extrusion_width")->get_float() == 0 && has_solid_infill) || (config->option("top_infill_extrusion_width")->get_float() == 0 && has_top_solid_infill) || @@ -524,6 +525,8 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig* config) (config->option("skirt_extrusion_width")->get_float() == 0 && have_skirt); toggle_field("extrusion_width", have_default_width); toggle_field("extrusion_spacing", have_default_width); + toggle_field("first_layer_extrusion_width", have_perimeters); + toggle_field("first_layer_extrusion_spacing", have_perimeters); bool has_PP_ironing = has_top_solid_infill && config->opt_bool("ironing"); for (auto el : { "ironing_type", "ironing_flowrate", "ironing_spacing", "ironing_angle" }) From f01651a3f29178476d677bb37583894cb558f7f8 Mon Sep 17 00:00:00 2001 From: legend069 <40685552+legend069@users.noreply.github.com> Date: Thu, 1 Aug 2024 01:40:34 +1000 Subject: [PATCH 25/28] welcome page updated. and bug fixes. fixed bugs with default values not getting set. fixed issue with 'internal_bridge_speed' missing on GUI --- .../filament_pressure/filament_pressure.html | 114 ++++++++++++------ resources/ui_layout/default/print.ui | 2 +- resources/ui_layout/example/print.ui | 2 +- .../GUI/CalibrationPressureAdvDialog.cpp | 97 +++++++++------ 4 files changed, 135 insertions(+), 80 deletions(-) diff --git a/resources/calibration/filament_pressure/filament_pressure.html b/resources/calibration/filament_pressure/filament_pressure.html index 1258913b903..1a9509e047c 100644 --- a/resources/calibration/filament_pressure/filament_pressure.html +++ b/resources/calibration/filament_pressure/filament_pressure.html @@ -3,6 +3,33 @@ Pressure Advance Calibration + @@ -10,59 +37,70 @@ -

Pressure/Linear Advance

+

Pressure Advance Calibration

- - - +
Needs:Bed Leveling and Layer Squish to be perfect
+ + +
Requirements:Perfect Bed Leveling and Layer Squish
-
+
-

this test is still in development, beta should work "ok" for now though.this page will be get updated along with it :)
your current print settings will need to be saved before clicking "generate" since it uses the saved values to create the model

-

note: this test will auto pull all your currently loaded config parameters and generate a model for you to print!
for to help with firmware speed/processing limitations it's reccomended to have most extrusion roles similar set to speeds.(but you don't have to!)

+

This test is still in development. The beta version should work well, but your current print settings need to be saved before clicking "Generate" since they are used to create the model.

-

How to tune your printer for Pressure/Linear Advance

-

to get started

-
    -
  • select the number of tests to create, if you select more than 1 for now you will have to resize the window manually(click and drag the window from the bottom right)
  • -
  • select the start/end/increment/ extrusion role values
  • -
  • each row is the config for each base test model, eg; first row = externalPerimeter second row = firstLayer
  • -
  • since each model will have it's own config one test model might be faster/slower than the others, this is expected and normal
  • -
  • i will reccomend setting 'first_layer_speed' and 'first_layer_min_speed' to the same vales
  • -
  • first calibration tool that supports Arachne!
  • -
  • helpfull tip: if you're wanting to run multi test on a single plate take a screenshot of the main config page(or leave it open) so you can see the matching ID label on the bottom right of the loaded model.
  • +

    Note: This test will automatically pull all your currently saved configuration parameters and generate a model for you to print. For optimal results, depending if you're chasing speed/quality or a mix of both, it is recommended to keep similar speeds for most extrusion roles, (although this is not mandatory).

    +

    How to Tune Your Printer for Pressure/Linear Advance

    +

    To get started:

    +
      +
    • Select the number of tests to create, the max is 10.
    • +
    • Each row represents the config parameters for the selected extrusion role (e.g., first row = ExternalPerimeter, second row = FirstLayer).
    • +
    • Select the start/end and increment values, you can manually edit these values if you want larger or smaller values.
    • +
    • Since each model will have its own config, one test model might print faster or slower than others. This is expected and normal.
    • +
    • This is the first calibration tool that supports Arachne! so leave it enabled if you use Arachne.
    • +
    • Helpful tip: If you are running multiple tests on a single plate, take a screenshot of the main configuration page (or leave it open and drag the window out of the way) to match the row number to the ID label on the bottom right of the loaded model. (counting starts at '0' ☺)
      +You can also inspect each 'base model' and view the object modifiers for each 90° bend model, the 'region_gcode' will have a comment for the extrusion role.
    -

    what is this "verify" option?
    -you may notice there is the "verify" option in the extrusion role dropdown, this feature currently doesn't work.(you can still use it, but any role that has gap fill will be incorrect and the test for that role should be ignored!)
    -when i get it working, it's purpose is to make it easy to see what extrusion roles need it's PA values tuned. - it will create a model for each ER role, and assign that roles speed/acceleration/widths/spacing to the single model
    -you can then manually add the pressure advance command into the "per region g-code" box, slice and print it. -

    - -

    known bugs:
    -

      -
    • setting first layers PA value for multi test only applies the last rows value into (before_layer_gcode)
    • -
    • the first layer gets gap fill on the 90° bend models, reccomended to disable gap fill if this happens.
    • -
    • - -
    +

    Currently unsupported roles:

    +
      +
    • BridgeInfill, InternalBridgeInfill, ThinWall, GapFill, Ironing
    • +
    +

    What is the "Verify" option?
    +The "Verify" option is an experimental feature. It aims to create a 90° model for each extrusion role, applying specific settings related to that extrusion role.
    +You need to manually add the pressure advance values into the "per region g-code" box.
    +However, it currently doesn't work perfectly. Occasionally the models get 'gap fill' and that will produce inaccurate results. Select the "verify" option to identify which extrusion roles need Pressure Advance tuning.

    -

    Advice

    -

    Before doing this test, it's preferable to tune everything else first!
    i would reccomended setting XXXX to the same speeds, XXX to a slow speed, and everything else you can send it with.

    -

    note: having large variance with ER speeds can reduce print quality/dimensional accuracy this is effect is mainly caused by the inner perimeter getting pulled closer to the external perimeter as it cools down, since each perimeter would be at different temperatues.

    -

    i will reccomend setting 'first_layer_speed' and 'first_layer_min_speed' to the same vales

    -

    TODO add things about PA and setting first layer correctly
    add notes about fan speed and disabling fan speed for this test, or do i have check box in GUI that would auto change relavent UI tab?

    +

    Known Bugs

      -
    • bullet points
    • +
    • Setting the first layer's PA value for multiple tests only applies the last row's value to (before_layer_gcode).
    • +
    • The first layer may receive gap fill on the 90° bend models; it is recommended to disable gap fill in the object modifiers if this occurs.
    • +
    • Occasionally some numbers might get scaled wrong so they won't show up on the G-code preview, this has primarily been for number '1'. If this happens, adjust main config 'thin_perimeters' to '-1'.
    • +
    • Other minor bugs may be present.
    + +

    Advice

    +

    Before calibrating Pressure/Linear Advance, it is recommended to tune everything else first!
    +

    You may need to disable or adjust your part cooling config for this test, including the features that slow down layer times. Note: Large variances in ER speeds can reduce print quality and dimensional accuracy.

    +

    It's recommended to set 'first_layer_min_speed' and 'first_layer_speed' to the same values, since the variance in speeds will mess with the first layer's pressure advance adjustments.

    +

    Notes

    -

    TODO: add cred for andrew ellis testing method

    +

    TODO: add pictures

    + + + + + + + +
    +

    This testing method originated from ellis3dp.com/Print-Tuning-Guide. You can find the original generator here.

    +
    + diff --git a/resources/ui_layout/default/print.ui b/resources/ui_layout/default/print.ui index e601cfcdc42..bfdffa645c0 100644 --- a/resources/ui_layout/default/print.ui +++ b/resources/ui_layout/default/print.ui @@ -334,7 +334,7 @@ group:label_width$8:sidetext_width$7:Speed for print moves setting:width$4:brim_speed line:Bridge speed setting:width$4:bridge_speed - setting:width$4:bridge_speed_internal + setting:width$4:internal_bridge_speed setting:width$4:overhangs_speed line:Gap fill speed setting:width$4:label$Maximum speed:gap_fill_speed diff --git a/resources/ui_layout/example/print.ui b/resources/ui_layout/example/print.ui index e5abd9b14f7..f16a2d96c9a 100644 --- a/resources/ui_layout/example/print.ui +++ b/resources/ui_layout/example/print.ui @@ -322,7 +322,7 @@ group:label_width$8:sidetext_width$7:Speed for print moves setting:width$4:brim_speed line:Bridge speed setting:width$4:bridge_speed - setting:width$4:bridge_speed_internal + setting:width$4:internal_bridge_speed setting:width$4:overhangs_speed line:Gap fill speed setting:width$4:label$maximum speed:gap_fill_speed diff --git a/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp b/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp index b00fea036d2..bd1078be597 100644 --- a/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp +++ b/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp @@ -85,13 +85,13 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { {"ExternalPerimeter", "external_perimeter_extrusion_width"}, //{"GapFill", "placeholder"},//special calc required //{"InternalBridgeInfill", "placeholder"},//special calc required, TODO:find out where/how this is calculated - {"Ironing", "top_infill_extrusion_width"}, + //{"Ironing", "top_infill_extrusion_width"},//not fully suported {"OverhangPerimeter", "overhangs_width"}, {"Perimeter", "perimeter_extrusion_width"}, {"SolidInfill", "solid_infill_extrusion_width"}, {"SupportMaterial", "support_material_extrusion_width"}, - {"SupportMaterialInterface", "support_material_extrusion_width"}, - {"ThinWall", "external_perimeter_extrusion_width"}, + {"SupportMaterialInterface", "support_material_extrusion_width"},//SupportMaterialInterface and SupportMaterialInterface shares same width calculations? + {"ThinWall", "external_perimeter_extrusion_width"},//not fully suported {"TopSolidInfill", "top_infill_extrusion_width"}, {"FirstLayer", "first_layer_extrusion_width"} @@ -137,7 +137,7 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { {"BridgeInfill", "bridge_speed"}, {"ExternalPerimeter", "external_perimeter_speed"}, {"GapFill", "gap_fill_speed"}, - {"InternalBridgeInfill", "bridge_speed_internal"}, + {"InternalBridgeInfill", "internal_bridge_speed"}, {"Ironing", "ironing_speed"}, {"OverhangPerimeter", "overhangs_speed"}, {"Perimeter", "perimeter_speed"}, @@ -204,13 +204,13 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { Flow first_layer_flow = Flow::new_from_config(FlowRole::frPerimeter, *print_config, nozzle_diameter, first_layer_height, 1.f, true); - bool broken_config = false; - if(default_er_width == 0 || default_er_spacing == 0){//if their config is broken fix it :) + bool defaults_broken = false; + if(default_er_width == 0 || default_er_spacing == 0){//if their default value config is broken fix it :) //Flow broken_config_flow = Flow::new_from_config(FlowRole::frExternalPerimeter, *print_config, nozzle_diameter, first_layer_height, spacing_ratio_external, false); //broken_config_flow.spacing() broken_config_flow.width(); default_er_width = nozzle_diameter; default_er_spacing = default_er_width - base_layer_height * float(1. - 0.25 * PI) * spacing_ratio_external; //rounded_rectangle_extrusion_spacing - broken_config = true; + defaults_broken = true; } @@ -314,21 +314,24 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { er_spacing = print_config->get_abs_value(er_spacing_ToOptionKey[extrusion_role].c_str(), nozzle_diameter); //potential BUG if any of the values are 0 everything else would fail, pull the default value too and assign that - if(er_width == 0){er_width = default_er_width; } - if(er_speed == 0){er_speed = default_er_speed; } - if(er_accel == 0){er_accel = default_er_accel; } - if(er_spacing == 0){er_spacing = default_er_spacing; } + er_width = (er_width != 0) ? er_width : default_er_width; + er_speed = (er_speed != 0) ? er_speed : default_er_speed; + er_accel = (er_accel != 0) ? er_accel : default_er_accel; + er_spacing = (er_spacing != 0) ? er_spacing : default_er_spacing; + + + //TODO: create assert check to see if value is not 0? + er_width = std::round((er_width * 100 / nozzle_diameter) * 100.0) / 100.0; - er_width = er_width * 100 / nozzle_diameter; - er_width = std::round(er_width * 100.0) / 100.0; } else { er_width = print_config->get_abs_value("solid_infill_extrusion_width", nozzle_diameter); //used for gapfill_width/bridges selection. TODO: add the bits for this here since gapfill/bridges need special calculations - er_width = er_width * 100 / nozzle_diameter; - er_width = std::round(er_width * 100.0) / 100.0; + er_width = std::round((er_width * 100 / nozzle_diameter) * 100.0) / 100.0; + //er_width = er_width * 100 / nozzle_diameter; + //er_width = std::round(er_width * 100.0) / 100.0; } } - if(broken_config == true){//if their config is broken fix it :) + if(defaults_broken == true){//if their config is broken fix it :) default_er_width = nozzle_diameter; default_er_spacing = default_er_width - base_layer_height * float(1. - 0.25 * PI) * spacing_ratio_external; //rounded_rectangle_extrusion_spacing } @@ -342,6 +345,7 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { double xyzScale = nozzle_diameter / 0.4; double er_width_to_scale = magical_scaling(nozzle_diameter, er_width, filament_max_overlap, spacing_ratio, spacing_ratio_external, base_layer_height, er_spacing); double er_width_to_scale_first_layer = total_width_with_overlap; + //TODO: add assert checks on er_width_to_scale ? //-- magical scaling pressure_tower.emplace_back(); @@ -392,39 +396,30 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { for (size_t i = 0; i < sizeof(choice_extrusion_role) / sizeof(choice_extrusion_role[0]); i++) { er_role = choice_extrusion_role[i]; if (er_width_ToOptionKey.find(er_role) != er_width_ToOptionKey.end() && added_roles.find(er_role) == added_roles.end()) { - //er_role = er_role; added_roles.insert(er_role); role_found = true; break; } else{role_found = false;}//role not found and not currently supported by calibration tool. } - - /*for (const std::string& role : choice_extrusion_role) { - if (er_width_ToOptionKey.find(role) != er_width_ToOptionKey.end()) { - er_role = role; - role_found = true; - break; - } - }*/ } else { role_found = (er_width_ToOptionKey.find(er_role) != er_width_ToOptionKey.end()); } - if (role_found == true && broken_config == false) { - er_width = std::round((full_print_config.get_computed_value(er_width_ToOptionKey[er_role].c_str(), nozzle_diameter) * 100 / nozzle_diameter) * 100.0) / 100.0; - er_spacing = full_print_config.get_computed_value(er_spacing_ToOptionKey[er_role].c_str(), nozzle_diameter); + if (role_found == true) { + er_width = print_config->get_abs_value(er_width_ToOptionKey[er_role].c_str(), nozzle_diameter); + er_spacing = print_config->get_abs_value(er_spacing_ToOptionKey[er_role].c_str(), nozzle_diameter); + + er_width = (er_width != 0) ? er_width : default_er_width;//found supported role but it has 0 value, need to give it defaults. + er_spacing = (er_spacing != 0) ? er_spacing : default_er_spacing; + } else { - er_width = std::round((default_er_width * 100 / nozzle_diameter) * 100.0) / 100.0; + er_width = default_er_width; er_spacing = default_er_spacing; } - if(broken_config == true){ - er_width_to_scale = 1; - } - else{ - er_width_to_scale = magical_scaling(nozzle_diameter, er_width, filament_max_overlap, spacing_ratio, spacing_ratio_external, base_layer_height, er_spacing); - } + er_width = std::round((er_width * 100 / nozzle_diameter) * 100.0) / 100.0; + er_width_to_scale = magical_scaling(nozzle_diameter, er_width, filament_max_overlap, spacing_ratio, spacing_ratio_external, base_layer_height, er_spacing); add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "scaled_with_nozzle_size" / bend_90_nozzle_size_3mf).string(), @@ -598,6 +593,7 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { // config modifers for the base model model.objects[objs_idx[id_item]]->config.set_key_value("bottom_fill_pattern", new ConfigOptionEnum(ipMonotonicWGapFill));// ipConcentric or ipConcentricGapFill ? + model.objects[objs_idx[id_item]]->config.set_key_value("thin_walls", new ConfigOptionBool(true)); model.objects[objs_idx[id_item]]->config.set_key_value("bottom_solid_layers", new ConfigOptionInt(1)); model.objects[objs_idx[id_item]]->config.set_key_value("brim_width", new ConfigOptionFloat(0)); model.objects[objs_idx[id_item]]->config.set_key_value("external_perimeter_overlap", new ConfigOptionPercent(100)); @@ -633,18 +629,39 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { role_found = (er_width_ToOptionKey.find(er_role) != er_width_ToOptionKey.end()); } - if (role_found == true && broken_config == false) { - er_width = std::round((full_print_config.get_computed_value(er_width_ToOptionKey[er_role].c_str(), nozzle_diameter) * 100 / nozzle_diameter) * 100.0) / 100.0; + if (role_found == true /*&& defaults_broken == false*/) { + er_width = print_config->get_abs_value(er_width_ToOptionKey[er_role].c_str(), nozzle_diameter); er_speed = full_print_config.get_computed_value(er_speed_ToOptionKey[er_role].c_str(), nozzle_diameter); er_accel = full_print_config.get_computed_value(er_accel_ToOptionKey[er_role].c_str(), nozzle_diameter); - er_spacing = full_print_config.get_computed_value(er_spacing_ToOptionKey[er_role].c_str(), nozzle_diameter); // not needed to be applied to models? + er_spacing = print_config->get_abs_value(er_spacing_ToOptionKey[er_role].c_str(), nozzle_diameter); + + er_width = (er_width != 0) ? er_width : default_er_width; + er_speed = (er_speed != 0) ? er_speed : default_er_speed; + er_accel = (er_accel != 0) ? er_accel : default_er_accel; + er_spacing = (er_spacing != 0) ? er_spacing : default_er_spacing; + + } else { - er_width = std::round((default_er_width * 100 / nozzle_diameter) * 100.0) / 100.0; + //instead of loading defaults for everything only load defaults for broken/unsupported values. + er_width = default_er_width; er_speed = default_er_speed; er_accel = default_er_accel; er_spacing = default_er_spacing; - er_role = std::string("default values"); + + + //er_width = print_config->get_abs_value(er_width_ToOptionKey[er_role].c_str(), nozzle_diameter); + er_speed = full_print_config.get_computed_value(er_speed_ToOptionKey[er_role].c_str(), nozzle_diameter); + er_accel = full_print_config.get_computed_value(er_accel_ToOptionKey[er_role].c_str(), nozzle_diameter); + //er_spacing = print_config->get_abs_value(er_spacing_ToOptionKey[er_role].c_str(), nozzle_diameter); + + //er_width = (er_width != 0) ? er_width : default_er_width; + er_speed = (er_speed != 0) ? er_speed : default_er_speed; + er_accel = (er_accel != 0) ? er_accel : default_er_accel; + //er_spacing = (er_spacing != 0) ? er_spacing : default_er_spacing; + + er_role = "defaults for " + er_role + " width spacing"; } + er_width = std::round((er_width * 100 / nozzle_diameter) * 100.0) / 100.0; std::string set_advance_prefix =""; if (gcfKlipper == flavor) { From 754cec1fa948ccba0cf67257e2d77829f7701fff Mon Sep 17 00:00:00 2001 From: legend069 <40685552+legend069@users.noreply.github.com> Date: Tue, 27 Aug 2024 20:10:46 +1000 Subject: [PATCH 26/28] small updates for PA tool small typo in "before_layer_gcode" there is no layer "0"! added 'false' flag for rotate when adding models, this might fix 45 degree printer bug? --- resources/ui_layout/default/filament.ui | 2 +- resources/ui_layout/example/filament.ui | 2 +- .../GUI/CalibrationPressureAdvDialog.cpp | 19 ++++++++++--------- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/resources/ui_layout/default/filament.ui b/resources/ui_layout/default/filament.ui index 7aa065d2ba5..8e6c9624d66 100644 --- a/resources/ui_layout/default/filament.ui +++ b/resources/ui_layout/default/filament.ui @@ -43,7 +43,7 @@ group:Fan speed - default setting:id$0:label_width$12:label$Interface:support_material_interface_fan_speed line:Bridges fan speed setting:id$0:label_width$12:label$Bridges:bridge_fan_speed - setting:id$0:label_width$12:label$Internal bridges:bridge_internal_fan_speed + setting:id$0:label_width$12:label$Internal bridges:internal_bridge_fan_speed line:Overhangs Perimeter fan speed setting:id$0:label_width$12:label$Overhangs:overhangs_fan_speed line:Gap fill fan speed diff --git a/resources/ui_layout/example/filament.ui b/resources/ui_layout/example/filament.ui index 7aefcd3fbd8..fdf3c8fca99 100644 --- a/resources/ui_layout/example/filament.ui +++ b/resources/ui_layout/example/filament.ui @@ -48,7 +48,7 @@ group:Fan speed - default setting:id$0:label_width$12:label$Interface:support_material_interface_fan_speed line:Bridges fan speed setting:id$0:label_width$12:label$Bridges:bridge_fan_speed - setting:id$0:label_width$12:label$Internal bridges:bridge_internal_fan_speed + setting:id$0:label_width$12:label$Internal bridges:internal_bridge_fan_speed line:Overhangs Perimeter fan speed setting:id$0:label_width$12:label$Overhangs:overhangs_fan_speed line:Gap fill fan speed diff --git a/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp b/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp index bd1078be597..adbe469cc36 100644 --- a/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp +++ b/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp @@ -485,27 +485,27 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border.3mf").string(), Vec3d{ left_border_x_pos , bend_pos_mid.y(), z_others_pos }, - /*scale*/Vec3d{ scaled_l_border_x_percentage, scaled_lr_border_y_percentage, z_scale_others }); //Left border + /*scale*/Vec3d{ scaled_l_border_x_percentage, scaled_lr_border_y_percentage, z_scale_others }, false); //Left border add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border.3mf").string(), Vec3d{ right_border_x_pos , bend_pos_mid.y(), z_others_pos }, - /*scale*/Vec3d{ scaled_r_border_x_percentage , scaled_lr_border_y_percentage , z_scale_others}); //right border + /*scale*/Vec3d{ scaled_r_border_x_percentage , scaled_lr_border_y_percentage , z_scale_others}, false); //right border add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border.3mf").string(),//on odd number of count_increments the bottom border is not joined to the side borders. fixing this bug will require Vec3d{ tb_border_x_pos , bend_pos_first.y() - (xy_scaled_90_bend_y / 2) - (xy_scaled_border_y / 2) - nozzle_diameter, z_others_pos }, // adding more if/else statements to add the extra offset and apply this to all other calculations for the border scale and position. - /*scale*/Vec3d{ scaled_tb_border_x_percentage , scaled_tb_border_y_percentage, z_scale_others }); //bottom border + /*scale*/Vec3d{ scaled_tb_border_x_percentage , scaled_tb_border_y_percentage, z_scale_others }, false); //bottom border //---------- add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border.3mf").string(), Vec3d{ tb_border_x_pos , bend_pos_last.y() + (xy_scaled_90_bend_y / 2) + (xy_scaled_border_y / 2) + nozzle_diameter, z_others_pos }, - /*scale*/Vec3d{ scaled_tb_border_x_percentage, scaled_tb_border_y_percentage, z_scale_others}); //top border + /*scale*/Vec3d{ scaled_tb_border_x_percentage, scaled_tb_border_y_percentage, z_scale_others}, false); //top border // scale model in percentage from original models xy values! if (id_item < 10){ //will break if max test count goes higher. add_part(model.objects[objs_idx[id_item]],(boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / (std::to_string(id_item) + std::string(".3mf"))).string(), Vec3d{ number_pos_mid.x(), bend_pos_first.y() - (xy_scaled_90_bend_y / 2) + (xy_scaled_number_y / 2), z_scaled_model_height }, - /*scale*/Vec3d{ xyzScale * er_width_to_scale, xyzScale * er_width_to_scale, z_scale_others * 2 }); // currentTestCount identifer + /*scale*/Vec3d{ xyzScale * er_width_to_scale, xyzScale * er_width_to_scale, z_scale_others * 2 }, false); // currentTestCount identifer } } @@ -530,13 +530,13 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { if (pa_values_string[j] == '.') { add_part(model.objects[objs_idx[id_item]],(boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "point.3mf").string(), Vec3d{ xpos - (xy_scaled_number_x / 2), ypos /* - xy_scaled_point_xy - xyzScale*/, z_scaled_model_height },// point gets moved to wrong position on all nozzle_sizes, guessing it's exported offset position doesn't get scaled with the model. - /*scale*/Vec3d{ xyzScale * er_width_to_scale, xyzScale + (xyzScale / 2), z_scale_others * 2 }); + /*scale*/Vec3d{ xyzScale * er_width_to_scale, xyzScale + (xyzScale / 2), z_scale_others * 2 }, false); xpos -= (xy_scaled_number_x / 2); } else if (std::isdigit(pa_values_string[j])) { add_part(model.objects[objs_idx[id_item]],(boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / (pa_values_string[j] + std::string(".3mf"))).string(), Vec3d{ xpos, ypos, z_scaled_model_height },// might need to re size the numbers a touch. they get marked as "thin walls" - /*scale*/Vec3d{ xyzScale * er_width_to_scale, xyzScale * er_width_to_scale, z_scale_others * 2 });//TOCHECK: if any numbers get gapfill + /*scale*/Vec3d{ xyzScale * er_width_to_scale, xyzScale * er_width_to_scale, z_scale_others * 2 }, false);//TOCHECK: if any numbers get gapfill } Eigen::Vector3d modelPosition(xpos + (xy_scaled_number_x / 2) + nozzle_diameter + (xy_scaled_number_x / 2), ypos, z_scaled_model_height); @@ -551,6 +551,7 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { // => settings that are for object or region should be added to the model (see below, in the for loop), not here DynamicPrintConfig new_print_config = *print_config; DynamicPrintConfig new_printer_config = *printer_config; + //check if setting any config values to 45° breaks it. or it might be the default value for rotation adding part? new_print_config.set_key_value("avoid_crossing_perimeters", new ConfigOptionBool(false)); new_print_config.set_key_value("complete_objects", new ConfigOptionBool(false)); //true is required for multi tests on single plate? new_print_config.set_key_value("first_layer_flow_ratio", new ConfigOptionPercent(100)); @@ -701,7 +702,7 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { model.objects[objs_idx[id_item]]->volumes[num_part + extra_vol]->config.set_key_value("region_gcode", new ConfigOptionString(set_advance_prefix + std::to_string(pa_values[num_part]) + " ; " + er_role )); //new_printer_config.set_key_value("before_layer_gcode", new ConfigOptionString(std::string("{if layer_num == 0} ") + set_advance_prefix + std::to_string(first_pa) + " {endif}"));// TOFIX: if multi tests need to adjust this to add syntax for volumes. } - new_printer_config.set_key_value("before_layer_gcode", new ConfigOptionString(std::string("{if layer_num == 0} ") + set_advance_prefix + std::to_string(first_pa) + " {endif}"));// TOFIX: if multi tests need to adjust this to add syntax for volumes. + new_printer_config.set_key_value("before_layer_gcode", new ConfigOptionString(std::string("{if layer_num == 1} ") + set_advance_prefix + std::to_string(first_pa) + " {endif}"));// TOFIX: if multi tests need to adjust this to add syntax for volumes so each test can have seperate first layer value. or to remove extra rows of "dynamicFirstPa"? num_part++; //model.objects[objs_idx[id_item]]->ensure_on_bed(); // put at the correct z (kind of arrange-z)) //model.objects[objs_idx[id_item]]->center_around_origin(); @@ -713,7 +714,7 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { plat->on_config_change(new_print_config); this->gui_app->get_tab(Preset::TYPE_PRINTER)->load_config(new_printer_config); plat->on_config_change(new_printer_config); - //enable it later as a safeguard, shouldn't be needed though. + //enable it later as a safeguard?, shouldn't be needed though. //for (size_t obj_idx : objs_idx) { model.objects[obj_idx]->ensure_on_bed(); } // put at the correct z (kind of arrange-z)) //for (size_t obj_idx : objs_idx) { model.objects[obj_idx]->center_around_origin();} plat->changed_objects(objs_idx); From 2713b54932e5d2b00ddf79ab542119ae5f6e0ccc Mon Sep 17 00:00:00 2001 From: legend069 <40685552+legend069@users.noreply.github.com> Date: Sat, 21 Sep 2024 03:05:12 +1000 Subject: [PATCH 27/28] first_layer gap fill gone!! first_layer when generating tests will no longer have gap fill. first_layer now adds it's PA command correctly and each test has it's independent value welcome page now autoselects last selected role when running multitest plates. infill_every_layers for internalinfill is now supported if your feature_gcode contains firmwares set PA/LA commands it will be auto commented out when exporting .gcode file --- .../filament_pressure/filament_pressure.html | 4 +- src/libslic3r/GCode.cpp | 52 ++- src/libslic3r/PrintConfig.cpp | 17 +- src/libslic3r/PrintConfig.hpp | 2 +- src/libslic3r/PrintObject.cpp | 5 +- src/libslic3r/PrintRegion.cpp | 7 +- .../GUI/CalibrationPressureAdvDialog.cpp | 429 ++++++++++++++---- src/slic3r/GUI/GUI_ObjectList.cpp | 35 +- src/slic3r/GUI/GUI_ObjectList.hpp | 1 + src/slic3r/GUI/ObjectDataViewModel.cpp | 9 +- 10 files changed, 448 insertions(+), 113 deletions(-) diff --git a/resources/calibration/filament_pressure/filament_pressure.html b/resources/calibration/filament_pressure/filament_pressure.html index 1a9509e047c..9cee3d2e0ff 100644 --- a/resources/calibration/filament_pressure/filament_pressure.html +++ b/resources/calibration/filament_pressure/filament_pressure.html @@ -64,9 +64,11 @@

    How to Tune Your Printer for Pressure/Linear Advance

  • Since each model will have its own config, one test model might print faster or slower than others. This is expected and normal.
  • This is the first calibration tool that supports Arachne! so leave it enabled if you use Arachne.
  • Helpful tip: If you are running multiple tests on a single plate, take a screenshot of the main configuration page (or leave it open and drag the window out of the way) to match the row number to the ID label on the bottom right of the loaded model. (counting starts at '0' ☺)
    -You can also inspect each 'base model' and view the object modifiers for each 90° bend model, the 'region_gcode' will have a comment for the extrusion role.
  • +You can also inspect each 'base model' and view the object modifiers for each 90° bend model, the 'region_gcode' will have a comment for the extrusion role.
+
  • if you use PA/LA commands in your feature_gcode it will be auto commented
  • +

    Currently unsupported roles:

    • BridgeInfill, InternalBridgeInfill, ThinWall, GapFill, Ironing
    • diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 81e41f39ce3..77250f9ec85 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -5379,7 +5379,7 @@ void GCode::apply_region_config(std::string &gcode) { m_writer.tool()->id()); } // apply region_gcode - if (!m_region->config().region_gcode.value.empty()) { + if (!m_region->config().region_gcode.value.empty()) {//here DynamicConfig config; config.set_key_value("layer_num", new ConfigOptionInt(m_layer_index)); config.set_key_value("layer_z", new ConfigOptionFloat(m_layer == nullptr ? m_last_height : m_layer->print_z)); @@ -6233,17 +6233,57 @@ std::string GCode::_before_extrude(const ExtrusionPath &path, const std::string } gcode += m_writer.unretract(); - // extrude arc or line + // process custom extrusion role change gcode. if (path.role() != m_last_extrusion_role && !m_config.feature_gcode.value.empty()) { DynamicConfig config; config.set_key_value("extrusion_role", new ConfigOptionString(extrusion_role_to_string_for_parser(path.role()))); config.set_key_value("last_extrusion_role", new ConfigOptionString(extrusion_role_to_string_for_parser(m_last_extrusion_role))); config.set_key_value("layer_num", new ConfigOptionInt(m_layer_index + 1)); config.set_key_value("layer_z", new ConfigOptionFloat(m_layer == nullptr ? m_last_height : m_layer->print_z)); - gcode += this->placeholder_parser_process("feature_gcode", - m_config.feature_gcode.value, m_writer.tool()->id(), &config) - + "\n"; - } + + if (m_config.print_custom_variables.value == "calibration_print" && !m_region->config().region_gcode.value.empty()) { + + GCodeFlavor flavor = m_config.gcode_flavor.value; + std::string keyword = (gcfKlipper == flavor) ? "SET_PRESSURE_ADVANCE" : + (gcfMarlinFirmware == flavor) ? "M900" : + (gcfRepRap == flavor) ? "M572 S" : ""; + + //std::string keyword = "SET_PRESSURE_ADVANCE"; + std::string feature_gcode_full = m_config.feature_gcode.value; + std::string feature_gcode_modified;//if "feature_gcode_full" is a single line and doesn't have a new line at the end fix it. + if (feature_gcode_full.back() != '\n') { + feature_gcode_full += '\n'; + } + + size_t pos = 0; + + // Loop until all occurrences of SET_PRESSURE_ADVANCE are found + while ((pos = feature_gcode_full.find(keyword, pos)) != std::string::npos) { + // Step 1: Get everything before the keyword + feature_gcode_modified = feature_gcode_full.substr(0, pos); + size_t newline_pos = feature_gcode_full.find('\n', pos + keyword.length()); + std::string substring_to_replace = feature_gcode_full.substr(pos, newline_pos - pos); + size_t first_non_space = substring_to_replace.find_first_not_of(" ", keyword.length()); + substring_to_replace = substring_to_replace.substr(0, first_non_space) + substring_to_replace.substr(first_non_space); + std::replace(substring_to_replace.begin(), substring_to_replace.end(), ';', ' '); // Replace ';' with a space + substring_to_replace = "\n;" + substring_to_replace; + feature_gcode_modified += substring_to_replace; + feature_gcode_modified += feature_gcode_full.substr(newline_pos); + feature_gcode_full = feature_gcode_modified; + pos = newline_pos + 1; + } + + // Pass the modified G-code to be processed + gcode += this->placeholder_parser_process("feature_gcode", feature_gcode_full, m_writer.tool()->id(), &config) + "\n"; + } else { + gcode += this->placeholder_parser_process("feature_gcode", m_config.feature_gcode.value, m_writer.tool()->id(), &config) + "\n"; + } + + + + + + }//gcode += this->placeholder_parser_process("feature_gcode", m_config.feature_gcode.value, m_writer.tool()->id(), &config) + "\n"; if (m_enable_extrusion_role_markers) { if (path.role() != m_last_extrusion_role) { char buf[32]; diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 347d52ff893..e18866b0138 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -590,7 +590,8 @@ void PrintConfigDef::init_fff_params() def->label = L("Arc fitting"); def->category = OptionCategory::firmware; def->tooltip = L("Enable this to get a G-code file which has G2 and G3 moves. " - "And the fitting tolerance is same with resolution"); + "And the fitting tolerance is same with resolution\n" + "Please make sure your firmware is configured for GCode Arcs support"); def->mode = comAdvancedE | comSuSi; def->set_default_value(new ConfigOptionBool(false)); @@ -1417,7 +1418,7 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("Fill pattern for bridges and internal bridge infill."); def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); def->enum_values.push_back("rectilinear"); - def->enum_values.push_back("monotonic"); + def->enum_values.push_back("monotonic"); def->enum_labels.push_back(L("Rectilinear")); def->enum_labels.push_back(L("Monotonic")); def->mode = comExpert | comSuSi; @@ -2896,7 +2897,8 @@ void PrintConfigDef::init_fff_params() def->category = OptionCategory::output; def->tooltip = L("Enable this to add comments into the G-Code labeling print moves with what object they belong to," " which is useful for the Octoprint CancelObject plugin. This settings is NOT compatible with " - "Single Extruder Multi Material setup and Wipe into Object / Wipe into Infill."); + "Single Extruder Multi Material setup and Wipe into Object / Wipe into Infill." + "Please make sure your firmware is configured for label objects support"); def->aliases = { "label_printed_objects" }; def->mode = comAdvancedE | comPrusa; def->set_default_value(new ConfigOptionBool(1)); @@ -2948,10 +2950,15 @@ void PrintConfigDef::init_fff_params() def->label = L("Combine infill every"); def->category = OptionCategory::infill; def->tooltip = L("This feature allows you to combine infill and speed up your print by extruding thicker " - "infill layers while preserving thin perimeters, thus accuracy."); + "infill layers while preserving thin perimeters, thus accuracy." + "\nthis will not make your combined layerheights larger than nozzle_diameter"); def->sidetext = L("layers"); def->full_label = L("Combine infill every n layers"); def->min = 1; + //def->ratio_over = "nozzle_diameter"; + //FIXME need to validate this max value based on nozzle_diameter and base_layer_height, ratio_over ? + //if base_layer_height 0.2 with 0.4mm nozzle it allows higher numbers to be set that might confuse some users. + //def->max = nozzle_diameter; def->mode = comAdvancedE | comPrusa; def->set_default_value(new ConfigOptionInt(1)); @@ -9136,7 +9143,7 @@ std::set DynamicPrintConfig::value_changed(const t_co something_changed = true; } } - if (opt_key == "first_layer_extrusion_width") { + if (opt_key == "first_layer_extrusion_width") { //here spacing_option = this->option("first_layer_extrusion_spacing"); if (width_option) { width_option->set_phony(false); diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 18e2d7494dc..f976b580046 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -868,7 +868,7 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionPercent, fill_density)) ((ConfigOptionEnum, fill_pattern)) ((ConfigOptionPercent, first_layer_flow_ratio)) - ((ConfigOptionFloatOrPercent, first_layer_extrusion_width)) + ((ConfigOptionFloatOrPercent, first_layer_extrusion_width))//here? ((ConfigOptionFloatOrPercent, first_layer_extrusion_spacing)) ((ConfigOptionEnum, fuzzy_skin)) ((ConfigOptionFloatOrPercent, fuzzy_skin_thickness)) diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index 80467627ba8..b3b1edc9b97 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -862,6 +862,7 @@ FillLightning::GeneratorPtr PrintObject::prepare_lightning_infill_data() || opt_key == "external_perimeters_nothole" || opt_key == "external_perimeter_extrusion_change_odd_layers" || opt_key == "external_perimeters_vase" + || opt_key == "first_layer_extrusion_width" || opt_key == "perimeter_loop" || opt_key == "perimeter_loop_seam") { steps.emplace_back(posPerimeters); @@ -1069,7 +1070,7 @@ FillLightning::GeneratorPtr PrintObject::prepare_lightning_infill_data() steps.emplace_back(posPerimeters); steps.emplace_back(posPrepareInfill); } else if ( - opt_key == "external_perimeter_extrusion_width" + opt_key == "external_perimeter_extrusion_width" || opt_key == "external_perimeter_extrusion_spacing" || opt_key == "perimeter_extruder" || opt_key == "fuzzy_skin" @@ -1103,6 +1104,8 @@ FillLightning::GeneratorPtr PrintObject::prepare_lightning_infill_data() || opt_key == "external_perimeter_cut_corners" || opt_key == "first_layer_acceleration" || opt_key == "first_layer_acceleration_over_raft" + || opt_key == "first_layer_extrusion_width" + || opt_key == "first_layer_extrusion_spacing"//missing from here ? || opt_key == "first_layer_flow_ratio" || opt_key == "first_layer_infill_speed" || opt_key == "first_layer_min_speed" diff --git a/src/libslic3r/PrintRegion.cpp b/src/libslic3r/PrintRegion.cpp index 03fd40de5f8..6a213a07bfe 100644 --- a/src/libslic3r/PrintRegion.cpp +++ b/src/libslic3r/PrintRegion.cpp @@ -79,9 +79,14 @@ Flow PrintRegion::flow(const PrintObject &object, FlowRole role, double layer_he } else { throw Slic3r::InvalidArgument("Unknown role"); } - if (first_layer && object.config().first_layer_extrusion_width.value > 0) { + /*if (first_layer && object.config().first_layer_extrusion_width.value > 0) { config_width = object.config().first_layer_extrusion_width; config_spacing = object.config().first_layer_extrusion_spacing; + }*/ + + if (first_layer && m_config.first_layer_extrusion_width.value > 0) { + config_width = m_config.first_layer_extrusion_width; + config_spacing = m_config.first_layer_extrusion_spacing; } if (config_width.value == 0) { diff --git a/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp b/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp index adbe469cc36..9810cc8a628 100644 --- a/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp +++ b/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp @@ -17,6 +17,10 @@ #include #pragma optimize("", off) + +#undef NDEBUG +#include + #if ENABLE_SCROLLABLE static wxSize get_screen_size(wxWindow* window) { @@ -36,9 +40,9 @@ namespace GUI { //BUG: if first/base layer height are both .02 numbers don't show up when sliced. doesn't happen with windows, it did for linux ? //BUG: first_layer_height and base_layer_height both the same wil mess with numbers scale in z ? //TODO: does marlin/reprap need other values for this? - - -/* +//improvement if users have milti toolheads/swapping create a custom command for setting PA, add in welcome page for them to add this custom command for PA into filament notes-custom variables +// since they will most likely have a klipper macro for chaning toolheads/doing other stuff. +//BUG: some localization issues results in broken PA calculations since ',' and '.' get swapped. this is because of manual text entry as strings. FlowRole string_to_flow_role(const std::string& role_str) { static std::unordered_map role_map = { {"InternalInfill", FlowRole::frInfill}, @@ -58,7 +62,28 @@ FlowRole string_to_flow_role(const std::string& role_str) { }; return role_map[role_str]; -}*/ +} + +ExtrusionRole string_to_er_role(const std::string& role_str) { + static std::unordered_map role_map = { + {"InternalInfill", ExtrusionRole::erInternalInfill}, + {"BridgeInfill", ExtrusionRole::erBridgeInfill}, + {"ExternalPerimeter", ExtrusionRole::erExternalPerimeter}, + {"GapFill", ExtrusionRole::erGapFill}, + {"InternalBridgeInfill", ExtrusionRole::erInternalBridgeInfill}, + {"Ironing", ExtrusionRole::erIroning}, + {"OverhangPerimeter", ExtrusionRole::erOverhangPerimeter}, + {"Perimeter", ExtrusionRole::erPerimeter}, + {"SolidInfill", ExtrusionRole::erSolidInfill}, + {"SupportMaterial", ExtrusionRole::erSupportMaterial}, + {"SupportMaterialInterface", ExtrusionRole::erSupportMaterialInterface}, + {"ThinWall", ExtrusionRole::erThinWall}, + {"TopSolidInfill", ExtrusionRole::erTopSolidInfill}, + {"FirstLayer", ExtrusionRole::erCustom} + }; + + return role_map[role_str]; +} void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { @@ -86,10 +111,10 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { //{"GapFill", "placeholder"},//special calc required //{"InternalBridgeInfill", "placeholder"},//special calc required, TODO:find out where/how this is calculated //{"Ironing", "top_infill_extrusion_width"},//not fully suported - {"OverhangPerimeter", "overhangs_width"}, + {"OverhangPerimeter", "overhangs_width"},//special calc required, TODO:find out where/how this is calculated 'overhangs_width' is not the same width config as others, it considers this value when calculating flow {"Perimeter", "perimeter_extrusion_width"}, {"SolidInfill", "solid_infill_extrusion_width"}, - {"SupportMaterial", "support_material_extrusion_width"}, + {"SupportMaterial", "support_material_extrusion_width"},// support material layer_height can go up/down depending on config. {"SupportMaterialInterface", "support_material_extrusion_width"},//SupportMaterialInterface and SupportMaterialInterface shares same width calculations? {"ThinWall", "external_perimeter_extrusion_width"},//not fully suported {"TopSolidInfill", "top_infill_extrusion_width"}, @@ -109,7 +134,7 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { {"SolidInfill", "solid_infill_acceleration"}, {"SupportMaterial", "support_material_acceleration"}, {"SupportMaterialInterface", "support_material_interface_acceleration"}, - {"ThinWall", "top_solid_infill_acceleration"}, + {"ThinWall", "thin_walls_acceleration"}, {"TopSolidInfill", "top_solid_infill_acceleration"}, {"FirstLayer", "first_layer_acceleration"} }; @@ -184,9 +209,10 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { double first_layer_height = full_print_config.get_computed_value("first_layer_height"); double first_layer_width = full_print_config.get_abs_value("first_layer_extrusion_width", nozzle_diameter); - double first_layer_extrusion_spacing = full_print_config.get_abs_value("first_layer_extrusion_spacing", nozzle_diameter); + double first_layer_spacing = full_print_config.get_abs_value("first_layer_extrusion_spacing", nozzle_diameter); double first_layer_flow_ratio = full_print_config.get_computed_value("first_layer_flow_ratio"); double first_layer_size_compensation = full_print_config.get_computed_value("first_layer_size_compensation"); + double infill_every_layers = full_print_config.get_computed_value("infill_every_layers"); double base_layer_height = full_print_config.get_computed_value("layer_height"); double er_width = full_print_config.get_abs_value("solid_infill_extrusion_width", nozzle_diameter); @@ -201,17 +227,28 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { double spacing_ratio = full_print_config.get_computed_value("perimeter_overlap"); double spacing_ratio_external = full_print_config.get_computed_value("external_perimeter_overlap"); double filament_max_overlap = full_print_config.get_computed_value("filament_max_overlap",0);//maybe check for extruderID ? - Flow first_layer_flow = Flow::new_from_config(FlowRole::frPerimeter, *print_config, nozzle_diameter, first_layer_height, 1.f, true); + double combined_layer_height = infill_every_layers * base_layer_height; + bool infill_dense = full_print_config.get_bool("infill_dense"); + if (combined_layer_height > nozzle_diameter){ + combined_layer_height = nozzle_diameter; + } + Flow first_layer_flow = Flow::new_from_config(FlowRole::frPerimeter, *print_config, nozzle_diameter, first_layer_height, 1.f, true); + Flow base_flow = Flow::new_from_config(FlowRole::frExternalPerimeter, *print_config, nozzle_diameter, base_layer_height, filament_max_overlap, false);// used for switch statement, not fully coded yet. + double default_first_layer_width = first_layer_flow.width(); + double default_first_layer_spacing = first_layer_flow.spacing(); bool defaults_broken = false; if(default_er_width == 0 || default_er_spacing == 0){//if their default value config is broken fix it :) - //Flow broken_config_flow = Flow::new_from_config(FlowRole::frExternalPerimeter, *print_config, nozzle_diameter, first_layer_height, spacing_ratio_external, false); - //broken_config_flow.spacing() broken_config_flow.width(); + Flow broken_config_flow = Flow::new_from_config(FlowRole::frExternalPerimeter, *print_config, nozzle_diameter, base_layer_height, spacing_ratio_external, false); + //default_er_width = broken_config_flow.width() + //default_er_spacing = broken_config_flow.spacing();// might work? or is it better to use nozzle diameter if config is broken? + default_er_width = nozzle_diameter; default_er_spacing = default_er_width - base_layer_height * float(1. - 0.25 * PI) * spacing_ratio_external; //rounded_rectangle_extrusion_spacing defaults_broken = true; } + //what if defaults broken/not set for speed/accell too?? // --- translate --- @@ -248,8 +285,30 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { std::string bend_90_nozzle_size_3mf = "90_bend_" + nozzle_diameter_str + ".3mf"; std::string extrusion_role = dynamicExtrusionRole[0]->GetValue().ToStdString(); + double initial_model_height = 0.2; + //models is created per nozzles size 0.1-2mm walls are nozzle_size*4 thick + //exported origin point is center of the model in xyz + double initial_90_bend_x = 42.00; //size in x= 42.0 mm, model half x=21.0 + double initial_90_bend_y = 21.0; //size in y= 21.0 mm, model half y=10.5 + double initial_number_x = 2.0; //size in x= 2.0 mm , model half x=1.0 + double initial_number_y = 4.0; //size in y= 4.0 mm , model half y=2.0 + double initial_border_x = 1.6; //size in x= 1.6 mm , model half x=0.8 + double initial_border_y = 21.0; //size in y= 21.0 mm, model half y=10.5 + double initial_point_xy = 0.60; //size in xy= 0.6mm , model half xy=0.3 'point' model origin is bottom right offset x=0.7 y= -1.7(center of model +x1,y2 for bottom right edges) + double x_offset_90_bend = 1.2; //apex of 90° bend is offset from origin + + + int count_numbers = 0; + int count_borders = 0; + std::vector bend_90_positions; + std::vector number_positions; for (int id_item = 0; id_item < currentTestCount; id_item++) { + + count_numbers = 0; + count_borders = 0; + bend_90_positions.clear(); + number_positions.clear(); auto pa_result = calc_PA_values(id_item); std::vector pa_values = pa_result.first; @@ -257,7 +316,6 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { extrusion_role = dynamicExtrusionRole[id_item]->GetValue().ToStdString(); /* - double first_pa = wxAtof(firstPaValue); */ @@ -271,37 +329,69 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { } else{ - /*for (const std::string& role_str : choice_extrusion_role) { - FlowRole extrusion_role = string_to_flow_role(role_str); + bool enable_switch = false; + if(enable_switch == true){//still needs work :) + for (const std::string& role_str : choice_extrusion_role) { + ExtrusionRole extrusion_role = string_to_er_role(role_str); + FlowRole flow_role = string_to_flow_role(role_str); + double modified_layer_height = base_layer_height; + if (infill_every_layers > 1 && role_str == "InternalInfill" && infill_dense == false){ + modified_layer_height = combined_layer_height; + } + else if (role_str == "SupportMaterial"){//this one might be tricky to do, since supports layerheight can go up/down based on config. maybe load 3 90_bend models for supports with low,high, middle layer heights + modified_layer_height = 0.2; + } switch (extrusion_role) { - case FlowRole::frExternalPerimeter: - base_flow = Flow::new_from_config(extrusion_role, *print_config, nozzle_diameter, base_layer_height, filament_max_overlap, false); + case ExtrusionRole::erInternalInfill: + base_flow = Flow::new_from_config(flow_role, *print_config, nozzle_diameter, base_layer_height, filament_max_overlap, false); + break; + case ExtrusionRole::erBridgeInfill: + //base_flow = Flow::new_from_config(flow_role, *print_config, nozzle_diameter, base_layer_height, filament_max_overlap, false); + break; + case ExtrusionRole::erExternalPerimeter: + base_flow = Flow::new_from_config(flow_role, *print_config, nozzle_diameter, base_layer_height, filament_max_overlap, false); + break; + case ExtrusionRole::erGapFill: + //base_flow = Flow::new_from_config(flow_role, *print_config, nozzle_diameter, base_layer_height, filament_max_overlap, false); break; - case FlowRole::frPerimeter: - base_flow = Flow::new_from_config(extrusion_role, *print_config, nozzle_diameter, base_layer_height, filament_max_overlap, false); + case ExtrusionRole::erInternalBridgeInfill: + //base_flow = Flow::new_from_config(flow_role, *print_config, nozzle_diameter, base_layer_height, filament_max_overlap, false); break; - case FlowRole::frInfill: - base_flow = Flow::new_from_config(extrusion_role, *print_config, nozzle_diameter, base_layer_height, filament_max_overlap, false); + case ExtrusionRole::erIroning: + //base_flow = Flow::new_from_config(flow_role, *print_config, nozzle_diameter, base_layer_height, filament_max_overlap, false); break; - case FlowRole::frSolidInfill: - base_flow = Flow::new_from_config(extrusion_role, *print_config, nozzle_diameter, base_layer_height, filament_max_overlap, false); + case ExtrusionRole::erOverhangPerimeter: + //base_flow = Flow::new_from_config(flow_role, *print_config, nozzle_diameter, base_layer_height, filament_max_overlap, false); break; - case FlowRole::frTopSolidInfill: - base_flow = Flow::new_from_config(extrusion_role, *print_config, nozzle_diameter, base_layer_height, filament_max_overlap, false); + case ExtrusionRole::erPerimeter: + base_flow = Flow::new_from_config(flow_role, *print_config, nozzle_diameter, base_layer_height, filament_max_overlap, false); break; - case FlowRole::frSupportMaterial: - base_flow = Flow::new_from_config(extrusion_role, *print_config, nozzle_diameter, base_layer_height, filament_max_overlap, false); + case ExtrusionRole::erSolidInfill: + base_flow = Flow::new_from_config(flow_role, *print_config, nozzle_diameter, base_layer_height, filament_max_overlap, false); break; - case FlowRole::frSupportMaterialInterface: - base_flow = Flow::new_from_config(extrusion_role, *print_config, nozzle_diameter, base_layer_height, filament_max_overlap, false); + case ExtrusionRole::erSupportMaterial: + base_flow = Flow::new_from_config(flow_role, *print_config, nozzle_diameter, base_layer_height, filament_max_overlap, false); + break; + case ExtrusionRole::erSupportMaterialInterface: + base_flow = Flow::new_from_config(flow_role, *print_config, nozzle_diameter, base_layer_height, filament_max_overlap, false); + break; + case ExtrusionRole::erThinWall: + //base_flow = Flow::new_from_config(flow_role, *print_config, nozzle_diameter, base_layer_height, filament_max_overlap, false); + break; + case ExtrusionRole::erTopSolidInfill: + base_flow = Flow::new_from_config(flow_role, *print_config, nozzle_diameter, base_layer_height, filament_max_overlap, false); + break; + case ExtrusionRole::erCustom://first_layer + base_flow = Flow::new_from_config(flow_role, *print_config, nozzle_diameter, first_layer_height, 1.f, true); break; default: base_flow = Flow::new_from_config(FlowRole::frExternalPerimeter, *print_config, nozzle_diameter, base_layer_height, filament_max_overlap, false);//unsupported roles. continue; } break; - }*/ + } + } for (int i = 0; i < sizeof(choice_extrusion_role) / sizeof(choice_extrusion_role[0]); i++) { @@ -312,20 +402,26 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { er_speed = full_print_config.get_computed_value(er_speed_ToOptionKey[extrusion_role].c_str()); er_accel = full_print_config.get_computed_value(er_accel_ToOptionKey[extrusion_role].c_str()); er_spacing = print_config->get_abs_value(er_spacing_ToOptionKey[extrusion_role].c_str(), nozzle_diameter); + first_layer_flow = Flow::new_from_config(FlowRole::frPerimeter, *print_config, nozzle_diameter, first_layer_height, 1.f, true); + first_layer_width = first_layer_flow.width(); + first_layer_spacing = first_layer_flow.spacing(); //potential BUG if any of the values are 0 everything else would fail, pull the default value too and assign that er_width = (er_width != 0) ? er_width : default_er_width; er_speed = (er_speed != 0) ? er_speed : default_er_speed; er_accel = (er_accel != 0) ? er_accel : default_er_accel; er_spacing = (er_spacing != 0) ? er_spacing : default_er_spacing; + first_layer_width = (first_layer_width != 0) ? first_layer_width : first_layer_flow.width(); + first_layer_spacing = (first_layer_spacing != 0) ? first_layer_spacing : first_layer_flow.spacing(); - - //TODO: create assert check to see if value is not 0? er_width = std::round((er_width * 100 / nozzle_diameter) * 100.0) / 100.0; + first_layer_width = std::round((first_layer_width * 100 / nozzle_diameter) * 100.0) / 100.0; } else { er_width = print_config->get_abs_value("solid_infill_extrusion_width", nozzle_diameter); //used for gapfill_width/bridges selection. TODO: add the bits for this here since gapfill/bridges need special calculations er_width = std::round((er_width * 100 / nozzle_diameter) * 100.0) / 100.0; + first_layer_width = default_first_layer_width; + first_layer_spacing = default_first_layer_spacing; //er_width = er_width * 100 / nozzle_diameter; //er_width = std::round(er_width * 100.0) / 100.0; @@ -341,33 +437,26 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { //-- magical scaling is done here :) //the 90_bend models need to be scaled correctly so there is no 'gapfill' since gapfill will effect results. double adjustment_factor = first_layer_flow.width() - first_layer_flow.spacing(); - double total_width_with_overlap = first_layer_flow.width() + 3 * first_layer_flow.spacing() + adjustment_factor; + double xyzScale = nozzle_diameter / 0.4; double er_width_to_scale = magical_scaling(nozzle_diameter, er_width, filament_max_overlap, spacing_ratio, spacing_ratio_external, base_layer_height, er_spacing); - double er_width_to_scale_first_layer = total_width_with_overlap; - //TODO: add assert checks on er_width_to_scale ? - //-- magical scaling + //double er_width_to_scale_first_layer = magical_scaling(nozzle_diameter, first_layer_width, filament_max_overlap, spacing_ratio, spacing_ratio_external, first_layer_height, first_layer_spacing);//prob not needed? + double er_width_to_scale_first_layer_border = first_layer_flow.width() + 3 * first_layer_flow.spacing() + adjustment_factor;//total_width_with_overlap - pressure_tower.emplace_back(); - - double initial_model_height = 0.2; - //models is created per nozzles size 0.1-2mm walls are nozzle_size*4 thick - //exported origin point is center of the model in xyz - double initial_90_bend_x = 42.00; //size in x= 42.0 mm, model half x=21.0 - double initial_90_bend_y = 21.0; //size in y= 21.0 mm, model half y=10.5 - double initial_number_x = 2.0; //size in x= 2.0 mm , model half x=1.0 - double initial_number_y = 4.0; //size in y= 4.0 mm , model half y=2.0 - double initial_border_x = 1.6; //size in x= 1.6 mm , model half x=0.8 - double initial_border_y = 21.0; //size in y= 21.0 mm, model half y=10.5 - double initial_point_xy = 0.60; //size in xy= 0.6mm , model half xy=0.3 'point' model origin is bottom right offset x=0.7 y= -1.7(center of model +x1,y2 for bottom right edges) - double x_offset_90_bend = 1.2; //apex of 90° bend is offset from origin + if (infill_every_layers > 1 && extrusion_role == "InternalInfill" && infill_dense == false){ + er_width_to_scale = magical_scaling(nozzle_diameter, er_width, filament_max_overlap, spacing_ratio, spacing_ratio_external, combined_layer_height, er_spacing); + } + //-- magical scaling + pressure_tower.emplace_back(); double z_scaled_model_height = initial_model_height * (first_layer_height / initial_model_height); //mm double xy_scaled_90_bend_x = initial_90_bend_x * er_width_to_scale; // mm double xy_scaled_90_bend_y = initial_90_bend_y * er_width_to_scale; // mm - double xy_scaled_border_x = er_width_to_scale_first_layer; // mm - double xy_scaled_border_y = er_width_to_scale_first_layer; // mm + //double first_layer_xy_scaled_90_bend_x = initial_90_bend_x * er_width_to_scale_first_layer; // mm for 90_bend width scaled for first_layer prob not needed? + //double first_layer_xy_scaled_90_bend_y = initial_90_bend_y * er_width_to_scale_first_layer; // mm for 90_bend width scaled for first_layer prob not needed? + double xy_scaled_border_x = er_width_to_scale_first_layer_border; // mm + double xy_scaled_border_y = er_width_to_scale_first_layer_border; // mm double xy_scaled_number_x = initial_number_x * xyzScale * er_width_to_scale; // mm double xy_scaled_number_y = initial_number_y * xyzScale * er_width_to_scale; // mm double xy_scaled_point_xy = initial_point_xy * xyzScale * er_width_to_scale; // mm @@ -379,11 +468,6 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { double z_90_bend_pos = (first_layer_height + (base_layer_height * 4)) / 2; double z_scale_others = first_layer_height / initial_model_height; double z_others_pos = first_layer_height / 2; - - - - std::vector bend_90_positions; - std::vector number_positions; std::set added_roles; for (int nb_90_bends = 0; nb_90_bends < count_increments; nb_90_bends++) { @@ -392,7 +476,7 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { bool role_found = false; if (extrusion_role == "Verify") { - y_offset = 2.0 /* * nozzle_diameter*/; + y_offset = 10.0 /* * nozzle_diameter*/; for (size_t i = 0; i < sizeof(choice_extrusion_role) / sizeof(choice_extrusion_role[0]); i++) { er_role = choice_extrusion_role[i]; if (er_width_ToOptionKey.find(er_role) != er_width_ToOptionKey.end() && added_roles.find(er_role) == added_roles.end()) { @@ -421,6 +505,12 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { er_width = std::round((er_width * 100 / nozzle_diameter) * 100.0) / 100.0; er_width_to_scale = magical_scaling(nozzle_diameter, er_width, filament_max_overlap, spacing_ratio, spacing_ratio_external, base_layer_height, er_spacing); + if (infill_every_layers > 1 && extrusion_role == "InternalInfill" && infill_dense == false){ + er_width_to_scale = magical_scaling(nozzle_diameter, er_width, filament_max_overlap, spacing_ratio, spacing_ratio_external, combined_layer_height, er_spacing); + z_90_bend_pos = (first_layer_height + (combined_layer_height * 5)) / 2; + z_scale_90_bend = (first_layer_height + (combined_layer_height * 5)) / initial_model_height;//force constant 6 layer height for model even if combing layers, needed for infill selected role + } + add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "scaled_with_nozzle_size" / bend_90_nozzle_size_3mf).string(), Vec3d{ x_offset_90_bend, bend_90_y_pos , z_90_bend_pos }, @@ -433,8 +523,19 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { //thickness_offset = ((er_width / 100) * nozzle_diameter) * 4 + (nozzle_diameter * 2);// pretty tight gap //thickness_offset = ((er_width / 100) * nozzle_diameter) * 4 + (nozzle_diameter * 2.5); thickness_offset = ((er_width / 100) * nozzle_diameter) * 4 + (nozzle_diameter * 4);// larger gap + + //thickness_offset = ((er_width / 100.0) * nozzle_diameter * xy_scaled_90_bend_y * 4) + (nozzle_diameter * 4); + //double scaled_thickness_offset = ((xy_scaled_90_bend_x - initial_90_bend_x) + (xy_scaled_90_bend_y - initial_90_bend_y)); + //double real_offset = thickness_offset + scaled_thickness_offset; + + /*thickness_offset = ((er_width / 100.0) * nozzle_diameter * 4) + (nozzle_diameter * 4); + + double scaled_thickness_offset = thickness_offset * (((xy_scaled_90_bend_x / initial_90_bend_x) + (xy_scaled_90_bend_y / initial_90_bend_y)) / 2.0 - 1); + double real_offset = thickness_offset + scaled_thickness_offset;*/ + bend_90_positions.push_back(modelPosition); bend_90_y_pos = modelPosition.y() + thickness_offset; + //bend_90_y_pos = modelPosition.y() + real_offset; } @@ -459,9 +560,12 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { number_pos_mid = number_positions[j]; } number_pos_last = number_positions[j]; + count_numbers++; } } + //TOFIX: on odd/uneven PA_values array results in the boreders being a little too short. this is mainly because i force load in the final end_pa value, cascades into loading extra 90_bend model. + double numbers_total_width = (number_pos_last.x() + (xy_scaled_number_x / 2)) - (number_pos_first.x() - (xy_scaled_number_x / 2));// scaled to include gap between end of 90_bend and first number,perfection double total_height = (bend_pos_last.y() + (xy_scaled_90_bend_y / 2)) - (bend_pos_first.y() - (xy_scaled_90_bend_y / 2)); double scalred_r_border_x_mm = numbers_total_width + (nozzle_diameter * 2); @@ -485,27 +589,27 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border.3mf").string(), Vec3d{ left_border_x_pos , bend_pos_mid.y(), z_others_pos }, - /*scale*/Vec3d{ scaled_l_border_x_percentage, scaled_lr_border_y_percentage, z_scale_others }, false); //Left border + /*scale*/Vec3d{ scaled_l_border_x_percentage, scaled_lr_border_y_percentage, z_scale_others }, false);count_borders++; //Left border add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border.3mf").string(), Vec3d{ right_border_x_pos , bend_pos_mid.y(), z_others_pos }, - /*scale*/Vec3d{ scaled_r_border_x_percentage , scaled_lr_border_y_percentage , z_scale_others}, false); //right border + /*scale*/Vec3d{ scaled_r_border_x_percentage , scaled_lr_border_y_percentage , z_scale_others}, false);count_borders++; //right border add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border.3mf").string(),//on odd number of count_increments the bottom border is not joined to the side borders. fixing this bug will require Vec3d{ tb_border_x_pos , bend_pos_first.y() - (xy_scaled_90_bend_y / 2) - (xy_scaled_border_y / 2) - nozzle_diameter, z_others_pos }, // adding more if/else statements to add the extra offset and apply this to all other calculations for the border scale and position. - /*scale*/Vec3d{ scaled_tb_border_x_percentage , scaled_tb_border_y_percentage, z_scale_others }, false); //bottom border + /*scale*/Vec3d{ scaled_tb_border_x_percentage , scaled_tb_border_y_percentage, z_scale_others }, false);count_borders++; //bottom border //---------- add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border.3mf").string(), Vec3d{ tb_border_x_pos , bend_pos_last.y() + (xy_scaled_90_bend_y / 2) + (xy_scaled_border_y / 2) + nozzle_diameter, z_others_pos }, - /*scale*/Vec3d{ scaled_tb_border_x_percentage, scaled_tb_border_y_percentage, z_scale_others}, false); //top border + /*scale*/Vec3d{ scaled_tb_border_x_percentage, scaled_tb_border_y_percentage, z_scale_others}, false);count_borders++; //top border // scale model in percentage from original models xy values! - if (id_item < 10){ //will break if max test count goes higher. + if (id_item < 10){ //will break if max test count goes higher. ie currentTestCount add_part(model.objects[objs_idx[id_item]],(boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / (std::to_string(id_item) + std::string(".3mf"))).string(), Vec3d{ number_pos_mid.x(), bend_pos_first.y() - (xy_scaled_90_bend_y / 2) + (xy_scaled_number_y / 2), z_scaled_model_height }, - /*scale*/Vec3d{ xyzScale * er_width_to_scale, xyzScale * er_width_to_scale, z_scale_others * 2 }, false); // currentTestCount identifer + /*scale*/Vec3d{ xyzScale * er_width_to_scale, xyzScale * er_width_to_scale, z_scale_others * 2 }, false);count_borders++; // currentTestCount identifer } } @@ -530,13 +634,13 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { if (pa_values_string[j] == '.') { add_part(model.objects[objs_idx[id_item]],(boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "point.3mf").string(), Vec3d{ xpos - (xy_scaled_number_x / 2), ypos /* - xy_scaled_point_xy - xyzScale*/, z_scaled_model_height },// point gets moved to wrong position on all nozzle_sizes, guessing it's exported offset position doesn't get scaled with the model. - /*scale*/Vec3d{ xyzScale * er_width_to_scale, xyzScale + (xyzScale / 2), z_scale_others * 2 }, false); + /*scale*/Vec3d{ xyzScale * er_width_to_scale, xyzScale + (xyzScale / 2), z_scale_others * 2 }, false);; xpos -= (xy_scaled_number_x / 2); } else if (std::isdigit(pa_values_string[j])) { add_part(model.objects[objs_idx[id_item]],(boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / (pa_values_string[j] + std::string(".3mf"))).string(), Vec3d{ xpos, ypos, z_scaled_model_height },// might need to re size the numbers a touch. they get marked as "thin walls" - /*scale*/Vec3d{ xyzScale * er_width_to_scale, xyzScale * er_width_to_scale, z_scale_others * 2 }, false);//TOCHECK: if any numbers get gapfill + /*scale*/Vec3d{ xyzScale * er_width_to_scale, xyzScale * er_width_to_scale, z_scale_others * 2 }, false);;//TOCHECK: if any numbers get gapfill } Eigen::Vector3d modelPosition(xpos + (xy_scaled_number_x / 2) + nozzle_diameter + (xy_scaled_number_x / 2), ypos, z_scaled_model_height); @@ -558,6 +662,7 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { new_print_config.set_key_value("first_layer_size_compensation", new ConfigOptionFloat(0)); new_print_config.set_key_value("xy_inner_size_compensation", new ConfigOptionFloat(0)); new_print_config.set_key_value("xy_outer_size_compensation", new ConfigOptionFloat(0)); + new_print_config.set_key_value("print_custom_variables", new ConfigOptionString("calibration_print"));//created this as an extra check for when generating gcode to not include "feature_gcode" //assert(filament_temp_item_name.size() == nb_runs); @@ -574,7 +679,18 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { smooth_time = dynamicEnableST[id_item]->GetValue(); extrusion_role = dynamicExtrusionRole[id_item]->GetValue().ToStdString(); + if (extrusion_role == "Verify") {// have to keep it in range + count_increments = sizeof(choice_extrusion_role) / sizeof(choice_extrusion_role[0]); + } + + auto last_90_bend_scale = model.objects[objs_idx[id_item]]->volumes[count_increments]->get_scaling_factor(); + Eigen::Vector3d bend_90_mesh = model.objects[objs_idx[id_item]]->volumes[count_increments]->mesh().size(); + double model_height = bend_90_mesh.z() * last_90_bend_scale.z(); + std::string set_first_layer_prefix = (gcfKlipper == flavor) ? "SET_PRESSURE_ADVANCE ADVANCE=" : + (gcfMarlinFirmware == flavor) ? "M900 K" : + (gcfRepRap == flavor) ? "M572 S" : ""; + std::string region_prefix = "{if layer_z <= " + std::to_string(first_layer_height) + "}" + set_first_layer_prefix + std::to_string(first_pa) + "; first layer [layer_z] {endif}"; /* gcfRepRap, @@ -603,11 +719,41 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { model.objects[objs_idx[id_item]]->config.set_key_value("min_width_top_surface", new ConfigOptionFloatOrPercent(0.0,false)); model.objects[objs_idx[id_item]]->config.set_key_value("only_one_perimeter_top", new ConfigOptionBool(false)); model.objects[objs_idx[id_item]]->config.set_key_value("only_one_perimeter_first_layer", new ConfigOptionBool(false));//, if borderers - right are scaled correctly there shouldn't be any gap fill in them. it would be nice to keep the *4 extrusion lines for the borders only. - // can this be applied to the right border only ? model.objects[objs_idx[id_item]]->config.set_key_value("perimeter_overlap", new ConfigOptionPercent(100)); model.objects[objs_idx[id_item]]->config.set_key_value("seam_position", new ConfigOptionEnum(spRear)); //spRear or spCost //BUG: should be fixed in 2.7 merge/SS 2.5.59.7, when this is changed the "perimeters & shell" doesn't turn red indicating a change. model.objects[objs_idx[id_item]]->config.set_key_value("top_solid_layers", new ConfigOptionInt(0)); + model.objects[objs_idx[id_item]]->config.set_key_value("region_gcode", new ConfigOptionString(region_prefix + " \n" )); + + int style = 2; + if (extrusion_role != "Verify") {//don't apply layer ranges to the main object for verify mode. + if(style == 1){//BUG:using this one "works" untill you clear the plate, and it gets stuck in a infinite loop trying to delete nodes, see line 781 of objectDataViewModel.cpp + + if (infill_every_layers > 1 && extrusion_role == "InternalInfill" && infill_dense == false) { + ModelConfig range_conf; + + range_conf.set_key_value("layer_height", new ConfigOptionFloatOrPercent(combined_layer_height, false)); + model.objects[objs_idx[id_item]]->layer_config_ranges[std::pair(first_layer_height, 8)] = range_conf; + + wxGetApp().obj_list()->layers_editing(); + } + } + if(style == 2){ + if (infill_every_layers > 1 && extrusion_role == "InternalInfill" && infill_dense == false) { + wxGetApp().obj_list()->layers_editing(id_item);//could prob use this same thing for the unsupported roles since they need a different layer_height/width + auto existing_range = model.objects[objs_idx[id_item]]->layer_config_ranges.find(std::pair(0.0f, 2.0f));// Find the default existing range {0.0f, 2.0f} + + if (existing_range != model.objects[objs_idx[id_item]]->layer_config_ranges.end()) { + ModelConfig new_range_conf = existing_range->second; + + new_range_conf.set_key_value("layer_height", new ConfigOptionFloatOrPercent(combined_layer_height, false)); + model.objects[objs_idx[id_item]]->layer_config_ranges.erase(existing_range); + model.objects[objs_idx[id_item]]->layer_config_ranges[std::pair(first_layer_height, model_height + first_layer_height)] = new_range_conf; + } + } + + } + } size_t num_part = 0; const int extra_vol = 1; std::set added_roles; @@ -617,7 +763,7 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { bool role_found = false; if (extrusion_role == "Verify") { for (size_t i = 0; i < sizeof(choice_extrusion_role) / sizeof(choice_extrusion_role[0]); i++) { - er_role = choice_extrusion_role[i]; + er_role = choice_extrusion_role[num_part]; if (er_width_ToOptionKey.find(er_role) != er_width_ToOptionKey.end() && added_roles.find(er_role) == added_roles.end()) { //er_role = er_role; added_roles.insert(er_role); @@ -649,7 +795,6 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { er_accel = default_er_accel; er_spacing = default_er_spacing; - //er_width = print_config->get_abs_value(er_width_ToOptionKey[er_role].c_str(), nozzle_diameter); er_speed = full_print_config.get_computed_value(er_speed_ToOptionKey[er_role].c_str(), nozzle_diameter); er_accel = full_print_config.get_computed_value(er_accel_ToOptionKey[er_role].c_str(), nozzle_diameter); @@ -664,27 +809,43 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { } er_width = std::round((er_width * 100 / nozzle_diameter) * 100.0) / 100.0; - std::string set_advance_prefix =""; - if (gcfKlipper == flavor) { - if(smooth_time == false){ - set_advance_prefix = "SET_PRESSURE_ADVANCE ADVANCE="; - } - else{ - set_advance_prefix = "SET_PRESSURE_ADVANCE SMOOTH_TIME="; - } - } - else if (gcfMarlinFirmware == flavor) { - set_advance_prefix = "M900 K"; - } - else if(gcfRepRap == flavor){ - set_advance_prefix = "M572 S"; + double er_width_to_scale = magical_scaling(nozzle_diameter, er_width, filament_max_overlap, spacing_ratio, spacing_ratio_external, base_layer_height, er_spacing); + if (infill_every_layers > 1 && extrusion_role == "InternalInfill" && infill_dense == false) { + er_width_to_scale = magical_scaling(nozzle_diameter, er_width, filament_max_overlap, spacing_ratio, spacing_ratio_external, combined_layer_height, er_spacing); } + + double er_width_to_scale_first_layer_match_base2 = magical_scaling(nozzle_diameter, er_width, filament_max_overlap, spacing_ratio, spacing_ratio_external, first_layer_height, first_layer_spacing); + + double xy_scaled_90_bend_x = initial_90_bend_x * er_width_to_scale; // mm + double xy_scaled_90_bend_y = initial_90_bend_y * er_width_to_scale; // mm + double first_layer_xy_scaled_90_bend_x_match = initial_90_bend_x * er_width_to_scale_first_layer_match_base2; // mm for 90_bend width scaled for first_layer to match er role width + double first_layer_xy_scaled_90_bend_y_match = initial_90_bend_y * er_width_to_scale_first_layer_match_base2; // mm for 90_bend width scaled for first_layer to match er role width + + + + /*double size_diff_x = xy_scaled_90_bend_x - first_layer_xy_scaled_90_bend_x_match; + double size_diff_y = xy_scaled_90_bend_y - first_layer_xy_scaled_90_bend_y_match; + double scaling_factor_x = size_diff_x / xy_scaled_90_bend_x; + double scaling_factor_y = size_diff_y / xy_scaled_90_bend_y; + + double adjusted_first_layer_width_x2 = er_width * (1 + scaling_factor_x); + double adjusted_first_layer_width_y2 = er_width * (1 + scaling_factor_y);*/ //check if below is good before deleteing + + + double adjusted_first_layer_width_x = er_width * (1 + (xy_scaled_90_bend_x - first_layer_xy_scaled_90_bend_x_match) / xy_scaled_90_bend_x); + double adjusted_first_layer_width_y = er_width * (1 + (xy_scaled_90_bend_y - first_layer_xy_scaled_90_bend_y_match) / xy_scaled_90_bend_y); + double adjusted_first_average = (adjusted_first_layer_width_x + adjusted_first_layer_width_y) / 2; + + std::string set_advance_prefix = + (gcfKlipper == flavor) ? (smooth_time ? "SET_PRESSURE_ADVANCE SMOOTH_TIME=" : "SET_PRESSURE_ADVANCE ADVANCE=") : + (gcfMarlinFirmware == flavor) ? "M900 K" : + (gcfRepRap == flavor) ? "M572 S" : ""; + + /// --- custom config --- // config for the 90_bend model - - model.objects[objs_idx[id_item]]->volumes[num_part + extra_vol]->config.set_key_value("first_layer_extrusion_width", new ConfigOptionFloatOrPercent(er_width, true));// need to adjust this to remove the first_layer gap fill for 90 bend models. - model.objects[objs_idx[id_item]]->volumes[num_part + extra_vol]->config.set_key_value("first_layer_extrusion_spacing", new ConfigOptionFloatOrPercent(er_spacing, false));// ^^ not getting applied to model on slicing + model.objects[objs_idx[id_item]]->volumes[num_part + extra_vol]->config.set_key_value("first_layer_extrusion_width", new ConfigOptionFloatOrPercent(adjusted_first_average, true));//TODO: check if this is now perfect model.objects[objs_idx[id_item]]->volumes[num_part + extra_vol]->config.set_key_value("perimeter_extrusion_width", new ConfigOptionFloatOrPercent(er_width, true)); model.objects[objs_idx[id_item]]->volumes[num_part + extra_vol]->config.set_key_value("external_perimeter_extrusion_width", new ConfigOptionFloatOrPercent(er_width, true));//TODO: check widths and ect breaks if any values are in mm/percentage model.objects[objs_idx[id_item]]->volumes[num_part + extra_vol]->config.set_key_value("perimeter_speed", new ConfigOptionFloatOrPercent(er_speed, false)); @@ -696,17 +857,76 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { if (extrusion_role == "Verify") { model.objects[objs_idx[id_item]]->volumes[num_part + extra_vol]->config.set_key_value("region_gcode", new ConfigOptionString(set_advance_prefix + " ; " + er_role ));//user manual type in values - //new_printer_config.set_key_value("before_layer_gcode", new ConfigOptionString(std::string("{if layer_num == 0} ") + set_advance_prefix + std::to_string(first_pa) + " {endif}")); + //will need to adjust layerheight for infill,support, other er roles that needs a different layerheight for verify mode. + + /*ModelConfig range_conf; + range_conf.set_key_value("layer_height", new ConfigOptionFloatOrPercent(combined_layer_height, false)); + model.objects[objs_idx[id_item]]->volumes[num_part + extra_vol]->layer_config_ranges[std::pair(first_layer_height, 8)] = range_conf; + + wxGetApp().obj_list()->layers_editing(); + auto list = wxGetApp().obj_list();*/ + + /*if (infill_every_layers > 1 && extrusion_role == "InternalInfill" && infill_dense == false) { + + wxGetApp().obj_list()->layers_editing(id_item);//could prob use this same thing for the unsupported roles since they need a different layer_height + auto existing_range = model.objects[objs_idx[id_item]]->volumes[num_part + extra_vol]->layer_config_ranges.find(std::pair(0.0f, 2.0f));// Find the default existing range {0.0f, 2.0f} + + if (existing_range != model.objects[objs_idx[id_item]]->volumes[num_part + extra_vol]->layer_config_ranges.end()) { + ModelConfig new_range_conf = existing_range->second; + + new_range_conf.set_key_value("layer_height", new ConfigOptionFloatOrPercent(combined_layer_height, false)); + model.objects[objs_idx[id_item]]->volumes[num_part + extra_vol]->layer_config_ranges.erase(existing_range); + model.objects[objs_idx[id_item]]->volumes[num_part + extra_vol]->layer_config_ranges[std::pair(first_layer_height, model_height + first_layer_height)] = new_range_conf; + } + } + else if (extrusion_role == supports /ect){ + }*/ } - else{//add '\n' in? - model.objects[objs_idx[id_item]]->volumes[num_part + extra_vol]->config.set_key_value("region_gcode", new ConfigOptionString(set_advance_prefix + std::to_string(pa_values[num_part]) + " ; " + er_role )); - //new_printer_config.set_key_value("before_layer_gcode", new ConfigOptionString(std::string("{if layer_num == 0} ") + set_advance_prefix + std::to_string(first_pa) + " {endif}"));// TOFIX: if multi tests need to adjust this to add syntax for volumes. + else{ + model.objects[objs_idx[id_item]]->volumes[num_part + extra_vol]->config.set_key_value("region_gcode", new ConfigOptionString(set_advance_prefix + std::to_string(pa_values[num_part]) + " ; " + er_role + "\n")); } - new_printer_config.set_key_value("before_layer_gcode", new ConfigOptionString(std::string("{if layer_num == 1} ") + set_advance_prefix + std::to_string(first_pa) + " {endif}"));// TOFIX: if multi tests need to adjust this to add syntax for volumes so each test can have seperate first layer value. or to remove extra rows of "dynamicFirstPa"? num_part++; - //model.objects[objs_idx[id_item]]->ensure_on_bed(); // put at the correct z (kind of arrange-z)) + //model.objects[objs_idx[id_item]]->ensure_on_bed(); // put at the correct z (kind of arrange-z)) shouldn't be needed though. //model.objects[objs_idx[id_item]]->center_around_origin(); } + + + bool enable_region_gcode_for_numbers = false;// this still needa a bit of work, the first layer ends up getting messed up surfaces. might be a config thing? + // unless i need to change the numbers height and z position? + if (enable_region_gcode_for_numbers == true){ + std::string set_advance_prefix = (gcfKlipper == flavor) ? (smooth_time ? "SET_PRESSURE_ADVANCE SMOOTH_TIME=" : "SET_PRESSURE_ADVANCE ADVANCE=") : + (gcfMarlinFirmware == flavor) ? "M900 K" : + (gcfRepRap == flavor) ? "M572 S" : ""; + + int pa_index = 0; + int nb_number = 0; + + while (nb_number < number_positions.size()) { + + // Skip borders or out-of-bounds or odd pa_index + if ((nb_number >= count_numbers && nb_number < count_numbers + count_borders) || + num_part >= model.objects[objs_idx[id_item]]->volumes.size() || + pa_index % 2 == 1) { + if (pa_index % 2 == 1) pa_index++; // increment pa_index to match how numbers are loaded + else { + num_part++; + nb_number++; + } + continue; // Skip to the next iteration same way numbers get loaded. + } + + // Apply the PA value to the number set stays inline with 90_bend models + for (int number_set = 0; number_set < count_numbers; number_set++){ + model.objects[objs_idx[id_item]]->volumes[number_set + num_part + extra_vol]->config.set_key_value( + "region_gcode", + new ConfigOptionString(set_advance_prefix + std::to_string(pa_values[pa_index]) + " ; ")); + + nb_number++; + } + pa_index++; + num_part += count_numbers; + } + } } //update plater @@ -726,7 +946,7 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { obj->update_after_undo_redo(); // arrange if needed, after new settings, to take them into account - // BUG:(borders don't slice. with 2+ generated models.) after updating to 2.5.59.11 the generating 2+ models they have "sinking label" have to click "drop to bed" to resolve, clicking "arrange" doesn't fix issue. + // BUG:(borders don't slice. with 2+ generated models.) after updating to 2.5.59.11 the generating 2+ models they have "sinking label" have to click "drop to bed" to resolve, clicking "arrange" doesn't fix issue. -fixed if (has_to_arrange) { //update print config (done at reslice but we need it here) if (plat->printer_technology() == ptFFF) @@ -750,6 +970,7 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { double CalibrationPressureAdvDialog::magical_scaling(double nozzle_diameter, double er_width, double filament_max_overlap, double spacing_ratio, double spacing_ratio_external, double base_layer_height, double er_spacing) { + //assert(er_width > 1.0 && "er_width should be above 1.0 as it's a percentage value"); double xyzScale = nozzle_diameter / 0.4; double er_width_decimal = er_width * nozzle_diameter / 100.0;//models are generated to be default width of x4 lines for the walls ie; 0.4mm nozzle is 1.6mm thick walls + extra for ER role widths double er_width_to_scale = 1.0; @@ -827,9 +1048,20 @@ void CalibrationPressureAdvDialog::create_row_controls(wxBoxSizer* parent_sizer, const DynamicPrintConfig* printer_config = this->gui_app->get_tab(Preset::TYPE_PRINTER)->get_config(); GCodeFlavor flavor = printer_config->option>("gcode_flavor")->value; std::string prefix = (gcfMarlinFirmware == flavor) ? " LA " : ((gcfKlipper == flavor || gcfRepRap == flavor) ? " PA " : "unsupported firmware type"); - //improvements: pull retraction value and auto select a better suited start/end value. - // on new row creation auto select another ER role + //improvements: pull retraction value and auto select a better suited start/end value? // + int current_selection = 2;//start selection at ExternalPerimeter + + if (!dynamicExtrusionRole.empty()) {// If there's a previous selection, find the index of the last selected role + std::string last_selected_er_role = dynamicExtrusionRole[currentTestCount-1]->GetValue().ToStdString(); + for (int j = 0; j < sizeof(choices_extrusion_role) / sizeof(choices_extrusion_role[0]); j++) { + if (choices_extrusion_role[j] == wxString(last_selected_er_role)) { + current_selection = j + 1; + break; + } + } + } + current_selection = std::min(current_selection, static_cast(sizeof(choices_extrusion_role) / sizeof(choices_extrusion_role[0]) - 1)); for (int i = 0; i < row_count; i++) { wxBoxSizer* rowSizer = new wxBoxSizer(wxHORIZONTAL); @@ -869,14 +1101,19 @@ void CalibrationPressureAdvDialog::create_row_controls(wxBoxSizer* parent_sizer, dynamicPaIncrement.push_back(paIncrementCombo); rowSizer->AddSpacer(15); - - wxComboBox* erPaCombo = new wxComboBox(this, wxID_ANY, wxString{ choices_extrusion_role[2 + i] }, wxDefaultPosition, wxDefaultSize, 15, choices_extrusion_role, wxCB_READONLY);//disable user edit this one :) + wxComboBox* erPaCombo = new wxComboBox(this, wxID_ANY, wxString{ choices_extrusion_role[current_selection] }, wxDefaultPosition, wxDefaultSize, 15, choices_extrusion_role, wxCB_READONLY);//disable user edit this one :) rowSizer->Add(new wxStaticText(this, wxID_ANY, _L("Extrusion role: "))); erPaCombo->SetToolTip(_L("Select the extrusion role you want to generate a calibration for")); - erPaCombo->SetSelection(2+i);//improvement: pull the last rows value and go up/down from there + erPaCombo->SetSelection(current_selection); rowSizer->Add(erPaCombo); dynamicExtrusionRole.push_back(erPaCombo); + // Increment selection for the next row + current_selection++; + if (current_selection >= sizeof(choices_extrusion_role) / sizeof(choices_extrusion_role[0])) { + current_selection = 0; // Wrap around: SetSelection does it's own memory access checks so this shouldn't be needed. but it's a nice safe guard to have. + } + if (prefix == " PA ") {//klipper only feature ? rowSizer->AddSpacer(15); wxCheckBox* enableST = new wxCheckBox(this, wxID_ANY, _L(""), wxDefaultPosition, wxDefaultSize); diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 2e0ff17f978..068d16b2f44 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -2282,7 +2282,7 @@ void ObjectList::layers_editing() // set some default value if (ranges.empty()) { take_snapshot(_(L("Add Layers"))); - ranges[{ 0.0f, 2.0f }].assign_config(get_default_layer_config(obj_idx)); + ranges[{ 0.0f, 2.0f }].assign_config(get_default_layer_config(obj_idx));//defaults here } // create layer root item @@ -2300,6 +2300,39 @@ void ObjectList::layers_editing() Expand(layers_item); } +void ObjectList::layers_editing(int obj_idx) +{ + wxDataViewItem item = m_objects_model->GetItemById(obj_idx); + + if (!item) + return; + + const wxDataViewItem obj_item = m_objects_model->GetTopParent(item); + wxDataViewItem layers_item = m_objects_model->GetLayerRootItem(obj_item); + + if (!layers_item.IsOk()) + { + t_layer_config_ranges& ranges = object(obj_idx)->layer_config_ranges; + + if (ranges.empty()) { + take_snapshot(_(L("Add Layers"))); + ranges[{ 0.0f, 2.0f }].assign_config(get_default_layer_config(obj_idx)); + } + + layers_item = add_layer_root_item(obj_item); + } + + if (!layers_item.IsOk()) + return; + + wxGetApp().obj_layers()->reset_selection(); + wxGetApp().plater()->canvas3D()->handle_sidebar_focus_event("", false); + + select_item(layers_item); + Expand(layers_item); +} + + wxDataViewItem ObjectList::add_layer_root_item(const wxDataViewItem obj_item) { const int obj_idx = m_objects_model->GetIdByItem(obj_item); diff --git a/src/slic3r/GUI/GUI_ObjectList.hpp b/src/slic3r/GUI/GUI_ObjectList.hpp index 51d69eaee52..24dd084fb34 100644 --- a/src/slic3r/GUI/GUI_ObjectList.hpp +++ b/src/slic3r/GUI/GUI_ObjectList.hpp @@ -268,6 +268,7 @@ class ObjectList : public wxDataViewCtrl void split(); void merge(bool to_multipart_object); void layers_editing(); + void layers_editing(int obj_idx); wxDataViewItem add_layer_root_item(const wxDataViewItem obj_item); wxDataViewItem add_settings_item(wxDataViewItem parent_item, const DynamicPrintConfig* config); diff --git a/src/slic3r/GUI/ObjectDataViewModel.cpp b/src/slic3r/GUI/ObjectDataViewModel.cpp index 6c126a5aee3..c072c1aa774 100644 --- a/src/slic3r/GUI/ObjectDataViewModel.cpp +++ b/src/slic3r/GUI/ObjectDataViewModel.cpp @@ -778,10 +778,17 @@ wxDataViewItem ObjectDataViewModel::Delete(const wxDataViewItem &item) // Delete all sub-items int i = m_objects[id]->GetChildCount() - 1; while (i >= 0) { - Delete(wxDataViewItem(m_objects[id]->GetNthChild(i))); + Delete(wxDataViewItem(m_objects[id]->GetNthChild(i)));//gets stuck if 'layer_config_ranges' was called directly without it having the parent node. i = m_objects[id]->GetChildCount() - 1; } m_objects.erase(it); + + /*int i = m_objects[id]->GetChildCount() - 1; + while (i >= 0) { + Delete(wxDataViewItem(m_objects[id]->GetNthChild(i))); + --i; // Decrement manually after each delete + } + m_objects.erase(it);*/ } if (id > 0) { if(id == m_objects.size()) id--; From d5b114b748792f2ac79be80a5a5b9b0160cb4e57 Mon Sep 17 00:00:00 2001 From: legend069 <40685552+legend069@users.noreply.github.com> Date: Fri, 8 Nov 2024 15:06:40 +1100 Subject: [PATCH 28/28] calibration GUI support darkmode and 2.7 compile adjustments added darkmode support for the calibration windows (i still need to test the other calibration windows if they still work, and are clickable) added support for the support material layerheight i need to get the switch statement working to help with maintainability then do alot more refactoring 2.7 notes: compiled 2.7 and made adjustments here so it's ready. arrangement process, and object modifiers are broken, everything else seems to be ok(have not checked the gcode output) scrolling in the object list is now very slow/the scrolling action gets a 'queue' if you scroll then stop the GUI keeps going then stops --- src/libslic3r/AppConfig.hpp | 4 + src/slic3r/GUI/CalibrationAbstractDialog.cpp | 58 +++-- src/slic3r/GUI/CalibrationAbstractDialog.hpp | 2 +- .../GUI/CalibrationPressureAdvDialog.cpp | 217 ++++++++++++++---- .../GUI/CalibrationPressureAdvDialog.hpp | 4 +- 5 files changed, 217 insertions(+), 68 deletions(-) diff --git a/src/libslic3r/AppConfig.hpp b/src/libslic3r/AppConfig.hpp index 6da1f7353ba..a7fe8ccb226 100644 --- a/src/libslic3r/AppConfig.hpp +++ b/src/libslic3r/AppConfig.hpp @@ -119,6 +119,10 @@ class AppConfig } std::string get(const std::string §ion, const std::string &key) const { std::string value; this->get(section, key, value); return value; } + bool get_bool(const std::string §ion, const std::string &key) const + { return this->get(section, key) == "1"; } + bool get_bool(const std::string &key) const + { return this->get(key) == "1"; } std::string get(const std::string &key) const { std::string value; this->get("", key, value); return value; } void set(const std::string §ion, const std::string &key, const std::string &value) diff --git a/src/slic3r/GUI/CalibrationAbstractDialog.cpp b/src/slic3r/GUI/CalibrationAbstractDialog.cpp index f3eaebbb664..8af84ce85ab 100644 --- a/src/slic3r/GUI/CalibrationAbstractDialog.cpp +++ b/src/slic3r/GUI/CalibrationAbstractDialog.cpp @@ -26,13 +26,14 @@ static wxSize get_screen_size(wxWindow* window) namespace Slic3r { namespace GUI { - CalibrationAbstractDialog::CalibrationAbstractDialog(GUI_App* app, MainFrame* mainframe, std::string name) +CalibrationAbstractDialog::CalibrationAbstractDialog(GUI_App* app, MainFrame* mainframe, std::string name) : DPIDialog(NULL, wxID_ANY, wxString(SLIC3R_APP_NAME) + " - " + _(L(name)), #if ENABLE_SCROLLABLE - wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) + wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER #else - wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) + wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER #endif // ENABLE_SCROLLABLE + , "calibration") { this->gui_app = app; this->main_frame = mainframe; @@ -45,10 +46,24 @@ namespace GUI { } -void CalibrationAbstractDialog::create(boost::filesystem::path html_path, std::string html_name, wxSize dialog_size){ +void CalibrationAbstractDialog::create(boost::filesystem::path html_path, std::string html_name, wxSize dialog_size, bool include_close_button){ - auto main_sizer = new wxBoxSizer(wxVERTICAL); + const AppConfig* app_config = get_app_config(); + bool dark_mode = app_config->get_bool("dark_color_mode");// i guss these can be set as global variables? + std::string user_color_text = app_config->get("color_dark"); + wxColour text_color("#" + user_color_text); + std::string color_background = dark_mode ? "333233" : "ffffff";//dark grey and white. whats the offical dark mode color ? + wxColour background_color("#" + color_background); + + // Create a panel for the entire content + wxPanel* main_panel = new wxPanel(this, wxID_ANY); + main_panel->SetBackgroundColour(background_color); + + // Create the sizer for the panel's content + wxBoxSizer* panel_sizer = new wxBoxSizer(wxVERTICAL); + gui_app->app_config->set("autocenter", "1"); + //language wxString language = wxGetApp().current_language_code(); boost::filesystem::path full_file_path = (boost::filesystem::path(Slic3r::resources_dir()) / html_path/ (into_u8(language) + "_"+ html_name)); @@ -66,35 +81,48 @@ void CalibrationAbstractDialog::create(boost::filesystem::path html_path, std::s } } - //html - html_viewer = new wxHtmlWindow(this, wxID_ANY, + // Create the HTML viewer and load the page + html_viewer = new wxHtmlWindow(main_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHW_SCROLLBAR_AUTO); html_viewer->LoadPage(GUI::from_u8(full_file_path.string())); // when using hyperlink, open the browser. html_viewer->Bind(wxEVT_HTML_LINK_CLICKED, [this](wxHtmlLinkEvent& evt) { wxLaunchDefaultBrowser(evt.GetLinkInfo().GetHref()); }); - main_sizer->Add(html_viewer, 1, wxEXPAND | wxALL, 5); + panel_sizer->Add(html_viewer, 1, wxEXPAND | wxALL, 5); + // Adjust the dialog size wxDisplay display(wxDisplay::GetFromWindow(main_frame)); wxRect screen = display.GetClientArea(); dialog_size.x = std::min(int(dialog_size.x * this->scale_factor()), screen.width - 50); dialog_size.y = std::min(int(dialog_size.y * this->scale_factor()), screen.height - 50); + // Create the button sizer and configure the "Close" button wxStdDialogButtonSizer* buttons = new wxStdDialogButtonSizer(); create_buttons(buttons); - wxButton* close = new wxButton(this, wxID_CLOSE, _L("Close")); - close->Bind(wxEVT_BUTTON, &CalibrationAbstractDialog::close_me, this); - buttons->AddButton(close); - close->SetDefault(); - close->SetFocus(); - SetAffirmativeId(wxID_CLOSE); + if (!include_close_button) {//if you want to define a custom location for the close button + wxButton* close = new wxButton(main_panel, wxID_CLOSE, _L("Close")); + close->Bind(wxEVT_BUTTON, &CalibrationAbstractDialog::close_me, this); + buttons->AddButton(close); + close->SetDefault(); + close->SetFocus(); + SetAffirmativeId(wxID_CLOSE); + } + buttons->Realize(); - main_sizer->Add(buttons, 0, wxEXPAND | wxALL, 5); + panel_sizer->Add(buttons, 0, wxEXPAND | wxALL, 5); + + // Set the panel's sizer and add the panel to the dialog + main_panel->SetSizer(panel_sizer); + wxBoxSizer* main_sizer = new wxBoxSizer(wxVERTICAL); + main_sizer->Add(main_panel, 1, wxEXPAND | wxALL, 0); SetSizer(main_sizer); this->SetSize(dialog_size.x, dialog_size.y); + gui_app->app_config->set("autocenter", "0"); + main_panel->Lower();// this may break some calibration windows... willl have to call Raise() on other calibration windows that have a panel + } void CalibrationAbstractDialog::close_me(wxCommandEvent& event_args) { diff --git a/src/slic3r/GUI/CalibrationAbstractDialog.hpp b/src/slic3r/GUI/CalibrationAbstractDialog.hpp index a54fa6d72b3..ae8f0f5ff63 100644 --- a/src/slic3r/GUI/CalibrationAbstractDialog.hpp +++ b/src/slic3r/GUI/CalibrationAbstractDialog.hpp @@ -25,7 +25,7 @@ class CalibrationAbstractDialog : public DPIDialog private: wxPanel* create_header(wxWindow* parent, const wxFont& bold_font); protected: - void create(boost::filesystem::path html_path, std::string html_name, wxSize dialogsize = wxSize(850, 550)); + void create(boost::filesystem::path html_path, std::string html_name, wxSize dialogsize = wxSize(850, 550), bool include_close_button = false); virtual void create_buttons(wxStdDialogButtonSizer*) = 0; void on_dpi_changed(const wxRect& suggested_rect) override; void close_me(wxCommandEvent& event_args); diff --git a/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp b/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp index 9810cc8a628..4ac11bcc79a 100644 --- a/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp +++ b/src/slic3r/GUI/CalibrationPressureAdvDialog.cpp @@ -14,6 +14,7 @@ #include #include "wxExtensions.hpp" #include "Jobs/ArrangeJob.hpp" +//#include "Jobs/job.hpp" 2.7 requirement? #include #pragma optimize("", off) @@ -43,7 +44,8 @@ namespace GUI { //improvement if users have milti toolheads/swapping create a custom command for setting PA, add in welcome page for them to add this custom command for PA into filament notes-custom variables // since they will most likely have a klipper macro for chaning toolheads/doing other stuff. //BUG: some localization issues results in broken PA calculations since ',' and '.' get swapped. this is because of manual text entry as strings. -FlowRole string_to_flow_role(const std::string& role_str) { + +/*FlowRole string_to_flow_role(const std::string& role_str) { static std::unordered_map role_map = { {"InternalInfill", FlowRole::frInfill}, {"BridgeInfill", FlowRole::frSupportMaterialInterface}, // special calc required @@ -51,7 +53,7 @@ FlowRole string_to_flow_role(const std::string& role_str) { {"GapFill", FlowRole::frSupportMaterialInterface}, // special calc required {"InternalBridgeInfill", FlowRole::frSupportMaterialInterface}, // special calc required {"Ironing", FlowRole::frSupportMaterialInterface}, // special calc required - {"OverhangPerimeter", FlowRole::frSupportMaterialInterface}, // special calc required ? + {"OverhangPerimeter", FlowRole::frExternalPerimeter}, //overhangs use the same flow config as external perimeter TODO: confirm this. {"Perimeter", FlowRole::frPerimeter}, {"SolidInfill", FlowRole::frSolidInfill}, {"SupportMaterial", FlowRole::frSupportMaterial}, @@ -83,7 +85,7 @@ ExtrusionRole string_to_er_role(const std::string& role_str) { }; return role_map[role_str]; -} +}*/ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { @@ -116,7 +118,7 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { {"SolidInfill", "solid_infill_extrusion_width"}, {"SupportMaterial", "support_material_extrusion_width"},// support material layer_height can go up/down depending on config. {"SupportMaterialInterface", "support_material_extrusion_width"},//SupportMaterialInterface and SupportMaterialInterface shares same width calculations? - {"ThinWall", "external_perimeter_extrusion_width"},//not fully suported + {"ThinWall", "thin_walls_min_width"},//not fully suported {"TopSolidInfill", "top_infill_extrusion_width"}, {"FirstLayer", "first_layer_extrusion_width"} @@ -213,12 +215,14 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { double first_layer_flow_ratio = full_print_config.get_computed_value("first_layer_flow_ratio"); double first_layer_size_compensation = full_print_config.get_computed_value("first_layer_size_compensation"); double infill_every_layers = full_print_config.get_computed_value("infill_every_layers"); + double support_material_layer_height = full_print_config.get_computed_value("support_material_layer_height"); double base_layer_height = full_print_config.get_computed_value("layer_height"); double er_width = full_print_config.get_abs_value("solid_infill_extrusion_width", nozzle_diameter); double er_accel = full_print_config.get_computed_value("solid_infill_acceleration"); double er_speed = full_print_config.get_computed_value("solid_infill_speed"); double er_spacing = full_print_config.get_abs_value("external_perimeter_extrusion_spacing",nozzle_diameter); + double thin_walls_min_width = full_print_config.get_abs_value("thin_walls_min_width", nozzle_diameter); double default_er_width = full_print_config.get_abs_value("extrusion_width", nozzle_diameter); double default_er_speed = full_print_config.get_computed_value("default_speed"); @@ -227,7 +231,10 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { double spacing_ratio = full_print_config.get_computed_value("perimeter_overlap"); double spacing_ratio_external = full_print_config.get_computed_value("external_perimeter_overlap"); double filament_max_overlap = full_print_config.get_computed_value("filament_max_overlap",0);//maybe check for extruderID ? + const int extruder_count = wxGetApp().extruders_edited_cnt(); double combined_layer_height = infill_every_layers * base_layer_height; + double min_layer_height = full_print_config.get_computed_value("min_layer_height", extruder_count); + double max_layer_height = full_print_config.get_computed_value("max_layer_height", extruder_count); bool infill_dense = full_print_config.get_bool("infill_dense"); if (combined_layer_height > nozzle_diameter){ @@ -314,6 +321,12 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { std::vector pa_values = pa_result.first; int count_increments = pa_result.second; extrusion_role = dynamicExtrusionRole[id_item]->GetValue().ToStdString(); + if (extrusion_role == "SupportMaterial" && support_material_layer_height != 0){ + combined_layer_height = support_material_layer_height; + } + else if (extrusion_role == "InternalInfill" && infill_dense == false && infill_every_layers > 1){ + combined_layer_height = infill_every_layers * base_layer_height; + } /* double first_pa = wxAtof(firstPaValue); @@ -329,7 +342,7 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { } else{ - bool enable_switch = false; + /*bool enable_switch = false; if(enable_switch == true){//still needs work :) for (const std::string& role_str : choice_extrusion_role) { ExtrusionRole extrusion_role = string_to_er_role(role_str); @@ -339,30 +352,40 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { modified_layer_height = combined_layer_height; } else if (role_str == "SupportMaterial"){//this one might be tricky to do, since supports layerheight can go up/down based on config. maybe load 3 90_bend models for supports with low,high, middle layer heights - modified_layer_height = 0.2; + if (support_material_layer_height == 0){ + double average_layer_height = (min_layer_height + max_layer_height) / 2; + modified_layer_height = average_layer_height; + } + else{ + modified_layer_height = support_material_layer_height; + } + } + else if (role_str == "FirstLayer"){ + modified_layer_height = first_layer_height; } switch (extrusion_role) { case ExtrusionRole::erInternalInfill: - base_flow = Flow::new_from_config(flow_role, *print_config, nozzle_diameter, base_layer_height, filament_max_overlap, false); + base_flow = Flow::new_from_config(flow_role, *print_config, nozzle_diameter, modified_layer_height, filament_max_overlap, false); break; - case ExtrusionRole::erBridgeInfill: + case ExtrusionRole::erBridgeInfill:// this will be tricky because bridges don't get any "layersquish" so the 90_bend model will have to have "empty" layers to help simulate a bridge + base_flow = Flow::new_from_width(float width, float nozzle_diameter, float height, float spacing_ratio, bool bridge = false); //base_flow = Flow::new_from_config(flow_role, *print_config, nozzle_diameter, base_layer_height, filament_max_overlap, false); break; case ExtrusionRole::erExternalPerimeter: base_flow = Flow::new_from_config(flow_role, *print_config, nozzle_diameter, base_layer_height, filament_max_overlap, false); break; - case ExtrusionRole::erGapFill: + case ExtrusionRole::erGapFill:// i don't think i can adjust width/spacing for this one. only speed related config. unless i scale the 90_bend model wrong so it DOES get gap fill ? won't work for arachne, or will it ? //base_flow = Flow::new_from_config(flow_role, *print_config, nozzle_diameter, base_layer_height, filament_max_overlap, false); break; case ExtrusionRole::erInternalBridgeInfill: - //base_flow = Flow::new_from_config(flow_role, *print_config, nozzle_diameter, base_layer_height, filament_max_overlap, false); + //base_flow = Flow::new_from_config(flow_role, *print_config, nozzle_diameter, modified_layer_height, filament_max_overlap, false); break; case ExtrusionRole::erIroning: - //base_flow = Flow::new_from_config(flow_role, *print_config, nozzle_diameter, base_layer_height, filament_max_overlap, false); + //base_flow = Flow::new_from_config(flow_role, *print_config, nozzle_diameter, modified_layer_height, filament_max_overlap, false); break; case ExtrusionRole::erOverhangPerimeter: - //base_flow = Flow::new_from_config(flow_role, *print_config, nozzle_diameter, base_layer_height, filament_max_overlap, false); + base_flow = Flow::new_from_config(flow_role, *print_config, nozzle_diameter, base_layer_height, filament_max_overlap, false); break; case ExtrusionRole::erPerimeter: base_flow = Flow::new_from_config(flow_role, *print_config, nozzle_diameter, base_layer_height, filament_max_overlap, false); @@ -371,19 +394,19 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { base_flow = Flow::new_from_config(flow_role, *print_config, nozzle_diameter, base_layer_height, filament_max_overlap, false); break; case ExtrusionRole::erSupportMaterial: - base_flow = Flow::new_from_config(flow_role, *print_config, nozzle_diameter, base_layer_height, filament_max_overlap, false); + base_flow = Flow::new_from_config(flow_role, *print_config, nozzle_diameter, modified_layer_height, filament_max_overlap, false); break; case ExtrusionRole::erSupportMaterialInterface: base_flow = Flow::new_from_config(flow_role, *print_config, nozzle_diameter, base_layer_height, filament_max_overlap, false); break; - case ExtrusionRole::erThinWall: + case ExtrusionRole::erThinWall://maybe scale the 90_bend models down so they get detected as thin_walls_min_width config ? this will result in a "single wall" 90_bend model hmmm.. //base_flow = Flow::new_from_config(flow_role, *print_config, nozzle_diameter, base_layer_height, filament_max_overlap, false); break; case ExtrusionRole::erTopSolidInfill: base_flow = Flow::new_from_config(flow_role, *print_config, nozzle_diameter, base_layer_height, filament_max_overlap, false); break; case ExtrusionRole::erCustom://first_layer - base_flow = Flow::new_from_config(flow_role, *print_config, nozzle_diameter, first_layer_height, 1.f, true); + base_flow = Flow::new_from_config(flow_role, *print_config, nozzle_diameter, modified_layer_height, 1.f, true); break; default: base_flow = Flow::new_from_config(FlowRole::frExternalPerimeter, *print_config, nozzle_diameter, base_layer_height, filament_max_overlap, false);//unsupported roles. @@ -391,7 +414,7 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { } break; } - } + }*/ for (int i = 0; i < sizeof(choice_extrusion_role) / sizeof(choice_extrusion_role[0]); i++) { @@ -446,6 +469,9 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { if (infill_every_layers > 1 && extrusion_role == "InternalInfill" && infill_dense == false){ er_width_to_scale = magical_scaling(nozzle_diameter, er_width, filament_max_overlap, spacing_ratio, spacing_ratio_external, combined_layer_height, er_spacing); } + if (extrusion_role == "SupportMaterial" && support_material_layer_height != 0){ + er_width_to_scale = magical_scaling(nozzle_diameter, er_width, filament_max_overlap, spacing_ratio, spacing_ratio_external, combined_layer_height, er_spacing); + } //-- magical scaling pressure_tower.emplace_back(); @@ -510,6 +536,12 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { z_90_bend_pos = (first_layer_height + (combined_layer_height * 5)) / 2; z_scale_90_bend = (first_layer_height + (combined_layer_height * 5)) / initial_model_height;//force constant 6 layer height for model even if combing layers, needed for infill selected role } + if (extrusion_role == "SupportMaterial" && support_material_layer_height != 0 ){ + er_width_to_scale = magical_scaling(nozzle_diameter, er_width, filament_max_overlap, spacing_ratio, spacing_ratio_external, combined_layer_height, er_spacing); + z_90_bend_pos = (first_layer_height + (combined_layer_height * 5)) / 2; + z_scale_90_bend = (first_layer_height + (combined_layer_height * 5)) / initial_model_height;//TOFIX: support material layer heights can change if its set to "0" + } + add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "scaled_with_nozzle_size" / bend_90_nozzle_size_3mf).string(), @@ -663,6 +695,7 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { new_print_config.set_key_value("xy_inner_size_compensation", new ConfigOptionFloat(0)); new_print_config.set_key_value("xy_outer_size_compensation", new ConfigOptionFloat(0)); new_print_config.set_key_value("print_custom_variables", new ConfigOptionString("calibration_print"));//created this as an extra check for when generating gcode to not include "feature_gcode" + // unless i disable the "generate" button if the keywords are detected in the custom gcode ? //assert(filament_temp_item_name.size() == nb_runs); @@ -682,6 +715,12 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { if (extrusion_role == "Verify") {// have to keep it in range count_increments = sizeof(choice_extrusion_role) / sizeof(choice_extrusion_role[0]); } + if (extrusion_role == "SupportMaterial" && support_material_layer_height != 0){ + combined_layer_height = support_material_layer_height; + } + else if (extrusion_role == "InternalInfill" && infill_dense == false && infill_every_layers > 1){ + combined_layer_height = infill_every_layers * base_layer_height; + } auto last_90_bend_scale = model.objects[objs_idx[id_item]]->volumes[count_increments]->get_scaling_factor(); Eigen::Vector3d bend_90_mesh = model.objects[objs_idx[id_item]]->volumes[count_increments]->mesh().size(); @@ -751,7 +790,19 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { model.objects[objs_idx[id_item]]->layer_config_ranges[std::pair(first_layer_height, model_height + first_layer_height)] = new_range_conf; } } + if (extrusion_role == "SupportMaterial" && support_material_layer_height != 0 ){ + wxGetApp().obj_list()->layers_editing(id_item);//could prob use this same thing for the unsupported roles since they need a different layer_height/width + auto existing_range = model.objects[objs_idx[id_item]]->layer_config_ranges.find(std::pair(0.0f, 2.0f));// Find the default existing range {0.0f, 2.0f} + + if (existing_range != model.objects[objs_idx[id_item]]->layer_config_ranges.end()) { + ModelConfig new_range_conf = existing_range->second; + + new_range_conf.set_key_value("layer_height", new ConfigOptionFloatOrPercent(combined_layer_height, false)); + model.objects[objs_idx[id_item]]->layer_config_ranges.erase(existing_range); + model.objects[objs_idx[id_item]]->layer_config_ranges[std::pair(first_layer_height, model_height + first_layer_height)] = new_range_conf; + } + } } } size_t num_part = 0; @@ -813,8 +864,9 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { if (infill_every_layers > 1 && extrusion_role == "InternalInfill" && infill_dense == false) { er_width_to_scale = magical_scaling(nozzle_diameter, er_width, filament_max_overlap, spacing_ratio, spacing_ratio_external, combined_layer_height, er_spacing); } - - + if (extrusion_role == "SupportMaterial" && support_material_layer_height != 0 ){ + er_width_to_scale = magical_scaling(nozzle_diameter, er_width, filament_max_overlap, spacing_ratio, spacing_ratio_external, combined_layer_height, er_spacing); + } double er_width_to_scale_first_layer_match_base2 = magical_scaling(nozzle_diameter, er_width, filament_max_overlap, spacing_ratio, spacing_ratio_external, first_layer_height, first_layer_spacing); double xy_scaled_90_bend_x = initial_90_bend_x * er_width_to_scale; // mm @@ -956,6 +1008,17 @@ void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { arranger.prepare_all(); arranger.process(); arranger.finalize(); + + /*ArrangeJob arranger(ArrangeJob::Full); + //Ctl ctl; + bool canceled = false; // Example value; adjust as necessary based on user input + std::exception_ptr e; // Exception handling + + arranger.prepare_all(); + //arranger.process(ctl); + arranger.finalize(canceled, e); + ArrangeJob();*/ + } if (extrusion_role != "Verify") {//don't auto slice so user can manual add PA values @@ -996,42 +1059,80 @@ double CalibrationPressureAdvDialog::magical_scaling(double nozzle_diameter, dou } void CalibrationPressureAdvDialog::create_buttons(wxStdDialogButtonSizer* buttons) { + const DynamicPrintConfig* printer_config = this->gui_app->get_tab(Preset::TYPE_PRINTER)->get_config(); GCodeFlavor flavor = printer_config->option>("gcode_flavor")->value; + const AppConfig* app_config = get_app_config(); + + bool dark_mode = app_config->get_bool("dark_color_mode");// i guss these can be set as global variables? + std::string user_color = app_config->get("color_dark"); + wxColour text_color("#" + user_color); + + std::string color_background = dark_mode ? "333233" : "ffffff";//dark grey and white. whats the offical dark mode color ? + wxColour background_color("#" + color_background); std::string prefix = (gcfMarlinFirmware == flavor) ? " LA " : ((gcfKlipper == flavor || gcfRepRap == flavor) ? " PA " : "unsupported firmware type"); + + if (prefix != "unsupported firmware type") { + wxPanel* mainPanel = new wxPanel(this, wxID_ANY); + mainPanel->SetBackgroundColour(background_color); + mainPanel->Raise(); + + // Create a vertical sizer for the panel + wxBoxSizer* panelSizer = new wxBoxSizer(wxVERTICAL); + mainPanel->SetSizer(panelSizer); + + // Create the common controls sizer + wxBoxSizer* commonSizer = new wxBoxSizer(wxHORIZONTAL); + wxString number_of_runs[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" };//setting this any higher will break loading the model for the ID - nbRuns = new wxComboBox(this, wxID_ANY, wxString{ "1" }, wxDefaultPosition, wxDefaultSize, 10, number_of_runs, wxCB_READONLY); + nbRuns = new wxComboBox(mainPanel, wxID_ANY, wxString{ "1" }, wxDefaultPosition, wxDefaultSize, 10, number_of_runs, wxCB_READONLY); nbRuns->SetToolTip(_L("Select the number of tests to generate, max 6 is recommended due to bed size limits")); nbRuns->SetSelection(0); nbRuns->Bind(wxEVT_COMBOBOX, &CalibrationPressureAdvDialog::on_row_change, this); - dynamicSizer = new wxBoxSizer(wxVERTICAL); - - wxBoxSizer* commonSizer = new wxBoxSizer(wxHORIZONTAL); - commonSizer->Add(new wxStaticText(this, wxID_ANY, _L("Number of" + prefix + "tests: ")), 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); + wxStaticText* text_generate_count = new wxStaticText(mainPanel, wxID_ANY, _L("Number of" + prefix + "tests: ")); + text_generate_count->SetForegroundColour(text_color); + commonSizer->Add(text_generate_count, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); commonSizer->Add(nbRuns, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); - // Create a button for generating - wxButton* generateButton = new wxButton(this, wxID_FILE1, _L("Generate")); + // Create a button for generating models + wxButton* generateButton = new wxButton(mainPanel, wxID_FILE1, _L("Generate")); generateButton->Bind(wxEVT_BUTTON, &CalibrationPressureAdvDialog::create_geometry, this); commonSizer->Add(generateButton, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); + commonSizer->AddSpacer(50);// move the close button to the right a little, or align it on the far right side? - dynamicSizer->Add(commonSizer, 0, wxALL, 10); - buttons->Add(dynamicSizer, 1, wxEXPAND | wxALL, 5); + wxButton* closeButton = new wxButton(mainPanel, wxID_CLOSE, _L("Close")); + closeButton->Bind(wxEVT_BUTTON, &CalibrationPressureAdvDialog::close_me_wrapper, this); + commonSizer->Add(closeButton, 0, wxALL, 5); + + panelSizer->Add(commonSizer, 0, wxALL, 10); + dynamicSizer = new wxBoxSizer(wxVERTICAL); + panelSizer->Add(dynamicSizer, 1, wxEXPAND | wxALL, 5); + buttons->Add(mainPanel, 1, wxEXPAND | wxALL, 10); currentTestCount = wxAtoi(nbRuns->GetValue()); create_row_controls(dynamicSizer, currentTestCount); } else { - buttons->Add(new wxStaticText(this, wxID_ANY, _L(prefix))); + + wxStaticText* incompatiable_text = new wxStaticText(this, wxID_ANY, _L(prefix)); + incompatiable_text->SetForegroundColour(*wxRED); // Set the text color to red for the incompatiable firmware tpe + buttons->Add(incompatiable_text); } } -void CalibrationPressureAdvDialog::create_row_controls(wxBoxSizer* parent_sizer, int row_count) { +void CalibrationPressureAdvDialog::create_row_controls(wxBoxSizer* parentSizer, int row_count) { + + const AppConfig* app_config = get_app_config(); + bool dark_mode = app_config->get_bool("dark_color_mode"); + + std::string user_color_text = app_config->get("color_dark"); + wxColour text_color("#" + user_color_text); + // //wxArrayInt //wxArrayDouble @@ -1066,46 +1167,56 @@ void CalibrationPressureAdvDialog::create_row_controls(wxBoxSizer* parent_sizer, for (int i = 0; i < row_count; i++) { wxBoxSizer* rowSizer = new wxBoxSizer(wxHORIZONTAL); - wxComboBox* firstPaCombo = new wxComboBox(this, wxID_ANY, wxString{choices_first_layerPA[3]}, wxDefaultPosition, wxDefaultSize, 6, choices_first_layerPA); - rowSizer->Add(new wxStaticText(this, wxID_ANY, _L("First Layers" + prefix + "value: "))); - firstPaCombo->SetToolTip(_L("Select the" + prefix +"value to be used for the first layer only.\n(this gets added to 'before_layer_gcode' area)")); - firstPaCombo->SetSelection(3); - rowSizer->Add(firstPaCombo); + wxComboBox* firstPaCombo = new wxComboBox(parentSizer->GetContainingWindow(), wxID_ANY, wxString{ choices_first_layerPA[3] }, wxDefaultPosition, wxSize(80, -1), 6, choices_first_layerPA); + wxStaticText* text_first_l_prefix = new wxStaticText(parentSizer->GetContainingWindow(), wxID_ANY, _L("First Layers" + prefix + "value: ")); + text_first_l_prefix->SetForegroundColour(text_color); + rowSizer->Add(text_first_l_prefix, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); + firstPaCombo->SetToolTip(_L("Select the" + prefix + "value to be used for the first layer only.\n(this gets added to 'before_layer_gcode' area)")); + rowSizer->Add(firstPaCombo, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); dynamicFirstPa.push_back(firstPaCombo); rowSizer->AddSpacer(15); - wxComboBox* startPaCombo = new wxComboBox(this, wxID_ANY, wxString{ choices_start_PA[0]}, wxDefaultPosition, wxDefaultSize, 6, choices_start_PA); - rowSizer->Add(new wxStaticText(this, wxID_ANY, _L("Start value: "))); + wxComboBox* startPaCombo = new wxComboBox(parentSizer->GetContainingWindow(), wxID_ANY, wxString{ choices_start_PA[0]}, wxDefaultPosition, wxSize(80, -1), 6, choices_start_PA); + wxStaticText* text_start_value = new wxStaticText(parentSizer->GetContainingWindow(), wxID_ANY, _L("Start value: ")); + text_start_value->SetForegroundColour(text_color); + rowSizer->Add(text_start_value, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); startPaCombo->SetToolTip(_L("Select the starting" + prefix + "value to be used.\n (you can manually type in values!)")); startPaCombo->SetSelection(0); - rowSizer->Add(startPaCombo); + rowSizer->Add(startPaCombo, 0, wxALIGN_CENTER_VERTICAL); dynamicStartPa.push_back(startPaCombo); rowSizer->AddSpacer(15); - wxComboBox* endPaCombo = new wxComboBox(this, wxID_ANY, wxString{ choices_end_PA[0] }, wxDefaultPosition, wxDefaultSize, 10, choices_end_PA); - rowSizer->Add(new wxStaticText(this, wxID_ANY, _L("End value: "))); + wxComboBox* endPaCombo = new wxComboBox(parentSizer->GetContainingWindow(), wxID_ANY, wxString{ choices_end_PA[0] }, wxDefaultPosition, wxSize(80, -1), 10, choices_end_PA); + wxStaticText* text_end_value = new wxStaticText(parentSizer->GetContainingWindow(), wxID_ANY, _L("End value: ")); + text_end_value->SetForegroundColour(text_color); + rowSizer->Add(text_end_value, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); endPaCombo->SetToolTip(_L("Select the ending" + prefix + "value to be used.\n (you can manually type in values!)")); endPaCombo->SetSelection(0); - rowSizer->Add(endPaCombo); + rowSizer->Add(endPaCombo, 0, wxALIGN_CENTER_VERTICAL); dynamicEndPa.push_back(endPaCombo); rowSizer->AddSpacer(15); - wxComboBox* paIncrementCombo = new wxComboBox(this, wxID_ANY, wxString{ choices_increment_PA[3] }, wxDefaultPosition, wxDefaultSize, 8, choices_increment_PA); - rowSizer->Add(new wxStaticText(this, wxID_ANY, _L("Increment by: "))); + wxComboBox* paIncrementCombo = new wxComboBox(parentSizer->GetContainingWindow(), wxID_ANY, wxString{ choices_increment_PA[3] }, wxDefaultPosition, wxSize(80, -1), 8, choices_increment_PA); + wxStaticText* text_increment = new wxStaticText(parentSizer->GetContainingWindow(), wxID_ANY, _L("Increment by: ")); + text_increment->SetForegroundColour(text_color); + rowSizer->Add(text_increment, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); paIncrementCombo->SetToolTip(_L("Select the incremental value.\n (you can manually type in values!)")); paIncrementCombo->SetSelection(3); - rowSizer->Add(paIncrementCombo); + rowSizer->Add(paIncrementCombo, 0, wxALIGN_CENTER_VERTICAL); dynamicPaIncrement.push_back(paIncrementCombo); rowSizer->AddSpacer(15); - wxComboBox* erPaCombo = new wxComboBox(this, wxID_ANY, wxString{ choices_extrusion_role[current_selection] }, wxDefaultPosition, wxDefaultSize, 15, choices_extrusion_role, wxCB_READONLY);//disable user edit this one :) - rowSizer->Add(new wxStaticText(this, wxID_ANY, _L("Extrusion role: "))); + + wxComboBox* erPaCombo = new wxComboBox(parentSizer->GetContainingWindow(), wxID_ANY, wxString{ choices_extrusion_role[current_selection] }, wxDefaultPosition, wxSize(200, -1), 15, choices_extrusion_role, wxCB_READONLY);//disable user edit this one :) + wxStaticText* text_extrusion_role = new wxStaticText(parentSizer->GetContainingWindow(), wxID_ANY, _L("Extrusion role: ")); + text_extrusion_role->SetForegroundColour(text_color); + rowSizer->Add(text_extrusion_role, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5); erPaCombo->SetToolTip(_L("Select the extrusion role you want to generate a calibration for")); erPaCombo->SetSelection(current_selection); - rowSizer->Add(erPaCombo); + rowSizer->Add(erPaCombo, 0, wxALIGN_CENTER_VERTICAL); dynamicExtrusionRole.push_back(erPaCombo); // Increment selection for the next row @@ -1116,16 +1227,18 @@ void CalibrationPressureAdvDialog::create_row_controls(wxBoxSizer* parent_sizer, if (prefix == " PA ") {//klipper only feature ? rowSizer->AddSpacer(15); - wxCheckBox* enableST = new wxCheckBox(this, wxID_ANY, _L(""), wxDefaultPosition, wxDefaultSize); - rowSizer->Add(new wxStaticText(this, wxID_ANY, _L("Smooth time: "))); + wxCheckBox* enableST = new wxCheckBox(parentSizer->GetContainingWindow(), wxID_ANY, _L(""), wxDefaultPosition, wxDefaultSize); + wxStaticText* text_smooth_time = new wxStaticText(parentSizer->GetContainingWindow(), wxID_ANY, _L("Smooth time: ")); + text_smooth_time->SetForegroundColour(text_color); + rowSizer->Add(text_smooth_time, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); //enableST->SetToolTip(_L("Generate smooth time values")); enableST->SetToolTip(_L("This parameter defines the duration over which extruder velocity changes are averaged, helping to smooth out rapid changes in extrusion pressure. Shorter times (e.g., 0.01 seconds) are beneficial for fast printing, while longer times (e.g., 0.4 seconds) are better for slower printing. The default value is 0.04 seconds.")); enableST->SetValue(false); - rowSizer->Add(enableST); + rowSizer->Add(enableST, 1, wxALIGN_CENTER_VERTICAL); dynamicEnableST.push_back(enableST); } - parent_sizer->Add(rowSizer, 0, wxALL, 5); + parentSizer->Add(rowSizer, 0, wxALL, 2);// change this to make each row have a larger/smaller 'gap' between them dynamicRowcount.push_back(rowSizer); } } @@ -1201,7 +1314,9 @@ std::pair, int> CalibrationPressureAdvDialog::calc_PA_values return std::make_pair(pa_values, countincrements); } - +void CalibrationPressureAdvDialog::close_me_wrapper(wxCommandEvent& event) { + this->close_me(event); +} } // namespace GUI } // namespace Slic3r #pragma optimize("", on) \ No newline at end of file diff --git a/src/slic3r/GUI/CalibrationPressureAdvDialog.hpp b/src/slic3r/GUI/CalibrationPressureAdvDialog.hpp index a1b6c8eaeb7..65f8b8ab0d6 100644 --- a/src/slic3r/GUI/CalibrationPressureAdvDialog.hpp +++ b/src/slic3r/GUI/CalibrationPressureAdvDialog.hpp @@ -11,9 +11,11 @@ class CalibrationPressureAdvDialog : public CalibrationAbstractDialog public: CalibrationPressureAdvDialog(GUI_App* app, MainFrame* mainframe) : CalibrationAbstractDialog(app, mainframe, "Pressure calibration") - { create(boost::filesystem::path("calibration") / "filament_pressure", "filament_pressure.html", wxSize(1600, 600)); Centre(wxBOTH); currentTestCount = 1; } + { create(boost::filesystem::path("calibration") / "filament_pressure", "filament_pressure.html", wxSize(1600, 600), true); Centre(wxBOTH); currentTestCount = 1; } //include_close_button = true virtual ~CalibrationPressureAdvDialog(){ } + void close_me_wrapper(wxCommandEvent& event); + protected: void create_buttons(wxStdDialogButtonSizer* sizer) override;