diff --git a/src/libslic3r/GCode/PressureEqualizer.cpp b/src/libslic3r/GCode/PressureEqualizer.cpp index d5ddc50d91..ee101e3605 100644 --- a/src/libslic3r/GCode/PressureEqualizer.cpp +++ b/src/libslic3r/GCode/PressureEqualizer.cpp @@ -62,6 +62,7 @@ PressureEqualizer::PressureEqualizer(const Slic3r::GCodeConfig &config) : m_use_ m_max_volumetric_extrusion_rate_slope_positive = float(config.max_volumetric_extrusion_rate_slope.value) * 60.f * 60.f; m_max_volumetric_extrusion_rate_slope_negative = float(config.max_volumetric_extrusion_rate_slope.value) * 60.f * 60.f; m_max_segment_length = float(config.max_volumetric_extrusion_rate_slope_segment_length.value); + m_extrusion_rate_smoothing_external_perimeter_only = bool(config.extrusion_rate_smoothing_external_perimeter_only.value); } for (ExtrusionRateSlope &extrusion_rate_slope : m_max_volumetric_extrusion_rate_slopes) { @@ -629,7 +630,9 @@ void PressureEqualizer::adjust_volumetric_rate(const size_t fist_line_idx, const rate_end = rate_succ; // don't alter the flow rate for these extrusion types - if (!line.adjustable_flow || line.extrusion_role == ExtrusionRole::erBridgeInfill || line.extrusion_role == ExtrusionRole::erIroning) { + // Orca: Limit ERS to external perimeters and overhangs if option selected by user + if (!line.adjustable_flow || line.extrusion_role == ExtrusionRole::erBridgeInfill || line.extrusion_role == ExtrusionRole::erIroning || + (m_extrusion_rate_smoothing_external_perimeter_only && line.extrusion_role != ExtrusionRole::erOverhangPerimeter && line.extrusion_role != ExtrusionRole::erExternalPerimeter)) { rate_end = line.volumetric_extrusion_rate_end; } else if (line.volumetric_extrusion_rate_end > rate_end) { line.volumetric_extrusion_rate_end = rate_end; @@ -684,10 +687,13 @@ void PressureEqualizer::adjust_volumetric_rate(const size_t fist_line_idx, const float rate_start = feedrate_per_extrusion_role[iRole]; // don't alter the flow rate for these extrusion types - if (!line.adjustable_flow || line.extrusion_role == ExtrusionRole::erBridgeInfill || line.extrusion_role == ExtrusionRole::erIroning) { + // Orca: Limit ERS to external perimeters and overhangs if option selected by user + if (!line.adjustable_flow || line.extrusion_role == ExtrusionRole::erBridgeInfill || line.extrusion_role == ExtrusionRole::erIroning || + (m_extrusion_rate_smoothing_external_perimeter_only && line.extrusion_role != ExtrusionRole::erOverhangPerimeter && line.extrusion_role != ExtrusionRole::erExternalPerimeter)) { rate_start = line.volumetric_extrusion_rate_start; } else if (iRole == size_t(line.extrusion_role) && rate_prec < rate_start) rate_start = rate_prec; + if (line.volumetric_extrusion_rate_start > rate_start) { line.volumetric_extrusion_rate_start = rate_start; line.max_volumetric_extrusion_rate_slope_positive = rate_slope; diff --git a/src/libslic3r/GCode/PressureEqualizer.hpp b/src/libslic3r/GCode/PressureEqualizer.hpp index 3563cdabc6..4b3159e502 100644 --- a/src/libslic3r/GCode/PressureEqualizer.hpp +++ b/src/libslic3r/GCode/PressureEqualizer.hpp @@ -83,6 +83,9 @@ private: // Maximum segment length to split a long segment if the initial and the final flow rate differ. // Smaller value means a smoother transition between two different flow rates. float m_max_segment_length; + + // Apply ERS only on external perimeters and overhangs + bool m_extrusion_rate_smoothing_external_perimeter_only; // Indicate if extrude set speed block was opened using the tag ";_EXTRUDE_SET_SPEED" // or not (not opened, or it was closed using the tag ";_EXTRUDE_END"). diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 4eb5c5e949..d6596b2fb9 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -770,7 +770,7 @@ static std::vector s_Preset_print_options { "ironing_type", "ironing_pattern", "ironing_flow", "ironing_speed", "ironing_spacing", "ironing_angle", "max_travel_detour_distance", "fuzzy_skin", "fuzzy_skin_thickness", "fuzzy_skin_point_distance", "fuzzy_skin_first_layer", - "max_volumetric_extrusion_rate_slope", "max_volumetric_extrusion_rate_slope_segment_length", + "max_volumetric_extrusion_rate_slope", "max_volumetric_extrusion_rate_slope_segment_length","extrusion_rate_smoothing_external_perimeter_only", "inner_wall_speed", "outer_wall_speed", "sparse_infill_speed", "internal_solid_infill_speed", "top_surface_speed", "support_speed", "support_object_xy_distance", "support_interface_speed", "bridge_speed", "internal_bridge_speed", "gap_infill_speed", "travel_speed", "travel_speed_z", "initial_layer_speed", diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index e825498bf6..31f225cfa2 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -144,6 +144,7 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver & /* n "slow_down_min_speed", "max_volumetric_extrusion_rate_slope", "max_volumetric_extrusion_rate_slope_segment_length", + "extrusion_rate_smoothing_external_perimeter_only", "reduce_infill_retraction", "filename_format", "retraction_minimum_travel", diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 2877fa7169..f7e88a0318 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -3355,6 +3355,13 @@ void PrintConfigDef::init_fff_params() def->max = 5; def->mode = comAdvanced; def->set_default_value(new ConfigOptionInt(3)); + + def = this->add("extrusion_rate_smoothing_external_perimeter_only", coBool); + def->label = L("Apply only on external features"); + def->tooltip = L("Applies extrusion rate smoothing only on external perimeters and overhangs. This can help reduce artefacts due to sharp speed transitions on externally visible " + "overhangs without impacting the print speed of features that will not be visible to the user."); + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionBool(false)); def = this->add("fan_min_speed", coFloats); def->label = L("Fan speed"); diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index ee522dab0d..a9bcfe76d0 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -1092,6 +1092,7 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionFloat, max_volumetric_extrusion_rate_slope)) ((ConfigOptionInt, max_volumetric_extrusion_rate_slope_segment_length)) + ((ConfigOptionBool, extrusion_rate_smoothing_external_perimeter_only)) ((ConfigOptionPercents, retract_before_wipe)) ((ConfigOptionFloats, retraction_length)) diff --git a/src/slic3r/GUI/ConfigManipulation.cpp b/src/slic3r/GUI/ConfigManipulation.cpp index 704fdf0dac..2c1269f12a 100644 --- a/src/slic3r/GUI/ConfigManipulation.cpp +++ b/src/slic3r/GUI/ConfigManipulation.cpp @@ -497,6 +497,7 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig *config, co int have_volumetric_extrusion_rate_slope_segment_length = config->option("max_volumetric_extrusion_rate_slope_segment_length")->value; toggle_field("enable_arc_fitting", !have_volumetric_extrusion_rate_slope); toggle_line("max_volumetric_extrusion_rate_slope_segment_length", have_volumetric_extrusion_rate_slope); + toggle_line("extrusion_rate_smoothing_external_perimeter_only", have_volumetric_extrusion_rate_slope); if(have_volumetric_extrusion_rate_slope) config->set_key_value("enable_arc_fitting", new ConfigOptionBool(false)); if(have_volumetric_extrusion_rate_slope_segment_length==0) { DynamicPrintConfig new_conf = *config; diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index e3a981287a..b86e2b75e1 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -2215,6 +2215,7 @@ void TabPrint::build() optgroup = page->new_optgroup(L("Advanced"), L"param_advanced", 15); optgroup->append_single_option_line("max_volumetric_extrusion_rate_slope", "extrusion-rate-smoothing"); optgroup->append_single_option_line("max_volumetric_extrusion_rate_slope_segment_length", "extrusion-rate-smoothing"); + optgroup->append_single_option_line("extrusion_rate_smoothing_external_perimeter_only", "extrusion-rate-smoothing"); page = add_options_page(L("Support"), "custom-gcode_support"); // ORCA: icon only visible on placeholders optgroup = page->new_optgroup(L("Support"), L"param_support");