From 6621fd0e20bce4c32788a86a6fde018f3a7f41ef Mon Sep 17 00:00:00 2001 From: Mack Date: Tue, 18 Feb 2025 22:03:25 +0800 Subject: [PATCH] ENH:FilamentMapDialog add filament type jira: nojira Change-Id: I08a3c037ffa6227602e71b97697a1bc61e3d5050 --- src/slic3r/GUI/DragDropPanel.cpp | 66 +++++++++++++++++++++------- src/slic3r/GUI/DragDropPanel.hpp | 9 ++-- src/slic3r/GUI/FilamentMapDialog.cpp | 7 ++- src/slic3r/GUI/FilamentMapDialog.hpp | 2 + src/slic3r/GUI/FilamentMapPanel.cpp | 16 ++++--- src/slic3r/GUI/FilamentMapPanel.hpp | 3 +- src/slic3r/GUI/GCodeViewer.cpp | 2 +- src/slic3r/GUI/Plater.cpp | 5 +++ 8 files changed, 79 insertions(+), 31 deletions(-) diff --git a/src/slic3r/GUI/DragDropPanel.cpp b/src/slic3r/GUI/DragDropPanel.cpp index db11adbc1..789f34886 100644 --- a/src/slic3r/GUI/DragDropPanel.cpp +++ b/src/slic3r/GUI/DragDropPanel.cpp @@ -8,6 +8,7 @@ struct CustomData { int filament_id; unsigned char r, g, b, a; + std::string type; }; @@ -35,12 +36,13 @@ wxColor Hex2Color(const std::string& str) class ColorDataObject : public wxCustomDataObject { public: - ColorDataObject(const wxColour &color = *wxBLACK, int filament_id = 0) + ColorDataObject(const wxColour &color = *wxBLACK, int filament_id = 0, const std::string &type = "PLA") : wxCustomDataObject(wxDataFormat("application/customize_format")) { std::memset(&m_data, 0, sizeof(m_data)); set_custom_data_filament_id(filament_id); set_custom_data_color(color); + set_custom_data_type(type); } wxColour GetColor() const { return wxColor(m_data.r, m_data.g, m_data.b, m_data.a); } @@ -49,6 +51,13 @@ public: int GetFilament() const { return m_data.filament_id; } void SetFilament(int label) { set_custom_data_filament_id(label); } + std::string GetType() const { return m_data.type; } + void SetType(const std::string &type) { set_custom_data_type(type); } + + void set_custom_data_type(const std::string& type) { + m_data.type = type; + } + void set_custom_data_filament_id(int filament_id) { m_data.filament_id = filament_id; } @@ -81,8 +90,8 @@ private: /////////////// ColorPanel start //////////////////////// // The UI panel of drag item -ColorPanel::ColorPanel(DragDropPanel *parent, const wxColour &color, int filament_id) - : wxPanel(parent, wxID_ANY, wxDefaultPosition, wxSize(32, 40), wxBORDER_NONE), m_parent(parent), m_color(color), m_filament_id(filament_id) +ColorPanel::ColorPanel(DragDropPanel *parent, const wxColour &color, int filament_id, const std::string &type) + : wxPanel(parent, wxID_ANY, wxDefaultPosition, wxSize(32, 40), wxBORDER_NONE), m_parent(parent), m_color(color), m_filament_id(filament_id), m_type(type) { Bind(wxEVT_LEFT_DOWN, &ColorPanel::OnLeftDown, this); Bind(wxEVT_LEFT_UP, &ColorPanel::OnLeftUp, this); @@ -92,7 +101,7 @@ ColorPanel::ColorPanel(DragDropPanel *parent, const wxColour &color, int filamen void ColorPanel::OnLeftDown(wxMouseEvent &event) { m_parent->set_is_draging(true); - m_parent->DoDragDrop(this, GetColor(), GetFilamentId()); + m_parent->DoDragDrop(this, GetColor(), GetType(), GetFilamentId()); } void ColorPanel::OnLeftUp(wxMouseEvent &event) { m_parent->set_is_draging(false); } @@ -101,16 +110,38 @@ void ColorPanel::OnPaint(wxPaintEvent &event) { wxPaintDC dc(this); wxSize size = GetSize(); + // If it matches the parent's width, it will not be displayed completely + int svg_size = size.GetWidth() - FromDIP(3); + int type_label_height = FromDIP(10); + wxString type_label(m_type); + int type_label_margin = FromDIP(6); + std::string replace_color = m_color.GetAsString(wxC2S_HTML_SYNTAX).ToStdString(); std::string svg_name = "outlined_rect"; if (replace_color == "#FFFFFF00") { svg_name = "outlined_rect_transparent"; } - wxBitmap bmp = ScalableBitmap(this, svg_name, 35, false, false, false, { replace_color }).bmp(); - dc.DrawBitmap(bmp, wxPoint(0,0)); + wxBitmap bmp = ScalableBitmap(this, svg_name, svg_size, false, false, false, { replace_color }).bmp(); + // ScalableBitmap is not drawn at position (0, 0) by default, why? + dc.DrawBitmap(bmp, wxPoint(-FromDIP(3), -FromDIP(3))); + + //dc.SetPen(wxPen(*wxBLACK, 1)); + //dc.DrawRectangle(0, 0, FromDIP(25), FromDIP(25)); + wxString label = wxString::Format(wxT("%d"), m_filament_id); dc.SetTextForeground(m_color.GetLuminance() < 0.51 ? *wxWHITE : *wxBLACK); // set text color - dc.DrawLabel(label, wxRect(2, -3, size.GetWidth(), size.GetHeight()), wxALIGN_CENTER); + dc.DrawLabel(label, wxRect(0, 0, svg_size, svg_size), wxALIGN_CENTER); + + dc.SetTextForeground(*wxBLACK); + if (type_label.length() > 4) { + // text is too long + wxString first = type_label.Mid(0, 4); + wxString rest = type_label.Mid(4); + dc.DrawLabel(first, wxRect(0, svg_size + type_label_margin, svg_size, type_label_height), wxALIGN_CENTER); + dc.DrawLabel(rest, wxRect(0, svg_size + type_label_height + type_label_margin, svg_size, type_label_height), wxALIGN_CENTER); + }else { + dc.DrawLabel(type_label, wxRect(0, svg_size + type_label_margin, svg_size, type_label_height), wxALIGN_CENTER); + } } /////////////// ColorPanel end //////////////////////// @@ -119,10 +150,11 @@ void ColorPanel::OnPaint(wxPaintEvent &event) class ColorDropSource : public wxDropSource { public: - ColorDropSource(wxPanel *parent, wxPanel *color_block, const wxColour &color, int filament_id) : wxDropSource(parent) + ColorDropSource(wxPanel *parent, wxPanel *color_block, const wxColour &color, const std::string& type, int filament_id) : wxDropSource(parent) { m_data.SetColor(color); m_data.SetFilament(filament_id); + m_data.SetType(type); SetData(m_data); // Set drag source data } @@ -157,7 +189,7 @@ wxDragResult ColorDropTarget::OnData(wxCoord x, wxCoord y, wxDragResult def) return wxDragNone; ColorDataObject *dataObject = dynamic_cast(GetDataObject()); - m_panel->AddColorBlock(m_data->GetColor(), m_data->GetFilament()); + m_panel->AddColorBlock(m_data->GetColor(), m_data->GetType(), m_data->GetFilament()); return wxDragCopy; } @@ -184,10 +216,10 @@ DragDropPanel::DragDropPanel(wxWindow *parent, const wxString &label, bool is_au title_sizer->Add(static_text, 0, wxALIGN_CENTER | wxALL, FromDIP(5)); m_sizer->Add(title_panel, 0, wxEXPAND); - m_sizer->AddSpacer(20); + m_sizer->AddSpacer(10); - m_grid_item_sizer = new wxGridSizer(0, 6, FromDIP(4),FromDIP(4)); // row = 0, col = 3, 10 10 is space - m_sizer->Add(m_grid_item_sizer, 1, wxEXPAND); + m_grid_item_sizer = new wxGridSizer(0, 6, FromDIP(8), FromDIP(8)); // row = 0, col = 3, 10 10 is space + m_sizer->Add(m_grid_item_sizer, 1, wxEXPAND | wxALL, FromDIP(8)); // set droptarget auto drop_target = new ColorDropTarget(this); @@ -198,10 +230,10 @@ DragDropPanel::DragDropPanel(wxWindow *parent, const wxString &label, bool is_au Fit(); } -void DragDropPanel::AddColorBlock(const wxColour &color, int filament_id, bool update_ui) +void DragDropPanel::AddColorBlock(const wxColour &color, const std::string &type, int filament_id, bool update_ui) { - ColorPanel *panel = new ColorPanel(this, color, filament_id); - panel->SetMinSize(wxSize(FromDIP(32), FromDIP(40))); + ColorPanel *panel = new ColorPanel(this, color, filament_id, type); + panel->SetMinSize(wxSize(FromDIP(30), FromDIP(60))); m_grid_item_sizer->Add(panel, 0); m_filament_blocks.push_back(panel); if (update_ui) { @@ -222,12 +254,12 @@ void DragDropPanel::RemoveColorBlock(ColorPanel *panel, bool update_ui) } } -void DragDropPanel::DoDragDrop(ColorPanel *panel, const wxColour &color, int filament_id) +void DragDropPanel::DoDragDrop(ColorPanel *panel, const wxColour &color, const std::string &type, int filament_id) { if (m_is_auto) return; - ColorDropSource source(this, panel, color, filament_id); + ColorDropSource source(this, panel, color, type, filament_id); if (source.DoDragDrop(wxDrag_CopyOnly) == wxDragResult::wxDragCopy) { this->RemoveColorBlock(panel); } diff --git a/src/slic3r/GUI/DragDropPanel.hpp b/src/slic3r/GUI/DragDropPanel.hpp index 51e41e04b..7a10f4084 100644 --- a/src/slic3r/GUI/DragDropPanel.hpp +++ b/src/slic3r/GUI/DragDropPanel.hpp @@ -20,9 +20,9 @@ class DragDropPanel : public wxPanel public: DragDropPanel(wxWindow *parent, const wxString &label, bool is_auto); - void AddColorBlock(const wxColour &color, int filament_id, bool update_ui = true); + void AddColorBlock(const wxColour &color, const std::string &type, int filament_id, bool update_ui = true); void RemoveColorBlock(ColorPanel *panel, bool update_ui = true); - void DoDragDrop(ColorPanel *panel, const wxColour &color, int filament_id); + void DoDragDrop(ColorPanel *panel, const wxColour &color, const std::string &type, int filament_id); std::vector GetAllFilaments() const; @@ -46,10 +46,11 @@ private: class ColorPanel : public wxPanel { public: - ColorPanel(DragDropPanel *parent, const wxColour &color, int filament_id); + ColorPanel(DragDropPanel *parent, const wxColour &color, int filament_id, const std::string& type); wxColour GetColor() const { return m_color; } int GetFilamentId() const { return m_filament_id; } + std::string GetType() const { return m_type; } private: void OnLeftDown(wxMouseEvent &event); @@ -58,7 +59,9 @@ private: DragDropPanel *m_parent; wxColor m_color; + std::string m_type; int m_filament_id; + }; }} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/FilamentMapDialog.cpp b/src/slic3r/GUI/FilamentMapDialog.cpp index 94fab96c5..e36e2d0fa 100644 --- a/src/slic3r/GUI/FilamentMapDialog.cpp +++ b/src/slic3r/GUI/FilamentMapDialog.cpp @@ -47,6 +47,7 @@ bool try_pop_up_before_slice(bool is_slice_all, Plater* plater_ref, PartPlate* p bool sync_plate = true; std::vector filament_colors = full_config.option("filament_colour")->values; + std::vector filament_types = full_config.option("filament_type")->values; FilamentMapMode applied_mode = get_applied_map_mode(full_config, plater_ref,partplate_ref, sync_plate); std::vector applied_maps = get_applied_map(full_config, plater_ref, partplate_ref, sync_plate); applied_maps.resize(filament_colors.size(), 1); @@ -65,6 +66,7 @@ bool try_pop_up_before_slice(bool is_slice_all, Plater* plater_ref, PartPlate* p FilamentMapDialog map_dlg(plater_ref, filament_colors, + filament_types, applied_maps, filament_lists, applied_mode, @@ -126,13 +128,14 @@ static const StateColor btn_text_white(std::pair(wxColour(38, 46, FilamentMapDialog::FilamentMapDialog(wxWindow *parent, const std::vector &filament_color, + const std::vector &filament_type, const std::vector &filament_map, const std::vector &filaments, const FilamentMapMode mode, bool machine_synced, bool show_default, bool with_checkbox) - : wxDialog(parent, wxID_ANY, _L("Filament grouping"), wxDefaultPosition, wxDefaultSize,wxDEFAULT_DIALOG_STYLE), m_filament_color(filament_color), m_filament_map(filament_map) + : wxDialog(parent, wxID_ANY, _L("Filament grouping"), wxDefaultPosition, wxDefaultSize,wxDEFAULT_DIALOG_STYLE), m_filament_color(filament_color), m_filament_type(filament_type), m_filament_map(filament_map) { SetBackgroundColour(*wxWHITE); @@ -174,7 +177,7 @@ FilamentMapDialog::FilamentMapDialog(wxWindow *parent, mode == fmmAutoForMatch && !machine_synced ? fmmAutoForFlush : mode; - m_manual_map_panel = new FilamentMapManualPanel(this, m_filament_color, filaments, filament_map); + m_manual_map_panel = new FilamentMapManualPanel(this, m_filament_color, m_filament_type, filaments, filament_map); m_auto_map_panel = new FilamentMapAutoPanel(this, default_auto_mode, machine_synced); if (show_default) m_default_map_panel = new FilamentMapDefaultPanel(this); diff --git a/src/slic3r/GUI/FilamentMapDialog.hpp b/src/slic3r/GUI/FilamentMapDialog.hpp index da9b89e99..bafc6ab3f 100644 --- a/src/slic3r/GUI/FilamentMapDialog.hpp +++ b/src/slic3r/GUI/FilamentMapDialog.hpp @@ -40,6 +40,7 @@ class FilamentMapDialog : public wxDialog public: FilamentMapDialog(wxWindow *parent, const std::vector& filament_color, + const std::vector& filament_type, const std::vector &filament_map, const std::vector &filaments, const FilamentMapMode mode, @@ -83,6 +84,7 @@ private: private: std::vector m_filament_map; std::vector m_filament_color; + std::vector m_filament_type; }; }} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/FilamentMapPanel.cpp b/src/slic3r/GUI/FilamentMapPanel.cpp index 1ab65b681..7f94d6b39 100644 --- a/src/slic3r/GUI/FilamentMapPanel.cpp +++ b/src/slic3r/GUI/FilamentMapPanel.cpp @@ -18,9 +18,10 @@ static const wxColour TextDisableColor = wxColour("#CECECE"); FilamentMapManualPanel::FilamentMapManualPanel(wxWindow *parent, const std::vector &color, + const std::vector &type, const std::vector &filament_list, const std::vector &filament_map) - : wxPanel(parent), m_filament_map(filament_map), m_filament_color(color), m_filament_list(filament_list) + : wxPanel(parent), m_filament_map(filament_map), m_filament_color(color), m_filament_type(type), m_filament_list(filament_list) { SetBackgroundColour(BgNormalColor); @@ -40,15 +41,16 @@ FilamentMapManualPanel::FilamentMapManualPanel(wxWindow *p auto iter = std::find(m_filament_list.begin(), m_filament_list.end(), idx + 1); if (iter == m_filament_list.end()) continue; wxColor color = Hex2Color(m_filament_color[idx]); + std::string type = m_filament_type[idx]; if (m_filament_map[idx] == 1) { - m_left_panel->AddColorBlock(color, idx + 1); + m_left_panel->AddColorBlock(color, type, idx + 1); } else { assert(m_filament_map[idx] == 2); - m_right_panel->AddColorBlock(color, idx + 1); + m_right_panel->AddColorBlock(color, type, idx + 1); } } - m_left_panel->SetMinSize({ FromDIP(220),-1 }); - m_right_panel->SetMinSize({ FromDIP(220),-1 }); + m_left_panel->SetMinSize({ FromDIP(260),-1 }); + m_right_panel->SetMinSize({ FromDIP(260),-1 }); drag_sizer->AddStretchSpacer(); drag_sizer->Add(m_left_panel, 1, wxALIGN_CENTER | wxEXPAND); @@ -80,12 +82,12 @@ void FilamentMapManualPanel::OnSwitchFilament(wxCommandEvent &) auto right_blocks = m_right_panel->get_filament_blocks(); for (auto &block : left_blocks) { - m_right_panel->AddColorBlock(block->GetColor(), block->GetFilamentId(), false); + m_right_panel->AddColorBlock(block->GetColor(), block->GetType(), block->GetFilamentId(), false); m_left_panel->RemoveColorBlock(block, false); } for (auto &block : right_blocks) { - m_left_panel->AddColorBlock(block->GetColor(), block->GetFilamentId(), false); + m_left_panel->AddColorBlock(block->GetColor(), block->GetType(), block->GetFilamentId(), false); m_right_panel->RemoveColorBlock(block, false); } this->GetParent()->Layout(); diff --git a/src/slic3r/GUI/FilamentMapPanel.hpp b/src/slic3r/GUI/FilamentMapPanel.hpp index 5180a84df..d2b6ea21d 100644 --- a/src/slic3r/GUI/FilamentMapPanel.hpp +++ b/src/slic3r/GUI/FilamentMapPanel.hpp @@ -11,7 +11,7 @@ namespace Slic3r { namespace GUI { class FilamentMapManualPanel : public wxPanel { public: - FilamentMapManualPanel(wxWindow *parent, const std::vector &color, const std::vector &filament_list, const std::vector &filament_map); + FilamentMapManualPanel(wxWindow *parent, const std::vector &color, const std::vector &type, const std::vector &filament_list, const std::vector &filament_map); std::vector GetFilamentMaps() const { return m_filament_map; } std::vector GetLeftFilaments() const { return m_left_panel->GetAllFilaments(); } @@ -33,6 +33,7 @@ private: std::vector m_filament_map; std::vector m_filament_list; std::vector m_filament_color; + std::vector m_filament_type; }; class FilamentMapBtnPanel : public wxPanel diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index aa417dafc..955d7e5ce 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -4735,7 +4735,7 @@ void GCodeViewer::render_legend_color_arr_recommen(float window_padding) filament_group_item_align_width = max(filament_group_item_align_width, text_size.x); text_line_height = max(text_line_height, text_size.y); } - container_height += (three_words_width * 1.5f + text_line_height ); + container_height += (three_words_width * 1.2f + text_line_height ); } container_height += 2 * line_height; ams_item_height = std::max(ams_item_height, container_height); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 56ff51e2e..df0b74440 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -14929,9 +14929,12 @@ std::vector> Plater::get_extruders_colors() bool Plater::update_filament_colors_in_full_config() { DynamicPrintConfig& project_config = wxGetApp().preset_bundle->project_config; + const auto& full_config = wxGetApp().preset_bundle->full_config(); ConfigOptionStrings* color_opt = project_config.option("filament_colour"); + const ConfigOptionStrings* type_opt = full_config.option("filament_type"); p->config->option("filament_colour")->values = color_opt->values; + p->config->option("filament_type")->values = type_opt->values; return true; } @@ -16160,6 +16163,7 @@ void Plater::open_filament_map_setting_dialog(wxCommandEvent &evt) const auto& project_config = wxGetApp().preset_bundle->project_config; auto filament_colors = config()->option("filament_colour")->values; + auto filament_types = config()->option("filament_type")->values; auto plate_filament_maps = curr_plate->get_real_filament_maps(project_config); auto plate_filament_map_mode = curr_plate->get_filament_map_mode(); @@ -16168,6 +16172,7 @@ void Plater::open_filament_map_setting_dialog(wxCommandEvent &evt) FilamentMapDialog filament_dlg(this, filament_colors, + filament_types, plate_filament_maps, curr_plate->get_extruders(true), plate_filament_map_mode,