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

github.com/prusa3d/PrusaSlicer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/libslic3r/Extruder.cpp')
-rw-r--r--src/libslic3r/Extruder.cpp138
1 files changed, 138 insertions, 0 deletions
diff --git a/src/libslic3r/Extruder.cpp b/src/libslic3r/Extruder.cpp
new file mode 100644
index 000000000..74d900825
--- /dev/null
+++ b/src/libslic3r/Extruder.cpp
@@ -0,0 +1,138 @@
+#include "Extruder.hpp"
+
+namespace Slic3r {
+
+Extruder::Extruder(unsigned int id, GCodeConfig *config) :
+ m_id(id),
+ m_config(config)
+{
+ reset();
+
+ // cache values that are going to be called often
+ m_e_per_mm3 = this->extrusion_multiplier();
+ if (! m_config->use_volumetric_e)
+ m_e_per_mm3 /= this->filament_crossection();
+}
+
+double Extruder::extrude(double dE)
+{
+ // in case of relative E distances we always reset to 0 before any output
+ if (m_config->use_relative_e_distances)
+ m_E = 0.;
+ m_E += dE;
+ m_absolute_E += dE;
+ if (dE < 0.)
+ m_retracted -= dE;
+ return dE;
+}
+
+/* This method makes sure the extruder is retracted by the specified amount
+ of filament and returns the amount of filament retracted.
+ If the extruder is already retracted by the same or a greater amount,
+ this method is a no-op.
+ The restart_extra argument sets the extra length to be used for
+ unretraction. If we're actually performing a retraction, any restart_extra
+ value supplied will overwrite the previous one if any. */
+double Extruder::retract(double length, double restart_extra)
+{
+ // in case of relative E distances we always reset to 0 before any output
+ if (m_config->use_relative_e_distances)
+ m_E = 0.;
+ double to_retract = std::max(0., length - m_retracted);
+ if (to_retract > 0.) {
+ m_E -= to_retract;
+ m_absolute_E -= to_retract;
+ m_retracted += to_retract;
+ m_restart_extra = restart_extra;
+ }
+ return to_retract;
+}
+
+double Extruder::unretract()
+{
+ double dE = m_retracted + m_restart_extra;
+ this->extrude(dE);
+ m_retracted = 0.;
+ m_restart_extra = 0.;
+ return dE;
+}
+
+// Used filament volume in mm^3.
+double Extruder::extruded_volume() const
+{
+ return m_config->use_volumetric_e ?
+ m_absolute_E + m_retracted :
+ this->used_filament() * this->filament_crossection();
+}
+
+// Used filament length in mm.
+double Extruder::used_filament() const
+{
+ return m_config->use_volumetric_e ?
+ this->extruded_volume() / this->filament_crossection() :
+ m_absolute_E + m_retracted;
+}
+
+double Extruder::filament_diameter() const
+{
+ return m_config->filament_diameter.get_at(m_id);
+}
+
+double Extruder::filament_density() const
+{
+ return m_config->filament_density.get_at(m_id);
+}
+
+double Extruder::filament_cost() const
+{
+ return m_config->filament_cost.get_at(m_id);
+}
+
+double Extruder::extrusion_multiplier() const
+{
+ return m_config->extrusion_multiplier.get_at(m_id);
+}
+
+// Return a "retract_before_wipe" percentage as a factor clamped to <0, 1>
+double Extruder::retract_before_wipe() const
+{
+ return std::min(1., std::max(0., m_config->retract_before_wipe.get_at(m_id) * 0.01));
+}
+
+double Extruder::retract_length() const
+{
+ return m_config->retract_length.get_at(m_id);
+}
+
+double Extruder::retract_lift() const
+{
+ return m_config->retract_lift.get_at(m_id);
+}
+
+int Extruder::retract_speed() const
+{
+ return int(floor(m_config->retract_speed.get_at(m_id)+0.5));
+}
+
+int Extruder::deretract_speed() const
+{
+ int speed = int(floor(m_config->deretract_speed.get_at(m_id)+0.5));
+ return (speed > 0) ? speed : this->retract_speed();
+}
+
+double Extruder::retract_restart_extra() const
+{
+ return m_config->retract_restart_extra.get_at(m_id);
+}
+
+double Extruder::retract_length_toolchange() const
+{
+ return m_config->retract_length_toolchange.get_at(m_id);
+}
+
+double Extruder::retract_restart_extra_toolchange() const
+{
+ return m_config->retract_restart_extra_toolchange.get_at(m_id);
+}
+
+}