Browse Source

More acceleration control: (squash of)
supermerill:
rename bridge_acceleration_internal to bridge_internal_acceleration to be consistent with the others
move solid_infill_acceleration to gcode settings like the others.
add all new settings to the list of not-prusa settings.
add max_literal to new settings to have a more sane threshold for % check
julian:
Fallback accelerations to other accelerations when 0 36ba8ed4a8ccafa2177b0243b64b0ada32532b16
Print Skirt with Supportmaterial accelerations 375c13de00c473daab61aa7efc4cabdff3e8eca8
Take travel acceleration from get_travel_acceleration function 1385c2acbc2e88d24ad6fbddfcb4a47ff04cddcf
Added missing breaks in switch case. 9635f752ea5f3b6ccecbfd0086198f622a28d72b
Typos in localization readme 626cff20d5980347671cd3a2f9e6daa01d848e66
Deactivate acceleration fields when not applicable bdc4e1e861976dfaad521cf05ce10051d237033f
First layer acceleration only limits acceleration 64884a68b7e0f8c513efd0abf026ad2b4b653f12
Add accelerations for all extrusion roles 7accaccc09031a5f2a51772a443ee333413b420a
fixed to_prusa for accelerations 5cf824ca3220223028d78cde0135a6a130a14487
Thinwalls with perimeter accel, gapfill with SolidInfill accels 6fd41f39a88ca53a4194824da571360705faf3dd
removed CMakeSettings 9e6a05a4f7e3d8fe4a7de10c6399c17bcf9a2d9e
removed unused functions 33fe24070f814588b34bdf237336b4d7d3c7e1c2
Merge GCode.cpp fbba116248685e301fa1793c89feb82115491b44
Resolve conflict in acceleration control c193db4267ba30007c40cc521cc17c5843e2a6b0
Merge upstream. Resolved conflicts in acceleration handling 755a4c34d88c7ca45e12a6fadf875de3c7df459b
configurable travel deceleration fe8fcb671886cf8314ccceaa2f493c6c90d92792
Refactored acceleration code to switch statement to make it more explicit. 5178a23d3c8819d1863575d70baa0cfed206c125
Added acceleration settings for overhangs and solid infills 6ff6118fe28a1c2a0983f8c908c1982a5940866e
Remove default-acceleration checks 6e70bedee97dadfad5116779466c51a710341642
Added acceleration settings for top infill and external parameters 9db2d99b8f486e12a86de580da3733489b1bf076

Julian Schill 3 years ago
parent
commit
eb4b0e7d94

+ 34 - 7
resources/ui_layout/print.ui

@@ -268,13 +268,40 @@ group:sidetext_width$7:Modifiers
 		setting:label_width$8:width$4:small_perimeter_min_length
 		setting:label_width$8:width$4:small_perimeter_max_length
 		setting:label_width$8:width$4:small_perimeter_speed
-group:Acceleration control (advanced)
-	setting:default_acceleration
-	setting:perimeter_acceleration
-	setting:infill_acceleration
-	setting:bridge_acceleration
-	setting:first_layer_acceleration
-	setting:travel_acceleration
+group:label_width$9:sidetext_width$8:Acceleration control (advanced)
+	line:Default acceleration
+		setting:width$4:default_acceleration
+	line:Perimeter acceleration
+		setting:width$4:perimeter_acceleration
+		setting:width$4:external_perimeter_acceleration
+	end_line
+	line:Infill acceleration
+		setting:width$4:infill_acceleration
+		setting:width$4:solid_infill_acceleration
+		setting:width$4:top_solid_infill_acceleration
+	end_line
+	line:Ironing acceleration
+		setting:width$4:ironing_acceleration
+	end_line
+	line:Support acceleration
+		setting:width$4:support_material_acceleration
+		setting:width$4:support_material_interface_acceleration
+	end_line
+	line:Bridge acceleration
+		setting:width$4:bridge_acceleration
+		setting:width$4:bridge_internal_acceleration
+		setting:width$4:overhangs_acceleration
+	end_line
+	line:Thin extrusions acceleration
+		setting:width$4:gap_fill_acceleration
+		setting:width$4:thin_walls_acceleration
+	end_line
+	line:Travel acceleration
+		setting:width$4:travel_acceleration
+		setting:width$4:travel_deceleration_use_target
+	end_line
+	line:First layer acceleration
+		setting:width$4:first_layer_acceleration
 group:Autospeed (advanced)
 	setting:label$Volumetric speed for Autospeed:max_volumetric_speed
 	setting:max_print_speed

+ 13 - 1
resources/ui_layout/print.ui.legacy

@@ -148,11 +148,23 @@ group:Modifiers
 	setting:full_label:first_layer_speed
 	setting:full_label:first_layer_infill_speed
 group:Acceleration control (advanced)
+	setting:default_acceleration
 	setting:perimeter_acceleration
+	setting:external_perimeter_acceleration
 	setting:infill_acceleration
+	setting:solid_infill_acceleration
+	setting:top_solid_infill_acceleration
+	setting:ironing_acceleration
+	setting:support_material_acceleration
+	setting:support_material_interface_acceleration
 	setting:bridge_acceleration
+	setting:bridge_acceleration_internal
+	setting:overhangs_acceleration
+	setting:gap_fill_acceleration
+	setting:thin_walls_acceleration
+	setting:travel_acceleration
+	setting:travel_deceleration_use_target
 	setting:first_layer_acceleration
-	setting:default_acceleration
 group:Autospeed (advanced)
 	setting:max_print_speed
 	setting:max_volumetric_speed

+ 134 - 46
src/libslic3r/GCode.cpp

@@ -3976,61 +3976,149 @@ std::string GCode::_before_extrude(const ExtrusionPath &path, const std::string
         max_acceleration = m_config.machine_max_acceleration_extruding.get_at(0);
     double travel_acceleration = get_travel_acceleration(m_config);
     if(acceleration > 0){
+        switch (path.role()){
+            case erPerimeter:
+            perimeter:
+                if (m_config.perimeter_acceleration.value > 0)
+                    acceleration = m_config.get_computed_value("perimeter_acceleration");
+                break;
+            case erExternalPerimeter:
+            externalPerimeter:
+                if (m_config.external_perimeter_acceleration.value > 0) 
+                    acceleration = m_config.get_computed_value("external_perimeter_acceleration");
+                else goto perimeter;
+                break;
+            case erInternalInfill:
+            internalInfill:
+                if (m_config.infill_acceleration.value > 0) 
+                    acceleration = m_config.get_computed_value("infill_acceleration");
+                break;
+            case erSolidInfill:
+            solidInfill:
+                if (m_config.solid_infill_acceleration.value > 0) 
+                    acceleration = m_config.get_computed_value("solid_infill_acceleration");
+                else goto internalInfill;    
+                break;
+            case erTopSolidInfill:
+            topSolidInfill:
+                if (m_config.top_solid_infill_acceleration.value > 0)
+                    acceleration = m_config.get_computed_value("top_solid_infill_acceleration");
+                else goto solidInfill;
+                break;
+            case erIroning:
+                if (m_config.ironing_acceleration.value > 0)
+                    acceleration = m_config.get_computed_value("ironing_acceleration");
+                else goto topSolidInfill;
+                break;
+            case erSupportMaterial:
+            case erSkirt:
+            case erWipeTower:
+            supportMaterial:
+                if (m_config.support_material_acceleration.value > 0)
+                    acceleration = m_config.get_computed_value("support_material_acceleration");
+                break;
+            case erSupportMaterialInterface:
+                if (m_config.support_material_interface_acceleration.value > 0) 
+                    acceleration = m_config.get_computed_value("support_material_interface_acceleration");
+                else goto supportMaterial;
+                break;
+            case erBridgeInfill:
+            bridgeInfill:
+                if (m_config.bridge_acceleration.value > 0)
+                    acceleration = m_config.get_computed_value("bridge_acceleration");
+                break;
+            case erInternalBridgeInfill:
+                if (m_config.bridge_internal_acceleration.value > 0)
+                    acceleration = m_config.get_computed_value("bridge_internal_acceleration");
+                else goto bridgeInfill;
+                break;
+            case erOverhangPerimeter:
+                if (m_config.overhangs_acceleration.value > 0)
+                    acceleration = m_config.get_computed_value("overhangs_acceleration");
+                else goto bridgeInfill;
+                break;
+            case erGapFill:
+                if (m_config.gap_fill_acceleration.value > 0)
+                    acceleration = m_config.get_computed_value("gap_fill_acceleration");
+                else goto internalInfill;
+                break;
+            case erThinWall:
+                if (m_config.thin_walls_acceleration.value > 0)
+                    acceleration = m_config.get_computed_value("thin_walls_acceleration");
+                else goto externalPerimeter;
+                break;
+            case erMilling:
+            case erCustom:
+            case erMixed:
+            case erCount:
+            case erNone:
+            default:
+                break;
+        }
+
         if (this->on_first_layer() && m_config.first_layer_acceleration.value > 0) {
-            acceleration = std::min(max_acceleration, m_config.first_layer_acceleration.get_abs_value(acceleration));
-        } else if (m_config.perimeter_acceleration.value > 0 && is_perimeter(path.role())) {
-            acceleration = std::min(max_acceleration, m_config.perimeter_acceleration.get_abs_value(acceleration));
-        } else if (m_config.bridge_acceleration.value > 0 && is_bridge(path.role())
-            && path.role() != erOverhangPerimeter) {
-            acceleration = std::min(max_acceleration, m_config.bridge_acceleration.get_abs_value(acceleration));
-        } else if (m_config.infill_acceleration.value > 0 && is_infill(path.role())) {
-            acceleration = std::min(max_acceleration, m_config.infill_acceleration.get_abs_value(acceleration));
+            acceleration = std::min(acceleration, m_config.first_layer_acceleration.get_abs_value(acceleration));
         }
+
+        acceleration = std::min(max_acceleration, acceleration);
+
     }
-    if (travel_acceleration <= acceleration || travel_acceleration == 0 || acceleration == 0) {
-        m_writer.set_acceleration((uint32_t)floor(acceleration + 0.5));
-        // go to first point of extrusion path (stop at midpoint to let us set the decel speed)
-        if (!m_last_pos_defined || m_last_pos != path.first_point()) {
-             Polyline polyline = this->travel_to(gcode, path.first_point(), path.role());
-             this->write_travel_to(gcode, polyline, "move to first " + description + " point (" + std::to_string(acceleration) +" == "+ std::to_string(travel_acceleration)+")");
-        }
-    } else {
-        // go to midpoint to let us set the decel speed)
-        if (!m_last_pos_defined || m_last_pos != path.first_point()) {
-            Polyline poly_start = this->travel_to(gcode, path.first_point(), path.role());
-            coordf_t length = poly_start.length();
-            // if length is enough, it's not the hack for first move, and the travel accel is different than the normal accel
-            // then cut the travel in two to change the accel in-between
-            // TODO: compute the real point where it should be cut, considering an infinite max speed.
-            if (length > std::max(coordf_t(SCALED_EPSILON), scale_d(m_config.min_length)) && m_last_pos_defined) {
-                Polyline poly_end;
-                coordf_t min_length = scale_d(EXTRUDER_CONFIG_WITH_DEFAULT(nozzle_diameter, 0.5)) * 20;
-                if (poly_start.size() > 2 && length > min_length * 3) {
-                    //if complex travel, try to deccelerate only at the end, unless it's less than ~ 20 nozzle
-                    if (poly_start.lines().back().length() < min_length) {
-                        poly_end = poly_start;
-                        poly_start.clip_end(min_length);
-                        poly_end.clip_start(length - min_length);
+        
+    if (m_config.travel_deceleration_use_target){
+        if (travel_acceleration <= acceleration || travel_acceleration == 0 || acceleration == 0) {
+            m_writer.set_acceleration((uint32_t)floor(acceleration + 0.5));
+            // go to first point of extrusion path (stop at midpoint to let us set the decel speed)
+            if (!m_last_pos_defined || m_last_pos != path.first_point()) {
+                    Polyline polyline = this->travel_to(gcode, path.first_point(), path.role());
+                    this->write_travel_to(gcode, polyline, "move to first " + description + " point (acceleration:" + std::to_string(acceleration) +" travel acceleration:"+ std::to_string(travel_acceleration)+")");
+            }
+        } else {
+            // go to midpoint to let us set the decel speed)
+            if (!m_last_pos_defined || m_last_pos != path.first_point()) {
+                Polyline poly_start = this->travel_to(gcode, path.first_point(), path.role());
+                coordf_t length = poly_start.length();
+                // if length is enough, it's not the hack for first move, and the travel accel is different than the normal accel
+                // then cut the travel in two to change the accel in-between
+                // TODO: compute the real point where it should be cut, considering an infinite max speed.
+                if (length > std::max(coordf_t(SCALED_EPSILON), scale_d(m_config.min_length)) && m_last_pos_defined) {
+                    Polyline poly_end;
+                    coordf_t min_length = scale_d(EXTRUDER_CONFIG_WITH_DEFAULT(nozzle_diameter, 0.5)) * 20;
+                    if (poly_start.size() > 2 && length > min_length * 3) {
+                        //if complex travel, try to deccelerate only at the end, unless it's less than ~ 20 nozzle
+                        if (poly_start.lines().back().length() < min_length) {
+                            poly_end = poly_start;
+                            poly_start.clip_end(min_length);
+                            poly_end.clip_start(length - min_length);
+                        } else {
+                            poly_end.points.push_back(poly_start.points.back());
+                            poly_start.points.pop_back();
+                            poly_end.points.push_back(poly_start.points.back());
+                            poly_end.reverse();
+                        }
                     } else {
-                        poly_end.points.push_back(poly_start.points.back());
-                        poly_start.points.pop_back();
-                        poly_end.points.push_back(poly_start.points.back());
-                        poly_end.reverse();
+                        poly_end = poly_start;
+                        poly_start.clip_end(length / 2);
+                        poly_end.clip_start(length / 2);
                     }
+                    m_writer.set_acceleration((uint32_t)floor(travel_acceleration + 0.5));
+                    this->write_travel_to(gcode, poly_start, "move to first " + description + " point (acceleration)");
+                    //travel acceleration should be already set at startup via special gcode, and so it's automatically used by G0.
+                    m_writer.set_acceleration((uint32_t)floor(acceleration + 0.5));
+                    this->write_travel_to(gcode, poly_end, "move to first " + description + " point (deceleration)");
                 } else {
-                    poly_end = poly_start;
-                    poly_start.clip_end(length / 2);
-                    poly_end.clip_start(length / 2);
+                    m_writer.set_acceleration((uint32_t)floor(travel_acceleration + 0.5));
+                    this->write_travel_to(gcode, poly_start, "move to first " + description + " point (acceleration)");
                 }
-                m_writer.set_acceleration((uint32_t)floor(travel_acceleration + 0.5));
-                this->write_travel_to(gcode, poly_start, "move to first " + description + " point (acceleration)");
-                //travel acceleration should be already set at startup via special gcode, and so it's automatically used by G0.
-                m_writer.set_acceleration((uint32_t)floor(acceleration + 0.5));
-                this->write_travel_to(gcode, poly_end, "move to first " + description + " point (deceleration)");
             } else {
-                m_writer.set_acceleration((uint32_t)floor(travel_acceleration + 0.5));
-                this->write_travel_to(gcode, poly_start, "move to first " + description + " point (acceleration)");
+                m_writer.set_acceleration((uint32_t)floor(acceleration + 0.5));
             }
+        }
+    } else {
+        if (!m_last_pos_defined || m_last_pos != path.first_point()) {
+            m_writer.set_acceleration((uint32_t)floor(travel_acceleration + 0.5));
+            Polyline polyline = this->travel_to(gcode, path.first_point(), path.role());
+            this->write_travel_to(gcode, polyline, "move to first " + description + " point");
+            m_writer.set_acceleration((uint32_t)floor(acceleration + 0.5));
         } else {
             m_writer.set_acceleration((uint32_t)floor(acceleration + 0.5));
         }

+ 11 - 0
src/libslic3r/Preset.cpp

@@ -523,11 +523,22 @@ const std::vector<std::string>& Preset::print_options()
         "gap_fill_speed",
         // acceleration
         "bridge_acceleration",
+        "bridge_internal_acceleration",
         "default_acceleration",
+        "external_perimeter_acceleration",
         "first_layer_acceleration",
+        "gap_fill_acceleration",
         "infill_acceleration",
+        "ironing_acceleration",
+        "overhangs_acceleration",
         "perimeter_acceleration",
+        "solid_infill_acceleration",
+        "support_material_acceleration",
+        "support_material_interface_acceleration",
+        "thin_walls_acceleration",
+        "top_solid_infill_acceleration",
         "travel_acceleration",
+        "travel_deceleration_use_target",
         // skirt
         "skirts",
         "skirt_distance",

+ 11 - 0
src/libslic3r/Print.cpp

@@ -80,6 +80,7 @@ bool Print::invalidate_state_by_config_options(const std::vector<t_config_option
         "before_layer_gcode",
         "between_objects_gcode",
         "bridge_acceleration",
+        "bridge_internal_acceleration",
         "bridge_fan_speed",
         "bridge_internal_fan_speed",
         "colorprint_heights",
@@ -91,6 +92,7 @@ bool Print::invalidate_state_by_config_options(const std::vector<t_config_option
         "duplicate_distance",
         "end_gcode",
         "end_filament_gcode",
+        "external_perimeter_acceleration",
         "external_perimeter_cut_corners",
         "external_perimeter_fan_speed",
         "extrusion_axis",
@@ -121,6 +123,7 @@ bool Print::invalidate_state_by_config_options(const std::vector<t_config_option
         "first_layer_infill_speed",
         "first_layer_min_speed",
         "full_fan_speed_layer",
+        "gap_fill_acceleration",
         "gap_fill_speed",
         "gcode_comments",
         "gcode_filename_illegal_char",
@@ -128,6 +131,7 @@ bool Print::invalidate_state_by_config_options(const std::vector<t_config_option
         "gcode_precision_xyz",
         "gcode_precision_e",
         "infill_acceleration",
+        "ironing_acceleration",
         "layer_gcode",
         "max_fan_speed",
         "max_gcode_per_second",
@@ -149,6 +153,7 @@ bool Print::invalidate_state_by_config_options(const std::vector<t_config_option
         "notes",
         "only_retract_when_crossing_perimeters",
         "output_filename_format",
+        "overhangs_acceleration",
         "perimeter_acceleration",
         "post_process",
         "printer_notes",
@@ -167,17 +172,23 @@ bool Print::invalidate_state_by_config_options(const std::vector<t_config_option
         "retract_speed",
         "single_extruder_multi_material_priming",
         "slowdown_below_layer_time",
+        "solid_infill_acceleration",
+        "support_material_acceleration",
+        "support_material_interface_acceleration",
         "standby_temperature_delta",
         "start_gcode",
         "start_gcode_manual",
         "start_filament_gcode",
+        "thin_walls_acceleration",
         "thin_walls_speed",
         "time_estimation_compensation",
         "tool_name",
         "toolchange_gcode",
         "top_fan_speed",
+        "top_solid_infill_acceleration",
         "threads",
         "travel_acceleration",
+        "travel_deceleration_use_target",
         "travel_speed",
         "travel_speed_z",
         "use_firmware_retraction",

+ 177 - 18
src/libslic3r/PrintConfig.cpp

@@ -310,17 +310,30 @@ void PrintConfigDef::init_fff_params()
     def->set_default_value(new ConfigOptionFloat(0.));
 
     def = this->add("bridge_acceleration", coFloatOrPercent);
-    def->label = L("Bridge");
+    def->label = L("Bridges");
     def->full_label = L("Bridge acceleration");
     def->category = OptionCategory::speed;
     def->tooltip = L("This is the acceleration your printer will use for bridges."
                 "\nCan be a % of the default acceleration"
-                "\nSet zero to disable acceleration control for bridges."
-                "\nNote that it won't be applied to overhangs, they still use the perimeter acceleration.");
+                "\nSet zero to use default acceleration for bridges.");
     def->sidetext = L("mm/s² or %");
     def->ratio_over = "default_acceleration";
     def->min = 0;
     def->max_literal = { -220, false };
+    def->mode = comAdvanced;
+    def->set_default_value(new ConfigOptionFloatOrPercent(0,false));
+
+    def = this->add("bridge_internal_acceleration", coFloatOrPercent);
+    def->label = L("Internal bridges ");
+    def->full_label = L("Internal bridges acceleration");
+    def->category = OptionCategory::speed;
+    def->tooltip = L("This is the acceleration your printer will use for internal bridges. "
+                "\nCan be a % of the default acceleration"
+                "\nSet zero to use bridge acceleration for internal bridges.");
+    def->sidetext = L("mm/s² or %");
+    def->ratio_over = "bridge_acceleration";
+    def->min = 0;
+    def->max_literal = { -200, false };
     def->mode = comExpert;
     def->set_default_value(new ConfigOptionFloatOrPercent(0,false));
 
@@ -679,7 +692,7 @@ void PrintConfigDef::init_fff_params()
     def->ratio_over = "machine_max_acceleration_x";
     def->min = 0;
     def->max_literal = { -200, false };
-    def->mode = comExpert;
+    def->mode = comAdvanced;
     def->set_default_value(new ConfigOptionFloatOrPercent(0,false));
 
     def = this->add("default_filament_profile", coStrings);
@@ -991,6 +1004,20 @@ void PrintConfigDef::init_fff_params()
     def->mode = comExpert;
     def->set_default_value(new ConfigOptionPercent(0));
 
+    def = this->add("external_perimeter_acceleration", coFloatOrPercent);
+    def->label = L("External");
+    def->full_label = L("External Perimeter acceleration");
+    def->category = OptionCategory::speed;
+    def->tooltip = L("This is the acceleration your printer will use for external perimeters. "
+                "\nCan be a % of the internal perimeter acceleration"
+                "\nSet zero to use internal perimeter acceleration for external perimeters.");
+    def->sidetext = L("mm/s² or %");
+    def->ratio_over = "perimeter_acceleration";
+    def->min = 0;
+    def->max_literal = { -200, false };
+    def->mode = comExpert;
+    def->set_default_value(new ConfigOptionFloatOrPercent(0,false));
+
     def = this->add("external_perimeter_speed", coFloatOrPercent);
     def->label = L("External");
     def->full_label = L("External perimeters speed");
@@ -1903,14 +1930,14 @@ void PrintConfigDef::init_fff_params()
     def->set_default_value(new ConfigOptionPercent(10));
 
     def = this->add("first_layer_acceleration", coFloatOrPercent);
-    def->label = L("First layer");
+    def->label = L("Max");
     def->full_label = L("First layer acceleration");
     def->category = OptionCategory::speed;
-    def->tooltip = L("This is the acceleration your printer will use for first layer."
-                "\nCan be a % of the default acceleration"
+    def->tooltip = L("This is the maximum acceleration your printer will use for first layer."
+                "\nIf set to %, all accelerations will be reduced by that ratio."
                 "\nSet zero to disable acceleration control for first layer.");
     def->sidetext = L("mm/s² or %");
-    def->ratio_over = "default_acceleration";
+    def->ratio_over = "depends";
     def->min = 0;
     def->max_literal = { -200, false };
     def->mode = comExpert;
@@ -2048,6 +2075,20 @@ void PrintConfigDef::init_fff_params()
     def->mode = comExpert;
     def->set_default_value(new ConfigOptionBool(true));
 
+    def = this->add("gap_fill_acceleration", coFloatOrPercent);
+    def->label = L("Gap fill");
+    def->full_label = L("Gap fill acceleration");
+    def->category = OptionCategory::speed;
+    def->tooltip = L("This is the acceleration your printer will use for gap fills. "
+                "\nCan be a % of the infill acceleration"
+                "\nSet zero to use infill acceleration for gap fills.");
+    def->sidetext = L("mm/s² or %");
+    def->ratio_over = "infill_acceleration";
+    def->min = 0;
+    def->max_literal = { -200, false };
+    def->mode = comExpert;
+    def->set_default_value(new ConfigOptionFloatOrPercent(0,false));
+
     def = this->add("gap_fill_last", coBool);
     def->label = L("after last perimeter");
     def->full_label = L("Gapfill after last perimeter");
@@ -2188,17 +2229,17 @@ void PrintConfigDef::init_fff_params()
     def->set_default_value(new ConfigOptionBool(0));
 
     def = this->add("infill_acceleration", coFloatOrPercent);
-    def->label = L("Infill");
+    def->label = L("Sparse");
     def->full_label = L("Infill acceleration");
     def->category = OptionCategory::speed;
     def->tooltip = L("This is the acceleration your printer will use for infill."
                 "\nCan be a % of the default acceleration"
-                "\nSet zero to disable acceleration control for infill.");
+                "\nSet zero to use default acceleration for infill.");
     def->sidetext = L("mm/s² or %");
     def->ratio_over = "default_acceleration";
     def->min = 0;
     def->max_literal = { -200, false };
-    def->mode = comExpert;
+    def->mode = comAdvanced;
     def->set_default_value(new ConfigOptionFloatOrPercent(0,false));
 
     def = this->add("infill_every_layers", coInt);
@@ -2476,6 +2517,20 @@ void PrintConfigDef::init_fff_params()
     def->mode = comAdvanced;
     def->set_default_value(new ConfigOptionBool(false));
 
+    def = this->add("ironing_acceleration", coFloatOrPercent);
+    def->label = L("Ironing");
+    def->full_label = L("Ironing acceleration");
+    def->category = OptionCategory::speed;
+    def->tooltip = L("This is the acceleration your printer will use for ironing. "
+                "\nCan be a % of the top layer infill acceleration"
+                "\nSet zero to use top solid infill acceleration for ironing.");
+    def->sidetext = L("mm/s² or %");
+    def->ratio_over = "top_solid_infill_acceleration";
+    def->min = 0;
+    def->max_literal = { -200, false };
+    def->mode = comExpert;
+    def->set_default_value(new ConfigOptionFloatOrPercent(0,false));
+
     def = this->add("ironing_angle", coFloat);
     def->label = L("Ironing angle");
     def->category = OptionCategory::ironing;
@@ -3074,6 +3129,20 @@ void PrintConfigDef::init_fff_params()
     def->mode = comExpert;
     def->set_default_value(new ConfigOptionString("[input_filename_base].gcode"));
 
+    def = this->add("overhangs_acceleration", coFloatOrPercent);
+    def->label = L("Overhangs");
+    def->full_label = L("Overhang acceleration");
+    def->category = OptionCategory::speed;
+    def->tooltip = L("This is the acceleration your printer will use for overhangs."
+                "\nCan be a % of the bridge acceleration"
+                "\nSet zero to to use bridge acceleration for overhangs.");
+    def->sidetext = L("mm/s² or %");
+    def->ratio_over = "bridge_acceleration";
+    def->min = 0;
+    def->max_literal = { -200, false };
+    def->mode = comExpert;
+    def->set_default_value(new ConfigOptionFloatOrPercent(0,false));
+
     def = this->add("overhangs_speed", coFloatOrPercent);
     def->label = L("Overhangs");
     def->full_label = L("Overhangs speed");
@@ -3173,17 +3242,17 @@ void PrintConfigDef::init_fff_params()
     def->set_default_value(new ConfigOptionFloat(-2.f));
 
     def = this->add("perimeter_acceleration", coFloatOrPercent);
-    def->label = L("Perimeters");
-    def->full_label = L("Perimeter acceleration");
+    def->label = L("Internal");
+    def->full_label = L("Internal Perimeter acceleration");
     def->category = OptionCategory::speed;
-    def->tooltip = L("This is the acceleration your printer will use for perimeters. "
+    def->tooltip = L("This is the acceleration your printer will use for internal perimeters. "
                 "\nCan be a % of the default acceleration"
-                "\nSet zero to disable acceleration control for perimeters.");
+                "\nSet zero to use default acceleration for internal perimeters.");
     def->sidetext = L("mm/s² or %");
     def->ratio_over = "default_acceleration";
     def->min = 0;
     def->max_literal = { -200, false };
-    def->mode = comExpert;
+    def->mode = comAdvanced;
     def->set_default_value(new ConfigOptionFloatOrPercent(0,false));
 
     def = this->add("perimeter_round_corners", coBool);
@@ -4003,6 +4072,20 @@ void PrintConfigDef::init_fff_params()
                      "User is responsible for ensuring there is no collision with the print.");
     def->mode = comAdvanced;
     def->set_default_value(new ConfigOptionBool(false));
+    
+    def = this->add("solid_infill_acceleration", coFloatOrPercent);
+    def->label = L("Solid ");
+    def->full_label = L("Solid acceleration");
+    def->category = OptionCategory::speed;
+    def->tooltip = L("This is the acceleration your printer will use for solid infills. "
+                "\nCan be a % of the infill acceleration"
+                "\nSet zero to use infill acceleration for solid infills.");
+    def->sidetext = L("mm/s² or %");
+    def->ratio_over = "infill_acceleration";
+    def->min = 0;
+    def->max_literal = { -200, false };
+    def->mode = comExpert;
+    def->set_default_value(new ConfigOptionFloatOrPercent(0,false));
 
     def = this->add("solid_over_perimeters", coInt);
     def->label = L("No solid infill over");
@@ -4028,6 +4111,20 @@ void PrintConfigDef::init_fff_params()
     def->tooltip = L("Enable support material generation.");
     def->set_default_value(new ConfigOptionBool(false));
 
+    def = this->add("support_material_acceleration", coFloatOrPercent);
+    def->label = L("Default");
+    def->full_label = L("Support acceleration");
+    def->category = OptionCategory::speed;
+    def->tooltip = L("This is the acceleration your printer will use for support material. "
+                "\nCan be a % of the default acceleration"
+                "\nSet zero to use default acceleration for support material.");
+    def->sidetext = L("mm/s² or %");
+    def->ratio_over = "default_acceleration";
+    def->min = 0;
+    def->max_literal = { -200, false };
+    def->mode = comAdvanced;
+    def->set_default_value(new ConfigOptionFloatOrPercent(0,false));
+
     def = this->add("support_material_auto", coBool);
     def->label = L("Auto generated supports");
     def->category = OptionCategory::support;
@@ -4036,6 +4133,20 @@ void PrintConfigDef::init_fff_params()
     def->mode = comSimple;
     def->set_default_value(new ConfigOptionBool(true));
 
+    def = this->add("support_material_interface_acceleration", coFloatOrPercent);
+    def->label = L("Interface");
+    def->full_label = L("Support interface acceleration");
+    def->category = OptionCategory::speed;
+    def->tooltip = L("This is the acceleration your printer will use for support material interfaces. "
+                "\nCan be a % of the support material acceleration"
+                "\nSet zero to use support acceleration for support material interfaces.");
+    def->sidetext = L("mm/s² or %");
+    def->ratio_over = "support_material_acceleration";
+    def->min = 0;
+    def->max_literal = { -200, false };
+    def->mode = comExpert;
+    def->set_default_value(new ConfigOptionFloatOrPercent(0,false));
+
     def = this->add("support_material_xy_spacing", coFloatOrPercent);
     def->label = L("XY separation between an object and its support");
     def->category = OptionCategory::support;
@@ -4372,6 +4483,20 @@ void PrintConfigDef::init_fff_params()
     def->mode = comExpert;
     def->set_default_value(new ConfigOptionBool(true));
 
+    def = this->add("thin_walls_acceleration", coFloatOrPercent);
+    def->label = L("Thin Walls");
+    def->full_label = L("Thin walls acceleration");
+    def->category = OptionCategory::speed;
+    def->tooltip = L("This is the acceleration your printer will use for thin walls. "
+                "\nCan be a % of the external perimeter acceleration"
+                "\nSet zero to use external perimeter acceleration for thin walls.");
+    def->sidetext = L("mm/s² or %");
+    def->ratio_over = "external_perimeter_acceleration";
+    def->min = 0;
+    def->max_literal = { -200, false };
+    def->mode = comExpert;
+    def->set_default_value(new ConfigOptionFloatOrPercent(0,false));
+
     def = this->add("thin_walls_speed", coFloat);
     def->label = L("Thin walls");
     def->full_label = L("Thin walls speed");
@@ -4458,6 +4583,20 @@ void PrintConfigDef::init_fff_params()
     def->mode = comAdvanced;
     def->set_default_value(new ConfigOptionFloatOrPercent(0, false, true));
 
+    def = this->add("top_solid_infill_acceleration", coFloatOrPercent);
+    def->label = L("Top solid ");
+    def->full_label = L("Top solid acceleration");
+    def->category = OptionCategory::speed;
+    def->tooltip = L("This is the acceleration your printer will use for top solid infills. "
+                "\nCan be a % of the solid infill acceleration"
+                "\nSet zero to use solid infill acceleration for top solid infills.");
+    def->sidetext = L("mm/s² or %");
+    def->ratio_over = "solid_infill_acceleration";
+    def->min = 0;
+    def->max_literal = { -200, false };
+    def->mode = comAdvanced;
+    def->set_default_value(new ConfigOptionFloatOrPercent(0,false));
+
     def = this->add("top_solid_infill_speed", coFloatOrPercent);
     def->label = L("Top solid");
     def->full_label = L("Top solid speed");
@@ -4500,14 +4639,23 @@ void PrintConfigDef::init_fff_params()
     def->full_label = L("Travel acceleration");
     def->category = OptionCategory::speed;
     def->tooltip = L("Acceleration for travel moves (jumps between distant extrusion points)."
-            "\nNote that the deceleration of a travel will use the acceleration value of the extrusion that will be printed after it (if any)");
+                     "\nCan be a % of the default acceleration"
+                     "\nSet zero to use default acceleration for travel moves.");
     def->sidetext = L("mm/s² or %");
     def->ratio_over = "default_acceleration";
     def->min = 0;
     def->max_literal = { -200, false };
-    def->mode = comExpert;
+    def->mode = comAdvanced;
     def->set_default_value(new ConfigOptionFloatOrPercent(1500, false));
 
+    def = this->add("travel_deceleration_use_target", coBool);
+    def->label = L("Decelerate with target acceleration");
+    def->full_label = L("Use target acceleration for travel deceleration");
+    def->category = OptionCategory::speed;
+    def->tooltip = L("If selected, the deceleration of a travel will use the acceleration value of the extrusion that will be printed after it (if any) ");
+    def->mode = comExpert;
+    def->set_default_value(new ConfigOptionBool(true));
+
     def = this->add("travel_speed", coFloat);
     def->label = L("Travel");
     def->full_label = L("Travel speed");
@@ -5951,6 +6099,7 @@ void ModelConfig::convert_from_prusa(const DynamicPrintConfig& global_config) {
 std::unordered_set<std::string> prusa_export_to_remove_keys = {
 "allow_empty_layers",
 "avoid_crossing_not_first_layer",
+"bridge_internal_acceleration",
 "bridge_internal_fan_speed",
 "bridge_overlap",
 "bridge_overlap_min",
@@ -5974,6 +6123,7 @@ std::unordered_set<std::string> prusa_export_to_remove_keys = {
 "enforce_full_fill_volume",
 "exact_last_layer_height",
 "external_infill_margin",
+"external_perimeter_acceleration",
 "external_perimeter_cut_corners",
 "external_perimeter_extrusion_spacing",
 "external_perimeter_fan_speed",
@@ -6017,6 +6167,7 @@ std::unordered_set<std::string> prusa_export_to_remove_keys = {
 "first_layer_infill_speed",
 "first_layer_min_speed",
 "first_layer_size_compensation_layers",
+"gap_fill_acceleration",
 "gap_fill_infill",
 "gap_fill_min_area",
 "gap_fill_overlap",
@@ -6031,6 +6182,7 @@ std::unordered_set<std::string> prusa_export_to_remove_keys = {
 "infill_dense_algo",
 "infill_dense",
 "infill_extrusion_spacing",
+"ironing_acceleration",
 "lift_min",
 "machine_max_acceleration_travel",
 "max_speed_reduction",
@@ -6053,6 +6205,7 @@ std::unordered_set<std::string> prusa_export_to_remove_keys = {
 "only_one_perimeter_top",
 "only_one_perimeter_first_layer",
 "over_bridge_flow_ratio",
+"overhangs_acceleration",
 "overhangs_reverse_threshold",
 "overhangs_reverse",
 "overhangs_speed",
@@ -6081,14 +6234,18 @@ std::unordered_set<std::string> prusa_export_to_remove_keys = {
 "small_perimeter_max_length",
 "small_perimeter_min_length",
 "solid_fill_pattern",
+"solid_infill_acceleration",
 "solid_infill_extrusion_spacing",
 "start_gcode_manual",
+"support_material_acceleration",
 "support_material_contact_distance_bottom",
 "support_material_contact_distance_type",
+"support_material_interface_acceleration",
 "support_material_interface_pattern",
 "support_material_solid_first_layer",
 "thin_perimeters_all",
 "thin_perimeters",
+"thin_walls_acceleration",
 "thin_walls_merge",
 "thin_walls_min_width",
 "thin_walls_overlap",
@@ -6102,7 +6259,9 @@ std::unordered_set<std::string> prusa_export_to_remove_keys = {
 "tool_name",
 "top_fan_speed",
 "top_infill_extrusion_spacing",
+"top_solid_infill_acceleration",
 "travel_acceleration",
+"travel_deceleration_use_target",
 "travel_speed_z",
 "wipe_advanced_algo",
 "wipe_advanced_multiplier",

+ 22 - 0
src/libslic3r/PrintConfig.hpp

@@ -1320,6 +1320,7 @@ public:
     ConfigOptionPoints              bed_shape;
     ConfigOptionInts                bed_temperature;
     ConfigOptionFloatOrPercent      bridge_acceleration;
+    ConfigOptionFloatOrPercent      bridge_internal_acceleration;
     ConfigOptionInts                bridge_fan_speed;
     ConfigOptionInts                bridge_internal_fan_speed;
     ConfigOptionInts                chamber_temperature;
@@ -1332,6 +1333,7 @@ public:
     ConfigOptionFloatOrPercent      default_acceleration;
     ConfigOptionInts                disable_fan_first_layers;
     ConfigOptionFloat               duplicate_distance;
+    ConfigOptionFloatOrPercent      external_perimeter_acceleration;
     ConfigOptionInts                external_perimeter_fan_speed;
     ConfigOptionFloat               extruder_clearance_height;
     ConfigOptionFloat               extruder_clearance_radius;
@@ -1352,7 +1354,9 @@ public:
     ConfigOptionFloat               first_layer_min_speed;
     ConfigOptionInts                first_layer_temperature;
     ConfigOptionInts                full_fan_speed_layer;
+    ConfigOptionFloatOrPercent      gap_fill_acceleration;
     ConfigOptionFloatOrPercent      infill_acceleration;
+    ConfigOptionFloatOrPercent      ironing_acceleration;
     ConfigOptionFloat               lift_min;
     ConfigOptionInts                max_fan_speed;
     ConfigOptionFloatsOrPercents    max_layer_height;
@@ -1372,6 +1376,7 @@ public:
     ConfigOptionBool                only_retract_when_crossing_perimeters;
     ConfigOptionBool                ooze_prevention;
     ConfigOptionString              output_filename_format;
+    ConfigOptionFloatOrPercent      overhangs_acceleration;
     ConfigOptionFloatOrPercent      perimeter_acceleration;
     ConfigOptionStrings             post_process;
     ConfigOptionString              print_custom_variables;
@@ -1392,8 +1397,12 @@ public:
     ConfigOptionInt                 skirts;
     ConfigOptionInts                slowdown_below_layer_time;
     ConfigOptionBool                spiral_vase;
+    ConfigOptionFloatOrPercent      solid_infill_acceleration;
     ConfigOptionInt                 standby_temperature_delta;
+    ConfigOptionFloatOrPercent      support_material_acceleration;
+    ConfigOptionFloatOrPercent      support_material_interface_acceleration;
     ConfigOptionInts                temperature;
+    ConfigOptionFloatOrPercent      thin_walls_acceleration;
     ConfigOptionInt                 threads;
     ConfigOptionPoints              thumbnails;
     ConfigOptionString              thumbnails_color;
@@ -1402,7 +1411,9 @@ public:
     ConfigOptionBool                thumbnails_with_bed;
     ConfigOptionPercent             time_estimation_compensation;
     ConfigOptionInts                top_fan_speed;
+    ConfigOptionFloatOrPercent      top_solid_infill_acceleration;
     ConfigOptionFloatOrPercent      travel_acceleration;
+    ConfigOptionBool                travel_deceleration_use_target;
     ConfigOptionBools               wipe;
     ConfigOptionBool                wipe_tower;
     ConfigOptionFloatOrPercent      wipe_tower_brim;
@@ -1429,6 +1440,7 @@ protected:
         OPT_PTR(bed_shape);
         OPT_PTR(bed_temperature);
         OPT_PTR(bridge_acceleration);
+        OPT_PTR(bridge_internal_acceleration);
         OPT_PTR(bridge_fan_speed);
         OPT_PTR(bridge_internal_fan_speed);
         OPT_PTR(chamber_temperature);
@@ -1441,6 +1453,7 @@ protected:
         OPT_PTR(default_acceleration);
         OPT_PTR(disable_fan_first_layers);
         OPT_PTR(duplicate_distance);
+        OPT_PTR(external_perimeter_acceleration);
         OPT_PTR(external_perimeter_fan_speed);
         OPT_PTR(extruder_clearance_height);
         OPT_PTR(extruder_clearance_radius);
@@ -1461,7 +1474,9 @@ protected:
         OPT_PTR(first_layer_min_speed);
         OPT_PTR(first_layer_temperature);
         OPT_PTR(full_fan_speed_layer);
+        OPT_PTR(gap_fill_acceleration);
         OPT_PTR(infill_acceleration);
+        OPT_PTR(ironing_acceleration);
         OPT_PTR(lift_min);
         OPT_PTR(max_fan_speed);
         OPT_PTR(max_layer_height);
@@ -1481,6 +1496,7 @@ protected:
         OPT_PTR(only_retract_when_crossing_perimeters);
         OPT_PTR(ooze_prevention);
         OPT_PTR(output_filename_format);
+        OPT_PTR(overhangs_acceleration);
         OPT_PTR(perimeter_acceleration);
         OPT_PTR(post_process);
         OPT_PTR(print_custom_variables);
@@ -1492,6 +1508,7 @@ protected:
         OPT_PTR(retract_before_travel);
         OPT_PTR(retract_layer_change);
         OPT_PTR(seam_gap);
+        OPT_PTR(solid_infill_acceleration);
         OPT_PTR(skirt_brim);
         OPT_PTR(skirt_distance);
         OPT_PTR(skirt_distance_from_brim);
@@ -1502,7 +1519,10 @@ protected:
         OPT_PTR(slowdown_below_layer_time);
         OPT_PTR(spiral_vase);
         OPT_PTR(standby_temperature_delta);
+        OPT_PTR(support_material_acceleration);
+        OPT_PTR(support_material_interface_acceleration);
         OPT_PTR(temperature);
+        OPT_PTR(thin_walls_acceleration);
         OPT_PTR(threads);
         OPT_PTR(thumbnails);
         OPT_PTR(thumbnails_color);
@@ -1511,7 +1531,9 @@ protected:
         OPT_PTR(thumbnails_with_bed);
         OPT_PTR(time_estimation_compensation);
         OPT_PTR(top_fan_speed);
+        OPT_PTR(top_solid_infill_acceleration);
         OPT_PTR(travel_acceleration);
+        OPT_PTR(travel_deceleration_use_target);
         OPT_PTR(wipe);
         OPT_PTR(wipe_tower);
         OPT_PTR(wipe_tower_brim);

+ 11 - 5
src/slic3r/GUI/ConfigManipulation.cpp

@@ -408,11 +408,6 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig* config)
     for (auto el : { "hole_to_polyhole_threshold", "hole_to_polyhole_twisted" })
         toggle_field(el, config->opt_bool("hole_to_polyhole"));
 
-    bool have_default_acceleration = config->option<ConfigOptionFloatOrPercent>("default_acceleration")->value > 0;
-    for (auto el : { "perimeter_acceleration", "infill_acceleration",
-                    "bridge_acceleration", "first_layer_acceleration", "travel_acceleration" })
-        toggle_field(el, have_default_acceleration);
-
     bool have_skirt = config->opt_int("skirts") > 0;
     toggle_field("skirt_height", have_skirt && !config->opt_bool("draft_shield"));
     toggle_field("skirt_width", have_skirt);
@@ -489,6 +484,17 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig* config)
     for (auto el : { "milling_after_z", "milling_extra_size", "milling_speed" })
         toggle_field(el, config->opt_bool("milling_post_process"));
 
+    bool have_default_acceleration = config->option<ConfigOptionFloatOrPercent>("default_acceleration")->value > 0;
+    for (auto el : { "perimeter_acceleration", "external_perimeter_acceleration", "thin_walls_acceleration" })
+        toggle_field(el, have_default_acceleration && have_perimeters);
+    toggle_field("infill_acceleration", have_default_acceleration && have_infill);
+    toggle_field("solid_infill_acceleration", have_default_acceleration && has_solid_infill);
+    toggle_field("top_solid_infill_acceleration", have_default_acceleration && has_top_solid_infill);
+    toggle_field("ironing_acceleration", have_default_acceleration && has_ironing);
+    toggle_field("support_material_acceleration", have_default_acceleration && (have_support_material || have_brim || have_skirt));
+    toggle_field("support_material_interface_acceleration", have_default_acceleration && have_support_material && have_support_interface);
+    for (auto el : { "bridge_acceleration", "bridge_internal_acceleration", "overhangs_acceleration", "gap_fill_acceleration", "travel_acceleration", "travel_deceleration_use_target", "first_layer_acceleration" })
+        toggle_field(el, have_default_acceleration);
 }
 
 void ConfigManipulation::update_print_sla_config(DynamicPrintConfig* config, const bool is_global_config/* = false*/)