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;
}
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>>();
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;
}
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) {
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_plate_info_t> &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_plate_info_t> &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_plate_info_t> &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_plate_info_t> &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_plate_info_t> &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];

View File

@ -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<int> filaments;