From ce9a8d7b20b336319bec7c79554ca24192e38d94 Mon Sep 17 00:00:00 2001 From: Ioannis Giannakas <59056762+igiannakas@users.noreply.github.com> Date: Sun, 26 Nov 2023 13:43:47 +0000 Subject: [PATCH] Internal Bridge Flow rate parameter introduction (#2859) * Internal Bridge Flow rate parameter introduction * updated incorrect capitalisation * Updated parameter ordering --- src/libslic3r/Fill/Fill.cpp | 2 +- src/libslic3r/Layer.hpp | 2 +- src/libslic3r/LayerRegion.cpp | 6 ++++-- src/libslic3r/Preset.cpp | 2 +- src/libslic3r/PrintConfig.cpp | 14 ++++++++++++++ src/libslic3r/PrintConfig.hpp | 1 + src/libslic3r/PrintObject.cpp | 2 +- src/slic3r/GUI/Tab.cpp | 1 + 8 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/libslic3r/Fill/Fill.cpp b/src/libslic3r/Fill/Fill.cpp index 71de24f4364..4a6d09e0cc0 100644 --- a/src/libslic3r/Fill/Fill.cpp +++ b/src/libslic3r/Fill/Fill.cpp @@ -487,7 +487,7 @@ std::vector group_fills(const Layer &layer) params.bridge = is_bridge || Fill::use_bridge_flow(params.pattern); params.flow = params.bridge ? //BBS: always enable thick bridge for internal bridge - layerm.bridging_flow(extrusion_role, (surface.is_bridge() && !surface.is_external()) || object_config.thick_bridges) : + layerm.bridging_flow(extrusion_role, (surface.is_bridge() && !surface.is_external()) || object_config.thick_bridges, params.extrusion_role == erInternalBridgeInfill) : layerm.flow(extrusion_role, (surface.thickness == -1) ? layer.height : surface.thickness); // Calculate flow spacing for infill pattern generation. diff --git a/src/libslic3r/Layer.hpp b/src/libslic3r/Layer.hpp index 84fb520f2e3..77d30a5a953 100644 --- a/src/libslic3r/Layer.hpp +++ b/src/libslic3r/Layer.hpp @@ -72,7 +72,7 @@ public: Flow flow(FlowRole role) const; Flow flow(FlowRole role, double layer_height) const; - Flow bridging_flow(FlowRole role, bool thick_bridge = false) const; + Flow bridging_flow(FlowRole role, bool thick_bridge = false, bool internal_bridge = false) const; void slices_to_fill_surfaces_clipped(); void prepare_fill_surfaces(); diff --git a/src/libslic3r/LayerRegion.cpp b/src/libslic3r/LayerRegion.cpp index fe60a0d4b98..ff0c1736ab9 100644 --- a/src/libslic3r/LayerRegion.cpp +++ b/src/libslic3r/LayerRegion.cpp @@ -32,14 +32,16 @@ Flow LayerRegion::flow(FlowRole role, double layer_height) const return m_region->flow(*m_layer->object(), role, layer_height, m_layer->id() == 0); } -Flow LayerRegion::bridging_flow(FlowRole role, bool thick_bridge) const +Flow LayerRegion::bridging_flow(FlowRole role, bool thick_bridge, bool internal_bridge) const { const PrintRegion ®ion = this->region(); const PrintRegionConfig ®ion_config = region.config(); const PrintObject &print_object = *this->layer()->object(); Flow bridge_flow; auto nozzle_diameter = float(print_object.print()->config().nozzle_diameter.get_at(region.extruder(role) - 1)); - if (thick_bridge) { + if(internal_bridge) { // internal bridge is using the thick bridge logic with the internal bridge flow ratio + bridge_flow = Flow::bridging_flow(float(sqrt(region_config.internal_bridge_flow)) * nozzle_diameter, nozzle_diameter); + } else if (thick_bridge) { // The old Slic3r way (different from all other slicers): Use rounded extrusions. // Get the configured nozzle_diameter for the extruder associated to the flow role requested. // Here this->extruder(role) - 1 may underflow to MAX_INT, but then the get_at() will follback to zero'th element, so everything is all right. diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index c9777b3c381..ef2c9108a80 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -749,7 +749,7 @@ static std::vector s_Preset_print_options { "sparse_infill_filament", "solid_infill_filament", "support_filament", "support_interface_filament", "ooze_prevention", "standby_temperature_delta", "interface_shells", "line_width", "initial_layer_line_width", "inner_wall_line_width", "outer_wall_line_width", "sparse_infill_line_width", "internal_solid_infill_line_width", - "top_surface_line_width", "support_line_width", "infill_wall_overlap", "bridge_flow", + "top_surface_line_width", "support_line_width", "infill_wall_overlap", "bridge_flow", "internal_bridge_flow", "elefant_foot_compensation", "elefant_foot_compensation_layers", "xy_contour_compensation", "xy_hole_compensation", "resolution", "enable_prime_tower", "prime_tower_width", "prime_tower_brim_width", "prime_volume", "wipe_tower_no_sparse_layers", "compatible_printers", "compatible_printers_condition", "inherits", diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index cefc09347c9..435f94b421b 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -776,6 +776,15 @@ void PrintConfigDef::init_fff_params() def->mode = comAdvanced; def->set_default_value(new ConfigOptionFloat(1)); + def = this->add("internal_bridge_flow", coFloat); + def->label = L("Internal bridge flow"); + def->category = L("Quality"); + def->tooltip = L("This value governs the thickness of the internal bridge layer. This is the first layer over sparse infill. Decrease this value slightly (for example 0.9) to improve surface quality over sparse infill."); + def->min = 0; + def->max = 2.0; + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionFloat(1)); + def = this->add("top_solid_infill_flow_ratio", coFloat); def->label = L("Top surface flow ratio"); def->category = L("Advanced"); @@ -5710,6 +5719,11 @@ std::map validate(const FullPrintConfig &cfg, bool und if (cfg.bridge_flow <= 0) { error_message.emplace("bridge_flow", L("invalid value ") + std::to_string(cfg.bridge_flow)); } + + // --bridge-flow-ratio + if (cfg.bridge_flow <= 0) { + error_message.emplace("internal_bridge_flow", L("invalid value ") + std::to_string(cfg.internal_bridge_flow)); + } // extruder clearance if (cfg.extruder_clearance_radius <= 0) { diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 40cc7a6d628..4306fcaf98d 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -796,6 +796,7 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionFloat, bottom_shell_thickness)) ((ConfigOptionFloat, bridge_angle)) ((ConfigOptionFloat, bridge_flow)) + ((ConfigOptionFloat, internal_bridge_flow)) ((ConfigOptionFloat, bridge_speed)) ((ConfigOptionFloatOrPercent, internal_bridge_speed)) ((ConfigOptionBool, ensure_vertical_shell_thickness)) diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index 48da72f5f3f..4a58614600c 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -1106,7 +1106,7 @@ bool PrintObject::invalidate_state_by_config_options( || opt_key == "overhang_speed_classic") { steps.emplace_back(posPerimeters); steps.emplace_back(posSupportMaterial); - } else if (opt_key == "bridge_flow") { + } else if (opt_key == "bridge_flow" || opt_key == "internal_bridge_flow") { if (m_config.support_top_z_distance > 0.) { // Only invalidate due to bridging if bridging is enabled. // If later "support_top_z_distance" is modified, the complete PrintObject is invalidated anyway. diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 68a0990436c..d424dc1d348 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -1896,6 +1896,7 @@ void TabPrint::build() optgroup->append_single_option_line("wall_infill_order"); optgroup->append_single_option_line("print_flow_ratio"); optgroup->append_single_option_line("bridge_flow"); + optgroup->append_single_option_line("internal_bridge_flow"); optgroup->append_single_option_line("bridge_density"); optgroup->append_single_option_line("thick_bridges"); optgroup->append_single_option_line("top_solid_infill_flow_ratio");