730{
731 if (!result) return;
732
733 PrintEstimatedStatistics &ps = result->print_statistics;
734 std::vector<float> m_filament_diameters = result->filament_diameters;
735 std::vector<float> m_filament_densities = result->filament_densities;
736 auto get_used_filament_from_volume = [m_filament_diameters, m_filament_densities](double volume, int extruder_id) {
737 double koef = 0.001;
738 double section_area =
PI *
sqr(0.5 * m_filament_diameters[extruder_id]);
739 std::pair<double, double> ret = {section_area <
EPSILON ? 0 : (koef * volume / section_area), volume * m_filament_densities[extruder_id] * 0.001};
740 return ret;
741 };
742
743 for (auto it = ps.total_volumes_per_extruder.begin(); it != ps.total_volumes_per_extruder.end(); it++) {
744 double volume = it->second;
745 auto [used_filament_m, used_filament_g] = get_used_filament_from_volume(volume, it->first);
746
747 FilamentInfo info;
748 info.id = it->first;
749 info.used_g = used_filament_g;
750 info.used_m = used_filament_m;
751
752
753
754
755
756
757
758 if (result && result->nozzle_group_result) {
759 auto nozzles_for_filament = result->nozzle_group_result->get_nozzles_for_filament(it->first);
760 if (!nozzles_for_filament.empty()) {
761 info.group_id.reserve(nozzles_for_filament.size());
762 std::set<double> diameters;
763 std::set<NozzleVolumeType> volume_types;
764 for (const auto& nozzle : nozzles_for_filament) {
765 info.group_id.emplace_back(nozzle.group_id);
767 volume_types.insert(nozzle.volume_type);
768 }
769 std::sort(info.group_id.begin(), info.group_id.end());
770 info.group_id.erase(std::unique(info.group_id.begin(), info.group_id.end()), info.group_id.end());
771 if (!diameters.empty())
772 info.nozzle_diameter = *diameters.begin();
773 if (volume_types.size() > 1)
775 else if (!volume_types.empty())
777 }
778 }
779
780 auto model_volume_it = ps.model_volumes_per_extruder.find(it->first);
781 auto support_volume_it = ps.support_volumes_per_extruder.find(it->first);
782 info.used_for_object = model_volume_it != ps.model_volumes_per_extruder.end() && model_volume_it->second >
EPSILON;
783 info.used_for_support = support_volume_it != ps.support_volumes_per_extruder.end() && support_volume_it->second >
EPSILON;
785 }
786
787
788
789
790 auto layered_group_result = std::dynamic_pointer_cast<MultiNozzleUtils::LayeredNozzleGroupResult>(result->nozzle_group_result);
791 if (layered_group_result)
793
794
795
796
797
798
799
801}
#define EPSILON
Definition ColorUtils.cpp:64
static constexpr double PI
Definition libslic3r.h:81
@ nvtHybrid
Definition PrintConfig.hpp:621
constexpr T sqr(T x)
Definition libslic3r.h:301
double string_to_double_decimal_point(const std::string_view str, size_t *pos)
Definition LocalesUtils.cpp:86
std::string get_nozzle_volume_type_string(NozzleVolumeType nozzle_volume_type)
Definition PrintConfig.cpp:860
std::optional< MultiNozzleUtils::LayeredNozzleGroupResult > nozzle_group_result
Definition bbs_3mf.hpp:140
std::vector< FilamentInfo > slice_filaments_info
Definition bbs_3mf.hpp:118
std::vector< GCodeProcessorResult::SliceWarning > warnings
Definition bbs_3mf.hpp:149