902 {
903
905
909 auto &printer_input =
m_print->m_printer_input;
910
912
914 const double fast_tilt =
printer_config.fast_tilt_time.getFloat();
915 const double slow_tilt =
printer_config.slow_tilt_time.getFloat();
916
917 const double init_exp_time =
material_config.initial_exposure_time.getFloat();
919
920 const int fade_layers_cnt =
m_print->m_default_object_config.faded_layers.getInt();
921
925
926 double supports_volume(0.0);
927 double models_volume(0.0);
928
929 double estim_time(0.0);
930 std::vector<double> layers_times;
931 layers_times.reserve(printer_input.size());
932
933 size_t slow_layers = 0;
934 size_t fast_layers = 0;
935
936 const double delta_fade_time = (init_exp_time - exp_time) / (fade_layers_cnt + 1);
937 double fade_layer_time = init_exp_time;
938
939 sla::ccr::SpinningMutex mutex;
940 using Lock = std::lock_guard<sla::ccr::SpinningMutex>;
941
942
943 auto printlayerfn = [this,
944
945 area_fill, display_area, exp_time, init_exp_time, fast_tilt, slow_tilt, delta_fade_time,
946
947
948 &mutex, &models_volume, &supports_volume, &estim_time, &slow_layers,
949 &fast_layers, &fade_layer_time, &layers_times](size_t sliced_layer_cnt)
950 {
951 PrintLayer &layer =
m_print->m_printer_input[sliced_layer_cnt];
952
953
954 auto& slicerecord_references = layer.slices();
955
956 if(slicerecord_references.empty()) return;
957
958
959 const auto l_height = double(slicerecord_references.front().get().layer_height());
960
961
962
965
966 size_t c = std::accumulate(layer.slices().begin(),
967 layer.slices().end(),
968 size_t(0),
970 return a + sr.get_slice(soModel).size();
971 });
972
973 model_polygons.reserve(c);
974
975 c = std::accumulate(layer.slices().begin(),
976 layer.slices().end(),
977 size_t(0),
979 return a + sr.get_slice(soModel).size();
980 });
981
982 supports_polygons.reserve(c);
983
985
987 for(ExPolygon& p_tmp : modelslices) model_polygons.emplace_back(std::move(p_tmp));
988
990 for(ExPolygon& p_tmp : supportslices) supports_polygons.emplace_back(std::move(p_tmp));
991
992 }
993
994 model_polygons =
union_ex(model_polygons);
995 double layer_model_area = 0;
996 for (const ExPolygon& polygon : model_polygons)
997 layer_model_area +=
area(polygon);
998
999 if (layer_model_area < 0 || layer_model_area > 0) {
1000 Lock lck(mutex); models_volume += layer_model_area * l_height;
1001 }
1002
1003 if(!supports_polygons.empty()) {
1004 if(model_polygons.empty()) supports_polygons =
union_ex(supports_polygons);
1005 else supports_polygons =
diff_ex(supports_polygons, model_polygons);
1006
1007 }
1008
1009 double layer_support_area = 0;
1010 for (const ExPolygon& polygon : supports_polygons)
1011 layer_support_area +=
area(polygon);
1012
1013 if (layer_support_area < 0 || layer_support_area > 0) {
1014 Lock lck(mutex); supports_volume += layer_support_area * l_height;
1015 }
1016
1017
1019 trslices.reserve(model_polygons.size() + supports_polygons.size());
1020 for(ExPolygon& poly : model_polygons) trslices.emplace_back(std::move(poly));
1021 for(ExPolygon& poly : supports_polygons) trslices.emplace_back(std::move(poly));
1022
1023 layer.transformed_slices(
union_ex(trslices));
1024
1025
1026
1027 const bool is_fast_layer = (layer_model_area + layer_support_area) <= display_area*
area_fill;
1028 const double tilt_time = is_fast_layer ? fast_tilt : slow_tilt;
1029
1030 { Lock lck(mutex);
1031 if (is_fast_layer)
1032 fast_layers++;
1033 else
1034 slow_layers++;
1035
1036
1037
1038 double layer_times = 0.0;
1039 if (sliced_layer_cnt < 3)
1040 layer_times += init_exp_time;
1041 else if (fade_layer_time > exp_time) {
1042 fade_layer_time -= delta_fade_time;
1043 layer_times += fade_layer_time;
1044 }
1045 else
1046 layer_times += exp_time;
1047 layer_times += tilt_time;
1048
1049 layers_times.push_back(layer_times);
1050 estim_time += layer_times;
1051 }
1052 };
1053
1054
1055
1056 sla::ccr::for_each(size_t(0), printer_input.size(), printlayerfn);
1057
1061
1062
1063
1064 if (printer_input.size() == 0)
1066 else {
1069 }
1070
1073
1075}
void initialize_printer_input()
Definition SLAPrintSteps.cpp:856
const SLAMaterialConfig & material_config() const
Definition SLAPrint.hpp:498
const SLAPrinterConfig & printer_config() const
Definition SLAPrint.hpp:497
const SLAPrintStatistics & print_statistics() const
Definition SLAPrint.hpp:509
double SCALING_FACTOR
Definition libslic3r.cpp:3
coord_t width(const BoundingBox &box)
Definition Arrange.cpp:1184
coord_t height(const BoundingBox &box)
Definition Arrange.cpp:1185
area_fill((ConfigOptionFloat, min_exposure_time))((ConfigOptionFloat
Slic3r::ExPolygons diff_ex(const Slic3r::Polygons &subject, const Slic3r::Polygons &clip, ApplySafetyOffset do_safety_offset)
Definition ClipperUtils.cpp:831
static ExPolygons get_all_polygons(const SliceRecord &record, SliceOrigin o)
Definition SLAPrintSteps.cpp:797
double area(const ExPolygon &poly)
Definition ExPolygon.hpp:511
Slic3r::ExPolygons union_ex(const Slic3r::Polygons &subject, PolyFillType fill_type)
Definition ClipperUtils.cpp:1011
double support_used_material
Definition SLAPrint.hpp:385
size_t slow_layers_count
Definition SLAPrint.hpp:386
std::vector< double > layers_times
Definition SLAPrint.hpp:390
void clear()
Definition SLAPrint.hpp:399
double estimated_print_time
Definition SLAPrint.hpp:383
size_t fast_layers_count
Definition SLAPrint.hpp:387
double objects_used_material
Definition SLAPrint.hpp:384