From 473c8a26a409fa66f786c6fea3c32e4295c0132d Mon Sep 17 00:00:00 2001 From: YuSanka Date: Thu, 15 Dec 2022 11:21:41 +0100 Subject: [PATCH] Suppress to switch to SLA-technology printer, if an object has a modifier(s) + WIP: ptSLA : Hide modifiers on 3DScene. Waiting for @enricoturri1966 review/reworking --- src/libslic3r/Model.cpp | 9 +++++++++ src/libslic3r/Model.hpp | 3 +++ src/slic3r/GUI/GLCanvas3D.cpp | 6 ++++++ src/slic3r/GUI/GUI_App.cpp | 9 +++++++++ src/slic3r/GUI/Selection.cpp | 32 ++++++++++++++++++++++++++++++-- src/slic3r/GUI/Tab.cpp | 4 ++-- 6 files changed, 59 insertions(+), 4 deletions(-) diff --git a/src/libslic3r/Model.cpp b/src/libslic3r/Model.cpp index 76668d0d2b..6572f7484f 100644 --- a/src/libslic3r/Model.cpp +++ b/src/libslic3r/Model.cpp @@ -2586,6 +2586,15 @@ bool model_mmu_segmentation_data_changed(const ModelObject& mo, const ModelObjec [](const ModelVolume &mv_old, const ModelVolume &mv_new){ return mv_old.mmu_segmentation_facets.timestamp_matches(mv_new.mmu_segmentation_facets); }); } +bool model_has_parameter_modifiers_in_objects(const Model &model) +{ + for (const auto& model_object : model.objects) + for (const auto& volume : model_object->volumes) + if (volume->is_modifier()) + return true; + return false; +} + bool model_has_multi_part_objects(const Model &model) { for (const ModelObject *model_object : model.objects) diff --git a/src/libslic3r/Model.hpp b/src/libslic3r/Model.hpp index 1cd6c34143..74d95b20fa 100644 --- a/src/libslic3r/Model.hpp +++ b/src/libslic3r/Model.hpp @@ -1388,6 +1388,9 @@ bool model_custom_seam_data_changed(const ModelObject& mo, const ModelObject& mo // The function assumes that volumes list is synchronized. extern bool model_mmu_segmentation_data_changed(const ModelObject& mo, const ModelObject& mo_new); +// If the model has object(s) which contains a modofoer, then it is currently not supported by the SLA mode. +// Either the model cannot be loaded, or a SLA printer has to be activated. +bool model_has_parameter_modifiers_in_objects(const Model& model); // If the model has multi-part objects, then it is currently not supported by the SLA mode. // Either the model cannot be loaded, or a SLA printer has to be activated. bool model_has_multi_part_objects(const Model &model); diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 2aa96369db..ea6376463a 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -2049,6 +2049,12 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re raycaster->set_active(v->is_active); } + for (GLVolume* volume : m_volumes.volumes) + if (volume->object_idx() < (int)m_model->objects.size() && m_model->objects[volume->object_idx()]->instances[volume->instance_idx()]->is_printable()) { + if (volume->is_modifier && m_model->objects[volume->object_idx()]->volumes[volume->volume_idx()]->is_modifier()) + volume->is_active = printer_technology != ptSLA; + } + // refresh gizmo elements raycasters for picking GLGizmoBase* curr_gizmo = m_gizmos.get_current(); if (curr_gizmo != nullptr) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 161784d959..5f5d0384ab 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -2884,6 +2884,14 @@ void GUI_App::open_web_page_localized(const std::string &http_address) // Because of we can't to print the multi-part objects with SLA technology. bool GUI_App::may_switch_to_SLA_preset(const wxString& caption) { + if (model_has_parameter_modifiers_in_objects(model())) { + show_info(nullptr, + _L("It's impossible to print object(s) which contains parameter modifiers with SLA technology.") + "\n\n" + + _L("Please check your object list before preset changing."), + caption); + return false; + } +/* if (model_has_multi_part_objects(model())) { show_info(nullptr, _L("It's impossible to print multi-part object(s) with SLA technology.") + "\n\n" + @@ -2898,6 +2906,7 @@ bool GUI_App::may_switch_to_SLA_preset(const wxString& caption) caption); return false; } +*/ return true; } diff --git a/src/slic3r/GUI/Selection.cpp b/src/slic3r/GUI/Selection.cpp index 31e09003c9..a70698b438 100644 --- a/src/slic3r/GUI/Selection.cpp +++ b/src/slic3r/GUI/Selection.cpp @@ -157,6 +157,11 @@ void Selection::add(unsigned int volume_idx, bool as_single_selection, bool chec return; const GLVolume* volume = (*m_volumes)[volume_idx]; + + if (wxGetApp().plater()->printer_technology() == ptSLA && volume->is_modifier && + m_model->objects[volume->object_idx()]->volumes[volume->volume_idx()]->is_modifier()) + return; + // wipe tower is already selected if (is_wipe_tower() && volume->is_wipe_tower) return; @@ -482,8 +487,14 @@ void Selection::instances_changed(const std::vector &instance_ids_select assert(m_valid); assert(m_mode == Instance); m_list.clear(); + + const PrinterTechnology pt = wxGetApp().plater()->printer_technology(); + for (unsigned int volume_idx = 0; volume_idx < (unsigned int)m_volumes->size(); ++ volume_idx) { const GLVolume *volume = (*m_volumes)[volume_idx]; + if (pt == ptSLA && volume->is_modifier && + m_model->objects[volume->object_idx()]->volumes[volume->volume_idx()]->is_modifier()) + continue; auto it = std::lower_bound(instance_ids_selected.begin(), instance_ids_selected.end(), volume->geometry_id.second); if (it != instance_ids_selected.end() && *it == volume->geometry_id.second) this->do_add_volume(volume_idx); @@ -1940,9 +1951,16 @@ std::vector Selection::get_volume_idxs_from_object(unsigned int ob { std::vector idxs; + const PrinterTechnology pt = wxGetApp().plater()->printer_technology(); + for (unsigned int i = 0; i < (unsigned int)m_volumes->size(); ++i) { - if ((*m_volumes)[i]->object_idx() == (int)object_idx) + const GLVolume* v = (*m_volumes)[i]; + if (v->object_idx() == (int)object_idx) { + if (pt == ptSLA && v->is_modifier && + m_model->objects[object_idx]->volumes[v->volume_idx()]->is_modifier()) + continue; idxs.push_back(i); + } } return idxs; @@ -1952,8 +1970,13 @@ std::vector Selection::get_volume_idxs_from_instance(unsigned int { std::vector idxs; + const PrinterTechnology pt = wxGetApp().plater()->printer_technology(); + for (unsigned int i = 0; i < (unsigned int)m_volumes->size(); ++i) { const GLVolume* v = (*m_volumes)[i]; + if (pt == ptSLA && v->is_modifier && + m_model->objects[object_idx]->volumes[i]->is_modifier()) + continue; if (v->object_idx() == (int)object_idx && v->instance_idx() == (int)instance_idx) idxs.push_back(i); } @@ -2911,7 +2934,12 @@ bool Selection::is_from_fully_selected_instance(unsigned int volume_idx) const return false; unsigned int count = (unsigned int)std::count_if(m_list.begin(), m_list.end(), SameInstance(object_idx, volume->instance_idx(), *m_volumes)); - return count == (unsigned int)m_model->objects[object_idx]->volumes.size(); + + PrinterTechnology pt = wxGetApp().plater()->printer_technology(); + const ModelVolumePtrs& volumes = m_model->objects[object_idx]->volumes; + const unsigned int vol_cnt = (unsigned int)std::count_if(volumes.begin(), volumes.end(), [pt](const ModelVolume* volume) { return pt == ptFFF || !volume->is_modifier(); }); + + return count == vol_cnt; } void Selection::paste_volumes_from_clipboard() diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index d36c25d39f..21529579b6 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -3279,9 +3279,9 @@ void Tab::select_preset(std::string preset_name, bool delete_current /*=false*/, const PresetWithVendorProfile new_printer_preset_with_vendor_profile = m_presets->get_preset_with_vendor_profile(new_printer_preset); PrinterTechnology old_printer_technology = m_presets->get_edited_preset().printer_technology(); PrinterTechnology new_printer_technology = new_printer_preset.printer_technology(); - /*if (new_printer_technology == ptSLA && old_printer_technology == ptFFF && !wxGetApp().may_switch_to_SLA_preset(_L("New printer preset selected"))) + if (new_printer_technology == ptSLA && old_printer_technology == ptFFF && !wxGetApp().may_switch_to_SLA_preset(_L("New printer preset selected"))) canceled = true; - else */{ + else { struct PresetUpdate { Preset::Type tab_type; PresetCollection *presets;