Generate cache per vendor

This commit is contained in:
ExPikaPaka
2026-06-17 08:45:24 +02:00
parent 83e1712ded
commit 0ec6c03c83
5 changed files with 159 additions and 108 deletions

View File

@@ -1,22 +1,106 @@
#include "libslic3r/PresetBundleCache.hpp"
#include "libslic3r/PresetBundle.hpp"
#include <boost/filesystem.hpp>
#include <boost/program_options.hpp>
#include <iostream>
#include <iomanip>
using namespace Slic3r;
namespace fs = boost::filesystem;
namespace po = boost::program_options;
static void print_bar(char c, int n) { std::cout << std::string(n, c) << "\n"; }
static void inspect_one(const std::string& path, const po::variables_map& vm)
{
Slic3r::VendorCache vc;
if (!vc.load(path)) {
std::cerr << "Failed to load cache: " << path << "\n"
<< " (wrong format version, truncated file, CRC mismatch, or not a .cache file)\n";
return;
}
bool show_all = !vm.count("vendors") && !vm.count("models") &&
!vm.count("presets") && !vm.count("filaments") &&
!vm.count("printers") && !vm.count("process");
// ---- Summary ----
print_bar('=', 60);
std::cout << "Cache file : " << path << "\n";
std::cout << "Vendor : " << vc.profile.id << " v" << vc.profile.config_version << "\n";
std::cout << "JSON version: " << (vc.vendor_json_version.empty() ? "(none)" : vc.vendor_json_version) << "\n";
std::cout << "Cache ver : " << vc.cache_version << "\n";
std::cout << "Config opts : " << vc.config_options_count << "\n";
print_bar('-', 60);
std::cout << "Models : " << vc.profile.models.size() << "\n";
std::cout << "Printers : " << vc.printer_presets.size() << "\n";
std::cout << "Filaments : " << vc.filament_presets.size() << "\n";
std::cout << "Print proc : " << vc.print_presets.size() << "\n";
std::cout << "SLA print : " << vc.sla_print_presets.size() << "\n";
std::cout << "SLA material: " << vc.sla_material_presets.size() << "\n";
std::cout << "config_maps : " << vc.config_maps.size() << "\n";
std::cout << "filament_id_maps: " << vc.filament_id_maps.size() << "\n";
print_bar('=', 60);
// ---- Models ----
if (show_all || vm.count("vendors") || vm.count("models")) {
std::cout << "\nVENDOR PROFILE [" << vc.profile.id << "]\n";
print_bar('-', 60);
std::cout << " Name: " << vc.profile.name << "\n";
std::cout << " Config version: " << vc.profile.config_version << "\n";
if (vm.count("models") || show_all) {
for (const auto& m : vc.profile.models) {
std::cout << " " << std::left << std::setw(40) << m.name
<< " variants:" << m.variants.size() << "\n";
}
}
}
// ---- Printer presets ----
if (vm.count("presets") || vm.count("printers")) {
std::cout << "\nPRINTER PRESETS (" << vc.printer_presets.size() << ")\n";
print_bar('-', 60);
for (const auto& cp : vc.printer_presets) {
const auto* pm = cp.config.option<ConfigOptionString>("printer_model");
const auto* pv = cp.config.option<ConfigOptionString>("printer_variant");
std::cout << " " << std::left << std::setw(50) << cp.name
<< " model=" << (pm ? pm->value : "?")
<< " nozzle=" << (pv ? pv->value : "?")
<< (cp.is_visible ? "" : " [hidden]") << "\n";
}
}
// ---- Filament presets ----
if (vm.count("presets") || vm.count("filaments")) {
std::cout << "\nFILAMENT PRESETS (" << vc.filament_presets.size() << ")\n";
print_bar('-', 60);
for (const auto& cp : vc.filament_presets) {
const auto* fv = cp.config.option<ConfigOptionStrings>("filament_vendor");
const auto* ft = cp.config.option<ConfigOptionStrings>("filament_type");
std::cout << " " << std::left << std::setw(50) << cp.name
<< " vendor=" << (fv && !fv->values.empty() ? fv->values[0] : "?")
<< " type=" << (ft && !ft->values.empty() ? ft->values[0] : "?")
<< (cp.is_visible ? "" : " [hidden]") << "\n";
}
}
// ---- Print process presets ----
if (vm.count("presets") || vm.count("process")) {
std::cout << "\nPRINT PROCESS PRESETS (" << vc.print_presets.size() << ")\n";
print_bar('-', 60);
for (const auto& cp : vc.print_presets)
std::cout << " " << cp.name << (cp.is_visible ? "" : " [hidden]") << "\n";
}
}
int main(int argc, char* argv[])
{
po::options_description desc("OrcaSlicer Cache Inspector\nUsage");
desc.add_options()
("help,h", "Show help")
("path,p", po::value<std::string>(), "Path to .cache file (required)")
("vendors,V", "List all vendor IDs and versions")
("models,m", "List all printer models per vendor")
("path,p", po::value<std::string>(), "Path to a .cache file or a directory of .cache files (required)")
("vendors,V", "Show vendor profile summary")
("models,m", "List all printer models")
("presets,P", "List all preset names")
("filaments,f", "List filament presets")
("printers,r", "List printer presets")
@@ -33,93 +117,17 @@ int main(int argc, char* argv[])
const std::string path = vm["path"].as<std::string>();
PresetBundleCache::SystemPresetsCache cache;
if (!cache.load(path)) {
std::cerr << "Failed to load cache: " << path << "\n"
<< " (wrong format version, truncated file, or not a .cache file)\n";
return 1;
}
// ---- Summary ----
print_bar('=', 60);
std::cout << "Cache file : " << path << "\n";
std::cout << "Format ver : " << cache.format_version << "\n";
std::cout << "Config opts: " << cache.config_options_count << "\n";
print_bar('-', 60);
std::cout << "Vendors : " << cache.vendor_versions.size() << "\n";
std::cout << "Models : ";
size_t total_models = 0;
for (const auto& vp : cache.vendor_profiles) total_models += vp.models.size();
std::cout << total_models << "\n";
std::cout << "Printers : " << cache.printer_presets.size() << "\n";
std::cout << "Filaments : " << cache.filament_presets.size() << "\n";
std::cout << "Print proc : " << cache.print_presets.size() << "\n";
std::cout << "config_maps: " << cache.config_maps.size() << "\n";
std::cout << "filament_id_maps: " << cache.filament_id_maps.size() << "\n";
print_bar('=', 60);
bool show_all = !vm.count("vendors") && !vm.count("models") &&
!vm.count("presets") && !vm.count("filaments") &&
!vm.count("printers") && !vm.count("process");
// ---- Vendor versions ----
if (show_all || vm.count("vendors")) {
std::cout << "\nVENDOR VERSIONS (" << cache.vendor_versions.size() << ")\n";
print_bar('-', 60);
for (const auto& [id, ver] : cache.vendor_versions)
std::cout << " " << std::left << std::setw(30) << id << " " << ver << "\n";
}
// ---- Models per vendor ----
if (show_all || vm.count("models")) {
std::cout << "\nVENDOR PROFILES & MODELS\n";
print_bar('-', 60);
for (const auto& vp : cache.vendor_profiles) {
std::cout << " [" << vp.id << "] v" << vp.config_version
<< " (" << vp.models.size() << " models)\n";
if (vm.count("models")) {
for (const auto& m : vp.models) {
std::cout << " " << std::left << std::setw(40) << m.name
<< " variants:" << m.variants.size() << "\n";
}
}
}
}
// ---- Printer presets ----
if (vm.count("presets") || vm.count("printers")) {
std::cout << "\nPRINTER PRESETS (" << cache.printer_presets.size() << ")\n";
print_bar('-', 60);
for (const auto& cp : cache.printer_presets) {
const auto* pm = cp.config.option<ConfigOptionString>("printer_model");
const auto* pv = cp.config.option<ConfigOptionString>("printer_variant");
std::cout << " " << std::left << std::setw(50) << cp.name
<< " model=" << (pm ? pm->value : "?")
<< " nozzle=" << (pv ? pv->value : "?")
<< (cp.is_visible ? "" : " [hidden]") << "\n";
}
}
// ---- Filament presets ----
if (vm.count("presets") || vm.count("filaments")) {
std::cout << "\nFILAMENT PRESETS (" << cache.filament_presets.size() << ")\n";
print_bar('-', 60);
for (const auto& cp : cache.filament_presets) {
const auto* fv = cp.config.option<ConfigOptionString>("filament_vendor");
const auto* ft = cp.config.option<ConfigOptionStrings>("filament_type");
std::cout << " " << std::left << std::setw(50) << cp.name
<< " vendor=" << (fv ? fv->value : "?")
<< " type=" << (ft && !ft->values.empty() ? ft->values[0] : "?")
<< (cp.is_visible ? "" : " [hidden]") << "\n";
}
}
// ---- Print process presets ----
if (vm.count("presets") || vm.count("process")) {
std::cout << "\nPRINT PROCESS PRESETS (" << cache.print_presets.size() << ")\n";
print_bar('-', 60);
for (const auto& cp : cache.print_presets)
std::cout << " " << cp.name << (cp.is_visible ? "" : " [hidden]") << "\n";
if (fs::is_directory(path)) {
// Inspect all .cache files in the directory.
std::vector<fs::path> files;
for (const auto& e : fs::directory_iterator(path))
if (e.path().extension() == ".cache")
files.push_back(e.path());
std::sort(files.begin(), files.end());
for (const auto& f : files)
inspect_one(f.string(), vm);
} else {
inspect_one(path, vm);
}
return 0;