From 5869d33d519b617dbcee05a74f81fb1951330633 Mon Sep 17 00:00:00 2001 From: "lane.wei" Date: Wed, 19 Mar 2025 18:06:29 +0800 Subject: [PATCH] ENH: CLI: check filament mapping error before process jira: no-jira Change-Id: Ie82a1faba93a4f80281615c803a45a93206ddf02 --- src/BambuStudio.cpp | 52 ++++++++++++++++++++++++++++++++++++++++- src/libslic3r/Utils.hpp | 2 ++ 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/src/BambuStudio.cpp b/src/BambuStudio.cpp index a38d22e83..dde995202 100644 --- a/src/BambuStudio.cpp +++ b/src/BambuStudio.cpp @@ -145,6 +145,8 @@ std::map cli_errors = { {CLI_OBJECT_COLLISION_IN_LAYER_PRINT, "Object conflicts were detected. Please verify the slicing of all plates in Bambu Studio before uploading."}, {CLI_SPIRAL_MODE_INVALID_PARAMS, "Some slicing parameters cannot work with Spiral Vase mode. Please solve the issue in Bambu Studio before uploading."}, {CLI_FILAMENT_CAN_NOT_MAP, "Some filaments cannot be mapped to correct extruders for multi-extruder Printer."}, + {CLI_ONLY_ONE_TPU_SUPPORTED, "Not support printing 2 or more TPU filaments."}, + {CLI_FILAMENTS_NOT_SUPPORTED_BY_EXTRUDER, "Some filaments cannot be printed on the extruder mapped to."}, {CLI_SLICING_ERROR, "Failed slicing the model. Please verify the slicing of all plates on Bambu Studio before uploading."}, {CLI_GCODE_PATH_CONFLICTS, " G-code conflicts detected after slicing. Please make sure the 3mf file can be successfully sliced in the latest Bambu Studio."}, {CLI_GCODE_PATH_IN_UNPRINTABLE_AREA, "Found G-code in unprintable area of multi-extruder printers after slicing. Please make sure the 3mf file can be successfully sliced in the latest Bambu Studio."}, @@ -5721,6 +5723,24 @@ int CLI::run(int argc, char **argv) flush_and_exit(CLI_NO_SUITABLE_OBJECTS_AFTER_SKIP); } + std::vector plate_filaments = part_plate->get_extruders_under_cli(true, m_print_config); + std::vector used_tpu_filaments; + for (int f_index = 0; f_index < plate_filaments.size(); f_index++) { + if (plate_filaments[f_index] <= filament_count) { + std::string filament_type; + m_print_config.get_filament_type(filament_type, plate_filaments[f_index]-1); + if (filament_type == "TPU") { + used_tpu_filaments.push_back(plate_filaments[f_index]); + } + } + } + bool tpu_valid = part_plate->check_tpu_printable_status(m_print_config, used_tpu_filaments); + if (!tpu_valid) { + BOOST_LOG_TRIVIAL(error) << boost::format("plate %1% : Found 2 or more tpu filaments on plate ") % (index + 1); + record_exit_reson(outfile_dir, CLI_ONLY_ONE_TPU_SUPPORTED, index + 1, cli_errors[CLI_ONLY_ONE_TPU_SUPPORTED], sliced_info); + flush_and_exit(CLI_ONLY_ONE_TPU_SUPPORTED); + } + if (new_extruder_count > 1) { std::vector> unprintable_filament_vec; for (const std::set& filamnt_ids : unprintable_filament_ids) { @@ -5772,16 +5792,46 @@ int CLI::run(int argc, char **argv) } else filament_maps = part_plate->get_real_filament_maps(m_print_config); + + std::vector& unprintable_filament_types = m_print_config.option("unprintable_filament_types", true)->values; + std::vector>unprintable_filament_type_list; + unprintable_filament_type_list.resize(new_extruder_count); + for (int index = 0; index < new_extruder_count; index++) + { + std::vector unprintable_list; + if (unprintable_filament_types.size() > index) + unprintable_list = split_string(unprintable_filament_types[index], ','); + unprintable_filament_type_list[index] = unprintable_list; + } + for (int index = 0; index < filament_maps.size(); index++) { int filament_extruder = filament_maps[index]; if (unprintable_filament_ids[filament_extruder - 1].find(index + 1) != unprintable_filament_ids[filament_extruder - 1].end()) { - BOOST_LOG_TRIVIAL(error) << boost::format("plate %1% : some filaments can not be mapped under auto mode for multi extruder printer ") % (index + 1); + BOOST_LOG_TRIVIAL(error) << boost::format("plate %1% : some filaments can not be mapped under manual mode for multi extruder printer ") % (index + 1); record_exit_reson(outfile_dir, CLI_FILAMENT_CAN_NOT_MAP, index + 1, cli_errors[CLI_FILAMENT_CAN_NOT_MAP], sliced_info); flush_and_exit(CLI_FILAMENT_CAN_NOT_MAP); } } + + for (int f_index = 0; f_index < plate_filaments.size(); f_index++) { + if (plate_filaments[f_index] <= filament_count) { + int filament_extruder = filament_maps[plate_filaments[f_index] - 1]; + std::vector& unprintable_list = unprintable_filament_type_list[filament_extruder-1]; + std::string filament_type; + m_print_config.get_filament_type(filament_type, plate_filaments[f_index]-1); + if (unprintable_list.size() > 0) + { + auto iter = std::find(unprintable_list.begin(), unprintable_list.end(), filament_type); + if (iter != unprintable_list.end()) { + BOOST_LOG_TRIVIAL(error) << boost::format("plate %1% : filament %2% can not be printed on extruder %3%, under manual mode for multi extruder printer") % (index + 1) %filament_type %filament_extruder; + record_exit_reson(outfile_dir, CLI_FILAMENTS_NOT_SUPPORTED_BY_EXTRUDER, index + 1, cli_errors[CLI_FILAMENTS_NOT_SUPPORTED_BY_EXTRUDER], sliced_info); + flush_and_exit(CLI_FILAMENTS_NOT_SUPPORTED_BY_EXTRUDER); + } + } + } + } } } diff --git a/src/libslic3r/Utils.hpp b/src/libslic3r/Utils.hpp index c62b23d1d..39cd1bdcc 100644 --- a/src/libslic3r/Utils.hpp +++ b/src/libslic3r/Utils.hpp @@ -61,6 +61,8 @@ #define CLI_OBJECT_COLLISION_IN_LAYER_PRINT -64 #define CLI_SPIRAL_MODE_INVALID_PARAMS -65 #define CLI_FILAMENT_CAN_NOT_MAP -66 +#define CLI_ONLY_ONE_TPU_SUPPORTED -67 +#define CLI_FILAMENTS_NOT_SUPPORTED_BY_EXTRUDER -68 #define CLI_SLICING_ERROR -100 #define CLI_GCODE_PATH_CONFLICTS -101