mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-07 15:07:31 -06:00
Introduce option to control one wall draft shield (#8562)
* Introduce option to control number of skirt walls after first layer * Merge branch 'main' into Introduce-option-to-control-number-of-walls-on-skirt-after-first-layer * Merge branch 'main' into Introduce-option-to-control-number-of-walls-on-skirt-after-first-layer * One wall draft shield options refactor * Merge remote-tracking branch 'upstream/main' into Introduce-option-to-control-number-of-walls-on-skirt-after-first-layer * Merge branch 'main' into Introduce-option-to-control-number-of-walls-on-skirt-after-first-layer * Renamed to single loop draft shield * Merge branch 'main' into Introduce-option-to-control-number-of-walls-on-skirt-after-first-layer * Merge branch 'main' into Introduce-option-to-control-number-of-walls-on-skirt-after-first-layer
This commit is contained in:
parent
4900c546f9
commit
ec213e98fb
7 changed files with 31 additions and 7 deletions
|
@ -3538,7 +3538,19 @@ std::string GCode::generate_skirt(const Print &print,
|
||||||
m_avoid_crossing_perimeters.use_external_mp();
|
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])));
|
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();
|
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.
|
// Adjust flow according to this layer's layer height.
|
||||||
ExtrusionLoop loop = *dynamic_cast<const ExtrusionLoop*>(skirt.entities[i]);
|
ExtrusionLoop loop = *dynamic_cast<const ExtrusionLoop*>(skirt.entities[i]);
|
||||||
for (ExtrusionPath &path : loop.paths) {
|
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.
|
//FIXME using the support_speed of the 1st object printed.
|
||||||
gcode += this->extrude_loop(loop, "skirt", m_config.support_speed.value);
|
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;
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
m_avoid_crossing_perimeters.use_external_mp(false);
|
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).
|
// 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.
|
// if spiral vase, we have to ensure that all contour are in the same orientation.
|
||||||
loop.make_counter_clockwise();
|
loop.make_counter_clockwise();
|
||||||
}
|
}
|
||||||
if (loop.loop_role() == elrSkirt && (this->m_layer->id() % 2 == 1))
|
//if (loop.loop_role() == elrSkirt && (this->m_layer->id() % 2 == 1))
|
||||||
loop.reverse();
|
// loop.reverse();
|
||||||
|
|
||||||
// find the point of the loop that is closest to the current extruder position
|
// find the point of the loop that is closest to the current extruder position
|
||||||
// or randomize if requested
|
// or randomize if requested
|
||||||
|
|
|
@ -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",
|
"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",
|
"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",
|
"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",
|
"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",
|
"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",
|
"support_base_pattern", "support_base_pattern_spacing", "support_expansion", "support_style",
|
||||||
|
|
|
@ -228,6 +228,7 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver & /* n
|
||||||
|| opt_key == "skirt_speed"
|
|| opt_key == "skirt_speed"
|
||||||
|| opt_key == "skirt_height"
|
|| opt_key == "skirt_height"
|
||||||
|| opt_key == "min_skirt_length"
|
|| opt_key == "min_skirt_length"
|
||||||
|
|| opt_key == "single_loop_draft_shield"
|
||||||
|| opt_key == "draft_shield"
|
|| opt_key == "draft_shield"
|
||||||
|| opt_key == "skirt_distance"
|
|| opt_key == "skirt_distance"
|
||||||
|| opt_key == "skirt_start_angle"
|
|| opt_key == "skirt_start_angle"
|
||||||
|
|
|
@ -4288,6 +4288,12 @@ void PrintConfigDef::init_fff_params()
|
||||||
def->mode = comSimple;
|
def->mode = comSimple;
|
||||||
def->max = 10000;
|
def->max = 10000;
|
||||||
def->set_default_value(new ConfigOptionInt(1));
|
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 = this->add("draft_shield", coEnum);
|
||||||
def->label = L("Draft shield");
|
def->label = L("Draft shield");
|
||||||
|
|
|
@ -1286,6 +1286,7 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE(
|
||||||
((ConfigOptionInt, skirt_loops))
|
((ConfigOptionInt, skirt_loops))
|
||||||
((ConfigOptionEnum<SkirtType>, skirt_type))
|
((ConfigOptionEnum<SkirtType>, skirt_type))
|
||||||
((ConfigOptionFloat, skirt_speed))
|
((ConfigOptionFloat, skirt_speed))
|
||||||
|
((ConfigOptionBool, single_loop_draft_shield))
|
||||||
((ConfigOptionFloat, min_skirt_length))
|
((ConfigOptionFloat, min_skirt_length))
|
||||||
((ConfigOptionFloats, slow_down_layer_time))
|
((ConfigOptionFloats, slow_down_layer_time))
|
||||||
((ConfigOptionBool, spiral_mode))
|
((ConfigOptionBool, spiral_mode))
|
||||||
|
|
|
@ -565,8 +565,9 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig *config, co
|
||||||
|
|
||||||
bool have_skirt = config->opt_int("skirt_loops") > 0;
|
bool have_skirt = config->opt_int("skirt_loops") > 0;
|
||||||
toggle_field("skirt_height", have_skirt && config->opt_enum<DraftShield>("draft_shield") != dsEnabled);
|
toggle_field("skirt_height", have_skirt && config->opt_enum<DraftShield>("draft_shield") != dsEnabled);
|
||||||
for (auto el : {"skirt_type", "skirt_distance", "skirt_start_angle", "draft_shield"})
|
toggle_line("single_loop_draft_shield", have_skirt && config->opt_enum<DraftShield>("draft_shield") == dsEnabled); // ORCA: Display one wall draft shield if draft shield is enabled and skirt enabled
|
||||||
toggle_field(el, have_skirt);
|
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<BrimType>("brim_type") != btNoBrim);
|
bool have_brim = (config->opt_enum<BrimType>("brim_type") != btNoBrim);
|
||||||
toggle_field("brim_object_gap", have_brim);
|
toggle_field("brim_object_gap", have_brim);
|
||||||
|
|
|
@ -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_height");
|
||||||
optgroup->append_single_option_line("skirt_speed");
|
optgroup->append_single_option_line("skirt_speed");
|
||||||
optgroup->append_single_option_line("draft_shield");
|
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 = page->new_optgroup(L("Brim"), L"param_adhension");
|
||||||
optgroup->append_single_option_line("brim_type", "auto-brim");
|
optgroup->append_single_option_line("brim_type", "auto-brim");
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue