mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-08-01 05:01:59 +08:00
Accumulate the total estimated print in doubles instead of floats.
Because total print time is typically a big floating point number and the time of trapezoid is typically a small number, summing those numbers leads to a loss in precision. Switching to doubles reduces the loss of precision.
This commit is contained in:
parent
90073dce70
commit
c5982f4019
@ -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<size_t>(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<size_t>(mode)].time : 0.0f;
|
||||
return (mode < PrintEstimatedStatistics::ETimeMode::Count) ? float(m_time_processor.machines[static_cast<size_t>(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<size_t>(mode)].time)) : std::string("N/A");
|
||||
return (mode < PrintEstimatedStatistics::ETimeMode::Count) ? short_time(get_time_dhms(float(m_time_processor.machines[static_cast<size_t>(mode)].time))) : std::string("N/A");
|
||||
}
|
||||
|
||||
std::vector<std::pair<CustomGCode::Type, std::pair<float, float>>> GCodeProcessor::get_custom_gcode_times(PrintEstimatedStatistics::ETimeMode mode, bool include_remaining) const
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user