From aab7dd32f30130f2e390e72e1833e325dc1fb58f Mon Sep 17 00:00:00 2001 From: supermerill Date: Fri, 8 Feb 2019 16:19:37 +0100 Subject: [PATCH] settings with width% is from nozzle instead of layer height. --- resources/profiles/Basic.ini | 8 ++++++++ src/libslic3r/Flow.cpp | 4 ++-- src/libslic3r/Layer.cpp | 1 + src/libslic3r/LayerRegion.cpp | 12 ++++++------ src/libslic3r/Print.cpp | 11 ++++++----- src/libslic3r/PrintConfig.cpp | 25 ++++++++++++++----------- src/libslic3r/SupportMaterial.cpp | 9 ++++----- 7 files changed, 41 insertions(+), 29 deletions(-) diff --git a/resources/profiles/Basic.ini b/resources/profiles/Basic.ini index e815b1280..902f6cf6d 100644 --- a/resources/profiles/Basic.ini +++ b/resources/profiles/Basic.ini @@ -275,6 +275,14 @@ wipe_tower_width = 60 wipe_tower_x = 180 wipe_tower_y = 140 xy_size_compensation = 0 +extrusion_width = 105% +external_perimeter_extrusion_width = 105% +first_layer_extrusion_width = 140% +infill_extrusion_width = 110% +perimeter_extrusion_width = 110% +solid_infill_extrusion_width = 110% +top_infill_extrusion_width = 110% +support_material_extrusion_width = 110% [print:*0.15nozzle*] perimeters = 6 diff --git a/src/libslic3r/Flow.cpp b/src/libslic3r/Flow.cpp index e71b935db..5ed8ec5d5 100644 --- a/src/libslic3r/Flow.cpp +++ b/src/libslic3r/Flow.cpp @@ -37,12 +37,12 @@ Flow Flow::new_from_config_width(FlowRole role, const ConfigOptionFloatOrPercent // optimization to avoid sqrt() nozzle_diameter : sqrt(bridge_flow_ratio) * nozzle_diameter; - } else if (! width.percent && width.value == 0.) { + } else if (! width.percent && width.value <= 0.) { // If user left option to 0, calculate a sane default width. w = auto_extrusion_width(role, nozzle_diameter, height); } else { // If user set a manual value, use it. - w = float(width.get_abs_value(height)); + w = float(width.get_abs_value(nozzle_diameter)); } return Flow(w, height, nozzle_diameter, bridge_flow_ratio > 0); diff --git a/src/libslic3r/Layer.cpp b/src/libslic3r/Layer.cpp index 42fc9166b..fdf4e1c0c 100644 --- a/src/libslic3r/Layer.cpp +++ b/src/libslic3r/Layer.cpp @@ -109,6 +109,7 @@ void Layer::make_perimeters() && config.gap_fill_speed == other_config.gap_fill_speed && config.overhangs == other_config.overhangs && config.serialize("perimeter_extrusion_width").compare(other_config.serialize("perimeter_extrusion_width")) == 0 + && config.serialize("external_perimeter_extrusion_width").compare(other_config.serialize("external_perimeter_extrusion_width")) == 0 && config.thin_walls == other_config.thin_walls && config.thin_walls_min_width == other_config.thin_walls_min_width && config.thin_walls_overlap == other_config.thin_walls_overlap diff --git a/src/libslic3r/LayerRegion.cpp b/src/libslic3r/LayerRegion.cpp index 7eaae5348..d06f54416 100644 --- a/src/libslic3r/LayerRegion.cpp +++ b/src/libslic3r/LayerRegion.cpp @@ -96,14 +96,14 @@ void LayerRegion::process_external_surfaces(const Layer* lower_layer) const bool has_infill = this->region()->config().fill_density.value > 0.; coord_t margin = scale_(this->region()->config().external_infill_margin.getFloat()); coord_t margin_bridged = scale_(this->region()->config().bridged_infill_margin.getFloat()); - //if no infill, reduce the margin for averythign to only the perimeter + //if no infill, reduce the margin for everything to only the perimeter if (!has_infill) { + coord_t max_margin = 0; if ((this->region()->config().perimeters > 0)) { - const coord_t perimeter_width = scale_(this->region()->config().perimeter_extrusion_width.get_abs_value(this->layer()->object()->config().layer_height.value)); - const coord_t first_perimeter_width = scale_(this->region()->config().external_perimeter_extrusion_width.get_abs_value(this->layer()->object()->config().layer_height.value)); - margin = first_perimeter_width + perimeter_width * (this->region()->config().perimeters.value - 1); - } else margin = 0; - margin_bridged = margin; + max_margin = this->flow(frExternalPerimeter).width + this->flow(frPerimeter).width * (this->region()->config().perimeters.value - 1); + } + margin = std::min(margin, max_margin); + margin_bridged = std::min(margin_bridged, max_margin); } #ifdef SLIC3R_DEBUG_SLICE_PROCESSING export_region_fill_surfaces_to_svg_debug("3_process_external_surfaces-initial"); diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 3c5b62ce0..c707f07e4 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -1397,9 +1397,9 @@ double Print::skirt_first_layer_height() const Flow Print::brim_flow() const { ConfigOptionFloatOrPercent width = m_config.first_layer_extrusion_width; - if (width.value == 0) + if (width.value <= 0) width = m_regions.front()->config().perimeter_extrusion_width; - if (width.value == 0) + if (width.value <= 0) width = m_objects.front()->config().extrusion_width; /* We currently use a random region's perimeter extruder. @@ -1419,9 +1419,9 @@ Flow Print::brim_flow() const Flow Print::skirt_flow() const { ConfigOptionFloatOrPercent width = m_config.first_layer_extrusion_width; - if (width.value == 0) + if (width.value <= 0) width = m_regions.front()->config().perimeter_extrusion_width; - if (width.value == 0) + if (width.value <= 0) width = m_objects.front()->config().extrusion_width; /* We currently use a random object's support material extruder. @@ -1913,7 +1913,8 @@ void Print::_make_wipe_tower() float(m_config.cooling_tube_length.value), float(m_config.parking_pos_retraction.value), float(m_config.extra_loading_move.value), float(m_config.wipe_tower_bridging), m_config.high_current_on_filament_swap.value, wipe_volumes, - m_wipe_tower_data.tool_ordering.first_extruder(), float(m_config.first_layer_extrusion_width)); + m_wipe_tower_data.tool_ordering.first_extruder(), this->brim_flow().width); + //wipe_tower.set_retract(); //wipe_tower.set_zhop(); diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 3b796b0a6..958663fac 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -488,7 +488,7 @@ void PrintConfigDef::init_fff_params() def->category = L("Extrusion Width"); def->tooltip = L("Set this to a non-zero value to set a manual extrusion width for external perimeters. " "If left zero, default extrusion width will be used if set, otherwise 1.125 x nozzle diameter will be used. " - "If expressed as percentage (for example 200%), it will be computed over layer height."); + "If expressed as percentage (for example 112.5%), it will be computed over nozzle diameter."); def->sidetext = L("mm or % (leave 0 for default)"); def->cli = "external-perimeter-extrusion-width=s"; def->mode = comAdvanced; @@ -637,7 +637,7 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("Set this to a non-zero value to allow a manual extrusion width. " "If left to zero, Slic3r derives extrusion widths from the nozzle diameter " "(see the tooltips for perimeter extrusion width, infill extrusion width etc). " - "If expressed as percentage (for example: 230%), it will be computed over layer height."); + "If expressed as percentage (for example: 105%), it will be computed over nozzle diameter."); def->sidetext = L("mm or % (leave 0 for auto)"); def->cli = "extrusion-width=s"; def->mode = comAdvanced; @@ -1000,13 +1000,14 @@ void PrintConfigDef::init_fff_params() def->category = L("Extrusion Width"); def->tooltip = L("Set this to a non-zero value to set a manual extrusion width for first layer. " "You can use this to force fatter extrudates for better adhesion. If expressed " - "as percentage (for example 120%) it will be computed over first layer height. " + "as percentage (for example 140%) it will be computed over the nozzle diameter " + "of the nozzle used for the type of extrusion. " "If set to zero, it will use the default extrusion width."); def->sidetext = L("mm or % (leave 0 for default)"); def->cli = "first-layer-extrusion-width=s"; def->ratio_over = "first_layer_height"; def->mode = comAdvanced; - def->default_value = new ConfigOptionFloatOrPercent(200, true); + def->default_value = new ConfigOptionFloatOrPercent(140, true); def = this->add("first_layer_height", coFloatOrPercent); def->label = L("First layer height"); @@ -1201,7 +1202,7 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("Set this to a non-zero value to set a manual extrusion width for infill. " "If left zero, default extrusion width will be used if set, otherwise 1.125 x nozzle diameter will be used. " "You may want to use fatter extrudates to speed up the infill and make your parts stronger. " - "If expressed as percentage (for example 90%) it will be computed over layer height."); + "If expressed as percentage (for example 110%) it will be computed over nozzle diameter."); def->sidetext = L("mm or % (leave 0 for default)"); def->cli = "infill-extrusion-width=s"; def->mode = comAdvanced; @@ -1671,7 +1672,7 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("Set this to a non-zero value to set a manual extrusion width for perimeters. " "You may want to use thinner extrudates to get more accurate surfaces. " "If left zero, default extrusion width will be used if set, otherwise 1.125 x nozzle diameter will be used. " - "If expressed as percentage (for example 200%) it will be computed over layer height."); + "If expressed as percentage (for example 105%) it will be computed over nozzle diameter."); def->sidetext = L("mm or % (leave 0 for default)"); def->cli = "perimeter-extrusion-width=s"; def->aliases = { "perimeters_extrusion_width" }; @@ -2061,7 +2062,7 @@ void PrintConfigDef::init_fff_params() def->category = L("Extrusion Width"); def->tooltip = L("Set this to a non-zero value to set a manual extrusion width for infill for solid surfaces. " "If left zero, default extrusion width will be used if set, otherwise 1.125 x nozzle diameter will be used. " - "If expressed as percentage (for example 90%) it will be computed over layer height."); + "If expressed as percentage (for example 110%) it will be computed over nozzle diameter."); def->sidetext = L("mm or % (leave 0 for default)"); def->cli = "solid-infill-extrusion-width=s"; def->mode = comAdvanced; @@ -2275,7 +2276,7 @@ void PrintConfigDef::init_fff_params() def->category = L("Extrusion Width"); def->tooltip = L("Set this to a non-zero value to set a manual extrusion width for support material. " "If left zero, default extrusion width will be used if set, otherwise nozzle diameter will be used. " - "If expressed as percentage (for example 90%) it will be computed over layer height."); + "If expressed as percentage (for example 110%) it will be computed over nozzle diameter."); def->sidetext = L("mm or % (leave 0 for default)"); def->cli = "support-material-extrusion-width=s"; def->mode = comAdvanced; @@ -2413,7 +2414,8 @@ void PrintConfigDef::init_fff_params() def->label = L(""); def->category = L("Layers and Perimeters"); def->tooltip = L("Detect single-width walls (parts where two extrusions don't fit and we need " - "to collapse them into a single trace)."); + "to collapse them into a single trace). If unchecked, slic3r may try to fit perimeters " + "where it's not possible, creating some overlap leading to over-extrusion."); def->cli = "thin-walls!"; def->mode = comAdvanced; def->default_value = new ConfigOptionBool(true); @@ -2422,7 +2424,8 @@ void PrintConfigDef::init_fff_params() def->label = L("min width"); def->category = L("Layers and Perimeters"); def->tooltip = L("Minimum width for the extrusion to be extruded (widths lower than the nozzle diameter will be over-extruded at the nozzle diameter)." - "Can be percent of the nozzle size. The default behavior of slic3r and slic3rPE is with a 33% value. Put 100% to avoid any sort of over-extrusion."); + " If expressed as percentage (for example 110%) it will be computed over nozzle diameter." + " The default behavior of slic3r and slic3rPE is with a 33% value. Put 100% to avoid any sort of over-extrusion."); def->cli = "thin-walls-min-width=s"; def->mode = comExpert; def->min = 0; @@ -2467,7 +2470,7 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("Set this to a non-zero value to set a manual extrusion width for infill for top surfaces. " "You may want to use thinner extrudates to fill all narrow regions and get a smoother finish. " "If left zero, default extrusion width will be used if set, otherwise nozzle diameter will be used. " - "If expressed as percentage (for example 90%) it will be computed over layer height."); + "If expressed as percentage (for example 110%) it will be computed over nozzle diameter."); def->sidetext = L("mm or % (leave 0 for default)"); def->cli = "top-infill-extrusion-width=s"; def->mode = comAdvanced; diff --git a/src/libslic3r/SupportMaterial.cpp b/src/libslic3r/SupportMaterial.cpp index bd3e5406d..b1acce773 100644 --- a/src/libslic3r/SupportMaterial.cpp +++ b/src/libslic3r/SupportMaterial.cpp @@ -7,6 +7,7 @@ #include "Fill/FillBase.hpp" #include "EdgeGrid.hpp" #include "Geometry.hpp" +#include "Flow.hpp" #include #include @@ -164,11 +165,9 @@ PrintObjectSupportMaterial::PrintObjectSupportMaterial(const PrintObject *object coordf_t external_perimeter_width = 0.; for (size_t region_id = 0; region_id < object->region_volumes.size(); ++ region_id) { if (! object->region_volumes[region_id].empty()) { - const PrintRegionConfig &config = object->print()->get_region(region_id)->config(); - coordf_t width = config.external_perimeter_extrusion_width.get_abs_value(slicing_params.layer_height); - if (width <= 0.) - width = m_print_config->nozzle_diameter.get_at(config.perimeter_extruder-1); - external_perimeter_width = std::max(external_perimeter_width, width); + const Flow ext_peri_flow = object->print()->get_region(region_id)->flow(frExternalPerimeter, + slicing_params.layer_height, false, false, -1, *object); + external_perimeter_width = std::max(external_perimeter_width, (coordf_t)ext_peri_flow.width); } } m_gap_xy = m_object_config->support_material_xy_spacing.get_abs_value(external_perimeter_width);