ENH: save filament change count in gcode result

1.Save filament change count per filament

jira:NONE

Signed-off-by: xun.zhang <xun.zhang@bambulab.com>
Change-Id: I26e7963c0b5fdcca7c7d0ec5590c3f40c1fc5eed
This commit is contained in:
xun.zhang 2024-12-30 20:59:48 +08:00 committed by lane.wei
parent 4a5574ea7b
commit 759d78dd2b
3 changed files with 25 additions and 3 deletions

View File

@ -2485,15 +2485,30 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato
print.throw_if_canceled();
}
// export info requested for filament change
void GCode::export_layer_filaments(GCodeProcessorResult* result)
{
if (result == nullptr)
return;
result->layer_filaments.clear();
const std::vector<int>filament_map = m_config.filament_map.values; // 1 based
std::vector<int>prev_filament(m_config.nozzle_diameter.size(), -1);
for (size_t idx = 0; idx < m_sorted_layer_filaments.size(); ++idx) {
for (auto f : m_sorted_layer_filaments[idx]) {
int extruder_idx = filament_map[f] - 1;
if (prev_filament[extruder_idx] != -1 && f != prev_filament[extruder_idx]) {
std::pair<int, int> from_to_pair = { prev_filament[extruder_idx],f };
auto iter = result->filament_change_count_map.find(from_to_pair);
if (iter == result->filament_change_count_map.end())
result->filament_change_count_map.emplace(from_to_pair, 1);
else
iter->second += 1;
}
prev_filament[extruder_idx] = f;
}
// now we do not need sorted data, so we sort the filaments in id order
auto& layer_filaments = m_sorted_layer_filaments[idx];
auto layer_filaments = m_sorted_layer_filaments[idx];
std::sort(layer_filaments.begin(), layer_filaments.end());
auto iter = result->layer_filaments.find(layer_filaments);
if (iter == result->layer_filaments.end()) {

View File

@ -1285,6 +1285,8 @@ void GCodeProcessorResult::reset() {
filament_costs = std::vector<float>(MIN_EXTRUDERS_COUNT, DEFAULT_FILAMENT_COST);
custom_gcode_per_print_z = std::vector<CustomGCode::Item>();
spiral_vase_layers = std::vector<std::pair<float, std::pair<size_t, size_t>>>();
layer_filaments.clear();
filament_change_count_map.clear();
warnings.clear();
//BBS: add mutex for protection of gcode result

View File

@ -253,6 +253,9 @@ namespace Slic3r {
std::vector<NozzleType> nozzle_type;
// first key stores filaments, second keys stores the layer ranges(enclosed) that use the filaments
std::unordered_map<std::vector<unsigned int>, std::vector<std::pair<int, int>>,FilamentSequenceHash> layer_filaments;
// first key stores `from` filament, second keys stores the `to` filament
std::map<std::pair<int,int>, int > filament_change_count_map;
BedType bed_type = BedType::btCount;
#if ENABLE_GCODE_VIEWER_STATISTICS
int64_t time{ 0 };
@ -288,6 +291,8 @@ namespace Slic3r {
gcode_check_result = other.gcode_check_result;
limit_filament_maps = other.limit_filament_maps;
filament_printable_reuslt = other.filament_printable_reuslt;
layer_filaments = other.layer_filaments;
filament_change_count_map = other.filament_change_count_map;
#if ENABLE_GCODE_VIEWER_STATISTICS
time = other.time;
#endif