mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-10 08:17:51 -06:00
Add option to "Reverse only internal perimeters" under the reverse on odd feature to reduce part warping (#2722)
This commit is contained in:
parent
e9f519d092
commit
cd475f0f94
7 changed files with 100 additions and 71 deletions
|
@ -1404,7 +1404,7 @@ void PerimeterGenerator::apply_extra_perimeters(ExPolygons &infill_area)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reorient loop direction
|
// Reorient loop direction
|
||||||
static void reorient_perimeters(ExtrusionEntityCollection &entities, bool steep_overhang_contour, bool steep_overhang_hole)
|
static void reorient_perimeters(ExtrusionEntityCollection &entities, bool steep_overhang_contour, bool steep_overhang_hole, bool reverse_internal_only)
|
||||||
{
|
{
|
||||||
if (steep_overhang_hole || steep_overhang_contour) {
|
if (steep_overhang_hole || steep_overhang_contour) {
|
||||||
for (auto entity : entities) {
|
for (auto entity : entities) {
|
||||||
|
@ -1412,7 +1412,18 @@ static void reorient_perimeters(ExtrusionEntityCollection &entities, bool steep_
|
||||||
ExtrusionLoop *eloop = static_cast<ExtrusionLoop *>(entity);
|
ExtrusionLoop *eloop = static_cast<ExtrusionLoop *>(entity);
|
||||||
// Only reverse when needed
|
// Only reverse when needed
|
||||||
bool need_reverse = ((eloop->loop_role() & elrHole) == elrHole) ? steep_overhang_hole : steep_overhang_contour;
|
bool need_reverse = ((eloop->loop_role() & elrHole) == elrHole) ? steep_overhang_hole : steep_overhang_contour;
|
||||||
if (need_reverse) {
|
|
||||||
|
bool isExternal = false;
|
||||||
|
if(reverse_internal_only){
|
||||||
|
for(auto path : eloop->paths){
|
||||||
|
if(path.role() == erExternalPerimeter){
|
||||||
|
isExternal = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (need_reverse && !isExternal) {
|
||||||
eloop->make_clockwise();
|
eloop->make_clockwise();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1710,7 +1721,7 @@ void PerimeterGenerator::process_classic()
|
||||||
bool steep_overhang_contour = false;
|
bool steep_overhang_contour = false;
|
||||||
bool steep_overhang_hole = false;
|
bool steep_overhang_hole = false;
|
||||||
ExtrusionEntityCollection entities = traverse_loops(*this, contours.front(), thin_walls, steep_overhang_contour, steep_overhang_hole);
|
ExtrusionEntityCollection entities = traverse_loops(*this, contours.front(), thin_walls, steep_overhang_contour, steep_overhang_hole);
|
||||||
reorient_perimeters(entities, steep_overhang_contour, steep_overhang_hole);
|
reorient_perimeters(entities, steep_overhang_contour, steep_overhang_hole, this->config->overhang_reverse_internal_only);
|
||||||
|
|
||||||
// if brim will be printed, reverse the order of perimeters so that
|
// if brim will be printed, reverse the order of perimeters so that
|
||||||
// we continue inwards after having finished the brim
|
// we continue inwards after having finished the brim
|
||||||
|
@ -2232,7 +2243,7 @@ void PerimeterGenerator::process_arachne()
|
||||||
bool steep_overhang_contour = false;
|
bool steep_overhang_contour = false;
|
||||||
bool steep_overhang_hole = false;
|
bool steep_overhang_hole = false;
|
||||||
if (ExtrusionEntityCollection extrusion_coll = traverse_extrusions(*this, ordered_extrusions, steep_overhang_contour, steep_overhang_hole); !extrusion_coll.empty()) {
|
if (ExtrusionEntityCollection extrusion_coll = traverse_extrusions(*this, ordered_extrusions, steep_overhang_contour, steep_overhang_hole); !extrusion_coll.empty()) {
|
||||||
reorient_perimeters(extrusion_coll, steep_overhang_contour, steep_overhang_hole);
|
reorient_perimeters(extrusion_coll, steep_overhang_contour, steep_overhang_hole, this->config->overhang_reverse_internal_only);
|
||||||
this->loops->append(extrusion_coll);
|
this->loops->append(extrusion_coll);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -726,7 +726,7 @@ bool Preset::has_cali_lines(PresetBundle* preset_bundle)
|
||||||
static std::vector<std::string> s_Preset_print_options {
|
static std::vector<std::string> s_Preset_print_options {
|
||||||
"layer_height", "initial_layer_print_height", "wall_loops", "slice_closing_radius", "spiral_mode", "slicing_mode",
|
"layer_height", "initial_layer_print_height", "wall_loops", "slice_closing_radius", "spiral_mode", "slicing_mode",
|
||||||
"top_shell_layers", "top_shell_thickness", "bottom_shell_layers", "bottom_shell_thickness",
|
"top_shell_layers", "top_shell_thickness", "bottom_shell_layers", "bottom_shell_thickness",
|
||||||
"extra_perimeters_on_overhangs", "ensure_vertical_shell_thickness", "reduce_crossing_wall", "detect_thin_wall", "detect_overhang_wall", "overhang_reverse", "overhang_reverse_threshold",
|
"extra_perimeters_on_overhangs", "ensure_vertical_shell_thickness", "reduce_crossing_wall", "detect_thin_wall", "detect_overhang_wall", "overhang_reverse", "overhang_reverse_threshold","overhang_reverse_internal_only",
|
||||||
"seam_position", "staggered_inner_seams", "wall_infill_order", "sparse_infill_density", "sparse_infill_pattern", "top_surface_pattern", "bottom_surface_pattern",
|
"seam_position", "staggered_inner_seams", "wall_infill_order", "sparse_infill_density", "sparse_infill_pattern", "top_surface_pattern", "bottom_surface_pattern",
|
||||||
"infill_direction",
|
"infill_direction",
|
||||||
"minimum_sparse_infill_area", "reduce_infill_retraction","internal_solid_infill_pattern",
|
"minimum_sparse_infill_area", "reduce_infill_retraction","internal_solid_infill_pattern",
|
||||||
|
|
|
@ -840,7 +840,15 @@ void PrintConfigDef::init_fff_params()
|
||||||
def->label = L("Reverse on odd");
|
def->label = L("Reverse on odd");
|
||||||
def->full_label = L("Overhang reversal");
|
def->full_label = L("Overhang reversal");
|
||||||
def->category = L("Quality");
|
def->category = L("Quality");
|
||||||
def->tooltip = L("Extrude perimeters that have a part over an overhang in the reverse direction on odd layers. This alternating pattern can drastically improve steep overhang.");
|
def->tooltip = L("Extrude perimeters that have a part over an overhang in the reverse direction on odd layers. This alternating pattern can drastically improve steep overhangs.\n\nThis setting can also help reduce part warping due to the reduction of stresses in the part walls.");
|
||||||
|
def->mode = comAdvanced;
|
||||||
|
def->set_default_value(new ConfigOptionBool(false));
|
||||||
|
|
||||||
|
def = this->add("overhang_reverse_internal_only", coBool);
|
||||||
|
def->label = L("Reverse only internal perimeters");
|
||||||
|
def->full_label = L("Reverse only internal perimeters");
|
||||||
|
def->category = L("Quality");
|
||||||
|
def->tooltip = L("Apply the reverse perimeters logic only on internal perimeters. \n\nThis setting greatly reduces part stresses as they are now distributed in alternating directions. This should reduce part warping while also maintaining external wall quality. This feature can be very useful for warp prone material, like ABS/ASA, and also for elastic filaments, like TPU and Silk PLA. It can also help reduce warping on floating regions over supports.\n\nFor this setting to be the most effective, it is recomended to set the Reverse Threshold to 0 so that all internal walls print in alternating directions on odd layers irrespective of their overhang degree.");
|
||||||
def->mode = comAdvanced;
|
def->mode = comAdvanced;
|
||||||
def->set_default_value(new ConfigOptionBool(false));
|
def->set_default_value(new ConfigOptionBool(false));
|
||||||
|
|
||||||
|
|
|
@ -877,6 +877,7 @@ PRINT_CONFIG_CLASS_DEFINE(
|
||||||
((ConfigOptionFloatOrPercent, hole_to_polyhole_threshold))
|
((ConfigOptionFloatOrPercent, hole_to_polyhole_threshold))
|
||||||
((ConfigOptionBool, hole_to_polyhole_twisted))
|
((ConfigOptionBool, hole_to_polyhole_twisted))
|
||||||
((ConfigOptionBool, overhang_reverse))
|
((ConfigOptionBool, overhang_reverse))
|
||||||
|
((ConfigOptionBool, overhang_reverse_internal_only))
|
||||||
((ConfigOptionFloatOrPercent, overhang_reverse_threshold))
|
((ConfigOptionFloatOrPercent, overhang_reverse_threshold))
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -1097,6 +1097,7 @@ bool PrintObject::invalidate_state_by_config_options(
|
||||||
|| opt_key == "fuzzy_skin_point_distance"
|
|| opt_key == "fuzzy_skin_point_distance"
|
||||||
|| opt_key == "detect_overhang_wall"
|
|| opt_key == "detect_overhang_wall"
|
||||||
|| opt_key == "overhang_reverse"
|
|| opt_key == "overhang_reverse"
|
||||||
|
|| opt_key == "overhang_reverse_internal_only"
|
||||||
|| opt_key == "overhang_reverse_threshold"
|
|| opt_key == "overhang_reverse_threshold"
|
||||||
//BBS
|
//BBS
|
||||||
|| opt_key == "enable_overhang_speed"
|
|| opt_key == "enable_overhang_speed"
|
||||||
|
|
|
@ -736,6 +736,13 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig *config, co
|
||||||
bool allow_overhang_reverse = has_detect_overhang_wall && !has_spiral_vase;
|
bool allow_overhang_reverse = has_detect_overhang_wall && !has_spiral_vase;
|
||||||
toggle_field("overhang_reverse", allow_overhang_reverse);
|
toggle_field("overhang_reverse", allow_overhang_reverse);
|
||||||
toggle_line("overhang_reverse_threshold", allow_overhang_reverse && has_overhang_reverse);
|
toggle_line("overhang_reverse_threshold", allow_overhang_reverse && has_overhang_reverse);
|
||||||
|
toggle_line("overhang_reverse_internal_only", allow_overhang_reverse && has_overhang_reverse);
|
||||||
|
bool has_overhang_reverse_internal_only = config->opt_bool("overhang_reverse_internal_only");
|
||||||
|
if (has_overhang_reverse_internal_only){
|
||||||
|
DynamicPrintConfig new_conf = *config;
|
||||||
|
new_conf.set_key_value("overhang_reverse_threshold", new ConfigOptionFloatOrPercent(0,true));
|
||||||
|
apply(config, &new_conf);
|
||||||
|
}
|
||||||
toggle_line("timelapse_type", is_BBL_Printer);
|
toggle_line("timelapse_type", is_BBL_Printer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1911,6 +1911,7 @@ void TabPrint::build()
|
||||||
optgroup->append_single_option_line("max_travel_detour_distance");
|
optgroup->append_single_option_line("max_travel_detour_distance");
|
||||||
optgroup->append_single_option_line("extra_perimeters_on_overhangs");
|
optgroup->append_single_option_line("extra_perimeters_on_overhangs");
|
||||||
optgroup->append_single_option_line("overhang_reverse");
|
optgroup->append_single_option_line("overhang_reverse");
|
||||||
|
optgroup->append_single_option_line("overhang_reverse_internal_only");
|
||||||
optgroup->append_single_option_line("overhang_reverse_threshold");
|
optgroup->append_single_option_line("overhang_reverse_threshold");
|
||||||
|
|
||||||
page = add_options_page(L("Strength"), "empty");
|
page = add_options_page(L("Strength"), "empty");
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue