Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/supermerill/SuperSlicer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEnrico Turri <enricoturri@seznam.cz>2018-01-18 11:16:37 +0300
committerEnrico Turri <enricoturri@seznam.cz>2018-01-18 11:16:37 +0300
commit65916202003ff429da2a4deb955638099b1dba8f (patch)
tree4670a250a2b6235b407ef7b1809968e5fac37eae /xs/src/libslic3r
parentd34f3ffc8320c6929db53233cd2e17d7dac11d01 (diff)
parente94491ee8c3a652ed16158d87f55543d30ac1f6f (diff)
Merge branch 'master' of https://github.com/prusa3d/Slic3r
Diffstat (limited to 'xs/src/libslic3r')
-rw-r--r--xs/src/libslic3r/GCodeTimeEstimator.cpp24
-rw-r--r--xs/src/libslic3r/GCodeTimeEstimator.hpp6
2 files changed, 25 insertions, 5 deletions
diff --git a/xs/src/libslic3r/GCodeTimeEstimator.cpp b/xs/src/libslic3r/GCodeTimeEstimator.cpp
index 2edbfeac5..22821a708 100644
--- a/xs/src/libslic3r/GCodeTimeEstimator.cpp
+++ b/xs/src/libslic3r/GCodeTimeEstimator.cpp
@@ -56,7 +56,9 @@ namespace Slic3r {
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
@@ -122,7 +124,9 @@ namespace Slic3r {
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)
@@ -149,6 +153,9 @@ namespace Slic3r {
[this](GCodeReader &reader, const GCodeReader::GCodeLine &line)
{ this->_process_gcode_line(reader, line); });
+ _calculate_time();
+
+ _reset_blocks();
_reset();
}
@@ -159,6 +166,7 @@ namespace Slic3r {
_parser.parse_file(file, boost::bind(&GCodeTimeEstimator::_process_gcode_line, this, _1, _2));
_calculate_time();
+ _reset_blocks();
_reset();
}
@@ -172,6 +180,7 @@ namespace Slic3r {
_parser.parse_line(line, action);
_calculate_time();
+ _reset_blocks();
_reset();
}
@@ -199,6 +208,7 @@ namespace Slic3r {
{
PROFILE_FUNC();
_calculate_time();
+ _reset_blocks();
_reset();
}
@@ -383,6 +393,7 @@ namespace Slic3r {
void GCodeTimeEstimator::reset()
{
_time = 0.0f;
+ _reset_blocks();
_reset();
}
@@ -412,8 +423,6 @@ namespace Slic3r {
void GCodeTimeEstimator::_reset()
{
- _blocks.clear();
-
_curr.reset();
_prev.reset();
@@ -424,6 +433,11 @@ namespace Slic3r {
set_additional_time(0.0f);
}
+ void GCodeTimeEstimator::_reset_blocks()
+ {
+ _blocks.clear();
+ }
+
void GCodeTimeEstimator::_calculate_time()
{
_forward_pass();
@@ -950,7 +964,7 @@ namespace Slic3r {
void GCodeTimeEstimator::_simulate_st_synchronize()
{
_calculate_time();
- _reset();
+ _reset_blocks();
}
void GCodeTimeEstimator::_forward_pass()
diff --git a/xs/src/libslic3r/GCodeTimeEstimator.hpp b/xs/src/libslic3r/GCodeTimeEstimator.hpp
index 9e429462e..fb41a2753 100644
--- a/xs/src/libslic3r/GCodeTimeEstimator.hpp
+++ b/xs/src/libslic3r/GCodeTimeEstimator.hpp
@@ -7,6 +7,11 @@
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
{
public:
@@ -241,6 +246,7 @@ namespace Slic3r {
private:
void _reset();
+ void _reset_blocks();
// Calculates the time estimate
void _calculate_time();