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:
parent
13db95ceb4
commit
666e49e299
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue