diff --git a/resources/ui_layout/print.ui b/resources/ui_layout/print.ui index d2767c952..d4fa0b803 100644 --- a/resources/ui_layout/print.ui +++ b/resources/ui_layout/print.ui @@ -228,6 +228,7 @@ group:Extrusion width group:Overlap setting:infill_overlap setting:bridge_overlap + setting:external_perimeter_overlap group:Flow line:Flow ratio setting:bridge_flow_ratio diff --git a/src/libslic3r/PerimeterGenerator.cpp b/src/libslic3r/PerimeterGenerator.cpp index eb8bf425e..ecdd90e38 100644 --- a/src/libslic3r/PerimeterGenerator.cpp +++ b/src/libslic3r/PerimeterGenerator.cpp @@ -39,13 +39,23 @@ void PerimeterGenerator::process() // other perimeters this->_mm3_per_mm = this->perimeter_flow.mm3_per_mm(); coord_t perimeter_width = this->perimeter_flow.scaled_width(); + //spacing between internal perimeters coord_t perimeter_spacing = this->perimeter_flow.scaled_spacing(); // external perimeters this->_ext_mm3_per_mm = this->ext_perimeter_flow.mm3_per_mm(); coord_t ext_perimeter_width = this->ext_perimeter_flow.scaled_width(); + //spacing between two external perimeter (where you don't have the space to add other loops) coord_t ext_perimeter_spacing = this->ext_perimeter_flow.scaled_spacing(); + //spacing between external perimeter and the second coord_t ext_perimeter_spacing2 = this->ext_perimeter_flow.scaled_spacing(this->perimeter_flow); + //external_perimeter_overlap effect: change distance between the extrenal periemter and the other ones. + if (this->config->external_perimeter_overlap.get_abs_value(1) != 1) { + //choose between the normal spacing and "don't touch it". + ext_perimeter_spacing2 = + ext_perimeter_spacing2 * this->config->external_perimeter_overlap.get_abs_value(1) + + (ext_perimeter_width + perimeter_width) * 0.5f * (1 - this->config->external_perimeter_overlap.get_abs_value(1)); + } // overhang perimeters this->_mm3_per_mm_overhang = this->overhang_flow.mm3_per_mm(); @@ -429,11 +439,11 @@ void PerimeterGenerator::process() if (!intersection_ex(thin[0], bound).empty()) { //be sure it's not too small to extrude reliably thin[0].remove_point_too_near((coord_t)SCALED_RESOLUTION); - if (thin[0].area() > min_width*(ext_perimeter_width + ext_perimeter_spacing2)) { + if (thin[0].area() > min_width*(ext_perimeter_width + ext_perimeter_spacing)) { thins.push_back(thin[0]); bound.remove_point_too_near((coord_t)SCALED_RESOLUTION); // the maximum thickness of our thin wall area is equal to the minimum thickness of a single loop (*1.2 because of circles approx. and enlrgment from 'div') - Slic3r::MedialAxis ma{ thin[0], (coord_t)((ext_perimeter_width + ext_perimeter_spacing2)*1.2), + Slic3r::MedialAxis ma{ thin[0], (coord_t)((ext_perimeter_width + ext_perimeter_spacing)*1.2), min_width, coord_t(this->layer_height) }; ma.use_bounds(bound) .use_min_real_width((coord_t)scale_(this->ext_perimeter_flow.nozzle_diameter)) diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index d47cf960f..9823006ad 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -706,11 +706,23 @@ void PrintConfigDef::init_fff_params() def->full_label = L("Ext. peri. cut corners"); def->category = OptionCategory::width; def->tooltip = L("Activate this option to modify the flow to acknoledge that the nozzle is round and the corners will have a round shape, and so change the flow to realized that and avoid over-extrusion." - " 100% is activated, 0% is deactivated and 50% is half-activated"); + " 100% is activated, 0% is deactivated and 50% is half-activated." + "\nNote: this change the flow by ~5% over a very small distance (~nozzle diameter), so it shouldn't be noticeable unless you have a very big nozzle and a very precise printer." + "\nIt's very experimental, please report about the usefulness. It may be removed if there is no use of it."); def->sidetext = L("%"); def->mode = comExpert; def->set_default_value(new ConfigOptionPercent(0)); + def = this->add("external_perimeter_overlap", coPercent); + def->label = L("external periemter overlap"); + def->full_label = L("Ext. peri. overlap"); + def->category = OptionCategory::width; + def->tooltip = L("This perimeter allow you to reduce the overlap between the perimeters and the external one, to reduce the impact of the perimeters artifacts." + "\nIt's very experimental, please report about the usefulness. It may be removed if there is no use of it."); + def->sidetext = L("%"); + def->mode = comExpert; + def->set_default_value(new ConfigOptionPercent(100)); + def = this->add("external_perimeter_speed", coFloatOrPercent); def->label = L("External"); def->full_label = L("External perimeters speed"); diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index a9b20d4df..b12545090 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -613,6 +613,7 @@ public: ConfigOptionBool enforce_full_fill_volume; ConfigOptionFloatOrPercent external_infill_margin; ConfigOptionFloatOrPercent external_perimeter_extrusion_width; + ConfigOptionPercent external_perimeter_overlap; ConfigOptionFloatOrPercent external_perimeter_speed; ConfigOptionBool external_perimeters_first; ConfigOptionBool external_perimeters_vase; @@ -695,6 +696,7 @@ protected: OPT_PTR(enforce_full_fill_volume); OPT_PTR(external_infill_margin); OPT_PTR(external_perimeter_extrusion_width); + OPT_PTR(external_perimeter_overlap); OPT_PTR(external_perimeter_speed); OPT_PTR(external_perimeters_first); OPT_PTR(external_perimeters_vase); diff --git a/src/slic3r/GUI/Preset.cpp b/src/slic3r/GUI/Preset.cpp index 9935d8ed3..4ccd74220 100644 --- a/src/slic3r/GUI/Preset.cpp +++ b/src/slic3r/GUI/Preset.cpp @@ -529,7 +529,8 @@ const std::vector& Preset::print_options() , "curve_smoothing_angle_convex" , "curve_smoothing_angle_concave", "print_extrusion_multiplier", - "external_perimeter_cut_corners" + "external_perimeter_cut_corners", + "external_perimeter_overlap" }; return s_opts; }