ENH: CLI: support to remove duplicate colors when import obj

jira: no-jira
Change-Id: Ied11676ec1d173b6d80d12b72a0d6dc18d130efc
This commit is contained in:
lane.wei 2024-08-09 11:12:42 +08:00 committed by Lane.Wei
parent bba3c30517
commit 146d857f50
1 changed files with 35 additions and 22 deletions

View File

@ -779,7 +779,7 @@ void merge_or_add_object(assemble_plate_info_t& assemble_plate_info, Model &mode
} }
} }
bool convert_obj_cluster_colors(std::vector<Slic3r::RGBA>& input_colors, std::vector<RGBA>& all_colours, int max_filament_count, std::vector<unsigned char>& output_filament_ids, unsigned char & first_filament_id) bool convert_obj_cluster_colors(std::vector<Slic3r::RGBA>& input_colors, std::vector<RGBA>& all_colours, int max_filament_count, std::vector<unsigned char>& output_filament_ids, int& first_filament_id)
{ {
using namespace Slic3r::GUI; using namespace Slic3r::GUI;
@ -798,7 +798,16 @@ bool convert_obj_cluster_colors(std::vector<Slic3r::RGBA>& input_colors, std::ve
int init_size = all_colours.size(); int init_size = all_colours.size();
first_filament_id = max_filament_count;
for (size_t i = 0; i < cluster_colors.size(); i++) { for (size_t i = 0; i < cluster_colors.size(); i++) {
auto previous_color = std::find(all_colours.begin(), all_colours.end(), cluster_colors[i]);
if (previous_color != all_colours.end()) {
cluster_color_maps[i] = previous_color - all_colours.begin() + 1;
BOOST_LOG_TRIVIAL(info) << boost::format("%1%:%2%, cluster color index %3% RGBA {%4%,%5%,%6%,%7%} found same color before, id %8%")
%__FUNCTION__ %__LINE__%(i+1) %cluster_colors[i][0] %cluster_colors[i][1] %cluster_colors[i][2] %cluster_colors[i][3] %cluster_color_maps[i] ;
}
else {
if ((init_size + i + 1) <= max_filament_count) { if ((init_size + i + 1) <= max_filament_count) {
all_colours.push_back(cluster_colors[i]); all_colours.push_back(cluster_colors[i]);
cluster_color_maps[i] = all_colours.size(); cluster_color_maps[i] = all_colours.size();
@ -814,10 +823,13 @@ bool convert_obj_cluster_colors(std::vector<Slic3r::RGBA>& input_colors, std::ve
} }
std::sort(color_dists.begin(), color_dists.end(), [](ColorDistValue &a, ColorDistValue &b) { return a.distance < b.distance; }); std::sort(color_dists.begin(), color_dists.end(), [](ColorDistValue &a, ColorDistValue &b) { return a.distance < b.distance; });
cluster_color_maps[i] = color_dists[0].id; cluster_color_maps[i] = color_dists[0].id;
BOOST_LOG_TRIVIAL(info) << boost::format("%1%:%2%, cluster color index %3% RGBA {%4%,%5%,%6%,%7%} directly inserted, id %8%") BOOST_LOG_TRIVIAL(info) << boost::format("%1%:%2%, color size reaches to max, cluster color index %3% RGBA {%4%,%5%,%6%,%7%} mapped to id %8%")
%__FUNCTION__ %__LINE__%(i+1) %cluster_colors[i][0] %cluster_colors[i][1] %cluster_colors[i][2] %cluster_colors[i][3] %cluster_color_maps[i] ; %__FUNCTION__ %__LINE__%(i+1) %cluster_colors[i][0] %cluster_colors[i][1] %cluster_colors[i][2] %cluster_colors[i][3] %cluster_color_maps[i] ;
} }
} }
if (cluster_color_maps[i] < first_filament_id)
first_filament_id = cluster_color_maps[i];
}
//3.generate filament_ids //3.generate filament_ids
auto input_colors_size = input_colors.size(); auto input_colors_size = input_colors.size();
@ -826,9 +838,8 @@ bool convert_obj_cluster_colors(std::vector<Slic3r::RGBA>& input_colors, std::ve
int label = cluster_labels[i]; int label = cluster_labels[i];
output_filament_ids[i] = cluster_color_maps[label]; output_filament_ids[i] = cluster_color_maps[label];
} }
first_filament_id = cluster_color_maps[0];
BOOST_LOG_TRIVIAL(info) << boost::format("%1%:%2%, all_colours size changes to %3%")%__FUNCTION__ %__LINE__%all_colours.size(); BOOST_LOG_TRIVIAL(info) << boost::format("%1%:%2%, all_colours size changes to %3%, first_filament_id = %4%")%__FUNCTION__ %__LINE__%all_colours.size() %first_filament_id;
return true; return true;
} }
@ -934,17 +945,19 @@ static int construct_assemble_list(std::vector<assemble_plate_info_t> &assemble_
} }
std::vector<unsigned char> output_filament_ids; std::vector<unsigned char> output_filament_ids;
unsigned char first_extruder_id; int first_filament_id;
if (obj_info.vertex_colors.size() > 0) { if (obj_info.vertex_colors.size() > 0) {
convert_obj_cluster_colors(obj_info.vertex_colors, all_colours, max_filament_count, output_filament_ids, first_extruder_id); convert_obj_cluster_colors(obj_info.vertex_colors, all_colours, max_filament_count, output_filament_ids, first_filament_id);
if (output_filament_ids.size() > 0) { if (output_filament_ids.size() > 0) {
result = Model::obj_import_vertex_color_deal(output_filament_ids, first_extruder_id, & obj_temp_model); unsigned char first_eid = (unsigned char)first_filament_id;
result = Model::obj_import_vertex_color_deal(output_filament_ids, first_eid, & obj_temp_model);
} }
skip_filament = true; skip_filament = true;
} else if (obj_info.face_colors.size() > 0 && obj_info.has_uv_png == false) { // mtl file } else if (obj_info.face_colors.size() > 0 && obj_info.has_uv_png == false) { // mtl file
convert_obj_cluster_colors(obj_info.face_colors, all_colours, max_filament_count, output_filament_ids, first_extruder_id); convert_obj_cluster_colors(obj_info.face_colors, all_colours, max_filament_count, output_filament_ids, first_filament_id);
if (output_filament_ids.size() > 0) { if (output_filament_ids.size() > 0) {
result = Model::obj_import_face_color_deal(output_filament_ids, first_extruder_id, & obj_temp_model); unsigned char first_eid = (unsigned char)first_filament_id;
result = Model::obj_import_face_color_deal(output_filament_ids, first_eid, & obj_temp_model);
} }
skip_filament = true; skip_filament = true;
} }