diff --git a/resources/ui_layout/print.ui b/resources/ui_layout/print.ui index a91d2cbfb..a5ea9904e 100644 --- a/resources/ui_layout/print.ui +++ b/resources/ui_layout/print.ui @@ -22,7 +22,10 @@ group:Quality (slower slicing) end_line setting:only_one_perimeter_top setting:ensure_vertical_shell_thickness - setting:avoid_crossing_perimeters + line:Avoid crossing perimeters + setting:label$:avoid_crossing_perimeters + setting:label$not on first layer:avoid_crossing_not_first_layer + end_line setting:thin_perimeters line:Thin walls setting:thin_walls diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 5cfdd5f71..d5e1365db 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -3662,7 +3662,8 @@ std::string GCode::travel_to(const Point &point, ExtrusionRole role, std::string if (needs_retraction && m_config.avoid_crossing_perimeters && ! m_avoid_crossing_perimeters.disable_once - && m_avoid_crossing_perimeters.is_init()) { + && m_avoid_crossing_perimeters.is_init() + && !(m_config.avoid_crossing_not_first_layer && this->on_first_layer())) { travel = m_avoid_crossing_perimeters.travel_to(*this, point); // check again whether the new travel path still needs a retraction diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 127dcf4fd..c6a2f9f1d 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -69,6 +69,7 @@ bool Print::invalidate_state_by_config_options(const std::vector steps_gcode = { "avoid_crossing_perimeters", + "avoid_crossing_not_first_layer", "bed_shape", "bed_temperature", "chamber_temperature", diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index b674ab921..00324d102 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -147,11 +147,19 @@ void PrintConfigDef::init_fff_params() def->label = L("Avoid crossing perimeters"); def->category = OptionCategory::perimeter; def->tooltip = L("Optimize travel moves in order to minimize the crossing of perimeters. " - "This is mostly useful with Bowden extruders which suffer from oozing. " - "This feature slows down both the print and the G-code generation."); + "This is mostly useful with Bowden extruders which suffer from oozing. " + "This feature slows down both the print and the G-code generation."); def->mode = comExpert; def->set_default_value(new ConfigOptionBool(false)); + def = this->add("avoid_crossing_not_first_layer", coBool); + def->label = L("Don't avoid crossing on 1st layer"); + def->full_label = L("Don't avoid crossing on 1st layer"); + def->category = OptionCategory::perimeter; + def->tooltip = L("Do not use the 'Avoid crossing perimeters' on the first layer."); + def->mode = comExpert; + def->set_default_value(new ConfigOptionBool(true)); + def = this->add("bed_temperature", coInts); def->label = L("Other layers"); def->category = OptionCategory::filament; diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index b05122773..418137017 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -953,6 +953,7 @@ public: static double min_object_distance(const ConfigBase *config); ConfigOptionBool avoid_crossing_perimeters; + ConfigOptionBool avoid_crossing_not_first_layer; ConfigOptionPoints bed_shape; ConfigOptionInts bed_temperature; ConfigOptionFloat bridge_acceleration; @@ -1033,6 +1034,7 @@ protected: this->MachineEnvelopeConfig::initialize(cache, base_ptr); this->GCodeConfig::initialize(cache, base_ptr); OPT_PTR(avoid_crossing_perimeters); + OPT_PTR(avoid_crossing_not_first_layer); OPT_PTR(bed_shape); OPT_PTR(bed_temperature); OPT_PTR(bridge_acceleration); diff --git a/src/slic3r/GUI/ConfigManipulation.cpp b/src/slic3r/GUI/ConfigManipulation.cpp index 46f8ca3fc..6959f57ad 100644 --- a/src/slic3r/GUI/ConfigManipulation.cpp +++ b/src/slic3r/GUI/ConfigManipulation.cpp @@ -309,6 +309,8 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig* config) toggle_field("gap_fill_min_area", config->opt_bool("gap_fill")); + toggle_field("avoid_crossing_not_first_layer", config->opt_bool("avoid_crossing_perimeters")); + bool have_infill = config->option("fill_density")->value > 0; // infill_extruder uses the same logic as in Print::extruders() for (auto el : { "fill_pattern", "infill_every_layers", "infill_only_where_needed", diff --git a/src/slic3r/GUI/Preset.cpp b/src/slic3r/GUI/Preset.cpp index 635a8684c..c701e3453 100644 --- a/src/slic3r/GUI/Preset.cpp +++ b/src/slic3r/GUI/Preset.cpp @@ -427,6 +427,7 @@ const std::vector& Preset::print_options() "extra_perimeters", "extra_perimeters_odd_layers", "only_one_perimeter_top", "ensure_vertical_shell_thickness", "avoid_crossing_perimeters", + "avoid_crossing_not_first_layer", "thin_perimeters", "thin_walls", "overhangs", "overhangs_width", diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index a1df6d1cb..9c47fc38e 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -1598,6 +1598,7 @@ void TabPrint::build() optgroup->append_single_option_line("only_one_perimeter_top"); optgroup->append_single_option_line("ensure_vertical_shell_thickness"); optgroup->append_single_option_line("avoid_crossing_perimeters"); + optgroup->append_single_option_line("avoid_crossing_not_first_layer"); optgroup->append_single_option_line("thin_perimeters"); line = { _(L("Thin walls")), "" }; line.append_option(optgroup->get_option("thin_walls"));