mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-11-02 20:51:23 -07:00 
			
		
		
		
	Added ConfigManipulation to universal config manipulation (updating).
This commit is contained in:
		
							parent
							
								
									dac301e3b6
								
							
						
					
					
						commit
						463783e092
					
				
					 4 changed files with 338 additions and 2 deletions
				
			
		| 
						 | 
				
			
			@ -9,6 +9,7 @@
 | 
			
		|||
#include <boost/algorithm/string.hpp>
 | 
			
		||||
 | 
			
		||||
#include "I18N.hpp"
 | 
			
		||||
#include "Tab.hpp"
 | 
			
		||||
 | 
			
		||||
#include <wx/wupdlock.h>
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -117,7 +118,8 @@ bool ObjectSettings::update_settings_list()
 | 
			
		|||
            optgroup->label_width = 15;
 | 
			
		||||
            optgroup->sidetext_width = 5.5;
 | 
			
		||||
 | 
			
		||||
            optgroup->m_on_change = [](const t_config_option_key& opt_id, const boost::any& value) {
 | 
			
		||||
            optgroup->m_on_change = [this, config](const t_config_option_key& opt_id, const boost::any& value) {
 | 
			
		||||
                                    this->update_config_values(config);
 | 
			
		||||
                                    wxGetApp().obj_list()->changed_object(); };
 | 
			
		||||
 | 
			
		||||
            // call back for rescaling of the extracolumn control
 | 
			
		||||
| 
						 | 
				
			
			@ -152,8 +154,10 @@ bool ObjectSettings::update_settings_list()
 | 
			
		|||
            m_og_settings.push_back(optgroup);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (!categories.empty())
 | 
			
		||||
        if (!categories.empty()) {
 | 
			
		||||
            objects_model->UpdateSettingsDigest(item, categories);
 | 
			
		||||
            update_config_values(config);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
| 
						 | 
				
			
			@ -164,6 +168,33 @@ bool ObjectSettings::update_settings_list()
 | 
			
		|||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ObjectSettings::update_config_values(DynamicPrintConfig*config)
 | 
			
		||||
{
 | 
			
		||||
    auto load_config = [this, config]()
 | 
			
		||||
    {
 | 
			
		||||
        for (auto og : m_og_settings)
 | 
			
		||||
            og->reload_config();
 | 
			
		||||
        update_config_values(config);
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    auto get_field = [this](const t_config_option_key & opt_key)
 | 
			
		||||
    {
 | 
			
		||||
        Field* field = nullptr;
 | 
			
		||||
        for (auto og : m_og_settings) {
 | 
			
		||||
            field = og->get_fieldc(opt_key, -1);
 | 
			
		||||
            if (field != nullptr)
 | 
			
		||||
                return field;
 | 
			
		||||
        }
 | 
			
		||||
        return field;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    ConfigManipulation config_manipulation(parent(), load_config, get_field, nullptr);
 | 
			
		||||
 | 
			
		||||
    wxGetApp().plater()->printer_technology() == ptFFF       ? 
 | 
			
		||||
        config_manipulation.update_print_fff_options(config) :
 | 
			
		||||
        config_manipulation.update_print_sla_options(config) ;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ObjectSettings::UpdateAndShow(const bool show)
 | 
			
		||||
{
 | 
			
		||||
    OG_Settings::UpdateAndShow(show ? update_settings_list() : false);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -28,6 +28,7 @@ public:
 | 
			
		|||
 | 
			
		||||
    virtual wxSizer*    get_sizer();
 | 
			
		||||
    ConfigOptionsGroup* get_og() { return m_og.get(); }
 | 
			
		||||
    wxWindow*           parent() const {return m_parent; }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -46,6 +47,7 @@ public:
 | 
			
		|||
    ~ObjectSettings() {}
 | 
			
		||||
 | 
			
		||||
    bool        update_settings_list();
 | 
			
		||||
    void        update_config_values(DynamicPrintConfig*config);
 | 
			
		||||
    void        UpdateAndShow(const bool show) override;
 | 
			
		||||
    void        msw_rescale();
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3847,5 +3847,275 @@ void TabSLAPrint::update()
 | 
			
		|||
    if (m_update_cnt == 0) wxGetApp().mainframe->on_config_changed(m_config);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
bool ConfigManipulation::is_modified(   DynamicPrintConfig* config,
 | 
			
		||||
                                        DynamicPrintConfig* new_config)
 | 
			
		||||
{
 | 
			
		||||
    bool modified = false;
 | 
			
		||||
    for (auto opt_key : config->diff(*new_config)) {
 | 
			
		||||
        config->set_key_value(opt_key, new_config->option(opt_key)->clone());
 | 
			
		||||
        modified = true;
 | 
			
		||||
    }
 | 
			
		||||
    return modified;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ConfigManipulation::load_new(  DynamicPrintConfig* config,
 | 
			
		||||
                                    DynamicPrintConfig* new_config)
 | 
			
		||||
{
 | 
			
		||||
    if (is_modified(config, new_config))
 | 
			
		||||
        load_config();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ConfigManipulation::update_print_fff_options(DynamicPrintConfig* config)
 | 
			
		||||
{
 | 
			
		||||
    // #ys_FIXME_to_delete
 | 
			
		||||
    //! Temporary workaround for the correct updates of the TextCtrl (like "layer_height"):
 | 
			
		||||
    // KillFocus() for the wxSpinCtrl use CallAfter function. So,
 | 
			
		||||
    // to except the duplicate call of the update() after dialog->ShowModal(),
 | 
			
		||||
    // let check if this process is already started.
 | 
			
		||||
    if (is_msg_dlg_already_exist)
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    // layer_height shouldn't be equal to zero
 | 
			
		||||
    if (config->has("layer_height") && config->opt_float("layer_height") < EPSILON)
 | 
			
		||||
    {
 | 
			
		||||
        const wxString msg_text = _(L("Zero layer height is not valid.\n\nThe layer height will be reset to 0.01."));
 | 
			
		||||
        auto dialog = new wxMessageDialog(parent(), msg_text, _(L("Layer height")), wxICON_WARNING | wxOK);
 | 
			
		||||
        DynamicPrintConfig new_conf = *config;
 | 
			
		||||
        is_msg_dlg_already_exist = true;
 | 
			
		||||
        dialog->ShowModal();
 | 
			
		||||
        new_conf.set_key_value("layer_height", new ConfigOptionFloat(0.01));
 | 
			
		||||
        load_new(config, &new_conf);
 | 
			
		||||
        is_msg_dlg_already_exist = false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (config->has("first_layer_height") && fabs(config->option<ConfigOptionFloatOrPercent>("first_layer_height")->value - 0) < EPSILON)
 | 
			
		||||
    {
 | 
			
		||||
        const wxString msg_text = _(L("Zero first layer height is not valid.\n\nThe first layer height will be reset to 0.01."));
 | 
			
		||||
        auto dialog = new wxMessageDialog(parent(), msg_text, _(L("First layer height")), wxICON_WARNING | wxOK);
 | 
			
		||||
        DynamicPrintConfig new_conf = *config;
 | 
			
		||||
        is_msg_dlg_already_exist = true;
 | 
			
		||||
        dialog->ShowModal();
 | 
			
		||||
        new_conf.set_key_value("first_layer_height", new ConfigOptionFloatOrPercent(0.01, false));
 | 
			
		||||
        load_new(config, &new_conf);
 | 
			
		||||
        is_msg_dlg_already_exist = false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    double fill_density = !config->has("fill_density") ? -1.0 :
 | 
			
		||||
                           config->option<ConfigOptionPercent>("fill_density")->value;
 | 
			
		||||
 | 
			
		||||
    if (config->has("spiral_vase") && config->opt_bool("spiral_vase") &&
 | 
			
		||||
        !(config->opt_int("perimeters") == 1 && config->opt_int("top_solid_layers") == 0 &&
 | 
			
		||||
            fill_density == 0)) {
 | 
			
		||||
        wxString msg_text = _(L("The Spiral Vase mode requires:\n"
 | 
			
		||||
            "- one perimeter\n"
 | 
			
		||||
            "- no top solid layers\n"
 | 
			
		||||
            "- 0% fill density\n"
 | 
			
		||||
            "- no support material\n"
 | 
			
		||||
            "- no ensure_vertical_shell_thickness\n"
 | 
			
		||||
            "\nShall I adjust those settings in order to enable Spiral Vase?"));
 | 
			
		||||
        auto dialog = new wxMessageDialog(parent(), msg_text, _(L("Spiral Vase")), wxICON_WARNING | wxYES | wxNO);
 | 
			
		||||
        DynamicPrintConfig new_conf = *config;
 | 
			
		||||
        if (dialog->ShowModal() == wxID_YES) {
 | 
			
		||||
            new_conf.set_key_value("perimeters", new ConfigOptionInt(1));
 | 
			
		||||
            new_conf.set_key_value("top_solid_layers", new ConfigOptionInt(0));
 | 
			
		||||
            new_conf.set_key_value("fill_density", new ConfigOptionPercent(0));
 | 
			
		||||
            new_conf.set_key_value("support_material", new ConfigOptionBool(false));
 | 
			
		||||
            new_conf.set_key_value("support_material_enforce_layers", new ConfigOptionInt(0));
 | 
			
		||||
            new_conf.set_key_value("ensure_vertical_shell_thickness", new ConfigOptionBool(false));
 | 
			
		||||
            fill_density = 0;
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            new_conf.set_key_value("spiral_vase", new ConfigOptionBool(false));
 | 
			
		||||
        }
 | 
			
		||||
        load_new(config, &new_conf);
 | 
			
		||||
        if (on_value_change)
 | 
			
		||||
            on_value_change("fill_density", fill_density);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (config->opt_bool("wipe_tower") && config->opt_bool("support_material") &&
 | 
			
		||||
        config->opt_float("support_material_contact_distance") > 0. &&
 | 
			
		||||
        (config->opt_int("support_material_extruder") != 0 || config->opt_int("support_material_interface_extruder") != 0)) {
 | 
			
		||||
        wxString msg_text = _(L("The Wipe Tower currently supports the non-soluble supports only\n"
 | 
			
		||||
            "if they are printed with the current extruder without triggering a tool change.\n"
 | 
			
		||||
            "(both support_material_extruder and support_material_interface_extruder need to be set to 0).\n"
 | 
			
		||||
            "\nShall I adjust those settings in order to enable the Wipe Tower?"));
 | 
			
		||||
        auto dialog = new wxMessageDialog(parent(), msg_text, _(L("Wipe Tower")), wxICON_WARNING | wxYES | wxNO);
 | 
			
		||||
        DynamicPrintConfig new_conf = *config;
 | 
			
		||||
        if (dialog->ShowModal() == wxID_YES) {
 | 
			
		||||
            new_conf.set_key_value("support_material_extruder", new ConfigOptionInt(0));
 | 
			
		||||
            new_conf.set_key_value("support_material_interface_extruder", new ConfigOptionInt(0));
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
            new_conf.set_key_value("wipe_tower", new ConfigOptionBool(false));
 | 
			
		||||
        load_new(config, &new_conf);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (config->opt_bool("wipe_tower") && config->opt_bool("support_material") &&
 | 
			
		||||
        config->opt_float("support_material_contact_distance") == 0 &&
 | 
			
		||||
        !config->opt_bool("support_material_synchronize_layers")) {
 | 
			
		||||
        wxString msg_text = _(L("For the Wipe Tower to work with the soluble supports, the support layers\n"
 | 
			
		||||
            "need to be synchronized with the object layers.\n"
 | 
			
		||||
            "\nShall I synchronize support layers in order to enable the Wipe Tower?"));
 | 
			
		||||
        auto dialog = new wxMessageDialog(parent(), msg_text, _(L("Wipe Tower")), wxICON_WARNING | wxYES | wxNO);
 | 
			
		||||
        DynamicPrintConfig new_conf = *config;
 | 
			
		||||
        if (dialog->ShowModal() == wxID_YES) {
 | 
			
		||||
            new_conf.set_key_value("support_material_synchronize_layers", new ConfigOptionBool(true));
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
            new_conf.set_key_value("wipe_tower", new ConfigOptionBool(false));
 | 
			
		||||
        load_new(config, &new_conf);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (config->opt_bool("support_material")) {
 | 
			
		||||
        // Ask only once.
 | 
			
		||||
        if (!support_material_overhangs_queried) {
 | 
			
		||||
            support_material_overhangs_queried = true;
 | 
			
		||||
            if (!config->opt_bool("overhangs")/* != 1*/) {
 | 
			
		||||
                wxString msg_text = _(L("Supports work better, if the following feature is enabled:\n"
 | 
			
		||||
                    "- Detect bridging perimeters\n"
 | 
			
		||||
                    "\nShall I adjust those settings for supports?"));
 | 
			
		||||
                auto dialog = new wxMessageDialog(parent(), msg_text, _(L("Support Generator")), wxICON_WARNING | wxYES | wxNO | wxCANCEL);
 | 
			
		||||
                DynamicPrintConfig new_conf = *config;
 | 
			
		||||
                auto answer = dialog->ShowModal();
 | 
			
		||||
                if (answer == wxID_YES) {
 | 
			
		||||
                    // Enable "detect bridging perimeters".
 | 
			
		||||
                    new_conf.set_key_value("overhangs", new ConfigOptionBool(true));
 | 
			
		||||
                }
 | 
			
		||||
                else if (answer == wxID_NO) {
 | 
			
		||||
                    // Do nothing, leave supports on and "detect bridging perimeters" off.
 | 
			
		||||
                }
 | 
			
		||||
                else if (answer == wxID_CANCEL) {
 | 
			
		||||
                    // Disable supports.
 | 
			
		||||
                    new_conf.set_key_value("support_material", new ConfigOptionBool(false));
 | 
			
		||||
                    support_material_overhangs_queried = false;
 | 
			
		||||
                }
 | 
			
		||||
                load_new(config, &new_conf);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        support_material_overhangs_queried = false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (config->option<ConfigOptionPercent>("fill_density")->value == 100) {
 | 
			
		||||
        auto fill_pattern = config->option<ConfigOptionEnum<InfillPattern>>("fill_pattern")->value;
 | 
			
		||||
        std::string str_fill_pattern = "";
 | 
			
		||||
        t_config_enum_values map_names = config->option<ConfigOptionEnum<InfillPattern>>("fill_pattern")->get_enum_values();
 | 
			
		||||
        for (auto it : map_names) {
 | 
			
		||||
            if (fill_pattern == it.second) {
 | 
			
		||||
                str_fill_pattern = it.first;
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        if (!str_fill_pattern.empty()) {
 | 
			
		||||
            const std::vector<std::string>& external_fill_pattern = config->def()->get("top_fill_pattern")->enum_values;
 | 
			
		||||
            bool correct_100p_fill = false;
 | 
			
		||||
            for (const std::string& fill : external_fill_pattern)
 | 
			
		||||
            {
 | 
			
		||||
                if (str_fill_pattern == fill)
 | 
			
		||||
                    correct_100p_fill = true;
 | 
			
		||||
            }
 | 
			
		||||
            // get fill_pattern name from enum_labels for using this one at dialog_msg
 | 
			
		||||
            str_fill_pattern = _utf8(config->def()->get("fill_pattern")->enum_labels[fill_pattern]);
 | 
			
		||||
            if (!correct_100p_fill) {
 | 
			
		||||
                wxString msg_text = GUI::from_u8((boost::format(_utf8(L("The %1% infill pattern is not supposed to work at 100%% density.\n\n"
 | 
			
		||||
                    "Shall I switch to rectilinear fill pattern?"))) % str_fill_pattern).str());
 | 
			
		||||
                auto dialog = new wxMessageDialog(parent(), msg_text, _(L("Infill")), wxICON_WARNING | wxYES | wxNO);
 | 
			
		||||
                DynamicPrintConfig new_conf = *config;
 | 
			
		||||
                if (dialog->ShowModal() == wxID_YES) {
 | 
			
		||||
                    new_conf.set_key_value("fill_pattern", new ConfigOptionEnum<InfillPattern>(ipRectilinear));
 | 
			
		||||
                    fill_density = 100;
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                    fill_density = wxGetApp().preset_bundle->prints.get_selected_preset().config.option<ConfigOptionPercent>("fill_density")->value;
 | 
			
		||||
                new_conf.set_key_value("fill_density", new ConfigOptionPercent(fill_density));
 | 
			
		||||
                load_new(config, &new_conf);
 | 
			
		||||
                if (on_value_change)
 | 
			
		||||
                    on_value_change("fill_density", fill_density);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool have_perimeters = config->opt_int("perimeters") > 0;
 | 
			
		||||
    for (auto el : { "extra_perimeters", "ensure_vertical_shell_thickness", "thin_walls", "overhangs",
 | 
			
		||||
                    "seam_position", "external_perimeters_first", "external_perimeter_extrusion_width",
 | 
			
		||||
                    "perimeter_speed", "small_perimeter_speed", "external_perimeter_speed" })
 | 
			
		||||
        get_field(el)->toggle(have_perimeters);
 | 
			
		||||
 | 
			
		||||
    bool have_infill = config->option<ConfigOptionPercent>("fill_density")->value > 0;
 | 
			
		||||
    // infill_extruder uses the same logic as in Print::extruders()
 | 
			
		||||
    for (auto el : { "fill_pattern", "infill_every_layers", "infill_only_where_needed",
 | 
			
		||||
                    "solid_infill_every_layers", "solid_infill_below_area", "infill_extruder" })
 | 
			
		||||
        get_field(el)->toggle(have_infill);
 | 
			
		||||
 | 
			
		||||
    bool have_solid_infill = config->opt_int("top_solid_layers") > 0 || config->opt_int("bottom_solid_layers") > 0;
 | 
			
		||||
    // solid_infill_extruder uses the same logic as in Print::extruders()
 | 
			
		||||
    for (auto el : { "top_fill_pattern", "bottom_fill_pattern", "infill_first", "solid_infill_extruder",
 | 
			
		||||
                    "solid_infill_extrusion_width", "solid_infill_speed" })
 | 
			
		||||
        get_field(el)->toggle(have_solid_infill);
 | 
			
		||||
 | 
			
		||||
    for (auto el : { "fill_angle", "bridge_angle", "infill_extrusion_width",
 | 
			
		||||
                    "infill_speed", "bridge_speed" })
 | 
			
		||||
        get_field(el)->toggle(have_infill || have_solid_infill);
 | 
			
		||||
 | 
			
		||||
    get_field("gap_fill_speed")->toggle(have_perimeters && have_infill);
 | 
			
		||||
 | 
			
		||||
    bool have_top_solid_infill = config->opt_int("top_solid_layers") > 0;
 | 
			
		||||
    for (auto el : { "top_infill_extrusion_width", "top_solid_infill_speed" })
 | 
			
		||||
        get_field(el)->toggle(have_top_solid_infill);
 | 
			
		||||
 | 
			
		||||
    bool have_default_acceleration = config->opt_float("default_acceleration") > 0;
 | 
			
		||||
    for (auto el : { "perimeter_acceleration", "infill_acceleration",
 | 
			
		||||
                    "bridge_acceleration", "first_layer_acceleration" })
 | 
			
		||||
        get_field(el)->toggle(have_default_acceleration);
 | 
			
		||||
 | 
			
		||||
    bool have_skirt = config->opt_int("skirts") > 0 || config->opt_float("min_skirt_length") > 0;
 | 
			
		||||
    for (auto el : { "skirt_distance", "skirt_height" })
 | 
			
		||||
        get_field(el)->toggle(have_skirt);
 | 
			
		||||
 | 
			
		||||
    bool have_brim = config->opt_float("brim_width") > 0;
 | 
			
		||||
    // perimeter_extruder uses the same logic as in Print::extruders()
 | 
			
		||||
    get_field("perimeter_extruder")->toggle(have_perimeters || have_brim);
 | 
			
		||||
 | 
			
		||||
    bool have_raft = config->opt_int("raft_layers") > 0;
 | 
			
		||||
    bool have_support_material = config->opt_bool("support_material") || have_raft;
 | 
			
		||||
    bool have_support_material_auto = have_support_material && config->opt_bool("support_material_auto");
 | 
			
		||||
    bool have_support_interface = config->opt_int("support_material_interface_layers") > 0;
 | 
			
		||||
    bool have_support_soluble = have_support_material && config->opt_float("support_material_contact_distance") == 0;
 | 
			
		||||
    for (auto el : { "support_material_pattern", "support_material_with_sheath",
 | 
			
		||||
                    "support_material_spacing", "support_material_angle", "support_material_interface_layers",
 | 
			
		||||
                    "dont_support_bridges", "support_material_extrusion_width", "support_material_contact_distance",
 | 
			
		||||
                    "support_material_xy_spacing" })
 | 
			
		||||
        get_field(el)->toggle(have_support_material);
 | 
			
		||||
    get_field("support_material_threshold")->toggle(have_support_material_auto);
 | 
			
		||||
 | 
			
		||||
    for (auto el : { "support_material_interface_spacing", "support_material_interface_extruder",
 | 
			
		||||
                    "support_material_interface_speed", "support_material_interface_contact_loops" })
 | 
			
		||||
        get_field(el)->toggle(have_support_material && have_support_interface);
 | 
			
		||||
    get_field("support_material_synchronize_layers")->toggle(have_support_soluble);
 | 
			
		||||
 | 
			
		||||
    get_field("perimeter_extrusion_width")->toggle(have_perimeters || have_skirt || have_brim);
 | 
			
		||||
    get_field("support_material_extruder")->toggle(have_support_material || have_skirt);
 | 
			
		||||
    get_field("support_material_speed")->toggle(have_support_material || have_brim || have_skirt);
 | 
			
		||||
 | 
			
		||||
    bool have_sequential_printing = config->opt_bool("complete_objects");
 | 
			
		||||
    for (auto el : { "extruder_clearance_radius", "extruder_clearance_height" })
 | 
			
		||||
        get_field(el)->toggle(have_sequential_printing);
 | 
			
		||||
 | 
			
		||||
    bool have_ooze_prevention = config->opt_bool("ooze_prevention");
 | 
			
		||||
    get_field("standby_temperature_delta")->toggle(have_ooze_prevention);
 | 
			
		||||
 | 
			
		||||
    bool have_wipe_tower = config->opt_bool("wipe_tower");
 | 
			
		||||
    for (auto el : { "wipe_tower_x", "wipe_tower_y", "wipe_tower_width", "wipe_tower_rotation_angle", "wipe_tower_bridging" })
 | 
			
		||||
        get_field(el)->toggle(have_wipe_tower);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ConfigManipulation::update_print_sla_options(DynamicPrintConfig* config)
 | 
			
		||||
{}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
} // GUI
 | 
			
		||||
} // Slic3r
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -443,6 +443,39 @@ public:
 | 
			
		|||
	std::string		get_name() { return m_chosen_name; }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class ConfigManipulation
 | 
			
		||||
{
 | 
			
		||||
    bool                is_msg_dlg_already_exist{ false };
 | 
			
		||||
    bool                support_material_overhangs_queried {false};
 | 
			
		||||
    wxWindow*           msg_parent {nullptr};
 | 
			
		||||
 | 
			
		||||
    std::function<void()>                                       load_config = nullptr;
 | 
			
		||||
    std::function<Field* (const std::string&)>                  get_field = nullptr;
 | 
			
		||||
    std::function<void(const std::string&, const boost::any&)>  on_value_change = nullptr;
 | 
			
		||||
 | 
			
		||||
    wxWindow*           parent() const  { return msg_parent;}
 | 
			
		||||
public:
 | 
			
		||||
    ConfigManipulation( wxWindow* msg_parent, 
 | 
			
		||||
                        std::function<void()> load_config,
 | 
			
		||||
                        std::function<Field*(const std::string&)> get_field,
 | 
			
		||||
                        std::function<void(const std::string&, const boost::any&)>  on_value_change) :
 | 
			
		||||
                        msg_parent(msg_parent), 
 | 
			
		||||
                        load_config(load_config),
 | 
			
		||||
                        get_field(get_field),
 | 
			
		||||
                        on_value_change(on_value_change) {}
 | 
			
		||||
 | 
			
		||||
    ~ConfigManipulation() {
 | 
			
		||||
        load_config = nullptr;
 | 
			
		||||
        get_field = nullptr;
 | 
			
		||||
        on_value_change = nullptr;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool    is_modified(DynamicPrintConfig* config, DynamicPrintConfig* new_config);
 | 
			
		||||
    void    load_new(DynamicPrintConfig* config, DynamicPrintConfig* new_config);
 | 
			
		||||
    void    update_print_fff_options(DynamicPrintConfig* config);
 | 
			
		||||
    void    update_print_sla_options(DynamicPrintConfig* config);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // GUI
 | 
			
		||||
} // Slic3r
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue