ENH: config: add default_nozzle_volume_type in printer

1. also remove original nozzle_volume_type from printer
and move into project config
2. support save nozzle_volume_type into appconfig
and load from it at beginning or printer switch

jira: no-jira

Change-Id: I01fc82d142fc633fc59a238796a71b9f8d180efb
This commit is contained in:
lane.wei 2024-08-06 16:31:32 +08:00
parent 8bdac292a0
commit fe8b904e75
10 changed files with 105 additions and 16 deletions

View File

@ -1268,6 +1268,32 @@ std::vector<std::string> AppConfig::get_custom_color_from_config()
return colors;
}
void AppConfig::save_nozzle_volume_types_to_config(const std::string& printer_name, const std::string& nozzle_volume_types)
{
if (!has_section("nozzle_volume_types")) {
std::map<std::string, std::string> data;
data[printer_name] = nozzle_volume_types;
set_section("nozzle_volume_types", data);
} else {
auto data = get_section("nozzle_volume_types");
auto data_modify = const_cast<std::map<std::string, std::string>&>(data);
data_modify[printer_name] = nozzle_volume_types;
set_section("nozzle_volume_types", data_modify);
}
}
std::string AppConfig::get_nozzle_volume_types_from_config(const std::string& printer_name)
{
std::string nozzle_volume_types;
if (has_section("nozzle_volume_types")) {
auto data = get_section("nozzle_volume_types");
if (data.find(printer_name) != data.end())
nozzle_volume_types = data[printer_name];
}
return nozzle_volume_types;
}
void AppConfig::reset_selections()
{
auto it = m_storage.find("presets");

View File

@ -71,7 +71,7 @@ public:
if (it == m_storage.end())
return false;
auto it2 = it->second.find(key);
if (it2 == it->second.end())
if (it2 == it->second.end())
return false;
value = it2->second;
return true;
@ -203,6 +203,10 @@ public:
void save_custom_color_to_config(const std::vector<std::string> &colors);
std::vector<std::string> get_custom_color_from_config();
void save_nozzle_volume_types_to_config(const std::string& printer_name, const std::string& nozzle_volume_types);
std::string get_nozzle_volume_types_from_config(const std::string& printer_name);
// reset the current print / filament / printer selections, so that
// the PresetBundle::load_selections(const AppConfig &config) call will select
// the first non-default preset when called.
@ -252,7 +256,7 @@ public:
private:
template<typename T>
bool get_3dmouse_device_numeric_value(const std::string &device_name, const char *parameter_name, T &out) const
bool get_3dmouse_device_numeric_value(const std::string &device_name, const char *parameter_name, T &out) const
{
std::string key = std::string("mouse_device:") + device_name;
auto it = m_storage.find(key);

View File

@ -944,7 +944,7 @@ static std::vector<std::string> s_Preset_printer_options {
"printer_technology",
"printable_area", "bed_exclude_area","bed_custom_texture", "bed_custom_model", "gcode_flavor",
"single_extruder_multi_material", "machine_start_gcode", "machine_end_gcode","printing_by_object_gcode","before_layer_change_gcode", "layer_change_gcode", "time_lapse_gcode", "change_filament_gcode",
"printer_model", "printer_variant", "printer_extruder_id", "printer_extruder_variant", "extruder_variant_list", "nozzle_volume_type",
"printer_model", "printer_variant", "printer_extruder_id", "printer_extruder_variant", "extruder_variant_list", "default_nozzle_volume_type",
"printable_height", "extruder_clearance_radius", "extruder_clearance_max_radius","extruder_clearance_height_to_lid", "extruder_clearance_height_to_rod",
"nozzle_height",
"default_print_profile", "inherits",

View File

@ -41,6 +41,7 @@ static std::vector<std::string> s_project_options {
"wipe_tower_rotation_angle",
"curr_bed_type",
"flush_multiplier",
"nozzle_volume_type"
};
//BBS: add BBL as default
@ -1674,6 +1675,23 @@ void PresetBundle::load_selections(AppConfig &config, const PresetPreferences& p
}
}
const Preset& current_printer = printers.get_selected_preset();
const Preset* base_printer = printers.get_preset_base(current_printer);
bool use_default_nozzle_volume_type = true;
if (base_printer) {
std::string prev_nozzle_volume_type = config.get_nozzle_volume_types_from_config(base_printer->name);
if (!prev_nozzle_volume_type.empty()) {
ConfigOptionEnumsGeneric* nozzle_volume_type_option = project_config.option<ConfigOptionEnumsGeneric>("nozzle_volume_type");
if (nozzle_volume_type_option->deserialize(prev_nozzle_volume_type)) {
use_default_nozzle_volume_type = false;
}
}
}
if (use_default_nozzle_volume_type) {
project_config.option<ConfigOptionEnumsGeneric>("nozzle_volume_type")->values = current_printer.config.option<ConfigOptionEnumsGeneric>("default_nozzle_volume_type")->values;
}
// Parse the initial physical printer name.
std::string initial_physical_printer_name = remove_ini_suffix(config.get("presets", "physical_printer"));

View File

@ -3078,7 +3078,18 @@ void PrintConfigDef::init_fff_params()
def->enum_values.push_back("Big Traffic");
def->enum_labels.push_back(L("Normal"));
def->enum_labels.push_back(L("Big Traffic"));
def->mode = comAdvanced;
def->mode = comSimple;
def->set_default_value(new ConfigOptionEnumsGeneric{ NozzleVolumeType::nvtNormal });
def = this->add("default_nozzle_volume_type", coEnums);
def->label = L("Default Nozzle Volume Type");
def->tooltip = ("Default Nozzle volume type for extruders in this printer");
def->enum_keys_map = &ConfigOptionEnum<NozzleVolumeType>::get_enum_values();
def->enum_values.push_back("Normal");
def->enum_values.push_back("Big Traffic");
def->enum_labels.push_back(L("Normal"));
def->enum_labels.push_back(L("Big Traffic"));
def->mode = comDevelop;
def->set_default_value(new ConfigOptionEnumsGeneric{ NozzleVolumeType::nvtNormal });
def = this->add("extruder_variant_list", coStrings);
@ -4265,7 +4276,7 @@ void PrintConfigDef::init_extruder_option_keys()
{
// ConfigOptionFloats, ConfigOptionPercents, ConfigOptionBools, ConfigOptionStrings
m_extruder_option_keys = {
"extruder_type", "nozzle_diameter", "nozzle_volume_type", "min_layer_height", "max_layer_height", "extruder_offset",
"extruder_type", "nozzle_diameter", "default_nozzle_volume_type", "min_layer_height", "max_layer_height", "extruder_offset",
"retraction_length", "z_hop", "z_hop_types", "retraction_speed", "retract_lift_above", "retract_lift_below","deretraction_speed",
"retract_before_wipe", "retract_restart_extra", "retraction_minimum_travel", "wipe", "wipe_distance",
"retract_when_changing_layer", "retract_length_toolchange", "retract_restart_extra_toolchange", "extruder_colour",
@ -5143,7 +5154,7 @@ std::set<std::string> filament_options_with_variant = {
std::set<std::string> printer_extruder_options = {
"extruder_type",
"nozzle_diameter",
"nozzle_volume_type",
"default_nozzle_volume_type",
"min_layer_height",
"max_layer_height"
};

View File

@ -24,7 +24,7 @@ namespace Slic3r { namespace GUI {
constexpr int titleWidth = 20;
// get the param index of cur_exturder
int get_extruder_idx(const DynamicPrintConfig& config, const std::string &opt_key, int cur_extruder_id)
int get_extruder_idx(const DynamicPrintConfig& config, const std::string &opt_key, int cur_extruder_id, NozzleVolumeType nozzle_volume_type)
{
if (printer_extruder_options.find(opt_key) != printer_extruder_options.end()) {
return cur_extruder_id;
@ -37,13 +37,13 @@ int get_extruder_idx(const DynamicPrintConfig& config, const std::string &opt_ke
assert(cur_extruder_id < extruder_count);
const DynamicPrintConfig& cur_printer_config = wxGetApp().preset_bundle->printers.get_selected_preset().config;
auto opt_extruder_type = dynamic_cast<const ConfigOptionEnumsGeneric *>(cur_printer_config.option("extruder_type"));
auto opt_nozzle_volume_type = dynamic_cast<const ConfigOptionEnumsGeneric *>(cur_printer_config.option("nozzle_volume_type"));
//auto opt_nozzle_volume_type = dynamic_cast<const ConfigOptionEnumsGeneric *>(cur_printer_config.option("default_nozzle_volume_type"));
if (!opt_extruder_type || !opt_nozzle_volume_type)
if (!opt_extruder_type)
return 0;
ExtruderType extruder_type = (ExtruderType) (opt_extruder_type->get_at(cur_extruder_id));
NozzleVolumeType nozzle_volume_type = (NozzleVolumeType) (opt_nozzle_volume_type->get_at(cur_extruder_id));
//NozzleVolumeType nozzle_volume_type = (NozzleVolumeType) (opt_nozzle_volume_type->get_at(cur_extruder_id));
std::string id_name, variant_name;
unsigned int stride = 1;

View File

@ -24,7 +24,7 @@
namespace Slic3r { namespace GUI {
extern int get_extruder_idx(const DynamicPrintConfig& config, const std::string &opt_key, int cur_extruder_id);
extern int get_extruder_idx(const DynamicPrintConfig& config, const std::string &opt_key, int cur_extruder_id, NozzleVolumeType nozzle_volume_type);
// Thrown if the building of a parameter page is canceled.
class UIBuildCanceled : public std::exception {};

View File

@ -1529,8 +1529,8 @@ void Sidebar::update_presets(Preset::Type preset_type)
if (extruder_variants->size() == 2) {
auto extruders_def = printer_preset.config.def()->get("extruder_type");
auto extruders = printer_preset.config.option<ConfigOptionEnumsGeneric>("extruder_type");
auto nozzle_volumes_def = printer_preset.config.def()->get("nozzle_volume_type");
auto nozzle_volumes = printer_preset.config.option<ConfigOptionEnumsGeneric>("nozzle_volume_type");
auto nozzle_volumes_def = wxGetApp().preset_bundle->project_config.def()->get("nozzle_volume_type");
auto nozzle_volumes = wxGetApp().preset_bundle->project_config.option<ConfigOptionEnumsGeneric>("nozzle_volume_type");
auto update_extruder_variant = [extruders_def, extruders, nozzle_volumes_def, nozzle_volumes, extruder_variants](ComboBox &box, int index) {
box.Clear();
auto extruder = extruders_def->enum_labels[extruders->values[index]];

View File

@ -4160,6 +4160,27 @@ void TabPrinter::build_unregular_pages(bool from_initial_build/* = false*/)
void TabPrinter::on_preset_loaded()
{
// BBS
//update nozzle_volume_type
const Preset& current_printer = m_preset_bundle->printers.get_selected_preset();
const Preset* base_printer = m_preset_bundle->printers.get_preset_base(current_printer);
if (!base_printer)
base_printer = &current_printer;
std::string base_name = base_printer->name;
if (base_name != m_base_preset_name) {
bool use_default_nozzle_volume_type = true;
m_base_preset_name = base_name;
std::string prev_nozzle_volume_type = wxGetApp().app_config->get_nozzle_volume_types_from_config(base_name);
if (!prev_nozzle_volume_type.empty()) {
ConfigOptionEnumsGeneric* nozzle_volume_type_option = m_preset_bundle->project_config.option<ConfigOptionEnumsGeneric>("nozzle_volume_type");
if (nozzle_volume_type_option->deserialize(prev_nozzle_volume_type)) {
use_default_nozzle_volume_type = false;
}
}
if (use_default_nozzle_volume_type) {
m_preset_bundle->project_config.option<ConfigOptionEnumsGeneric>("nozzle_volume_type")->values = current_printer.config.option<ConfigOptionEnumsGeneric>("default_nozzle_volume_type")->values;
}
}
// update the extruders count field
auto *nozzle_diameter = dynamic_cast<const ConfigOptionFloats*>(m_config->option("nozzle_diameter"));
size_t extruders_count = nozzle_diameter->values.size();
@ -5702,11 +5723,19 @@ wxSizer* Tab::compatible_widget_create(wxWindow* parent, PresetDependencies &dep
void TabPrinter::set_extruder_volume_type(int extruder_id, NozzleVolumeType type)
{
auto nozzle_volumes = m_config->option<ConfigOptionEnumsGeneric>("nozzle_volume_type");
auto nozzle_volumes = m_preset_bundle->project_config.option<ConfigOptionEnumsGeneric>("nozzle_volume_type");
assert(nozzle_volumes->values.size() > (size_t)extruder_id);
nozzle_volumes->values[extruder_id] = type;
on_value_change((boost::format("nozzle_volume_type#%1%") % extruder_id).str(), int(type));
update_dirty();
//save to app config
if (!m_base_preset_name.empty()) {
ConfigOptionEnumsGeneric* nozzle_volume_type_option = m_preset_bundle->project_config.option<ConfigOptionEnumsGeneric>("nozzle_volume_type");
std::string nozzle_volume_type_str = nozzle_volume_type_option->serialize();
wxGetApp().app_config->save_nozzle_volume_types_to_config(m_base_preset_name, nozzle_volume_type_str);
}
}
// Return a callback to create a TabPrinter widget to edit bed shape
@ -5856,7 +5885,7 @@ void Tab::update_extruder_variants(int extruder_id, bool reload)
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << extruder_id;
if (m_extruder_switch) {
Preset &printer_preset = wxGetApp().preset_bundle->printers.get_edited_preset();
auto nozzle_volumes = printer_preset.config.option<ConfigOptionEnumsGeneric>("nozzle_volume_type");
auto nozzle_volumes = wxGetApp().preset_bundle->project_config.option<ConfigOptionEnumsGeneric>("nozzle_volume_type");
if (nozzle_volumes->size() == 2) {
auto nozzle_volumes_def = printer_preset.config.def()->get("nozzle_volume_type");
wxString left, right;
@ -5894,7 +5923,7 @@ void Tab::update_extruder_variants(int extruder_id, bool reload)
void Tab::switch_excluder(int extruder_id, bool reload)
{
Preset & printer_preset = wxGetApp().preset_bundle->printers.get_edited_preset();
auto nozzle_volumes = printer_preset.config.option<ConfigOptionEnumsGeneric>("nozzle_volume_type");
auto nozzle_volumes = wxGetApp().preset_bundle->project_config.option<ConfigOptionEnumsGeneric>("nozzle_volume_type");
auto extruders = printer_preset.config.option<ConfigOptionEnumsGeneric>("extruder_type");
std::pair<std::string, std::string> variant_keys[]{
{}, {"print_extruder_id", "print_extruder_variant"}, // Preset::TYPE_PRINT

View File

@ -602,6 +602,7 @@ public:
size_t m_initial_extruders_count;
size_t m_sys_extruders_count;
size_t m_cache_extruder_count = 0;
std::string m_base_preset_name;
PrinterTechnology m_printer_technology = ptFFF;