diff --git a/src/libslic3r/GCode/GCodeProcessor.cpp b/src/libslic3r/GCode/GCodeProcessor.cpp index c045cbcc2..b2900a157 100644 --- a/src/libslic3r/GCode/GCodeProcessor.cpp +++ b/src/libslic3r/GCode/GCodeProcessor.cpp @@ -724,6 +724,9 @@ void GCodeProcessor::apply_config(const DynamicPrintConfig& config) m_time_processor.machines[i].acceleration = (max_acceleration > 0.0f) ? max_acceleration : DEFAULT_ACCELERATION; } + if (m_time_processor.machine_limits.machine_max_acceleration_x.values.size() > 1) + enable_stealth_time_estimator(true); + #if ENABLE_VOLUMETRIC_EXTRUSION_PROCESSING const ConfigOptionBool* use_volumetric_e = config.option("use_volumetric_e"); if (use_volumetric_e != nullptr) @@ -2140,32 +2143,29 @@ void GCodeProcessor::process_M135(const GCodeReader::GCodeLine& line) void GCodeProcessor::process_M201(const GCodeReader::GCodeLine& line) { - if (!m_time_processor.machine_envelope_processing_enabled) - return; - // see http://reprap.org/wiki/G-code#M201:_Set_max_printing_acceleration float factor = ((m_flavor != gcfRepRapSprinter && m_flavor != gcfRepRapFirmware) && m_units == EUnits::Inches) ? INCHES_TO_MM : 1.0f; for (size_t i = 0; i < static_cast(PrintEstimatedTimeStatistics::ETimeMode::Count); ++i) { - if (line.has_x()) - set_option_value(m_time_processor.machine_limits.machine_max_acceleration_x, i, line.x() * factor); + if (static_cast(i) == PrintEstimatedTimeStatistics::ETimeMode::Normal || + m_time_processor.machine_envelope_processing_enabled) { + if (line.has_x()) + set_option_value(m_time_processor.machine_limits.machine_max_acceleration_x, i, line.x() * factor); - if (line.has_y()) - set_option_value(m_time_processor.machine_limits.machine_max_acceleration_y, i, line.y() * factor); + if (line.has_y()) + set_option_value(m_time_processor.machine_limits.machine_max_acceleration_y, i, line.y() * factor); - if (line.has_z()) - set_option_value(m_time_processor.machine_limits.machine_max_acceleration_z, i, line.z() * factor); + if (line.has_z()) + set_option_value(m_time_processor.machine_limits.machine_max_acceleration_z, i, line.z() * factor); - if (line.has_e()) - set_option_value(m_time_processor.machine_limits.machine_max_acceleration_e, i, line.e() * factor); + if (line.has_e()) + set_option_value(m_time_processor.machine_limits.machine_max_acceleration_e, i, line.e() * factor); + } } } void GCodeProcessor::process_M203(const GCodeReader::GCodeLine& line) { - if (!m_time_processor.machine_envelope_processing_enabled) - return; - // see http://reprap.org/wiki/G-code#M203:_Set_maximum_feedrate if (m_flavor == gcfRepetier) return; @@ -2175,45 +2175,48 @@ void GCodeProcessor::process_M203(const GCodeReader::GCodeLine& line) float factor = (m_flavor == gcfMarlin || m_flavor == gcfSmoothie) ? 1.0f : MMMIN_TO_MMSEC; for (size_t i = 0; i < static_cast(PrintEstimatedTimeStatistics::ETimeMode::Count); ++i) { - if (line.has_x()) - set_option_value(m_time_processor.machine_limits.machine_max_feedrate_x, i, line.x() * factor); + if (static_cast(i) == PrintEstimatedTimeStatistics::ETimeMode::Normal || + m_time_processor.machine_envelope_processing_enabled) { + if (line.has_x()) + set_option_value(m_time_processor.machine_limits.machine_max_feedrate_x, i, line.x() * factor); - if (line.has_y()) - set_option_value(m_time_processor.machine_limits.machine_max_feedrate_y, i, line.y() * factor); + if (line.has_y()) + set_option_value(m_time_processor.machine_limits.machine_max_feedrate_y, i, line.y() * factor); - if (line.has_z()) - set_option_value(m_time_processor.machine_limits.machine_max_feedrate_z, i, line.z() * factor); + if (line.has_z()) + set_option_value(m_time_processor.machine_limits.machine_max_feedrate_z, i, line.z() * factor); - if (line.has_e()) - set_option_value(m_time_processor.machine_limits.machine_max_feedrate_e, i, line.e() * factor); + if (line.has_e()) + set_option_value(m_time_processor.machine_limits.machine_max_feedrate_e, i, line.e() * factor); + } } } void GCodeProcessor::process_M204(const GCodeReader::GCodeLine& line) { - if (!m_time_processor.machine_envelope_processing_enabled) - return; - float value; for (size_t i = 0; i < static_cast(PrintEstimatedTimeStatistics::ETimeMode::Count); ++i) { - if (line.has_value('S', value)) { - // Legacy acceleration format. This format is used by the legacy Marlin, MK2 or MK3 firmware, - // and it is also generated by Slic3r to control acceleration per extrusion type - // (there is a separate acceleration settings in Slicer for perimeter, first layer etc). - set_acceleration(static_cast(i), value); - if (line.has_value('T', value)) - set_option_value(m_time_processor.machine_limits.machine_max_acceleration_retracting, i, value); - } - else { - // New acceleration format, compatible with the upstream Marlin. - if (line.has_value('P', value)) + if (static_cast(i) == PrintEstimatedTimeStatistics::ETimeMode::Normal || + m_time_processor.machine_envelope_processing_enabled) { + if (line.has_value('S', value)) { + // Legacy acceleration format. This format is used by the legacy Marlin, MK2 or MK3 firmware, + // and it is also generated by Slic3r to control acceleration per extrusion type + // (there is a separate acceleration settings in Slicer for perimeter, first layer etc). set_acceleration(static_cast(i), value); - if (line.has_value('R', value)) - set_option_value(m_time_processor.machine_limits.machine_max_acceleration_retracting, i, value); - if (line.has_value('T', value)) { - // Interpret the T value as the travel acceleration in the new Marlin format. - //FIXME Prusa3D firmware currently does not support travel acceleration value independent from the extruding acceleration value. - // set_travel_acceleration(value); + if (line.has_value('T', value)) + set_option_value(m_time_processor.machine_limits.machine_max_acceleration_retracting, i, value); + } + 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)) + set_option_value(m_time_processor.machine_limits.machine_max_acceleration_retracting, i, value); + if (line.has_value('T', value)) { + // Interpret the T value as the travel acceleration in the new Marlin format. + //FIXME Prusa3D firmware currently does not support travel acceleration value independent from the extruding acceleration value. + // set_travel_acceleration(value); + } } } } @@ -2221,31 +2224,31 @@ void GCodeProcessor::process_M204(const GCodeReader::GCodeLine& line) void GCodeProcessor::process_M205(const GCodeReader::GCodeLine& line) { - if (!m_time_processor.machine_envelope_processing_enabled) - return; - for (size_t i = 0; i < static_cast(PrintEstimatedTimeStatistics::ETimeMode::Count); ++i) { - if (line.has_x()) { - float max_jerk = line.x(); - set_option_value(m_time_processor.machine_limits.machine_max_jerk_x, i, max_jerk); - set_option_value(m_time_processor.machine_limits.machine_max_jerk_y, i, max_jerk); + if (static_cast(i) == PrintEstimatedTimeStatistics::ETimeMode::Normal || + m_time_processor.machine_envelope_processing_enabled) { + if (line.has_x()) { + float max_jerk = line.x(); + set_option_value(m_time_processor.machine_limits.machine_max_jerk_x, i, max_jerk); + set_option_value(m_time_processor.machine_limits.machine_max_jerk_y, i, max_jerk); + } + + if (line.has_y()) + set_option_value(m_time_processor.machine_limits.machine_max_jerk_y, i, line.y()); + + if (line.has_z()) + set_option_value(m_time_processor.machine_limits.machine_max_jerk_z, i, line.z()); + + if (line.has_e()) + set_option_value(m_time_processor.machine_limits.machine_max_jerk_e, i, line.e()); + + float value; + if (line.has_value('S', value)) + set_option_value(m_time_processor.machine_limits.machine_min_extruding_rate, i, value); + + if (line.has_value('T', value)) + set_option_value(m_time_processor.machine_limits.machine_min_travel_rate, i, value); } - - if (line.has_y()) - set_option_value(m_time_processor.machine_limits.machine_max_jerk_y, i, line.y()); - - if (line.has_z()) - set_option_value(m_time_processor.machine_limits.machine_max_jerk_z, i, line.z()); - - if (line.has_e()) - set_option_value(m_time_processor.machine_limits.machine_max_jerk_e, i, line.e()); - - float value; - if (line.has_value('S', value)) - set_option_value(m_time_processor.machine_limits.machine_min_extruding_rate, i, value); - - if (line.has_value('T', value)) - set_option_value(m_time_processor.machine_limits.machine_min_travel_rate, i, value); } } diff --git a/src/libslic3r/GCode/GCodeProcessor.hpp b/src/libslic3r/GCode/GCodeProcessor.hpp index 4cb2092e8..5068d0fd6 100644 --- a/src/libslic3r/GCode/GCodeProcessor.hpp +++ b/src/libslic3r/GCode/GCodeProcessor.hpp @@ -242,7 +242,7 @@ namespace Slic3r { bool extruder_unloaded; // whether or not to export post-process the gcode to export lines M73 in it bool export_remaining_time_enabled; - // allow to skip the lines M201/M203/M204/M205 generated by GCode::print_machine_envelope() + // allow to skip the lines M201/M203/M204/M205 generated by GCode::print_machine_envelope() for non-Normal time estimate mode bool machine_envelope_processing_enabled; MachineEnvelopeConfig machine_limits; // Additional load / unload times for a filament exchange sequence. diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index fb7a81a4f..4526bc51d 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -4857,7 +4857,6 @@ void Plater::load_gcode(const wxString& filename) // process gcode GCodeProcessor processor; processor.enable_producers(true); - processor.enable_machine_envelope_processing(true); processor.process_file(filename.ToUTF8().data(), false); p->gcode_result = std::move(processor.extract_result());