diff --git a/src/libslic3r/GCode/GCodeProcessor.cpp b/src/libslic3r/GCode/GCodeProcessor.cpp index 6fd42f7e5a..287610f8b2 100644 --- a/src/libslic3r/GCode/GCodeProcessor.cpp +++ b/src/libslic3r/GCode/GCodeProcessor.cpp @@ -311,7 +311,7 @@ void GCodeProcessor::TimeMachine::calculate_time(GCodeProcessorResult& result, P if (i == 0) block_time += additional_time; - time += block_time; + time += double(block_time); result.moves[block.move_id].time[static_cast(mode)] = block_time; gcode_time.cache += block_time; if (block.layer_id == 1) @@ -404,12 +404,12 @@ void GCodeProcessor::TimeMachine::calculate_time(GCodeProcessorResult& result, P std::nullopt }); } - g1_times_cache.push_back({ block.g1_line_id, block.remaining_internal_g1_lines, time }); + g1_times_cache.push_back({ block.g1_line_id, block.remaining_internal_g1_lines, float(time) }); // update times for remaining time to printer stop placeholders auto it_stop_time = std::lower_bound(stop_times.begin(), stop_times.end(), block.g1_line_id, [](const StopTime& t, unsigned int value) { return t.g1_line_id < value; }); if (it_stop_time != stop_times.end() && it_stop_time->g1_line_id == block.g1_line_id) - it_stop_time->elapsed_time = time; + it_stop_time->elapsed_time = float(time); } if (keep_last_n_blocks) { @@ -1397,12 +1397,12 @@ void GCodeProcessor::finalize(bool perform_post_process) float GCodeProcessor::get_time(PrintEstimatedStatistics::ETimeMode mode) const { - return (mode < PrintEstimatedStatistics::ETimeMode::Count) ? m_time_processor.machines[static_cast(mode)].time : 0.0f; + return (mode < PrintEstimatedStatistics::ETimeMode::Count) ? float(m_time_processor.machines[static_cast(mode)].time) : 0.0f; } std::string GCodeProcessor::get_time_dhm(PrintEstimatedStatistics::ETimeMode mode) const { - return (mode < PrintEstimatedStatistics::ETimeMode::Count) ? short_time(get_time_dhms(m_time_processor.machines[static_cast(mode)].time)) : std::string("N/A"); + return (mode < PrintEstimatedStatistics::ETimeMode::Count) ? short_time(get_time_dhms(float(m_time_processor.machines[static_cast(mode)].time))) : std::string("N/A"); } std::vector>> GCodeProcessor::get_custom_gcode_times(PrintEstimatedStatistics::ETimeMode mode, bool include_remaining) const diff --git a/src/libslic3r/GCode/GCodeProcessor.hpp b/src/libslic3r/GCode/GCodeProcessor.hpp index 068e7b34c5..f416d2513a 100644 --- a/src/libslic3r/GCode/GCodeProcessor.hpp +++ b/src/libslic3r/GCode/GCodeProcessor.hpp @@ -340,7 +340,9 @@ namespace Slic3r { // hard limit for the travel acceleration, to which the firmware will clamp. float max_travel_acceleration; // mm/s^2 float extrude_factor_override_percentage; - float time; // s + // We accumulate total print time in doubles to reduce the loss of precision + // while adding big floating numbers with small float numbers. + double time; // s struct StopTime { unsigned int g1_line_id;