From ab81baee928c48d2b5dfcaf478f87b826f629425 Mon Sep 17 00:00:00 2001 From: "xun.zhang" Date: Mon, 19 Aug 2024 10:10:00 +0800 Subject: [PATCH] FIX: wrong placeholder data when filament change jira:NONE Signed-off-by: xun.zhang Change-Id: If6f6db1a2086c17541c7984c2db33d7bbcf21801 --- src/libslic3r/GCode.cpp | 118 ++++++++++++++++++++-------------------- 1 file changed, 59 insertions(+), 59 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 918874fce..67f65bdef 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -512,11 +512,11 @@ static std::vector get_path_of_change_filament(const Print& print) // m_max_layer_z = std::max(m_max_layer_z, tcr.print_z); if (! change_filament_gcode.empty()) { DynamicConfig config; - int previous_filament_id = gcodegen.writer().filament(new_extruder_id) ? (int)gcodegen.writer().filament(new_extruder_id)->id() : -1; - int previous_extruder_id = gcodegen.writer().filament(new_extruder_id) ? (int)gcodegen.writer().filament(new_extruder_id)->extruder_id() : -1; + int old_filament_id = gcodegen.writer().filament() ? (int)gcodegen.writer().filament()->id() : -1; + int old_extruder_id = gcodegen.writer().filament() ? (int)gcodegen.writer().filament()->extruder_id() : -1; - config.set_key_value("previous_extruder", new ConfigOptionInt(previous_filament_id)); - config.set_key_value("next_extruder", new ConfigOptionInt((int)new_filament_id)); + config.set_key_value("previous_extruder", new ConfigOptionInt(old_filament_id)); + config.set_key_value("next_extruder", new ConfigOptionInt(new_filament_id)); config.set_key_value("layer_num", new ConfigOptionInt(gcodegen.m_layer_index)); config.set_key_value("layer_z", new ConfigOptionFloat(tcr.print_z)); config.set_key_value("toolchange_z", new ConfigOptionFloat(z)); @@ -525,11 +525,11 @@ static std::vector get_path_of_change_filament(const Print& print) { GCodeWriter& gcode_writer = gcodegen.m_writer; FullPrintConfig& full_config = gcodegen.m_config; - float old_retract_length = gcode_writer.filament(new_extruder_id) != nullptr ? full_config.retraction_length.get_at(previous_filament_id) : 0; - float new_retract_length = full_config.retraction_length.get_at(new_extruder_id); - float old_retract_length_toolchange = gcode_writer.filament(new_extruder_id) != nullptr ? full_config.retract_length_toolchange.get_at(previous_filament_id) : 0; - float new_retract_length_toolchange = full_config.retract_length_toolchange.get_at(new_extruder_id); - int old_filament_temp = gcode_writer.filament(new_extruder_id) != nullptr ? (gcodegen.on_first_layer()? full_config.nozzle_temperature_initial_layer.get_at(previous_filament_id) : full_config.nozzle_temperature.get_at(previous_filament_id)) : 210; + float old_retract_length = (old_filament_id != -1) ? full_config.retraction_length.get_at(old_filament_id) : 0; + float new_retract_length = full_config.retraction_length.get_at(new_filament_id); + float old_retract_length_toolchange = (old_filament_id != -1) ? full_config.retract_length_toolchange.get_at(old_filament_id) : 0; + float new_retract_length_toolchange = full_config.retract_length_toolchange.get_at(new_filament_id); + int old_filament_temp = (old_filament_id != -1) ? (gcodegen.on_first_layer()? full_config.nozzle_temperature_initial_layer.get_at(old_filament_id) : full_config.nozzle_temperature.get_at(old_filament_id)) : 210; int new_filament_temp = gcodegen.on_first_layer() ? full_config.nozzle_temperature_initial_layer.get_at(new_filament_id) : full_config.nozzle_temperature.get_at(new_filament_id); Vec3d nozzle_pos = gcode_writer.get_position(); @@ -537,7 +537,7 @@ static std::vector get_path_of_change_filament(const Print& print) float filament_area = float((M_PI / 4.f) * pow(full_config.filament_diameter.get_at(new_filament_id), 2)); float purge_length = purge_volume / filament_area; - int old_filament_e_feedrate = gcode_writer.filament(new_extruder_id) != nullptr ? (int)(60.0 * full_config.filament_max_volumetric_speed.get_at(previous_filament_id) / filament_area) : 200; + int old_filament_e_feedrate = (old_filament_id != -1) ? (int)(60.0 * full_config.filament_max_volumetric_speed.get_at(old_filament_id) / filament_area) : 200; old_filament_e_feedrate = old_filament_e_feedrate == 0 ? 100 : old_filament_e_feedrate; int new_filament_e_feedrate = (int)(60.0 * full_config.filament_max_volumetric_speed.get_at(new_filament_id) / filament_area); new_filament_e_feedrate = new_filament_e_feedrate == 0 ? 100 : new_filament_e_feedrate; @@ -636,8 +636,8 @@ static std::vector get_path_of_change_filament(const Print& print) } gcodegen.placeholder_parser().set("current_extruder", new_filament_id); - gcodegen.placeholder_parser().set("retraction_distance_when_cut", gcodegen.m_config.retraction_distances_when_cut.get_at(new_extruder_id)); - gcodegen.placeholder_parser().set("long_retraction_when_cut", gcodegen.m_config.long_retractions_when_cut.get_at(new_extruder_id)); + gcodegen.placeholder_parser().set("retraction_distance_when_cut", gcodegen.m_config.retraction_distances_when_cut.get_at(new_filament_id)); + gcodegen.placeholder_parser().set("long_retraction_when_cut", gcodegen.m_config.long_retractions_when_cut.get_at(new_filament_id)); // Process the start filament gcode. std::string start_filament_gcode_str; @@ -5382,31 +5382,31 @@ std::string GCode::retract(bool toolchange, bool is_last_retraction, LiftType li return gcode; } -std::string GCode::set_extruder(unsigned int filament_id, double print_z, bool by_object) +std::string GCode::set_extruder(unsigned int new_filament_id, double print_z, bool by_object) { - int extruder_id = get_extruder_id(filament_id); - if (!m_writer.need_toolchange(filament_id)) + int new_extruder_id = get_extruder_id(new_filament_id); + if (!m_writer.need_toolchange(new_filament_id)) return ""; // if we are running a single-extruder setup, just set the extruder and return nothing if (!m_writer.multiple_extruders) { - m_placeholder_parser.set("current_extruder", filament_id); - m_placeholder_parser.set("retraction_distance_when_cut", m_config.retraction_distances_when_cut.get_at(extruder_id)); - m_placeholder_parser.set("long_retraction_when_cut", m_config.long_retractions_when_cut.get_at(extruder_id)); + m_placeholder_parser.set("current_extruder", new_filament_id); + m_placeholder_parser.set("retraction_distance_when_cut", m_config.retraction_distances_when_cut.get_at(new_filament_id)); + m_placeholder_parser.set("long_retraction_when_cut", m_config.long_retractions_when_cut.get_at(new_filament_id)); std::string gcode; // Append the filament start G-code. - const std::string &filament_start_gcode = m_config.filament_start_gcode.get_at(filament_id); + const std::string &filament_start_gcode = m_config.filament_start_gcode.get_at(new_filament_id); if (! filament_start_gcode.empty()) { // Process the filament_start_gcode for the filament. - gcode += this->placeholder_parser_process("filament_start_gcode", filament_start_gcode, filament_id); + gcode += this->placeholder_parser_process("filament_start_gcode", filament_start_gcode, new_filament_id); check_add_eol(gcode); } //BBS: never use for Bambu Printer - if (!this->is_BBL_Printer() && m_config.enable_pressure_advance.get_at(filament_id)) - gcode += m_writer.set_pressure_advance(m_config.pressure_advance.get_at(filament_id)); + if (!this->is_BBL_Printer() && m_config.enable_pressure_advance.get_at(new_filament_id)) + gcode += m_writer.set_pressure_advance(m_config.pressure_advance.get_at(new_filament_id)); - gcode += m_writer.toolchange(filament_id); + gcode += m_writer.toolchange(new_filament_id); return gcode; } @@ -5443,54 +5443,54 @@ std::string GCode::set_extruder(unsigned int filament_id, double print_z, bool b gcode += m_ooze_prevention.pre_toolchange(*this); // BBS - float new_retract_length = m_config.retraction_length.get_at(extruder_id); - float new_retract_length_toolchange = m_config.retract_length_toolchange.get_at(extruder_id); - int new_filament_temp = this->on_first_layer() ? m_config.nozzle_temperature_initial_layer.get_at(filament_id) : m_config.nozzle_temperature.get_at(filament_id); + float new_retract_length = m_config.retraction_length.get_at(new_filament_id); + float new_retract_length_toolchange = m_config.retract_length_toolchange.get_at(new_filament_id); + int new_filament_temp = this->on_first_layer() ? m_config.nozzle_temperature_initial_layer.get_at(new_filament_id) : m_config.nozzle_temperature.get_at(new_filament_id); // BBS: if print_z == 0 use first layer temperature if (abs(print_z) < EPSILON) - new_filament_temp = m_config.nozzle_temperature_initial_layer.get_at(filament_id); + new_filament_temp = m_config.nozzle_temperature_initial_layer.get_at(new_filament_id); Vec3d nozzle_pos = m_writer.get_position(); float old_retract_length, old_retract_length_toolchange, wipe_volume; int old_filament_temp, old_filament_e_feedrate; - float filament_area = float((M_PI / 4.f) * pow(m_config.filament_diameter.get_at(filament_id), 2)); + float filament_area = float((M_PI / 4.f) * pow(m_config.filament_diameter.get_at(new_filament_id), 2)); //BBS: add handling for filament change in start gcode - int previous_filament_id = -1; + int old_filament_id = -1; if (m_writer.filament() != nullptr || m_start_gcode_filament != -1) { - std::vector flush_matrix(cast(get_flush_volumes_matrix(m_config.flush_volumes_matrix.values, extruder_id, m_config.nozzle_diameter.values.size()))); + std::vector flush_matrix(cast(get_flush_volumes_matrix(m_config.flush_volumes_matrix.values, new_extruder_id, m_config.nozzle_diameter.values.size()))); const unsigned int number_of_extruders = (unsigned int) (m_config.filament_colour.values.size()); // if is multi_extruder only use the fist extruder matrix if (m_writer.filament() != nullptr) assert(m_writer.filament()->id() < number_of_extruders); else assert(m_start_gcode_filament < number_of_extruders); - previous_filament_id = m_writer.filament() != nullptr ? m_writer.filament()->id() : m_start_gcode_filament; - int previous_extruder_id = m_writer.filament() != nullptr ? m_writer.filament()->extruder_id() : get_extruder_id(m_start_gcode_filament); + old_filament_id = m_writer.filament() != nullptr ? m_writer.filament()->id() : m_start_gcode_filament; + int old_extruder_id = m_writer.filament() != nullptr ? m_writer.filament()->extruder_id() : get_extruder_id(m_start_gcode_filament); - old_retract_length = m_config.retraction_length.get_at(previous_extruder_id); - old_retract_length_toolchange = m_config.retract_length_toolchange.get_at(previous_extruder_id); - old_filament_temp = this->on_first_layer()? m_config.nozzle_temperature_initial_layer.get_at(previous_filament_id) : m_config.nozzle_temperature.get_at(previous_filament_id); + old_retract_length = m_config.retraction_length.get_at(old_filament_id); + old_retract_length_toolchange = m_config.retract_length_toolchange.get_at(old_filament_id); + old_filament_temp = this->on_first_layer()? m_config.nozzle_temperature_initial_layer.get_at(old_filament_id) : m_config.nozzle_temperature.get_at(old_filament_id); //During the filament change, the extruder will extrude an extra length of grab_length for the corresponding detection, so the purge can reduce this length. - float grab_purge_volume = m_config.grab_length.get_at(extruder_id) * 2.4; - if (previous_extruder_id != extruder_id) { + float grab_purge_volume = m_config.grab_length.get_at(new_extruder_id) * 2.4; + if (old_extruder_id != new_extruder_id) { //calc flush volume between the same extruder id - int previous_filament_id_in_new_extruder = m_writer.filament(extruder_id) != nullptr ? m_writer.filament(extruder_id)->id() : -1; - if (previous_filament_id_in_new_extruder == -1) + int old_filament_id_in_new_extruder = m_writer.filament(new_extruder_id) != nullptr ? m_writer.filament(new_extruder_id)->id() : -1; + if (old_filament_id_in_new_extruder == -1) wipe_volume = 0; else { - wipe_volume = flush_matrix[previous_filament_id_in_new_extruder * number_of_extruders + filament_id]; - wipe_volume *= m_config.flush_multiplier.get_at(extruder_id); + wipe_volume = flush_matrix[old_filament_id_in_new_extruder * number_of_extruders + new_filament_id]; + wipe_volume *= m_config.flush_multiplier.get_at(new_extruder_id); } } else { - wipe_volume = flush_matrix[previous_filament_id * number_of_extruders + filament_id]; - wipe_volume *= m_config.flush_multiplier.get_at(extruder_id); // if is multi_extruder only use the fist extruder matrix + wipe_volume = flush_matrix[old_filament_id * number_of_extruders + new_filament_id]; + wipe_volume *= m_config.flush_multiplier.get_at(new_extruder_id); // if is multi_extruder only use the fist extruder matrix } wipe_volume = std::max(0.f, wipe_volume-grab_purge_volume); - old_filament_e_feedrate = (int) (60.0 * m_config.filament_max_volumetric_speed.get_at(previous_filament_id) / filament_area); + old_filament_e_feedrate = (int) (60.0 * m_config.filament_max_volumetric_speed.get_at(old_filament_id) / filament_area); old_filament_e_feedrate = old_filament_e_feedrate == 0 ? 100 : old_filament_e_feedrate; //BBS: must clean m_start_gcode_filament m_start_gcode_filament = -1; @@ -5502,12 +5502,12 @@ std::string GCode::set_extruder(unsigned int filament_id, double print_z, bool b old_filament_e_feedrate = 200; } float wipe_length = wipe_volume / filament_area; - int new_filament_e_feedrate = (int)(60.0 * m_config.filament_max_volumetric_speed.get_at(filament_id) / filament_area); + int new_filament_e_feedrate = (int)(60.0 * m_config.filament_max_volumetric_speed.get_at(new_filament_id) / filament_area); new_filament_e_feedrate = new_filament_e_feedrate == 0 ? 100 : new_filament_e_feedrate; DynamicConfig dyn_config; - dyn_config.set_key_value("previous_extruder", new ConfigOptionInt(previous_filament_id)); - dyn_config.set_key_value("next_extruder", new ConfigOptionInt((int)filament_id)); + dyn_config.set_key_value("previous_extruder", new ConfigOptionInt(old_filament_id)); + dyn_config.set_key_value("next_extruder", new ConfigOptionInt((int)new_filament_id)); dyn_config.set_key_value("layer_num", new ConfigOptionInt(m_layer_index)); dyn_config.set_key_value("layer_z", new ConfigOptionFloat(print_z)); dyn_config.set_key_value("max_layer_z", new ConfigOptionFloat(m_max_layer_z)); @@ -5560,7 +5560,7 @@ std::string GCode::set_extruder(unsigned int filament_id, double print_z, bool b const std::string& change_filament_gcode = m_config.change_filament_gcode.value; std::string toolchange_gcode_parsed; if (!change_filament_gcode.empty()) { - toolchange_gcode_parsed = placeholder_parser_process("change_filament_gcode", change_filament_gcode, filament_id, &dyn_config); + toolchange_gcode_parsed = placeholder_parser_process("change_filament_gcode", change_filament_gcode, new_filament_id, &dyn_config); check_add_eol(toolchange_gcode_parsed); gcode += toolchange_gcode_parsed; @@ -5588,8 +5588,8 @@ std::string GCode::set_extruder(unsigned int filament_id, double print_z, bool b //BBS: don't add T[next extruder] if there is no T cmd on filament change //We inform the writer about what is happening, but we may not use the resulting gcode. - std::string toolchange_command = m_writer.toolchange(filament_id); - if (!custom_gcode_changes_tool(toolchange_gcode_parsed, m_writer.toolchange_prefix(), filament_id)) + std::string toolchange_command = m_writer.toolchange(new_filament_id); + if (!custom_gcode_changes_tool(toolchange_gcode_parsed, m_writer.toolchange_prefix(), new_filament_id)) gcode += toolchange_command; else { // user provided his own toolchange gcode, no need to do anything @@ -5597,29 +5597,29 @@ std::string GCode::set_extruder(unsigned int filament_id, double print_z, bool b // Set the temperature if the wipe tower didn't (not needed for non-single extruder MM) if (m_config.single_extruder_multi_material && !m_config.enable_prime_tower) { - int temp = (m_layer_index <= 0 ? m_config.nozzle_temperature_initial_layer.get_at(filament_id) : - m_config.nozzle_temperature.get_at(filament_id)); + int temp = (m_layer_index <= 0 ? m_config.nozzle_temperature_initial_layer.get_at(new_filament_id) : + m_config.nozzle_temperature.get_at(new_filament_id)); gcode += m_writer.set_temperature(temp, false); } - m_placeholder_parser.set("current_extruder", filament_id); - m_placeholder_parser.set("retraction_distance_when_cut", m_config.retraction_distances_when_cut.get_at(extruder_id)); - m_placeholder_parser.set("long_retraction_when_cut", m_config.long_retractions_when_cut.get_at(extruder_id)); + m_placeholder_parser.set("current_extruder", new_filament_id); + m_placeholder_parser.set("retraction_distance_when_cut", m_config.retraction_distances_when_cut.get_at(new_filament_id)); + m_placeholder_parser.set("long_retraction_when_cut", m_config.long_retractions_when_cut.get_at(new_filament_id)); // Append the filament start G-code. - const std::string &filament_start_gcode = m_config.filament_start_gcode.get_at(filament_id); + const std::string &filament_start_gcode = m_config.filament_start_gcode.get_at(new_filament_id); if (! filament_start_gcode.empty()) { // Process the filament_start_gcode for the new filament. - gcode += this->placeholder_parser_process("filament_start_gcode", filament_start_gcode, filament_id); + gcode += this->placeholder_parser_process("filament_start_gcode", filament_start_gcode, new_filament_id); check_add_eol(gcode); } // Set the new extruder to the operating temperature. if (m_ooze_prevention.enable) gcode += m_ooze_prevention.post_toolchange(*this); //BBS: never use for Bambu Printer - if (!this->is_BBL_Printer() && m_config.enable_pressure_advance.get_at(filament_id)) - gcode += m_writer.set_pressure_advance(m_config.pressure_advance.get_at(filament_id)); + if (!this->is_BBL_Printer() && m_config.enable_pressure_advance.get_at(new_filament_id)) + gcode += m_writer.set_pressure_advance(m_config.pressure_advance.get_at(new_filament_id)); return gcode; }