From 3ed86a820a7f21868f869318a04296336da1342f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20=C5=A0ach?= Date: Mon, 6 Nov 2023 19:59:06 +0100 Subject: [PATCH] Add PrintConfig options for future more general z-hop implementation. The parameters are also presented in the GUI. --- src/libslic3r/Preset.cpp | 3 +- src/libslic3r/Print.cpp | 5 +++ src/libslic3r/PrintConfig.cpp | 62 +++++++++++++++++++++++++++++------ src/libslic3r/PrintConfig.hpp | 4 +++ src/slic3r/GUI/Tab.cpp | 51 ++++++++++++++++++++-------- 5 files changed, 101 insertions(+), 24 deletions(-) diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index c25ad986ed..9e3d2833a3 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -485,7 +485,8 @@ static std::vector s_Preset_filament_options { "overhang_fan_speed_0", "overhang_fan_speed_1", "overhang_fan_speed_2", "overhang_fan_speed_3", // Retract overrides "filament_retract_length", "filament_retract_lift", "filament_retract_lift_above", "filament_retract_lift_below", "filament_retract_speed", "filament_deretract_speed", "filament_retract_restart_extra", "filament_retract_before_travel", - "filament_retract_layer_change", "filament_wipe", "filament_retract_before_wipe", "filament_retract_length_toolchange", "filament_retract_restart_extra_toolchange", + "filament_retract_layer_change", "filament_wipe", "filament_retract_before_wipe", "filament_retract_length_toolchange", "filament_retract_restart_extra_toolchange", "filament_travel_ramping_lift", + "filament_travel_slope", "filament_travel_max_lift", "filament_travel_lift_before_obstacle", // Profile compatibility "filament_vendor", "compatible_prints", "compatible_prints_condition", "compatible_printers", "compatible_printers_condition", "inherits" }; diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 5b043bb468..30893f2245 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -141,6 +141,11 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver & /* n "gcode_substitutions", "gcode_binary", "printer_notes", + "travel_ramping_lift", + "travel_initial_part_length", + "travel_slope", + "travel_max_lift", + "travel_lift_before_obstacle", "retract_before_travel", "retract_before_wipe", "retract_layer_change", diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 882dad7f0f..ac523c67ab 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -2316,7 +2316,7 @@ void PrintConfigDef::init_fff_params() def->set_default_value(new ConfigOptionBools { false }); def = this->add("retract_length", coFloats); - def->label = L("Length"); + def->label = L("Retraction length"); def->full_label = L("Retraction Length"); def->tooltip = L("When retraction is triggered, filament is pulled back by the specified amount " "(the length is measured on raw filament, before it enters the extruder)."); @@ -2333,13 +2333,49 @@ void PrintConfigDef::init_fff_params() def->mode = comExpert; def->set_default_value(new ConfigOptionFloats { 10. }); - def = this->add("retract_lift", coFloats); - def->label = L("Lift Z"); - def->tooltip = L("If you set this to a positive value, Z is quickly raised every time a retraction " - "is triggered. When using multiple extruders, only the setting for the first extruder " - "will be considered."); + def = this->add("travel_slope", coPercents); + def->label = L("Ramping slope angle"); + def->tooltip = L("During travel there is a part of the travel that is sloped upwards. " + "This number indicates the slope of the travel as mm raised per mm traveled in percent."); + def->sidetext = L("°"); + def->min = 0; + def->max_literal = 1000; + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionPercents{0.0}); + + def = this->add("travel_ramping_lift", coBools); + def->label = L("Use ramping lift"); + def->tooltip = L("Generates a ramping lift instead of lifting the extruder directly upwards. " + "This option helps reduce stringing."); + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionBools{ false }); + + def = this->add("travel_max_lift", coFloats); + def->label = L("Maximum ramping lift"); + def->tooltip = L("Maximum lift height of the ramping lift. It may not be reached if the next position " + "is close to the old one."); def->sidetext = L("mm"); - def->set_default_value(new ConfigOptionFloats { 0. }); + def->min = 0; + def->max_literal = 1000; + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionFloats{0.0}); + + def = this->add("travel_lift_before_obstacle", coBools); + def->label = L("Steeper ramp before obstacles"); + def->tooltip = L("If enabled, enables dynamic tuning of the 'travel slope end' parameter. " + "If there is an obstacle in the travel path, the 'travel slope end' is set to the obstacle distance, " + "effectively ensuring that the print head will travel in 'lift height' above the obstacle."); + def->mode = comExpert; + def->set_default_value(new ConfigOptionBools{false}); + + def = this->add("retract_lift", coFloats); + def->label = L("Lift height"); + def->tooltip = L("TODO"); + def->sidetext = L("mm"); + def->min = 0; + def->max_literal = 1000; + def->mode = comSimple; + def->set_default_value(new ConfigOptionFloats{0.}); def = this->add("retract_lift_above", coFloats); def->label = L("Above Z"); @@ -2361,7 +2397,7 @@ void PrintConfigDef::init_fff_params() def->set_default_value(new ConfigOptionFloats { 0. }); def = this->add("retract_restart_extra", coFloats); - def->label = L("Extra length on restart"); + def->label = L("Deretraction extra length"); def->tooltip = L("When the retraction is compensated after the travel move, the extruder will push " "this additional amount of filament. This setting is rarely needed."); def->sidetext = L("mm"); @@ -3450,11 +3486,12 @@ void PrintConfigDef::init_fff_params() for (const char *opt_key : { // floats "retract_length", "retract_lift", "retract_lift_above", "retract_lift_below", "retract_speed", + "travel_max_lift", "deretract_speed", "retract_restart_extra", "retract_before_travel", "retract_length_toolchange", "retract_restart_extra_toolchange", // bools - "retract_layer_change", "wipe", + "retract_layer_change", "wipe", "travel_lift_before_obstacle", "travel_ramping_lift", // percents - "retract_before_wipe"}) { + "retract_before_wipe", "travel_slope"}) { auto it_opt = options.find(opt_key); assert(it_opt != options.end()); def = this->add_nullable(std::string("filament_") + opt_key, it_opt->second.type); @@ -3479,6 +3516,7 @@ void PrintConfigDef::init_extruder_option_keys() "nozzle_diameter", "min_layer_height", "max_layer_height", "extruder_offset", "retract_length", "retract_lift", "retract_lift_above", "retract_lift_below", "retract_speed", "deretract_speed", "retract_before_wipe", "retract_restart_extra", "retract_before_travel", "wipe", + "travel_slope", "travel_max_lift", "travel_ramping_lift", "travel_lift_before_obstacle", "retract_layer_change", "retract_length_toolchange", "retract_restart_extra_toolchange", "extruder_colour", "default_filament_profile" }; @@ -3496,6 +3534,10 @@ void PrintConfigDef::init_extruder_option_keys() "retract_restart_extra", "retract_restart_extra_toolchange", "retract_speed", + "travel_lift_before_obstacle", + "travel_max_lift", + "travel_ramping_lift", + "travel_slope", "wipe" }; assert(std::is_sorted(m_extruder_retract_keys.begin(), m_extruder_retract_keys.end())); diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index a337ca53f1..7ba9ba6dc2 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -745,6 +745,10 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionFloat, max_volumetric_speed)) ((ConfigOptionFloat, max_volumetric_extrusion_rate_slope_positive)) ((ConfigOptionFloat, max_volumetric_extrusion_rate_slope_negative)) + ((ConfigOptionBools, travel_ramping_lift)) + ((ConfigOptionFloats, travel_max_lift)) + ((ConfigOptionPercents, travel_slope)) + ((ConfigOptionBools, travel_lift_before_obstacle)) ((ConfigOptionPercents, retract_before_wipe)) ((ConfigOptionFloats, retract_length)) ((ConfigOptionFloats, retract_length_toolchange)) diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 10b5914f06..ce445a2fb0 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -1989,12 +1989,16 @@ void TabFilament::update_line_with_near_label_widget(ConfigOptionsGroupShp optgr void TabFilament::add_filament_overrides_page() { PageShp page = add_options_page(L("Filament Overrides"), "wrench"); - ConfigOptionsGroupShp optgroup = page->new_optgroup(L("Retraction")); + ConfigOptionsGroupShp optgroup = page->new_optgroup(L("Travels")); const int extruder_idx = 0; // #ys_FIXME - for (const std::string opt_key : { "filament_retract_length", + for (const std::string opt_key : { + "filament_travel_ramping_lift", + "filament_travel_slope", "filament_retract_lift", + "filament_travel_max_lift", + "filament_retract_length", "filament_retract_lift_above", "filament_retract_lift_below", "filament_retract_speed", @@ -2003,7 +2007,8 @@ void TabFilament::add_filament_overrides_page() "filament_retract_before_travel", "filament_retract_layer_change", "filament_wipe", - "filament_retract_before_wipe" + "filament_retract_before_wipe", + "filament_travel_lift_before_obstacle" }) create_line_with_near_label_widget(optgroup, opt_key, extruder_idx); @@ -2021,13 +2026,12 @@ void TabFilament::update_filament_overrides_page() return; Page* page = m_active_page; - auto og_it = std::find_if(page->m_optgroups.begin(), page->m_optgroups.end(), [](const ConfigOptionsGroupShp og) { return og->title == "Retraction"; }); + auto og_it = std::find_if(page->m_optgroups.begin(), page->m_optgroups.end(), [](const ConfigOptionsGroupShp og) { return og->title == "Travels"; }); if (og_it == page->m_optgroups.end()) return; ConfigOptionsGroupShp optgroup = *og_it; std::vector opt_keys = { "filament_retract_length", - "filament_retract_lift", "filament_retract_lift_above", "filament_retract_lift_below", "filament_retract_speed", @@ -2036,7 +2040,11 @@ void TabFilament::update_filament_overrides_page() "filament_retract_before_travel", "filament_retract_layer_change", "filament_wipe", - "filament_retract_before_wipe" + "filament_retract_before_wipe", + "filament_travel_slope", + "filament_travel_max_lift", + "filament_retract_lift", + "filament_travel_lift_before_obstacle" }; const int extruder_idx = 0; // #ys_FIXME @@ -3102,7 +3110,8 @@ const std::vector extruder_options = { "min_layer_height", "max_layer_height", "extruder_offset", "retract_length", "retract_lift", "retract_lift_above", "retract_lift_below", "retract_speed", "deretract_speed", "retract_restart_extra", "retract_before_travel", - "retract_layer_change", "wipe", "retract_before_wipe", + "retract_layer_change", "wipe", "retract_before_wipe", "travel_ramping_lift", + "travel_slope", "travel_max_lift", "travel_lift_before_obstacle", "retract_length_toolchange", "retract_restart_extra_toolchange", }; @@ -3256,14 +3265,20 @@ void TabPrinter::build_extruder_pages(size_t n_before_extruders) optgroup = page->new_optgroup(L("Position (for multi-extruder printers)")); optgroup->append_single_option_line("extruder_offset", "", extruder_idx); - optgroup = page->new_optgroup(L("Retraction")); - optgroup->append_single_option_line("retract_length", "", extruder_idx); + optgroup = page->new_optgroup(L("Travel lift")); optgroup->append_single_option_line("retract_lift", "", extruder_idx); - line = { L("Only lift Z"), "" }; + optgroup->append_single_option_line("travel_ramping_lift"); + optgroup->append_single_option_line("travel_max_lift", "", extruder_idx); + optgroup->append_single_option_line("travel_slope", "", extruder_idx); + optgroup->append_single_option_line("travel_lift_before_obstacle", "", extruder_idx); + + line = { L("Only lift"), "" }; line.append_option(optgroup->get_option("retract_lift_above", extruder_idx)); line.append_option(optgroup->get_option("retract_lift_below", extruder_idx)); optgroup->append_line(line); + optgroup = page->new_optgroup(L("Retraction")); + optgroup->append_single_option_line("retract_length", "", extruder_idx); optgroup->append_single_option_line("retract_speed", "", extruder_idx); optgroup->append_single_option_line("deretract_speed", "", extruder_idx); optgroup->append_single_option_line("retract_restart_extra", "", extruder_idx); @@ -3471,26 +3486,34 @@ void TabPrinter::toggle_options() { size_t i = size_t(val - 1); bool have_retract_length = m_config->opt_float("retract_length", i) > 0; + const bool ramping_lift = m_config->opt_bool("travel_ramping_lift", i); + const bool lifts_z = (ramping_lift && m_config->opt_float("travel_max_lift", i) > 0) + || (! ramping_lift && m_config->opt_float("retract_lift", i) > 0); + // when using firmware retraction, firmware decides retraction length bool use_firmware_retraction = m_config->opt_bool("use_firmware_retraction"); toggle_option("retract_length", !use_firmware_retraction, i); + toggle_option("retract_lift", ! ramping_lift, i); + toggle_option("travel_max_lift", ramping_lift, i); + toggle_option("travel_slope", ramping_lift, i); + // user can customize travel length if we have retraction length or we"re using // firmware retraction toggle_option("retract_before_travel", have_retract_length || use_firmware_retraction, i); // user can customize other retraction options if retraction is enabled bool retraction = (have_retract_length || use_firmware_retraction); - std::vector vec = { "retract_lift", "retract_layer_change" }; + std::vector vec = { }; for (auto el : vec) - toggle_option(el, retraction, i); + toggle_option("retract_layer_change", retraction, i); // retract lift above / below only applies if using retract lift vec.resize(0); vec = { "retract_lift_above", "retract_lift_below" }; for (auto el : vec) - toggle_option(el, retraction && (m_config->opt_float("retract_lift", i) > 0), i); + toggle_option(el, lifts_z, i); // some options only apply when not using firmware retraction vec.resize(0); @@ -3521,6 +3544,8 @@ void TabPrinter::toggle_options() load_config(new_conf); } + toggle_option("travel_lift_before_obstacle", ramping_lift, i); + toggle_option("retract_length_toolchange", have_multiple_extruders, i); bool toolchange_retraction = m_config->opt_float("retract_length_toolchange", i) > 0;