From f2f8c132080fcd0b7b566234ef4ad3d423006163 Mon Sep 17 00:00:00 2001 From: "lane.wei" Date: Fri, 19 Jan 2024 17:44:38 +0800 Subject: [PATCH] FIX: CLI: fix an arrange issue when duplicate failed restore the wipe_tower position to original when duplicate fail JIRA: MAK-2638 Change-Id: I355056f1d87648cc1f6aafa15a98ff569359b44f --- src/BambuStudio.cpp | 43 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/src/BambuStudio.cpp b/src/BambuStudio.cpp index bd041cc98..6346d38f3 100644 --- a/src/BambuStudio.cpp +++ b/src/BambuStudio.cpp @@ -3563,6 +3563,7 @@ int CLI::run(int argc, char **argv) bool finished_arrange = false, first_run = true; Slic3r::GUI::PartPlate* cur_plate = nullptr; int low_duplicate_count = 0, up_duplicate_count = duplicate_count, arrange_count = 0; + float orig_wipe_x = 0.f, orig_wipe_y = 0.f; if (duplicate_count > 0) { original_model = model; @@ -3589,8 +3590,22 @@ int CLI::run(int argc, char **argv) unprintable.clear(); locked_aps.clear(); } - else + else { first_run = false; + if (plate_to_slice > 0) { + ConfigOptionFloats* wipe_x_option = m_print_config.option("wipe_tower_x"); + ConfigOptionFloats* wipe_y_option = m_print_config.option("wipe_tower_y"); + + if (wipe_x_option && (wipe_x_option->size() > (plate_to_slice-1))) { + orig_wipe_x = wipe_x_option->get_at(plate_to_slice-1); + BOOST_LOG_TRIVIAL(info) << boost::format("%1%, plate_to_slice %2%, orig_wipe_x=%3%")%__LINE__%plate_to_slice%orig_wipe_x; + } + if (wipe_y_option && (wipe_y_option->size() > (plate_to_slice-1))) { + orig_wipe_y = wipe_y_option->get_at(plate_to_slice-1); + BOOST_LOG_TRIVIAL(info) << boost::format("%1%, plate_to_slice %2%, orig_wipe_y=%3%")%__LINE__%plate_to_slice%orig_wipe_y; + } + } + } cur_plate = (Slic3r::GUI::PartPlate *)partplate_list.get_plate(plate_to_slice-1); cur_plate->duplicate_all_instance(duplicate_count, need_skip, skip_maps); @@ -4023,11 +4038,22 @@ int CLI::run(int argc, char **argv) if (duplicate_count == 0) { //restore to the original - BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(": restore to the original model and plates"); + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(": restore to the original model and plates, orig_wipe_x %1%, orig_wipe_y %2%")%orig_wipe_x %orig_wipe_y; finished_arrange = true; model = original_model; partplate_list.load_from_3mf_structure(plate_data_src); partplate_list.reset_size(current_printable_width, current_printable_depth, current_printable_height, true, true); + if ((orig_wipe_x > 0.f) && (orig_wipe_y > 0.f)) + { + ConfigOptionFloat wt_x_opt(orig_wipe_x); + ConfigOptionFloat wt_y_opt(orig_wipe_y); + ConfigOptionFloats* wipe_x_option = m_print_config.option("wipe_tower_x", true); + ConfigOptionFloats* wipe_y_option = m_print_config.option("wipe_tower_y", true); + + wipe_x_option->set_at(&wt_x_opt, plate_to_slice-1, 0); + wipe_y_option->set_at(&wt_y_opt, plate_to_slice-1, 0); + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(": restore wipe_tower position to {%1%, %2%}")%orig_wipe_x %orig_wipe_y; + } BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(": exit arrange process"); } continue; @@ -4036,7 +4062,7 @@ int CLI::run(int argc, char **argv) if (duplicate_single_object) { if (real_duplicate_count <= 1) { - BOOST_LOG_TRIVIAL(warning) << "no object can be placed under single object mode, restore to the original model and plates also" << std::endl; + BOOST_LOG_TRIVIAL(warning) << boost::format("no object can be placed under single object mode, restore to the original model and plates also, orig_wipe_x %1%, orig_wipe_y %2%")%orig_wipe_x %orig_wipe_y; //record_exit_reson(outfile_dir, CLI_OBJECT_ARRANGE_FAILED, 0, cli_errors[CLI_OBJECT_ARRANGE_FAILED], sliced_info); //flush_and_exit(CLI_OBJECT_ARRANGE_FAILED); finished_arrange = true; @@ -4044,6 +4070,17 @@ int CLI::run(int argc, char **argv) partplate_list.load_from_3mf_structure(plate_data_src); partplate_list.reset_size(current_printable_width, current_printable_depth, current_printable_height, true, true); duplicate_count = 0; + if ((orig_wipe_x > 0.f) && (orig_wipe_y > 0.f)) + { + ConfigOptionFloat wt_x_opt(orig_wipe_x); + ConfigOptionFloat wt_y_opt(orig_wipe_y); + ConfigOptionFloats* wipe_x_option = m_print_config.option("wipe_tower_x", true); + ConfigOptionFloats* wipe_y_option = m_print_config.option("wipe_tower_y", true); + + wipe_x_option->set_at(&wt_x_opt, plate_to_slice-1, 0); + wipe_y_option->set_at(&wt_y_opt, plate_to_slice-1, 0); + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(": restore wipe_tower position to {%1%, %2%}")%orig_wipe_x %orig_wipe_y; + } BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(": exit arrange process"); continue; }