ENH: CLI: support other volume types in assemble list

JIRA: no-jira
Change-Id: Ia283d9a250b0185b43c788649ba2194e52e9e198
This commit is contained in:
lane.wei 2024-10-18 20:30:44 +08:00 committed by Lane.Wei
parent ef3d25eb68
commit 3ee4fd55b1
2 changed files with 41 additions and 10 deletions

View File

@ -649,6 +649,11 @@ static int load_assemble_plate_list(std::string config_file, std::vector<assembl
return CLI_CONFIG_FILE_ERROR; return CLI_CONFIG_FILE_ERROR;
} }
if (object_json.contains(JSON_ASSEMPLE_SUBTYPE))
assemble_object.subtype = ModelVolume::type_from_string(object_json[JSON_ASSEMPLE_SUBTYPE]);
else
assemble_object.subtype = ModelVolumeType::MODEL_PART;
assemble_object.filaments = object_json.at(JSON_ASSEMPLE_OBJECT_FILAMENTS).get<std::vector<int>>(); assemble_object.filaments = object_json.at(JSON_ASSEMPLE_OBJECT_FILAMENTS).get<std::vector<int>>();
if ((assemble_object.filaments.size() > 0) && (assemble_object.filaments.size() != assemble_object.count) && (assemble_object.filaments.size() != 1)) 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<assembl
return ret; return ret;
} }
void merge_or_add_object(assemble_plate_info_t& assemble_plate_info, Model &model, int assemble_index, std::map<int, ModelObject*> &merged_objects, ModelObject *ori_object) void merge_or_add_object(assemble_plate_info_t& assemble_plate_info, Model &model, int assemble_index, std::map<int, ModelObject*> &merged_objects, ModelObject *ori_object, ModelVolumeType type)
{ {
if (assemble_index > 0) { if (assemble_index > 0) {
auto iter = merged_objects.find(assemble_index); 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); new_object->name = "assemble_" + std::to_string(assemble_index);
merged_objects[assemble_index] = new_object; merged_objects[assemble_index] = new_object;
assemble_plate_info.loaded_obj_list.emplace_back(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 else
new_object = iter->second; new_object = iter->second;
for (auto volume : ori_object->volumes) { 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 // 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 { else {
ModelObject* new_object = model.add_object(*ori_object); ModelObject* new_object = model.add_object(*ori_object);
@ -925,7 +934,7 @@ static int construct_assemble_list(std::vector<assemble_plate_info_t> &assemble_
return CLI_DATA_FILE_ERROR; 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; std::string message;
ObjInfo obj_info; ObjInfo obj_info;
@ -974,7 +983,7 @@ static int construct_assemble_list(std::vector<assemble_plate_info_t> &assemble_
obj_temp_model.clear_materials(); obj_temp_model.clear_materials();
} }
else { 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; return CLI_INVALID_PARAMS;
} }
@ -1001,6 +1010,10 @@ static int construct_assemble_list(std::vector<assemble_plate_info_t> &assemble_
if (!assemble_object.height_ranges.empty()) 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++) 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]; height_range_info_t& range = assemble_object.height_ranges[range_index];
@ -1020,11 +1033,21 @@ static int construct_assemble_list(std::vector<assemble_plate_info_t> &assemble_
assemble_object.pos_y.resize(1, 0.f); assemble_object.pos_y.resize(1, 0.f);
if (assemble_object.pos_z.empty()) if (assemble_object.pos_z.empty())
assemble_object.pos_z.resize(1, 0.f); 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); 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]); 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%") 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]; %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_plate_info_t> &assemble_
array_index = copy_index; array_index = copy_index;
else else
array_index = 0; 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%") 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]; %copy_index %object->name %assemble_object.pos_x[array_index] %assemble_object.pos_y[array_index] %assemble_object.pos_z[array_index];

View File

@ -22,6 +22,7 @@ namespace IO {
#define JSON_ASSEMPLE_PLATE_NAME "plate_name" #define JSON_ASSEMPLE_PLATE_NAME "plate_name"
#define JSON_ASSEMPLE_PLATE_NEED_ARRANGE "need_arrange" #define JSON_ASSEMPLE_PLATE_NEED_ARRANGE "need_arrange"
#define JSON_ASSEMPLE_OBJECTS "objects" #define JSON_ASSEMPLE_OBJECTS "objects"
#define JSON_ASSEMPLE_SUBTYPE "subtype"
#define JSON_ASSEMPLE_OBJECT_PATH "path" #define JSON_ASSEMPLE_OBJECT_PATH "path"
#define JSON_ASSEMPLE_OBJECT_COUNT "count" #define JSON_ASSEMPLE_OBJECT_COUNT "count"
#define JSON_ASSEMPLE_OBJECT_FILAMENTS "filaments" #define JSON_ASSEMPLE_OBJECT_FILAMENTS "filaments"
@ -52,6 +53,7 @@ typedef struct _assembled_param_info {
typedef struct _assemble_object_info { typedef struct _assemble_object_info {
std::string path; std::string path;
ModelVolumeType subtype;
int count; int count;
std::vector<int> filaments; std::vector<int> filaments;