From 854470cfba257fbea522819dcc57158ec98ae421 Mon Sep 17 00:00:00 2001 From: SoftFever Date: Thu, 26 Jan 2023 00:36:47 +0800 Subject: [PATCH] wipe on loops Signed-off-by: SoftFever --- src/libslic3r/GCode.cpp | 2 +- src/libslic3r/Preset.cpp | 2 +- src/libslic3r/Print.cpp | 3 ++- src/libslic3r/PrintConfig.cpp | 8 +++++++- src/libslic3r/PrintConfig.hpp | 1 + src/libslic3r/PrintObject.cpp | 1 + src/slic3r/GUI/Tab.cpp | 3 ++- 7 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index e16b53e5ce..d4c882b136 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -3395,7 +3395,7 @@ std::string GCode::extrude_loop(ExtrusionLoop loop, std::string description, dou } // make a little move inwards before leaving loop - if (paths.back().role() == erExternalPerimeter && m_layer != NULL && m_config.wall_loops.value > 1 && paths.front().size() >= 2 && paths.back().polyline.points.size() >= 3) { + if (m_config.wipe_on_loops.value && paths.back().role() == erExternalPerimeter && m_layer != NULL && m_config.wall_loops.value > 1 && paths.front().size() >= 2 && paths.back().polyline.points.size() >= 3) { // detect angle between last and first segment // the side depends on the original winding order of the polygon (left for contours, right for holes) //FIXME improve the algorithm in case the loop is tiny. diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 1c21771432..48a721ed91 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -752,7 +752,7 @@ static std::vector s_Preset_print_options { "small_perimeter_speed", "small_perimeter_threshold","bridge_angle", "filter_out_gap_fill", "post_process", "travel_acceleration","inner_wall_acceleration", "default_jerk", "outer_wall_jerk", "inner_wall_jerk", "infill_jerk", "top_surface_jerk", "initial_layer_jerk","travel_jerk", "top_solid_infill_flow_ratio","bottom_solid_infill_flow_ratio","only_one_wall_first_layer", - "print_flow_ratio","seam_gap","role_based_wipe_speed","wipe_speed","accel_to_decel_enable", "accel_to_decel_factor" + "print_flow_ratio","seam_gap","role_based_wipe_speed","wipe_speed","accel_to_decel_enable", "accel_to_decel_factor", "wipe_on_loops" }; diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 172124f52a..7b13b39505 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -154,7 +154,8 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver & /* n "wipe_speed", "use_relative_e_distances", "accel_to_decel_enable", - "accel_to_decel_factor" + "accel_to_decel_factor", + "wipe_on_loops" }; static std::unordered_set steps_ignore; diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index b82d34bd76..616f14f3c5 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -2406,8 +2406,14 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("The wipe speed is same as the current extrusion role's speed.\n" "e.g. if wipe action is followed by a outer wall extrusion, the outer wall speed will be used for this wipe action."); def->mode = comAdvanced; - def->set_default_value(new ConfigOptionBool(false)); + def->set_default_value(new ConfigOptionBool(true)); + def = this->add("wipe_on_loops", coBool); + def->label = L("Wipe on loops"); + def->tooltip = L("Make a little move inwards before leaving loop"); + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionBool(true)); + def = this->add("wipe_speed", coFloatOrPercent); def->label = L("Wipe speed"); def->tooltip = L("This setting will affect the speed of wipe." diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index ec082ba7f1..abc521f2c3 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -759,6 +759,7 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionFloatOrPercent, seam_gap)) ((ConfigOptionBool, role_based_wipe_speed)) ((ConfigOptionFloatOrPercent, wipe_speed)) + ((ConfigOptionBool, wipe_on_loops)) ) diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index 8150b0d935..7efb2c5e94 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -682,6 +682,7 @@ bool PrintObject::invalidate_state_by_config_options( || opt_key == "infill_wall_overlap" || opt_key == "seam_gap" || opt_key == "role_based_wipe_speed" + || opt_key == "wipe_on_loops" || opt_key == "wipe_speed") { steps.emplace_back(posPerimeters); } else if (opt_key == "gap_infill_speed" diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 61a30e9bcc..015630f257 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -1837,7 +1837,8 @@ void TabPrint::build() optgroup->append_single_option_line("seam_position", "Seam"); optgroup->append_single_option_line("seam_gap","Seam"); optgroup->append_single_option_line("role_based_wipe_speed","Seam"); - optgroup->append_single_option_line("wipe_speed","Seam"); + optgroup->append_single_option_line("wipe_speed", "Seam"); + optgroup->append_single_option_line("wipe_on_loops","Seam"); optgroup = page->new_optgroup(L("Precision"), L"param_precision");