Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/supermerill/SuperSlicer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--resources/ui_layout/default/print.ui8
-rw-r--r--resources/ui_layout/example/print.ui8
-rw-r--r--src/libslic3r/GCode.cpp31
-rw-r--r--src/libslic3r/GCode.hpp1
-rw-r--r--src/libslic3r/Layer.cpp1
-rw-r--r--src/libslic3r/Preset.cpp1
-rw-r--r--src/libslic3r/Print.cpp1
-rw-r--r--src/libslic3r/PrintConfig.cpp14
-rw-r--r--src/libslic3r/PrintConfig.hpp1
9 files changed, 52 insertions, 14 deletions
diff --git a/resources/ui_layout/default/print.ui b/resources/ui_layout/default/print.ui
index 7dc39af53..aff1a3976 100644
--- a/resources/ui_layout/default/print.ui
+++ b/resources/ui_layout/default/print.ui
@@ -277,8 +277,10 @@ group:label_width$8:sidetext_width$7:Speed for print moves
setting:width$4:bridge_speed
setting:width$4:bridge_speed_internal
setting:width$4:overhangs_speed
- line:Thin extrusions speed
- setting:width$4:gap_fill_speed
+ line:Gap fill speed
+ setting:width$4:label$maximum speed:gap_fill_speed
+ setting:width$4:label$Cap with:sidetext$% of perimeter flow:sidetext_width$20:gap_fill_flow_match_perimeter
+ line:Other speed
setting:width$4:thin_walls_speed
setting:width$4:ironing_speed
group:Speed for non-print moves
@@ -319,7 +321,7 @@ group:label_width$9:sidetext_width$8:Acceleration control (advanced)
setting:width$4:bridge_acceleration
setting:width$4:bridge_internal_acceleration
setting:width$4:overhangs_acceleration
- line:Thin extrusions acceleration
+ line:Other extrusions acceleration
setting:width$4:gap_fill_acceleration
setting:width$4:thin_walls_acceleration
setting:width$4:ironing_acceleration
diff --git a/resources/ui_layout/example/print.ui b/resources/ui_layout/example/print.ui
index 7dc39af53..aff1a3976 100644
--- a/resources/ui_layout/example/print.ui
+++ b/resources/ui_layout/example/print.ui
@@ -277,8 +277,10 @@ group:label_width$8:sidetext_width$7:Speed for print moves
setting:width$4:bridge_speed
setting:width$4:bridge_speed_internal
setting:width$4:overhangs_speed
- line:Thin extrusions speed
- setting:width$4:gap_fill_speed
+ line:Gap fill speed
+ setting:width$4:label$maximum speed:gap_fill_speed
+ setting:width$4:label$Cap with:sidetext$% of perimeter flow:sidetext_width$20:gap_fill_flow_match_perimeter
+ line:Other speed
setting:width$4:thin_walls_speed
setting:width$4:ironing_speed
group:Speed for non-print moves
@@ -319,7 +321,7 @@ group:label_width$9:sidetext_width$8:Acceleration control (advanced)
setting:width$4:bridge_acceleration
setting:width$4:bridge_internal_acceleration
setting:width$4:overhangs_acceleration
- line:Thin extrusions acceleration
+ line:Other extrusions acceleration
setting:width$4:gap_fill_acceleration
setting:width$4:thin_walls_acceleration
setting:width$4:ironing_acceleration
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 &region : by_region)
if (! region.perimeters.empty()) {
-
+ m_region = &print.get_print_region(&region - &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(&region - &by_region.front()).config());
- m_writer.apply_print_region_config(print.get_print_region(&region - &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(&region - &by_region.front());
if (!region.infills.empty() &&
- (print.get_print_region(&region - &by_region.front()).config().infill_first == is_infill_first)) {
- m_config.apply(print.get_print_region(&region - &by_region.front()).config());
- m_writer.apply_print_region_config(print.get_print_region(&region - &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(&region - &by_region.front()).config());
- m_writer.apply_print_region_config(print.get_print_region(&region - &by_region.front()).config());
+ m_region = &print.get_print_region(&region - &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))