diff --git a/src/slic3r/GUI/3DScene.cpp b/src/slic3r/GUI/3DScene.cpp index b2c2a52f16..ccaa92e5cd 100644 --- a/src/slic3r/GUI/3DScene.cpp +++ b/src/slic3r/GUI/3DScene.cpp @@ -224,6 +224,7 @@ GLVolume::GLVolume(float r, float g, float b, float a) , partly_inside(false) , hover(HS_None) , is_modifier(false) + , slice_error(false) , is_wipe_tower(false) , is_extrusion_path(false) , force_transparent(false) @@ -999,7 +1000,8 @@ void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, #endif // ENABLE_ENVIRONMENT_MAP glcheck(); - volume.first->model.set_color(volume.first->render_color); + auto red_color = ColorRGBA{1.0f, 0.0f, 0.0f, 1.0f};//slice_error + volume.first->model.set_color(volume.first->slice_error ? red_color : volume.first->render_color); const Transform3d model_matrix = volume.first->world_matrix(); shader->set_uniform("view_model_matrix", view_matrix * model_matrix); shader->set_uniform("projection_matrix", projection_matrix); diff --git a/src/slic3r/GUI/3DScene.hpp b/src/slic3r/GUI/3DScene.hpp index 3c856bc8a7..0546261168 100644 --- a/src/slic3r/GUI/3DScene.hpp +++ b/src/slic3r/GUI/3DScene.hpp @@ -216,6 +216,8 @@ public: bool force_sinking_contours : 1; // Is render for picking bool picking : 1; + // slice error + bool slice_error : 1; }; // Is mouse or rectangle selection over this object to select/deselect it ? diff --git a/src/slic3r/GUI/GCodeViewer.hpp b/src/slic3r/GUI/GCodeViewer.hpp index bdc8c94c11..b3bd678607 100644 --- a/src/slic3r/GUI/GCodeViewer.hpp +++ b/src/slic3r/GUI/GCodeViewer.hpp @@ -377,16 +377,6 @@ class GCodeViewer } }; - // helper to render shells - struct Shells - { - GLVolumeCollection volumes; - bool visible{ false }; - //BBS: always load shell when preview - int print_id{ -1 }; - int print_modify_count { -1 }; - bool previewing{ false }; - }; // helper to render extrusion paths struct Extrusions @@ -733,11 +723,21 @@ public: LayerTimeLog, Count }; - + // helper to render shells + struct Shells + { + GLVolumeCollection volumes; + bool visible{false}; + // BBS: always load shell when preview + int print_id{-1}; + int print_modify_count{-1}; + bool previewing{false}; + }; //BBS ConflictResultOpt m_conflict_result; GCodeCheckResult m_gcode_check_result; FilamentPrintableResult filament_printable_reuslt; + Shells m_shells; private: std::vector m_plater_extruder; @@ -780,7 +780,7 @@ private: SequentialView m_sequential_view; IMSlider* m_moves_slider; IMSlider* m_layers_slider; - Shells m_shells; + /*BBS GUI refactor, store displayed items in color scheme combobox */ std::vector view_type_items; std::vector view_type_items_str; diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 6ba3d23b83..fd52eefbc1 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -9755,15 +9755,34 @@ void GLCanvas3D::_set_warning_notification(EWarning warning, bool state) } int extruder_id = error_iter->first + 1; std::string filaments; + std::vector slice_error_object_idxs; for (size_t i = 0; i < error_iter->second.size(); ++i) { if (i > 0) { filaments += ", "; } int filament_id = error_iter->second[i].first; int object_label_id = error_iter->second[i].second; - // todo: display the conflict objects + //ModelObject* object->instances[0]->get_labeled_id(); filaments += std::to_string(filament_id); + for (int object_idx = 0; object_idx < (int) m_model->objects.size(); ++object_idx) { + const ModelObject *model_object = m_model->objects[object_idx]; + for (int instance_idx = 0; instance_idx < (int) model_object->instances.size(); ++instance_idx) { + const ModelInstance *model_instance = model_object->instances[instance_idx]; + auto expect_id = model_instance->get_labeled_id(); + if (object_label_id == expect_id) { + slice_error_object_idxs.emplace_back(object_idx); + } + } + } + } + for (GLVolume *volume : m_gcode_viewer.m_shells.volumes.volumes) { + for (auto obj_idx : slice_error_object_idxs) { + if (volume->object_idx() == obj_idx) { + volume->slice_error = true; + volume->selected = true; + } + } } std::string extruder_name = extruder_id == master_extruder_id ? "Left extruder" : "Right extruder"; if (error_iter->second.size() == 1) {