From a2a2f38d4114bb11d2aa843a258186039e09d199 Mon Sep 17 00:00:00 2001 From: supermerill Date: Sat, 21 Aug 2021 20:02:48 +0200 Subject: [PATCH] setting to decide from what the skirt is drawned (objects or brim) supermerill/SuperSlicer#747 --- resources/ui_layout/print.ui | 5 ++++- src/libslic3r/Preset.cpp | 5 ++++- src/libslic3r/Print.cpp | 30 ++++++++++++++++++++------- src/libslic3r/PrintConfig.cpp | 9 ++++++++ src/libslic3r/PrintConfig.hpp | 2 ++ src/slic3r/GUI/ConfigManipulation.cpp | 2 +- src/slic3r/GUI/Plater.cpp | 2 +- 7 files changed, 44 insertions(+), 11 deletions(-) diff --git a/resources/ui_layout/print.ui b/resources/ui_layout/print.ui index e5e6298ea..981f69aad 100644 --- a/resources/ui_layout/print.ui +++ b/resources/ui_layout/print.ui @@ -174,7 +174,10 @@ group:title_width$19:Ironing post-process (This will go on top of infills and pe page:Skirt & Brim:skirt+brim group:Skirt setting:skirts - setting:skirt_distance + line:Distance + setting:skirt_distance + setting:label$from brim:sidetext$else from object:skirt_distance_from_brim + end_line setting:skirt_height setting:draft_shield setting:skirt_brim diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 2353609f8..482cdc43d 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -527,7 +527,10 @@ const std::vector& Preset::print_options() "perimeter_acceleration", "travel_acceleration", // skirt - "skirts", "skirt_distance", "skirt_height", + "skirts", + "skirt_distance", + "skirt_distance_from_brim", + "skirt_height", "skirt_brim", "skirt_extrusion_width", "min_skirt_length", diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 2eb70fa20..6b5008893 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -202,6 +202,7 @@ bool Print::invalidate_state_by_config_options(const std::vectorhas_infinite_skirt()) skirts = 1; Flow skirt_flow = this->skirt_flow(); - extra = std::max( - extra, - m_config.brim_width.value + if (m_config.skirt_distance_from_brim) + extra += m_config.brim_width.value + m_config.skirt_distance.value + skirts * skirt_flow.spacing() - + skirt_flow.width/2 - ); + + skirt_flow.width / 2; + else + extra = std::max( + extra, + m_config.brim_width.value + + m_config.skirt_distance.value + + skirts * skirt_flow.spacing() + + skirt_flow.width/2 + ); } if (extra > 0) @@ -1934,6 +1943,12 @@ void Print::_make_skirt(const PrintObjectPtrs &objects, ExtrusionEntityCollectio append(object_points, polyline.points); } } + // Include the brim. + if (config().skirt_distance_from_brim) { + for (const ExPolygon& expoly : object->m_layers[0]->lslices) + for (const Polygon& poly : offset(expoly.contour, scale_(object->config().brim_width))) + append(object_points, poly.points); + } // Repeat points for each object copy. for (const PrintInstance &instance : object->instances()) { Points copy_points = object_points; @@ -1983,7 +1998,8 @@ void Print::_make_skirt(const PrintObjectPtrs &objects, ExtrusionEntityCollectio out_first_layer.emplace(); // Initial offset of the brim inner edge from the object (possible with a support & raft). // The skirt will touch the brim if the brim is extruded. - auto distance = float(scale_(m_config.skirt_distance.value) - this->skirt_flow(extruders[extruders.size()-1]).spacing()/2.); + float distance = float(scale_(m_config.skirt_distance.value) - this->skirt_flow(extruders[extruders.size() - 1]).spacing() / 2.); + size_t lines_per_extruder = (n_skirts + extruders.size() - 1) / extruders.size(); size_t current_lines_per_extruder = n_skirts - lines_per_extruder * (extruders.size() - 1); diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 7c1448627..1f7a633d0 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -3298,6 +3298,14 @@ void PrintConfigDef::init_fff_params() def->mode = comAdvanced; def->set_default_value(new ConfigOptionFloat(6)); + def = this->add("skirt_distance_from_brim", coBool); + def->label = L("from brim"); + def->full_label = L("Skirt distance from brim"); + def->category = OptionCategory::skirtBrim; + def->tooltip = L("The distance is computed from the brim and not from the objects"); + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionBool(true)); + def = this->add("skirt_height", coInt); def->label = L("Skirt height"); def->category = OptionCategory::skirtBrim; @@ -5539,6 +5547,7 @@ void PrintConfigDef::to_prusa(t_config_option_key& opt_key, std::string& value, "seam_angle_cost", "seam_travel_cost", "skirt_brim", +"skirt_distance_from_brim", "skirt_extrusion_width", "small_perimeter_min_length", "small_perimeter_max_length", diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 8953a294a..8175e11a5 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -1331,6 +1331,7 @@ public: ConfigOptionBools retract_layer_change; ConfigOptionInt skirt_brim; ConfigOptionFloat skirt_distance; + ConfigOptionBool skirt_distance_from_brim; ConfigOptionInt skirt_height; ConfigOptionFloatOrPercent skirt_extrusion_width; ConfigOptionBool draft_shield; @@ -1429,6 +1430,7 @@ protected: OPT_PTR(retract_layer_change); OPT_PTR(skirt_brim); OPT_PTR(skirt_distance); + OPT_PTR(skirt_distance_from_brim); OPT_PTR(skirt_extrusion_width); OPT_PTR(skirt_height); OPT_PTR(draft_shield); diff --git a/src/slic3r/GUI/ConfigManipulation.cpp b/src/slic3r/GUI/ConfigManipulation.cpp index 6daccab2a..9fcf901e5 100644 --- a/src/slic3r/GUI/ConfigManipulation.cpp +++ b/src/slic3r/GUI/ConfigManipulation.cpp @@ -440,7 +440,7 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig* config) bool have_skirt = config->opt_int("skirts") > 0; toggle_field("skirt_height", have_skirt && !config->opt_bool("draft_shield")); toggle_field("skirt_width", have_skirt); - for (auto el : { "skirt_distance", "skirt_brim", "draft_shield", "min_skirt_length" }) + for (auto el : { "skirt_brim", "skirt_distance", "skirt_distance_from_brim", "draft_shield", "min_skirt_length" }) toggle_field(el, have_skirt); bool have_brim = config->opt_float("brim_width") > 0 || config->opt_float("brim_width_interior") > 0; diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 5e00f67a1..4337cb5f9 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1984,7 +1984,7 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) "first_layer_extrusion_width", "perimeter_extrusion_width", "extrusion_width", - "skirts", "skirt_brim", "skirt_distance", "skirt_height", "draft_shield", + "skirts", "skirt_brim", "skirt_distance", "skirt_distance_from_brim", "skirt_height", "draft_shield", "brim_width", "variable_layer_height", "nozzle_diameter", "single_extruder_multi_material", "wipe_tower", "wipe_tower_x", "wipe_tower_y", "wipe_tower_width", "wipe_tower_rotation_angle", "wipe_tower_brim",