#ifndef slic3r_Extruder_hpp_ #define slic3r_Extruder_hpp_ #include "libslic3r.h" #include "Point.hpp" namespace Slic3r { class GCodeConfig; class Extruder { public: Extruder(unsigned int id, GCodeConfig *config); ~Extruder() = default; unsigned int id() const { return m_id; } // Following three methods emit: // first - extrusion delta // second - number to emit to G-code: This may be delta for relative mode or a distance from last reset_E() for absolute mode. // They also quantize the E axis to G-code resolution. std::pair extrude(double dE); std::pair retract(double retract_length, double restart_extra); std::pair unretract(); // How much to retract yet before retract_length is reached? // The value is quantized to G-code resolution. double retract_to_go(double retract_length) const; // Reset the current state of the E axis (this is only needed for relative extruder addressing mode anyways). // Returns true if the extruder was non-zero before reset. bool reset_E() { bool modified = m_E != 0; m_E = 0.; return modified; } 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; } // Used filament volume in mm^3. double extruded_volume() const; // Used filament length in mm. double used_filament() 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_cost() const; double extrusion_multiplier() const; double retract_before_wipe() const; double retract_length() const; double retract_lift() const; int retract_speed() const; int deretract_speed() const; double retract_restart_extra() const; double retract_length_toolchange() const; double retract_restart_extra_toolchange() const; private: // Private constructor to create a key for a search in std::set. Extruder(unsigned int id) : m_id(id) {} // Reference to GCodeWriter instance owned by GCodeWriter. GCodeConfig *m_config; // Print-wide global ID of this extruder. unsigned int m_id; // Current state of the extruder axis. // For absolute extruder addressing, it is the current state since the last reset (G92 E0) issued at the end of the last retraction. // For relative extruder addressing, it is the E axis difference emitted into the G-code the last time. double m_E { 0 }; // Current state of the extruder tachometer, used to output the extruded_volume() and used_filament() statistics. double m_absolute_E { 0 }; // Current positive amount of retraction. double m_retracted { 0 }; // When retracted, this value stores the extra amount of priming on deretraction. double m_restart_extra { 0 }; double m_e_per_mm3; }; // Sort Extruder objects by the extruder id by default. inline bool operator==(const Extruder &e1, const Extruder &e2) { return e1.id() == e2.id(); } inline bool operator!=(const Extruder &e1, const Extruder &e2) { return e1.id() != e2.id(); } inline bool operator< (const Extruder &e1, const Extruder &e2) { return e1.id() < e2.id(); } inline bool operator> (const Extruder &e1, const Extruder &e2) { return e1.id() > e2.id(); } } #endif // slic3r_Extruder_hpp_