diff --git a/src/libslic3r/GCode/GCodeProcessor.cpp b/src/libslic3r/GCode/GCodeProcessor.cpp index b5c10823e4..9f853d7b4a 100644 --- a/src/libslic3r/GCode/GCodeProcessor.cpp +++ b/src/libslic3r/GCode/GCodeProcessor.cpp @@ -24,6 +24,9 @@ static const float INCHES_TO_MM = 25.4f; static const float MMMIN_TO_MMSEC = 1.0f / 60.0f; static const float DEFAULT_ACCELERATION = 1500.0f; // Prusa Firmware 1_75mm_MK2 +#if ENABLE_RETRACT_ACCELERATION +static const float DEFAULT_RETRACT_ACCELERATION = 1500.0f; // Prusa Firmware 1_75mm_MK2 +#endif // ENABLE_RETRACT_ACCELERATION static const float DEFAULT_TRAVEL_ACCELERATION = 1250.0f; static const size_t MIN_EXTRUDERS_COUNT = 5; @@ -178,6 +181,10 @@ void GCodeProcessor::TimeMachine::reset() enabled = false; acceleration = 0.0f; max_acceleration = 0.0f; +#if ENABLE_RETRACT_ACCELERATION + retract_acceleration = 0.0f; + max_retract_acceleration = 0.0f; +#endif // ENABLE_RETRACT_ACCELERATION travel_acceleration = 0.0f; max_travel_acceleration = 0.0f; extrude_factor_override_percentage = 1.0f; @@ -834,6 +841,11 @@ void GCodeProcessor::apply_config(const PrintConfig& config) float max_acceleration = get_option_value(m_time_processor.machine_limits.machine_max_acceleration_extruding, i); m_time_processor.machines[i].max_acceleration = max_acceleration; m_time_processor.machines[i].acceleration = (max_acceleration > 0.0f) ? max_acceleration : DEFAULT_ACCELERATION; +#if ENABLE_RETRACT_ACCELERATION + float max_retract_acceleration = get_option_value(m_time_processor.machine_limits.machine_max_acceleration_retracting, i); + m_time_processor.machines[i].max_retract_acceleration = max_retract_acceleration; + m_time_processor.machines[i].retract_acceleration = (max_retract_acceleration > 0.0f) ? max_retract_acceleration : DEFAULT_RETRACT_ACCELERATION; +#endif // ENABLE_RETRACT_ACCELERATION float max_travel_acceleration = get_option_value(m_time_processor.machine_limits.machine_max_acceleration_travel, i); m_time_processor.machines[i].max_travel_acceleration = max_travel_acceleration; m_time_processor.machines[i].travel_acceleration = (max_travel_acceleration > 0.0f) ? max_travel_acceleration : DEFAULT_TRAVEL_ACCELERATION; @@ -1052,6 +1064,11 @@ void GCodeProcessor::apply_config(const DynamicPrintConfig& config) float max_acceleration = get_option_value(m_time_processor.machine_limits.machine_max_acceleration_extruding, i); m_time_processor.machines[i].max_acceleration = max_acceleration; m_time_processor.machines[i].acceleration = (max_acceleration > 0.0f) ? max_acceleration : DEFAULT_ACCELERATION; +#if ENABLE_RETRACT_ACCELERATION + float max_retract_acceleration = get_option_value(m_time_processor.machine_limits.machine_max_acceleration_retracting, i); + m_time_processor.machines[i].max_retract_acceleration = max_retract_acceleration; + m_time_processor.machines[i].retract_acceleration = (max_retract_acceleration > 0.0f) ? max_retract_acceleration : DEFAULT_RETRACT_ACCELERATION; +#endif // ENABLE_RETRACT_ACCELERATION float max_travel_acceleration = get_option_value(m_time_processor.machine_limits.machine_max_acceleration_travel, i); m_time_processor.machines[i].max_travel_acceleration = max_travel_acceleration; m_time_processor.machines[i].travel_acceleration = (max_travel_acceleration > 0.0f) ? max_travel_acceleration : DEFAULT_TRAVEL_ACCELERATION; @@ -2713,14 +2730,22 @@ void GCodeProcessor::process_M204(const GCodeReader::GCodeLine& line) set_acceleration(static_cast(i), value); set_travel_acceleration(static_cast(i), value); if (line.has_value('T', value)) +#if ENABLE_RETRACT_ACCELERATION + set_retract_acceleration(static_cast(i), value); +#else set_option_value(m_time_processor.machine_limits.machine_max_acceleration_retracting, i, value); +#endif // ENABLE_RETRACT_ACCELERATION } else { // New acceleration format, compatible with the upstream Marlin. if (line.has_value('P', value)) set_acceleration(static_cast(i), value); if (line.has_value('R', value)) +#if ENABLE_RETRACT_ACCELERATION + set_retract_acceleration(static_cast(i), value); +#else set_option_value(m_time_processor.machine_limits.machine_max_acceleration_retracting, i, value); +#endif // ENABLE_RETRACT_ACCELERATION if (line.has_value('T', value)) // Interpret the T value as the travel acceleration in the new Marlin format. set_travel_acceleration(static_cast(i), value); @@ -2979,10 +3004,32 @@ float GCodeProcessor::get_axis_max_jerk(PrintEstimatedStatistics::ETimeMode mode } } +#if ENABLE_RETRACT_ACCELERATION +float GCodeProcessor::get_retract_acceleration(PrintEstimatedStatistics::ETimeMode mode) const +{ + size_t id = static_cast(mode); + return (id < m_time_processor.machines.size()) ? m_time_processor.machines[id].retract_acceleration : DEFAULT_RETRACT_ACCELERATION; +} +#else float GCodeProcessor::get_retract_acceleration(PrintEstimatedStatistics::ETimeMode mode) const { return get_option_value(m_time_processor.machine_limits.machine_max_acceleration_retracting, static_cast(mode)); } +#endif // ENABLE_RETRACT_ACCELERATION + +#if ENABLE_RETRACT_ACCELERATION +void GCodeProcessor::set_retract_acceleration(PrintEstimatedStatistics::ETimeMode mode, float value) +{ + std::cout << value << "\n"; + + size_t id = static_cast(mode); + if (id < m_time_processor.machines.size()) { + m_time_processor.machines[id].retract_acceleration = (m_time_processor.machines[id].max_retract_acceleration == 0.0f) ? value : + // Clamp the acceleration with the maximum. + std::min(value, m_time_processor.machines[id].max_retract_acceleration); + } +} +#endif // ENABLE_RETRACT_ACCELERATION float GCodeProcessor::get_acceleration(PrintEstimatedStatistics::ETimeMode mode) const { diff --git a/src/libslic3r/GCode/GCodeProcessor.hpp b/src/libslic3r/GCode/GCodeProcessor.hpp index 999af481de..4fcdd8df39 100644 --- a/src/libslic3r/GCode/GCodeProcessor.hpp +++ b/src/libslic3r/GCode/GCodeProcessor.hpp @@ -242,6 +242,11 @@ namespace Slic3r { float acceleration; // mm/s^2 // hard limit for the acceleration, to which the firmware will clamp. float max_acceleration; // mm/s^2 +#if ENABLE_RETRACT_ACCELERATION + float retract_acceleration; // mm/s^2 + // hard limit for the acceleration, to which the firmware will clamp. + float max_retract_acceleration; // mm/s^2 +#endif // ENABLE_RETRACT_ACCELERATION float travel_acceleration; // mm/s^2 // hard limit for the travel acceleration, to which the firmware will clamp. float max_travel_acceleration; // mm/s^2 @@ -669,6 +674,9 @@ namespace Slic3r { float get_axis_max_acceleration(PrintEstimatedStatistics::ETimeMode mode, Axis axis) const; float get_axis_max_jerk(PrintEstimatedStatistics::ETimeMode mode, Axis axis) const; float get_retract_acceleration(PrintEstimatedStatistics::ETimeMode mode) const; +#if ENABLE_RETRACT_ACCELERATION + void set_retract_acceleration(PrintEstimatedStatistics::ETimeMode mode, float value); +#endif // ENABLE_RETRACT_ACCELERATION float get_acceleration(PrintEstimatedStatistics::ETimeMode mode) const; void set_acceleration(PrintEstimatedStatistics::ETimeMode mode, float value); float get_travel_acceleration(PrintEstimatedStatistics::ETimeMode mode) const; diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index f6366c18e7..02d8fccd45 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -47,6 +47,8 @@ #define ENABLE_FIX_IMPORTING_COLOR_PRINT_VIEW_INTO_GCODEVIEWER (1 && ENABLE_2_4_0_ALPHA0) // Enable drawing contours, at cut level, for sinking volumes #define ENABLE_SINKING_CONTOURS (1 && ENABLE_2_4_0_ALPHA0) +// Enable implementation of retract acceleration in gcode processor +#define ENABLE_RETRACT_ACCELERATION (1 && ENABLE_2_4_0_ALPHA0) #endif // _prusaslicer_technologies_h_