diff --git a/src/libslic3r/Model.cpp b/src/libslic3r/Model.cpp index d75af4ab9..0719cac8c 100644 --- a/src/libslic3r/Model.cpp +++ b/src/libslic3r/Model.cpp @@ -1480,9 +1480,6 @@ stl_stats ModelObject::get_object_stl_stats() const // fill full_stats from all objet's meshes for (ModelVolume* volume : this->volumes) { - if (volume->id() == this->volumes[0]->id()) - continue; - const stl_stats& stats = volume->mesh().stl.stats; // initialize full_stats (for repaired errors) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 9c4a8d2b3..14617d9f4 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1534,9 +1534,8 @@ GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas) , m_retina_helper(nullptr) #endif , m_in_render(false) - , m_main_toolbar(GLToolbar::Normal, "Top") - , m_undoredo_toolbar(GLToolbar::Normal, "Top") - , m_collapse_toolbar(GLToolbar::Normal, "Top") + , m_main_toolbar(GLToolbar::Normal, "Main") + , m_undoredo_toolbar(GLToolbar::Normal, "Undo_Redo") , m_gizmos(*this) , m_use_clipping_planes(false) , m_sidebar_field("") @@ -1914,11 +1913,6 @@ void GLCanvas3D::enable_undoredo_toolbar(bool enable) m_undoredo_toolbar.set_enabled(enable); } -void GLCanvas3D::enable_collapse_toolbar(bool enable) -{ - m_collapse_toolbar.set_enabled(enable); -} - void GLCanvas3D::enable_dynamic_background(bool enable) { m_dynamic_background_enabled = enable; @@ -2112,7 +2106,7 @@ void GLCanvas3D::render() tooltip = m_undoredo_toolbar.get_tooltip(); if (tooltip.empty()) - tooltip = m_collapse_toolbar.get_tooltip(); + tooltip = wxGetApp().plater()->get_collapse_toolbar().get_tooltip(); if (tooltip.empty()) tooltip = wxGetApp().plater()->get_view_toolbar().get_tooltip(); @@ -2854,8 +2848,8 @@ void GLCanvas3D::on_idle(wxIdleEvent& evt) m_dirty |= m_main_toolbar.update_items_state(); m_dirty |= m_undoredo_toolbar.update_items_state(); - m_dirty |= m_collapse_toolbar.update_items_state(); m_dirty |= wxGetApp().plater()->get_view_toolbar().update_items_state(); + m_dirty |= wxGetApp().plater()->get_collapse_toolbar().update_items_state(); bool mouse3d_controller_applied = wxGetApp().plater()->get_mouse3d_controller().apply(wxGetApp().plater()->get_camera()); m_dirty |= mouse3d_controller_applied; @@ -3473,7 +3467,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) return; } - if (m_collapse_toolbar.on_mouse(evt, *this)) + if (wxGetApp().plater()->get_collapse_toolbar().on_mouse(evt, *this)) { if (evt.LeftUp() || evt.MiddleUp() || evt.RightUp()) mouse_up_cleanup(); @@ -4187,7 +4181,7 @@ void GLCanvas3D::update_ui_from_settings() #endif // ENABLE_RETINA_GL bool enable_collapse = wxGetApp().app_config->get("show_collapse_button") == "1"; - enable_collapse_toolbar(enable_collapse); + wxGetApp().plater()->get_collapse_toolbar().set_enabled(enable_collapse); } @@ -5055,51 +5049,7 @@ bool GLCanvas3D::_init_view_toolbar() bool GLCanvas3D::_init_collapse_toolbar() { - if (!m_collapse_toolbar.is_enabled() && m_collapse_toolbar.get_items_count() > 0) - return true; - - BackgroundTexture::Metadata background_data; - background_data.filename = "toolbar_background.png"; - background_data.left = 16; - background_data.top = 16; - background_data.right = 16; - background_data.bottom = 16; - - if (!m_collapse_toolbar.init(background_data)) - { - // unable to init the toolbar texture, disable it - m_collapse_toolbar.set_enabled(false); - return true; - } - - m_collapse_toolbar.set_layout_type(GLToolbar::Layout::Vertical); - m_collapse_toolbar.set_horizontal_orientation(GLToolbar::Layout::HO_Right); - m_collapse_toolbar.set_vertical_orientation(GLToolbar::Layout::VO_Top); - m_collapse_toolbar.set_border(5.0f); - m_collapse_toolbar.set_separator_size(5); - m_collapse_toolbar.set_gap_size(2); - - GLToolbarItem::Data item; - - item.name = "collapse_sidebar"; - item.icon_filename = "collapse.svg"; - item.tooltip = wxGetApp().plater()->is_sidebar_collapsed() ? _utf8(L("Expand right panel")) : _utf8(L("Collapse right panel")); - item.sprite_id = 0; - item.left.action_callback = [this, item]() { - std::string new_tooltip = wxGetApp().plater()->is_sidebar_collapsed() ? - _utf8(L("Collapse right panel")) : _utf8(L("Expand right panel")); - - int id = m_collapse_toolbar.get_item_id("collapse_sidebar"); - m_collapse_toolbar.set_tooltip(id, new_tooltip); - set_tooltip(""); - - wxGetApp().plater()->collapse_sidebar(!wxGetApp().plater()->is_sidebar_collapsed()); - }; - - if (!m_collapse_toolbar.add_item(item)) - return false; - - return true; + return wxGetApp().plater()->init_collapse_toolbar(); } bool GLCanvas3D::_set_current() @@ -5427,20 +5377,21 @@ void GLCanvas3D::_check_and_update_toolbar_icon_scale() const float size = GLToolbar::Default_Icons_Size * scale; // Set current size for all top toolbars. It will be used for next calculations + GLToolbar& collapse_toolbar = wxGetApp().plater()->get_collapse_toolbar(); #if ENABLE_RETINA_GL const float sc = m_retina_helper->get_scale_factor() * scale; m_main_toolbar.set_scale(sc); m_undoredo_toolbar.set_scale(sc); - m_collapse_toolbar.set_scale(sc); + collapse_toolbar.set_scale(sc); size *= m_retina_helper->get_scale_factor(); #else m_main_toolbar.set_icons_size(size); m_undoredo_toolbar.set_icons_size(size); - m_collapse_toolbar.set_icons_size(size); + collapse_toolbar.set_icons_size(size); #endif // ENABLE_RETINA_GL - float top_tb_width = m_main_toolbar.get_width() + m_undoredo_toolbar.get_width() + m_collapse_toolbar.get_width(); - int items_cnt = m_main_toolbar.get_visible_items_cnt() + m_undoredo_toolbar.get_visible_items_cnt() + m_collapse_toolbar.get_visible_items_cnt(); + float top_tb_width = m_main_toolbar.get_width() + m_undoredo_toolbar.get_width() + collapse_toolbar.get_width(); + int items_cnt = m_main_toolbar.get_visible_items_cnt() + m_undoredo_toolbar.get_visible_items_cnt() + collapse_toolbar.get_visible_items_cnt(); float noitems_width = top_tb_width - size * items_cnt; // width of separators and borders in top toolbars // calculate scale needed for items in all top toolbars @@ -5460,7 +5411,6 @@ void GLCanvas3D::_check_and_update_toolbar_icon_scale() const wxGetApp().set_auto_toolbar_icon_scale(new_scale); } - void GLCanvas3D::_render_overlays() const { glsafe(::glDisable(GL_DEPTH_TEST)); @@ -5485,12 +5435,12 @@ void GLCanvas3D::_render_overlays() const const float scale = m_retina_helper->get_scale_factor() * wxGetApp().toolbar_icon_scale(/*true*/); m_main_toolbar.set_scale(scale); m_undoredo_toolbar.set_scale(scale); - m_collapse_toolbar.set_scale(scale); + wxGetApp().plater()->get_collapse_toolbar().set_scale(scale); #else const float size = int(GLToolbar::Default_Icons_Size * wxGetApp().toolbar_icon_scale(/*true*/)); m_main_toolbar.set_icons_size(size); m_undoredo_toolbar.set_icons_size(size); - m_collapse_toolbar.set_icons_size(size); + wxGetApp().plater()->get_collapse_toolbar().set_icons_size(size); #endif // ENABLE_RETINA_GL _render_main_toolbar(); @@ -5594,7 +5544,8 @@ void GLCanvas3D::_render_main_toolbar() const float inv_zoom = (float)wxGetApp().plater()->get_camera().get_inv_zoom(); float top = 0.5f * (float)cnv_size.get_height() * inv_zoom; - float collapse_toolbar_width = m_collapse_toolbar.is_enabled() ? m_collapse_toolbar.get_width() : 0.0f; + const GLToolbar& collapse_toolbar = wxGetApp().plater()->get_collapse_toolbar(); + float collapse_toolbar_width = collapse_toolbar.is_enabled() ? collapse_toolbar.get_width() : 0.0f; float left = -0.5f * (m_main_toolbar.get_width() + m_undoredo_toolbar.get_width() + collapse_toolbar_width) * inv_zoom; m_main_toolbar.set_position(top, left); @@ -5610,7 +5561,8 @@ void GLCanvas3D::_render_undoredo_toolbar() const float inv_zoom = (float)wxGetApp().plater()->get_camera().get_inv_zoom(); float top = 0.5f * (float)cnv_size.get_height() * inv_zoom; - float collapse_toolbar_width = m_collapse_toolbar.is_enabled() ? m_collapse_toolbar.get_width() : 0.0f; + const GLToolbar& collapse_toolbar = wxGetApp().plater()->get_collapse_toolbar(); + float collapse_toolbar_width = collapse_toolbar.is_enabled() ? collapse_toolbar.get_width() : 0.0f; float left = (m_main_toolbar.get_width() - 0.5f * (m_main_toolbar.get_width() + m_undoredo_toolbar.get_width() + collapse_toolbar_width)) * inv_zoom; m_undoredo_toolbar.set_position(top, left); m_undoredo_toolbar.render(*this); @@ -5618,8 +5570,7 @@ void GLCanvas3D::_render_undoredo_toolbar() const void GLCanvas3D::_render_collapse_toolbar() const { - if (!m_collapse_toolbar.is_enabled()) - return; + GLToolbar& collapse_toolbar = wxGetApp().plater()->get_collapse_toolbar(); Size cnv_size = get_canvas_size(); float inv_zoom = (float)wxGetApp().plater()->get_camera().get_inv_zoom(); @@ -5627,10 +5578,10 @@ void GLCanvas3D::_render_collapse_toolbar() const float band = m_layers_editing.is_enabled() ? (wxGetApp().imgui()->get_style_scaling() * LayersEditing::THICKNESS_BAR_WIDTH) : 0.0; float top = 0.5f * (float)cnv_size.get_height() * inv_zoom; - float left = (0.5f * (float)cnv_size.get_width() - (float)m_collapse_toolbar.get_width() - band) * inv_zoom; + float left = (0.5f * (float)cnv_size.get_width() - (float)collapse_toolbar.get_width() - band) * inv_zoom; - m_collapse_toolbar.set_position(top, left); - m_collapse_toolbar.render(*this); + collapse_toolbar.set_position(top, left); + collapse_toolbar.render(*this); } void GLCanvas3D::_render_view_toolbar() const @@ -7164,9 +7115,10 @@ bool GLCanvas3D::_activate_search_toolbar_item() bool GLCanvas3D::_deactivate_collapse_toolbar_items() { - if (m_collapse_toolbar.is_item_pressed("print")) + GLToolbar& collapse_toolbar = wxGetApp().plater()->get_collapse_toolbar(); + if (collapse_toolbar.is_item_pressed("print")) { - m_collapse_toolbar.force_left_action(m_collapse_toolbar.get_item_id("print"), *this); + collapse_toolbar.force_left_action(collapse_toolbar.get_item_id("print"), *this); return true; } diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 2dc8dbecd..c9433a10e 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -452,7 +452,6 @@ private: mutable GLGizmosManager m_gizmos; mutable GLToolbar m_main_toolbar; mutable GLToolbar m_undoredo_toolbar; - mutable GLToolbar m_collapse_toolbar; ClippingPlane m_clipping_planes[2]; mutable ClippingPlane m_camera_clipping_plane; bool m_use_clipping_planes; @@ -588,7 +587,6 @@ public: void enable_selection(bool enable); void enable_main_toolbar(bool enable); void enable_undoredo_toolbar(bool enable); - void enable_collapse_toolbar(bool enable); void enable_dynamic_background(bool enable); void enable_labels(bool enable) { m_labels.enable(enable); } #if ENABLE_SLOPE_RENDERING diff --git a/src/slic3r/GUI/GLToolbar.cpp b/src/slic3r/GUI/GLToolbar.cpp index 59401b11a..4ab282b06 100644 --- a/src/slic3r/GUI/GLToolbar.cpp +++ b/src/slic3r/GUI/GLToolbar.cpp @@ -1238,7 +1238,7 @@ bool GLToolbar::generate_icons_texture() const } std::vector> states; - if (m_name == "Top") + if (m_type == Normal) { states.push_back({ 1, false }); // Normal states.push_back({ 0, false }); // Pressed @@ -1247,7 +1247,7 @@ bool GLToolbar::generate_icons_texture() const states.push_back({ 0, false }); // HoverPressed states.push_back({ 2, false }); // HoverDisabled } - else if (m_name == "View") + else { states.push_back({ 1, false }); // Normal states.push_back({ 1, true }); // Pressed diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index b8f596e6b..c11ed66ab 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -2506,7 +2506,6 @@ void ObjectList::merge(bool to_multipart_object) // all objects, created from the instances will be added to the end of list int new_objects_cnt = 0; // count of this new objects -// std::vector obj_idxs; for (auto map_item : sel_map) { @@ -2569,22 +2568,45 @@ void ObjectList::merge(bool to_multipart_object) new_object->name = _u8L("Merged"); DynamicPrintConfig* config = &new_object->config; - int frst_obj_idx = obj_idxs.front(); - const Vec3d& main_offset = (*m_objects)[frst_obj_idx]->instances[0]->get_offset(); - for (int obj_idx : obj_idxs) { ModelObject* object = (*m_objects)[obj_idx]; - Vec3d offset = object->instances[0]->get_offset(); - if (object->id() == (*m_objects)[frst_obj_idx]->id()) - new_object->add_instance(*object->instances[0]); + const Geometry::Transformation& transformation = object->instances[0]->get_transformation(); + Vec3d scale = transformation.get_scaling_factor(); + Vec3d mirror = transformation.get_mirror(); + Vec3d rotation = transformation.get_rotation(); + + if (object->id() == (*m_objects)[obj_idxs.front()]->id()) + new_object->add_instance(); + Transform3d volume_offset_correction = new_object->instances[0]->get_transformation().get_matrix().inverse() * transformation.get_matrix(); + + // merge volumes + for (const ModelVolume* volume : object->volumes) { + ModelVolume* new_volume = new_object->add_volume(*volume); + + //set rotation + Vec3d vol_rot = new_volume->get_rotation() + rotation; + new_volume->set_rotation(vol_rot); + + // set scale + Vec3d vol_sc_fact = new_volume->get_scaling_factor().cwiseProduct(scale); + new_volume->set_scaling_factor(vol_sc_fact); + + // set mirror + Vec3d vol_mirror = new_volume->get_mirror().cwiseProduct(mirror); + new_volume->set_mirror(vol_mirror); + + // set offset + Vec3d vol_offset = volume_offset_correction* new_volume->get_offset(); + new_volume->set_offset(vol_offset); + } + + // merge settings auto new_opt_keys = config->keys(); - const DynamicPrintConfig& from_config = object->config; auto opt_keys = from_config.keys(); - // merge settings for (auto& opt_key : opt_keys) { if (find(new_opt_keys.begin(), new_opt_keys.end(), opt_key) == new_opt_keys.end()) { const ConfigOption* option = from_config.option(opt_key); @@ -2596,18 +2618,11 @@ void ObjectList::merge(bool to_multipart_object) config->set_key_value(opt_key, option->clone()); } } - - // merge volumes - for (const ModelVolume* volume : object->volumes) { - ModelVolume* new_volume = new_object->add_volume(*volume); - Vec3d vol_offset = offset - main_offset + new_volume->get_offset(); - new_volume->set_offset(vol_offset); - } // save extruder value if it was set if (object->volumes.size() == 1 && find(opt_keys.begin(), opt_keys.end(), "extruder") != opt_keys.end()) { ModelVolume* volume = new_object->volumes.back(); const ConfigOption* option = from_config.option("extruder"); - if (option) + if (option) volume->config.set_key_value("extruder", option->clone()); } diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index 5084a7052..51f5c8d2d 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -68,7 +68,6 @@ bool View3D::init(wxWindow* parent, Model* model, DynamicPrintConfig* config, Ba m_canvas->enable_selection(true); m_canvas->enable_main_toolbar(true); m_canvas->enable_undoredo_toolbar(true); - m_canvas->enable_collapse_toolbar(true); m_canvas->enable_labels(true); #if ENABLE_SLOPE_RENDERING m_canvas->enable_slope(true); @@ -222,7 +221,6 @@ bool Preview::init(wxWindow* parent, Model* model) m_canvas->set_process(m_process); m_canvas->enable_legend_texture(true); m_canvas->enable_dynamic_background(true); - m_canvas->enable_collapse_toolbar(true); m_double_slider_sizer = new wxBoxSizer(wxHORIZONTAL); create_double_slider(); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 34b151a93..3e264fcc1 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1589,6 +1589,7 @@ struct Plater::priv Mouse3DController mouse3d_controller; View3D* view3D; GLToolbar view_toolbar; + GLToolbar collapse_toolbar; Preview *preview; BackgroundSlicingProcess background_process; @@ -1683,6 +1684,7 @@ struct Plater::priv void reset_canvas_volumes(); bool init_view_toolbar(); + bool init_collapse_toolbar(); void reset_all_gizmos(); void update_ui_from_settings(); @@ -1878,6 +1880,7 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) , m_ui_jobs(this) , delayed_scene_refresh(false) , view_toolbar(GLToolbar::Radio, "View") + , collapse_toolbar(GLToolbar::Normal, "Collapse") , m_project_filename(wxEmptyString) { this->q->SetFont(Slic3r::GUI::wxGetApp().normal_font()); @@ -3922,6 +3925,51 @@ bool Plater::priv::init_view_toolbar() return true; } +bool Plater::priv::init_collapse_toolbar() +{ + if (collapse_toolbar.get_items_count() > 0) + // already initialized + return true; + + BackgroundTexture::Metadata background_data; + background_data.filename = "toolbar_background.png"; + background_data.left = 16; + background_data.top = 16; + background_data.right = 16; + background_data.bottom = 16; + + if (!collapse_toolbar.init(background_data)) + return false; + + collapse_toolbar.set_layout_type(GLToolbar::Layout::Vertical); + collapse_toolbar.set_horizontal_orientation(GLToolbar::Layout::HO_Right); + collapse_toolbar.set_vertical_orientation(GLToolbar::Layout::VO_Top); + collapse_toolbar.set_border(5.0f); + collapse_toolbar.set_separator_size(5); + collapse_toolbar.set_gap_size(2); + + GLToolbarItem::Data item; + + item.name = "collapse_sidebar"; + item.icon_filename = "collapse.svg"; + item.tooltip = wxGetApp().plater()->is_sidebar_collapsed() ? _utf8(L("Expand right panel")) : _utf8(L("Collapse right panel")); + item.sprite_id = 0; + item.left.action_callback = [this, item]() { + std::string new_tooltip = wxGetApp().plater()->is_sidebar_collapsed() ? + _utf8(L("Collapse right panel")) : _utf8(L("Expand right panel")); + + int id = collapse_toolbar.get_item_id("collapse_sidebar"); + collapse_toolbar.set_tooltip(id, new_tooltip); + + wxGetApp().plater()->collapse_sidebar(!wxGetApp().plater()->is_sidebar_collapsed()); + }; + + if (!collapse_toolbar.add_item(item)) + return false; + + return true; +} + bool Plater::priv::can_set_instance_to_object() const { const int obj_idx = get_selected_object_idx(); @@ -5531,6 +5579,11 @@ bool Plater::init_view_toolbar() return p->init_view_toolbar(); } +bool Plater::init_collapse_toolbar() +{ + return p->init_collapse_toolbar(); +} + const Camera& Plater::get_camera() const { return p->camera; @@ -5574,6 +5627,16 @@ GLToolbar& Plater::get_view_toolbar() return p->view_toolbar; } +const GLToolbar& Plater::get_collapse_toolbar() const +{ + return p->collapse_toolbar; +} + +GLToolbar& Plater::get_collapse_toolbar() +{ + return p->collapse_toolbar; +} + const Mouse3DController& Plater::get_mouse3d_controller() const { return p->mouse3d_controller; diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index 10b6b354e..5d60e006b 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -315,6 +315,7 @@ public: void sys_color_changed(); bool init_view_toolbar(); + bool init_collapse_toolbar(); const Camera& get_camera() const; Camera& get_camera(); @@ -330,6 +331,9 @@ public: const GLToolbar& get_view_toolbar() const; GLToolbar& get_view_toolbar(); + const GLToolbar& get_collapse_toolbar() const; + GLToolbar& get_collapse_toolbar(); + const Mouse3DController& get_mouse3d_controller() const; Mouse3DController& get_mouse3d_controller();