diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 2963cd7b98..37b8ee3b14 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1085,8 +1085,15 @@ void GLCanvas3D::load_arrange_settings() m_arrange_settings_fff_seq_print.is_seq_print = true; } -PrinterTechnology GLCanvas3D::current_printer_technology() const +int GLCanvas3D::GetHoverId() { + if (m_hover_plate_idxs.size() == 0) { + return -1; } + return m_hover_plate_idxs.front(); + +} + +PrinterTechnology GLCanvas3D::current_printer_technology() const { return m_process->current_printer_technology(); } diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 8beb998384..6e0f8df70b 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -495,6 +495,8 @@ public: CanvasAssembleView = 2, }; + int GetHoverId(); + private: bool m_is_dark = false; wxGLCanvas* m_canvas; diff --git a/src/slic3r/GUI/GUI_Factories.cpp b/src/slic3r/GUI/GUI_Factories.cpp index 8b73aac839..9617302f5b 100644 --- a/src/slic3r/GUI/GUI_Factories.cpp +++ b/src/slic3r/GUI/GUI_Factories.cpp @@ -1381,6 +1381,7 @@ wxMenu* MenuFactory::assemble_multi_selection_menu() wxMenu* MenuFactory::plate_menu() { append_menu_item_locked(&m_plate_menu); + append_menu_item_plate_name(&m_plate_menu); return &m_plate_menu; } @@ -1627,6 +1628,40 @@ void MenuFactory::append_menu_item_fill_bed(wxMenu *menu) menu, wxID_ANY, _L("Fill bed with copies") + dots, _L("Fill the remaining area of bed with copies of the selected object"), [](wxCommandEvent &) { plater()->fill_bed_with_instances(); }, "", nullptr, []() { return plater()->can_increase_instances(); }, m_parent); } +void MenuFactory::append_menu_item_plate_name(wxMenu *menu) +{ + wxString name= _L("Edit plate setitngs"); + // Delete old menu item + const int item_id = menu->FindItem(name); + if (item_id != wxNOT_FOUND) menu->Destroy(item_id); + + PartPlate *plate = plater()->get_partplate_list().get_selected_plate(); + assert(plate); + + auto item = append_menu_item( + menu, wxID_ANY, name, "", + [plate](wxCommandEvent &e) { + int hover_idx =plater()->canvas3D()->GetHoverId(); + if (hover_idx == -1) { + int plate_idx=plater()->GetPlateIndexByRightMenuInLeftUI(); + plater()->select_plate_by_hover_id(plate_idx * PartPlate::GRABBER_COUNT, false, true); + } + else + { + plater()->select_plate_by_hover_id(hover_idx, false, true); + } + }, + "", nullptr, []() { return true; }, m_parent); + + m_parent->Bind( + wxEVT_UPDATE_UI, + [](wxUpdateUIEvent &evt) { + PartPlate *plate = plater()->get_partplate_list().get_selected_plate(); + assert(plate); + plater()->set_current_canvas_as_dirty(); + }, + item->GetId()); +} void MenuFactory::update_object_menu() { diff --git a/src/slic3r/GUI/GUI_Factories.hpp b/src/slic3r/GUI/GUI_Factories.hpp index 9b815c1b7d..31e6ef8c5a 100644 --- a/src/slic3r/GUI/GUI_Factories.hpp +++ b/src/slic3r/GUI/GUI_Factories.hpp @@ -151,6 +151,7 @@ private: void append_menu_item_set_printable(wxMenu* menu); void append_menu_item_locked(wxMenu* menu); void append_menu_item_fill_bed(wxMenu *menu); + void append_menu_item_plate_name(wxMenu *menu); }; }} diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index f55b3ccfce..67306217b4 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -1258,7 +1258,7 @@ void ObjectList::show_context_menu(const bool evt_context_menu) const auto item = GetSelection(); if (item) { - const ItemType type = m_objects_model->GetItemType(item); + const ItemType type = m_objects_model->GetItemType(item); if (!(type & (itPlate | itObject | itVolume | itInstance))) return; @@ -1266,6 +1266,14 @@ void ObjectList::show_context_menu(const bool evt_context_menu) type & itInstance ? plater->instance_menu() : type & itVolume ? plater->part_menu() : printer_technology() == ptFFF ? plater->object_menu() : plater->sla_object_menu(); + plater->SetPlateIndexByRightMenuInLeftUI(-1); + if (type & itPlate) { + int plate_idx = -1; + const ItemType type0 = m_objects_model->GetItemType(item, plate_idx); + if (plate_idx >= 0) { + plater->SetPlateIndexByRightMenuInLeftUI(plate_idx); + } + } } else if (evt_context_menu) menu = plater->default_menu(); diff --git a/src/slic3r/GUI/ObjectDataViewModel.cpp b/src/slic3r/GUI/ObjectDataViewModel.cpp index aead8232d8..1c0acab654 100644 --- a/src/slic3r/GUI/ObjectDataViewModel.cpp +++ b/src/slic3r/GUI/ObjectDataViewModel.cpp @@ -328,7 +328,14 @@ bool ObjectDataViewModelNode::SetValue(const wxVariant& variant, unsigned col) return false; } -void ObjectDataViewModelNode::SetIdx(const int& idx) +void ObjectDataViewModelNode::SetName(const wxString &tempName) +{ + if (m_name != tempName) { + m_name = tempName; + } +} + +void ObjectDataViewModelNode::SetIdx(const int &idx) { m_idx = idx; // update name if this node is instance @@ -447,11 +454,16 @@ wxBitmap& ObjectDataViewModel::GetWarningBitmap(const std::string& warning_icon_ wxDataViewItem ObjectDataViewModel::AddPlate(PartPlate* part_plate, wxString name, bool refresh) { - int plate_idx = part_plate ? part_plate->get_index() : -1; + int plate_idx = part_plate ? part_plate->get_index() : -1; wxString plate_name = name; if (plate_name == "") { - plate_name = _L("Plate"); - plate_name << " " << plate_idx + 1; + plate_name = _L("Plate"); + std::string plate_CustomName = part_plate ? part_plate->get_plate_name() : ""; + if (plate_CustomName.length() > 0) { + plate_name << " " << plate_idx + 1 << " (" << plate_CustomName << ")"; + } else { + plate_name << " " << plate_idx + 1; + } } auto plate_node = new ObjectDataViewModelNode(part_plate, plate_name); @@ -469,7 +481,7 @@ wxDataViewItem ObjectDataViewModel::AddPlate(PartPlate* part_plate, wxString nam if (!is_added) { m_plates.push_back(plate_node); } - + wxDataViewItem plate_item(plate_node); if (refresh) { ItemAdded(wxDataViewItem(nullptr), plate_item); @@ -1241,6 +1253,20 @@ wxDataViewItem ObjectDataViewModel::GetItemByPlateId(int plate_idx) return wxDataViewItem(nullptr); } +void ObjectDataViewModel::SetCurSelectedPlateFullNmae(int plate_idx, const std::string & custom_name) { + for (auto plate : m_plates) { + if (plate->m_plate_idx == plate_idx) { + wxString plate_full_name=_L("Plate"); + if (custom_name.length() > 0) { + plate_full_name << " " << plate_idx + 1 << " (" << custom_name << ")"; + } else { + plate_full_name << " " << plate_idx + 1; + } + plate->SetName(plate_full_name); + } + } +} + wxDataViewItem ObjectDataViewModel::GetItemByVolumeId(int obj_idx, int volume_idx) { if (size_t(obj_idx) >= m_objects.size()) { @@ -1950,10 +1976,19 @@ bool ObjectDataViewModel::HasInfoItem(InfoItemType type) const } ItemType ObjectDataViewModel::GetItemType(const wxDataViewItem &item) const +{ + if (!item.IsOk()) + return itUndef; + ObjectDataViewModelNode *node = static_cast(item.GetID()); + return node->m_type < 0 ? itUndef : node->m_type; +} + +ItemType ObjectDataViewModel::GetItemType(const wxDataViewItem &item, int &plate_idx) const { if (!item.IsOk()) return itUndef; ObjectDataViewModelNode *node = static_cast(item.GetID()); + plate_idx=node->m_plate_idx; return node->m_type < 0 ? itUndef : node->m_type; } diff --git a/src/slic3r/GUI/ObjectDataViewModel.hpp b/src/slic3r/GUI/ObjectDataViewModel.hpp index 9aa40f510b..e2a813b0e3 100644 --- a/src/slic3r/GUI/ObjectDataViewModel.hpp +++ b/src/slic3r/GUI/ObjectDataViewModel.hpp @@ -220,7 +220,7 @@ public: { return m_children.GetCount(); } - + void SetName(const wxString &); bool SetValue(const wxVariant &variant, unsigned int col); void SetVolumeType(ModelVolumeType type) { m_volume_type = type; } void SetBitmap(const wxBitmap &icon) { m_bmp = icon; } @@ -361,6 +361,7 @@ public: void DeleteVolumeChildren(wxDataViewItem& parent); void DeleteSettings(const wxDataViewItem& parent); wxDataViewItem GetItemByPlateId(int plate_idx); + void SetCurSelectedPlateFullNmae(int plate_idx,const std::string &); wxDataViewItem GetItemById(int obj_idx); wxDataViewItem GetItemById(const int obj_idx, const int sub_obj_idx, const ItemType parent_type); wxDataViewItem GetItemByVolumeId(int obj_idx, int volume_idx); @@ -428,6 +429,7 @@ public: bool HasInfoItem(InfoItemType type) const; ItemType GetItemType(const wxDataViewItem &item) const; + ItemType GetItemType(const wxDataViewItem &item,int& plate_idx) const; InfoItemType GetInfoItemType(const wxDataViewItem &item) const; wxDataViewItem GetItemByType( const wxDataViewItem &parent_item, ItemType type) const; diff --git a/src/slic3r/GUI/PartPlate.cpp b/src/slic3r/GUI/PartPlate.cpp index d7a8f823af..52b86918ae 100644 --- a/src/slic3r/GUI/PartPlate.cpp +++ b/src/slic3r/GUI/PartPlate.cpp @@ -1556,6 +1556,12 @@ void PartPlate::set_plate_name(const std::string &name) // compare if name equal to m_name, case sensitive if (boost::equals(m_name, name)) return; + if (m_plater) { + ObjectList *obj_list = wxGetApp().obj_list(); + if (obj_list) { + obj_list->GetModel()->SetCurSelectedPlateFullNmae(m_plate_index, name); + } + } m_name = name; m_name_change = true; if (m_print != nullptr) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index c032acd9f5..33423a38b8 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1701,6 +1701,7 @@ struct Plater::priv bool m_slice_all{false}; bool m_is_slicing {false}; bool m_is_publishing {false}; + int m_is_RightClickInLeftUI{-1}; int m_cur_slice_plate; //BBS: m_slice_all in .gcode.3mf file case, set true when slice all bool m_slice_all_only_has_gcode{ false }; @@ -11114,13 +11115,13 @@ void Plater::validate_current_plate(bool& model_fits, bool& validate_error) //BBS: select Plate by hover_id -int Plater::select_plate_by_hover_id(int hover_id, bool right_click) +int Plater::select_plate_by_hover_id(int hover_id, bool right_click, bool isModidyPlateName) { int ret; int action, plate_index; plate_index = hover_id / PartPlate::GRABBER_COUNT; - action = hover_id % PartPlate::GRABBER_COUNT; + action = isModidyPlateName?5:hover_id % PartPlate::GRABBER_COUNT; BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(": enter, hover_id %1%, plate_index %2%, action %3%")%hover_id % plate_index %action; if (action == 0) @@ -11746,7 +11747,8 @@ wxMenu* Plater::default_menu() { return p->menus.default_menu(); wxMenu* Plater::instance_menu() { return p->menus.instance_menu(); } wxMenu* Plater::layer_menu() { return p->menus.layer_menu(); } wxMenu* Plater::multi_selection_menu() { return p->menus.multi_selection_menu(); } - +int Plater::GetPlateIndexByRightMenuInLeftUI() { return p->m_is_RightClickInLeftUI; } +void Plater::SetPlateIndexByRightMenuInLeftUI(int index) { p->m_is_RightClickInLeftUI = index; } SuppressBackgroundProcessingUpdate::SuppressBackgroundProcessingUpdate() : m_was_scheduled(wxGetApp().plater()->is_background_process_update_scheduled()) { diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index d735a550f6..00e1e50977 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -508,7 +508,7 @@ public: //BBS: update progress result void apply_background_progress(); //BBS: select the plate by hover_id - int select_plate_by_hover_id(int hover_id, bool right_click = false); + int select_plate_by_hover_id(int hover_id, bool right_click = false, bool isModidyPlateName = false); //BBS: delete the plate, index= -1 means the current plate int delete_plate(int plate_index = -1); //BBS: select the sliced plate by index @@ -673,7 +673,8 @@ public: wxMenu* instance_menu(); wxMenu* layer_menu(); wxMenu* multi_selection_menu(); - + int GetPlateIndexByRightMenuInLeftUI(); + void SetPlateIndexByRightMenuInLeftUI(int); static bool has_illegal_filename_characters(const wxString& name); static bool has_illegal_filename_characters(const std::string& name); static void show_illegal_characters_warning(wxWindow* parent);