mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-05-20 20:03:47 +00:00
Fix first layer toolhead preaheating bug with 2+ extuders and ooze prevention enabled (#13741)
This commit is contained in:
committed by
GitHub
parent
ebf9d9fd42
commit
75039f8bec
@@ -1230,8 +1230,15 @@ void GCodeProcessor::run_post_process()
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Orca: track the current layer during the post-processing pass so that preheat M104s emitted
|
||||||
|
// for tool changes on the first layer use the correct first-layer temperature. The member
|
||||||
|
// m_layer_id is populated during the analysis pass and ends at the total layer count, so it
|
||||||
|
// cannot be used here — it would always select the "other layers" temperature for multi-layer
|
||||||
|
// prints.
|
||||||
|
unsigned int current_layer_id = 0;
|
||||||
|
|
||||||
// add lines M104 to exported gcode
|
// add lines M104 to exported gcode
|
||||||
auto process_line_T = [this, &export_line](const std::string& gcode_line, const size_t g1_lines_counter, const ExportLines::Backtrace& backtrace) {
|
auto process_line_T = [this, &export_line, ¤t_layer_id](const std::string& gcode_line, const size_t g1_lines_counter, const ExportLines::Backtrace& backtrace) {
|
||||||
const std::string cmd = GCodeReader::GCodeLine::extract_cmd(gcode_line);
|
const std::string cmd = GCodeReader::GCodeLine::extract_cmd(gcode_line);
|
||||||
|
|
||||||
int tool_number = -1;
|
int tool_number = -1;
|
||||||
@@ -1257,8 +1264,13 @@ void GCodeProcessor::run_post_process()
|
|||||||
export_line.insert_lines(
|
export_line.insert_lines(
|
||||||
backtrace, cmd,
|
backtrace, cmd,
|
||||||
// line inserter
|
// line inserter
|
||||||
[tool_number, this](unsigned int id, const std::vector<float>& time_diffs) {
|
[tool_number, this, ¤t_layer_id](unsigned int id, const std::vector<float>& time_diffs) {
|
||||||
const int temperature = int(m_layer_id != 1 ? m_filament_nozzle_temp[tool_number] :
|
// Orca: use the locally-tracked layer index (current_layer_id) rather than
|
||||||
|
// the stale m_layer_id from the analysis pass. current_layer_id == 0 means
|
||||||
|
// we haven't reached the first ;LAYER_CHANGE marker yet (e.g. tool change
|
||||||
|
// inside start gcode); == 1 means we are inside the first printed layer.
|
||||||
|
// Both cases should use the first-layer nozzle temperature.
|
||||||
|
const int temperature = int(current_layer_id > 1 ? m_filament_nozzle_temp[tool_number] :
|
||||||
m_filament_nozzle_temp_first_layer[tool_number]);
|
m_filament_nozzle_temp_first_layer[tool_number]);
|
||||||
// Orca: M104.1 for XL printers, I can't find the documentation for this so I copied the C++ comments from
|
// Orca: M104.1 for XL printers, I can't find the documentation for this so I copied the C++ comments from
|
||||||
// Prusa-Firmware-Buddy here
|
// Prusa-Firmware-Buddy here
|
||||||
@@ -1351,6 +1363,19 @@ void GCodeProcessor::run_post_process()
|
|||||||
if (eol) {
|
if (eol) {
|
||||||
++line_id;
|
++line_id;
|
||||||
const unsigned int internal_g1_lines_counter = export_line.update(gcode_line, line_id, g1_lines_counter);
|
const unsigned int internal_g1_lines_counter = export_line.update(gcode_line, line_id, g1_lines_counter);
|
||||||
|
// Orca: track the current layer for preheat temperature selection.
|
||||||
|
// The line is ";" + reserved_tag(Layer_Change) + EOL; match it independent of
|
||||||
|
// BBL vs. compatible flavor (which differ in the tag text).
|
||||||
|
if (gcode_line.size() > 1 && gcode_line.front() == ';') {
|
||||||
|
std::string_view tag_line(gcode_line);
|
||||||
|
// strip trailing CR/LF
|
||||||
|
while (!tag_line.empty() && (tag_line.back() == '\n' || tag_line.back() == '\r'))
|
||||||
|
tag_line.remove_suffix(1);
|
||||||
|
// strip leading ';'
|
||||||
|
tag_line.remove_prefix(1);
|
||||||
|
if (tag_line == reserved_tag(ETags::Layer_Change))
|
||||||
|
++current_layer_id;
|
||||||
|
}
|
||||||
// replace placeholder lines
|
// replace placeholder lines
|
||||||
bool processed = process_placeholders(gcode_line);
|
bool processed = process_placeholders(gcode_line);
|
||||||
if (processed)
|
if (processed)
|
||||||
|
|||||||
Reference in New Issue
Block a user