diff --git a/src/BambuStudio.cpp b/src/BambuStudio.cpp index 7e567d74e..5f75b7498 100644 --- a/src/BambuStudio.cpp +++ b/src/BambuStudio.cpp @@ -649,6 +649,11 @@ static int load_assemble_plate_list(std::string config_file, std::vector>(); if ((assemble_object.filaments.size() > 0) && (assemble_object.filaments.size() != assemble_object.count) && (assemble_object.filaments.size() != 1)) { @@ -749,7 +754,7 @@ static int load_assemble_plate_list(std::string config_file, std::vector &merged_objects, ModelObject *ori_object) +void merge_or_add_object(assemble_plate_info_t& assemble_plate_info, Model &model, int assemble_index, std::map &merged_objects, ModelObject *ori_object, ModelVolumeType type) { if (assemble_index > 0) { auto iter = merged_objects.find(assemble_index); @@ -760,17 +765,21 @@ void merge_or_add_object(assemble_plate_info_t& assemble_plate_info, Model &mode new_object->name = "assemble_" + std::to_string(assemble_index); merged_objects[assemble_index] = new_object; assemble_plate_info.loaded_obj_list.emplace_back(new_object); - new_object->config.assign_config(ori_object->config.get()); + //new_object->config.assign_config(ori_object->config.get()); } else new_object = iter->second; for (auto volume : ori_object->volumes) { - ModelVolume* new_volume = new_object->add_volume(*volume); + ModelVolume* new_volume = new_object->add_volume(*volume, type); // set extruder id - new_volume->config.set_key_value("extruder", new ConfigOptionInt(ori_object->config.extruder())); + //new_volume->config.set_key_value("extruder", new ConfigOptionInt(ori_object->config.extruder())); + if (type == ModelVolumeType::MODEL_PART || type == ModelVolumeType::PARAMETER_MODIFIER) + { + new_volume->config.apply(ori_object->config); + } } - BOOST_LOG_TRIVIAL(debug) << boost::format("assemble_index %1%, name %2%, merged to new model %3%") % assemble_index % ori_object->name % new_object->name; + BOOST_LOG_TRIVIAL(debug) << boost::format("assemble_index %1%, name %2%, merged to new model %3%, subtype %4%") % assemble_index % ori_object->name % new_object->name %(int)type; } else { ModelObject* new_object = model.add_object(*ori_object); @@ -925,7 +934,7 @@ static int construct_assemble_list(std::vector &assemble_ return CLI_DATA_FILE_ERROR; } } - else if (boost::algorithm::iends_with(assemble_object.path, ".obj")) + else if ((boost::algorithm::iends_with(assemble_object.path, ".obj")) && assemble_object.subtype == ModelVolumeType::MODEL_PART) { std::string message; ObjInfo obj_info; @@ -974,7 +983,7 @@ static int construct_assemble_list(std::vector &assemble_ obj_temp_model.clear_materials(); } else { - BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << boost::format(": unsupported file %1%, plate index %2%, object index %3%") % assemble_object.path % (index + 1) % (obj_index + 1); + BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << boost::format(": unsupported file %1%, plate index %2%, object index %3%, subtype %4%") % assemble_object.path % (index + 1) % (obj_index + 1) %(int)(assemble_object.subtype); return CLI_INVALID_PARAMS; } @@ -1001,6 +1010,10 @@ static int construct_assemble_list(std::vector &assemble_ if (!assemble_object.height_ranges.empty()) { + if (assemble_object.subtype != ModelVolumeType::MODEL_PART) { + BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << boost::format(": only normal part can have height ranges, file %1%, plate index %2%, object index %3%, subtype %4%") % assemble_object.path % (index + 1) % (obj_index + 1) %(int)(assemble_object.subtype); + return CLI_INVALID_PARAMS; + } for (int range_index = 0; range_index < assemble_object.height_ranges.size(); range_index++) { height_range_info_t& range = assemble_object.height_ranges[range_index]; @@ -1020,11 +1033,21 @@ static int construct_assemble_list(std::vector &assemble_ assemble_object.pos_y.resize(1, 0.f); if (assemble_object.pos_z.empty()) assemble_object.pos_z.resize(1, 0.f); - if (assemble_object.assemble_index.empty()) + if (assemble_object.assemble_index.empty()) { + if (assemble_object.subtype != ModelVolumeType::MODEL_PART) { + BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << boost::format(": only normal part can be used as individual object, file %1%, plate index %2%, object index %3%, subtype %4%") % assemble_object.path % (index + 1) % (obj_index + 1) %(int)(assemble_object.subtype); + return CLI_INVALID_PARAMS; + } assemble_object.assemble_index.resize(1, 0); + } + + if ((assemble_object.subtype != ModelVolumeType::MODEL_PART)&&(assemble_object.assemble_index[0] == 0)) { + BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << boost::format(": only normal part can have height ranges, file %1%, plate index %2%, object index %3%, subtype %4%") % assemble_object.path % (index + 1) % (obj_index + 1) %(int)(assemble_object.subtype); + return CLI_INVALID_PARAMS; + } object->translate(assemble_object.pos_x[0], assemble_object.pos_y[0], assemble_object.pos_z[0]); - merge_or_add_object(assemble_plate_info, model, assemble_object.assemble_index[0], merged_objects, object); + merge_or_add_object(assemble_plate_info, model, assemble_object.assemble_index[0], merged_objects, object, assemble_object.subtype); BOOST_LOG_TRIVIAL(debug) << __FUNCTION__ << boost::format(": object %1%, name %2%, pos_x %3% pos_y %4%, pos_z %5%, filament %6%, assemble_index %7%") %obj_index %object->name %assemble_object.pos_x[0] %assemble_object.pos_y[0] %assemble_object.pos_z[0] %assemble_object.filaments[0] %assemble_object.assemble_index[0]; @@ -1057,7 +1080,13 @@ static int construct_assemble_list(std::vector &assemble_ array_index = copy_index; else array_index = 0; - merge_or_add_object(assemble_plate_info, model, assemble_object.assemble_index[array_index], merged_objects, copy_obj); + + if ((assemble_object.subtype != ModelVolumeType::MODEL_PART)&&(assemble_object.assemble_index[array_index] == 0)) { + BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << boost::format(": only normal part can have height ranges, file %1%, plate index %2%, object index %3%, subtype %4%, copy_index %5%") + % assemble_object.path % (index + 1) % (obj_index + 1) %(int)(assemble_object.subtype) %copy_index; + return CLI_INVALID_PARAMS; + } + merge_or_add_object(assemble_plate_info, model, assemble_object.assemble_index[array_index], merged_objects, copy_obj, assemble_object.subtype); BOOST_LOG_TRIVIAL(debug) << __FUNCTION__ << boost::format(": cloned object %1%, name %2%, pos_x %3% pos_y %4%, pos_z %5%") %copy_index %object->name %assemble_object.pos_x[array_index] %assemble_object.pos_y[array_index] %assemble_object.pos_z[array_index]; diff --git a/src/BambuStudio.hpp b/src/BambuStudio.hpp index 5dae7db26..30e564e7c 100644 --- a/src/BambuStudio.hpp +++ b/src/BambuStudio.hpp @@ -22,6 +22,7 @@ namespace IO { #define JSON_ASSEMPLE_PLATE_NAME "plate_name" #define JSON_ASSEMPLE_PLATE_NEED_ARRANGE "need_arrange" #define JSON_ASSEMPLE_OBJECTS "objects" +#define JSON_ASSEMPLE_SUBTYPE "subtype" #define JSON_ASSEMPLE_OBJECT_PATH "path" #define JSON_ASSEMPLE_OBJECT_COUNT "count" #define JSON_ASSEMPLE_OBJECT_FILAMENTS "filaments" @@ -52,6 +53,7 @@ typedef struct _assembled_param_info { typedef struct _assemble_object_info { std::string path; + ModelVolumeType subtype; int count; std::vector filaments;