experimental feature: external perimeter overlap.

Have to test it, it may decrease printing quality (like printing external perimeter first)
This commit is contained in:
supermerill 2020-05-28 18:07:12 +02:00
parent ffec4ee330
commit d0a8bdebe8
5 changed files with 30 additions and 4 deletions

View File

@ -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

View File

@ -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))

View File

@ -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");

View File

@ -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);

View File

@ -529,7 +529,8 @@ const std::vector<std::string>& 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;
}