Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Calculate extrusion width %s as a function of nozzle width, not layer height #1578

Merged
merged 10 commits into from
Jul 27, 2023
Prev Previous commit
Next Next commit
even more more extrusion % handling
  • Loading branch information
iFallUpHill committed Jul 23, 2023
commit e9b2d9820102b065f815d4981506b2d283f1b5b0
8 changes: 5 additions & 3 deletions src/libslic3r/GCode.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1783,11 +1783,13 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato

//BBS: calculate the volumetric speed of outer wall. Ignore pre-object setting and multi-filament, and just use the default setting
{

float filament_max_volumetric_speed = m_config.option<ConfigOptionFloats>("filament_max_volumetric_speed")->get_at(initial_non_support_extruder_id);
float outer_wall_line_width = print.default_region_config().outer_wall_line_width.value;
const double nozzle_diameter = m_config.nozzle_diameter.get_at(initial_non_support_extruder_id);
float outer_wall_line_width = this->config().get_abs_value("outer_wall_line_width", nozzle_diameter);
if (outer_wall_line_width == 0.0) {
float default_line_width = print.default_object_config().line_width.value;
outer_wall_line_width = default_line_width == 0.0 ? m_config.nozzle_diameter.get_at(initial_non_support_extruder_id) : default_line_width;
float default_line_width = this->config().get_abs_value("line_width", nozzle_diameter);
outer_wall_line_width = default_line_width == 0.0 ? nozzle_diameter : default_line_width;
}
Flow outer_wall_flow = Flow(outer_wall_line_width, m_config.layer_height, m_config.nozzle_diameter.get_at(initial_non_support_extruder_id));
float outer_wall_speed = print.default_region_config().outer_wall_speed.value;
Expand Down
7 changes: 3 additions & 4 deletions src/libslic3r/GCode/ToolOrdering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -282,11 +282,10 @@ std::vector<unsigned int> ToolOrdering::generate_first_layer_tool_order(const Pr
for (auto layerm : first_layer->regions()) {
int extruder_id = layerm->region().config().option("wall_filament")->getInt();
for (auto expoly : layerm->raw_slices) {
// TODO for extrusion width PR
volatile const double nozzle_diameter = object.print()->config().nozzle_diameter.get_at(0);
volatile const coordf_t line_width = object.config().get_abs_value("line_width", nozzle_diameter);
const double nozzle_diameter = object.print()->config().nozzle_diameter.get_at(0);
const coordf_t line_width = object.config().get_abs_value("line_width", nozzle_diameter);

if (offset_ex(expoly, -0.2 * scale_(object.config().line_width)).empty())
if (offset_ex(expoly, -0.2 * scale_(line_width)).empty())
continue;

double contour_area = expoly.contour.area();
Expand Down
7 changes: 4 additions & 3 deletions src/libslic3r/MultiMaterialSegmentation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1545,7 +1545,7 @@ static inline std::vector<std::vector<ExPolygons>> mmu_segmentation_top_and_bott
//BBS: spacing according to width and layer height
float extrusion_spacing{ 0.f };
};
auto layer_color_stat = [&layers = std::as_const(layers)](const size_t layer_idx, const size_t color_idx) -> LayerColorStat {
auto layer_color_stat = [&layers = std::as_const(layers), &print_object](const size_t layer_idx, const size_t color_idx) -> LayerColorStat {
LayerColorStat out;
const Layer &layer = *layers[layer_idx];
for (const LayerRegion *region : layer.regions())
Expand All @@ -1554,7 +1554,8 @@ static inline std::vector<std::vector<ExPolygons>> mmu_segmentation_top_and_bott
// As this region may split existing regions, we collect statistics over all regions for color_idx == 0.
color_idx == 0 || config.wall_filament == int(color_idx)) {
//BBS: the extrusion line width is outer wall rather than inner wall
double outer_wall_line_width = config.get_abs_value("outer_wall_line_width");
const double nozzle_diameter = print_object.print()->config().nozzle_diameter.get_at(0);
double outer_wall_line_width = config.get_abs_value("outer_wall_line_width", nozzle_diameter);
out.extrusion_width = std::max<float>(out.extrusion_width, outer_wall_line_width);
out.top_shell_layers = std::max<int>(out.top_shell_layers, config.top_shell_layers);
out.bottom_shell_layers = std::max<int>(out.bottom_shell_layers, config.bottom_shell_layers);
Expand All @@ -1564,7 +1565,7 @@ static inline std::vector<std::vector<ExPolygons>> mmu_segmentation_top_and_bott
// Gap fill disabled. Enable two lines slightly overlapping.
outer_wall_line_width + 0.7f * Flow::rounded_rectangle_extrusion_spacing(outer_wall_line_width, float(layer.height));
out.small_region_threshold = scaled<float>(out.small_region_threshold * 0.5f);
out.extrusion_spacing = Flow::rounded_rectangle_extrusion_spacing(float(config.outer_wall_line_width), float(layer.height));
out.extrusion_spacing = Flow::rounded_rectangle_extrusion_spacing(float(outer_wall_line_width), float(layer.height));
++ out.num_regions;
}
assert(out.num_regions > 0);
Expand Down
2 changes: 2 additions & 0 deletions src/libslic3r/Print.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1306,6 +1306,7 @@ Flow Print::brim_flow() const
generation as well. */
return Flow::new_from_config_width(
frPerimeter,
// Flow::new_from_config_width takes care of the percent to value substitution
width,
(float)m_config.nozzle_diameter.get_at(m_print_regions.front()->config().wall_filament-1),
(float)this->skirt_first_layer_height());
Expand All @@ -1324,6 +1325,7 @@ Flow Print::skirt_flow() const
generation as well. */
return Flow::new_from_config_width(
frPerimeter,
// Flow::new_from_config_width takes care of the percent to value substitution
width,
(float)m_config.nozzle_diameter.get_at(m_objects.front()->config().support_filament-1),
(float)this->skirt_first_layer_height());
Expand Down
19 changes: 10 additions & 9 deletions src/libslic3r/PrintConfig.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1067,7 +1067,7 @@ void PrintConfigDef::init_fff_params()
def->max = 1000;
def->max_literal = 10;
def->mode = comAdvanced;
def->set_default_value(new ConfigOptionFloatOrPercent(0.4, false));
def->set_default_value(new ConfigOptionFloatOrPercent(0., false));

def = this->add("outer_wall_speed", coFloat);
def->label = L("Outer wall");
Expand Down Expand Up @@ -1191,9 +1191,10 @@ void PrintConfigDef::init_fff_params()
def = this->add("print_flow_ratio", coFloat);
def->label = L("Flow ratio");
def->tooltip = L("The material may have volumetric change after switching between molten state and crystalline state. "
"This setting changes all extrusion flow of this filament in gcode proportionally. "
"This setting changes the extrusion flow of this object in gcode proportionally. "
"Recommended value range is between 0.95 and 1.05. "
"Maybe you can tune this value to get nice flat surface when there has slight overflow or underflow");
"Maybe you can tune this value to get nice flat surface when there has slight overflow or underflow."
"Calculated as a % of [filament_flow_ratio] (i.e. filament_flow_ratio * print_flow_ratio = requested flow rate)");
def->mode = comAdvanced;
def->max = 2;
def->min = 0.01;
Expand Down Expand Up @@ -1652,7 +1653,7 @@ void PrintConfigDef::init_fff_params()
def->max = 1000;
def->max_literal = 10;
def->mode = comAdvanced;
def->set_default_value(new ConfigOptionFloatOrPercent(0.4, false));
def->set_default_value(new ConfigOptionFloatOrPercent(0., false));


def = this->add("initial_layer_print_height", coFloat);
Expand Down Expand Up @@ -1961,7 +1962,7 @@ void PrintConfigDef::init_fff_params()
def->max = 1000;
def->max_literal = 10;
def->mode = comAdvanced;
def->set_default_value(new ConfigOptionFloatOrPercent(0.4, false));
def->set_default_value(new ConfigOptionFloatOrPercent(0., false));

def = this->add("infill_wall_overlap", coPercent);
def->label = L("Infill/Wall overlap");
Expand Down Expand Up @@ -2396,7 +2397,7 @@ void PrintConfigDef::init_fff_params()
def->max = 1000;
def->max_literal = 10;
def->mode = comAdvanced;
def->set_default_value(new ConfigOptionFloatOrPercent(0.4, false));
def->set_default_value(new ConfigOptionFloatOrPercent(0., false));

def = this->add("inner_wall_speed", coFloat);
def->label = L("Inner wall");
Expand Down Expand Up @@ -2798,7 +2799,7 @@ void PrintConfigDef::init_fff_params()
def->max = 1000;
def->max_literal = 10;
def->mode = comAdvanced;
def->set_default_value(new ConfigOptionFloatOrPercent(0.4, false));
def->set_default_value(new ConfigOptionFloatOrPercent(0., false));

def = this->add("internal_solid_infill_speed", coFloat);
def->label = L("Internal solid infill");
Expand Down Expand Up @@ -3023,7 +3024,7 @@ void PrintConfigDef::init_fff_params()
def->max = 1000;
def->max_literal = 10;
def->mode = comAdvanced;
def->set_default_value(new ConfigOptionFloatOrPercent(0.4, false));
def->set_default_value(new ConfigOptionFloatOrPercent(0., false));

def = this->add("support_interface_loop_pattern", coBool);
def->label = L("Interface use loop pattern");
Expand Down Expand Up @@ -3349,7 +3350,7 @@ void PrintConfigDef::init_fff_params()
def->max = 1000;
def->max_literal = 10;
def->mode = comAdvanced;
def->set_default_value(new ConfigOptionFloatOrPercent(0.4, false));
def->set_default_value(new ConfigOptionFloatOrPercent(0., false));

def = this->add("top_surface_speed", coFloat);
def->label = L("Top surface");
Expand Down
13 changes: 8 additions & 5 deletions src/libslic3r/PrintObject.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -423,8 +423,10 @@ static const float g_min_overhang_percent_for_lift = 0.3f;
void PrintObject::detect_overhangs_for_lift()
{
if (this->set_started(posDetectOverhangsForLift)) {
// TODO for extrusion width PR
const float min_overlap = m_config.line_width * g_min_overhang_percent_for_lift;
const double nozzle_diameter = m_print->config().nozzle_diameter.get_at(0);
const coordf_t line_width = this->config().get_abs_value("line_width", nozzle_diameter);

const float min_overlap = line_width * g_min_overhang_percent_for_lift;
size_t num_layers = this->layer_count();
size_t num_raft_layers = m_slicing_params.raft_layers();

Expand All @@ -434,14 +436,14 @@ void PrintObject::detect_overhangs_for_lift()

tbb::spin_mutex layer_storage_mutex;
tbb::parallel_for(tbb::blocked_range<size_t>(num_raft_layers + 1, num_layers),
[this, min_overlap](const tbb::blocked_range<size_t>& range)
[this, min_overlap, line_width](const tbb::blocked_range<size_t>& range)
{
for (size_t layer_id = range.begin(); layer_id < range.end(); ++layer_id) {
Layer& layer = *m_layers[layer_id];
Layer& lower_layer = *layer.lower_layer;

ExPolygons overhangs = diff_ex(layer.lslices, offset_ex(lower_layer.lslices, scale_(min_overlap)));
layer.loverhangs = std::move(offset2_ex(overhangs, -0.1f * scale_(m_config.line_width), 0.1f * scale_(m_config.line_width)));
layer.loverhangs = std::move(offset2_ex(overhangs, -0.1f * scale_(line_width), 0.1f * scale_(line_width)));
}
});

Expand Down Expand Up @@ -2592,7 +2594,8 @@ SupportNecessaryType PrintObject::is_support_necessary()
#if 0
double threshold_rad = (m_config.support_threshold_angle.value < EPSILON ? 30 : m_config.support_threshold_angle.value + 1) * M_PI / 180.;
int enforce_support_layers = m_config.enforce_support_layers;
const coordf_t extrusion_width = m_config.get_abs_value("line_width");
// not fixing in extrusion width % PR b/c never called
const coordf_t extrusion_width = m_config.line_width.value;
const coordf_t extrusion_width_scaled = scale_(extrusion_width);
float max_bridge_length = scale_(m_config.max_bridge_length.value);
const bool bridge_no_support = max_bridge_length > 0;// config.bridge_no_support.value;
Expand Down