diff --git a/src/libslic3r/PresetBundle.cpp b/src/libslic3r/PresetBundle.cpp index 517044825..b02c465ee 100644 --- a/src/libslic3r/PresetBundle.cpp +++ b/src/libslic3r/PresetBundle.cpp @@ -1808,6 +1808,55 @@ void PresetBundle::update_num_filaments(unsigned int to_del_flament_id) update_multi_material_filament_presets(to_del_flament_id); } +std::vector PresetBundle::get_ams_colors() { + std::vector ams_filament_colors; + std::vector ams_filament_presets; + auto is_double_extruder = get_printer_extruder_count() == 2; + for (auto &entry : filament_ams_list) { + auto &ams = entry.second; + auto filament_id = ams.opt_string("filament_id", 0u); + auto filament_color = ams.opt_string("filament_colour", 0u); + auto filament_changed = !ams.has("filament_changed") || ams.opt_bool("filament_changed"); + auto filament_multi_color = ams.opt("filament_multi_colors")->values; + if (filament_id.empty()) { + continue; + } + if (!filament_changed && this->filament_presets.size() > ams_filament_presets.size()) { + ams_filament_presets.push_back(this->filament_presets[ams_filament_presets.size()]); + ams_filament_colors.push_back(filament_color); + ams_multi_color_filment.push_back(filament_multi_color); + continue; + } + auto iter = std::find_if(filaments.begin(), filaments.end(), + [this, &filament_id](auto &f) { return f.is_compatible && filaments.get_preset_base(f) == &f && f.filament_id == filament_id; }); + if (iter == filaments.end()) { + BOOST_LOG_TRIVIAL(warning) << __FUNCTION__ << boost::format(": filament_id %1% not found or system or compatible") % filament_id; + auto filament_type = ams.opt_string("filament_type", 0u); + if (!filament_type.empty()) { + filament_type = "Generic " + filament_type; + iter = std::find_if(filaments.begin(), filaments.end(), + [&filament_type](auto &f) { return f.is_compatible && f.is_system && boost::algorithm::starts_with(f.name, filament_type); }); + } + if (iter == filaments.end()) { + // Prefer old selection + if (ams_filament_presets.size() < this->filament_presets.size()) { + ams_filament_presets.push_back(this->filament_presets[ams_filament_presets.size()]); + ams_filament_colors.push_back(filament_color); + ams_multi_color_filment.push_back(filament_multi_color); + continue; + } + iter = std::find_if(filaments.begin(), filaments.end(), [&filament_type](auto &f) { return f.is_compatible && f.is_system; }); + if (iter == filaments.end()) + continue; + } + filament_id = iter->filament_id; + } + ams_filament_presets.push_back(iter->name); + ams_filament_colors.push_back(filament_color); + } + return ams_filament_colors; +} + unsigned int PresetBundle::sync_ams_list(unsigned int &unknowns, bool use_map, std::map &maps,bool enable_append, MergeFilamentInfo &merge_info) { std::vector ams_filament_presets; diff --git a/src/libslic3r/PresetBundle.hpp b/src/libslic3r/PresetBundle.hpp index b9da7cb81..e20758417 100644 --- a/src/libslic3r/PresetBundle.hpp +++ b/src/libslic3r/PresetBundle.hpp @@ -108,6 +108,7 @@ public: void set_num_filaments(unsigned int n, std::string new_col = ""); void update_num_filaments(unsigned int to_del_flament_id); + std::vector get_ams_colors(); unsigned int sync_ams_list(unsigned int &unknowns, bool use_map, std::map &maps,bool enable_append, MergeFilamentInfo& merge_info); //BBS: check whether this is the only edited filament bool is_the_only_edited_filament(unsigned int filament_index); diff --git a/src/slic3r/GUI/SyncAmsInfoDialog.cpp b/src/slic3r/GUI/SyncAmsInfoDialog.cpp index 489086aaa..d8f281fa9 100644 --- a/src/slic3r/GUI/SyncAmsInfoDialog.cpp +++ b/src/slic3r/GUI/SyncAmsInfoDialog.cpp @@ -129,7 +129,6 @@ void SyncAmsInfoDialog::updata_ui_data_after_connected_printer() { if (!m_input_info.connected_printer) { return; } if (is_dirty_filament()) { return; } - show_sizer(m_sizer_line, true); m_two_thumbnail_panel->Show(true); m_attention_text->Show(); @@ -207,7 +206,6 @@ void SyncAmsInfoDialog::update_select_layout(MachineObject *obj) void SyncAmsInfoDialog::set_default_normal(const ThumbnailData &data) { - update_page_turn_state(false); if (m_cur_input_thumbnail_data.is_valid() && m_left_image_button) { auto & temp_data = m_cur_input_thumbnail_data; wxImage image(temp_data.width, temp_data.height); @@ -245,13 +243,9 @@ void SyncAmsInfoDialog::set_default_normal(const ThumbnailData &data) //m_used_colors_tip_text->SetLabel(" (" + std::to_string(extruders.size()) + " " + _L("colors used") + ")"); } } - // disable pei bed - DeviceManager *dev_manager = Slic3r::GUI::wxGetApp().getDeviceManager(); - if (!dev_manager) - return; - MachineObject *obj_ = dev_manager->get_selected_machine(); - wxSize screenSize = wxGetDisplaySize(); - auto dialogSize = this->GetSize(); + if (m_map_mode == MapModeEnum::ColorMap) { + m_back_cur_colors_in_thumbnail = m_cur_colors_in_thumbnail; + } } bool SyncAmsInfoDialog::is_must_finish_slice_then_connected_printer() { @@ -340,10 +334,10 @@ wxBoxSizer *SyncAmsInfoDialog::create_sizer_thumbnail(wxButton *image_button, bo } else { wxBoxSizer *text_sizer = new wxBoxSizer(wxHORIZONTAL); - auto sync_text = new wxStaticText(image_button->GetParent(), wxID_ANY, _L("After mapping")); - sync_text->SetForegroundColour(wxColour(107, 107, 107, 100)); - text_sizer->Add(sync_text, 0, wxALIGN_CENTER | wxALL, 0); - sizer_thumbnail->Add(sync_text, FromDIP(0), wxALIGN_CENTER | wxALL, FromDIP(4)); + m_after_map_text = new wxStaticText(image_button->GetParent(), wxID_ANY, _L("After mapping")); + m_after_map_text->SetForegroundColour(wxColour(107, 107, 107, 100)); + text_sizer->Add(m_after_map_text, 0, wxALIGN_CENTER | wxALL, 0); + sizer_thumbnail->Add(m_after_map_text, FromDIP(0), wxALIGN_CENTER | wxALL, FromDIP(4)); } sizer_thumbnail->Add(image_button, 0, wxALIGN_CENTER, 0); return sizer_thumbnail; @@ -355,13 +349,7 @@ void SyncAmsInfoDialog::update_when_change_plate(int idx) { } m_specify_plate_idx = idx; - reset_and_sync_ams_list(); - m_cur_input_thumbnail_data = m_plater->get_partplate_list().get_plate(m_specify_plate_idx)->thumbnail_data; - clone_thumbnail_data(); - set_default_normal(m_cur_input_thumbnail_data); - - wxCommandEvent empty; - on_selection_changed(empty); + update_thumbnail_data_accord_plate_index(false); // share current map update_swipe_button_state(); Layout(); @@ -374,15 +362,44 @@ void SyncAmsInfoDialog::update_when_change_map_mode(int idx) if (m_map_mode == MapModeEnum::ColorMap) { show_color_panel(true); m_confirm_title->SetLabel(m_undone_str); + m_after_map_text->SetLabel(_L("After mapping")); } else if (m_map_mode == MapModeEnum::Override) { show_color_panel(false); m_confirm_title->Show(); m_confirm_title->SetLabel(m_override_undone_str); + m_after_map_text->SetLabel(_L("After overwriting")); } + update_map_when_change_map_mode(); Layout(); Fit(); } +void SyncAmsInfoDialog::update_map_when_change_map_mode() { + if (m_map_mode == MapModeEnum::ColorMap) { + m_cur_colors_in_thumbnail = m_back_cur_colors_in_thumbnail; + } else if (m_map_mode == MapModeEnum::Override) { + auto ams_colors = wxGetApp().preset_bundle->get_ams_colors(); + for (size_t i = 0; i < m_preview_colors_in_thumbnail.size(); i++) { + if (i < ams_colors.size()) { + auto color_str = ams_colors[i]; + if (color_str.front() == '#') { + color_str = color_str.substr(1); + } + if (color_str.size() == 6) { + color_str += "FF"; + } + auto result = AmsTray::decode_color(color_str); + m_cur_colors_in_thumbnail[i] = result; + } + else { + //todo:give warning + m_cur_colors_in_thumbnail[i] = m_cur_colors_in_thumbnail[0]; + } + } + } + update_thumbnail_data_accord_plate_index(false); +} + void SyncAmsInfoDialog::update_when_change_map_mode(wxCommandEvent &e) { int win_id = e.GetId(); @@ -410,24 +427,11 @@ void SyncAmsInfoDialog::update_panel_status(PageType page) void SyncAmsInfoDialog::show_color_panel(bool flag, bool update_layout) { //show_sizer(m_plate_combox_sizer, flag); - if (m_sizer_line) { - show_sizer(m_sizer_line, flag); - } - m_two_thumbnail_panel->Show(flag); - m_filament_panel->Show(flag); // empty_project m_attention_text->Show(flag); m_tip_text->Show(flag); - m_more_setting_tips->Show(flag); - - if (!flag) { - show_sizer(m_append_color_sizer, false); - show_sizer(m_merge_color_sizer, false); - } - else { - update_more_setting(); - } + show_advanced_settings(flag); m_confirm_title->Show(flag); m_are_you_sure_title->Show(flag); if (flag) { @@ -4000,23 +4004,27 @@ void SyncAmsInfoDialog::reset_and_sync_ams_list() // reset_ams_material();//show "-" } -void SyncAmsInfoDialog::clone_thumbnail_data() +void SyncAmsInfoDialog::clone_thumbnail_data(bool allow_clone_ams_color) { // record preview_colors MaterialHash::iterator iter = m_materialList.begin(); - if (m_preview_colors_in_thumbnail.size() != m_materialList.size()) { m_preview_colors_in_thumbnail.resize(m_materialList.size()); } - while (iter != m_materialList.end()) { - int id = iter->first; - Material * item = iter->second; - auto m = item->item; - m_preview_colors_in_thumbnail[id] = m->m_material_coloul; - if (item->id < m_cur_colors_in_thumbnail.size()) { - m_cur_colors_in_thumbnail[item->id] = m->m_ams_coloul; - } else { // exist empty or unrecognized type ams in machine - m_cur_colors_in_thumbnail.resize(item->id + 1); - m_cur_colors_in_thumbnail[item->id] = m->m_ams_coloul; + if (m_preview_colors_in_thumbnail.size() != m_materialList.size()) { + m_preview_colors_in_thumbnail.resize(m_materialList.size()); + } + if (allow_clone_ams_color) { + while (iter != m_materialList.end()) { + int id = iter->first; + Material *item = iter->second; + auto m = item->item; + m_preview_colors_in_thumbnail[id] = m->m_material_coloul; + if (item->id < m_cur_colors_in_thumbnail.size()) { + m_cur_colors_in_thumbnail[item->id] = m->m_ams_coloul; + } else { // exist empty or unrecognized type ams in machine + m_cur_colors_in_thumbnail.resize(item->id + 1); + m_cur_colors_in_thumbnail[item->id] = m->m_ams_coloul; + } + iter++; } - iter++; } // copy data auto &data = m_cur_input_thumbnail_data; @@ -4125,16 +4133,44 @@ void SyncAmsInfoDialog::final_deal_edge_pixels_data(ThumbnailData &data) void SyncAmsInfoDialog::updata_thumbnail_data_after_connected_printer() { updata_ui_data_after_connected_printer(); + update_thumbnail_data_accord_plate_index(true); +} + +void SyncAmsInfoDialog::show_advanced_settings(bool flag) { + m_more_setting_tips->Show(flag); + if (!flag) { + show_sizer(m_append_color_sizer, false); + show_sizer(m_merge_color_sizer, false); + } else { + update_more_setting(); + } +} + +void SyncAmsInfoDialog::show_ams_controls(bool flag) +{ + m_filament_panel->Show(flag); + m_attention_text->Show(flag); +} + +void SyncAmsInfoDialog::update_thumbnail_data_accord_plate_index(bool allow_clone_ams_color) +{ + if (m_map_mode == MapModeEnum::Override) { + show_ams_controls(false); + show_advanced_settings(false); + } else if (m_map_mode == MapModeEnum::ColorMap) { + show_ams_controls(true); + show_advanced_settings(true); + } // change thumbnail_data ThumbnailData &input_data = m_specify_plate_idx == -1 ? m_plater->get_partplate_list().get_curr_plate()->thumbnail_data : m_plater->get_partplate_list().get_plate(m_specify_plate_idx)->thumbnail_data; ThumbnailData &no_light_data = m_specify_plate_idx == -1 ? m_plater->get_partplate_list().get_curr_plate()->no_light_thumbnail_data : m_plater->get_partplate_list().get_plate(m_specify_plate_idx)->no_light_thumbnail_data; if (input_data.width == 0 || input_data.height == 0 || no_light_data.width == 0 || no_light_data.height == 0) { wxGetApp().plater()->update_all_plate_thumbnails(false); } - unify_deal_thumbnail_data(input_data, no_light_data); + unify_deal_thumbnail_data(input_data, no_light_data, allow_clone_ams_color); } -void SyncAmsInfoDialog::unify_deal_thumbnail_data(ThumbnailData &input_data, ThumbnailData &no_light_data) +void SyncAmsInfoDialog::unify_deal_thumbnail_data(ThumbnailData &input_data, ThumbnailData &no_light_data, bool allow_clone_ams_color) { if (input_data.width == 0 || input_data.height == 0 || no_light_data.width == 0 || no_light_data.height == 0) { BOOST_LOG_TRIVIAL(error) << "SyncAmsInfoDialog::no_light_data is empty,error"; @@ -4142,7 +4178,7 @@ void SyncAmsInfoDialog::unify_deal_thumbnail_data(ThumbnailData &input_data, Thu } m_cur_input_thumbnail_data = input_data; m_cur_no_light_thumbnail_data = no_light_data; - clone_thumbnail_data(); + clone_thumbnail_data(allow_clone_ams_color); MaterialHash::iterator iter = m_materialList.begin(); bool is_connect_printer = true; while (iter != m_materialList.end()) { @@ -4223,25 +4259,6 @@ void SyncAmsInfoDialog::change_default_normal(int old_filament_id, wxColour temp } } -void SyncAmsInfoDialog::update_page_turn_state(bool show) -{ - /* m_bitmap_last_plate->Show(show); - m_bitmap_next_plate->Show(show); - - if (show) { - if (m_print_plate_idx <= 0) { m_bitmap_last_plate->Hide(); } - else { m_bitmap_last_plate->Show(); } - - if ((m_print_plate_idx + 1) >= m_print_plate_total) { m_bitmap_next_plate->Hide(); } - else { m_bitmap_next_plate->Show(); } - - if (m_print_plate_total == 1) { - m_bitmap_last_plate->Show(false); - m_bitmap_next_plate->Show(false); - } - }*/ -} - void SyncAmsInfoDialog::sys_color_changed() { if (wxGetApp().dark_mode()) { @@ -4254,8 +4271,6 @@ void SyncAmsInfoDialog::sys_color_changed() m_rename_button->Refresh(); } - - wxString SyncAmsInfoDialog::format_bed_name(std::string plate_name) { wxString name; diff --git a/src/slic3r/GUI/SyncAmsInfoDialog.hpp b/src/slic3r/GUI/SyncAmsInfoDialog.hpp index 370579c1a..926bd895c 100644 --- a/src/slic3r/GUI/SyncAmsInfoDialog.hpp +++ b/src/slic3r/GUI/SyncAmsInfoDialog.hpp @@ -124,6 +124,7 @@ protected: ThumbnailData m_preview_thumbnail_data; // when ams map change std::vector m_preview_colors_in_thumbnail; std::vector m_cur_colors_in_thumbnail; + std::vector m_back_cur_colors_in_thumbnail; std::vector m_edge_pixels; StaticBox * m_two_image_panel{nullptr}; @@ -193,15 +194,16 @@ public: void on_set_finish_mapping(wxCommandEvent &evt); void on_print_job_cancel(wxCommandEvent &evt); void reset_and_sync_ams_list(); - void clone_thumbnail_data(); + void clone_thumbnail_data(bool allow_clone_ams_color); void record_edge_pixels_data(); wxColour adjust_color_for_render(const wxColour &color); void final_deal_edge_pixels_data(ThumbnailData &data); void updata_thumbnail_data_after_connected_printer(); - void unify_deal_thumbnail_data(ThumbnailData &input_data, ThumbnailData &no_light_data); + void show_ams_controls(bool flag); + void show_advanced_settings(bool flag); + void update_thumbnail_data_accord_plate_index(bool allow_clone_ams_color); + void unify_deal_thumbnail_data(ThumbnailData &input_data, ThumbnailData &no_light_data,bool allow_clone_ams_color); void change_default_normal(int old_filament_id, wxColour temp_ams_color); - void set_default_from_sdcard(); - void update_page_turn_state(bool show); void on_timer(wxTimerEvent &event); void on_selection_changed(wxCommandEvent &event); void update_flow_cali_check(MachineObject *obj); @@ -284,6 +286,7 @@ private: wxBoxSizer *create_sizer_thumbnail(wxButton *image_button, bool left); void update_when_change_plate(int); void update_when_change_map_mode(int); + void update_map_when_change_map_mode(); void update_when_change_map_mode(wxCommandEvent &e); void update_panel_status(PageType page); void show_color_panel(bool,bool update_layout = true); @@ -301,6 +304,7 @@ private: Button * m_button_ok = nullptr; Button * m_button_cancel = nullptr; + wxStaticText *m_after_map_text{nullptr}; wxStaticText *m_attention_text{nullptr}; wxStaticText* m_tip_text{nullptr}; //wxStaticText *m_specify_color_cluster_title = nullptr; @@ -320,7 +324,6 @@ private: // wxBoxSizer * m_plate_combox_sizer = nullptr; wxBoxSizer * m_mode_combox_sizer = nullptr; - wxBoxSizer * m_sizer_line = nullptr; //wxStaticText * m_printer_title = nullptr; wxStaticText * m_printer_device_name = nullptr; wxStaticText * m_printer_is_map_title = nullptr;