From 51de6253ce0525da3345c496e0a70c5fe8ff542a Mon Sep 17 00:00:00 2001 From: "zhimin.zeng" Date: Tue, 24 Sep 2024 17:52:28 +0800 Subject: [PATCH] NEW: Add "change filament to" jira: none Change-Id: Ic5550ed257e03033681de91ebca521390f902f66 --- src/libslic3r/Model.cpp | 11 +++++++---- src/libslic3r/Model.hpp | 7 +++++-- src/libslic3r/TriangleSelector.cpp | 8 ++++++-- src/libslic3r/TriangleSelector.hpp | 3 ++- src/slic3r/GUI/GUI_ObjectList.cpp | 27 +++++++++++++++++++-------- src/slic3r/GUI/GUI_ObjectList.hpp | 4 ++-- src/slic3r/GUI/Plater.cpp | 29 +++++++++++++++++++++-------- src/slic3r/GUI/Plater.hpp | 5 +++-- 8 files changed, 65 insertions(+), 29 deletions(-) diff --git a/src/libslic3r/Model.cpp b/src/libslic3r/Model.cpp index f773d84f0..b7623e27a 100644 --- a/src/libslic3r/Model.cpp +++ b/src/libslic3r/Model.cpp @@ -3102,12 +3102,12 @@ void ModelVolume::update_extruder_count(size_t extruder_count) } } -void ModelVolume::update_extruder_count_when_delete_filament(size_t extruder_count, size_t filament_id) +void ModelVolume::update_extruder_count_when_delete_filament(size_t extruder_count, size_t filament_id, int replace_filament_id) { std::vector used_extruders = get_extruders(); for (int extruder_id : used_extruders) { if (extruder_id == filament_id) { - mmu_segmentation_facets.set_enforcer_block_type_limit(*this, (EnforcerBlockerType)(extruder_count + 1), (EnforcerBlockerType)(filament_id + 1)); + mmu_segmentation_facets.set_enforcer_block_type_limit(*this, (EnforcerBlockerType)(extruder_count + 1), (EnforcerBlockerType)(filament_id + 1), (EnforcerBlockerType)(replace_filament_id + 1)); break; } } @@ -4010,10 +4010,13 @@ void FacetsAnnotation::get_facets(const ModelVolume& mv, std::vectorset(selector); } diff --git a/src/libslic3r/Model.hpp b/src/libslic3r/Model.hpp index 6de868ff1..0835b4273 100644 --- a/src/libslic3r/Model.hpp +++ b/src/libslic3r/Model.hpp @@ -770,7 +770,10 @@ public: indexed_triangle_set get_facets(const ModelVolume& mv, EnforcerBlockerType type) const; // BBS void get_facets(const ModelVolume& mv, std::vector& facets_per_type) const; - void set_enforcer_block_type_limit(const ModelVolume& mv, EnforcerBlockerType max_type, EnforcerBlockerType to_delete_filament = EnforcerBlockerType::NONE); + void set_enforcer_block_type_limit(const ModelVolume &mv, + EnforcerBlockerType max_type, + EnforcerBlockerType to_delete_filament = EnforcerBlockerType::NONE, + EnforcerBlockerType replace_filament = EnforcerBlockerType::NONE); indexed_triangle_set get_facets_strict(const ModelVolume& mv, EnforcerBlockerType type) const; bool has_facets(const ModelVolume& mv, EnforcerBlockerType type) const; bool empty() const { return m_data.first.empty(); } @@ -974,7 +977,7 @@ public: // BBS std::vector get_extruders() const; void update_extruder_count(size_t extruder_count); - void update_extruder_count_when_delete_filament(size_t extruder_count, size_t filament_id); + void update_extruder_count_when_delete_filament(size_t extruder_count, size_t filament_id, int replace_filament_id = -1); // Split this volume, append the result to the object owning this volume. // Return the number of volumes created from this one. diff --git a/src/libslic3r/TriangleSelector.cpp b/src/libslic3r/TriangleSelector.cpp index 8f07598fe..222c7e668 100644 --- a/src/libslic3r/TriangleSelector.cpp +++ b/src/libslic3r/TriangleSelector.cpp @@ -1701,7 +1701,11 @@ std::pair>, std::vector> TriangleSelector: return out.data; } -void TriangleSelector::deserialize(const std::pair>, std::vector> &data, bool needs_reset, EnforcerBlockerType max_ebt, EnforcerBlockerType to_delete_filament) +void TriangleSelector::deserialize(const std::pair>, std::vector> &data, + bool needs_reset, + EnforcerBlockerType max_ebt, + EnforcerBlockerType to_delete_filament, + EnforcerBlockerType replace_filament) { if (needs_reset) reset(); // dump any current state @@ -1765,7 +1769,7 @@ void TriangleSelector::deserialize(const std::pair max_ebt || state == to_delete_filament) - state = EnforcerBlockerType::NONE; + state = replace_filament; if (to_delete_filament != EnforcerBlockerType::NONE && state != EnforcerBlockerType::NONE) { state = state > to_delete_filament ? EnforcerBlockerType((int)state - 1) : state; diff --git a/src/libslic3r/TriangleSelector.hpp b/src/libslic3r/TriangleSelector.hpp index 01da9f857..ea303995c 100644 --- a/src/libslic3r/TriangleSelector.hpp +++ b/src/libslic3r/TriangleSelector.hpp @@ -279,7 +279,8 @@ public: void deserialize(const std::pair>, std::vector> &data, bool needs_reset = true, EnforcerBlockerType max_ebt = EnforcerBlockerType::ExtruderMax, - EnforcerBlockerType to_delete_filament = EnforcerBlockerType::NONE); + EnforcerBlockerType to_delete_filament = EnforcerBlockerType::NONE, + EnforcerBlockerType replace_filament = EnforcerBlockerType::NONE); // For all triangles, remove the flag indicating that the triangle was selected by seed fill. void seed_fill_unselect_all_triangles(); diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 28fb8fc9a..37568c9e3 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -699,8 +699,9 @@ void ObjectList::update_filament_values_for_items(const size_t filaments_count) wxGetApp().plater()->update(); } -void ObjectList::update_filament_values_for_items_when_delete_filament(const size_t filament_id) +void ObjectList::update_filament_values_for_items_when_delete_filament(const size_t filament_id, const int replace_id) { + int replace_filament_id = replace_id == -1 ? 1 : (replace_id + 1); for (size_t i = 0; i < m_objects->size(); ++i) { wxDataViewItem item = m_objects_model->GetItemById(i); if (!item) @@ -708,9 +709,13 @@ void ObjectList::update_filament_values_for_items_when_delete_filament(const siz auto object = (*m_objects)[i]; wxString extruder; - if (!object->config.has("extruder") || size_t(object->config.extruder()) == filament_id + 1) { - extruder = "1"; + if (!object->config.has("extruder")) { + extruder = std::to_string(1); object->config.set_key_value("extruder", new ConfigOptionInt(1)); + } + else if (size_t(object->config.extruder()) == filament_id + 1) { + extruder = std::to_string(replace_filament_id); + object->config.set_key_value("extruder", new ConfigOptionInt(replace_filament_id)); } else { int new_extruder = object->config.extruder() > filament_id ? object->config.extruder() - 1 : object->config.extruder(); extruder = wxString::Format("%d", new_extruder); @@ -720,8 +725,12 @@ void ObjectList::update_filament_values_for_items_when_delete_filament(const siz static const char *keys[] = {"support_filament", "support_interface_filament"}; for (auto key : keys) - if (object->config.has(key) && object->config.opt_int(key) == filament_id + 1) - object->config.erase(key); + if (object->config.has(key) && object->config.opt_int(key) == filament_id + 1) { + if (replace_id == -1) + object->config.erase(key); + else + object->config.set_key_value(key, new ConfigOptionInt(replace_filament_id)); + } if (object->volumes.size() > 1) { for (size_t id = 0; id < object->volumes.size(); id++) { @@ -729,6 +738,8 @@ void ObjectList::update_filament_values_for_items_when_delete_filament(const siz if (!item) continue; if (!object->volumes[id]->config.has("extruder") || size_t(object->volumes[id]->config.extruder()) == filament_id + 1) { int new_extruder = object->config.extruder() > filament_id ? object->config.extruder() - 1 : object->config.extruder(); + if (replace_id >= 0) + new_extruder = replace_filament_id; extruder = wxString::Format("%d", new_extruder); object->config.set_key_value("extruder", new ConfigOptionInt(new_extruder)); } else { @@ -764,7 +775,7 @@ void ObjectList::update_filament_values_for_items_when_delete_filament(const siz if (l_iter != object->layer_config_ranges.end()) { auto& layer_range_item = *(l_iter); if (layer_range_item.second.has("extruder") && layer_range_item.second.option("extruder")->getInt() == filament_id + 1) { - int new_extruder = 0; + int new_extruder = replace_id == -1 ? 0 : (replace_id + 1); extruder = wxString::Format("%d", new_extruder); layer_range_item.second.set("extruder", new_extruder); } else { @@ -929,13 +940,13 @@ void ObjectList::update_objects_list_filament_column(size_t filaments_count) m_prevent_update_filament_in_config = false; } -void ObjectList::update_objects_list_filament_column_when_delete_filament(size_t filament_id, size_t filaments_count) +void ObjectList::update_objects_list_filament_column_when_delete_filament(size_t filament_id, size_t filaments_count, int replace_filament_id) { m_prevent_update_filament_in_config = true; // BBS: update extruder values even when filaments_count is 1, because it may be reduced from value greater than 1 if (m_objects) - update_filament_values_for_items_when_delete_filament(filament_id); + update_filament_values_for_items_when_delete_filament(filament_id, replace_filament_id); update_filament_colors(); diff --git a/src/slic3r/GUI/GUI_ObjectList.hpp b/src/slic3r/GUI/GUI_ObjectList.hpp index a9c151c24..c57085922 100644 --- a/src/slic3r/GUI/GUI_ObjectList.hpp +++ b/src/slic3r/GUI/GUI_ObjectList.hpp @@ -222,7 +222,7 @@ public: void create_objects_ctrl(); // BBS void update_objects_list_filament_column(size_t filaments_count); - void update_objects_list_filament_column_when_delete_filament(size_t filament_id, size_t filaments_count); + void update_objects_list_filament_column_when_delete_filament(size_t filament_id, size_t filaments_count, int replace_filament_id = -1); void update_filament_colors(); // show/hide "Extruder" column for Objects List void set_filament_column_hidden(const bool hide) const; @@ -239,7 +239,7 @@ public: void update_name_in_model(const wxDataViewItem& item) const; void update_name_in_list(int obj_idx, int vol_idx) const; void update_filament_values_for_items(const size_t filaments_count); - void update_filament_values_for_items_when_delete_filament(const size_t filament_id); + void update_filament_values_for_items_when_delete_filament(const size_t filament_id, const int replace_id = -1); //BBS: update plate void update_plate_values_for_items(); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index fce6edbfa..d5586e844 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1925,7 +1925,7 @@ void Sidebar::add_filament() { add_custom_filament(new_col); } -void Sidebar::delete_filament(size_t filament_id) { +void Sidebar::delete_filament(size_t filament_id, int replace_filament_id) { if (p->combos_filament.size() <= 1) return; wxBusyCursor busy; size_t filament_count = p->combos_filament.size() - 1; @@ -1949,11 +1949,16 @@ void Sidebar::delete_filament(size_t filament_id) { wxGetApp().preset_bundle->update_num_filaments(filament_id); wxGetApp().plater()->get_partplate_list().on_filament_deleted(filament_count, filament_id); - wxGetApp().plater()->on_filaments_delete(filament_count, filament_id); + wxGetApp().plater()->on_filaments_delete(filament_count, filament_id, replace_filament_id); wxGetApp().get_tab(Preset::TYPE_PRINT)->update(); wxGetApp().preset_bundle->export_selections(*wxGetApp().app_config); } +void Sidebar::change_filament(size_t from_id, size_t to_id) +{ + delete_filament(from_id, int(to_id)); +} + void Sidebar::edit_filament() { p->editing_filament = -1; @@ -13250,7 +13255,7 @@ void Plater::on_filaments_change(size_t num_filaments) } } -void Plater::on_filaments_delete(size_t num_filaments, size_t filament_id) +void Plater::on_filaments_delete(size_t num_filaments, size_t filament_id, int replace_filament_id) { // only update elements in plater update_filament_colors_in_full_config(); @@ -13266,7 +13271,7 @@ void Plater::on_filaments_delete(size_t num_filaments, size_t filament_id) // update mmu info for (ModelObject *mo : wxGetApp().model().objects) { for (ModelVolume *mv : mo->volumes) { - mv->update_extruder_count_when_delete_filament(num_filaments, filament_id); + mv->update_extruder_count_when_delete_filament(num_filaments, filament_id, replace_filament_id); } } @@ -13276,18 +13281,26 @@ void Plater::on_filaments_delete(size_t num_filaments, size_t filament_id) // update global support filament static const char *keys[] = {"support_filament", "support_interface_filament"}; for (auto key : keys) - if (p->config->has(key) && p->config->opt_int(key) == filament_id + 1) - (*(p->config)).erase(key); + if (p->config->has(key) && p->config->opt_int(key) == filament_id + 1) { + if (replace_filament_id == -1) + (*(p->config)).erase(key); + else + (*(p->config)).set_key_value(key, new ConfigOptionInt(replace_filament_id + 1)); + } // update object/volume/support(object and volume) filament id - sidebar().obj_list()->update_objects_list_filament_column_when_delete_filament(filament_id, num_filaments); + sidebar().obj_list()->update_objects_list_filament_column_when_delete_filament(filament_id, num_filaments, replace_filament_id); // update customize gcode for (auto item = p->model.plates_custom_gcodes.begin(); item != p->model.plates_custom_gcodes.end(); ++item) { auto iter = std::remove_if(item->second.gcodes.begin(), item->second.gcodes.end(), [filament_id](const Item& gcode_item) { return (gcode_item.type == CustomGCode::Type::ToolChange && gcode_item.extruder == filament_id + 1); }); - item->second.gcodes.erase(iter, item->second.gcodes.end()); + if (replace_filament_id == -1) + item->second.gcodes.erase(iter, item->second.gcodes.end()); + else if(iter != item->second.gcodes.end()) { + iter->extruder = replace_filament_id + 1; + } for (auto& item : item->second.gcodes) { if (item.type == CustomGCode::Type::ToolChange && item.extruder > filament_id) diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index a07daf453..96bd6a99a 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -141,7 +141,8 @@ public: void on_filaments_delete(size_t filament_id); void add_filament(); - void delete_filament(size_t filament_id = size_t(-1)); + void delete_filament(size_t filament_id = size_t(-1), int replace_filament_id = -1); // 0 base + void change_filament(size_t from_id, size_t to_id); // 0 base void edit_filament(); void add_custom_filament(wxColour new_col); // BBS @@ -434,7 +435,7 @@ public: bool leave_gizmos_stack(); void on_filaments_change(size_t extruders_count); - void on_filaments_delete(size_t extruders_count, size_t filament_id); + void on_filaments_delete(size_t extruders_count, size_t filament_id, int replace_filament_id = -1); // BBS void on_bed_type_change(BedType bed_type,bool is_gcode_file = false); bool update_filament_colors_in_full_config();