WIP: filament/material filtering per selected printers
This commit is contained in:
parent
9a465514ff
commit
c5a67ff931
3 changed files with 206 additions and 126 deletions
|
@ -475,7 +475,7 @@ PagePrinters::PagePrinters(ConfigWizard *parent,
|
||||||
|
|
||||||
picker->Bind(EVT_PRINTER_PICK, [this, appconfig](const PrinterPickerEvent &evt) {
|
picker->Bind(EVT_PRINTER_PICK, [this, appconfig](const PrinterPickerEvent &evt) {
|
||||||
appconfig->set_variant(evt.vendor_id, evt.model_id, evt.variant_name, evt.enable);
|
appconfig->set_variant(evt.vendor_id, evt.model_id, evt.variant_name, evt.enable);
|
||||||
wizard_p()->on_printer_pick(this);
|
wizard_p()->on_printer_pick(this, evt);
|
||||||
});
|
});
|
||||||
|
|
||||||
append(new wxStaticLine(this));
|
append(new wxStaticLine(this));
|
||||||
|
@ -527,6 +527,7 @@ PageMaterials::PageMaterials(ConfigWizard *parent, Materials *materials, wxStrin
|
||||||
, list_l3(new PresetList(this))
|
, list_l3(new PresetList(this))
|
||||||
, sel1_prev(wxNOT_FOUND)
|
, sel1_prev(wxNOT_FOUND)
|
||||||
, sel2_prev(wxNOT_FOUND)
|
, sel2_prev(wxNOT_FOUND)
|
||||||
|
, presets_loaded(false)
|
||||||
{
|
{
|
||||||
append_spacer(VERTICAL_SPACING);
|
append_spacer(VERTICAL_SPACING);
|
||||||
|
|
||||||
|
@ -559,12 +560,6 @@ PageMaterials::PageMaterials(ConfigWizard *parent, Materials *materials, wxStrin
|
||||||
|
|
||||||
append(grid);
|
append(grid);
|
||||||
|
|
||||||
list_l1->append(_(L("(All)")), &EMPTY);
|
|
||||||
|
|
||||||
for (const std::string &type : materials->types) {
|
|
||||||
list_l1->append(type, &type);
|
|
||||||
}
|
|
||||||
|
|
||||||
list_l1->Bind(wxEVT_LISTBOX, [this](wxCommandEvent &) {
|
list_l1->Bind(wxEVT_LISTBOX, [this](wxCommandEvent &) {
|
||||||
update_lists(list_l1->GetSelection(), list_l2->GetSelection());
|
update_lists(list_l1->GetSelection(), list_l2->GetSelection());
|
||||||
});
|
});
|
||||||
|
@ -577,10 +572,27 @@ PageMaterials::PageMaterials(ConfigWizard *parent, Materials *materials, wxStrin
|
||||||
sel_all->Bind(wxEVT_BUTTON, [this](wxCommandEvent &) { select_all(true); });
|
sel_all->Bind(wxEVT_BUTTON, [this](wxCommandEvent &) { select_all(true); });
|
||||||
sel_none->Bind(wxEVT_BUTTON, [this](wxCommandEvent &) { select_all(false); });
|
sel_none->Bind(wxEVT_BUTTON, [this](wxCommandEvent &) { select_all(false); });
|
||||||
|
|
||||||
|
reload_presets();
|
||||||
|
}
|
||||||
|
|
||||||
|
void PageMaterials::reload_presets()
|
||||||
|
{
|
||||||
|
list_l1->Clear();
|
||||||
|
|
||||||
|
list_l1->append(_(L("(All)")), &EMPTY);
|
||||||
|
|
||||||
|
for (const std::string &type : materials->types) {
|
||||||
|
list_l1->append(type, &type);
|
||||||
|
}
|
||||||
|
|
||||||
if (list_l1->GetCount() > 0) {
|
if (list_l1->GetCount() > 0) {
|
||||||
list_l1->SetSelection(0);
|
list_l1->SetSelection(0);
|
||||||
|
sel1_prev = wxNOT_FOUND;
|
||||||
|
sel2_prev = wxNOT_FOUND;
|
||||||
update_lists(0, 0);
|
update_lists(0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
presets_loaded = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PageMaterials::update_lists(int sel1, int sel2)
|
void PageMaterials::update_lists(int sel1, int sel2)
|
||||||
|
@ -592,14 +604,14 @@ void PageMaterials::update_lists(int sel1, int sel2)
|
||||||
// Refresh the second list
|
// Refresh the second list
|
||||||
|
|
||||||
// XXX: The vendor list is created with quadratic complexity here,
|
// XXX: The vendor list is created with quadratic complexity here,
|
||||||
// but the number of vendors is realistically so small this shouldn't be a problem.
|
// but the number of vendors is going to be very small this shouldn't be a problem.
|
||||||
|
|
||||||
list_l2->Clear();
|
list_l2->Clear();
|
||||||
list_l2->append(_(L("(All)")), &EMPTY);
|
list_l2->append(_(L("(All)")), &EMPTY);
|
||||||
if (sel1 != wxNOT_FOUND) {
|
if (sel1 != wxNOT_FOUND) {
|
||||||
const std::string &type = list_l1->get_data(sel1);
|
const std::string &type = list_l1->get_data(sel1);
|
||||||
|
|
||||||
materials->filter_presets(type, EMPTY, [this](Preset &p) {
|
materials->filter_presets(type, EMPTY, [this](const Preset *p) {
|
||||||
const std::string &vendor = this->materials->get_vendor(p);
|
const std::string &vendor = this->materials->get_vendor(p);
|
||||||
|
|
||||||
if (list_l2->find(vendor) == wxNOT_FOUND) {
|
if (list_l2->find(vendor) == wxNOT_FOUND) {
|
||||||
|
@ -623,9 +635,9 @@ void PageMaterials::update_lists(int sel1, int sel2)
|
||||||
const std::string &type = list_l1->get_data(sel1);
|
const std::string &type = list_l1->get_data(sel1);
|
||||||
const std::string &vendor = list_l2->get_data(sel2);
|
const std::string &vendor = list_l2->get_data(sel2);
|
||||||
|
|
||||||
materials->filter_presets(type, vendor, [this](Preset &p) {
|
materials->filter_presets(type, vendor, [this](const Preset *p) {
|
||||||
const int i = list_l3->append(p.name, &p);
|
const int i = list_l3->append(p->name, p);
|
||||||
const bool checked = wizard_p()->appconfig_new.has(materials->appconfig_section(), p.name);
|
const bool checked = wizard_p()->appconfig_new.has(materials->appconfig_section(), p->name);
|
||||||
list_l3->Check(i, checked);
|
list_l3->Check(i, checked);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -660,6 +672,24 @@ void PageMaterials::select_all(bool select)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PageMaterials::clear()
|
||||||
|
{
|
||||||
|
list_l1->Clear();
|
||||||
|
list_l2->Clear();
|
||||||
|
list_l3->Clear();
|
||||||
|
sel1_prev = wxNOT_FOUND;
|
||||||
|
sel2_prev = wxNOT_FOUND;
|
||||||
|
presets_loaded = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PageMaterials::on_activate()
|
||||||
|
{
|
||||||
|
if (! presets_loaded) {
|
||||||
|
wizard_p()->update_materials();
|
||||||
|
reload_presets();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
const char *PageCustom::default_profile_name = "My Settings";
|
const char *PageCustom::default_profile_name = "My Settings";
|
||||||
|
|
||||||
|
@ -952,8 +982,8 @@ ConfigWizardIndex::ConfigWizardIndex(wxWindow *parent)
|
||||||
, bullet_black(ScalableBitmap(parent, "bullet_black.png"))
|
, bullet_black(ScalableBitmap(parent, "bullet_black.png"))
|
||||||
, bullet_blue(ScalableBitmap(parent, "bullet_blue.png"))
|
, bullet_blue(ScalableBitmap(parent, "bullet_blue.png"))
|
||||||
, bullet_white(ScalableBitmap(parent, "bullet_white.png"))
|
, bullet_white(ScalableBitmap(parent, "bullet_white.png"))
|
||||||
, item_active(0)
|
, item_active(NO_ITEM)
|
||||||
, item_hover(-1)
|
, item_hover(NO_ITEM)
|
||||||
, last_page((size_t)-1)
|
, last_page((size_t)-1)
|
||||||
{
|
{
|
||||||
SetMinSize(bg.bmp().GetSize());
|
SetMinSize(bg.bmp().GetSize());
|
||||||
|
@ -1015,6 +1045,8 @@ void ConfigWizardIndex::go_prev()
|
||||||
{
|
{
|
||||||
// Search for a preceiding item that is a page (not a label, ie. page != nullptr)
|
// Search for a preceiding item that is a page (not a label, ie. page != nullptr)
|
||||||
|
|
||||||
|
if (item_active == NO_ITEM) { return; }
|
||||||
|
|
||||||
for (size_t i = item_active; i > 0; i--) {
|
for (size_t i = item_active; i > 0; i--) {
|
||||||
if (items[i - 1].page != nullptr) {
|
if (items[i - 1].page != nullptr) {
|
||||||
go_to(i - 1);
|
go_to(i - 1);
|
||||||
|
@ -1027,6 +1059,8 @@ void ConfigWizardIndex::go_next()
|
||||||
{
|
{
|
||||||
// Search for a next item that is a page (not a label, ie. page != nullptr)
|
// Search for a next item that is a page (not a label, ie. page != nullptr)
|
||||||
|
|
||||||
|
if (item_active == NO_ITEM) { return; }
|
||||||
|
|
||||||
for (size_t i = item_active + 1; i < items.size(); i++) {
|
for (size_t i = item_active + 1; i < items.size(); i++) {
|
||||||
if (items[i].page != nullptr) {
|
if (items[i].page != nullptr) {
|
||||||
go_to(i);
|
go_to(i);
|
||||||
|
@ -1035,19 +1069,27 @@ void ConfigWizardIndex::go_next()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This one actually performs the go-to op
|
||||||
void ConfigWizardIndex::go_to(size_t i)
|
void ConfigWizardIndex::go_to(size_t i)
|
||||||
{
|
{
|
||||||
if (i < items.size() && items[i].page != nullptr) {
|
if (i != item_active
|
||||||
|
&& i < items.size()
|
||||||
|
&& items[i].page != nullptr) {
|
||||||
|
auto *new_active = items[i].page;
|
||||||
auto *former_active = active_page();
|
auto *former_active = active_page();
|
||||||
if (former_active != nullptr) { former_active->Hide(); }
|
if (former_active != nullptr) {
|
||||||
|
former_active->Hide();
|
||||||
|
}
|
||||||
|
|
||||||
item_active = i;
|
item_active = i;
|
||||||
items[i].page->Show();
|
new_active->Show();
|
||||||
|
|
||||||
wxCommandEvent evt(EVT_INDEX_PAGE, GetId());
|
wxCommandEvent evt(EVT_INDEX_PAGE, GetId());
|
||||||
AddPendingEvent(evt);
|
AddPendingEvent(evt);
|
||||||
|
|
||||||
Refresh();
|
Refresh();
|
||||||
|
|
||||||
|
new_active->on_activate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1069,7 +1111,7 @@ void ConfigWizardIndex::clear()
|
||||||
if (former_active != nullptr) { former_active->Hide(); }
|
if (former_active != nullptr) { former_active->Hide(); }
|
||||||
|
|
||||||
items.clear();
|
items.clear();
|
||||||
item_active = 0;
|
item_active = NO_ITEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConfigWizardIndex::on_paint(wxPaintEvent & evt)
|
void ConfigWizardIndex::on_paint(wxPaintEvent & evt)
|
||||||
|
@ -1150,24 +1192,38 @@ void ConfigWizardIndex::msw_rescale()
|
||||||
|
|
||||||
const std::string Materials::UNKNOWN = "(Unknown)";
|
const std::string Materials::UNKNOWN = "(Unknown)";
|
||||||
|
|
||||||
|
void Materials::push(const Preset *preset)
|
||||||
|
{
|
||||||
|
presets.insert(preset);
|
||||||
|
types.insert(technology & T_FFF
|
||||||
|
? Materials::get_filament_type(preset)
|
||||||
|
: Materials::get_material_type(preset));
|
||||||
|
}
|
||||||
|
|
||||||
|
void Materials::clear()
|
||||||
|
{
|
||||||
|
presets.clear();
|
||||||
|
types.clear();
|
||||||
|
}
|
||||||
|
|
||||||
const std::string& Materials::appconfig_section() const
|
const std::string& Materials::appconfig_section() const
|
||||||
{
|
{
|
||||||
return (technology & T_FFF) ? AppConfig::SECTION_FILAMENTS : AppConfig::SECTION_MATERIALS;
|
return (technology & T_FFF) ? AppConfig::SECTION_FILAMENTS : AppConfig::SECTION_MATERIALS;
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::string& Materials::get_type(Preset &preset) const
|
const std::string& Materials::get_type(const Preset *preset) const
|
||||||
{
|
{
|
||||||
return (technology & T_FFF) ? get_filament_type(preset) : get_material_type(preset);
|
return (technology & T_FFF) ? get_filament_type(preset) : get_material_type(preset);
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::string& Materials::get_vendor(Preset &preset) const
|
const std::string& Materials::get_vendor(const Preset *preset) const
|
||||||
{
|
{
|
||||||
return (technology & T_FFF) ? get_filament_vendor(preset) : get_material_vendor(preset);
|
return (technology & T_FFF) ? get_filament_vendor(preset) : get_material_vendor(preset);
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::string& Materials::get_filament_type(const Preset &preset)
|
const std::string& Materials::get_filament_type(const Preset *preset)
|
||||||
{
|
{
|
||||||
const auto *opt = preset.config.opt<ConfigOptionStrings>("filament_type");
|
const auto *opt = preset->config.opt<ConfigOptionStrings>("filament_type");
|
||||||
if (opt != nullptr && opt->values.size() > 0) {
|
if (opt != nullptr && opt->values.size() > 0) {
|
||||||
return opt->values[0];
|
return opt->values[0];
|
||||||
} else {
|
} else {
|
||||||
|
@ -1175,15 +1231,15 @@ const std::string& Materials::get_filament_type(const Preset &preset)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::string& Materials::get_filament_vendor(const Preset &preset)
|
const std::string& Materials::get_filament_vendor(const Preset *preset)
|
||||||
{
|
{
|
||||||
const auto *opt = preset.config.opt<ConfigOptionString>("filament_vendor");
|
const auto *opt = preset->config.opt<ConfigOptionString>("filament_vendor");
|
||||||
return opt != nullptr ? opt->value : UNKNOWN;
|
return opt != nullptr ? opt->value : UNKNOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::string& Materials::get_material_type(Preset &preset)
|
const std::string& Materials::get_material_type(const Preset *preset)
|
||||||
{
|
{
|
||||||
const auto *opt = preset.config.opt<ConfigOptionString>("material_type");
|
const auto *opt = preset->config.opt<ConfigOptionString>("material_type");
|
||||||
if (opt != nullptr) {
|
if (opt != nullptr) {
|
||||||
return opt->value;
|
return opt->value;
|
||||||
} else {
|
} else {
|
||||||
|
@ -1191,9 +1247,9 @@ const std::string& Materials::get_material_type(Preset &preset)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::string& Materials::get_material_vendor(const Preset &preset)
|
const std::string& Materials::get_material_vendor(const Preset *preset)
|
||||||
{
|
{
|
||||||
const auto *opt = preset.config.opt<ConfigOptionString>("material_vendor");
|
const auto *opt = preset->config.opt<ConfigOptionString>("material_vendor");
|
||||||
return opt != nullptr ? opt->value : UNKNOWN;
|
return opt != nullptr ? opt->value : UNKNOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1275,73 +1331,8 @@ void ConfigWizard::priv::init_dialog_size()
|
||||||
|
|
||||||
void ConfigWizard::priv::load_vendors()
|
void ConfigWizard::priv::load_vendors()
|
||||||
{
|
{
|
||||||
// const auto vendor_dir = fs::path(Slic3r::data_dir()) / "vendor";
|
|
||||||
// const auto rsrc_vendor_dir = fs::path(resources_dir()) / "profiles";
|
|
||||||
|
|
||||||
// PresetBundle bundle;
|
|
||||||
// bundle.load_available_system_presets();
|
|
||||||
bundles = BundleMap::load();
|
bundles = BundleMap::load();
|
||||||
|
|
||||||
// // Load vendors from the "vendors" directory in datadir
|
|
||||||
// // XXX: The VendorProfile is loaded twice here, ditto below
|
|
||||||
// for (auto &dir_entry : boost::filesystem::directory_iterator(vendor_dir)) {
|
|
||||||
// if (Slic3r::is_ini_file(dir_entry)) {
|
|
||||||
// try {
|
|
||||||
// bundle.load_configbundle(dir_entry.path().string(), PresetBundle::LOAD_CFGBNDLE_SYSTEM);
|
|
||||||
|
|
||||||
// auto vp = VendorProfile::from_ini(dir_entry.path());
|
|
||||||
// vendors[vp.id] = std::move(vp);
|
|
||||||
// }
|
|
||||||
// catch (const std::exception& e) {
|
|
||||||
// BOOST_LOG_TRIVIAL(error) << boost::format("Error loading vendor bundle %1%: %2%") % dir_entry.path() % e.what();
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// // Additionally load up vendors from the application resources directory, but only those not seen in the datadir
|
|
||||||
// for (auto &dir_entry : boost::filesystem::directory_iterator(rsrc_vendor_dir)) {
|
|
||||||
// if (Slic3r::is_ini_file(dir_entry)) {
|
|
||||||
// const auto id = dir_entry.path().stem().string();
|
|
||||||
|
|
||||||
// if (vendors.find(id) == vendors.end()) {
|
|
||||||
// try {
|
|
||||||
// bundle.load_configbundle(dir_entry.path().string(), PresetBundle::LOAD_CFGBNDLE_SYSTEM);
|
|
||||||
|
|
||||||
// auto vp = VendorProfile::from_ini(dir_entry.path());
|
|
||||||
// vendors_rsrc[vp.id] = dir_entry.path().filename().string();
|
|
||||||
// vendors[vp.id] = std::move(vp);
|
|
||||||
// }
|
|
||||||
// catch (const std::exception& e) {
|
|
||||||
// BOOST_LOG_TRIVIAL(error) << boost::format("Error loading vendor bundle %1%: %2%") % dir_entry.path() % e.what();
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// // Move materials to our Materials container:
|
|
||||||
// for (auto &&f : bundle.filaments) {
|
|
||||||
// f.vendor = nullptr;
|
|
||||||
// filaments.presets.push_back(std::move(f));
|
|
||||||
// filaments.types.insert(Materials::get_filament_type(f));
|
|
||||||
// }
|
|
||||||
// for (auto &&m : bundle.sla_materials) {
|
|
||||||
// m.vendor = nullptr;
|
|
||||||
// sla_materials.presets.push_back(std::move(m));
|
|
||||||
// sla_materials.types.insert(Materials::get_material_type(m));
|
|
||||||
// }
|
|
||||||
for (auto &pair : bundles) {
|
|
||||||
for (auto &&f : pair.second.preset_bundle->filaments) {
|
|
||||||
f.vendor = nullptr;
|
|
||||||
filaments.presets.push_back(std::move(f));
|
|
||||||
filaments.types.insert(Materials::get_filament_type(f));
|
|
||||||
}
|
|
||||||
for (auto &&m : pair.second.preset_bundle->sla_materials) {
|
|
||||||
m.vendor = nullptr;
|
|
||||||
sla_materials.presets.push_back(std::move(m));
|
|
||||||
sla_materials.types.insert(Materials::get_material_type(m));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Load up the set of vendors / models / variants the user has had enabled up till now
|
// Load up the set of vendors / models / variants the user has had enabled up till now
|
||||||
AppConfig *app_config = wxGetApp().app_config;
|
AppConfig *app_config = wxGetApp().app_config;
|
||||||
if (! app_config->legacy_datadir()) {
|
if (! app_config->legacy_datadir()) {
|
||||||
|
@ -1360,15 +1351,13 @@ void ConfigWizard::priv::load_vendors()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: This'll be done differently, cf. the design document
|
// Initialize the is_visible flag in printer Presets
|
||||||
// Load up the materials enabled till now,
|
for (auto &pair : bundles) {
|
||||||
// apply defaults from vendor profiles if there are no selections yet.
|
pair.second.preset_bundle->load_installed_printers(appconfig_new);
|
||||||
// bundle.init_materials_selection(*app_config);
|
}
|
||||||
|
|
||||||
|
update_materials();
|
||||||
|
|
||||||
// TODO: load up sane defaults if no previous data in AppConfig
|
|
||||||
// as per the design doc:
|
|
||||||
// - all f/m for installed printers if prev Slicer version
|
|
||||||
// - default f/m set from bundle + default for each printer from bundle if fresh install
|
|
||||||
if (app_config->has_section(AppConfig::SECTION_FILAMENTS)) {
|
if (app_config->has_section(AppConfig::SECTION_FILAMENTS)) {
|
||||||
appconfig_new.set_section(AppConfig::SECTION_FILAMENTS, app_config->get_section(AppConfig::SECTION_FILAMENTS));
|
appconfig_new.set_section(AppConfig::SECTION_FILAMENTS, app_config->get_section(AppConfig::SECTION_FILAMENTS));
|
||||||
}
|
}
|
||||||
|
@ -1420,12 +1409,66 @@ void ConfigWizard::priv::set_run_reason(RunReason run_reason)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ConfigWizard::priv::update_materials()
|
||||||
|
{
|
||||||
|
filaments.clear();
|
||||||
|
sla_materials.clear();
|
||||||
|
|
||||||
|
if (any_fff_selected) {
|
||||||
|
// Iterate filaments in all bundles
|
||||||
|
for (const auto &pair : bundles) {
|
||||||
|
for (const auto &filament : pair.second.preset_bundle->filaments) {
|
||||||
|
// Check if filament is already added
|
||||||
|
if (filaments.containts(&filament)) { continue; }
|
||||||
|
|
||||||
|
// Iterate printers in all bundles
|
||||||
|
for (const auto &pair : bundles) {
|
||||||
|
for (const auto &printer : pair.second.preset_bundle->printers) {
|
||||||
|
// Filter out inapplicable printers
|
||||||
|
if (!printer.is_visible || printer.printer_technology() != ptFFF) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (filament.is_compatible_with_printer(printer)) {
|
||||||
|
filaments.push(&filament);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (any_sla_selected) {
|
||||||
|
// Iterate SLA materials in all bundles
|
||||||
|
for (const auto &pair : bundles) {
|
||||||
|
for (const auto &material : pair.second.preset_bundle->sla_materials) {
|
||||||
|
// Check if material is already added
|
||||||
|
if (sla_materials.containts(&material)) { continue; }
|
||||||
|
|
||||||
|
// Iterate printers in all bundles
|
||||||
|
for (const auto &pair : bundles) {
|
||||||
|
for (const auto &printer : pair.second.preset_bundle->printers) {
|
||||||
|
// Filter out inapplicable printers
|
||||||
|
if (!printer.is_visible || printer.printer_technology() != ptSLA) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (material.is_compatible_with_printer(printer)) {
|
||||||
|
sla_materials.push(&material);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ConfigWizard::priv::on_custom_setup()
|
void ConfigWizard::priv::on_custom_setup()
|
||||||
{
|
{
|
||||||
load_pages();
|
load_pages();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConfigWizard::priv::on_printer_pick(PagePrinters *page)
|
void ConfigWizard::priv::on_printer_pick(PagePrinters *page, const PrinterPickerEvent &evt)
|
||||||
{
|
{
|
||||||
if (page_msla->any_selected() != any_sla_selected ||
|
if (page_msla->any_selected() != any_sla_selected ||
|
||||||
page_fff->any_selected() != any_fff_selected) {
|
page_fff->any_selected() != any_fff_selected) {
|
||||||
|
@ -1434,6 +1477,24 @@ void ConfigWizard::priv::on_printer_pick(PagePrinters *page)
|
||||||
|
|
||||||
load_pages();
|
load_pages();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Update the is_visible flag on relevant printer profiles
|
||||||
|
for (auto &pair : bundles) {
|
||||||
|
if (pair.first != evt.vendor_id) { continue; }
|
||||||
|
|
||||||
|
for (auto &preset : pair.second.preset_bundle->printers) {
|
||||||
|
if (preset.config.opt_string("printer_model") == evt.model_id
|
||||||
|
&& preset.config.opt_string("printer_variant") == evt.variant_name) {
|
||||||
|
preset.is_visible = evt.enable;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (page == page_fff) {
|
||||||
|
page_filaments->clear();
|
||||||
|
} else if (page == page_msla) {
|
||||||
|
page_sla_materials->clear();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConfigWizard::priv::on_3rdparty_install(const VendorProfile *vendor, bool install)
|
void ConfigWizard::priv::on_3rdparty_install(const VendorProfile *vendor, bool install)
|
||||||
|
@ -1636,7 +1697,9 @@ ConfigWizard::ConfigWizard(wxWindow *parent)
|
||||||
|
|
||||||
p->any_sla_selected = p->page_msla->any_selected();
|
p->any_sla_selected = p->page_msla->any_selected();
|
||||||
p->any_fff_selected = p->page_fff->any_selected();
|
p->any_fff_selected = p->page_fff->any_selected();
|
||||||
|
|
||||||
p->load_pages();
|
p->load_pages();
|
||||||
|
p->index->go_to(size_t{0});
|
||||||
|
|
||||||
vsizer->Add(topsizer, 1, wxEXPAND | wxALL, DIALOG_MARGIN);
|
vsizer->Add(topsizer, 1, wxEXPAND | wxALL, DIALOG_MARGIN);
|
||||||
vsizer->Add(hline, 0, wxEXPAND);
|
vsizer->Add(hline, 0, wxEXPAND);
|
||||||
|
|
|
@ -21,7 +21,6 @@
|
||||||
#include "libslic3r/PrintConfig.hpp"
|
#include "libslic3r/PrintConfig.hpp"
|
||||||
#include "slic3r/Utils/PresetUpdater.hpp"
|
#include "slic3r/Utils/PresetUpdater.hpp"
|
||||||
#include "AppConfig.hpp"
|
#include "AppConfig.hpp"
|
||||||
// #include "Preset.hpp"
|
|
||||||
#include "PresetBundle.hpp"
|
#include "PresetBundle.hpp"
|
||||||
#include "BedShapeDialog.hpp"
|
#include "BedShapeDialog.hpp"
|
||||||
|
|
||||||
|
@ -58,17 +57,23 @@ enum Technology {
|
||||||
struct Materials
|
struct Materials
|
||||||
{
|
{
|
||||||
Technology technology;
|
Technology technology;
|
||||||
std::vector<Preset> presets;
|
std::set<const Preset*> presets;
|
||||||
std::set<std::string> types;
|
std::set<std::string> types;
|
||||||
|
|
||||||
Materials(Technology technology) : technology(technology) {}
|
Materials(Technology technology) : technology(technology) {}
|
||||||
|
|
||||||
|
void push(const Preset *preset);
|
||||||
|
void clear();
|
||||||
|
bool containts(const Preset *preset) {
|
||||||
|
return presets.find(preset) != presets.end();
|
||||||
|
}
|
||||||
|
|
||||||
const std::string& appconfig_section() const;
|
const std::string& appconfig_section() const;
|
||||||
const std::string& get_type(Preset &preset) const;
|
const std::string& get_type(const Preset *preset) const;
|
||||||
const std::string& get_vendor(Preset &preset) const;
|
const std::string& get_vendor(const Preset *preset) const;
|
||||||
|
|
||||||
template<class F> void filter_presets(const std::string &type, const std::string &vendor, F cb) {
|
template<class F> void filter_presets(const std::string &type, const std::string &vendor, F cb) {
|
||||||
for (Preset &preset : presets) {
|
for (const Preset *preset : presets) {
|
||||||
if ((type.empty() || get_type(preset) == type) && (vendor.empty() || get_vendor(preset) == vendor)) {
|
if ((type.empty() || get_type(preset) == type) && (vendor.empty() || get_vendor(preset) == vendor)) {
|
||||||
cb(preset);
|
cb(preset);
|
||||||
}
|
}
|
||||||
|
@ -76,10 +81,10 @@ struct Materials
|
||||||
}
|
}
|
||||||
|
|
||||||
static const std::string UNKNOWN;
|
static const std::string UNKNOWN;
|
||||||
static const std::string& get_filament_type(const Preset &preset);
|
static const std::string& get_filament_type(const Preset *preset);
|
||||||
static const std::string& get_filament_vendor(const Preset &preset);
|
static const std::string& get_filament_vendor(const Preset *preset);
|
||||||
static const std::string& get_material_type(Preset &preset);
|
static const std::string& get_material_type(const Preset *preset);
|
||||||
static const std::string& get_material_vendor(const Preset &preset);
|
static const std::string& get_material_vendor(const Preset *preset);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Bundle
|
struct Bundle
|
||||||
|
@ -104,6 +109,7 @@ struct BundleMap: std::unordered_map<std::string /* = vendor ID */, Bundle>
|
||||||
const Bundle& prusa_bundle() const;
|
const Bundle& prusa_bundle() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct PrinterPickerEvent;
|
||||||
|
|
||||||
|
|
||||||
// GUI elements
|
// GUI elements
|
||||||
|
@ -170,6 +176,7 @@ struct ConfigWizardPage: wxPanel
|
||||||
|
|
||||||
virtual void apply_custom_config(DynamicPrintConfig &config) {}
|
virtual void apply_custom_config(DynamicPrintConfig &config) {}
|
||||||
virtual void set_run_reason(ConfigWizard::RunReason run_reason) {}
|
virtual void set_run_reason(ConfigWizard::RunReason run_reason) {}
|
||||||
|
virtual void on_activate() {}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct PageWelcome: ConfigWizardPage
|
struct PageWelcome: ConfigWizardPage
|
||||||
|
@ -209,6 +216,9 @@ template<class T, class D> struct DataList : public T
|
||||||
{
|
{
|
||||||
DataList(wxWindow *parent) : T(parent, wxID_ANY) {}
|
DataList(wxWindow *parent) : T(parent, wxID_ANY) {}
|
||||||
|
|
||||||
|
// Note: We're _not_ using wxLB_SORT here because it doesn't do the right thing,
|
||||||
|
// eg. "ABS" is sorted before "(All)"
|
||||||
|
|
||||||
int append(const std::string &label, const D *data) {
|
int append(const std::string &label, const D *data) {
|
||||||
void *ptr = reinterpret_cast<void*>(const_cast<D*>(data));
|
void *ptr = reinterpret_cast<void*>(const_cast<D*>(data));
|
||||||
return this->Append(from_u8(label), ptr);
|
return this->Append(from_u8(label), ptr);
|
||||||
|
@ -241,14 +251,19 @@ struct PageMaterials: ConfigWizardPage
|
||||||
StringList *list_l1, *list_l2;
|
StringList *list_l1, *list_l2;
|
||||||
PresetList *list_l3;
|
PresetList *list_l3;
|
||||||
int sel1_prev, sel2_prev;
|
int sel1_prev, sel2_prev;
|
||||||
|
bool presets_loaded;
|
||||||
|
|
||||||
|
static const std::string EMPTY;
|
||||||
|
|
||||||
PageMaterials(ConfigWizard *parent, Materials *materials, wxString title, wxString shortname, wxString list1name);
|
PageMaterials(ConfigWizard *parent, Materials *materials, wxString title, wxString shortname, wxString list1name);
|
||||||
|
|
||||||
|
void reload_presets();
|
||||||
void update_lists(int sel1, int sel2);
|
void update_lists(int sel1, int sel2);
|
||||||
void select_material(int i);
|
void select_material(int i);
|
||||||
void select_all(bool select);
|
void select_all(bool select);
|
||||||
|
void clear();
|
||||||
|
|
||||||
static const std::string EMPTY;
|
virtual void on_activate() override;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct PageCustom: ConfigWizardPage
|
struct PageCustom: ConfigWizardPage
|
||||||
|
@ -339,6 +354,8 @@ public:
|
||||||
void msw_rescale();
|
void msw_rescale();
|
||||||
|
|
||||||
int em() const { return em_w; }
|
int em() const { return em_w; }
|
||||||
|
|
||||||
|
static const size_t NO_ITEM = size_t(-1);
|
||||||
private:
|
private:
|
||||||
struct Item
|
struct Item
|
||||||
{
|
{
|
||||||
|
@ -379,14 +396,12 @@ struct ConfigWizard::priv
|
||||||
ConfigWizard *q;
|
ConfigWizard *q;
|
||||||
ConfigWizard::RunReason run_reason = RR_USER;
|
ConfigWizard::RunReason run_reason = RR_USER;
|
||||||
AppConfig appconfig_new; // Backing for vendor/model/variant and material selections in the GUI
|
AppConfig appconfig_new; // Backing for vendor/model/variant and material selections in the GUI
|
||||||
// std::unordered_map<std::string, VendorProfile> vendors;
|
BundleMap bundles; // Holds all loaded config bundles, the key is the vendor names.
|
||||||
// PresetBundle bundle; // XXX: comment
|
// Materials refers to Presets in those bundles by pointers.
|
||||||
BundleMap bundles; // XXX: comment
|
// Also we update the is_visible flag in printer Presets according to the
|
||||||
|
// PrinterPickers state.
|
||||||
Materials filaments; // Holds available filament presets and their types & vendors
|
Materials filaments; // Holds available filament presets and their types & vendors
|
||||||
Materials sla_materials; // Ditto for SLA materials
|
Materials sla_materials; // Ditto for SLA materials
|
||||||
// std::set<const VendorProfile*> install_3rdparty;
|
|
||||||
// XXX: rm: (?)
|
|
||||||
// std::unordered_map<std::string, std::string> vendors_rsrc; // List of bundles to install from resources
|
|
||||||
std::unique_ptr<DynamicPrintConfig> custom_config; // Backing for custom printer definition
|
std::unique_ptr<DynamicPrintConfig> custom_config; // Backing for custom printer definition
|
||||||
bool any_fff_selected; // Used to decide whether to display Filaments page
|
bool any_fff_selected; // Used to decide whether to display Filaments page
|
||||||
bool any_sla_selected; // Used to decide whether to display SLA Materials page
|
bool any_sla_selected; // Used to decide whether to display SLA Materials page
|
||||||
|
@ -437,10 +452,11 @@ struct ConfigWizard::priv
|
||||||
void set_start_page(ConfigWizard::StartPage start_page);
|
void set_start_page(ConfigWizard::StartPage start_page);
|
||||||
void create_3rdparty_pages();
|
void create_3rdparty_pages();
|
||||||
void set_run_reason(RunReason run_reason);
|
void set_run_reason(RunReason run_reason);
|
||||||
|
void update_materials();
|
||||||
|
|
||||||
void on_custom_setup();
|
void on_custom_setup();
|
||||||
void on_printer_pick(PagePrinters *page);
|
void on_printer_pick(PagePrinters *page, const PrinterPickerEvent &evt);
|
||||||
void on_3rdparty_install(const VendorProfile *vendor, bool install); // XXX: ?
|
void on_3rdparty_install(const VendorProfile *vendor, bool install);
|
||||||
|
|
||||||
void apply_config(AppConfig *app_config, PresetBundle *preset_bundle, const PresetUpdater *updater);
|
void apply_config(AppConfig *app_config, PresetBundle *preset_bundle, const PresetUpdater *updater);
|
||||||
|
|
||||||
|
|
|
@ -134,20 +134,21 @@ public:
|
||||||
|
|
||||||
void load_default_preset_bitmaps(wxWindow *window);
|
void load_default_preset_bitmaps(wxWindow *window);
|
||||||
|
|
||||||
|
// FIXME: rm
|
||||||
void load_available_system_presets(); // XXX: name XXX: retval (VendorMap stored internally)
|
void load_available_system_presets(); // XXX: name XXX: retval (VendorMap stored internally)
|
||||||
|
|
||||||
|
// Set the is_visible flag for printer vendors, printer models and printer variants
|
||||||
|
// based on the user configuration.
|
||||||
|
// If the "vendor" section is missing, enable all models and variants of the particular vendor.
|
||||||
|
void load_installed_printers(const AppConfig &config);
|
||||||
|
|
||||||
static const char *PRUSA_BUNDLE;
|
static const char *PRUSA_BUNDLE;
|
||||||
private:
|
private:
|
||||||
std::string load_system_presets();
|
std::string load_system_presets();
|
||||||
// Merge one vendor's presets with the other vendor's presets, report duplicates.
|
// Merge one vendor's presets with the other vendor's presets, report duplicates.
|
||||||
std::vector<std::string> merge_presets(PresetBundle &&other);
|
std::vector<std::string> merge_presets(PresetBundle &&other);
|
||||||
|
|
||||||
// Set the "enabled" flag for printer vendors, printer models and printer variants
|
// Set the is_visible flag for filaments and sla materials,
|
||||||
// based on the user configuration.
|
|
||||||
// If the "vendor" section is missing, enable all models and variants of the particular vendor.
|
|
||||||
void load_installed_printers(const AppConfig &config);
|
|
||||||
|
|
||||||
// Set the enabled flag for filaments and sla materials,
|
|
||||||
// apply defaults based on enabled printers when no filaments/materials are installed.
|
// apply defaults based on enabled printers when no filaments/materials are installed.
|
||||||
void load_installed_filaments(AppConfig &config);
|
void load_installed_filaments(AppConfig &config);
|
||||||
void load_installed_sla_materials(AppConfig &config);
|
void load_installed_sla_materials(AppConfig &config);
|
||||||
|
|
Loading…
Reference in a new issue