mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-09-12 11:37:42 +00:00
Remap paint after split to objects
This commit is contained in:
@@ -4450,7 +4450,7 @@ int CLI::run(int argc, char **argv)
|
|||||||
size_t num_objects = model.objects.size();
|
size_t num_objects = model.objects.size();
|
||||||
for (size_t i = 0; i < num_objects; ++ i) {
|
for (size_t i = 0; i < num_objects; ++ i) {
|
||||||
ModelObjectPtrs new_objects;
|
ModelObjectPtrs new_objects;
|
||||||
model.objects.front()->split(&new_objects);
|
model.objects.front()->split(&new_objects, false); // TODO: add cli option to enable this?
|
||||||
model.delete_object(size_t(0));
|
model.delete_object(size_t(0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2028,13 +2028,14 @@ static void invalidate_translations(ModelObject* object, const ModelInstance* sr
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ModelObject::split(ModelObjectPtrs* new_objects)
|
void ModelObject::split(ModelObjectPtrs* new_objects, const bool remap_paint)
|
||||||
{
|
{
|
||||||
std::vector<TriangleMesh> all_meshes;
|
std::vector<TriangleMesh> all_meshes;
|
||||||
std::vector<Transform3d> all_transfos;
|
std::vector<Transform3d> all_transfos;
|
||||||
std::vector<std::pair<int, int>> volume_mesh_counts;
|
std::vector<std::pair<int, int>> volume_mesh_counts;
|
||||||
all_meshes.reserve(this->volumes.size() * 5);
|
all_meshes.reserve(this->volumes.size() * 5);
|
||||||
bool is_multi_volume_object = (this->volumes.size() > 1);
|
bool is_multi_volume_object = (this->volumes.size() > 1);
|
||||||
|
std::optional<TriangleSelector::SavedPainting> saved_painting;
|
||||||
|
|
||||||
for (int volume_idx = 0; volume_idx < this->volumes.size(); volume_idx++) {
|
for (int volume_idx = 0; volume_idx < this->volumes.size(); volume_idx++) {
|
||||||
ModelVolume* volume = this->volumes[volume_idx];
|
ModelVolume* volume = this->volumes[volume_idx];
|
||||||
@@ -2046,6 +2047,10 @@ void ModelObject::split(ModelObjectPtrs* new_objects)
|
|||||||
volume->text_configuration.reset();
|
volume->text_configuration.reset();
|
||||||
|
|
||||||
if (!is_multi_volume_object) {
|
if (!is_multi_volume_object) {
|
||||||
|
if (remap_paint) {
|
||||||
|
// Save painting so we could restore them after the mesh split
|
||||||
|
saved_painting = volume->save_painting();
|
||||||
|
}
|
||||||
//BBS: not multi volume object, then split mesh.
|
//BBS: not multi volume object, then split mesh.
|
||||||
std::vector<TriangleMesh> volume_meshes = volume->mesh().split();
|
std::vector<TriangleMesh> volume_meshes = volume->mesh().split();
|
||||||
int mesh_count = 0;
|
int mesh_count = 0;
|
||||||
@@ -2123,6 +2128,9 @@ void ModelObject::split(ModelObjectPtrs* new_objects)
|
|||||||
COPY_FACETS(seam_facets);
|
COPY_FACETS(seam_facets);
|
||||||
COPY_FACETS(mmu_segmentation_facets);
|
COPY_FACETS(mmu_segmentation_facets);
|
||||||
COPY_FACETS(fuzzy_skin_facets);
|
COPY_FACETS(fuzzy_skin_facets);
|
||||||
|
} else if (saved_painting) {
|
||||||
|
// Geometry changed, attempt to remap them to the new mesh
|
||||||
|
new_vol->restore_painting(saved_painting);
|
||||||
}
|
}
|
||||||
|
|
||||||
// BBS: clear volume's config, as we already set them into object
|
// BBS: clear volume's config, as we already set them into object
|
||||||
|
|||||||
@@ -516,7 +516,7 @@ public:
|
|||||||
void delete_connectors();
|
void delete_connectors();
|
||||||
void clone_for_cut(ModelObject **obj);
|
void clone_for_cut(ModelObject **obj);
|
||||||
|
|
||||||
void split(ModelObjectPtrs*new_objects);
|
void split(ModelObjectPtrs*new_objects, bool remap_paint);
|
||||||
void merge();
|
void merge();
|
||||||
|
|
||||||
// BBS: Boolean opts - Musang King
|
// BBS: Boolean opts - Musang King
|
||||||
|
|||||||
@@ -7603,7 +7603,7 @@ void Plater::priv::split_object(int obj_idx, bool auto_drop /* = true */)
|
|||||||
|
|
||||||
wxBusyCursor wait;
|
wxBusyCursor wait;
|
||||||
ModelObjectPtrs new_objects;
|
ModelObjectPtrs new_objects;
|
||||||
current_model_object->split(&new_objects);
|
current_model_object->split(&new_objects, wxGetApp().app_config->get_bool("keep_painting"));
|
||||||
if (new_objects.size() == 1)
|
if (new_objects.size() == 1)
|
||||||
// #ysFIXME use notification
|
// #ysFIXME use notification
|
||||||
Slic3r::GUI::warning_catcher(q, _L("The selected object couldn't be split."));
|
Slic3r::GUI::warning_catcher(q, _L("The selected object couldn't be split."));
|
||||||
|
|||||||
Reference in New Issue
Block a user