Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Introduce option to control whether one or multiple skirt walls after first layer are extruded #8562

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 17 additions & 4 deletions src/libslic3r/GCode.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3538,7 +3538,18 @@ 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 one_wall_draft_shield == true (and not the first layer),
// start from loops.second - 1 (just one loop).
bool one_wall_draft_shield = print.m_config.one_wall_draft_shield;
const size_t start_idx = (first_layer || !one_wall_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<const ExtrusionLoop*>(skirt.entities[i]);
for (ExtrusionPath &path : loop.paths) {
Expand All @@ -3552,8 +3563,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 && one_wall_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).
Expand Down Expand Up @@ -4583,8 +4596,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
Expand Down
2 changes: 1 addition & 1 deletion src/libslic3r/Preset.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -796,7 +796,7 @@ static std::vector<std::string> 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","one_wall_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",
Expand Down
1 change: 1 addition & 0 deletions src/libslic3r/Print.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 == "one_wall_draft_shield"
|| opt_key == "draft_shield"
|| opt_key == "skirt_distance"
|| opt_key == "skirt_start_angle"
Expand Down
6 changes: 6 additions & 0 deletions src/libslic3r/PrintConfig.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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("one_wall_draft_shield", coBool);
def->label = L("One wall skirt after first layer");
def->tooltip = L("Limits the skirt loops to one wall after the first skirt layer. This is useful, on occasion, to conserve filament when using a draft shield.");
def->mode = comAdvanced;
def->set_default_value(new ConfigOptionBool(false));

def = this->add("draft_shield", coEnum);
def->label = L("Draft shield");
Expand Down
1 change: 1 addition & 0 deletions src/libslic3r/PrintConfig.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -1286,6 +1286,7 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE(
((ConfigOptionInt, skirt_loops))
((ConfigOptionEnum<SkirtType>, skirt_type))
((ConfigOptionFloat, skirt_speed))
((ConfigOptionBool, one_wall_draft_shield))
((ConfigOptionFloat, min_skirt_length))
((ConfigOptionFloats, slow_down_layer_time))
((ConfigOptionBool, spiral_mode))
Expand Down
1 change: 1 addition & 0 deletions src/slic3r/GUI/Tab.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2308,6 +2308,7 @@ page = add_options_page(L("Others"), "custom-gcode_other"); // ORCA: icon only v
optgroup->append_single_option_line("skirt_distance");
optgroup->append_single_option_line("skirt_start_angle");
optgroup->append_single_option_line("skirt_height");
optgroup->append_single_option_line("one_wall_draft_shield");
optgroup->append_single_option_line("skirt_speed");
optgroup->append_single_option_line("draft_shield");

Expand Down
Loading