#ifndef slic3r_CoolingBuffer_hpp_ #define slic3r_CoolingBuffer_hpp_ #include "../libslic3r.h" #include #include #include namespace Slic3r { class GCode; class Layer; class FirstLayerPlane; struct PerExtruderAdjustments; // A standalone G-code filter, to control cooling of the print. // The G-code is processed per layer. Once a layer is collected, fan start / stop commands are edited // and the print is modified to stretch over a minimum layer time. // // The simple it sounds, the actual implementation is significantly more complex. // Namely, for a multi-extruder print, each material may require a different cooling logic. // For example, some materials may not like to print too slowly, while with some materials // we may slow down significantly. // class CoolingBuffer { public: CoolingBuffer(GCode &gcodegen); void reset(const Vec3d &position); void set_current_extruder(unsigned int extruder_id) { m_current_extruder = extruder_id; } std::string process_layer(std::string &&gcode, size_t layer_id, bool flush); private: CoolingBuffer& operator=(const CoolingBuffer&) = delete; std::vector parse_layer_gcode(const std::string &gcode, std::vector ¤t_pos) const; float calculate_layer_slowdown(std::vector &per_extruder_adjustments); // Apply slow down over G-code lines stored in per_extruder_adjustments, enable fan if needed. // Returns the adjusted G-code. std::string apply_layer_cooldown(const std::string &gcode, size_t layer_id, float layer_time, std::vector &per_extruder_adjustments); // First-layer plane: per-line fan re-evaluation post-pass. Walks the // post-cooldown gcode, tracks XYZ position, and inserts M106 commands at // band-crossing transitions in slicing-frame coordinates. Only runs // when m_first_layer_plane is active. std::string apply_first_layer_plane_fan_eval(std::string &&gcode_in, size_t layer_id, float layer_time); // Pure helper: compute the main fan speed for a given effective layer // index (layer-id units, mapped through the plane evaluator) and the // current extruder. Mirrors the inline logic in the change_extruder_set_fan // lambda but is callable from per-line code. int compute_main_fan_speed(int effective_layer_id, float layer_time, unsigned int extruder_id) const; // G-code snippet cached for the support layers preceding an object layer. std::string m_gcode; // Internal data. // BBS: X,Y,Z,E,F,I,J std::vector m_axis; std::vector m_current_pos; // Current known fan speed or -1 if not known yet. int m_fan_speed; int m_additional_fan_speed; // Cached from GCodeWriter. // Printing extruder IDs, zero based. std::vector m_extruder_ids; // Highest of m_extruder_ids plus 1. unsigned int m_num_extruders { 0 }; const std::string m_toolchange_prefix; // Referencs GCode::m_config, which is FullPrintConfig. While the PrintObjectConfig slice of FullPrintConfig is being modified, // the PrintConfig slice of FullPrintConfig is constant, thus no thread synchronization is required. const PrintConfig &m_config; unsigned int m_current_extruder; //BBS: current fan speed int m_current_fan_speed; // First-layer plane evaluator, borrowed from GCode. Null = inactive // (legacy per-layer fan control). const FirstLayerPlane *m_first_layer_plane = nullptr; }; } #endif