diff --git a/src/libslic3r/Format/AMF.cpp b/src/libslic3r/Format/AMF.cpp index 83f931b0c..a9ebca804 100644 --- a/src/libslic3r/Format/AMF.cpp +++ b/src/libslic3r/Format/AMF.cpp @@ -918,12 +918,14 @@ bool store_amf(const char *path, Model *model, const DynamicPrintConfig *config) auto &stl = volume->mesh.stl; if (stl.v_shared == nullptr) stl_generate_shared_vertices(&stl); - for (size_t i = 0; i < stl.stats.shared_vertices; ++ i) { + const Transform3d& matrix = volume->get_matrix(); + for (size_t i = 0; i < stl.stats.shared_vertices; ++i) { stream << " \n"; stream << " \n"; - stream << " " << stl.v_shared[i](0) << "\n"; - stream << " " << stl.v_shared[i](1) << "\n"; - stream << " " << stl.v_shared[i](2) << "\n"; + Vec3d v = matrix * stl.v_shared[i].cast(); + stream << " " << v(0) << "\n"; + stream << " " << v(1) << "\n"; + stream << " " << v(2) << "\n"; stream << " \n"; stream << " \n"; } diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 9c3a29536..a4f3f0f04 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -2173,7 +2173,7 @@ void GLCanvas3D::Selection::render_sidebar_hints(const std::string& sidebar_fiel if (is_single_full_instance()) { ::glTranslated(center(0), center(1), center(2)); - if (boost::starts_with(sidebar_field, "scale") || boost::starts_with(sidebar_field, "size")) + if (!boost::starts_with(sidebar_field, "position")) { Transform3d orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_matrix(true, false, true, true); ::glMultMatrixd(orient_matrix.data()); @@ -2182,9 +2182,7 @@ void GLCanvas3D::Selection::render_sidebar_hints(const std::string& sidebar_fiel else if (is_single_volume() || is_single_modifier()) { Transform3d orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_matrix(true, false, true, true); - const Vec3d& offset = get_bounding_box().center(); - - ::glTranslated(offset(0), offset(1), offset(2)); + ::glTranslated(center(0), center(1), center(2)); ::glMultMatrixd(orient_matrix.data()); } else diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 462f3c328..3e65232f2 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -147,32 +147,29 @@ bool GUI_App::OnInit() wxImage::AddHandler(new wxPNGHandler()); mainframe = new MainFrame(); sidebar().obj_list()->init_objects(); // propagate model objects to object list -// update_mode(); // do that later +// update_mode(); // !!! do that later SetTopWindow(mainframe); m_printhost_job_queue.reset(new PrintHostJobQueue(mainframe->printhost_queue_dlg())); - CallAfter([this]() { - // temporary workaround for the correct behavior of the Scrolled sidebar panel - auto& panel = sidebar(); - if (panel.obj_list()->GetMinHeight() > 200) { - wxWindowUpdateLocker noUpdates_sidebar(&panel); - panel.obj_list()->SetMinSize(wxSize(-1, 200)); -// panel.Layout(); - } - update_mode(); // update view mode after fix of the object_list size - // to correct later layouts - }); - Bind(wxEVT_IDLE, [this](wxIdleEvent& event) { if (app_config->dirty()) app_config->save(); -#if !ENABLE_IMPROVED_SIDEBAR_OBJECTS_MANIPULATION + // ! Temporary workaround for the correct behavior of the Scrolled sidebar panel + // Do this "manipulations" only once ( after (re)create of the application ) + if (sidebar().obj_list()->GetMinHeight() > 200) + { + wxWindowUpdateLocker noUpdates_sidebar(&sidebar()); + sidebar().obj_list()->SetMinSize(wxSize(-1, 200)); + + // !!! to correct later layouts + update_mode(); // update view mode after fix of the object_list size + } + if (this->plater() != nullptr) this->obj_manipul()->update_if_dirty(); -#endif // !ENABLE_IMPROVED_SIDEBAR_OBJECTS_MANIPULATION }); // On OS X the UI tends to freeze in weird ways if modal dialogs(config wizard, update notifications, ...) @@ -275,10 +272,12 @@ void GUI_App::recreate_GUI() { std::cerr << "recreate_GUI" << std::endl; + clear_tabs_list(); + MainFrame* topwindow = dynamic_cast(GetTopWindow()); mainframe = new MainFrame(); sidebar().obj_list()->init_objects(); // propagate model objects to object list -// update_mode(); // do that later + if (topwindow) { SetTopWindow(mainframe); topwindow->Destroy(); @@ -286,18 +285,8 @@ void GUI_App::recreate_GUI() m_printhost_job_queue.reset(new PrintHostJobQueue(mainframe->printhost_queue_dlg())); - CallAfter([this]() { - // temporary workaround for the correct behavior of the Scrolled sidebar panel - auto& panel = sidebar(); - if (panel.obj_list()->GetMinHeight() > 200) { - wxWindowUpdateLocker noUpdates_sidebar(&panel); - panel.obj_list()->SetMinSize(wxSize(-1, 200)); -// panel.Layout(); - } - update_mode(); // update view mode after fix of the object_list size - // to correct later layouts - }); - + load_current_presets(); + mainframe->Show(true); // On OSX the UI was not initialized correctly if the wizard was called @@ -682,13 +671,6 @@ bool GUI_App::checked_tab(Tab* tab) return ret; } -void GUI_App::delete_tab_from_list(Tab* tab) -{ - std::vector::iterator itr = find(tabs_list.begin(), tabs_list.end(), tab); - if (itr != tabs_list.end()) - tabs_list.erase(itr); -} - // Update UI / Tabs to reflect changes in the currently loaded presets void GUI_App::load_current_presets() { @@ -702,6 +684,15 @@ void GUI_App::load_current_presets() } } +void GUI_App::clear_tabs_list() +{ + for (auto tab : tabs_list) { + tab->Destroy(); + tab = nullptr; + } + tabs_list.clear(); +} + #ifdef __APPLE__ // wxWidgets override to get an event on open files. void GUI_App::MacOpenFiles(const wxArrayString &fileNames) diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index c398c449e..a5b96598f 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -133,8 +133,8 @@ public: void add_config_menu(wxMenuBar *menu); bool check_unsaved_changes(); bool checked_tab(Tab* tab); - void delete_tab_from_list(Tab* tab); void load_current_presets(); + void clear_tabs_list(); #ifdef __APPLE__ // wxWidgets override to get an event on open files. diff --git a/src/slic3r/GUI/GUI_ObjectManipulation.cpp b/src/slic3r/GUI/GUI_ObjectManipulation.cpp index 77bf29120..363294ce8 100644 --- a/src/slic3r/GUI/GUI_ObjectManipulation.cpp +++ b/src/slic3r/GUI/GUI_ObjectManipulation.cpp @@ -327,15 +327,14 @@ void ObjectManipulation::update_settings_value(const GLCanvas3D::Selection& sele else reset_settings_value(); -#if ENABLE_IMPROVED_SIDEBAR_OBJECTS_MANIPULATION - update_if_dirty(); -#else m_dirty = true; -#endif // ENABLE_IMPROVED_SIDEBAR_OBJECTS_MANIPULATION } void ObjectManipulation::update_if_dirty() { + if (!m_dirty) + return; + #if ENABLE_IMPROVED_SIDEBAR_OBJECTS_MANIPULATION if (m_cache.move_label_string != _(m_new_move_label_string)+ ":") { @@ -414,9 +413,6 @@ void ObjectManipulation::update_if_dirty() else m_og->disable(); #else - if (! m_dirty) - return; - m_move_Label->SetLabel(_(m_new_move_label_string)); m_rotate_Label->SetLabel(_(m_new_rotate_label_string)); m_scale_Label->SetLabel(_(m_new_scale_label_string)); @@ -446,9 +442,9 @@ void ObjectManipulation::update_if_dirty() m_og->enable(); else m_og->disable(); +#endif // ENABLE_IMPROVED_SIDEBAR_OBJECTS_MANIPULATION m_dirty = false; -#endif // ENABLE_IMPROVED_SIDEBAR_OBJECTS_MANIPULATION } void ObjectManipulation::reset_settings_value() @@ -461,9 +457,7 @@ void ObjectManipulation::reset_settings_value() #if ENABLE_IMPROVED_SIDEBAR_OBJECTS_MANIPULATION m_cache.instance.reset(); #endif // ENABLE_IMPROVED_SIDEBAR_OBJECTS_MANIPULATION -#if !ENABLE_IMPROVED_SIDEBAR_OBJECTS_MANIPULATION m_dirty = true; -#endif // !ENABLE_IMPROVED_SIDEBAR_OBJECTS_MANIPULATION } void ObjectManipulation::change_position_value(const Vec3d& position) diff --git a/src/slic3r/GUI/GUI_ObjectManipulation.hpp b/src/slic3r/GUI/GUI_ObjectManipulation.hpp index d0afa528e..1684a1360 100644 --- a/src/slic3r/GUI/GUI_ObjectManipulation.hpp +++ b/src/slic3r/GUI/GUI_ObjectManipulation.hpp @@ -62,10 +62,8 @@ class ObjectManipulation : public OG_Settings wxStaticText* m_scale_Label = nullptr; wxStaticText* m_rotate_Label = nullptr; -#if !ENABLE_IMPROVED_SIDEBAR_OBJECTS_MANIPULATION // Needs to be updated from OnIdle? bool m_dirty = false; -#endif // !ENABLE_IMPROVED_SIDEBAR_OBJECTS_MANIPULATION // Cached labels for the delayed update, not localized! std::string m_new_move_label_string; std::string m_new_rotate_label_string; @@ -75,7 +73,7 @@ class ObjectManipulation : public OG_Settings Vec3d m_new_scale; Vec3d m_new_size; bool m_new_enabled; - bool m_uniform_scale {false}; + bool m_uniform_scale {true}; PrusaLockButton* m_lock_bnt{ nullptr }; public: diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 46a46e950..f234ca1a4 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -121,6 +121,11 @@ void MainFrame::init_tabpanel() } }); + if (wxGetApp().plater_) { + // before creating a new plater let's delete old one + wxGetApp().plater_->Destroy(); + wxGetApp().plater_ = nullptr; + } m_plater = new Slic3r::GUI::Plater(m_tabpanel, this); wxGetApp().plater_ = m_plater; m_tabpanel->AddPage(m_plater, _(L("Plater"))); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 24471e254..530b64474 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1593,7 +1593,14 @@ void Plater::priv::selection_changed() view3D->enable_toolbar_item("fewer", can_decrease_instances()); view3D->enable_toolbar_item("splitobjects", can_split/*_to_objects*/()); view3D->enable_toolbar_item("splitvolumes", can_split/*_to_volumes*/()); - view3D->enable_toolbar_item("layersediting", layers_height_allowed()); + + // if the selection is not valid to allow for layer editing, we need to turn off the tool if it is running + bool enable_layer_editing = layers_height_allowed(); + if (!enable_layer_editing && view3D->is_layers_editing_enabled()) + on_action_layersediting(SimpleEvent(EVT_GLTOOLBAR_LAYERSEDITING)); + + view3D->enable_toolbar_item("layersediting", enable_layer_editing); + // forces a frame render to update the view (to avoid a missed update if, for example, the context menu appears) view3D->render(); } diff --git a/src/slic3r/GUI/Tab.hpp b/src/slic3r/GUI/Tab.hpp index 9ec54e6eb..e00e87b62 100644 --- a/src/slic3r/GUI/Tab.hpp +++ b/src/slic3r/GUI/Tab.hpp @@ -213,9 +213,7 @@ public: public: Tab(wxNotebook* parent, const wxString& title, const char* name); - ~Tab() { - wxGetApp().delete_tab_from_list(this); - } + ~Tab() {} wxWindow* parent() const { return m_parent; } wxString title() const { return m_title; }