Include the wipe tower print time into the cooling time.
Further refactoring of Extruder class.
This commit is contained in:
parent
0454cc95f9
commit
39b9341359
6 changed files with 67 additions and 72 deletions
|
@ -2,29 +2,27 @@
|
||||||
|
|
||||||
namespace Slic3r {
|
namespace Slic3r {
|
||||||
|
|
||||||
Extruder::Extruder(unsigned int id, GCodeConfig *config)
|
Extruder::Extruder(unsigned int id, GCodeConfig *config) :
|
||||||
: m_id(id),
|
m_id(id),
|
||||||
m_config(config)
|
m_config(config)
|
||||||
{
|
{
|
||||||
reset();
|
reset();
|
||||||
|
|
||||||
// cache values that are going to be called often
|
// cache values that are going to be called often
|
||||||
if (m_config->use_volumetric_e) {
|
m_e_per_mm3 = this->extrusion_multiplier();
|
||||||
m_e_per_mm3 = this->extrusion_multiplier();
|
if (! m_config->use_volumetric_e)
|
||||||
} else {
|
m_e_per_mm3 /= this->filament_crossection();
|
||||||
m_e_per_mm3 = this->extrusion_multiplier()
|
|
||||||
* (4 / ((this->filament_diameter() * this->filament_diameter()) * PI));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
double Extruder::extrude(double dE)
|
double Extruder::extrude(double dE)
|
||||||
{
|
{
|
||||||
// in case of relative E distances we always reset to 0 before any output
|
// in case of relative E distances we always reset to 0 before any output
|
||||||
if (m_config->use_relative_e_distances)
|
if (m_config->use_relative_e_distances)
|
||||||
this->E = 0;
|
m_E = 0.;
|
||||||
|
m_E += dE;
|
||||||
this->E += dE;
|
m_absolute_E += dE;
|
||||||
this->absolute_E += dE;
|
if (dE < 0.)
|
||||||
|
m_retracted -= dE;
|
||||||
return dE;
|
return dE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -39,54 +37,40 @@ double Extruder::retract(double length, double restart_extra)
|
||||||
{
|
{
|
||||||
// in case of relative E distances we always reset to 0 before any output
|
// in case of relative E distances we always reset to 0 before any output
|
||||||
if (m_config->use_relative_e_distances)
|
if (m_config->use_relative_e_distances)
|
||||||
this->E = 0;
|
m_E = 0.;
|
||||||
|
double to_retract = std::max(0., length - m_retracted);
|
||||||
double to_retract = length - this->retracted;
|
if (to_retract > 0.) {
|
||||||
if (to_retract > 0) {
|
m_E -= to_retract;
|
||||||
this->E -= to_retract;
|
m_absolute_E -= to_retract;
|
||||||
this->absolute_E -= to_retract;
|
m_retracted += to_retract;
|
||||||
this->retracted += to_retract;
|
m_restart_extra = restart_extra;
|
||||||
this->restart_extra = restart_extra;
|
|
||||||
return to_retract;
|
|
||||||
} else {
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
return to_retract;
|
||||||
}
|
}
|
||||||
|
|
||||||
double Extruder::unretract()
|
double Extruder::unretract()
|
||||||
{
|
{
|
||||||
double dE = this->retracted + this->restart_extra;
|
double dE = m_retracted + m_restart_extra;
|
||||||
this->extrude(dE);
|
this->extrude(dE);
|
||||||
this->retracted = 0;
|
m_retracted = 0.;
|
||||||
this->restart_extra = 0;
|
m_restart_extra = 0.;
|
||||||
return dE;
|
return dE;
|
||||||
}
|
}
|
||||||
|
|
||||||
double Extruder::e_per_mm(double mm3_per_mm) const
|
// Used filament volume in mm^3.
|
||||||
{
|
|
||||||
return mm3_per_mm * m_e_per_mm3;
|
|
||||||
}
|
|
||||||
|
|
||||||
double Extruder::extruded_volume() const
|
double Extruder::extruded_volume() const
|
||||||
{
|
{
|
||||||
if (m_config->use_volumetric_e) {
|
return m_config->use_volumetric_e ?
|
||||||
// Any current amount of retraction should not affect used filament, since
|
m_absolute_E + m_retracted :
|
||||||
// it represents empty volume in the nozzle. We add it back to E.
|
this->used_filament() * this->filament_crossection();
|
||||||
return this->absolute_E + this->retracted;
|
|
||||||
}
|
|
||||||
|
|
||||||
return this->used_filament() * (this->filament_diameter() * this->filament_diameter()) * PI/4;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Used filament length in mm.
|
||||||
double Extruder::used_filament() const
|
double Extruder::used_filament() const
|
||||||
{
|
{
|
||||||
if (m_config->use_volumetric_e) {
|
return m_config->use_volumetric_e ?
|
||||||
return this->extruded_volume() / (this->filament_diameter() * this->filament_diameter() * PI/4);
|
this->extruded_volume() / this->filament_crossection() :
|
||||||
}
|
m_absolute_E + m_retracted;
|
||||||
|
|
||||||
// Any current amount of retraction should not affect used filament, since
|
|
||||||
// it represents empty volume in the nozzle. We add it back to E.
|
|
||||||
return this->absolute_E + this->retracted;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
double Extruder::filament_diameter() const
|
double Extruder::filament_diameter() const
|
||||||
|
@ -127,12 +111,12 @@ double Extruder::retract_lift() const
|
||||||
|
|
||||||
int Extruder::retract_speed() const
|
int Extruder::retract_speed() const
|
||||||
{
|
{
|
||||||
return m_config->retract_speed.get_at(m_id);
|
return int(floor(m_config->retract_speed.get_at(m_id)+0.5));
|
||||||
}
|
}
|
||||||
|
|
||||||
int Extruder::deretract_speed() const
|
int Extruder::deretract_speed() const
|
||||||
{
|
{
|
||||||
int speed = m_config->deretract_speed.get_at(m_id);
|
int speed = int(floor(m_config->deretract_speed.get_at(m_id)+0.5));
|
||||||
return (speed > 0) ? speed : this->retract_speed();
|
return (speed > 0) ? speed : this->retract_speed();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,19 +10,14 @@ namespace Slic3r {
|
||||||
class Extruder
|
class Extruder
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
double E;
|
|
||||||
double absolute_E;
|
|
||||||
double retracted;
|
|
||||||
double restart_extra;
|
|
||||||
|
|
||||||
Extruder(unsigned int id, GCodeConfig *config);
|
Extruder(unsigned int id, GCodeConfig *config);
|
||||||
virtual ~Extruder() {}
|
virtual ~Extruder() {}
|
||||||
|
|
||||||
void reset() {
|
void reset() {
|
||||||
this->E = 0;
|
m_E = 0;
|
||||||
this->absolute_E = 0;
|
m_absolute_E = 0;
|
||||||
this->retracted = 0;
|
m_retracted = 0;
|
||||||
this->restart_extra = 0;
|
m_restart_extra = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int id() const { return m_id; }
|
unsigned int id() const { return m_id; }
|
||||||
|
@ -30,12 +25,17 @@ public:
|
||||||
double extrude(double dE);
|
double extrude(double dE);
|
||||||
double retract(double length, double restart_extra);
|
double retract(double length, double restart_extra);
|
||||||
double unretract();
|
double unretract();
|
||||||
double e_per_mm(double mm3_per_mm) const;
|
double E() const { return m_E; }
|
||||||
|
void reset_E() { m_E = 0.; }
|
||||||
|
double e_per_mm(double mm3_per_mm) const { return mm3_per_mm * m_e_per_mm3; }
|
||||||
double e_per_mm3() const { return m_e_per_mm3; }
|
double e_per_mm3() const { return m_e_per_mm3; }
|
||||||
|
// Used filament volume in mm^3.
|
||||||
double extruded_volume() const;
|
double extruded_volume() const;
|
||||||
|
// Used filament length in mm.
|
||||||
double used_filament() const;
|
double used_filament() const;
|
||||||
|
|
||||||
double filament_diameter() const;
|
double filament_diameter() const;
|
||||||
|
double filament_crossection() const { return this->filament_diameter() * this->filament_diameter() * 0.25 * PI; }
|
||||||
double filament_density() const;
|
double filament_density() const;
|
||||||
double filament_cost() const;
|
double filament_cost() const;
|
||||||
double extrusion_multiplier() const;
|
double extrusion_multiplier() const;
|
||||||
|
@ -55,8 +55,18 @@ private:
|
||||||
// Private constructor to create a key for a search in std::set.
|
// Private constructor to create a key for a search in std::set.
|
||||||
Extruder(unsigned int id) : m_id(id) {}
|
Extruder(unsigned int id) : m_id(id) {}
|
||||||
|
|
||||||
|
// Reference to GCodeWriter instance owned by GCodeWriter.
|
||||||
GCodeConfig *m_config;
|
GCodeConfig *m_config;
|
||||||
|
// Print-wide global ID of this extruder.
|
||||||
unsigned int m_id;
|
unsigned int m_id;
|
||||||
|
// Current state of the extruder axis, may be resetted if use_relative_e_distances.
|
||||||
|
double m_E;
|
||||||
|
// Current state of the extruder tachometer, used to output the extruded_volume() and used_filament() statistics.
|
||||||
|
double m_absolute_E;
|
||||||
|
// Current positive amount of retraction.
|
||||||
|
double m_retracted;
|
||||||
|
// When retracted, this value stores the extra amount of priming on deretraction.
|
||||||
|
double m_restart_extra;
|
||||||
double m_e_per_mm3;
|
double m_e_per_mm3;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -121,10 +121,8 @@ Wipe::wipe(GCode &gcodegen, bool toolchange)
|
||||||
wipe_path.clip_end(wipe_path.length() - wipe_dist);
|
wipe_path.clip_end(wipe_path.length() - wipe_dist);
|
||||||
|
|
||||||
// subdivide the retraction in segments
|
// subdivide the retraction in segments
|
||||||
double retracted = 0;
|
for (const Line &line : wipe_path.lines()) {
|
||||||
Lines lines = wipe_path.lines();
|
double segment_length = line.length();
|
||||||
for (Lines::const_iterator line = lines.begin(); line != lines.end(); ++line) {
|
|
||||||
double segment_length = line->length();
|
|
||||||
/* Reduce retraction length a bit to avoid effective retraction speed to be greater than the configured one
|
/* Reduce retraction length a bit to avoid effective retraction speed to be greater than the configured one
|
||||||
due to rounding (TODO: test and/or better math for this) */
|
due to rounding (TODO: test and/or better math for this) */
|
||||||
double dE = length * (segment_length / wipe_dist) * 0.95;
|
double dE = length * (segment_length / wipe_dist) * 0.95;
|
||||||
|
@ -132,13 +130,11 @@ Wipe::wipe(GCode &gcodegen, bool toolchange)
|
||||||
// Is it here for the cooling markers? Or should it be outside of the cycle?
|
// Is it here for the cooling markers? Or should it be outside of the cycle?
|
||||||
gcode += gcodegen.writer().set_speed(wipe_speed*60, "", gcodegen.enable_cooling_markers() ? ";_WIPE" : "");
|
gcode += gcodegen.writer().set_speed(wipe_speed*60, "", gcodegen.enable_cooling_markers() ? ";_WIPE" : "");
|
||||||
gcode += gcodegen.writer().extrude_to_xy(
|
gcode += gcodegen.writer().extrude_to_xy(
|
||||||
gcodegen.point_to_gcode(line->b),
|
gcodegen.point_to_gcode(line.b),
|
||||||
-dE,
|
-dE,
|
||||||
"wipe and retract"
|
"wipe and retract"
|
||||||
);
|
);
|
||||||
retracted += dE;
|
|
||||||
}
|
}
|
||||||
gcodegen.writer().extruder()->retracted += retracted;
|
|
||||||
|
|
||||||
// prevent wiping again on same path
|
// prevent wiping again on same path
|
||||||
this->reset_path();
|
this->reset_path();
|
||||||
|
|
|
@ -121,6 +121,11 @@ struct ElapsedTime
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Potion of the total time, which cannot be stretched to heed the minimum layer print time.
|
||||||
|
float non_stretchable() const { return this->bridges + this->travel + this->other; }
|
||||||
|
// Potion of the total time, which could be stretched to heed the minimum layer print time.
|
||||||
|
float stretchable() const { return this->total - this->non_stretchable(); }
|
||||||
|
|
||||||
float total;
|
float total;
|
||||||
float bridges;
|
float bridges;
|
||||||
float external_perimeters;
|
float external_perimeters;
|
||||||
|
|
|
@ -83,8 +83,8 @@ std::string CoolingBuffer::flush()
|
||||||
fan_speed = config.max_fan_speed.values.front();
|
fan_speed = config.max_fan_speed.values.front();
|
||||||
|
|
||||||
// We are not altering speed of bridges.
|
// We are not altering speed of bridges.
|
||||||
float time_to_stretch = m_elapsed_time->total - m_elapsed_time->bridges;
|
float time_to_stretch = m_elapsed_time->stretchable();
|
||||||
float target_time = (float)config.slowdown_below_layer_time.values.front() - m_elapsed_time->bridges;
|
float target_time = (float)config.slowdown_below_layer_time.values.front() - m_elapsed_time->non_stretchable();
|
||||||
|
|
||||||
// If we spend most of our time on external perimeters include them in the slowdown,
|
// If we spend most of our time on external perimeters include them in the slowdown,
|
||||||
// otherwise only alter other extrusions.
|
// otherwise only alter other extrusions.
|
||||||
|
|
|
@ -197,9 +197,9 @@ std::string GCodeWriter::reset_e(bool force)
|
||||||
return "";
|
return "";
|
||||||
|
|
||||||
if (m_extruder != nullptr) {
|
if (m_extruder != nullptr) {
|
||||||
if (m_extruder->E == 0. && ! force)
|
if (m_extruder->E() == 0. && ! force)
|
||||||
return "";
|
return "";
|
||||||
m_extruder->E = 0.;
|
m_extruder->reset_E();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (! m_extrusion_axis.empty() && ! this->config.use_relative_e_distances) {
|
if (! m_extrusion_axis.empty() && ! this->config.use_relative_e_distances) {
|
||||||
|
@ -356,7 +356,7 @@ std::string GCodeWriter::extrude_to_xy(const Pointf &point, double dE, const std
|
||||||
std::ostringstream gcode;
|
std::ostringstream gcode;
|
||||||
gcode << "G1 X" << XYZF_NUM(point.x)
|
gcode << "G1 X" << XYZF_NUM(point.x)
|
||||||
<< " Y" << XYZF_NUM(point.y)
|
<< " Y" << XYZF_NUM(point.y)
|
||||||
<< " " << m_extrusion_axis << E_NUM(m_extruder->E);
|
<< " " << m_extrusion_axis << E_NUM(m_extruder->E());
|
||||||
COMMENT(comment);
|
COMMENT(comment);
|
||||||
gcode << "\n";
|
gcode << "\n";
|
||||||
return gcode.str();
|
return gcode.str();
|
||||||
|
@ -372,7 +372,7 @@ std::string GCodeWriter::extrude_to_xyz(const Pointf3 &point, double dE, const s
|
||||||
gcode << "G1 X" << XYZF_NUM(point.x)
|
gcode << "G1 X" << XYZF_NUM(point.x)
|
||||||
<< " Y" << XYZF_NUM(point.y)
|
<< " Y" << XYZF_NUM(point.y)
|
||||||
<< " Z" << XYZF_NUM(point.z)
|
<< " Z" << XYZF_NUM(point.z)
|
||||||
<< " " << m_extrusion_axis << E_NUM(m_extruder->E);
|
<< " " << m_extrusion_axis << E_NUM(m_extruder->E());
|
||||||
COMMENT(comment);
|
COMMENT(comment);
|
||||||
gcode << "\n";
|
gcode << "\n";
|
||||||
return gcode.str();
|
return gcode.str();
|
||||||
|
@ -425,7 +425,7 @@ std::string GCodeWriter::_retract(double length, double restart_extra, const std
|
||||||
else
|
else
|
||||||
gcode << "G10 ; retract\n";
|
gcode << "G10 ; retract\n";
|
||||||
} else {
|
} else {
|
||||||
gcode << "G1 " << m_extrusion_axis << E_NUM(m_extruder->E)
|
gcode << "G1 " << m_extrusion_axis << E_NUM(m_extruder->E())
|
||||||
<< " F" << float(m_extruder->retract_speed() * 60.);
|
<< " F" << float(m_extruder->retract_speed() * 60.);
|
||||||
COMMENT(comment);
|
COMMENT(comment);
|
||||||
gcode << "\n";
|
gcode << "\n";
|
||||||
|
@ -455,7 +455,7 @@ std::string GCodeWriter::unretract()
|
||||||
gcode << this->reset_e();
|
gcode << this->reset_e();
|
||||||
} else {
|
} else {
|
||||||
// use G1 instead of G0 because G0 will blend the restart with the previous travel move
|
// use G1 instead of G0 because G0 will blend the restart with the previous travel move
|
||||||
gcode << "G1 " << m_extrusion_axis << E_NUM(m_extruder->E)
|
gcode << "G1 " << m_extrusion_axis << E_NUM(m_extruder->E())
|
||||||
<< " F" << float(m_extruder->deretract_speed() * 60.);
|
<< " F" << float(m_extruder->deretract_speed() * 60.);
|
||||||
if (this->config.gcode_comments) gcode << " ; unretract";
|
if (this->config.gcode_comments) gcode << " ; unretract";
|
||||||
gcode << "\n";
|
gcode << "\n";
|
||||||
|
|
Loading…
Add table
Reference in a new issue