From 8df5202e74d768add85a398e1d9e502c5a311019 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Thu, 9 Dec 2021 15:02:11 +0100 Subject: [PATCH 1/2] #7429 - Fixes in reload from disk command --- src/slic3r/GUI/GUI_ObjectList.cpp | 8 +++++++- src/slic3r/GUI/Plater.cpp | 16 +++++++++------- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index f4d27b0b2..5f5caa80f 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -1556,7 +1556,7 @@ void ObjectList::load_modifier(ModelObject& model_object, std::vectorcenter_around_origin(); - Vec3d delta = model_object.origin_translation - object->origin_translation; + const Vec3d delta = model_object.origin_translation - object->origin_translation; for (auto volume : object->volumes) { volume->translate(delta); } @@ -1570,6 +1570,12 @@ void ObjectList::load_modifier(ModelObject& model_object, std::vectorname = boost::filesystem::path(input_file).filename().string(); // set a default extruder value, since user can't add it manually new_volume->config.set_key_value("extruder", new ConfigOptionInt(0)); + // update source data + new_volume->source.input_file = input_file; + new_volume->source.object_idx = obj_idx; + new_volume->source.volume_idx = int(model_object.volumes.size()) - 1; + if (model.objects.size() == 1 && model.objects.front()->volumes.size() == 1) + new_volume->source.mesh_offset = model.objects.front()->volumes.front()->source.mesh_offset; if (from_galery) { // Transform the new modifier to be aligned with the print bed. diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index fed9fa5bf..8243f8caf 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -3651,12 +3651,12 @@ void Plater::priv::reload_from_disk() if (has_source || has_name) { int new_volume_idx = -1; int new_object_idx = -1; - if (has_source) { - // take idxs from source - new_volume_idx = old_volume->source.volume_idx; - new_object_idx = old_volume->source.object_idx; - } - else { +// if (has_source) { +// // take idxs from source +// new_volume_idx = old_volume->source.volume_idx; +// new_object_idx = old_volume->source.object_idx; +// } +// else { // take idxs from the 1st matching volume for (size_t o = 0; o < new_model.objects.size(); ++o) { ModelObject* obj = new_model.objects[o]; @@ -3672,7 +3672,7 @@ void Plater::priv::reload_from_disk() if (found) break; } - } +// } if (new_object_idx < 0 && (int)new_model.objects.size() <= new_object_idx) { fail_list.push_back(from_u8(has_source ? old_volume->source.input_file : old_volume->name)); @@ -3692,6 +3692,8 @@ void Plater::priv::reload_from_disk() new_volume->set_material_id(old_volume->material_id()); new_volume->set_transformation(old_volume->get_transformation()); new_volume->translate(new_volume->get_transformation().get_matrix(true) * (new_volume->source.mesh_offset - old_volume->source.mesh_offset)); + new_volume->source.object_idx = old_volume->source.object_idx; + new_volume->source.volume_idx = old_volume->source.volume_idx; assert(! old_volume->source.is_converted_from_inches || ! old_volume->source.is_converted_from_meters); if (old_volume->source.is_converted_from_inches) new_volume->convert_from_imperial_units(); From 1ba189b3a815d5f3ac2331b21de02ab943001e22 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Fri, 10 Dec 2021 08:05:59 +0100 Subject: [PATCH 2/2] Follow-up of 450e430ca1b5169ab59d39a62cc84c4db3b0a8fa - Fixed wrong if() conditions into Plater::priv::reload_from_disk() --- src/slic3r/GUI/Plater.cpp | 49 +++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 25 deletions(-) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 8243f8caf..b3ec46425 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -3674,39 +3674,38 @@ void Plater::priv::reload_from_disk() } // } - if (new_object_idx < 0 && (int)new_model.objects.size() <= new_object_idx) { + if (new_object_idx < 0 || int(new_model.objects.size()) <= new_object_idx) { fail_list.push_back(from_u8(has_source ? old_volume->source.input_file : old_volume->name)); continue; } ModelObject* new_model_object = new_model.objects[new_object_idx]; - if (new_volume_idx < 0 && (int)new_model.objects.size() <= new_volume_idx) { + if (new_volume_idx < 0 || int(new_model_object->volumes.size()) <= new_volume_idx) { fail_list.push_back(from_u8(has_source ? old_volume->source.input_file : old_volume->name)); continue; } - if (new_volume_idx < (int)new_model_object->volumes.size()) { - old_model_object->add_volume(*new_model_object->volumes[new_volume_idx]); - ModelVolume* new_volume = old_model_object->volumes.back(); - new_volume->set_new_unique_id(); - new_volume->config.apply(old_volume->config); - new_volume->set_type(old_volume->type()); - new_volume->set_material_id(old_volume->material_id()); - new_volume->set_transformation(old_volume->get_transformation()); - new_volume->translate(new_volume->get_transformation().get_matrix(true) * (new_volume->source.mesh_offset - old_volume->source.mesh_offset)); - new_volume->source.object_idx = old_volume->source.object_idx; - new_volume->source.volume_idx = old_volume->source.volume_idx; - assert(! old_volume->source.is_converted_from_inches || ! old_volume->source.is_converted_from_meters); - if (old_volume->source.is_converted_from_inches) - new_volume->convert_from_imperial_units(); - else if (old_volume->source.is_converted_from_meters) - new_volume->convert_from_meters(); - std::swap(old_model_object->volumes[sel_v.volume_idx], old_model_object->volumes.back()); - old_model_object->delete_volume(old_model_object->volumes.size() - 1); - if (!sinking) - old_model_object->ensure_on_bed(); - old_model_object->sort_volumes(wxGetApp().app_config->get("order_volumes") == "1"); - sla::reproject_points_and_holes(old_model_object); - } + old_model_object->add_volume(*new_model_object->volumes[new_volume_idx]); + ModelVolume* new_volume = old_model_object->volumes.back(); + new_volume->set_new_unique_id(); + new_volume->config.apply(old_volume->config); + new_volume->set_type(old_volume->type()); + new_volume->set_material_id(old_volume->material_id()); + new_volume->set_transformation(old_volume->get_transformation()); + new_volume->translate(new_volume->get_transformation().get_matrix(true) * (new_volume->source.mesh_offset - old_volume->source.mesh_offset)); + new_volume->source.object_idx = old_volume->source.object_idx; + new_volume->source.volume_idx = old_volume->source.volume_idx; + assert(! old_volume->source.is_converted_from_inches || ! old_volume->source.is_converted_from_meters); + if (old_volume->source.is_converted_from_inches) + new_volume->convert_from_imperial_units(); + else if (old_volume->source.is_converted_from_meters) + new_volume->convert_from_meters(); + std::swap(old_model_object->volumes[sel_v.volume_idx], old_model_object->volumes.back()); + old_model_object->delete_volume(old_model_object->volumes.size() - 1); + if (!sinking) + old_model_object->ensure_on_bed(); + old_model_object->sort_volumes(wxGetApp().app_config->get("order_volumes") == "1"); + + sla::reproject_points_and_holes(old_model_object); } } }