mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-10-17 04:41:21 +00:00
84 lines
3.8 KiB
C++
84 lines
3.8 KiB
C++
#ifndef slic3r_CoolingBuffer_hpp_
|
|
#define slic3r_CoolingBuffer_hpp_
|
|
|
|
#include "../libslic3r.h"
|
|
#include <map>
|
|
#include <string>
|
|
#include <cfloat>
|
|
|
|
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<PerExtruderAdjustments> parse_layer_gcode(const std::string &gcode, std::vector<float> ¤t_pos) const;
|
|
float calculate_layer_slowdown(std::vector<PerExtruderAdjustments> &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<PerExtruderAdjustments> &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<char> m_axis;
|
|
std::vector<float> 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<unsigned int> 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
|