This commit is contained in:
Enrico Turri 2018-01-18 09:16:37 +01:00
commit 6591620200
2 changed files with 25 additions and 5 deletions

View File

@ -56,7 +56,9 @@ namespace Slic3r {
float GCodeTimeEstimator::Block::Trapezoid::speed_from_distance(float initial_feedrate, float distance, float acceleration) float GCodeTimeEstimator::Block::Trapezoid::speed_from_distance(float initial_feedrate, float distance, float acceleration)
{ {
return ::sqrt(sqr(initial_feedrate) + 2.0f * acceleration * distance); // to avoid invalid negative numbers due to numerical imprecision
float value = std::max(0.0f, sqr(initial_feedrate) + 2.0f * acceleration * distance);
return ::sqrt(value);
} }
float GCodeTimeEstimator::Block::move_length() const float GCodeTimeEstimator::Block::move_length() const
@ -122,7 +124,9 @@ namespace Slic3r {
float GCodeTimeEstimator::Block::max_allowable_speed(float acceleration, float target_velocity, float distance) float GCodeTimeEstimator::Block::max_allowable_speed(float acceleration, float target_velocity, float distance)
{ {
return ::sqrt(sqr(target_velocity) - 2.0f * acceleration * distance); // to avoid invalid negative numbers due to numerical imprecision
float value = std::max(0.0f, sqr(target_velocity) - 2.0f * acceleration * distance);
return ::sqrt(value);
} }
float GCodeTimeEstimator::Block::estimate_acceleration_distance(float initial_rate, float target_rate, float acceleration) float GCodeTimeEstimator::Block::estimate_acceleration_distance(float initial_rate, float target_rate, float acceleration)
@ -149,6 +153,9 @@ namespace Slic3r {
[this](GCodeReader &reader, const GCodeReader::GCodeLine &line) [this](GCodeReader &reader, const GCodeReader::GCodeLine &line)
{ this->_process_gcode_line(reader, line); }); { this->_process_gcode_line(reader, line); });
_calculate_time();
_reset_blocks();
_reset(); _reset();
} }
@ -159,6 +166,7 @@ namespace Slic3r {
_parser.parse_file(file, boost::bind(&GCodeTimeEstimator::_process_gcode_line, this, _1, _2)); _parser.parse_file(file, boost::bind(&GCodeTimeEstimator::_process_gcode_line, this, _1, _2));
_calculate_time(); _calculate_time();
_reset_blocks();
_reset(); _reset();
} }
@ -172,6 +180,7 @@ namespace Slic3r {
_parser.parse_line(line, action); _parser.parse_line(line, action);
_calculate_time(); _calculate_time();
_reset_blocks();
_reset(); _reset();
} }
@ -199,6 +208,7 @@ namespace Slic3r {
{ {
PROFILE_FUNC(); PROFILE_FUNC();
_calculate_time(); _calculate_time();
_reset_blocks();
_reset(); _reset();
} }
@ -383,6 +393,7 @@ namespace Slic3r {
void GCodeTimeEstimator::reset() void GCodeTimeEstimator::reset()
{ {
_time = 0.0f; _time = 0.0f;
_reset_blocks();
_reset(); _reset();
} }
@ -412,8 +423,6 @@ namespace Slic3r {
void GCodeTimeEstimator::_reset() void GCodeTimeEstimator::_reset()
{ {
_blocks.clear();
_curr.reset(); _curr.reset();
_prev.reset(); _prev.reset();
@ -424,6 +433,11 @@ namespace Slic3r {
set_additional_time(0.0f); set_additional_time(0.0f);
} }
void GCodeTimeEstimator::_reset_blocks()
{
_blocks.clear();
}
void GCodeTimeEstimator::_calculate_time() void GCodeTimeEstimator::_calculate_time()
{ {
_forward_pass(); _forward_pass();
@ -950,7 +964,7 @@ namespace Slic3r {
void GCodeTimeEstimator::_simulate_st_synchronize() void GCodeTimeEstimator::_simulate_st_synchronize()
{ {
_calculate_time(); _calculate_time();
_reset(); _reset_blocks();
} }
void GCodeTimeEstimator::_forward_pass() void GCodeTimeEstimator::_forward_pass()

View File

@ -7,6 +7,11 @@
namespace Slic3r { namespace Slic3r {
//
// Some of the algorithms used by class GCodeTimeEstimator were inpired by
// Cura Engine's class TimeEstimateCalculator
// https://github.com/Ultimaker/CuraEngine/blob/master/src/timeEstimate.h
//
class GCodeTimeEstimator class GCodeTimeEstimator
{ {
public: public:
@ -241,6 +246,7 @@ namespace Slic3r {
private: private:
void _reset(); void _reset();
void _reset_blocks();
// Calculates the time estimate // Calculates the time estimate
void _calculate_time(); void _calculate_time();