mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-09-14 12:37:46 +00:00
NEW: Add "change filament to"
jira: none Change-Id: Ic5550ed257e03033681de91ebca521390f902f66 (cherry picked from commit 51de6253ce0525da3345c496e0a70c5fe8ff542a)
This commit is contained in:
@@ -2481,12 +2481,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<int> used_extruders = get_extruders();
|
std::vector<int> used_extruders = get_extruders();
|
||||||
for (int extruder_id : used_extruders) {
|
for (int extruder_id : used_extruders) {
|
||||||
if (extruder_id == filament_id) {
|
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;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3401,10 +3401,13 @@ void FacetsAnnotation::get_facets(const ModelVolume& mv, std::vector<indexed_tri
|
|||||||
selector.get_facets(facets_per_type);
|
selector.get_facets(facets_per_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FacetsAnnotation::set_enforcer_block_type_limit(const ModelVolume &mv, EnforcerBlockerType max_type, EnforcerBlockerType to_delete_filament)
|
void FacetsAnnotation::set_enforcer_block_type_limit(const ModelVolume &mv,
|
||||||
|
EnforcerBlockerType max_type,
|
||||||
|
EnforcerBlockerType to_delete_filament,
|
||||||
|
EnforcerBlockerType replace_filament)
|
||||||
{
|
{
|
||||||
TriangleSelector selector(mv.mesh());
|
TriangleSelector selector(mv.mesh());
|
||||||
selector.deserialize(m_data, false, max_type, to_delete_filament);
|
selector.deserialize(m_data, false, max_type, to_delete_filament, replace_filament);
|
||||||
this->set(selector);
|
this->set(selector);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -734,7 +734,10 @@ public:
|
|||||||
indexed_triangle_set get_facets(const ModelVolume& mv, EnforcerBlockerType type) const;
|
indexed_triangle_set get_facets(const ModelVolume& mv, EnforcerBlockerType type) const;
|
||||||
// BBS
|
// BBS
|
||||||
void get_facets(const ModelVolume& mv, std::vector<indexed_triangle_set>& facets_per_type) const;
|
void get_facets(const ModelVolume& mv, std::vector<indexed_triangle_set>& 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;
|
indexed_triangle_set get_facets_strict(const ModelVolume& mv, EnforcerBlockerType type) const;
|
||||||
bool has_facets(const ModelVolume& mv, EnforcerBlockerType type) const;
|
bool has_facets(const ModelVolume& mv, EnforcerBlockerType type) const;
|
||||||
bool empty() const { return m_data.triangles_to_split.empty(); }
|
bool empty() const { return m_data.triangles_to_split.empty(); }
|
||||||
@@ -915,7 +918,7 @@ public:
|
|||||||
// BBS
|
// BBS
|
||||||
std::vector<int> get_extruders() const;
|
std::vector<int> get_extruders() const;
|
||||||
void update_extruder_count(size_t extruder_count);
|
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.
|
// Split this volume, append the result to the object owning this volume.
|
||||||
// Return the number of volumes created from this one.
|
// Return the number of volumes created from this one.
|
||||||
|
|||||||
@@ -1720,7 +1720,11 @@ TriangleSelector::TriangleSplittingData TriangleSelector::serialize() const {
|
|||||||
return out.data;
|
return out.data;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TriangleSelector::deserialize(const TriangleSplittingData& data, bool needs_reset, EnforcerBlockerType max_ebt, EnforcerBlockerType to_delete_filament)
|
void TriangleSelector::deserialize(const TriangleSplittingData &data,
|
||||||
|
bool needs_reset,
|
||||||
|
EnforcerBlockerType max_ebt,
|
||||||
|
EnforcerBlockerType to_delete_filament,
|
||||||
|
EnforcerBlockerType replace_filament)
|
||||||
{
|
{
|
||||||
if (needs_reset)
|
if (needs_reset)
|
||||||
reset(); // dump any current state
|
reset(); // dump any current state
|
||||||
@@ -1770,7 +1774,7 @@ void TriangleSelector::deserialize(const TriangleSplittingData& data, bool needs
|
|||||||
|
|
||||||
// BBS
|
// BBS
|
||||||
if (state > max_ebt || state == to_delete_filament)
|
if (state > max_ebt || state == to_delete_filament)
|
||||||
state = EnforcerBlockerType::NONE;
|
state = replace_filament;
|
||||||
|
|
||||||
if (to_delete_filament != EnforcerBlockerType::NONE && state != EnforcerBlockerType::NONE) {
|
if (to_delete_filament != EnforcerBlockerType::NONE && state != EnforcerBlockerType::NONE) {
|
||||||
state = state > to_delete_filament ? EnforcerBlockerType((int)state - 1) : state;
|
state = state > to_delete_filament ? EnforcerBlockerType((int)state - 1) : state;
|
||||||
|
|||||||
@@ -359,7 +359,8 @@ public:
|
|||||||
void deserialize(const TriangleSplittingData& data,
|
void deserialize(const TriangleSplittingData& data,
|
||||||
bool needs_reset = true,
|
bool needs_reset = true,
|
||||||
EnforcerBlockerType max_ebt = EnforcerBlockerType::ExtruderMax,
|
EnforcerBlockerType max_ebt = EnforcerBlockerType::ExtruderMax,
|
||||||
EnforcerBlockerType to_delete_filament = EnforcerBlockerType::NONE);
|
EnforcerBlockerType to_delete_filament = EnforcerBlockerType::NONE,
|
||||||
|
EnforcerBlockerType replace_filament = EnforcerBlockerType::NONE);
|
||||||
|
|
||||||
// Extract all used facet states from the given TriangleSplittingData.
|
// Extract all used facet states from the given TriangleSplittingData.
|
||||||
static std::vector<EnforcerBlockerType> extract_used_facet_states(const TriangleSplittingData &data);
|
static std::vector<EnforcerBlockerType> extract_used_facet_states(const TriangleSplittingData &data);
|
||||||
|
|||||||
@@ -724,8 +724,9 @@ void ObjectList::update_filament_values_for_items(const size_t filaments_count)
|
|||||||
wxGetApp().plater()->update();
|
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) {
|
for (size_t i = 0; i < m_objects->size(); ++i) {
|
||||||
wxDataViewItem item = m_objects_model->GetItemById(i);
|
wxDataViewItem item = m_objects_model->GetItemById(i);
|
||||||
if (!item)
|
if (!item)
|
||||||
@@ -733,9 +734,13 @@ void ObjectList::update_filament_values_for_items_when_delete_filament(const siz
|
|||||||
|
|
||||||
auto object = (*m_objects)[i];
|
auto object = (*m_objects)[i];
|
||||||
wxString extruder;
|
wxString extruder;
|
||||||
if (!object->config.has("extruder") || size_t(object->config.extruder()) == filament_id + 1) {
|
if (!object->config.has("extruder")) {
|
||||||
extruder = "1";
|
extruder = std::to_string(1);
|
||||||
object->config.set_key_value("extruder", new ConfigOptionInt(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 {
|
} else {
|
||||||
int new_extruder = object->config.extruder() > filament_id ? object->config.extruder() - 1 : object->config.extruder();
|
int new_extruder = object->config.extruder() > filament_id ? object->config.extruder() - 1 : object->config.extruder();
|
||||||
extruder = wxString::Format("%d", new_extruder);
|
extruder = wxString::Format("%d", new_extruder);
|
||||||
@@ -745,8 +750,12 @@ void ObjectList::update_filament_values_for_items_when_delete_filament(const siz
|
|||||||
|
|
||||||
static const char *keys[] = {"support_filament", "support_interface_filament"};
|
static const char *keys[] = {"support_filament", "support_interface_filament"};
|
||||||
for (auto key : keys)
|
for (auto key : keys)
|
||||||
if (object->config.has(key) && object->config.opt_int(key) == filament_id + 1)
|
if (object->config.has(key) && object->config.opt_int(key) == filament_id + 1) {
|
||||||
|
if (replace_id == -1)
|
||||||
object->config.erase(key);
|
object->config.erase(key);
|
||||||
|
else
|
||||||
|
object->config.set_key_value(key, new ConfigOptionInt(replace_filament_id));
|
||||||
|
}
|
||||||
|
|
||||||
if (object->volumes.size() > 1) {
|
if (object->volumes.size() > 1) {
|
||||||
for (size_t id = 0; id < object->volumes.size(); id++) {
|
for (size_t id = 0; id < object->volumes.size(); id++) {
|
||||||
@@ -754,6 +763,8 @@ void ObjectList::update_filament_values_for_items_when_delete_filament(const siz
|
|||||||
if (!item) continue;
|
if (!item) continue;
|
||||||
if (!object->volumes[id]->config.has("extruder") || size_t(object->volumes[id]->config.extruder()) == filament_id + 1) {
|
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();
|
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);
|
extruder = wxString::Format("%d", new_extruder);
|
||||||
object->config.set_key_value("extruder", new ConfigOptionInt(new_extruder));
|
object->config.set_key_value("extruder", new ConfigOptionInt(new_extruder));
|
||||||
} else {
|
} else {
|
||||||
@@ -789,7 +800,7 @@ void ObjectList::update_filament_values_for_items_when_delete_filament(const siz
|
|||||||
if (l_iter != object->layer_config_ranges.end()) {
|
if (l_iter != object->layer_config_ranges.end()) {
|
||||||
auto& layer_range_item = *(l_iter);
|
auto& layer_range_item = *(l_iter);
|
||||||
if (layer_range_item.second.has("extruder") && layer_range_item.second.option("extruder")->getInt() == filament_id + 1) {
|
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);
|
extruder = wxString::Format("%d", new_extruder);
|
||||||
layer_range_item.second.set("extruder", new_extruder);
|
layer_range_item.second.set("extruder", new_extruder);
|
||||||
} else {
|
} else {
|
||||||
@@ -955,13 +966,13 @@ void ObjectList::update_objects_list_filament_column(size_t filaments_count)
|
|||||||
m_prevent_update_filament_in_config = false;
|
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;
|
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
|
// BBS: update extruder values even when filaments_count is 1, because it may be reduced from value greater than 1
|
||||||
if (m_objects)
|
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();
|
update_filament_colors();
|
||||||
|
|
||||||
|
|||||||
@@ -222,7 +222,7 @@ public:
|
|||||||
void create_objects_ctrl();
|
void create_objects_ctrl();
|
||||||
// BBS
|
// BBS
|
||||||
void update_objects_list_filament_column(size_t filaments_count);
|
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();
|
void update_filament_colors();
|
||||||
// show/hide "Extruder" column for Objects List
|
// show/hide "Extruder" column for Objects List
|
||||||
void set_filament_column_hidden(const bool hide) const;
|
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_model(const wxDataViewItem& item) const;
|
||||||
void update_name_in_list(int obj_idx, int vol_idx) 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(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
|
//BBS: update plate
|
||||||
void update_plate_values_for_items();
|
void update_plate_values_for_items();
|
||||||
|
|||||||
@@ -1903,7 +1903,7 @@ void Sidebar::add_filament() {
|
|||||||
add_custom_filament(new_col);
|
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;
|
if (p->combos_filament.size() <= 1) return;
|
||||||
|
|
||||||
size_t filament_count = p->combos_filament.size() - 1;
|
size_t filament_count = p->combos_filament.size() - 1;
|
||||||
@@ -1927,11 +1927,16 @@ void Sidebar::delete_filament(size_t filament_id) {
|
|||||||
|
|
||||||
wxGetApp().preset_bundle->update_num_filaments(filament_id);
|
wxGetApp().preset_bundle->update_num_filaments(filament_id);
|
||||||
wxGetApp().plater()->get_partplate_list().on_filament_deleted(filament_count, 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().get_tab(Preset::TYPE_PRINT)->update();
|
||||||
wxGetApp().preset_bundle->export_selections(*wxGetApp().app_config);
|
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()
|
void Sidebar::edit_filament()
|
||||||
{
|
{
|
||||||
p->editing_filament = -1;
|
p->editing_filament = -1;
|
||||||
@@ -13376,7 +13381,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
|
// only update elements in plater
|
||||||
update_filament_colors_in_full_config();
|
update_filament_colors_in_full_config();
|
||||||
@@ -13392,7 +13397,7 @@ void Plater::on_filaments_delete(size_t num_filaments, size_t filament_id)
|
|||||||
// update mmu info
|
// update mmu info
|
||||||
for (ModelObject *mo : wxGetApp().model().objects) {
|
for (ModelObject *mo : wxGetApp().model().objects) {
|
||||||
for (ModelVolume *mv : mo->volumes) {
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -13402,18 +13407,26 @@ void Plater::on_filaments_delete(size_t num_filaments, size_t filament_id)
|
|||||||
// update global support filament
|
// update global support filament
|
||||||
static const char *keys[] = {"support_filament", "support_interface_filament"};
|
static const char *keys[] = {"support_filament", "support_interface_filament"};
|
||||||
for (auto key : keys)
|
for (auto key : keys)
|
||||||
if (p->config->has(key) && p->config->opt_int(key) == filament_id + 1)
|
if (p->config->has(key) && p->config->opt_int(key) == filament_id + 1) {
|
||||||
|
if (replace_filament_id == -1)
|
||||||
(*(p->config)).erase(key);
|
(*(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
|
// 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
|
// update customize gcode
|
||||||
for (auto item = p->model.plates_custom_gcodes.begin(); item != p->model.plates_custom_gcodes.end(); ++item) {
|
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) {
|
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);
|
return (gcode_item.type == CustomGCode::Type::ToolChange && gcode_item.extruder == filament_id + 1);
|
||||||
});
|
});
|
||||||
|
if (replace_filament_id == -1)
|
||||||
item->second.gcodes.erase(iter, item->second.gcodes.end());
|
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) {
|
for (auto& item : item->second.gcodes) {
|
||||||
if (item.type == CustomGCode::Type::ToolChange && item.extruder > filament_id)
|
if (item.type == CustomGCode::Type::ToolChange && item.extruder > filament_id)
|
||||||
|
|||||||
@@ -153,7 +153,8 @@ public:
|
|||||||
void on_filaments_delete(size_t filament_id);
|
void on_filaments_delete(size_t filament_id);
|
||||||
|
|
||||||
void add_filament();
|
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 edit_filament();
|
||||||
void add_custom_filament(wxColour new_col);
|
void add_custom_filament(wxColour new_col);
|
||||||
// BBS
|
// BBS
|
||||||
@@ -483,7 +484,7 @@ public:
|
|||||||
bool leave_gizmos_stack();
|
bool leave_gizmos_stack();
|
||||||
|
|
||||||
void on_filaments_change(size_t extruders_count);
|
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
|
// BBS
|
||||||
void on_bed_type_change(BedType bed_type);
|
void on_bed_type_change(BedType bed_type);
|
||||||
bool update_filament_colors_in_full_config();
|
bool update_filament_colors_in_full_config();
|
||||||
|
|||||||
Reference in New Issue
Block a user