ENH: remember the filament_opts and limit minimum flushing volumes

Change-Id: I7b2538fcaf5b5fc5e4f86191207de981bd766a89
(cherry picked from commit 392be8d2a4e9465fffc4018da77c6ee00ad46ade)
This commit is contained in:
zhimin.zeng 2022-10-25 18:47:58 +08:00 committed by Lane.Wei
parent eb80720e75
commit 13df80ffb7
8 changed files with 99 additions and 3 deletions

View File

@ -482,7 +482,14 @@ std::string AppConfig::load()
} else {
m_storage[it.key()][iter.key()] = "false";
}
} else {
} else if (iter.key() == "filament_presets") {
m_filament_presets = iter.value().get<std::vector<std::string>>();
} else if (iter.key() == "filament_colors") {
m_filament_colors = iter.value().get<std::vector<std::string>>();
} else if (iter.key() == "flushing_volumes") {
m_flush_volumes_matrix = iter.value().get<std::vector<float>>();
}
else {
if (iter.value().is_string())
m_storage[it.key()][iter.key()] = iter.value().get<std::string>();
else {
@ -565,6 +572,18 @@ void AppConfig::save()
j["app"][kvp.first] = kvp.second;
}
for (const auto &filament_preset : m_filament_presets) {
j["app"]["filament_presets"].push_back(filament_preset);
}
for (const auto &filament_color : m_filament_colors) {
j["app"]["filament_colors"].push_back(filament_color);
}
for (double flushing_volume : m_flush_volumes_matrix) {
j["app"]["flushing_volumes"].push_back(flushing_volume);
}
// Write the other categories.
for (const auto& category : m_storage) {
if (category.first.empty())

View File

@ -164,6 +164,22 @@ public:
void set_vendors(VendorMap &&vendors) { m_vendors = std::move(vendors); m_dirty = true; }
const VendorMap& vendors() const { return m_vendors; }
const std::vector<std::string> &get_filament_presets() const { return m_filament_presets; }
void set_filament_presets(const std::vector<std::string> &filament_presets){
m_filament_presets = filament_presets;
m_dirty = true;
}
const std::vector<std::string> &get_filament_colors() const { return m_filament_colors; }
void set_filament_colors(const std::vector<std::string> &filament_colors){
m_filament_colors = filament_colors;
m_dirty = true;
}
const std::vector<float> &get_flush_volumes_matrix() const { return m_flush_volumes_matrix; }
void set_flush_volumes_matrix(const std::vector<float> &flush_volumes_matrix){
m_flush_volumes_matrix = flush_volumes_matrix;
m_dirty = true;
}
// return recent/last_opened_folder or recent/settings_folder or empty string.
std::string get_last_dir() const;
void update_config_dir(const std::string &dir);
@ -259,6 +275,10 @@ private:
bool m_legacy_datadir;
std::string m_loading_path;
std::vector<std::string> m_filament_presets;
std::vector<std::string> m_filament_colors;
std::vector<float> m_flush_volumes_matrix;
};
} // namespace Slic3r

View File

@ -809,6 +809,36 @@ void PresetBundle::update_system_preset_setting_ids(std::map<std::string, std::m
return;
}
void PresetBundle::load_default_setting_from_app_config(const AppConfig &config) {
auto config_filament_presets = config.get_filament_presets();
if (!config_filament_presets.empty())
this->filament_presets = config_filament_presets;
auto config_filament_colors = config.get_filament_colors();
if (!config_filament_colors.empty()) {
ConfigOptionStrings *filament_color = project_config.option<ConfigOptionStrings>("filament_colour");
filament_color->resize(config_filament_colors.size());
filament_color->values = config_filament_colors;
}
auto config_flush_volumes_matrix = config.get_flush_volumes_matrix();
if (!config_flush_volumes_matrix.empty()) {
ConfigOptionFloats *flush_volumes_matrix = project_config.option<ConfigOptionFloats>("flush_volumes_matrix");
flush_volumes_matrix->values = std::vector<double>(config_flush_volumes_matrix.begin(), config_flush_volumes_matrix.end());
}
}
void PresetBundle::update_filament_info_to_app_config(AppConfig &config)
{
config.set_filament_presets(this->filament_presets);
ConfigOptionStrings *filament_color = project_config.option<ConfigOptionStrings>("filament_colour");
config.set_filament_colors(filament_color->values);
ConfigOptionFloats *flush_volumes_matrix = project_config.option<ConfigOptionFloats>("flush_volumes_matrix");
config.set_flush_volumes_matrix(std::vector<float>(flush_volumes_matrix->values.begin(), flush_volumes_matrix->values.end()));
}
//BBS: validate printers from previous project
bool PresetBundle::validate_printers(const std::string &name, DynamicPrintConfig& config)
{

View File

@ -54,6 +54,8 @@ public:
void update_user_presets_directory(const std::string preset_folder);
void remove_user_presets_directory(const std::string preset_folder);
void update_system_preset_setting_ids(std::map<std::string, std::map<std::string, std::string>>& system_presets);
void load_default_setting_from_app_config(const AppConfig &config);
void update_filament_info_to_app_config(AppConfig &config);
//BBS: add API to get previous machine
bool validate_printers(const std::string &name, DynamicPrintConfig& config);

View File

@ -2099,6 +2099,7 @@ bool GUI_App::on_init_inner()
BOOST_LOG_TRIVIAL(info) << "loading systen presets...";
preset_bundle = new PresetBundle();
preset_bundle->load_default_setting_from_app_config(*app_config);
// just checking for existence of Slic3r::data_dir is not enough : it may be an empty directory
// supplied as argument to --datadir; in that case we should still run the wizard

View File

@ -663,6 +663,7 @@ Sidebar::Sidebar(Plater *parent)
#if !BBL_RELEASE_TO_PUBLIC
(project_config.option<ConfigOptionFloat>("flush_multiplier"))->set(new ConfigOptionFloat(dlg.get_flush_multiplier()));
#endif
wxGetApp().preset_bundle->update_filament_info_to_app_config(*wxGetApp().app_config);
wxGetApp().plater()->update_project_dirty_from_presets();
wxPostEvent(parent, SimpleEvent(EVT_SCHEDULE_BACKGROUND_PROCESS, parent));
@ -685,6 +686,7 @@ Sidebar::Sidebar(Plater *parent)
wxGetApp().preset_bundle->set_num_filaments(filament_count, new_color);
wxGetApp().plater()->on_filaments_change(filament_count);
wxGetApp().get_tab(Preset::TYPE_PRINT)->update();
wxGetApp().preset_bundle->update_filament_info_to_app_config(*wxGetApp().app_config);
});
p->m_bpButton_add_filament = add_btn;
@ -709,6 +711,7 @@ Sidebar::Sidebar(Plater *parent)
wxGetApp().preset_bundle->set_num_filaments(filament_count);
wxGetApp().plater()->on_filaments_change(filament_count);
wxGetApp().get_tab(Preset::TYPE_PRINT)->update();
wxGetApp().preset_bundle->update_filament_info_to_app_config(*wxGetApp().app_config);
});
p->m_bpButton_del_filament = del_btn;
@ -1288,6 +1291,7 @@ void Sidebar::sync_ams_list()
for (auto &c : p->combos_filament)
c->update();
wxGetApp().get_tab(Preset::TYPE_PRINT)->update();
wxGetApp().preset_bundle->update_filament_info_to_app_config(*wxGetApp().app_config);
}
ObjectList* Sidebar::obj_list()
@ -5200,6 +5204,7 @@ void Plater::priv::on_select_preset(wxCommandEvent &evt)
if (preset_type == Preset::TYPE_FILAMENT) {
wxGetApp().preset_bundle->set_filament_preset(idx, preset_name);
wxGetApp().plater()->update_project_dirty_from_presets();
wxGetApp().preset_bundle->update_filament_info_to_app_config(*wxGetApp().app_config);
}
bool select_preset = !combo->selection_is_changed_according_to_physical_printers();
@ -7084,6 +7089,7 @@ void Plater::load_project(wxString const& filename2,
reset_project_dirty_initial_presets();
update_project_dirty_from_presets();
wxGetApp().preset_bundle->update_filament_info_to_app_config(*wxGetApp().app_config);
// if res is empty no data has been loaded
if (!res.empty() && (load_restore || !(strategy & LoadStrategy::Silence))) {

View File

@ -670,6 +670,7 @@ PlaterPresetComboBox::PlaterPresetComboBox(wxWindow *parent, Preset::Type preset
//wxGetApp().get_tab(Preset::TYPE_PRINTER)->load_config(cfg_new);
cfg->apply(cfg_new);
wxGetApp().plater()->update_project_dirty_from_presets();
wxGetApp().preset_bundle->update_filament_info_to_app_config(*wxGetApp().app_config);
update();
wxGetApp().plater()->on_config_change(cfg_new);

View File

@ -11,6 +11,8 @@
#include <wx/sizer.h>
using namespace Slic3r::GUI;
int scale(const int val) { return val * Slic3r::GUI::wxGetApp().em_unit() / 10; }
int ITEM_WIDTH() { return scale(30); }
static const wxColour text_color = wxColour(107, 107, 107, 255);
@ -253,7 +255,7 @@ WipingPanel::WipingPanel(wxWindow* parent, const std::vector<float>& matrix, con
for (unsigned int j = 0; j < m_number_of_extruders; ++j) {
#ifdef _WIN32
wxTextCtrl* text = new wxTextCtrl(m_page_advanced, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(ITEM_WIDTH(), -1), wxTE_CENTER | wxBORDER_NONE);
wxTextCtrl* text = new wxTextCtrl(m_page_advanced, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(ITEM_WIDTH(), -1), wxTE_CENTER | wxBORDER_NONE | wxTE_PROCESS_ENTER);
update_ui(text);
edit_boxes.back().push_back(text);
#else
@ -272,12 +274,27 @@ WipingPanel::WipingPanel(wxWindow* parent, const std::vector<float>& matrix, con
wxString str = edit_boxes[i][j]->GetValue();
int value = wxAtoi(str);
if (value > MAX_FLUSH_VALUE) {
value = MAX_FLUSH_VALUE;
str = wxString::Format(("%d"), MAX_FLUSH_VALUE);
edit_boxes[i][j]->SetValue(str);
}
});
auto on_apply_text_modify = [this, i, j](wxEvent &e) {
wxString str = edit_boxes[i][j]->GetValue();
int value = wxAtoi(str);
if (value < int(m_extra_flush_volume)) {
wxGetApp().plater();
str = wxString::Format(("%d"), int(m_extra_flush_volume));
edit_boxes[i][j]->SetValue(str);
MessageDialog dlg(nullptr,
_L("The flush volume is less than the minimum value and will be automatically set to the minimum value."),
_L("Warning"), wxICON_WARNING | wxOK);
dlg.ShowModal();
}
};
edit_boxes[i][j]->Bind(wxEVT_TEXT_ENTER, on_apply_text_modify);
edit_boxes[i][j]->Bind(wxEVT_KILL_FOCUS, on_apply_text_modify);
}
}
}