diff --git a/src/libslic3r/Format/bbs_3mf.cpp b/src/libslic3r/Format/bbs_3mf.cpp index 45848b934a..8dd00935f7 100644 --- a/src/libslic3r/Format/bbs_3mf.cpp +++ b/src/libslic3r/Format/bbs_3mf.cpp @@ -317,6 +317,7 @@ static constexpr const char* NOZZLE_TYPE_ATTR = "nozzle_types"; static constexpr const char* NOZZLE_DIAMETERS_ATTR = "nozzle_diameters"; static constexpr const char* SLICE_PREDICTION_ATTR = "prediction"; static constexpr const char* SLICE_WEIGHT_ATTR = "weight"; +static constexpr const char* FIRST_LAYER_TIME_ATTR = "first_layer_time"; static constexpr const char* TIMELAPSE_TYPE_ATTR = "timelapse_type"; static constexpr const char* OUTSIDE_ATTR = "outside"; static constexpr const char* SUPPORT_USED_ATTR = "support_used"; @@ -7917,6 +7918,7 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result) stream << " <" << METADATA_TAG << " " << KEY_ATTR << "=\"" << TIMELAPSE_TYPE_ATTR << "\" " << VALUE_ATTR << "=\"" << timelapse_type << "\"/>\n"; stream << " <" << METADATA_TAG << " " << KEY_ATTR << "=\"" << SLICE_PREDICTION_ATTR << "\" " << VALUE_ATTR << "=\"" << plate_data->get_gcode_prediction_str() << "\"/>\n"; stream << " <" << METADATA_TAG << " " << KEY_ATTR << "=\"" << SLICE_WEIGHT_ATTR << "\" " << VALUE_ATTR << "=\"" << plate_data->get_gcode_weight_str() << "\"/>\n"; + stream << " <" << METADATA_TAG << " " << KEY_ATTR << "=\"" << FIRST_LAYER_TIME_ATTR << "\" " << VALUE_ATTR << "=\"" << plate_data->first_layer_time << "\"/>\n"; stream << " <" << METADATA_TAG << " " << KEY_ATTR << "=\"" << OUTSIDE_ATTR << "\" " << VALUE_ATTR << "=\"" << std::boolalpha<< plate_data->toolpath_outside << "\"/>\n"; stream << " <" << METADATA_TAG << " " << KEY_ATTR << "=\"" << SUPPORT_USED_ATTR << "\" " << VALUE_ATTR << "=\"" << std::boolalpha<< plate_data->is_support_used << "\"/>\n"; stream << " <" << METADATA_TAG << " " << KEY_ATTR << "=\"" << LABEL_OBJECT_ENABLED_ATTR << "\" " << VALUE_ATTR << "=\"" << std::boolalpha<< plate_data->is_label_object_enabled << "\"/>\n"; diff --git a/src/libslic3r/Format/bbs_3mf.hpp b/src/libslic3r/Format/bbs_3mf.hpp index 35d2c83669..5fd57c4d61 100644 --- a/src/libslic3r/Format/bbs_3mf.hpp +++ b/src/libslic3r/Format/bbs_3mf.hpp @@ -85,6 +85,7 @@ struct PlateData std::string pattern_bbox_file; std::string gcode_prediction; std::string gcode_weight; + std::string first_layer_time; std::string plate_name; std::vector slice_filaments_info; std::vector skipped_objects; diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index ff37da5949..a66681f0f4 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -1987,7 +1987,7 @@ void GCode::do_export(Print* print, const char* path, GCodeProcessorResult* resu if(is_BBL_Printer()) result->label_object_enabled = m_enable_exclude_object; - + result->initial_layer_time = m_initial_layer_time; // Write the profiler measurements to file PROFILE_UPDATE(); PROFILE_OUTPUT(debug_out_path("gcode-export-profile.txt").c_str()); @@ -3429,6 +3429,12 @@ void GCode::process_layers( tbb::parallel_pipeline(12, generator & pressure_equalizer & cooling & fan_mover & pa_processor_filter & output); else tbb::parallel_pipeline(12, generator & cooling & fan_mover & pa_processor_filter & output); + + for (auto& layer_res : layers_results) { + if (layer_res.layer_id == 0) + m_initial_layer_time = layer_res.layer_time; + } + } // Process all layers of a single object instance (sequential mode) with a parallel pipeline: diff --git a/src/libslic3r/GCode.hpp b/src/libslic3r/GCode.hpp index 2827f9c2ad..7886ff3316 100644 --- a/src/libslic3r/GCode.hpp +++ b/src/libslic3r/GCode.hpp @@ -618,6 +618,8 @@ private: std::vector m_printed_objects; + float m_initial_layer_time; + // Processor GCodeProcessor m_processor; diff --git a/src/libslic3r/GCode/GCodeProcessor.hpp b/src/libslic3r/GCode/GCodeProcessor.hpp index fa99f09a17..962d5ee28a 100644 --- a/src/libslic3r/GCode/GCodeProcessor.hpp +++ b/src/libslic3r/GCode/GCodeProcessor.hpp @@ -161,6 +161,7 @@ class Print; ConflictResultOpt conflict_result; GCodeCheckResult gcode_check_result; FilamentPrintableResult filament_printable_reuslt; + float initial_layer_time; struct SettingsIds { diff --git a/src/libslic3r/GCode/ThumbnailData.hpp b/src/libslic3r/GCode/ThumbnailData.hpp index 53439d0acd..1a41c7486e 100644 --- a/src/libslic3r/GCode/ThumbnailData.hpp +++ b/src/libslic3r/GCode/ThumbnailData.hpp @@ -78,6 +78,7 @@ struct PlateBBoxData int first_extruder = 0; float nozzle_diameter = 0.4; std::string bed_type; + float first_layer_time; // version 1: use view type ColorPrint (filament color) // version 2: use view type FilamentId (filament id) int version = 2; @@ -91,6 +92,7 @@ struct PlateBBoxData j["nozzle_diameter"] = nozzle_diameter; j["version"] = version; j["bed_type"] = bed_type; + j["first_layer_time"] = first_layer_time; for (const auto& bbox : bbox_objs) { nlohmann::json j_bbox; bbox.to_json(j_bbox); diff --git a/src/slic3r/GUI/PartPlate.cpp b/src/slic3r/GUI/PartPlate.cpp index 30ad79c78c..52415ab62b 100644 --- a/src/slic3r/GUI/PartPlate.cpp +++ b/src/slic3r/GUI/PartPlate.cpp @@ -5920,6 +5920,7 @@ int PartPlateList::store_to_3mf_structure(PlateDataPtrs& plate_data_list, bool w plate_data_item->is_label_object_enabled = m_plate_list[i]->m_gcode_result->label_object_enabled; plate_data_item->limit_filament_maps = m_plate_list[i]->m_gcode_result->limit_filament_maps; plate_data_item->layer_filaments = m_plate_list[i]->m_gcode_result->layer_filaments; + plate_data_item->first_layer_time = std::to_string(m_plate_list[i]->cali_bboxes_data.first_layer_time); Print *print = nullptr; m_plate_list[i]->get_print((PrintBase **) &print, nullptr, nullptr); if (print) { diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 7ac5afce35..fbd912a856 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -9662,6 +9662,7 @@ PlateBBoxData Plater::priv::generate_first_layer_bbox() bboxdata.is_seq_print = (curr_plate_seq == PrintSequence::ByObject); bboxdata.first_extruder = print->get_tool_ordering().first_extruder(); bboxdata.bed_type = bed_type_to_gcode_string(print->config().curr_bed_type.value); + bboxdata.first_layer_time = partplate_list.get_curr_plate()->get_slice_result()->initial_layer_time; // get nozzle diameter auto opt_nozzle_diameters = print->config().option("nozzle_diameter"); if (opt_nozzle_diameters != nullptr)