From 669047890a11dc3bf85192bc55d66b9d301d8fbb Mon Sep 17 00:00:00 2001 From: thewildmage Date: Tue, 20 Jun 2023 16:48:21 -0600 Subject: [PATCH] New strategy for adding custom G-code --- src/libslic3r/GCode.cpp | 115 ++++++++++++-------------------------- src/libslic3r/Print.hpp | 1 + src/slic3r/GUI/Plater.cpp | 9 --- 3 files changed, 38 insertions(+), 87 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 1bf4e57b2c..d4ea64270c 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -1056,7 +1056,6 @@ void GCode::do_export(Print* print, const char* path, GCodeProcessorResult* resu GCodeProcessor::s_IsBBLPrinter = print->is_BBL_printer(); print->set_started(psGCodeExport); - // check if any custom gcode contains keywords used by the gcode processor to // produce time estimation and gcode toolpaths std::vector> validation_res = DoExport::validate_custom_gcode(*print); @@ -1435,6 +1434,7 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato // modifies m_silent_time_estimator_enabled DoExport::init_gcode_processor(print.config(), m_processor, m_silent_time_estimator_enabled); const bool is_bbl_printers = print.is_BBL_printer(); + // resets analyzer's tracking data m_last_height = 0.f; m_last_layer_z = 0.f; @@ -1451,9 +1451,7 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato // How many times will be change_layer() called? // change_layer() in turn increments the progress bar status. m_layer_count = 0; - if (print.calib_params().mode == CalibMode::Calib_PA_Pattern) { - // m_layer_count = CalibPressureAdvancePattern(this).num_layers(); - } else if (print.config().print_sequence == PrintSequence::ByObject) { + if (print.config().print_sequence == PrintSequence::ByObject) { // Add each of the object's layers separately. for (auto object : print.objects()) { //BBS: fix the issue that total layer is not right @@ -1870,6 +1868,16 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato } if (this->m_objsWithBrim.empty() && this->m_objSupportsWithBrim.empty()) m_brim_done = true; + if (print.calib_params().mode == CalibMode::Calib_PA_Pattern) { + CalibPressureAdvancePattern pa_pattern(print.calib_params(), this); + + Model updated_model = print.model(); + updated_model.plates_custom_gcodes[print.model().curr_plate_index] = pa_pattern.generate_gcodes(); + print.set_model(updated_model); + + tool_ordering.assign_custom_gcodes(print); + } + // SoftFever: calib if (print.calib_params().mode == CalibMode::Calib_PA_Line) { std::string gcode; @@ -1884,81 +1892,17 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato auto params = print.calib_params(); - // if (print.calib_params().mode == CalibMode::Calib_PA_Line) { - CalibPressureAdvanceLine pa_test(this); + CalibPressureAdvanceLine pa_test(this); - double filament_max_volumetric_speed = m_config.option("filament_max_volumetric_speed")->get_at(initial_extruder_id); - Flow pattern_line = Flow(pa_test.line_width(), 0.2, m_config.nozzle_diameter.get_at(0)); - auto fast_speed = std::min(print.default_region_config().outer_wall_speed.value, filament_max_volumetric_speed / pattern_line.mm3_per_mm()); - auto slow_speed = std::max(20.0, fast_speed / 10.0); - - pa_test.set_speed(fast_speed, slow_speed); - pa_test.draw_numbers() = print.calib_params().print_numbers; - - gcode += pa_test.generate_test(params.start, params.step, std::llround(std::ceil((params.end - params.start) / params.step))); - // } else if (print.calib_params().mode == CalibMode::Calib_PA_Pattern) { - // CalibPressureAdvancePattern pa_test(this); - // std::vector gcode_layers = pa_test.generate_test(params.start, params.end, params.step); - - // m_max_layer_z = pa_test.max_layer_z(); - // coordf_t print_z; - // bool first_layer; - - // for (auto i = 0; i < gcode_layers.size(); ++i) { - // m_nominal_z = pa_test.layer_z()[i]; - // print_z = m_nominal_z; - - // first_layer = (i == 0); - // m_writer.set_is_first_layer(first_layer); - - // // add tag for processor - // gcode += ";" + GCodeProcessor::reserved_tag(GCodeProcessor::ETags::Layer_Change) + "\n"; - // // export layer z - // char buf[64]; - // sprintf(buf, print.is_BBL_printer() ? "; Z_HEIGHT: %g\n" : ";Z:%g\n", print_z); - // gcode += buf; - // // export layer height - // float height = first_layer ? static_cast(print_z) : static_cast(print_z) - m_last_layer_z; - // sprintf(buf, ";%s%g\n", GCodeProcessor::reserved_tag(GCodeProcessor::ETags::Height).c_str(), height); - // gcode += buf; - // // update caches - // m_last_layer_z = static_cast(print_z); - // m_max_layer_z = std::max(m_max_layer_z, m_last_layer_z); - // m_last_height = height; - - // if (! print.config().before_layer_change_gcode.value.empty()) { - // DynamicConfig config; - // config.set_key_value("layer_num", new ConfigOptionInt(m_layer_index + 1)); - // config.set_key_value("layer_z", new ConfigOptionFloat(print_z)); - // config.set_key_value("max_layer_z", new ConfigOptionFloat(m_max_layer_z)); - // gcode += this->placeholder_parser_process( - // "before_layer_change_gcode", - // print.config().before_layer_change_gcode.value, - // m_writer.extruder()->id(), - // &config - // ) + "\n"; - // } - - // gcode += m_writer.update_progress(++ m_layer_index, m_layer_count); - - // if (! print.config().layer_change_gcode.value.empty()) { - // DynamicConfig config; - // config.set_key_value("layer_num", new ConfigOptionInt(m_layer_index)); - // config.set_key_value("layer_z", new ConfigOptionFloat(print_z)); - - // gcode += this->placeholder_parser_process( - // "layer_change_gcode", - // print.config().layer_change_gcode.value, - // m_writer.extruder()->id(), - // &config - // ) + "\n"; - - // config.set_key_value("max_layer_z", new ConfigOptionFloat(m_max_layer_z)); - // } - - // gcode += gcode_layers[i]; - // } - // } + double filament_max_volumetric_speed = m_config.option("filament_max_volumetric_speed")->get_at(initial_extruder_id); + Flow pattern_line = Flow(pa_test.line_width(), 0.2, m_config.nozzle_diameter.get_at(0)); + auto fast_speed = std::min(print.default_region_config().outer_wall_speed.value, filament_max_volumetric_speed / pattern_line.mm3_per_mm()); + auto slow_speed = std::max(20.0, fast_speed / 10.0); + + pa_test.set_speed(fast_speed, slow_speed); + pa_test.draw_numbers() = print.calib_params().print_numbers; + + gcode += pa_test.generate_test(params.start, params.step, std::llround(std::ceil((params.end - params.start) / params.step))); file.write(gcode); } else { @@ -3437,6 +3381,21 @@ GCode::LayerResult GCode::process_layer( } } + if (print.calib_mode() == CalibMode::Calib_PA_Pattern) { + gcode += "; start pressure advance pattern for layer\n"; + + CalibPressureAdvancePattern pa_pattern(print.calib_params(), this); + CustomGCode::Info pa_pattern_info = pa_pattern.generate_gcodes(); + + for (CustomGCode::Item i : pa_pattern_info.gcodes) { + if (i.print_z == print_z) { + gcode += i.extra; + } + } + + gcode += "; end pressure advance pattern for layer\n"; + } + #if 0 // Apply spiral vase post-processing if this layer contains suitable geometry // (we must feed all the G-code into the post-processor, including the first diff --git a/src/libslic3r/Print.hpp b/src/libslic3r/Print.hpp index 96c361d7eb..ca618ea09f 100644 --- a/src/libslic3r/Print.hpp +++ b/src/libslic3r/Print.hpp @@ -692,6 +692,7 @@ public: std::vector print_object_ids() const override; ApplyStatus apply(const Model &model, DynamicPrintConfig config) override; + void set_model(Model m) { m_model = m; } void process(bool use_cache = false) override; // Exports G-code into a file name based on the path_template, returns the file path of the generated G-code file. diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index b180b6f408..ce42be7c54 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -8149,15 +8149,6 @@ void Plater::_calib_pa_pattern(const Calib_Params& params) { get_gizmos_manager().get_object_manipulation(); giz_obj_manip.set_uniform_scaling(false); giz_obj_manip.on_change("size", 2, pa_pattern.max_layer_z()); - - // auto& fff_print = this->get_partplate_list().get_current_fff_print(); - // fff_print.apply(model(), full_config); - // GCodeWriter writer; - // writer.apply_print_config(fff_print.config()); - // writer.set_extruders({0}); - - // CustomGCode::Info custom_info = pa_pattern.generate_gcodes(full_config, writer); - // model().plates_custom_gcodes[model().curr_plate_index] = custom_info; } void Plater::_calib_pa_tower(const Calib_Params& params) {