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; }