From dd36d5b1eaba4b7c35d392dadcfc686a37e20cf5 Mon Sep 17 00:00:00 2001 From: Ioannis Giannakas <59056762+igiannakas@users.noreply.github.com> Date: Mon, 20 May 2024 12:04:13 +0100 Subject: [PATCH 1/4] Implemented minimum skirt extrusion length and draft shield parameter (#5356) * Implemented minimum skirt extrusion length parameter * Enabled draft shield option * Update Tab.cpp * Updated draft shield to be visible in the Advanced mode --------- Co-authored-by: SoftFever --- src/libslic3r/GCode.cpp | 14 ++++++++------ src/libslic3r/Preset.cpp | 2 +- src/libslic3r/Print.cpp | 10 ++++++---- src/libslic3r/Print.hpp | 3 ++- src/libslic3r/PrintConfig.cpp | 26 +++++++++++++++++++------- src/libslic3r/PrintConfig.hpp | 1 + src/slic3r/GUI/Plater.cpp | 2 +- src/slic3r/GUI/Tab.cpp | 7 +++++-- 8 files changed, 43 insertions(+), 22 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index f65fabe5aad..71614cda043 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -3452,13 +3452,15 @@ namespace Skirt { size_t lines_per_extruder = (n_loops + n_tools - 1) / n_tools; // BBS. Extrude skirt with first extruder if min_skirt_length is zero - const PrintConfig &config = print.config(); - if (Print::min_skirt_length < EPSILON) { + //ORCA: Always extrude skirt with first extruder, independantly of if the minimum skirt length is zero or not. The code below + // is left as a placeholder for when a multiextruder support is implemented. Then we will need to extrude the skirt loops for each extruder. + //const PrintConfig &config = print.config(); + //if (config.min_skirt_length.value < EPSILON) { skirt_loops_per_extruder_out[layer_tools.extruders.front()] = std::pair(0, n_loops); - } else { - for (size_t i = 0; i < n_loops; i += lines_per_extruder) - skirt_loops_per_extruder_out[layer_tools.extruders[i / lines_per_extruder]] = std::pair(i, std::min(i + lines_per_extruder, n_loops)); - } + //} else { + // for (size_t i = 0; i < n_loops; i += lines_per_extruder) + // skirt_loops_per_extruder_out[layer_tools.extruders[i / lines_per_extruder]] = std::pair(i, std::min(i + lines_per_extruder, n_loops)); + //} } static std::map> make_skirt_loops_per_extruder_1st_layer( diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 826358f0b13..b766a160218 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -781,7 +781,7 @@ static std::vector 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_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_loops", "skirt_speed", "skirt_distance", "skirt_height", "draft_shield", + "outer_wall_acceleration", "initial_layer_acceleration", "top_surface_acceleration", "default_acceleration", "skirt_loops", "skirt_speed","min_skirt_length", "skirt_distance", "skirt_height", "draft_shield", "brim_width", "brim_object_gap", "brim_type", "brim_ears_max_angle", "brim_ears_detection_length", "enable_support", "support_type", "support_threshold_angle", "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", diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 2522926f1e5..46918088eda 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -76,7 +76,8 @@ PrintRegion::PrintRegion(const PrintRegionConfig &config) : PrintRegion(config, PrintRegion::PrintRegion(PrintRegionConfig &&config) : PrintRegion(std::move(config), config.hash()) {} //BBS -float Print::min_skirt_length = 0; +// ORCA: Now this is a parameter +//float Print::min_skirt_length = 0; void Print::clear() { @@ -239,6 +240,7 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver & /* n opt_key == "skirt_loops" || opt_key == "skirt_speed" || opt_key == "skirt_height" + || opt_key == "min_skirt_length" || opt_key == "draft_shield" || opt_key == "skirt_distance" || opt_key == "ooze_prevention" @@ -2331,15 +2333,15 @@ void Print::_make_skirt() ))); eloop.paths.back().polyline = loop.split_at_first_point(); m_skirt.append(eloop); - if (Print::min_skirt_length > 0) { + if (m_config.min_skirt_length.value > 0) { // The skirt length is limited. Sum the total amount of filament length extruded, in mm. extruded_length[extruder_idx] += unscale(loop.length()) * extruders_e_per_mm[extruder_idx]; - if (extruded_length[extruder_idx] < Print::min_skirt_length) { + if (extruded_length[extruder_idx] < m_config.min_skirt_length.value) { // Not extruded enough yet with the current extruder. Add another loop. if (i == 1) ++ i; } else { - assert(extruded_length[extruder_idx] >= Print::min_skirt_length); + assert(extruded_length[extruder_idx] >= m_config.min_skirt_length.value); // Enough extruded with the current extruder. Extrude with the next one, // until the prescribed number of skirt loops is extruded. if (extruder_idx + 1 < extruders.size()) diff --git a/src/libslic3r/Print.hpp b/src/libslic3r/Print.hpp index f48466e575d..23a3a001591 100644 --- a/src/libslic3r/Print.hpp +++ b/src/libslic3r/Print.hpp @@ -1027,7 +1027,8 @@ class Print : public PrintBaseWithState public: //BBS: this was a print config and now seems to be useless so we move it to here - static float min_skirt_length; + // ORCA: parameter below is now back to being a user option (min_skirt_length) + //static float min_skirt_length; }; diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 29eeba5ae60..c07553503e5 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -3802,12 +3802,14 @@ def = this->add("filament_loading_speed", coFloats); def->set_default_value(new ConfigOptionInt(1)); def = this->add("draft_shield", coEnum); - //def->label = L("Draft shield"); - def->label = "Draft shield"; - //def->tooltip = L("With draft shield active, the skirt will be printed skirt_distance from the object, possibly intersecting brim.\n" - // "Enabled = skirt is as tall as the highest printed object.\n" - // "Limited = skirt is as tall as specified by skirt_height.\n" - // "This is useful to protect an ABS or ASA print from warping and detaching from print bed due to wind draft."); + def->label = L("Draft shield"); + def->tooltip = L("A draft shield is useful to protect an ABS or ASA print from warping and detaching from print bed due to wind draft. " + "It is usually needed only with open frame printers, i.e. without an enclosure. \n\n" + "Options:\n" + "Enabled = skirt is as tall as the highest printed object.\n" + "Limited = skirt is as tall as specified by skirt height.\n\n" + "Note: With the draft shield active, the skirt will be printed at skirt distance from the object. Therefore, if brims " + "are active it may intersect with them. To avoid this, increase the skirt distance value.\n"); def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); def->enum_values.push_back("disabled"); def->enum_values.push_back("limited"); @@ -3815,7 +3817,7 @@ def = this->add("filament_loading_speed", coFloats); def->enum_labels.push_back("Disabled"); def->enum_labels.push_back("Limited"); def->enum_labels.push_back("Enabled"); - def->mode = comDevelop; + def->mode = comAdvanced; def->set_default_value(new ConfigOptionEnum(dsDisabled)); def = this->add("skirt_loops", coInt); @@ -3835,6 +3837,16 @@ def = this->add("filament_loading_speed", coFloats); def->sidetext = L("mm/s"); def->mode = comAdvanced; def->set_default_value(new ConfigOptionFloat(50.0)); + + def = this->add("min_skirt_length", coFloat); + def->label = L("Skirt minimum extrusion length"); + def->full_label = L("Skirt minimum extrusion length"); + def->tooltip = L("Minimum filament extrusion length in mm when printing the skirt. Zero means this feature is disabled.\n\n" + "Using a non zero value is useful if the printer is set up to print without a prime line."); + def->min = 0; + def->sidetext = L("mm"); + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionFloat(0.0)); def = this->add("slow_down_layer_time", coFloats); def->label = L("Layer time"); diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 9d6c88a2b82..836d326e7d5 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -1215,6 +1215,7 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( ((ConfigOptionInt, skirt_height)) ((ConfigOptionInt, skirt_loops)) ((ConfigOptionFloat, skirt_speed)) + ((ConfigOptionFloat, min_skirt_length)) ((ConfigOptionFloats, slow_down_layer_time)) ((ConfigOptionBool, spiral_mode)) ((ConfigOptionBool, spiral_mode_smooth)) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 4ad01855b4d..9a7de192ff2 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -2698,7 +2698,7 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) , config(Slic3r::DynamicPrintConfig::new_from_defaults_keys({ "printable_area", "bed_exclude_area", "bed_custom_texture", "bed_custom_model", "print_sequence", "extruder_clearance_radius", "extruder_clearance_height_to_lid", "extruder_clearance_height_to_rod", - "nozzle_height", "skirt_loops", "skirt_speed", "skirt_distance", + "nozzle_height", "skirt_loops", "skirt_speed","min_skirt_length", "skirt_distance", "brim_width", "brim_object_gap", "brim_type", "nozzle_diameter", "single_extruder_multi_material", "preferred_orientation", "enable_prime_tower", "wipe_tower_x", "wipe_tower_y", "prime_tower_width", "prime_tower_brim_width", "prime_volume", "extruder_colour", "filament_colour", "material_colour", "printable_height", "printer_model", "printer_technology", diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index b9a9f139b88..0bee4aa8a07 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -2269,12 +2269,15 @@ void TabPrint::build() optgroup->append_single_option_line("tree_support_brim_width"); page = add_options_page(L("Others"), "advanced"); - optgroup = page->new_optgroup(L("Bed adhension"), L"param_adhension"); + optgroup = page->new_optgroup(L("Skirt"), L"param_adhension"); optgroup->append_single_option_line("skirt_loops"); + optgroup->append_single_option_line("min_skirt_length"); optgroup->append_single_option_line("skirt_distance"); optgroup->append_single_option_line("skirt_height"); optgroup->append_single_option_line("skirt_speed"); - //optgroup->append_single_option_line("draft_shield"); + optgroup->append_single_option_line("draft_shield"); + + optgroup = page->new_optgroup(L("Brim"), L"param_adhension"); optgroup->append_single_option_line("brim_type", "auto-brim"); optgroup->append_single_option_line("brim_width", "auto-brim#manual"); optgroup->append_single_option_line("brim_object_gap", "auto-brim#brim-object-gap"); From 79ba04515093cc7350834dd891f783123e0d2169 Mon Sep 17 00:00:00 2001 From: KrisMorr <154343071+KrisMorr@users.noreply.github.com> Date: Mon, 20 May 2024 13:06:02 +0200 Subject: [PATCH 2/4] fix_c-format->>-no-c-format (#5403) --- src/libslic3r/PrintConfig.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index c07553503e5..bdc0938511b 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -2684,6 +2684,7 @@ def = this->add("filament_loading_speed", coFloats); def = this->add("infill_wall_overlap", coPercent); def->label = L("Infill/Wall overlap"); def->category = L("Strength"); + // xgettext:no-c-format, no-boost-format def->tooltip = L("Infill area is enlarged slightly to overlap with wall for better bonding. The percentage value is relative to line width of sparse infill. Set this value to ~10-15% to minimize potential over extrusion and accumulation of material resulting in rough top surfaces."); def->sidetext = L("%"); def->ratio_over = "inner_wall_line_width"; @@ -2693,6 +2694,7 @@ def = this->add("filament_loading_speed", coFloats); def = this->add("top_bottom_infill_wall_overlap", coPercent); def->label = L("Top/Bottom solid infill/wall overlap"); def->category = L("Strength"); + // xgettext:no-c-format, no-boost-format def->tooltip = L("Top solid infill area is enlarged slightly to overlap with wall for better bonding and to minimize the appearance of pinholes where the top infill meets the walls. A value of 25-30% is a good starting point, minimising the appearance of pinholes. The percentage value is relative to line width of sparse infill"); def->sidetext = L("%"); def->ratio_over = "inner_wall_line_width"; From 5914a3a042dc86cb45ae027cd906e8e730a38c59 Mon Sep 17 00:00:00 2001 From: SoftFever Date: Mon, 20 May 2024 20:30:57 +0800 Subject: [PATCH 3/4] Revert "Fix parameters not updating on non active tabs (#5400)" This reverts commit 3f83d68e0ed7991cd41d17afff8794b19764a975. --- src/slic3r/GUI/Tab.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 0bee4aa8a07..fb422b595bd 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -1172,10 +1172,8 @@ void Tab::load_config(const DynamicPrintConfig& config) // Reload current $self->{config} (aka $self->{presets}->edited_preset->config) into the UI fields. void Tab::reload_config() { - //if (m_active_page) - // m_active_page->reload_config(); - for (auto page : m_pages) - page->reload_config(); + if (m_active_page) + m_active_page->reload_config(); } void Tab::update_mode() From f08e75efaa9297f557df74ab4ca62df4f9b1a7a7 Mon Sep 17 00:00:00 2001 From: SoftFever Date: Mon, 20 May 2024 20:31:09 +0800 Subject: [PATCH 4/4] =?UTF-8?q?Revert=20"Added=20a=20deactivate()=20functi?= =?UTF-8?q?on=20to=20Tab=20so=20when=20switching=20tabs=20it=20hides=20?= =?UTF-8?q?=E2=80=A6=20(#5386)"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 7a335590e2770679876a898f1a4a0c3dc6ddeccf. --- src/slic3r/GUI/Tab.cpp | 13 ++----------- src/slic3r/GUI/Tab.hpp | 1 - 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index fb422b595bd..cf0df73a898 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -5202,10 +5202,6 @@ bool Tab::tree_sel_change_delayed(wxCommandEvent& event) if (m_active_page == page) return false; - if (m_active_page != nullptr) { - m_active_page->deactivate(); - } - m_active_page = page; auto throw_if_canceled = std::function([this](){ @@ -5223,6 +5219,8 @@ bool Tab::tree_sel_change_delayed(wxCommandEvent& event) try { m_page_view->Freeze(); + // clear pages from the controls + clear_pages(); throw_if_canceled(); //BBS: GUI refactor @@ -5927,13 +5925,6 @@ void Page::activate(ConfigOptionMode mode, std::function throw_if_cancel #endif } -void Page::deactivate() -{ - for (auto group : m_optgroups) { - group->Hide(); - } -} - void Page::clear() { for (auto group : m_optgroups) diff --git a/src/slic3r/GUI/Tab.hpp b/src/slic3r/GUI/Tab.hpp index 71f3e3ef229..707e076aaa7 100644 --- a/src/slic3r/GUI/Tab.hpp +++ b/src/slic3r/GUI/Tab.hpp @@ -104,7 +104,6 @@ class Page// : public wxScrolledWindow void reload_config(); void update_visibility(ConfigOptionMode mode, bool update_contolls_visibility); void activate(ConfigOptionMode mode, std::function throw_if_canceled); - void deactivate(); void clear(); void msw_rescale(); void sys_color_changed();