diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 0bba48b430..8f1b41792f 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -897,67 +897,18 @@ void GCodeGenerator::_do_export(Print& print, GCodeOutputStream &file, Thumbnail // config data encode_full_config(print, binary_data.slicer_metadata.raw_data); - // printer data - binary_data.printer_metadata.raw_data.emplace_back("printer_model", print.config().printer_model.value); // duplicated into config data - std::string filament_types_str; - for (size_t i = 0; i < print.config().filament_type.values.size(); ++i) { - filament_types_str += print.config().filament_type.values[i]; - if (i < print.config().filament_type.values.size() - 1) - filament_types_str += ";"; - } - binary_data.printer_metadata.raw_data.emplace_back("filament_type", filament_types_str); // duplicated into config data - char buf[1024]; - std::string nozzle_diameters_str; - for (size_t i = 0; i < print.config().nozzle_diameter.values.size(); ++i) { - sprintf(buf, i < print.config().nozzle_diameter.values.size() - 1 ? "%.2g," : "%.2g", print.config().nozzle_diameter.values[i]); - nozzle_diameters_str += buf; - } - binary_data.printer_metadata.raw_data.emplace_back("nozzle_diameter", nozzle_diameters_str); // duplicated into config data - std::string bed_temperatures_str; - for (size_t i = 0; i < print.config().bed_temperature.values.size(); ++i) { - sprintf(buf, i < print.config().bed_temperature.values.size() - 1 ? "%d," : "%d", print.config().bed_temperature.values[i]); - bed_temperatures_str += buf; - } - binary_data.printer_metadata.raw_data.emplace_back("bed_temperature", bed_temperatures_str); // duplicated into config data - - const DynamicPrintConfig& cfg = print.full_print_config(); - if (auto opt = cfg.option("brim_width"); opt != nullptr) { - sprintf(buf, "%.2g", dynamic_cast(opt)->value); - binary_data.printer_metadata.raw_data.emplace_back("brim_width", buf); // duplicated into config data - } - if (auto opt = cfg.option("fill_density"); opt != nullptr) { - sprintf(buf, "%.2g%%", dynamic_cast(opt)->value); - binary_data.printer_metadata.raw_data.emplace_back("fill_density", buf); // duplicated into config data - } - if (auto opt = cfg.option("layer_height"); opt != nullptr) { - sprintf(buf, "%.2g", dynamic_cast(opt)->value); - binary_data.printer_metadata.raw_data.emplace_back("layer_height", buf); // duplicated into config data - } - if (auto opt = cfg.option("temperature"); opt != nullptr) { - auto values = dynamic_cast(opt)->values; - std::string temperatures_str; - for (size_t i = 0; i < values.size(); ++i) { - sprintf(buf, i < values.size() - 1 ? "%d," : "%d", values[i]); - temperatures_str += buf; - } - binary_data.printer_metadata.raw_data.emplace_back("temperature", temperatures_str); // duplicated into config data - } - if (auto opt = cfg.option("ironing"); opt != nullptr) - binary_data.printer_metadata.raw_data.emplace_back("ironing", dynamic_cast(opt)->value ? "1" : "0"); // duplicated into config data - if (auto opt = cfg.option("support_material"); opt != nullptr) - binary_data.printer_metadata.raw_data.emplace_back("support_material", dynamic_cast(opt)->value ? "1" : "0"); // duplicated into config data - if (auto opt = cfg.option("extruder_colour"); opt != nullptr) { - auto values = dynamic_cast(opt)->values; - std::string extruder_colours_str; - if (values.size() == 1 && values.front().empty()) - extruder_colours_str = "\"\""; - else { - for (size_t i = 0; i < values.size(); ++i) { - sprintf(buf, i < values.size() - 1 ? "%s;" : "%s", values[i].c_str()); - extruder_colours_str += buf; - } - } - binary_data.printer_metadata.raw_data.emplace_back("extruder_colour", extruder_colours_str); // duplicated into config data + // printer data - this section contains duplicates from the slicer metadata + // that we just created. Find and copy the entries that we want to duplicate. + const auto& slicer_metadata = binary_data.slicer_metadata.raw_data; + const std::vector keys_to_duplicate = { "printer_model", "filament_type", "nozzle_diameter", "bed_temperature", + "brim_width", "fill_density", "layer_height", "temperature", "ironing", "support_material", "extruder_colour" }; + assert(std::is_sorted(slicer_metadata.begin(), slicer_metadata.end(), + [](const auto& a, const auto& b) { return a.first < b.first; })); + for (const std::string& key : keys_to_duplicate) { + auto it = std::lower_bound(slicer_metadata.begin(), slicer_metadata.end(), std::make_pair(key, 0), + [](const auto& a, const auto& b) { return a.first < b.first; }); + if (it != slicer_metadata.end() && it->first == key) + binary_data.printer_metadata.raw_data.emplace_back(*it); } }