diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index e988cb324a..18aa8fdf55 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -3538,7 +3538,19 @@ std::string GCode::generate_skirt(const Print &print, m_avoid_crossing_perimeters.use_external_mp(); Flow layer_skirt_flow = print.skirt_flow().with_height(float(m_skirt_done.back() - (m_skirt_done.size() == 1 ? 0. : m_skirt_done[m_skirt_done.size() - 2]))); double mm3_per_mm = layer_skirt_flow.mm3_per_mm(); - for (size_t i = first_layer ? loops.first : loops.second - 1; i < loops.second; ++i) { + // Decide where to start looping: + // - If it’s the first layer or if we do NOT want a single-wall draft shield, + // start from loops.first (all loops). + // - Otherwise, if single_loop_draft_shield == true and draft_shield == true (and not the first layer), + // start from loops.second - 1 (just one loop). + bool single_loop_draft_shield = print.m_config.single_loop_draft_shield && + (print.m_config.draft_shield == dsEnabled); + const size_t start_idx = (first_layer || !single_loop_draft_shield) + ? loops.first + : (loops.second - 1); + + // Loop over the skirt loops and extrude + for (size_t i = start_idx; i < loops.second; ++i) { // Adjust flow according to this layer's layer height. ExtrusionLoop loop = *dynamic_cast(skirt.entities[i]); for (ExtrusionPath &path : loop.paths) { @@ -3552,8 +3564,10 @@ std::string GCode::generate_skirt(const Print &print, //FIXME using the support_speed of the 1st object printed. gcode += this->extrude_loop(loop, "skirt", m_config.support_speed.value); - if (!first_layer) + // If we only want a single wall on non-first layers, break now + if (!first_layer && single_loop_draft_shield) { break; + } } m_avoid_crossing_perimeters.use_external_mp(false); // Allow a straight travel move to the first object point if this is the first layer (but don't in next layers). @@ -4583,8 +4597,8 @@ std::string GCode::extrude_loop(ExtrusionLoop loop, std::string description, dou // if spiral vase, we have to ensure that all contour are in the same orientation. loop.make_counter_clockwise(); } - if (loop.loop_role() == elrSkirt && (this->m_layer->id() % 2 == 1)) - loop.reverse(); + //if (loop.loop_role() == elrSkirt && (this->m_layer->id() % 2 == 1)) + // loop.reverse(); // find the point of the loop that is closest to the current extruder position // or randomize if requested diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index c8014c7fb5..3660d85db0 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -796,7 +796,7 @@ static std::vector s_Preset_print_options { "inner_wall_speed", "outer_wall_speed", "sparse_infill_speed", "internal_solid_infill_speed", "top_surface_speed", "support_speed", "support_object_xy_distance", "support_object_first_layer_gap", "support_interface_speed", "bridge_speed", "internal_bridge_speed", "gap_infill_speed", "travel_speed", "travel_speed_z", "initial_layer_speed", - "outer_wall_acceleration", "initial_layer_acceleration", "top_surface_acceleration", "default_acceleration", "skirt_type", "skirt_loops", "skirt_speed","min_skirt_length", "skirt_distance", "skirt_start_angle", "skirt_height", "draft_shield", + "outer_wall_acceleration", "initial_layer_acceleration", "top_surface_acceleration", "default_acceleration", "skirt_type", "skirt_loops", "skirt_speed","min_skirt_length", "skirt_distance", "skirt_start_angle", "skirt_height","single_loop_draft_shield", "draft_shield", "brim_width", "brim_object_gap", "brim_type", "brim_ears_max_angle", "brim_ears_detection_length", "enable_support", "support_type", "support_threshold_angle", "support_threshold_overlap","enforce_support_layers", "raft_layers", "raft_first_layer_density", "raft_first_layer_expansion", "raft_contact_distance", "raft_expansion", "support_base_pattern", "support_base_pattern_spacing", "support_expansion", "support_style", diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index da7c88cfc8..59c0fce4b2 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -228,6 +228,7 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver & /* n || opt_key == "skirt_speed" || opt_key == "skirt_height" || opt_key == "min_skirt_length" + || opt_key == "single_loop_draft_shield" || opt_key == "draft_shield" || opt_key == "skirt_distance" || opt_key == "skirt_start_angle" diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index e9320cad37..37b85b4fee 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -4288,6 +4288,12 @@ void PrintConfigDef::init_fff_params() def->mode = comSimple; def->max = 10000; def->set_default_value(new ConfigOptionInt(1)); + + def = this->add("single_loop_draft_shield", coBool); + def->label = L("Single loop draft shield"); + def->tooltip = L("Limits the draft shield loops to one wall after the first layer. This is useful, on occasion, to conserve filament but may cause the draft shield to warp / crack."); + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionBool(false)); def = this->add("draft_shield", coEnum); def->label = L("Draft shield"); diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index a6c6fffd0e..1e37aec5f1 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -1286,6 +1286,7 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( ((ConfigOptionInt, skirt_loops)) ((ConfigOptionEnum, skirt_type)) ((ConfigOptionFloat, skirt_speed)) + ((ConfigOptionBool, single_loop_draft_shield)) ((ConfigOptionFloat, min_skirt_length)) ((ConfigOptionFloats, slow_down_layer_time)) ((ConfigOptionBool, spiral_mode)) diff --git a/src/slic3r/GUI/ConfigManipulation.cpp b/src/slic3r/GUI/ConfigManipulation.cpp index 21928f9650..a62f37c437 100644 --- a/src/slic3r/GUI/ConfigManipulation.cpp +++ b/src/slic3r/GUI/ConfigManipulation.cpp @@ -565,8 +565,9 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig *config, co bool have_skirt = config->opt_int("skirt_loops") > 0; toggle_field("skirt_height", have_skirt && config->opt_enum("draft_shield") != dsEnabled); - for (auto el : {"skirt_type", "skirt_distance", "skirt_start_angle", "draft_shield"}) - toggle_field(el, have_skirt); + toggle_line("single_loop_draft_shield", have_skirt && config->opt_enum("draft_shield") == dsEnabled); // ORCA: Display one wall draft shield if draft shield is enabled and skirt enabled + for (auto el : {"skirt_type","min_skirt_length", "skirt_distance", "skirt_start_angle","skirt_height","skirt_speed", "draft_shield", "single_loop_draft_shield"}) + toggle_field(el, have_skirt); bool have_brim = (config->opt_enum("brim_type") != btNoBrim); toggle_field("brim_object_gap", have_brim); diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index d7452465c2..d9a3567173 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -2310,6 +2310,7 @@ page = add_options_page(L("Others"), "custom-gcode_other"); // ORCA: icon only v optgroup->append_single_option_line("skirt_height"); optgroup->append_single_option_line("skirt_speed"); optgroup->append_single_option_line("draft_shield"); + optgroup->append_single_option_line("single_loop_draft_shield"); optgroup = page->new_optgroup(L("Brim"), L"param_adhension"); optgroup->append_single_option_line("brim_type", "auto-brim");