Simplify binary metadata generation

This commit is contained in:
Lukas Matena 2023-12-08 23:14:08 +01:00
parent 834f6ef37c
commit 1ee6e42642

View File

@ -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<const ConfigOptionFloat*>(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<const ConfigOptionPercent*>(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<const ConfigOptionFloat*>(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<const ConfigOptionInts*>(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<const ConfigOptionBool*>(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<const ConfigOptionBool*>(opt)->value ? "1" : "0"); // duplicated into config data
if (auto opt = cfg.option("extruder_colour"); opt != nullptr) {
auto values = dynamic_cast<const ConfigOptionStrings*>(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<std::string> 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);
}
}