ENH: get first filaments & non support filament

Jira: none

Signed-off-by: qing.zhang <qing.zhang@bambulab.com>
Change-Id: I9370e48b634f21a2d3fd11d437f699b5cdb5ce43
This commit is contained in:
qing.zhang 2024-12-02 14:48:27 +08:00 committed by lane.wei
parent 13db95ceb4
commit 666e49e299
3 changed files with 88 additions and 59 deletions

View File

@ -1852,20 +1852,28 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato
ToolOrdering tool_ordering; ToolOrdering tool_ordering;
unsigned int initial_extruder_id = (unsigned int)-1; unsigned int initial_extruder_id = (unsigned int)-1;
//BBS: first non-support filament extruder //BBS: first non-support filament extruder
unsigned int initial_non_support_extruder_id; unsigned int initial_non_support_extruder_id = (unsigned int) -1;
unsigned int final_extruder_id = (unsigned int)-1; unsigned int final_extruder_id = (unsigned int)-1;
bool has_wipe_tower = false; bool has_wipe_tower = false;
print.m_statistics_by_extruder_count.clear(); print.m_statistics_by_extruder_count.clear();
std::vector<int> first_filaments;
std::vector<int> first_non_support_filaments;
std::vector<const PrintInstance*> print_object_instances_ordering; std::vector<const PrintInstance*> print_object_instances_ordering;
std::vector<const PrintInstance*>::const_iterator print_object_instance_sequential_active; std::vector<const PrintInstance*>::const_iterator print_object_instance_sequential_active;
std::vector<int> extruder_count; std::vector<int> extruder_count;
std::vector<const PrintInstance *>::const_iterator first_has_extrude_print_object;
//resize
first_non_support_filaments.resize(print.config().nozzle_diameter.size(), -1);
first_filaments.resize(print.config().nozzle_diameter.size(), -1);
if (print.config().print_sequence == PrintSequence::ByObject) { if (print.config().print_sequence == PrintSequence::ByObject) {
// Order object instances for sequential print. // Order object instances for sequential print.
print_object_instances_ordering = sort_object_instances_by_model_order(print); print_object_instances_ordering = sort_object_instances_by_model_order(print);
// print_object_instances_ordering = sort_object_instances_by_max_z(print); // print_object_instances_ordering = sort_object_instances_by_max_z(print);
// Find the 1st printing object, find its tool ordering and the initial extruder ID. // Find the 1st printing object, find its tool ordering and the initial extruder ID.
print_object_instance_sequential_active = print_object_instances_ordering.begin(); print_object_instance_sequential_active = print_object_instances_ordering.begin();
first_has_extrude_print_object = print_object_instance_sequential_active;
bool find_fist_non_support_filament = false;
for (; print_object_instance_sequential_active != print_object_instances_ordering.end(); ++ print_object_instance_sequential_active) { for (; print_object_instance_sequential_active != print_object_instances_ordering.end(); ++ print_object_instance_sequential_active) {
tool_ordering = ToolOrdering(*(*print_object_instance_sequential_active)->print_object, initial_extruder_id); tool_ordering = ToolOrdering(*(*print_object_instance_sequential_active)->print_object, initial_extruder_id);
//get extruder count //get extruder count
@ -1877,38 +1885,14 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato
extruder_count[extruder_id] += object_extruder_count[extruder_id]; extruder_count[extruder_id] += object_extruder_count[extruder_id];
tool_ordering.sort_and_build_data(*(*print_object_instance_sequential_active)->print_object,initial_extruder_id); tool_ordering.sort_and_build_data(*(*print_object_instance_sequential_active)->print_object,initial_extruder_id);
if ((initial_extruder_id = tool_ordering.first_extruder()) != static_cast<unsigned int>(-1)) { if (!find_fist_non_support_filament && tool_ordering.first_extruder() != (unsigned int) -1) {
//BBS: try to find the non-support filament extruder if is multi color and initial_extruder is support filament //BBS: try to find the non-support filament extruder if is multi color and initial_extruder is support filament
initial_non_support_extruder_id = initial_extruder_id; if (initial_extruder_id == (unsigned int) -1) {
if (tool_ordering.all_extruders().size() > 1 && print.config().filament_is_support.get_at(initial_extruder_id)) { initial_extruder_id = tool_ordering.first_extruder();
bool has_non_support_filament = false; first_has_extrude_print_object = print_object_instance_sequential_active;
for (unsigned int extruder : tool_ordering.all_extruders()) {
if (!print.config().filament_is_support.get_at(extruder)) {
has_non_support_filament = true;
break;
}
}
//BBS: find the non-support filament extruder of object
if (has_non_support_filament) {
bool find_initial_non_support_filament = false;
for (LayerTools layer_tools : tool_ordering.layer_tools()) {
if (!layer_tools.has_object)
continue;
for (unsigned int extruder : layer_tools.extruders) {
if (print.config().filament_is_support.get_at(extruder))
continue;
initial_non_support_extruder_id = extruder;
find_initial_non_support_filament = true;
break;
} }
if (find_initial_non_support_filament) find_fist_non_support_filament = tool_ordering.cal_non_support_filaments(print.config(), initial_non_support_extruder_id, first_non_support_filaments, first_filaments);
break;
}
}
}
break;
} }
} }
if (initial_extruder_id == static_cast<unsigned int>(-1)) if (initial_extruder_id == static_cast<unsigned int>(-1))
@ -1941,34 +1925,9 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato
#endif #endif
//BBS: try to find the non-support filament extruder if is multi color and initial_extruder is support filament //BBS: try to find the non-support filament extruder if is multi color and initial_extruder is support filament
if (initial_extruder_id != static_cast<unsigned int>(-1)) { if (initial_extruder_id != static_cast<unsigned int>(-1)) {
initial_non_support_extruder_id = initial_extruder_id; // BBS: try to find the non-support filament extruder if is multi color and initial_extruder is support filament
if (tool_ordering.all_extruders().size() > 1 && print.config().filament_is_support.get_at(initial_extruder_id)) { // check if has non support filaments
bool has_non_support_filament = false; tool_ordering.cal_non_support_filaments(print.config(), initial_non_support_extruder_id, first_non_support_filaments, first_filaments);
for (unsigned int extruder : tool_ordering.all_extruders()) {
if (!print.config().filament_is_support.get_at(extruder)) {
has_non_support_filament = true;
break;
}
}
//BBS: find the non-support filament extruder of object
if (has_non_support_filament){
bool find_initial_non_support_filament = false;
for (LayerTools layer_tools : tool_ordering.layer_tools()) {
if (!layer_tools.has_object)
continue;
for (unsigned int extruder : layer_tools.extruders) {
if (print.config().filament_is_support.get_at(extruder))
continue;
initial_non_support_extruder_id = extruder;
find_initial_non_support_filament = true;
break;
}
if (find_initial_non_support_filament)
break;
}
}
}
} }
// In non-sequential print, the printing extruders may have been modified by the extruder switches stored in Model::custom_gcode_per_print_z. // In non-sequential print, the printing extruders may have been modified by the extruder switches stored in Model::custom_gcode_per_print_z.
@ -2009,9 +1968,13 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato
m_placeholder_parser.set("most_used_physical_extruder_id", print.config().physical_extruder_map.values[max_count_extruder]); m_placeholder_parser.set("most_used_physical_extruder_id", print.config().physical_extruder_map.values[max_count_extruder]);
// Let the start-up script prime the 1st printing tool. // Let the start-up script prime the 1st printing tool.
m_placeholder_parser.set("first_tools", new ConfigOptionInts(first_filaments));
m_placeholder_parser.set("first_filaments", new ConfigOptionInts(first_filaments));
m_placeholder_parser.set("initial_tool", initial_extruder_id); m_placeholder_parser.set("initial_tool", initial_extruder_id);
m_placeholder_parser.set("initial_extruder", initial_extruder_id); m_placeholder_parser.set("initial_extruder", initial_extruder_id);
//BBS //BBS
m_placeholder_parser.set("first_non_support_tools", new ConfigOptionInts(first_non_support_filaments));
m_placeholder_parser.set("first_non_support_filaments", new ConfigOptionInts(first_non_support_filaments));
m_placeholder_parser.set("initial_no_support_tool", initial_non_support_extruder_id); m_placeholder_parser.set("initial_no_support_tool", initial_non_support_extruder_id);
m_placeholder_parser.set("initial_no_support_extruder", initial_non_support_extruder_id); m_placeholder_parser.set("initial_no_support_extruder", initial_non_support_extruder_id);
m_placeholder_parser.set("current_extruder", initial_extruder_id); m_placeholder_parser.set("current_extruder", initial_extruder_id);
@ -2247,6 +2210,7 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato
// Do all objects for each layer. // Do all objects for each layer.
if (print.config().print_sequence == PrintSequence::ByObject && !has_wipe_tower) { if (print.config().print_sequence == PrintSequence::ByObject && !has_wipe_tower) {
size_t finished_objects = 0; size_t finished_objects = 0;
print_object_instance_sequential_active = first_has_extrude_print_object;
const PrintObject *prev_object = (*print_object_instance_sequential_active)->print_object; const PrintObject *prev_object = (*print_object_instance_sequential_active)->print_object;
for (; print_object_instance_sequential_active != print_object_instances_ordering.end(); ++print_object_instance_sequential_active) { for (; print_object_instance_sequential_active != print_object_instances_ordering.end(); ++print_object_instance_sequential_active) {
const PrintObject &object = *(*print_object_instance_sequential_active)->print_object; const PrintObject &object = *(*print_object_instance_sequential_active)->print_object;

View File

@ -897,6 +897,65 @@ std::vector<int> ToolOrdering::cal_most_used_extruder(const PrintConfig &config)
return extruder_count; return extruder_count;
} }
//BBS: find first non support filament
bool ToolOrdering::cal_non_support_filaments(const PrintConfig &config,
unsigned int & first_non_support_filament,
std::vector<int> & initial_non_support_filaments,
std::vector<int> & initial_filaments)
{
int find_count = 0;
int find_first_filaments_count = 0;
bool has_non_support = has_non_support_filament(config);
for (const LayerTools &layer_tool : m_layer_tools) {
if (!layer_tool.has_object)
continue;
for (const unsigned int &filament : layer_tool.extruders) {
//check first filament
if (!config.filament_map.values.empty() && initial_filaments[config.filament_map.values[filament] - 1] == -1) {
initial_filaments[config.filament_map.values[filament] - 1] = filament;
find_first_filaments_count++;
}
if (has_non_support) {
// check first non support filaments
if (config.filament_is_support.get_at(filament))
continue;
if (first_non_support_filament == (unsigned int) -1) first_non_support_filament = filament;
// params missing, add protection
// filament map missing means single nozzle, no need to set initial_non_support_filaments
if (config.filament_map.values.empty())
return true;
if (initial_non_support_filaments[config.filament_map.values[filament] - 1] == -1) {
initial_non_support_filaments[config.filament_map.values[filament] - 1] = filament;
find_count++;
}
if (find_count == initial_non_support_filaments.size())
return true;
} else if (find_first_filaments_count == initial_filaments.size() || config.filament_map.values.empty()){
return false;
}
}
}
return false;
}
bool ToolOrdering::has_non_support_filament(const PrintConfig &config) {
for (const unsigned int &filament : m_all_printing_extruders) {
if (!config.filament_is_support.get_at(filament)) {
return true;
}
}
return false;
}
std::set<std::pair<std::vector<unsigned int>, std::vector<unsigned int>>> generate_combinations(const std::vector<unsigned int> &extruders) std::set<std::pair<std::vector<unsigned int>, std::vector<unsigned int>>> generate_combinations(const std::vector<unsigned int> &extruders)
{ {
int n = extruders.size(); int n = extruders.size();

View File

@ -249,6 +249,12 @@ public:
// should be called after doing reorder // should be called after doing reorder
FilamentChangeStats get_filament_change_stats(FilamentChangeMode mode); FilamentChangeStats get_filament_change_stats(FilamentChangeMode mode);
std::vector<int> cal_most_used_extruder(const PrintConfig &config); std::vector<int> cal_most_used_extruder(const PrintConfig &config);
bool cal_non_support_filaments(const PrintConfig &config,
unsigned int & first_non_support_filament,
std::vector<int> & initial_non_support_filaments,
std::vector<int> & initial_filaments);
bool has_non_support_filament(const PrintConfig &config);
private: private:
void initialize_layers(std::vector<coordf_t> &zs); void initialize_layers(std::vector<coordf_t> &zs);