diff options
author | supermerill <merill@free.fr> | 2022-04-28 20:34:16 +0300 |
---|---|---|
committer | supermerill <merill@free.fr> | 2022-04-28 20:19:52 +0300 |
commit | 70440275ee45129092c3204979fc4d9c6e99582a (patch) | |
tree | 0926e3309ea65f3bfb393150f3a81a49d4f6c220 /src | |
parent | 9ce3075435e29c0a97cb4210681336142dcdaefe (diff) |
Add gap_fill_flow_match_perimeter : allow to slow gapfill if the flow is too high
supermerill/SuperSlicer#1275
Diffstat (limited to 'src')
-rw-r--r-- | src/libslic3r/GCode.cpp | 31 | ||||
-rw-r--r-- | src/libslic3r/GCode.hpp | 1 | ||||
-rw-r--r-- | src/libslic3r/Layer.cpp | 1 | ||||
-rw-r--r-- | src/libslic3r/Preset.cpp | 1 | ||||
-rw-r--r-- | src/libslic3r/Print.cpp | 1 | ||||
-rw-r--r-- | src/libslic3r/PrintConfig.cpp | 14 | ||||
-rw-r--r-- | src/libslic3r/PrintConfig.hpp | 1 |
7 files changed, 42 insertions, 8 deletions
diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index da3925dbc..3ff4b3317 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -4249,7 +4249,7 @@ std::string GCode::extrude_perimeters(const Print &print, const std::vector<Obje std::string gcode; for (const ObjectByExtruder::Island::Region ®ion : by_region) if (! region.perimeters.empty()) { - + m_region = &print.get_print_region(®ion - &by_region.front()); // plan_perimeters tries to place seams, it needs to have the lower_layer_edge_grid calculated already. if (m_layer->lower_layer && ! lower_layer_edge_grid) @@ -4260,8 +4260,8 @@ std::string GCode::extrude_perimeters(const Print &print, const std::vector<Obje this->last_pos(), EXTRUDER_CONFIG_WITH_DEFAULT(nozzle_diameter, 0.4), (m_layer == NULL ? nullptr : m_layer->object()), m_print_object_instance_id, (lower_layer_edge_grid ? lower_layer_edge_grid.get() : nullptr)); - m_config.apply(print.get_print_region(®ion - &by_region.front()).config()); - m_writer.apply_print_region_config(print.get_print_region(®ion - &by_region.front()).config()); + m_config.apply(m_region->config()); + m_writer.apply_print_region_config(m_region->config()); if (m_config.print_temperature > 0) gcode += m_writer.set_temperature(m_config.print_temperature.value, false, m_writer.tool()->id()); else if (m_layer != nullptr && m_layer->bottom_z() < EPSILON && m_config.first_layer_temperature.get_at(m_writer.tool()->id()) > 0) @@ -4270,6 +4270,7 @@ std::string GCode::extrude_perimeters(const Print &print, const std::vector<Obje gcode += m_writer.set_temperature(m_config.temperature.get_at(m_writer.tool()->id()), false, m_writer.tool()->id()); for (const ExtrusionEntity *ee : region.perimeters) gcode += this->extrude_entity(*ee, "", -1., &lower_layer_edge_grid); + m_region = nullptr; } return gcode; } @@ -4279,10 +4280,11 @@ std::string GCode::extrude_infill(const Print& print, const std::vector<ObjectBy { std::string gcode; for (const ObjectByExtruder::Island::Region& region : by_region) { + m_region = &print.get_print_region(®ion - &by_region.front()); if (!region.infills.empty() && - (print.get_print_region(®ion - &by_region.front()).config().infill_first == is_infill_first)) { - m_config.apply(print.get_print_region(®ion - &by_region.front()).config()); - m_writer.apply_print_region_config(print.get_print_region(®ion - &by_region.front()).config()); + (m_region->config().infill_first == is_infill_first)) { + m_config.apply(m_region->config()); + m_writer.apply_print_region_config(m_region->config()); if (m_config.print_temperature > 0) gcode += m_writer.set_temperature(m_config.print_temperature.value, false, m_writer.tool()->id()); else if (m_layer != nullptr && m_layer->bottom_z() < EPSILON && m_config.first_layer_temperature.get_at(m_writer.tool()->id()) > 0) @@ -4295,6 +4297,7 @@ std::string GCode::extrude_infill(const Print& print, const std::vector<ObjectBy gcode += extrude_entity(*fill, ""); } } + m_region = nullptr; } return gcode; } @@ -4305,8 +4308,9 @@ std::string GCode::extrude_ironing(const Print& print, const std::vector<ObjectB std::string gcode; for (const ObjectByExtruder::Island::Region& region : by_region) { if (!region.ironings.empty()) { - m_config.apply(print.get_print_region(®ion - &by_region.front()).config()); - m_writer.apply_print_region_config(print.get_print_region(®ion - &by_region.front()).config()); + m_region = &print.get_print_region(®ion - &by_region.front()); + m_config.apply(m_region->config()); + m_writer.apply_print_region_config(m_region->config()); if (m_config.print_temperature > 0) gcode += m_writer.set_temperature(m_config.print_temperature.value, false, m_writer.tool()->id()); else if (m_layer != nullptr && m_layer->bottom_z() < EPSILON && m_config.first_layer_temperature.get_at(m_writer.tool()->id()) > 0) @@ -4318,6 +4322,7 @@ std::string GCode::extrude_ironing(const Print& print, const std::vector<ObjectB for (const ExtrusionEntity* fill : extrusions) { gcode += extrude_entity(*fill, ""); } + m_region = nullptr; } } return gcode; @@ -4593,6 +4598,16 @@ double_t GCode::_compute_speed_mm_per_sec(const ExtrusionPath& path, double spee speed = m_config.get_computed_value("thin_walls_speed"); } else if (path.role() == erGapFill) { speed = m_config.get_computed_value("gap_fill_speed"); + double max_ratio = m_config.gap_fill_flow_match_perimeter.get_abs_value(1.); + if (max_ratio > 0 && m_region) { + //compute intended perimeter flow + Flow fl = m_region->flow(*m_layer->object(), FlowRole::frPerimeter, m_layer->height, m_layer->id() == 0); + double max_vol_speed = fl.mm3_per_mm() * max_ratio * m_config.get_computed_value("perimeter_speed"); + double current_vol_speed = path.mm3_per_mm * speed; + if (max_vol_speed < current_vol_speed) { + speed = max_vol_speed / path.mm3_per_mm; + } + } } else if (path.role() == erIroning) { speed = m_config.get_computed_value("ironing_speed"); } else if (path.role() == erNone) { diff --git a/src/libslic3r/GCode.hpp b/src/libslic3r/GCode.hpp index c8bfd3918..5e0a182b5 100644 --- a/src/libslic3r/GCode.hpp +++ b/src/libslic3r/GCode.hpp @@ -423,6 +423,7 @@ private: // Current layer processed. In sequential printing mode, only a single copy will be printed. // In non-sequential mode, all its copies will be printed. const Layer* m_layer; + const PrintRegion* m_region = nullptr; // m_layer is an object layer and it is being printed over raft surface. bool m_object_layer_over_raft; // idx of the current instance printed. (or the last one) uint16_t m_print_object_instance_id = -1; diff --git a/src/libslic3r/Layer.cpp b/src/libslic3r/Layer.cpp index d1fa278ff..5046bd285 100644 --- a/src/libslic3r/Layer.cpp +++ b/src/libslic3r/Layer.cpp @@ -182,6 +182,7 @@ void Layer::make_perimeters() && config.gap_fill_enabled == other_config.gap_fill_enabled && ((config.gap_fill_speed == other_config.gap_fill_speed) || !config.gap_fill_enabled) && config.gap_fill_last == other_config.gap_fill_last + && config.gap_fill_flow_match_perimeter == other_config.gap_fill_flow_match_perimeter && config.gap_fill_min_area == other_config.gap_fill_min_area && config.gap_fill_overlap == other_config.gap_fill_overlap && config.infill_dense == other_config.infill_dense diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 8bfacbde2..09cdf5776 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -530,6 +530,7 @@ static std::vector<std::string> s_Preset_print_options { "max_volumetric_speed", // gapfill "gap_fill_enabled", + "gap_fill_flow_match_perimeter", "gap_fill_last", "gap_fill_min_area", "gap_fill_overlap", diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index e009e3c4f..a5131d091 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -115,6 +115,7 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver& /* ne "first_layer_min_speed", "full_fan_speed_layer", "gap_fill_acceleration", + "gap_fill_flow_match_perimeter", "gap_fill_speed", "gcode_comments", "gcode_filename_illegal_char", diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 2926879a8..ba62159db 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -2575,6 +2575,18 @@ void PrintConfigDef::init_fff_params() def->mode = comExpert | comSuSi; def->set_default_value(new ConfigOptionFloatOrPercent(0,false)); + def = this->add("gap_fill_flow_match_perimeter", coPercent); + def->label = L("Cap with perimeter flow"); + def->full_label = L("Cap gapfill speed with perimeter flow"); + def->category = OptionCategory::output; + def->tooltip = L("A percentage of the perimeter flow (mm3/s) is used as a limit for the gap fill flow, and so the gapfill may reduce its speed when the gap fill extrusions became too thick." + " This allow you to use a high gapfill speed, to print the thin gapfill quickly and reduce the difference in flow rate for the gapfill." + "\nSet zero to deactivate."); + def->sidetext = L("%"); + def->min = 0; + def->mode = comExpert | comSuSi; + def->set_default_value(new ConfigOptionPercent(0)); + def = this->add("gap_fill_last", coBool); def->label = L("after last perimeter"); def->full_label = L("Gapfill after last perimeter"); @@ -7149,6 +7161,8 @@ std::unordered_set<std::string> prusa_export_to_remove_keys = { "first_layer_min_speed", "first_layer_size_compensation_layers", "gap_fill_acceleration", +"gap_fill_flow_match_perimeter", +"gap_fill_last", "gap_fill_infill", "gap_fill_min_area", "gap_fill_overlap", diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 53918b7fa..59fe47f92 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -809,6 +809,7 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionPercent, fill_smooth_distribution)) ((ConfigOptionFloatOrPercent, fill_smooth_width)) ((ConfigOptionBool, gap_fill_enabled)) + ((ConfigOptionPercent, gap_fill_flow_match_perimeter)) ((ConfigOptionBool, gap_fill_last)) ((ConfigOptionFloatOrPercent, gap_fill_min_area)) ((ConfigOptionPercent, gap_fill_overlap)) |