diff --git a/lib/Slic3r/GUI/MainFrame.pm b/lib/Slic3r/GUI/MainFrame.pm index 77d7956c9..91f0c57f2 100644 --- a/lib/Slic3r/GUI/MainFrame.pm +++ b/lib/Slic3r/GUI/MainFrame.pm @@ -201,6 +201,8 @@ sub _init_tabpanel { # load initial config my $full_config = wxTheApp->{preset_bundle}->full_config; $self->{plater}->on_config_change($full_config); + #return if $num_extruders is undefined because of SLA printer is selected + return if (!defined $full_config->nozzle_diameter); # ys_FIXME # Show a correct number of filament fields. $self->{plater}->on_extruders_change(int(@{$full_config->nozzle_diameter})); } diff --git a/xs/src/libslic3r/PrintConfig.cpp b/xs/src/libslic3r/PrintConfig.cpp index 3bcd8177d..933feb229 100644 --- a/xs/src/libslic3r/PrintConfig.cpp +++ b/xs/src/libslic3r/PrintConfig.cpp @@ -2149,6 +2149,9 @@ void PrintConfigDef::init_sla_params() def->tooltip = L("Default print profile associated with the current printer profile. " "On selection of the current printer profile, this print profile will be activated."); def->default_value = new ConfigOptionString(); + + def = this->add("sla_material_settings_id", coString); + def->default_value = new ConfigOptionString(""); } void PrintConfigDef::handle_legacy(t_config_option_key &opt_key, std::string &value) diff --git a/xs/src/slic3r/GUI/GUI.cpp b/xs/src/slic3r/GUI/GUI.cpp index b8632d18b..c4851b26c 100644 --- a/xs/src/slic3r/GUI/GUI.cpp +++ b/xs/src/slic3r/GUI/GUI.cpp @@ -127,6 +127,11 @@ std::shared_ptr m_optgroup; double m_brim_width = 0.0; wxButton* g_wiping_dialog_button = nullptr; +// Windows, associated with Print, Filament & Material Tabs accordingly +wxWindow *g_PrintTab = nullptr; +wxWindow *g_FilamentTab = nullptr; +wxWindow *g_MaterialTab = nullptr; + static void init_label_colours() { auto luma = get_colour_approx_luma(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); @@ -502,7 +507,8 @@ void create_preset_tabs(bool no_controller, int event_value_change, int event_pr add_created_tab(new TabPrinter (g_wxTabPanel, no_controller)); for (size_t i = 0; i < g_wxTabPanel->GetPageCount(); ++ i) { Tab *tab = dynamic_cast(g_wxTabPanel->GetPage(i)); - if (! tab || tab->GetName()=="sla_material") + if (! tab || + tab->GetName() == "sla_material")// ys_FIXME don't set event till doesn't exist material_preset combobox on plater continue; tab->set_event_value_change(wxEventType(event_value_change)); tab->set_event_presets_changed(wxEventType(event_presets_changed)); @@ -511,6 +517,9 @@ void create_preset_tabs(bool no_controller, int event_value_change, int event_pr TabIface* get_preset_tab_iface(char *name) { + if (std::strcmp(name, "print") == 0) return new TabIface(dynamic_cast(g_PrintTab)); + if (std::strcmp(name, "filament") == 0) return new TabIface(dynamic_cast(g_FilamentTab)); + if (std::strcmp(name, "material") == 0) return new TabIface(dynamic_cast(g_MaterialTab)); for (size_t i = 0; i < g_wxTabPanel->GetPageCount(); ++ i) { Tab *tab = dynamic_cast(g_wxTabPanel->GetPage(i)); if (! tab) @@ -634,7 +643,24 @@ void add_created_tab(Tab* panel) // Load the currently selected preset into the GUI, update the preset selection box. panel->load_current_preset(); - g_wxTabPanel->AddPage(panel, panel->title()); + + const wxString& tab_name = panel->GetName(); + bool add_panel = true; + if (tab_name == "print") { + g_PrintTab = panel; + add_panel = g_PresetBundle->printers.get_edited_preset().printer_technology() == ptFFF; + } + else if (tab_name == "filament") { + g_FilamentTab = panel; + add_panel = g_PresetBundle->printers.get_edited_preset().printer_technology() == ptFFF; + } + else if (tab_name == "sla_material") { + g_MaterialTab = panel; + add_panel = g_PresetBundle->printers.get_edited_preset().printer_technology() == ptSLA; + } + + if (add_panel) + g_wxTabPanel->AddPage(panel, panel->title()); } void load_current_presets() @@ -675,6 +701,22 @@ PresetBundle* get_preset_bundle() return g_PresetBundle; } +wxNotebook* get_tab_panel() { + return g_wxTabPanel; +} + +wxWindow* get_print_tab() { + return g_PrintTab; +} + +wxWindow* get_filament_tab(){ + return g_FilamentTab; +} + +wxWindow* get_material_tab(){ + return g_MaterialTab; +} + const wxColour& get_label_clr_modified() { return g_color_label_modified; } diff --git a/xs/src/slic3r/GUI/GUI.hpp b/xs/src/slic3r/GUI/GUI.hpp index efb11b7df..0e24811a9 100644 --- a/xs/src/slic3r/GUI/GUI.hpp +++ b/xs/src/slic3r/GUI/GUI.hpp @@ -96,6 +96,7 @@ void set_3DScene(_3DScene *scene); AppConfig* get_app_config(); wxApp* get_app(); PresetBundle* get_preset_bundle(); +wxNotebook* get_tab_panel(); const wxColour& get_label_clr_modified(); const wxColour& get_label_clr_sys(); @@ -107,6 +108,10 @@ void set_label_clr_sys(const wxColour& clr); const wxFont& small_font(); const wxFont& bold_font(); +wxWindow* get_print_tab(); +wxWindow* get_filament_tab(); +wxWindow* get_material_tab(); + extern void add_menus(wxMenuBar *menu, int event_preferences_changed, int event_language_change); // This is called when closing the application, when loading a config file or when starting the config wizard diff --git a/xs/src/slic3r/GUI/PresetBundle.cpp b/xs/src/slic3r/GUI/PresetBundle.cpp index dc40ced3b..2844418fa 100644 --- a/xs/src/slic3r/GUI/PresetBundle.cpp +++ b/xs/src/slic3r/GUI/PresetBundle.cpp @@ -313,19 +313,21 @@ void PresetBundle::load_selections(const AppConfig &config) sla_materials.select_preset_by_name_strict(initial_sla_material_profile_name); printers.select_preset_by_name(initial_printer_profile_name, true); - // Load the names of the other filament profiles selected for a multi-material printer. - auto *nozzle_diameter = dynamic_cast(printers.get_selected_preset().config.option("nozzle_diameter")); - size_t num_extruders = nozzle_diameter->values.size(); - this->filament_presets = { initial_filament_profile_name }; - for (unsigned int i = 1; i < (unsigned int)num_extruders; ++ i) { - char name[64]; - sprintf(name, "filament_%d", i); - if (! config.has("presets", name)) - break; - this->filament_presets.emplace_back(remove_ini_suffix(config.get("presets", name))); + if (printers.get_selected_preset().printer_technology() == ptFFF){ + // Load the names of the other filament profiles selected for a multi-material printer. + auto *nozzle_diameter = dynamic_cast(printers.get_selected_preset().config.option("nozzle_diameter")); + size_t num_extruders = nozzle_diameter->values.size(); + this->filament_presets = { initial_filament_profile_name }; + for (unsigned int i = 1; i < (unsigned int)num_extruders; ++i) { + char name[64]; + sprintf(name, "filament_%d", i); + if (!config.has("presets", name)) + break; + this->filament_presets.emplace_back(remove_ini_suffix(config.get("presets", name))); + } + // Do not define the missing filaments, so that the update_compatible_with_printer() will use the preferred filaments. + this->filament_presets.resize(num_extruders, ""); } - // Do not define the missing filaments, so that the update_compatible_with_printer() will use the preferred filaments. - this->filament_presets.resize(num_extruders, ""); // Update visibility of presets based on their compatibility with the active printer. // Always try to select a compatible print and filament preset to the current printer preset, @@ -523,8 +525,8 @@ DynamicPrintConfig PresetBundle::full_sla_config() const // Collect the "compatible_printers_condition" and "inherits" values over all presets (sla_materials, printers) into a single vector. std::vector compatible_printers_condition; std::vector inherits; - compatible_printers_condition.emplace_back(this->prints.get_edited_preset().compatible_printers_condition()); - inherits .emplace_back(this->prints.get_edited_preset().inherits()); + compatible_printers_condition.emplace_back(this->/*prints*/sla_materials.get_edited_preset().compatible_printers_condition()); + inherits .emplace_back(this->/*prints*/sla_materials.get_edited_preset().inherits()); inherits .emplace_back(this->printers.get_edited_preset().inherits()); // These two value types clash between the print and filament profiles. They should be renamed. diff --git a/xs/src/slic3r/GUI/Tab.cpp b/xs/src/slic3r/GUI/Tab.cpp index a6d24fd75..2f1e87687 100644 --- a/xs/src/slic3r/GUI/Tab.cpp +++ b/xs/src/slic3r/GUI/Tab.cpp @@ -681,6 +681,8 @@ void Tab::on_value_change(const std::string& opt_key, const boost::any& value) // Show/hide the 'purging volumes' button void Tab::update_wiping_button_visibility() { + if (get_preset_bundle()->printers.get_selected_preset().printer_technology() == ptSLA) + return; // ys_FIXME bool wipe_tower_enabled = dynamic_cast( (m_preset_bundle->prints.get_edited_preset().config ).option("wipe_tower"))->value; bool multiple_extruders = dynamic_cast((m_preset_bundle->printers.get_edited_preset().config).option("nozzle_diameter"))->values.size() > 1; bool single_extruder_mm = dynamic_cast( (m_preset_bundle->printers.get_edited_preset().config).option("single_extruder_multi_material"))->value; @@ -700,6 +702,8 @@ void Tab::update_wiping_button_visibility() { // to uddate number of "filament" selection boxes when the number of extruders change. void Tab::on_presets_changed() { + if (get_preset_bundle()->printers.get_selected_preset().printer_technology() == ptSLA) + return; // ys_FIXME if (m_event_presets_changed > 0) { wxCommandEvent event(m_event_presets_changed); event.SetString(m_name); @@ -1007,6 +1011,9 @@ void TabPrint::reload_config(){ void TabPrint::update() { + if (get_preset_bundle()->printers.get_selected_preset().printer_technology() == ptSLA) + return; // ys_FIXME + Freeze(); double fill_density = m_config->option("fill_density")->value; @@ -1363,6 +1370,9 @@ void TabFilament::reload_config(){ void TabFilament::update() { + if (get_preset_bundle()->printers.get_selected_preset().printer_technology() == ptSLA) + return; // ys_FIXME + Freeze(); wxString text = from_u8(PresetHints::cooling_description(m_presets->get_edited_preset())); m_cooling_description_line->SetText(text); @@ -1408,6 +1418,13 @@ void TabPrinter::build() m_presets = &m_preset_bundle->printers; load_initial_data(); + m_printer_technology_old = m_presets->get_selected_preset().printer_technology(); + + if (m_presets->get_selected_preset().printer_technology() == ptSLA){ + build_sla(); + return; + } + m_current_pages = &m_pages; // to avoid redundant memory allocation / deallocation during extruders count changing @@ -1688,8 +1705,6 @@ void TabPrinter::build() if (!m_no_controller) update_serial_ports(); - - build_sla(); } void TabPrinter::build_sla() @@ -1947,6 +1962,7 @@ void TabPrinter::build_extruder_pages() // this gets executed after preset is loaded and before GUI fields are updated void TabPrinter::on_preset_loaded() { + return; // ys_FIXME // update the extruders count field auto *nozzle_diameter = dynamic_cast(m_config->option("nozzle_diameter")); int extruders_count = nozzle_diameter->values.size(); @@ -1956,6 +1972,7 @@ void TabPrinter::on_preset_loaded() } void TabPrinter::update(){ + return; // ys_FIXME Freeze(); bool en; @@ -2060,11 +2077,16 @@ void Tab::load_current_preset() auto preset = m_presets->get_edited_preset(); (preset.is_default || preset.is_system) ? m_btn_delete_preset->Disable() : m_btn_delete_preset->Enable(true); - update(); - // For the printer profile, generate the extruder pages. - on_preset_loaded(); - // Reload preset pages with the new configuration values. - reload_config(); + + if (m_name == "printer" && m_presets->get_edited_preset().printer_technology() == ptSLA) {} // ys_FIXME + else { + update(); + // For the printer profile, generate the extruder pages. + on_preset_loaded(); + // Reload preset pages with the new configuration values. + reload_config(); + } + m_bmp_non_system = m_presets->get_selected_preset_parent() ? &m_bmp_value_unlock : &m_bmp_white_bullet; m_ttg_non_system = m_presets->get_selected_preset_parent() ? &m_ttg_value_unlock : &m_ttg_white_bullet_ns; m_tt_non_system = m_presets->get_selected_preset_parent() ? &m_tt_value_unlock : &m_ttg_white_bullet_ns; @@ -2079,7 +2101,36 @@ void Tab::load_current_preset() // checking out if this Tab exists till this moment if (!checked_tab(this)) return; - update_tab_ui(); + update_tab_ui(); + + // update show/hide tabs + if (m_name == "printer"){ + bool printer_technology = m_presets->get_edited_preset().printer_technology(); + if (printer_technology != static_cast(this)->m_printer_technology_old) + { + wxWindow* del_page = printer_technology == ptFFF ? get_material_tab() : get_print_tab(); + int del_page_id = get_tab_panel()->FindPage(del_page); + if (del_page_id != wxNOT_FOUND) { + if (printer_technology == ptFFF) + { + get_tab_panel()->GetPage(del_page_id)->Show(false); + get_tab_panel()->RemovePage(del_page_id); + get_tab_panel()->InsertPage(del_page_id, get_filament_tab(), static_cast(get_filament_tab())->title()); + get_tab_panel()->InsertPage(del_page_id, get_print_tab(), static_cast(get_print_tab())->title()); + } + else + { + for (int i = 0; i < 2; ++i) { + get_tab_panel()->GetPage(del_page_id)->Show(false); + get_tab_panel()->RemovePage(del_page_id); + } + get_tab_panel()->InsertPage(del_page_id, get_material_tab(), static_cast(get_material_tab())->title()); + } + static_cast(this)->m_printer_technology_old = printer_technology; + } + } + } + on_presets_changed(); if (name() == "print") @@ -2172,7 +2223,8 @@ void Tab::select_preset(std::string preset_name /*= ""*/) if (! canceled) { for (PresetUpdate &pu : updates) { // The preset will be switched to a different, compatible preset, or the '-- default --'. - m_reload_dependent_tabs.emplace_back(pu.name); + if (pu.technology == new_printer_technology) + m_reload_dependent_tabs.emplace_back(pu.name); if (pu.old_preset_dirty) pu.presets->discard_current_changes(); } diff --git a/xs/src/slic3r/GUI/Tab.hpp b/xs/src/slic3r/GUI/Tab.hpp index 4a8f95b98..5605daf48 100644 --- a/xs/src/slic3r/GUI/Tab.hpp +++ b/xs/src/slic3r/GUI/Tab.hpp @@ -330,6 +330,8 @@ public: size_t m_initial_extruders_count; size_t m_sys_extruders_count; + bool m_printer_technology_old = ptFFF; + std::vector *m_current_pages; TabPrinter() {}