From a4605a5e9ed378c0687789abfd636bb2826d9fce Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Wed, 10 May 2023 10:20:31 +0200 Subject: [PATCH] SPE-1606 - Do no show the switch view type icon in the 3D scene if the object does not contain negative volumes --- src/slic3r/GUI/GLCanvas3D.cpp | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 804f6058d2..3859372b67 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1095,6 +1095,19 @@ static bool composite_id_match(const GLVolume::CompositeID& id1, const GLVolume: return id1.object_id == id2.object_id && id1.instance_id == id2.instance_id; } +static bool object_contains_negative_volumes(const Model& model, int obj_id) { + bool ret = false; + if (0 <= obj_id && obj_id < model.objects.size()) { + for (const ModelVolume* v : model.objects[obj_id]->volumes) { + if (v->is_negative_volume()) { + ret = true; + break; + } + } + } + return ret; +} + void GLCanvas3D::SLAView::detect_type_from_volumes(const GLVolumePtrs& volumes) { for (auto& [id, type] : m_instances_cache) { @@ -1103,9 +1116,11 @@ void GLCanvas3D::SLAView::detect_type_from_volumes(const GLVolumePtrs& volumes) for (const GLVolume* v : volumes) { if (v->volume_idx() == -(int)slaposDrillHoles) { - const InstancesCacheItem* instance = find_instance_item(v->composite_id); - assert(instance != nullptr); - set_type(instance->first, ESLAViewType::Processed); + if (object_contains_negative_volumes(*m_parent.get_model(), v->composite_id.object_id)) { + const InstancesCacheItem* instance = find_instance_item(v->composite_id); + assert(instance != nullptr); + set_type(instance->first, ESLAViewType::Processed); + } } } } @@ -1196,6 +1211,9 @@ void GLCanvas3D::SLAView::render_switch_button() if (std::find(mo_idxs.begin(), mo_idxs.end(), obj_idx) == mo_idxs.end()) return; + if (!object_contains_negative_volumes(*m_parent.get_model(), obj_idx)) + return; + const int inst_idx = selection.get_instance_idx(); if (inst_idx < 0) return;