From ae692635dabb82bbb3710b14dd63d7a41951a888 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Thu, 18 Apr 2019 09:59:17 +0200 Subject: [PATCH 01/47] Selection rectangle moved into a separate class --- src/slic3r/CMakeLists.txt | 2 + src/slic3r/GUI/GLSelectionRectangle.cpp | 116 +++++++++++++++++++ src/slic3r/GUI/GLSelectionRectangle.hpp | 49 ++++++++ src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 108 +++++------------ src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp | 14 +-- 5 files changed, 198 insertions(+), 91 deletions(-) create mode 100644 src/slic3r/GUI/GLSelectionRectangle.cpp create mode 100644 src/slic3r/GUI/GLSelectionRectangle.hpp diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index 1d8a1e26e..f54189762 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -47,6 +47,8 @@ set(SLIC3R_GUI_SOURCES GUI/Gizmos/GLGizmoFlatten.hpp GUI/Gizmos/GLGizmoCut.cpp GUI/Gizmos/GLGizmoCut.hpp + GUI/GLSelectionRectangle.cpp + GUI/GLSelectionRectangle.hpp GUI/GLTexture.hpp GUI/GLTexture.cpp GUI/GLToolbar.hpp diff --git a/src/slic3r/GUI/GLSelectionRectangle.cpp b/src/slic3r/GUI/GLSelectionRectangle.cpp new file mode 100644 index 000000000..a908d13ec --- /dev/null +++ b/src/slic3r/GUI/GLSelectionRectangle.cpp @@ -0,0 +1,116 @@ +#include "GLSelectionRectangle.hpp" +#include "Camera.hpp" +#include "3DScene.hpp" + +#include + +namespace Slic3r { +namespace GUI { + +void GLSelectionRectangle::start_dragging(const Vec2d& mouse_position, float width, float height, EState status) +{ + if (is_active() || status==Off) + return; + + m_width = width; + m_height = height; + m_status = status; + m_start_corner = mouse_position; + m_end_corner = mouse_position; +} + + + +void GLSelectionRectangle::dragging(const Vec2d& mouse_position) +{ + if (is_active()) + m_end_corner = mouse_position; +} + + + +std::vector GLSelectionRectangle::end_dragging(const Camera& camera, const std::vector& points) +{ + if (!is_active()) + return std::vector(); + + m_status = Off; + std::vector out; + + const std::array& viewport = camera.get_viewport(); + const Transform3d& modelview_matrix = camera.get_view_matrix(); + const Transform3d& projection_matrix = camera.get_projection_matrix(); + + // bounding box created from the rectangle corners - will take care of order of the corners + BoundingBox rectangle(Points{Point(m_start_corner.cast()), Point(m_end_corner.cast())}); + + // Iterate over all points and determine whether they're in the rectangle. + for (unsigned int i=0; i end_dragging(const Camera& camera, const std::vector& points); + + void render() const; + + bool is_active() const { return m_status != Off; } + EState get_status() const { return m_status; } + + + +private: + EState m_status = Off; + Vec2d m_start_corner; + Vec2d m_end_corner; + float m_width; + float m_height; +}; + + +} // namespace GUI +} // namespace Slic3r + + +#endif // slic3r_GLGizmoSlaSupports_hpp_ diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index e8fe32688..b31eb272b 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -100,7 +100,7 @@ void GLGizmoSlaSupports::on_render(const Selection& selection) const if (m_quadric != nullptr && selection.is_from_single_instance()) render_points(selection, false); - render_selection_rectangle(); + m_selection_rectangle.render(); render_clipping_plane(selection); glsafe(::glDisable(GL_BLEND)); @@ -240,52 +240,6 @@ void GLGizmoSlaSupports::render_clipping_plane(const Selection& selection) const } - -void GLGizmoSlaSupports::render_selection_rectangle() const -{ - if (m_selection_rectangle_status == srOff) - return; - - glsafe(::glLineWidth(1.5f)); - float render_color[3] = {0.f, 1.f, 0.f}; - if (m_selection_rectangle_status == srDeselect) { - render_color[0] = 1.f; - render_color[1] = 0.3f; - render_color[2] = 0.3f; - } - glsafe(::glColor3fv(render_color)); - - glsafe(::glPushAttrib(GL_TRANSFORM_BIT)); // remember current MatrixMode - - glsafe(::glMatrixMode(GL_MODELVIEW)); // cache modelview matrix and set to identity - glsafe(::glPushMatrix()); - glsafe(::glLoadIdentity()); - - glsafe(::glMatrixMode(GL_PROJECTION)); // cache projection matrix and set to identity - glsafe(::glPushMatrix()); - glsafe(::glLoadIdentity()); - - glsafe(::glOrtho(0.f, m_canvas_width, m_canvas_height, 0.f, -1.f, 1.f)); // set projection matrix so that world coords = window coords - - // render the selection rectangle (window coordinates): - glsafe(::glPushAttrib(GL_ENABLE_BIT)); - glsafe(::glLineStipple(4, 0xAAAA)); - glsafe(::glEnable(GL_LINE_STIPPLE)); - - ::glBegin(GL_LINE_LOOP); - ::glVertex3f((GLfloat)m_selection_rectangle_start_corner(0), (GLfloat)m_selection_rectangle_start_corner(1), (GLfloat)0.5f); - ::glVertex3f((GLfloat)m_selection_rectangle_end_corner(0), (GLfloat)m_selection_rectangle_start_corner(1), (GLfloat)0.5f); - ::glVertex3f((GLfloat)m_selection_rectangle_end_corner(0), (GLfloat)m_selection_rectangle_end_corner(1), (GLfloat)0.5f); - ::glVertex3f((GLfloat)m_selection_rectangle_start_corner(0), (GLfloat)m_selection_rectangle_end_corner(1), (GLfloat)0.5f); - glsafe(::glEnd()); - glsafe(::glPopAttrib()); - - glsafe(::glPopMatrix()); // restore former projection matrix - glsafe(::glMatrixMode(GL_MODELVIEW)); - glsafe(::glPopMatrix()); // restore former modelview matrix - glsafe(::glPopAttrib()); // restore former MatrixMode -} - void GLGizmoSlaSupports::on_render_for_picking(const Selection& selection) const { glsafe(::glEnable(GL_DEPTH_TEST)); @@ -513,11 +467,9 @@ bool GLGizmoSlaSupports::gizmo_event(SLAGizmoEventType action, const Vec2d& mous if (action == SLAGizmoEventType::LeftDown && (shift_down || alt_down || control_down)) { if (m_hover_id == -1) { if (shift_down || alt_down) { - m_selection_rectangle_status = shift_down ? srSelect : srDeselect; - m_selection_rectangle_start_corner = mouse_position; - m_selection_rectangle_end_corner = mouse_position; - m_canvas_width = m_parent.get_canvas_size().get_width(); - m_canvas_height = m_parent.get_canvas_size().get_height(); + Size size = m_parent.get_canvas_size(); + m_selection_rectangle.start_dragging(mouse_position, size.get_width(), size.get_height(), + shift_down ? GLSelectionRectangle::SlaSelect : GLSelectionRectangle::SlaDeselect); } } else { @@ -533,7 +485,7 @@ bool GLGizmoSlaSupports::gizmo_event(SLAGizmoEventType action, const Vec2d& mous } // left down without selection rectangle - place point on the mesh: - if (action == SLAGizmoEventType::LeftDown && m_selection_rectangle_status == srOff && !shift_down) { + if (action == SLAGizmoEventType::LeftDown && !m_selection_rectangle.is_active() && !shift_down) { // If any point is in hover state, this should initiate its move - return control back to GLCanvas: if (m_hover_id != -1) return false; @@ -558,38 +510,36 @@ bool GLGizmoSlaSupports::gizmo_event(SLAGizmoEventType action, const Vec2d& mous } // left up with selection rectangle - select points inside the rectangle: - if ((action == SLAGizmoEventType::LeftUp || action == SLAGizmoEventType::ShiftUp || action == SLAGizmoEventType::AltUp) && m_selection_rectangle_status != srOff) { - const Transform3d& instance_matrix = m_model_object->instances[m_active_instance]->get_transformation().get_matrix(); - const Camera& camera = m_parent.get_camera(); - const std::array& viewport = camera.get_viewport(); - const Transform3d& modelview_matrix = camera.get_view_matrix(); - const Transform3d& projection_matrix = camera.get_projection_matrix(); + if ((action == SLAGizmoEventType::LeftUp || action == SLAGizmoEventType::ShiftUp || action == SLAGizmoEventType::AltUp) && m_selection_rectangle.is_active()) { + // Is this a selection or deselection rectangle? + GLSelectionRectangle::EState rectangle_status = m_selection_rectangle.get_status(); + // First collect positions of all the points in world coordinates. + const Transform3d& instance_matrix = m_model_object->instances[m_active_instance]->get_transformation().get_matrix(); + std::vector points; + for (unsigned int i=0; i()); + points.back()(2) += m_z_shift; + } + // Now ask the rectangle which of the points are inside. + const Camera& camera = m_parent.get_camera(); + std::vector selected_idxs = m_selection_rectangle.end_dragging(camera, points); + + // we'll recover current look direction (in world coords) and transform it to model coords. const Selection& selection = m_parent.get_selection(); const GLVolume* volume = selection.get_volume(*selection.get_volume_idxs().begin()); - - // bounding box created from the rectangle corners - will take care of order of the corners - BoundingBox rectangle(Points{Point(m_selection_rectangle_start_corner.cast()), Point(m_selection_rectangle_end_corner.cast())}); - const Transform3d& instance_matrix_no_translation_no_scaling = volume->get_instance_transformation().get_matrix(true,false,true); - - // we'll recover current look direction from the modelview matrix (in world coords)... Vec3f direction_to_camera = camera.get_dir_forward().cast(); - // ...and transform it to model coords. Vec3f direction_to_camera_mesh = (instance_matrix_no_translation_no_scaling.inverse().cast() * direction_to_camera).normalized().eval(); Vec3f scaling = volume->get_instance_scaling_factor().cast(); direction_to_camera_mesh = Vec3f(direction_to_camera_mesh(0)*scaling(0), direction_to_camera_mesh(1)*scaling(1), direction_to_camera_mesh(2)*scaling(2)); - // Iterate over all points, check if they're in the rectangle and if so, check that they are not obscured by the mesh: - for (unsigned int i=0; i() * support_point.pos; - pos(2) += m_z_shift; - GLdouble out_x, out_y, out_z; - ::gluProject((GLdouble)pos(0), (GLdouble)pos(1), (GLdouble)pos(2), (GLdouble*)modelview_matrix.data(), (GLdouble*)projection_matrix.data(), (GLint*)viewport.data(), &out_x, &out_y, &out_z); - out_y = m_canvas_height - out_y; - - if (rectangle.contains(Point(out_x, out_y)) && !is_point_clipped(support_point.pos.cast())) { + if (!is_point_clipped(support_point.pos.cast())) { bool is_obscured = false; // Cast a ray in the direction of the camera and look for intersection with the mesh: std::vector hits; @@ -627,14 +577,13 @@ bool GLGizmoSlaSupports::gizmo_event(SLAGizmoEventType action, const Vec2d& mous } if (!is_obscured) { - if (m_selection_rectangle_status == srDeselect) + if (rectangle_status == GLSelectionRectangle::SlaDeselect) unselect_point(i); else select_point(i); } } } - m_selection_rectangle_status = srOff; return true; } @@ -652,9 +601,8 @@ bool GLGizmoSlaSupports::gizmo_event(SLAGizmoEventType action, const Vec2d& mous return true; // point has been placed and the button not released yet // this prevents GLCanvas from starting scene rotation - if (m_selection_rectangle_status != srOff) { - m_selection_rectangle_end_corner = mouse_position; - m_selection_rectangle_status = shift_down ? srSelect : srDeselect; + if (m_selection_rectangle.is_active()) { + m_selection_rectangle.dragging(mouse_position); return true; } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp index eaf0932c4..92d80b6eb 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp @@ -3,6 +3,7 @@ #include "GLGizmoBase.hpp" #include "GLGizmos.hpp" +#include "slic3r/GUI/GLSelectionRectangle.hpp" // There is an L function in igl that would be overridden by our localization macro - let's undefine it... #undef L @@ -73,7 +74,7 @@ private: virtual void on_render(const Selection& selection) const; virtual void on_render_for_picking(const Selection& selection) const; - void render_selection_rectangle() const; + //void render_selection_rectangle() const; void render_points(const Selection& selection, bool picking = false) const; void render_clipping_plane(const Selection& selection) const; bool is_mesh_update_necessary() const; @@ -91,20 +92,11 @@ private: mutable Vec3d m_old_clipping_plane_normal; mutable Vec3d m_clipping_plane_normal = Vec3d::Zero(); - enum SelectionRectangleStatus { - srOff = 0, - srSelect = 1, - srDeselect = 2 - }m_selection_rectangle_status = srOff; - - Vec2d m_selection_rectangle_start_corner; - Vec2d m_selection_rectangle_end_corner; + GLSelectionRectangle m_selection_rectangle; bool m_wait_for_up_event = false; bool m_unsaved_changes = false; // Are there unsaved changes in manual mode? bool m_selection_empty = true; EState m_old_state = Off; // to be able to see that the gizmo has just been closed (see on_set_state) - int m_canvas_width; - int m_canvas_height; mutable std::unique_ptr m_tms; mutable std::unique_ptr m_supports_tms; From 203e9e848c1c11770efe642e660f5c3791685e38 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Wed, 24 Apr 2019 13:33:05 +0200 Subject: [PATCH 02/47] Changed Manipulation panel. (Simple mode)There is exclamation mark icon next for the object name, if it has errors. + some code refactoring --- src/slic3r/GUI/GUI_ObjectList.cpp | 185 +++++++++++++++------- src/slic3r/GUI/GUI_ObjectList.hpp | 12 +- src/slic3r/GUI/GUI_ObjectManipulation.cpp | 46 +++++- src/slic3r/GUI/GUI_ObjectManipulation.hpp | 5 + 4 files changed, 183 insertions(+), 65 deletions(-) diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index f8ad8b7bb..b16198d19 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -193,6 +193,106 @@ void ObjectList::create_popup_menus() create_instance_popupmenu(&m_menu_instance); } +void ObjectList::get_selected_item_indexes(int& obj_idx, int& vol_idx, const wxDataViewItem& input_item/* = wxDataViewItem(0)*/) +{ + const wxDataViewItem item = input_item == wxDataViewItem(0) ? GetSelection() : input_item; + + if (!item) + { + obj_idx = vol_idx = -1; + return; + } + + const ItemType type = m_objects_model->GetItemType(item); + + obj_idx = type & itObject ? m_objects_model->GetIdByItem(item) : + type & itVolume ? m_objects_model->GetIdByItem(m_objects_model->GetTopParent(item)) : -1; + + vol_idx = type & itVolume ? m_objects_model->GetVolumeIdByItem(item) : -1; +} + +int ObjectList::get_mesh_errors_count(const int obj_idx, const int vol_idx /*= -1*/) const +{ + if (obj_idx < 0) + return 0; + + int errors = 0; + + std::vector volumes; + if (vol_idx == -1) + volumes = (*m_objects)[obj_idx]->volumes; + else + volumes.emplace_back((*m_objects)[obj_idx]->volumes[vol_idx]); + + for (ModelVolume* volume : volumes) + { + const stl_stats& stats = volume->mesh.stl.stats; + + errors += stats.degenerate_facets + stats.edges_fixed + stats.facets_removed + + stats.facets_added + stats.facets_reversed + stats.backwards_edges; + } + + return errors; +} + +wxString ObjectList::get_mesh_errors_list(const int obj_idx, const int vol_idx /*= -1*/) const +{ + const int errors = get_mesh_errors_count(obj_idx, vol_idx); + + if (errors == 0) + return ""; // hide tooltip + + // Create tooltip string, if there are errors + wxString tooltip = wxString::Format(_(L("Auto-repaired (%d errors):\n")), errors); + + std::vector volumes; + if (vol_idx == -1) + volumes = (*m_objects)[obj_idx]->volumes; + else + volumes.emplace_back((*m_objects)[obj_idx]->volumes[vol_idx]); + + std::map error_msg = { + {L("degenerate facets") , 0}, + {L("edges fixed") , 0}, + {L("facets removed") , 0}, + {L("facets added") , 0}, + {L("facets reversed") , 0}, + {L("backwards edges") , 0} + }; + + for (ModelVolume* volume : volumes) + { + const stl_stats& stats = volume->mesh.stl.stats; + + error_msg[L("degenerate facets")] += stats.degenerate_facets; + error_msg[L("edges fixed")] += stats.edges_fixed; + error_msg[L("facets removed")] += stats.facets_removed; + error_msg[L("facets added")] += stats.facets_added; + error_msg[L("facets reversed")] += stats.facets_reversed; + error_msg[L("backwards edges")] += stats.backwards_edges; + } + + for (const auto& error : error_msg) + if (error.second > 0) + tooltip += wxString::Format(_("\t%d %s\n"), error.second, error.first); + + if (is_windows10()) + tooltip += _(L("Right button click the icon to fix STL through Netfabb")); + + return tooltip; +} + +wxString ObjectList::get_mesh_errors_list() +{ + if (!GetSelection()) + return ""; + + int obj_idx, vol_idx; + get_selected_item_indexes(obj_idx, vol_idx); + + return get_mesh_errors_list(obj_idx, vol_idx); +} + void ObjectList::set_tooltip_for_item(const wxPoint& pt) { wxDataViewItem item; @@ -202,38 +302,11 @@ void ObjectList::set_tooltip_for_item(const wxPoint& pt) if (col->GetTitle() == " " && GetSelectedItemsCount()<2) GetMainWindow()->SetToolTip(_(L("Right button click the icon to change the object settings"))); - else if (col->GetTitle() == _("Name") && - m_objects_model->GetBitmap(item).GetRefData() == m_bmp_manifold_warning.GetRefData()) { - int obj_idx = m_objects_model->GetIdByItem(item); - auto& stats = (*m_objects)[obj_idx]->volumes[0]->mesh.stl.stats; - int errors = stats.degenerate_facets + stats.edges_fixed + stats.facets_removed + - stats.facets_added + stats.facets_reversed + stats.backwards_edges; - - wxString tooltip = wxString::Format(_(L("Auto-repaired (%d errors):\n")), errors); - - std::map error_msg; - error_msg[L("degenerate facets")] = stats.degenerate_facets; - error_msg[L("edges fixed")] = stats.edges_fixed; - error_msg[L("facets removed")] = stats.facets_removed; - error_msg[L("facets added")] = stats.facets_added; - error_msg[L("facets reversed")] = stats.facets_reversed; - error_msg[L("backwards edges")] = stats.backwards_edges; - - for (auto error : error_msg) - { - if (error.second > 0) - tooltip += wxString::Format(_("\t%d %s\n"), error.second, error.first); - } -// OR -// tooltip += wxString::Format(_(L("%d degenerate facets, %d edges fixed, %d facets removed, " -// "%d facets added, %d facets reversed, %d backwards edges")), -// stats.degenerate_facets, stats.edges_fixed, stats.facets_removed, -// stats.facets_added, stats.facets_reversed, stats.backwards_edges); - - if (is_windows10()) - tooltip += _(L("Right button click the icon to fix STL through Netfabb")); - - GetMainWindow()->SetToolTip(tooltip); + else if (col->GetTitle() == _("Name") ) + { + int obj_idx, vol_idx; + get_selected_item_indexes(obj_idx, vol_idx, item); + GetMainWindow()->SetToolTip(get_mesh_errors_list(obj_idx, vol_idx)); } else GetMainWindow()->SetToolTip(""); // hide tooltip @@ -533,10 +606,12 @@ void ObjectList::OnContextMenu(wxDataViewEvent&) if (title == " ") show_context_menu(); - else if (title == _("Name") && pt.x >15 && - m_objects_model->GetBitmap(item).GetRefData() == m_bmp_manifold_warning.GetRefData()) + else if (title == _("Name") && pt.x > 1.6f*wxGetApp().em_unit() && pt.x < 3.2f*wxGetApp().em_unit()) { - if (is_windows10()) + int obj_idx, vol_idx; + get_selected_item_indexes(obj_idx, vol_idx, item); + + if (is_windows10() && get_mesh_errors_count(obj_idx, vol_idx) > 0) fix_through_netfabb(); } @@ -1729,6 +1804,7 @@ void ObjectList::parts_changed(int obj_idx) void ObjectList::part_selection_changed() { int obj_idx = -1; + int volume_id = -1; m_config = nullptr; wxString og_name = wxEmptyString; @@ -1775,7 +1851,7 @@ void ObjectList::part_selection_changed() } else if (m_objects_model->GetItemType(item) == itVolume) { og_name = _(L("Part manipulation")); - const auto volume_id = m_objects_model->GetVolumeIdByItem(item); + volume_id = m_objects_model->GetVolumeIdByItem(item); m_config = &(*m_objects)[obj_idx]->volumes[volume_id]->config; update_and_show_manipulations = true; } @@ -1795,7 +1871,11 @@ void ObjectList::part_selection_changed() if (update_and_show_manipulations) { wxGetApp().obj_manipul()->get_og()->set_name(" " + og_name + " "); - wxGetApp().obj_manipul()->get_og()->set_value("object_name", m_objects_model->GetName(GetSelection())); + + if (item) { + wxGetApp().obj_manipul()->get_og()->set_value("object_name", m_objects_model->GetName(item)); + wxGetApp().obj_manipul()->update_manifold_warning_icon_state(get_mesh_errors_list(obj_idx, volume_id)); + } } if (update_and_show_settings) @@ -1815,16 +1895,13 @@ void ObjectList::part_selection_changed() void ObjectList::add_object_to_list(size_t obj_idx) { auto model_object = (*m_objects)[obj_idx]; - wxString item_name = from_u8(model_object->name); + const wxString& item_name = from_u8(model_object->name); const auto item = m_objects_model->Add(item_name, !model_object->config.has("extruder") ? 0 : model_object->config.option("extruder")->value); // Add error icon if detected auto-repaire - auto stats = model_object->volumes[0]->mesh.stl.stats; - int errors = stats.degenerate_facets + stats.edges_fixed + stats.facets_removed + - stats.facets_added + stats.facets_reversed + stats.backwards_edges; - if (errors > 0) { + if (get_mesh_errors_count(obj_idx) > 0) { wxVariant variant; variant << PrusaDataViewBitmapText(item_name, m_bmp_manifold_warning); m_objects_model->SetValue(variant, item, 0); @@ -2641,18 +2718,10 @@ void ObjectList::rename_item() update_name_in_model(item); } -void ObjectList::fix_through_netfabb() const +void ObjectList::fix_through_netfabb() { - const wxDataViewItem item = GetSelection(); - if (!item) - return; - - const ItemType type = m_objects_model->GetItemType(item); - - const int obj_idx = type & itObject ? m_objects_model->GetIdByItem(item) : - type & itVolume ? m_objects_model->GetIdByItem(m_objects_model->GetTopParent(item)) : -1; - - const int vol_idx = type & itVolume ? m_objects_model->GetVolumeIdByItem(item) : -1; + int obj_idx, vol_idx; + get_selected_item_indexes(obj_idx, vol_idx); wxGetApp().plater()->fix_through_netfabb(obj_idx, vol_idx); @@ -2666,16 +2735,10 @@ void ObjectList::update_item_error_icon(const int obj_idx, const int vol_idx) co if (!item) return; - auto model_object = (*m_objects)[obj_idx]; - - const stl_stats& stats = model_object->volumes[vol_idx<0 ? 0 : vol_idx]->mesh.stl.stats; - const int errors = stats.degenerate_facets + stats.edges_fixed + stats.facets_removed + - stats.facets_added + stats.facets_reversed + stats.backwards_edges; - - if (errors == 0) { + if (get_mesh_errors_count(obj_idx, vol_idx) == 0) { // delete Error_icon if all errors are fixed wxVariant variant; - variant << PrusaDataViewBitmapText(from_u8(model_object->name), wxNullBitmap); + variant << PrusaDataViewBitmapText(from_u8((*m_objects)[obj_idx]->name), wxNullBitmap); m_objects_model->SetValue(variant, item, 0); } } diff --git a/src/slic3r/GUI/GUI_ObjectList.hpp b/src/slic3r/GUI/GUI_ObjectList.hpp index a0343100a..617b6da8a 100644 --- a/src/slic3r/GUI/GUI_ObjectList.hpp +++ b/src/slic3r/GUI/GUI_ObjectList.hpp @@ -177,6 +177,16 @@ public: void init_icons(); + // Get obj_idx and vol_idx values for the selected (by default) or an adjusted item + void get_selected_item_indexes(int& obj_idx, int& vol_idx, const wxDataViewItem& item = wxDataViewItem(0)); + // Get count of errors in the mesh + int get_mesh_errors_count(const int obj_idx, const int vol_idx = -1) const; + /* Get list of errors in the mesh. Return value is a string, used for the tooltip + * Function without parameters is for a call from Manipulation panel, + * when we don't know parameters of selected item + */ + wxString get_mesh_errors_list(const int obj_idx, const int vol_idx = -1) const; + wxString get_mesh_errors_list(); void set_tooltip_for_item(const wxPoint& pt); void selection_changed(); @@ -285,7 +295,7 @@ public: void instances_to_separated_objects(const int obj_idx); void split_instances(); void rename_item(); - void fix_through_netfabb() const; + void fix_through_netfabb(); void update_item_error_icon(const int obj_idx, int vol_idx) const ; void paste_volumes_into_list(int obj_idx, const ModelVolumePtrs& volumes); diff --git a/src/slic3r/GUI/GUI_ObjectManipulation.cpp b/src/slic3r/GUI/GUI_ObjectManipulation.cpp index f9284a19b..e623114e9 100644 --- a/src/slic3r/GUI/GUI_ObjectManipulation.cpp +++ b/src/slic3r/GUI/GUI_ObjectManipulation.cpp @@ -10,6 +10,7 @@ #include "Selection.hpp" #include +#include "slic3r/Utils/FixModelByWin10.hpp" namespace Slic3r { @@ -20,6 +21,7 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) : OG_Settings(parent, true) #ifndef __APPLE__ , m_focused_option("") + , m_manifold_warning_bmp(create_scaled_bitmap(parent, "exclamation")) #endif // __APPLE__ { m_og->set_name(_(L("Object Manipulation"))); @@ -42,17 +44,47 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) : ConfigOptionDef def; // Objects(sub-objects) name - def.label = L("Name"); +// def.label = L("Name"); +// def.gui_type = "legend"; +// def.tooltip = L("Object name"); +// def.width = 21 * wxGetApp().em_unit(); +// def.default_value = new ConfigOptionString{ " " }; +// m_og->append_single_option_line(Option(def, "object_name")); + + Line line = Line{ "Name", "Object name" }; + + auto manifold_warning_icon = [this](wxWindow* parent) { + m_fix_throught_netfab_bitmap = new wxStaticBitmap(parent, wxID_ANY, wxNullBitmap); + auto sizer = new wxBoxSizer(wxHORIZONTAL); + sizer->Add(m_fix_throught_netfab_bitmap); + + if (is_windows10()) + m_fix_throught_netfab_bitmap->Bind(wxEVT_CONTEXT_MENU, [this](wxCommandEvent &e) + { + // if object/sub-object has no errors + if (m_fix_throught_netfab_bitmap->GetBitmap().GetRefData() == wxNullBitmap.GetRefData()) + return; + + wxGetApp().obj_list()->fix_through_netfabb(); + update_manifold_warning_icon_state(wxGetApp().obj_list()->get_mesh_errors_list()); + }); + + return sizer; + }; + + line.append_widget(manifold_warning_icon); + def.label = ""; def.gui_type = "legend"; def.tooltip = L("Object name"); def.width = 21 * wxGetApp().em_unit(); def.default_value = new ConfigOptionString{ " " }; - m_og->append_single_option_line(Option(def, "object_name")); + line.append_option(Option(def, "object_name")); + m_og->append_line(line); const int field_width = 5 * wxGetApp().em_unit()/*50*/; // Legend for object modification - auto line = Line{ "", "" }; + line = Line{ "", "" }; def.label = ""; def.type = coString; def.width = field_width/*50*/; @@ -334,6 +366,14 @@ void ObjectManipulation::emulate_kill_focus() else on_change(option, 0); } + +void ObjectManipulation::update_manifold_warning_icon_state(const wxString& tooltip) +{ + m_fix_throught_netfab_bitmap->SetBitmap(tooltip.IsEmpty() ? wxNullBitmap : m_manifold_warning_bmp); + + m_fix_throught_netfab_bitmap->SetToolTip(tooltip); +} + #endif // __APPLE__ void ObjectManipulation::reset_settings_value() diff --git a/src/slic3r/GUI/GUI_ObjectManipulation.hpp b/src/slic3r/GUI/GUI_ObjectManipulation.hpp index a5a180a56..071edbed8 100644 --- a/src/slic3r/GUI/GUI_ObjectManipulation.hpp +++ b/src/slic3r/GUI/GUI_ObjectManipulation.hpp @@ -78,6 +78,9 @@ class ObjectManipulation : public OG_Settings bool m_uniform_scale {true}; PrusaLockButton* m_lock_bnt{ nullptr }; + wxBitmap m_manifold_warning_bmp; + wxStaticBitmap* m_fix_throught_netfab_bitmap; + #ifndef __APPLE__ // Currently focused option name (empty if none) std::string m_focused_option; @@ -107,6 +110,8 @@ public: void emulate_kill_focus(); #endif // __APPLE__ + void update_manifold_warning_icon_state(const wxString& tooltip); + private: void reset_settings_value(); From fc67f44bea9a235621d1d1e454125506c5049f48 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Wed, 24 Apr 2019 13:43:39 +0200 Subject: [PATCH 03/47] Fixed typo --- src/slic3r/GUI/GLSelectionRectangle.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/GLSelectionRectangle.hpp b/src/slic3r/GUI/GLSelectionRectangle.hpp index ef1f831cc..2422066e0 100644 --- a/src/slic3r/GUI/GLSelectionRectangle.hpp +++ b/src/slic3r/GUI/GLSelectionRectangle.hpp @@ -6,7 +6,7 @@ namespace Slic3r { namespace GUI { -class Camera; +struct Camera; class GLSelectionRectangle { public: From 97101409487c77b06d66fece7063158d2dcf3e90 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Wed, 24 Apr 2019 15:07:28 +0200 Subject: [PATCH 04/47] int GLCanvas3D::m_hover_volume_id replaced with std::vector GLCanvas3D::m_hover_volume_idxs --- src/slic3r/GUI/GLCanvas3D.cpp | 50 +++++++++++------------ src/slic3r/GUI/GLCanvas3D.hpp | 4 +- src/slic3r/GUI/Gizmos/GLGizmosManager.cpp | 2 +- 3 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 8aa3205a7..09b4b2e14 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1205,7 +1205,6 @@ GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas, Bed3D& bed, Camera& camera, GLToolbar , m_initialized(false) , m_use_VBOs(false) , m_apply_zoom_to_volumes_filter(false) - , m_hover_volume_id(-1) , m_legend_texture_enabled(false) , m_picking_enabled(false) , m_moving_enabled(false) @@ -2543,7 +2542,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) if (top_level_wnd && top_level_wnd->IsActive()) m_canvas->SetFocus(); m_mouse.position = pos.cast(); - // 1) forces a frame render to ensure that m_hover_volume_id is updated even when the user right clicks while + // 1) forces a frame render to ensure that m_hover_volume_idxs is updated even when the user right clicks while // the context menu is shown, ensuring it to disappear if the mouse is outside any volume and to // change the volume hover state if any is under the mouse // 2) when switching between 3d view and preview the size of the canvas changes if the side panels are visible, @@ -2589,20 +2588,21 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) // Don't deselect a volume if layer editing is enabled. We want the object to stay selected // during the scene manipulation. - if (m_picking_enabled && ((m_hover_volume_id != -1) || !is_layers_editing_enabled())) + if (m_picking_enabled && (!m_hover_volume_idxs.empty() || !is_layers_editing_enabled())) { - if (evt.LeftDown() && (m_hover_volume_id != -1)) + if (evt.LeftDown() && !m_hover_volume_idxs.empty()) { - bool already_selected = m_selection.contains_volume(m_hover_volume_id); + int volume_idx = get_first_hover_volume_idx(); + bool already_selected = m_selection.contains_volume(volume_idx); bool ctrl_down = evt.CmdDown(); Selection::IndicesList curr_idxs = m_selection.get_volume_idxs(); if (already_selected && ctrl_down) - m_selection.remove(m_hover_volume_id); + m_selection.remove(volume_idx); else { - m_selection.add(m_hover_volume_id, !ctrl_down, true); + m_selection.add(volume_idx, !ctrl_down, true); m_mouse.drag.move_requires_threshold = !already_selected; if (already_selected) m_mouse.set_move_start_threshold_position_2D_as_invalid(); @@ -2610,6 +2610,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) m_mouse.drag.move_start_threshold_position_2D = pos; } + // propagate event through callback if (curr_idxs != m_selection.get_volume_idxs()) { m_gizmos.refresh_on_off_state(m_selection); @@ -2620,18 +2621,18 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) } } - // propagate event through callback - if (m_hover_volume_id != -1) + if (!m_hover_volume_idxs.empty()) { if (evt.LeftDown() && m_moving_enabled && (m_mouse.drag.move_volume_idx == -1)) { // Only accept the initial position, if it is inside the volume bounding box. - BoundingBoxf3 volume_bbox = m_volumes.volumes[m_hover_volume_id]->transformed_bounding_box(); + int volume_idx = get_first_hover_volume_idx(); + BoundingBoxf3 volume_bbox = m_volumes.volumes[volume_idx]->transformed_bounding_box(); volume_bbox.offset(1.0); if (volume_bbox.contains(m_mouse.scene_position)) { // The dragging operation is initiated. - m_mouse.drag.move_volume_idx = m_hover_volume_id; + m_mouse.drag.move_volume_idx = volume_idx; m_selection.start_dragging(); m_mouse.drag.start_position_3D = m_mouse.scene_position; m_moving = true; @@ -2648,7 +2649,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) Vec3d cur_pos = m_mouse.drag.start_position_3D; // we do not want to translate objects if the user just clicked on an object while pressing shift to remove it from the selection and then drag - if (m_selection.contains_volume(m_hover_volume_id)) + if (m_selection.contains_volume(get_first_hover_volume_idx())) { if (m_camera.get_theta() == 90.0f) { @@ -2703,7 +2704,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) else if (evt.LeftIsDown()) { // if dragging over blank area with left button, rotate - if ((m_hover_volume_id == -1) && m_mouse.is_start_position_3D_defined()) + if (m_hover_volume_idxs.empty() && m_mouse.is_start_position_3D_defined()) { const Vec3d& orig = m_mouse.drag.start_position_3D; m_camera.phi += (((float)pos(0) - (float)orig(0)) * TRACKBALLSIZE); @@ -2745,7 +2746,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) // of the scene with the background processing data should be performed. post_event(SimpleEvent(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED)); } - else if (evt.LeftUp() && !m_mouse.dragging && (m_hover_volume_id == -1) && !is_layers_editing_enabled()) + else if (evt.LeftUp() && !m_mouse.dragging && m_hover_volume_idxs.empty() && !is_layers_editing_enabled()) { // deselect and propagate event through callback if (!evt.ShiftDown() && m_picking_enabled) @@ -2761,18 +2762,18 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) else if (evt.RightUp()) { m_mouse.position = pos.cast(); - // forces a frame render to ensure that m_hover_volume_id is updated even when the user right clicks while + // forces a frame render to ensure that m_hover_volume_idxs is updated even when the user right clicks while // the context menu is already shown render(); - if (m_hover_volume_id != -1) + if (!m_hover_volume_idxs.empty()) { // if right clicking on volume, propagate event through callback (shows context menu) - if (m_volumes.volumes[m_hover_volume_id]->hover - && !m_volumes.volumes[m_hover_volume_id]->is_wipe_tower // no context menu for the wipe tower + int volume_idx = get_first_hover_volume_idx(); + if (!m_volumes.volumes[volume_idx]->is_wipe_tower // no context menu for the wipe tower && m_gizmos.get_current_type() != GLGizmosManager::SlaSupports) // disable context menu when the gizmo is open { // forces the selection of the volume - m_selection.add(m_hover_volume_id); + m_selection.add(volume_idx); m_gizmos.refresh_on_off_state(m_selection); post_event(SimpleEvent(EVT_GLCANVAS_OBJECT_SELECT)); m_gizmos.update_data(*this); @@ -3541,6 +3542,8 @@ void GLCanvas3D::_picking_pass() const if (m_picking_enabled && !m_mouse.dragging && (pos != Vec2d(DBL_MAX, DBL_MAX))) { + m_hover_volume_idxs.clear(); + // Render the object for picking. // FIXME This cannot possibly work in a multi - sampled context as the color gets mangled by the anti - aliasing. // Better to use software ray - casting on a bounding - box hierarchy. @@ -3579,14 +3582,11 @@ void GLCanvas3D::_picking_pass() const } if ((0 <= volume_id) && (volume_id < (int)m_volumes.volumes.size())) { - m_hover_volume_id = volume_id; + m_hover_volume_idxs.push_back(volume_id); m_gizmos.set_hover_id(-1); } else - { - m_hover_volume_id = -1; m_gizmos.set_hover_id(inside && volume_id <= GLGizmoBase::BASE_ID ? (GLGizmoBase::BASE_ID - volume_id) : -1); - } _update_volumes_hover_state(); } @@ -4077,10 +4077,10 @@ void GLCanvas3D::_update_volumes_hover_state() const v->hover = false; } - if (m_hover_volume_id == -1) + if (m_hover_volume_idxs.empty()) return; - GLVolume* volume = m_volumes.volumes[m_hover_volume_id]; + GLVolume* volume = m_volumes.volumes[get_first_hover_volume_idx()]; if (volume->is_modifier) volume->hover = true; else diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index e81d46f11..8a5c34a2c 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -426,7 +426,7 @@ private: bool m_initialized; bool m_use_VBOs; bool m_apply_zoom_to_volumes_filter; - mutable int m_hover_volume_id; + mutable std::vector m_hover_volume_idxs; bool m_warning_texture_enabled; bool m_legend_texture_enabled; bool m_picking_enabled; @@ -575,7 +575,7 @@ public: float get_view_toolbar_height() const { return m_view_toolbar.get_height(); } int get_move_volume_id() const { return m_mouse.drag.move_volume_idx; } - int get_hover_volume_id() const { return m_hover_volume_id; } + int get_first_hover_volume_idx() const { return m_hover_volume_idxs.empty() ? -1 : m_hover_volume_idxs.front(); } // Returns the view ray line, in world coordinate, at the given mouse position. Linef3 mouse_ray(const Point& mouse_pos); diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp index 5e37e42ad..88e374792 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp @@ -693,7 +693,7 @@ bool GLGizmosManager::on_mouse(wxMouseEvent& evt, GLCanvas3D& canvas) gizmo_event(SLAGizmoEventType::LeftUp, mouse_pos, evt.ShiftDown(), evt.AltDown(), evt.ControlDown()); processed = true; } - else if (evt.LeftUp() && (m_current == Flatten) && ((canvas.get_hover_volume_id() != -1) || grabber_contains_mouse())) + else if (evt.LeftUp() && (m_current == Flatten) && ((canvas.get_first_hover_volume_idx() != -1) || grabber_contains_mouse())) { // to avoid to loose the selection when user clicks an object while the Flatten gizmo is active processed = true; From d79a2b8d2d0ffd6019330c41e7bb8b1ee59a2f53 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Wed, 24 Apr 2019 15:43:52 +0200 Subject: [PATCH 05/47] GLCanvas3D -> added support for cursor change and change cursor when using SLA support gizmo rectangle selection --- src/slic3r/GUI/GLCanvas3D.cpp | 31 ++++++++++++++++++++ src/slic3r/GUI/GLCanvas3D.hpp | 11 +++++++ src/slic3r/GUI/GLSelectionRectangle.cpp | 6 ++-- src/slic3r/GUI/GLSelectionRectangle.hpp | 4 +-- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 6 ++-- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp | 3 ++ src/slic3r/GUI/Gizmos/GLGizmosManager.cpp | 31 ++++++++++++++++---- 7 files changed, 79 insertions(+), 13 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 09b4b2e14..af0aa9a69 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1213,6 +1213,7 @@ GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas, Bed3D& bed, Camera& camera, GLToolbar , m_regenerate_volumes(true) , m_moving(false) , m_tab_down(false) + , m_cursor_type(Standard) , m_color_by("volume") , m_reload_delayed(false) , m_render_sla_auxiliaries(true) @@ -2323,9 +2324,25 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) // m_canvas->HandleAsNavigationKey(evt); // XXX: Doesn't work in some cases / on Linux post_event(SimpleEvent(EVT_GLCANVAS_TAB)); } + else if (keyCode == WXK_SHIFT) + { + set_cursor(Standard); + } + else if (keyCode == WXK_ALT) + { + set_cursor(Standard); + } } else if (evt.GetEventType() == wxEVT_KEY_DOWN) { m_tab_down = keyCode == WXK_TAB && !evt.HasAnyModifiers(); + if (keyCode == WXK_SHIFT) + { + set_cursor(Cross); + } + else if (keyCode == WXK_ALT) + { + set_cursor(Cross); + } } } } @@ -3173,6 +3190,20 @@ double GLCanvas3D::get_size_proportional_to_max_bed_size(double factor) const return factor * m_bed.get_bounding_box().max_size(); } +void GLCanvas3D::set_cursor(ECursorType type) +{ + if ((m_canvas != nullptr) && (m_cursor_type != type)) + { + switch (type) + { + case Standard: { m_canvas->SetCursor(*wxSTANDARD_CURSOR); break; } + case Cross: { m_canvas->SetCursor(*wxCROSS_CURSOR); break; } + } + + m_cursor_type = type; + } +} + bool GLCanvas3D::_is_shown_on_screen() const { return (m_canvas != nullptr) ? m_canvas->IsShownOnScreen() : false; diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 8a5c34a2c..fa55dc683 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -392,6 +392,14 @@ private: void render(const GLCanvas3D& canvas) const; }; +public: + enum ECursorType : unsigned char + { + Standard, + Cross + }; + +private: wxGLCanvas* m_canvas; wxGLContext* m_context; #if ENABLE_RETINA_GL @@ -436,6 +444,7 @@ private: bool m_regenerate_volumes; bool m_moving; bool m_tab_down; + ECursorType m_cursor_type; // Following variable is obsolete and it should be safe to remove it. // I just don't want to do it now before a release (Lukas Matena 24.3.2019) @@ -587,6 +596,8 @@ public: double get_size_proportional_to_max_bed_size(double factor) const; + void set_cursor(ECursorType type); + private: bool _is_shown_on_screen() const; diff --git a/src/slic3r/GUI/GLSelectionRectangle.cpp b/src/slic3r/GUI/GLSelectionRectangle.cpp index a908d13ec..39b92ff8f 100644 --- a/src/slic3r/GUI/GLSelectionRectangle.cpp +++ b/src/slic3r/GUI/GLSelectionRectangle.cpp @@ -9,7 +9,7 @@ namespace GUI { void GLSelectionRectangle::start_dragging(const Vec2d& mouse_position, float width, float height, EState status) { - if (is_active() || status==Off) + if (is_dragging() || status == Off) return; m_width = width; @@ -23,7 +23,7 @@ void GLSelectionRectangle::start_dragging(const Vec2d& mouse_position, float wid void GLSelectionRectangle::dragging(const Vec2d& mouse_position) { - if (is_active()) + if (is_dragging()) m_end_corner = mouse_position; } @@ -31,7 +31,7 @@ void GLSelectionRectangle::dragging(const Vec2d& mouse_position) std::vector GLSelectionRectangle::end_dragging(const Camera& camera, const std::vector& points) { - if (!is_active()) + if (!is_dragging()) return std::vector(); m_status = Off; diff --git a/src/slic3r/GUI/GLSelectionRectangle.hpp b/src/slic3r/GUI/GLSelectionRectangle.hpp index 2422066e0..f7d5bbdc7 100644 --- a/src/slic3r/GUI/GLSelectionRectangle.hpp +++ b/src/slic3r/GUI/GLSelectionRectangle.hpp @@ -27,8 +27,8 @@ public: std::vector end_dragging(const Camera& camera, const std::vector& points); void render() const; - - bool is_active() const { return m_status != Off; } + + bool is_dragging() const { return m_status != Off; } EState get_status() const { return m_status; } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index b31eb272b..ebb7df138 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -485,7 +485,7 @@ bool GLGizmoSlaSupports::gizmo_event(SLAGizmoEventType action, const Vec2d& mous } // left down without selection rectangle - place point on the mesh: - if (action == SLAGizmoEventType::LeftDown && !m_selection_rectangle.is_active() && !shift_down) { + if (action == SLAGizmoEventType::LeftDown && !m_selection_rectangle.is_dragging() && !shift_down) { // If any point is in hover state, this should initiate its move - return control back to GLCanvas: if (m_hover_id != -1) return false; @@ -510,7 +510,7 @@ bool GLGizmoSlaSupports::gizmo_event(SLAGizmoEventType action, const Vec2d& mous } // left up with selection rectangle - select points inside the rectangle: - if ((action == SLAGizmoEventType::LeftUp || action == SLAGizmoEventType::ShiftUp || action == SLAGizmoEventType::AltUp) && m_selection_rectangle.is_active()) { + if ((action == SLAGizmoEventType::LeftUp || action == SLAGizmoEventType::ShiftUp || action == SLAGizmoEventType::AltUp) && m_selection_rectangle.is_dragging()) { // Is this a selection or deselection rectangle? GLSelectionRectangle::EState rectangle_status = m_selection_rectangle.get_status(); @@ -601,7 +601,7 @@ bool GLGizmoSlaSupports::gizmo_event(SLAGizmoEventType action, const Vec2d& mous return true; // point has been placed and the button not released yet // this prevents GLCanvas from starting scene rotation - if (m_selection_rectangle.is_active()) { + if (m_selection_rectangle.is_dragging()) { m_selection_rectangle.dragging(mouse_position); return true; } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp index 92d80b6eb..ab5dc8d67 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp @@ -68,6 +68,9 @@ public: void delete_selected_points(bool force = false); ClippingPlane get_sla_clipping_plane() const; + bool is_in_editing_mode() const { return m_editing_mode; } + bool is_selection_rectangle_dragging() const { return m_selection_rectangle.is_dragging(); } + private: bool on_init(); void on_update(const UpdateData& data, const Selection& selection); diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp index 88e374792..b7e1b3f07 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp @@ -843,13 +843,34 @@ bool GLGizmosManager::on_key(wxKeyEvent& evt, GLCanvas3D& canvas) if (evt.GetEventType() == wxEVT_KEY_UP) { - if ((m_current == SlaSupports) && (keyCode == WXK_SHIFT) && gizmo_event(SLAGizmoEventType::ShiftUp)) - // shift has been just released - SLA gizmo might want to close rectangular selection. - processed = true; + if (m_current == SlaSupports) + { + GLGizmoSlaSupports* gizmo = reinterpret_cast(get_current()); - if ((m_current == SlaSupports) && (keyCode == WXK_ALT) && gizmo_event(SLAGizmoEventType::AltUp)) - // alt has been just released - SLA gizmo might want to close rectangular selection. + if (keyCode == WXK_SHIFT) + { + // shift has been just released - SLA gizmo might want to close rectangular selection. + if (gizmo_event(SLAGizmoEventType::ShiftUp) || (gizmo->is_in_editing_mode() && gizmo->is_selection_rectangle_dragging())) + processed = true; + } + else if (keyCode == WXK_ALT) + { + // alt has been just released - SLA gizmo might want to close rectangular selection. + if (gizmo_event(SLAGizmoEventType::AltUp) || (gizmo->is_in_editing_mode() && gizmo->is_selection_rectangle_dragging())) + processed = true; + } + } + + if (processed) + canvas.set_cursor(GLCanvas3D::Standard); + } + else if (evt.GetEventType() == wxEVT_KEY_DOWN) + { + if ((m_current == SlaSupports) && ((keyCode == WXK_SHIFT) || (keyCode == WXK_ALT)) && reinterpret_cast(get_current())->is_in_editing_mode()) + { + canvas.set_cursor(GLCanvas3D::Cross); processed = true; + } } if (processed) From 9d070410c233cff14c84820e8b3b513824b92a6f Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Wed, 24 Apr 2019 16:01:27 +0200 Subject: [PATCH 06/47] Refactoring of GLSelectionRectangle --- src/slic3r/GUI/GLSelectionRectangle.cpp | 181 ++++++++++--------- src/slic3r/GUI/GLSelectionRectangle.hpp | 28 +-- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 12 +- 3 files changed, 111 insertions(+), 110 deletions(-) diff --git a/src/slic3r/GUI/GLSelectionRectangle.cpp b/src/slic3r/GUI/GLSelectionRectangle.cpp index 39b92ff8f..03ee7e1f6 100644 --- a/src/slic3r/GUI/GLSelectionRectangle.cpp +++ b/src/slic3r/GUI/GLSelectionRectangle.cpp @@ -1,116 +1,119 @@ #include "GLSelectionRectangle.hpp" #include "Camera.hpp" #include "3DScene.hpp" +#include "GLCanvas3D.hpp" #include namespace Slic3r { namespace GUI { -void GLSelectionRectangle::start_dragging(const Vec2d& mouse_position, float width, float height, EState status) -{ - if (is_dragging() || status == Off) - return; + void GLSelectionRectangle::start_dragging(const Vec2d& mouse_position, EState state) + { + if (is_dragging() || (state == Off)) + return; - m_width = width; - m_height = height; - m_status = status; - m_start_corner = mouse_position; - m_end_corner = mouse_position; -} - - - -void GLSelectionRectangle::dragging(const Vec2d& mouse_position) -{ - if (is_dragging()) + m_state = state; + m_start_corner = mouse_position; m_end_corner = mouse_position; -} - - - -std::vector GLSelectionRectangle::end_dragging(const Camera& camera, const std::vector& points) -{ - if (!is_dragging()) - return std::vector(); - - m_status = Off; - std::vector out; - - const std::array& viewport = camera.get_viewport(); - const Transform3d& modelview_matrix = camera.get_view_matrix(); - const Transform3d& projection_matrix = camera.get_projection_matrix(); - - // bounding box created from the rectangle corners - will take care of order of the corners - BoundingBox rectangle(Points{Point(m_start_corner.cast()), Point(m_end_corner.cast())}); - - // Iterate over all points and determine whether they're in the rectangle. - for (unsigned int i=0; i GLSelectionRectangle::stop_dragging(const GLCanvas3D& canvas, const std::vector& points) + { + std::vector out; - glsafe(::glPushAttrib(GL_TRANSFORM_BIT)); // remember current MatrixMode + if (!is_dragging()) + return out; - glsafe(::glMatrixMode(GL_MODELVIEW)); // cache modelview matrix and set to identity - glsafe(::glPushMatrix()); - glsafe(::glLoadIdentity()); + m_state = Off; - glsafe(::glMatrixMode(GL_PROJECTION)); // cache projection matrix and set to identity - glsafe(::glPushMatrix()); - glsafe(::glLoadIdentity()); + const Camera& camera = canvas.get_camera(); + const std::array& viewport = camera.get_viewport(); + const Transform3d& modelview_matrix = camera.get_view_matrix(); + const Transform3d& projection_matrix = camera.get_projection_matrix(); - glsafe(::glOrtho(0.f, m_width, m_height, 0.f, -1.f, 1.f)); // set projection matrix so that world coords = window coords + // bounding box created from the rectangle corners - will take care of order of the corners + BoundingBox rectangle(Points{ Point(m_start_corner.cast()), Point(m_end_corner.cast()) }); - // render the selection rectangle (window coordinates): - glsafe(::glPushAttrib(GL_ENABLE_BIT)); - glsafe(::glLineStipple(4, 0xAAAA)); - glsafe(::glEnable(GL_LINE_STIPPLE)); + // Iterate over all points and determine whether they're in the rectangle. + for (unsigned int i = 0; i end_dragging(const Camera& camera, const std::vector& points); + std::vector stop_dragging(const GLCanvas3D& canvas, const std::vector& points); - void render() const; + // Disables the rectangle. + void stop_dragging(); - bool is_dragging() const { return m_status != Off; } - EState get_status() const { return m_status; } + void render(const GLCanvas3D& canvas) const; + + bool is_dragging() const { return m_state != Off; } + EState get_state() const { return m_state; } - - private: - EState m_status = Off; + EState m_state = Off; Vec2d m_start_corner; Vec2d m_end_corner; - float m_width; - float m_height; }; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index ebb7df138..5be5e9a89 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -100,7 +100,7 @@ void GLGizmoSlaSupports::on_render(const Selection& selection) const if (m_quadric != nullptr && selection.is_from_single_instance()) render_points(selection, false); - m_selection_rectangle.render(); + m_selection_rectangle.render(m_parent); render_clipping_plane(selection); glsafe(::glDisable(GL_BLEND)); @@ -467,9 +467,7 @@ bool GLGizmoSlaSupports::gizmo_event(SLAGizmoEventType action, const Vec2d& mous if (action == SLAGizmoEventType::LeftDown && (shift_down || alt_down || control_down)) { if (m_hover_id == -1) { if (shift_down || alt_down) { - Size size = m_parent.get_canvas_size(); - m_selection_rectangle.start_dragging(mouse_position, size.get_width(), size.get_height(), - shift_down ? GLSelectionRectangle::SlaSelect : GLSelectionRectangle::SlaDeselect); + m_selection_rectangle.start_dragging(mouse_position, shift_down ? GLSelectionRectangle::Select : GLSelectionRectangle::Deselect); } } else { @@ -512,7 +510,7 @@ bool GLGizmoSlaSupports::gizmo_event(SLAGizmoEventType action, const Vec2d& mous // left up with selection rectangle - select points inside the rectangle: if ((action == SLAGizmoEventType::LeftUp || action == SLAGizmoEventType::ShiftUp || action == SLAGizmoEventType::AltUp) && m_selection_rectangle.is_dragging()) { // Is this a selection or deselection rectangle? - GLSelectionRectangle::EState rectangle_status = m_selection_rectangle.get_status(); + GLSelectionRectangle::EState rectangle_status = m_selection_rectangle.get_state(); // First collect positions of all the points in world coordinates. const Transform3d& instance_matrix = m_model_object->instances[m_active_instance]->get_transformation().get_matrix(); @@ -524,7 +522,7 @@ bool GLGizmoSlaSupports::gizmo_event(SLAGizmoEventType action, const Vec2d& mous } // Now ask the rectangle which of the points are inside. const Camera& camera = m_parent.get_camera(); - std::vector selected_idxs = m_selection_rectangle.end_dragging(camera, points); + std::vector selected_idxs = m_selection_rectangle.stop_dragging(m_parent, points); // we'll recover current look direction (in world coords) and transform it to model coords. const Selection& selection = m_parent.get_selection(); @@ -577,7 +575,7 @@ bool GLGizmoSlaSupports::gizmo_event(SLAGizmoEventType action, const Vec2d& mous } if (!is_obscured) { - if (rectangle_status == GLSelectionRectangle::SlaDeselect) + if (rectangle_status == GLSelectionRectangle::Deselect) unselect_point(i); else select_point(i); From b4d5287d0c9826bcd3c95b595443efd437cd3f85 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Wed, 24 Apr 2019 16:04:47 +0200 Subject: [PATCH 07/47] Refactoring: get_mesh_errors_count() moved to ModelObject + added get_object_stl_stats() to ModelObject --- src/libslic3r/Model.cpp | 42 ++++++++++++++++ src/libslic3r/Model.hpp | 5 ++ src/slic3r/GUI/GUI_ObjectList.cpp | 60 ++++++----------------- src/slic3r/GUI/GUI_ObjectList.hpp | 2 +- src/slic3r/GUI/GUI_ObjectManipulation.hpp | 1 + src/slic3r/GUI/Plater.cpp | 15 +++++- 6 files changed, 78 insertions(+), 47 deletions(-) diff --git a/src/libslic3r/Model.cpp b/src/libslic3r/Model.cpp index 37e1f4a1b..d1f426c5b 100644 --- a/src/libslic3r/Model.cpp +++ b/src/libslic3r/Model.cpp @@ -1451,6 +1451,48 @@ std::string ModelObject::get_export_filename() const return ret; } +stl_stats ModelObject::get_object_stl_stats() const +{ + if (this->volumes.size() == 1) + return this->volumes[0]->mesh.stl.stats; + + stl_stats full_stats; + + // initialise full_stats + full_stats.degenerate_facets= 0; + full_stats.edges_fixed = 0; + full_stats.facets_removed = 0; + full_stats.facets_added = 0; + full_stats.facets_reversed = 0; + full_stats.backwards_edges = 0; + full_stats.normals_fixed = 0; + + // fill full_stats from all objet's meshes + for (ModelVolume* volume : this->volumes) + { + const stl_stats& stats = volume->mesh.stl.stats; + + full_stats.degenerate_facets+= stats.degenerate_facets; + full_stats.edges_fixed += stats.edges_fixed; + full_stats.facets_removed += stats.facets_removed; + full_stats.facets_added += stats.facets_added; + full_stats.facets_reversed += stats.facets_reversed; + full_stats.backwards_edges += stats.backwards_edges; + } + + return full_stats; +} + +int ModelObject::get_mesh_errors_count(const int vol_idx /*= -1*/) const +{ + const stl_stats& stats = vol_idx == -1 ? + get_object_stl_stats() : + this->volumes[vol_idx]->mesh.stl.stats; + + return stats.degenerate_facets + stats.edges_fixed + stats.facets_removed + + stats.facets_added + stats.facets_reversed + stats.backwards_edges; +} + void ModelVolume::set_material_id(t_model_material_id material_id) { m_material_id = material_id; diff --git a/src/libslic3r/Model.hpp b/src/libslic3r/Model.hpp index 80187d259..0fc3fc168 100644 --- a/src/libslic3r/Model.hpp +++ b/src/libslic3r/Model.hpp @@ -277,6 +277,11 @@ public: std::string get_export_filename() const; + // Get full stl statistics for all object's meshes + stl_stats get_object_stl_stats() const; + // Get count of errors in the mesh( or all object's meshes, if volume index isn't defined) + int get_mesh_errors_count(const int vol_idx = -1) const; + protected: friend class Print; friend class SLAPrint; diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index b16198d19..d65ad2acc 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -216,23 +216,7 @@ int ObjectList::get_mesh_errors_count(const int obj_idx, const int vol_idx /*= - if (obj_idx < 0) return 0; - int errors = 0; - - std::vector volumes; - if (vol_idx == -1) - volumes = (*m_objects)[obj_idx]->volumes; - else - volumes.emplace_back((*m_objects)[obj_idx]->volumes[vol_idx]); - - for (ModelVolume* volume : volumes) - { - const stl_stats& stats = volume->mesh.stl.stats; - - errors += stats.degenerate_facets + stats.edges_fixed + stats.facets_removed + - stats.facets_added + stats.facets_reversed + stats.backwards_edges; - } - - return errors; + return (*m_objects)[obj_idx]->get_mesh_errors_count(vol_idx); } wxString ObjectList::get_mesh_errors_list(const int obj_idx, const int vol_idx /*= -1*/) const @@ -245,33 +229,19 @@ wxString ObjectList::get_mesh_errors_list(const int obj_idx, const int vol_idx / // Create tooltip string, if there are errors wxString tooltip = wxString::Format(_(L("Auto-repaired (%d errors):\n")), errors); - std::vector volumes; - if (vol_idx == -1) - volumes = (*m_objects)[obj_idx]->volumes; - else - volumes.emplace_back((*m_objects)[obj_idx]->volumes[vol_idx]); + const stl_stats& stats = vol_idx == -1 ? + (*m_objects)[obj_idx]->get_object_stl_stats() : + (*m_objects)[obj_idx]->volumes[vol_idx]->mesh.stl.stats; std::map error_msg = { - {L("degenerate facets") , 0}, - {L("edges fixed") , 0}, - {L("facets removed") , 0}, - {L("facets added") , 0}, - {L("facets reversed") , 0}, - {L("backwards edges") , 0} + { L("degenerate facets"), stats.degenerate_facets }, + { L("edges fixed"), stats.edges_fixed }, + { L("facets removed"), stats.facets_removed }, + { L("facets added"), stats.facets_added }, + { L("facets reversed"), stats.facets_reversed }, + { L("backwards edges"), stats.backwards_edges } }; - for (ModelVolume* volume : volumes) - { - const stl_stats& stats = volume->mesh.stl.stats; - - error_msg[L("degenerate facets")] += stats.degenerate_facets; - error_msg[L("edges fixed")] += stats.edges_fixed; - error_msg[L("facets removed")] += stats.facets_removed; - error_msg[L("facets added")] += stats.facets_added; - error_msg[L("facets reversed")] += stats.facets_reversed; - error_msg[L("backwards edges")] += stats.backwards_edges; - } - for (const auto& error : error_msg) if (error.second > 0) tooltip += wxString::Format(_("\t%d %s\n"), error.second, error.first); @@ -1170,13 +1140,15 @@ void ObjectList::append_menu_items_osx(wxMenu* menu) menu->AppendSeparator(); } -void ObjectList::append_menu_item_fix_through_netfabb(wxMenu* menu) +wxMenuItem* ObjectList::append_menu_item_fix_through_netfabb(wxMenu* menu) { - if (!is_windows10()) - return; - append_menu_item(menu, wxID_ANY, _(L("Fix through the Netfabb")), "", +// if (!is_windows10()) +// return; + wxMenuItem* menu_item = append_menu_item(menu, wxID_ANY, _(L("Fix through the Netfabb")), "", [this](wxCommandEvent&) { fix_through_netfabb(); }, "", menu); menu->AppendSeparator(); + + return menu_item; } void ObjectList::append_menu_item_export_stl(wxMenu* menu) const diff --git a/src/slic3r/GUI/GUI_ObjectList.hpp b/src/slic3r/GUI/GUI_ObjectList.hpp index 617b6da8a..0dfa1f41c 100644 --- a/src/slic3r/GUI/GUI_ObjectList.hpp +++ b/src/slic3r/GUI/GUI_ObjectList.hpp @@ -204,7 +204,7 @@ public: wxMenuItem* append_menu_item_change_type(wxMenu* menu); wxMenuItem* append_menu_item_instance_to_object(wxMenu* menu); void append_menu_items_osx(wxMenu* menu); - void append_menu_item_fix_through_netfabb(wxMenu* menu); + wxMenuItem* append_menu_item_fix_through_netfabb(wxMenu* menu); void append_menu_item_export_stl(wxMenu* menu) const ; void append_menu_item_change_extruder(wxMenu* menu) const; void append_menu_item_delete(wxMenu* menu); diff --git a/src/slic3r/GUI/GUI_ObjectManipulation.hpp b/src/slic3r/GUI/GUI_ObjectManipulation.hpp index 071edbed8..d3d5f8444 100644 --- a/src/slic3r/GUI/GUI_ObjectManipulation.hpp +++ b/src/slic3r/GUI/GUI_ObjectManipulation.hpp @@ -8,6 +8,7 @@ class wxStaticText; class PrusaLockButton; +class wxStaticBitmap; namespace Slic3r { namespace GUI { diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 8eb68fc39..dfb8fb98a 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -926,7 +926,7 @@ void Sidebar::show_info_sizer() p->object_info->info_size->SetLabel(wxString::Format("%.2f x %.2f x %.2f",size(0), size(1), size(2))); p->object_info->info_materials->SetLabel(wxString::Format("%d", static_cast(model_object->materials_count()))); - auto& stats = model_object->volumes.front()->mesh.stl.stats; + const auto& stats = model_object->get_object_stl_stats();//model_object->volumes.front()->mesh.stl.stats; p->object_info->info_volume->SetLabel(wxString::Format("%.2f", stats.volume)); p->object_info->info_facets->SetLabel(wxString::Format(_(L("%d (%d shells)")), static_cast(model_object->facets_count()), stats.number_of_parts)); @@ -1284,6 +1284,7 @@ struct Plater::priv bool can_split_to_volumes() const; bool can_arrange() const; bool can_layers_editing() const; + bool can_fix_through_netfabb() const; private: bool init_object_menu(); @@ -2886,7 +2887,7 @@ bool Plater::priv::init_common_menu(wxMenu* menu, const bool is_part/* = false*/ menu->AppendSeparator(); } - sidebar->obj_list()->append_menu_item_fix_through_netfabb(menu); + wxMenuItem* item_fix_through_netfabb = sidebar->obj_list()->append_menu_item_fix_through_netfabb(menu); wxMenu* mirror_menu = new wxMenu(); if (mirror_menu == nullptr) @@ -2906,6 +2907,7 @@ bool Plater::priv::init_common_menu(wxMenu* menu, const bool is_part/* = false*/ { q->Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_mirror()); }, item_mirror->GetId()); q->Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_delete()); }, item_delete->GetId()); + q->Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_fix_through_netfabb()); }, item_fix_through_netfabb->GetId()); } return true; @@ -3075,6 +3077,15 @@ bool Plater::priv::can_delete_all() const return !model.objects.empty(); } +bool Plater::priv::can_fix_through_netfabb() const +{ + int obj_idx = get_selected_object_idx(); + if (obj_idx < 0) + return false; + + return model.objects[obj_idx]->get_mesh_errors_count() > 0; +} + bool Plater::priv::can_increase_instances() const { if (arranging || rotoptimizing) { From ec2f319a3d7cce7958a750e142d06c3921e7bf84 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Thu, 25 Apr 2019 09:10:03 +0200 Subject: [PATCH 08/47] Rectangle selection in 3D scene -> rendering --- src/slic3r/GUI/GLCanvas3D.cpp | 36 ++++++++++++++++++-- src/slic3r/GUI/GLCanvas3D.hpp | 1 + src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp | 1 + 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 5cae80ba8..084a4f3b4 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1647,6 +1647,9 @@ void GLCanvas3D::render() _render_camera_target(); #endif // ENABLE_SHOW_CAMERA_TARGET + if (m_picking_enabled && m_rectangle_selection.is_dragging()) + m_rectangle_selection.render(*this); + // draw overlays _render_gizmos_overlay(); _render_warning_texture(); @@ -2342,10 +2345,20 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) } else if (keyCode == WXK_SHIFT) { + if (m_picking_enabled && m_rectangle_selection.is_dragging()) + { + m_rectangle_selection.stop_dragging(); + m_dirty = true; + } set_cursor(Standard); } else if (keyCode == WXK_ALT) { + if (m_picking_enabled && m_rectangle_selection.is_dragging()) + { + m_rectangle_selection.stop_dragging(); + m_dirty = true; + } set_cursor(Standard); } } @@ -2353,11 +2366,13 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) m_tab_down = keyCode == WXK_TAB && !evt.HasAnyModifiers(); if (keyCode == WXK_SHIFT) { - set_cursor(Cross); + if (m_picking_enabled && (m_gizmos.get_current_type() != GLGizmosManager::SlaSupports)) + set_cursor(Cross); } else if (keyCode == WXK_ALT) { - set_cursor(Cross); + if (m_picking_enabled && (m_gizmos.get_current_type() != GLGizmosManager::SlaSupports)) + set_cursor(Cross); } } } @@ -2615,6 +2630,14 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) m_dirty = true; } } + else if (evt.LeftDown() && (evt.ShiftDown() || evt.AltDown()) && m_picking_enabled) + { + if (m_gizmos.get_current_type() != GLGizmosManager::SlaSupports) + { + m_rectangle_selection.start_dragging(m_mouse.position, evt.ShiftDown() ? GLSelectionRectangle::Select : GLSelectionRectangle::Deselect); + m_dirty = true; + } + } else { // Select volume in this 3D canvas. @@ -2724,6 +2747,11 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) m_dirty = true; } } + else if (evt.Dragging() && evt.LeftIsDown() && m_picking_enabled && m_rectangle_selection.is_dragging()) + { + m_rectangle_selection.dragging(pos.cast()); + m_dirty = true; + } else if (evt.Dragging()) { m_mouse.dragging = true; @@ -2779,6 +2807,10 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) // of the scene with the background processing data should be performed. post_event(SimpleEvent(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED)); } + else if (evt.LeftUp() && m_picking_enabled && m_rectangle_selection.is_dragging()) + { + m_rectangle_selection.stop_dragging(); + } else if (evt.LeftUp() && !m_mouse.dragging && m_hover_volume_idxs.empty() && !is_layers_editing_enabled()) { // deselect and propagate event through callback diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index cd96b5c70..e8c301967 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -452,6 +452,7 @@ private: bool m_moving; bool m_tab_down; ECursorType m_cursor_type; + GLSelectionRectangle m_rectangle_selection; // Following variable is obsolete and it should be safe to remove it. // I just don't want to do it now before a release (Lukas Matena 24.3.2019) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp index ab5dc8d67..7e09b04ac 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp @@ -96,6 +96,7 @@ private: mutable Vec3d m_clipping_plane_normal = Vec3d::Zero(); GLSelectionRectangle m_selection_rectangle; + bool m_wait_for_up_event = false; bool m_unsaved_changes = false; // Are there unsaved changes in manual mode? bool m_selection_empty = true; From 11490dfb066e56829a6a11d63d29cde7d0956846 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Thu, 25 Apr 2019 09:46:26 +0200 Subject: [PATCH 09/47] Rectangle selection in 3D scene -> hovering detection --- src/slic3r/GUI/3DScene.cpp | 14 ++- src/slic3r/GUI/3DScene.hpp | 9 +- src/slic3r/GUI/GLCanvas3D.cpp | 137 +++++++++++++++++++++--- src/slic3r/GUI/GLCanvas3D.hpp | 1 + src/slic3r/GUI/GLSelectionRectangle.cpp | 6 +- src/slic3r/GUI/GLSelectionRectangle.hpp | 7 ++ 6 files changed, 148 insertions(+), 26 deletions(-) diff --git a/src/slic3r/GUI/3DScene.cpp b/src/slic3r/GUI/3DScene.cpp index 9038e388c..9d1407b00 100644 --- a/src/slic3r/GUI/3DScene.cpp +++ b/src/slic3r/GUI/3DScene.cpp @@ -223,7 +223,8 @@ void GLIndexedVertexArray::render( } const float GLVolume::SELECTED_COLOR[4] = { 0.0f, 1.0f, 0.0f, 1.0f }; -const float GLVolume::HOVER_COLOR[4] = { 0.4f, 0.9f, 0.1f, 1.0f }; +const float GLVolume::HOVER_SELECT_COLOR[4] = { 0.4f, 0.9f, 0.1f, 1.0f }; +const float GLVolume::HOVER_DESELECT_COLOR[4] = { 0.9f, 0.4f, 0.1f, 1.0f }; const float GLVolume::OUTSIDE_COLOR[4] = { 0.0f, 0.38f, 0.8f, 1.0f }; const float GLVolume::SELECTED_OUTSIDE_COLOR[4] = { 0.19f, 0.58f, 1.0f, 1.0f }; const float GLVolume::DISABLED_COLOR[4] = { 0.25f, 0.25f, 0.25f, 1.0f }; @@ -251,7 +252,8 @@ GLVolume::GLVolume(float r, float g, float b, float a) , zoom_to_volumes(true) , shader_outside_printer_detection_enabled(false) , is_outside(false) - , hover(false) + , hover_select(false) + , hover_deselect(false) , is_modifier(false) , is_wipe_tower(false) , is_extrusion_path(false) @@ -291,10 +293,12 @@ void GLVolume::set_render_color() if (force_native_color) set_render_color(color, 4); else { - if (selected) + if (hover_select) + set_render_color(HOVER_SELECT_COLOR, 4); + else if (hover_deselect) + set_render_color(HOVER_DESELECT_COLOR, 4); + else if (selected) set_render_color(is_outside ? SELECTED_OUTSIDE_COLOR : SELECTED_COLOR, 4); - else if (hover) - set_render_color(HOVER_COLOR, 4); else if (disabled) set_render_color(DISABLED_COLOR, 4); else if (is_outside && shader_outside_printer_detection_enabled) diff --git a/src/slic3r/GUI/3DScene.hpp b/src/slic3r/GUI/3DScene.hpp index 88547359e..fa7d6f7d1 100644 --- a/src/slic3r/GUI/3DScene.hpp +++ b/src/slic3r/GUI/3DScene.hpp @@ -225,7 +225,8 @@ private: class GLVolume { public: static const float SELECTED_COLOR[4]; - static const float HOVER_COLOR[4]; + static const float HOVER_SELECT_COLOR[4]; + static const float HOVER_DESELECT_COLOR[4]; static const float OUTSIDE_COLOR[4]; static const float SELECTED_OUTSIDE_COLOR[4]; static const float DISABLED_COLOR[4]; @@ -296,8 +297,10 @@ public: bool shader_outside_printer_detection_enabled; // Wheter or not this volume is outside print volume. bool is_outside; - // Boolean: Is mouse over this object? - bool hover; + // Boolean: Is mouse over this object to select it ? + bool hover_select; + // Boolean: Is mouse over this object to deselect it ? + bool hover_deselect; // Wheter or not this volume has been generated from a modifier bool is_modifier; // Wheter or not this volume has been generated from the wipe tower diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 084a4f3b4..621a726b9 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1610,8 +1610,12 @@ void GLCanvas3D::render() wxGetApp().imgui()->new_frame(); - // picking pass - _picking_pass(); + if (m_rectangle_selection.is_dragging()) + // picking pass using rectangle selection + _rectangular_selection_picking_pass(); + else + // regular picking pass + _picking_pass(); // draw scene glsafe(::glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)); @@ -2361,6 +2365,8 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) } set_cursor(Standard); } + else if (keyCode == WXK_CONTROL) + m_dirty = true; } else if (evt.GetEventType() == wxEVT_KEY_DOWN) { m_tab_down = keyCode == WXK_TAB && !evt.HasAnyModifiers(); @@ -2374,6 +2380,8 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) if (m_picking_enabled && (m_gizmos.get_current_type() != GLGizmosManager::SlaSupports)) set_cursor(Cross); } + else if (keyCode == WXK_CONTROL) + m_dirty = true; } } } @@ -3662,7 +3670,7 @@ void GLCanvas3D::_picking_pass() const if (inside) { glsafe(::glReadPixels(pos(0), cnv_size.get_height() - pos(1) - 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, (void*)color)); - volume_id = color[0] + color[1] * 256 + color[2] * 256 * 256; + volume_id = color[0] + (color[1] << 8) + (color[2] << 16); } if ((0 <= volume_id) && (volume_id < (int)m_volumes.volumes.size())) { @@ -3676,6 +3684,83 @@ void GLCanvas3D::_picking_pass() const } } +void GLCanvas3D::_rectangular_selection_picking_pass() const +{ + m_gizmos.set_hover_id(-1); + + std::set idxs; + + if (m_picking_enabled) + { + if (m_multisample_allowed) + glsafe(::glDisable(GL_MULTISAMPLE)); + + glsafe(::glDisable(GL_BLEND)); + glsafe(::glEnable(GL_DEPTH_TEST)); + + glsafe(::glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)); + + _render_volumes_for_picking(); + + if (m_multisample_allowed) + glsafe(::glEnable(GL_MULTISAMPLE)); + + int width = (int)m_rectangle_selection.get_width(); + int height = (int)m_rectangle_selection.get_height(); + int px_count = width * height; + + if (px_count > 0) + { + int left = (int)m_rectangle_selection.get_left(); + int top = get_canvas_size().get_height() - (int)m_rectangle_selection.get_top(); + if ((left >= 0) && (top >= 0)) + { +#define USE_PARALLEL 1 +#if USE_PARALLEL + struct Pixel + { + std::array data; + int id() const { return data[0] + (data[1] << 8) + (data[2] << 16); } + }; + + std::vector frame(px_count); + glsafe(::glReadPixels(left, top, width, height, GL_RGBA, GL_UNSIGNED_BYTE, (void*)frame.data())); + + tbb::spin_mutex mutex; + tbb::parallel_for(tbb::blocked_range(0, frame.size(), (size_t)width), + [this, &frame, &idxs, &mutex](const tbb::blocked_range& range) { + for (size_t i = range.begin(); i < range.end(); ++i) + { + int volume_id = frame[i].id(); + if ((0 <= volume_id) && (volume_id < (int)m_volumes.volumes.size())) + { + mutex.lock(); + idxs.insert(volume_id); + mutex.unlock(); + } + } + } + ); +#else + std::vector frame(4 * px_count); + glsafe(::glReadPixels(left, top, width, height, GL_RGBA, GL_UNSIGNED_BYTE, (void*)frame.data())); + + for (int i = 0; i < px_count; ++i) + { + int px_id = 4 * i; + int volume_id = frame[px_id] + (frame[px_id + 1] << 8) + (frame[px_id + 2] << 16); + if ((0 <= volume_id) && (volume_id < (int)m_volumes.volumes.size())) + idxs.insert(volume_id); + } +#endif // USE_PARALLEL + } + } + } + + m_hover_volume_idxs.assign(idxs.begin(), idxs.end()); + _update_volumes_hover_state(); +} + void GLCanvas3D::_render_background() const { glsafe(::glPushMatrix()); @@ -4161,24 +4246,48 @@ void GLCanvas3D::_update_volumes_hover_state() const { for (GLVolume* v : m_volumes.volumes) { - v->hover = false; + v->hover_select = false; + v->hover_deselect = false; } if (m_hover_volume_idxs.empty()) return; - GLVolume* volume = m_volumes.volumes[get_first_hover_volume_idx()]; - if (volume->is_modifier) - volume->hover = true; - else - { - int object_idx = volume->object_idx(); - int instance_idx = volume->instance_idx(); + bool is_ctrl_pressed = wxGetKeyState(WXK_CONTROL); + bool is_shift_pressed = wxGetKeyState(WXK_SHIFT); + bool is_alt_pressed = wxGetKeyState(WXK_ALT); - for (GLVolume* v : m_volumes.volumes) + for (int i : m_hover_volume_idxs) + { + GLVolume* volume = m_volumes.volumes[i]; + bool deselect = volume->selected && ((is_ctrl_pressed && !is_shift_pressed) || (!is_ctrl_pressed && (m_rectangle_selection.get_state() == GLSelectionRectangle::Deselect))); + bool select = !volume->selected || (volume->is_modifier && ((is_ctrl_pressed && !is_alt_pressed) || (!is_ctrl_pressed && (!m_rectangle_selection.is_dragging() || (m_rectangle_selection.get_state() == GLSelectionRectangle::Select))))); + + if (select || deselect) { - if ((v->object_idx() == object_idx) && (v->instance_idx() == instance_idx)) - v->hover = true; + if (volume->is_modifier && (!deselect || ((volume->object_idx() == m_selection.get_object_idx()) && (volume->instance_idx() == m_selection.get_instance_idx())))) + { + if (deselect) + volume->hover_deselect = true; + else + volume->hover_select = true; + } + else + { + int object_idx = volume->object_idx(); + int instance_idx = volume->instance_idx(); + + for (GLVolume* v : m_volumes.volumes) + { + if ((v->object_idx() == object_idx) && (v->instance_idx() == instance_idx)) + { + if (deselect) + v->hover_deselect = true; + else + v->hover_select = true; + } + } + } } } } diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index e8c301967..bae9f0b5e 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -623,6 +623,7 @@ private: void _refresh_if_shown_on_screen(); void _picking_pass() const; + void _rectangular_selection_picking_pass() const; void _render_background() const; void _render_bed(float theta) const; void _render_axes() const; diff --git a/src/slic3r/GUI/GLSelectionRectangle.cpp b/src/slic3r/GUI/GLSelectionRectangle.cpp index 03ee7e1f6..9684bb5ec 100644 --- a/src/slic3r/GUI/GLSelectionRectangle.cpp +++ b/src/slic3r/GUI/GLSelectionRectangle.cpp @@ -59,10 +59,8 @@ namespace GUI { void GLSelectionRectangle::stop_dragging() { - if (!is_dragging()) - return; - - m_state = Off; + if (is_dragging()) + m_state = Off; } void GLSelectionRectangle::render(const GLCanvas3D& canvas) const diff --git a/src/slic3r/GUI/GLSelectionRectangle.hpp b/src/slic3r/GUI/GLSelectionRectangle.hpp index f26d3eb4b..db72d9415 100644 --- a/src/slic3r/GUI/GLSelectionRectangle.hpp +++ b/src/slic3r/GUI/GLSelectionRectangle.hpp @@ -35,6 +35,13 @@ public: bool is_dragging() const { return m_state != Off; } EState get_state() const { return m_state; } + float get_width() const { return std::abs(m_start_corner(0) - m_end_corner(0)); } + float get_height() const { return std::abs(m_start_corner(1) - m_end_corner(1)); } + float get_left() const { return std::min(m_start_corner(0), m_end_corner(0)); } + float get_right() const { return std::max(m_start_corner(0), m_end_corner(0)); } + float get_top() const { return std::max(m_start_corner(1), m_end_corner(1)); } + float get_bottom() const { return std::min(m_start_corner(1), m_end_corner(1)); } + private: EState m_state = Off; Vec2d m_start_corner; From d2d06c9f73b7885acf43ba59d4c508cc498faf4e Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Thu, 25 Apr 2019 10:21:24 +0200 Subject: [PATCH 10/47] Rectangle selection in 3D scene -> refactored GLVolume member varialbe for hovering --- src/slic3r/GUI/3DScene.cpp | 7 +++---- src/slic3r/GUI/3DScene.hpp | 13 +++++++++---- src/slic3r/GUI/GLCanvas3D.cpp | 11 +++++------ src/slic3r/GUI/GLSelectionRectangle.hpp | 2 +- 4 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/slic3r/GUI/3DScene.cpp b/src/slic3r/GUI/3DScene.cpp index 9d1407b00..873c8b9e6 100644 --- a/src/slic3r/GUI/3DScene.cpp +++ b/src/slic3r/GUI/3DScene.cpp @@ -252,8 +252,7 @@ GLVolume::GLVolume(float r, float g, float b, float a) , zoom_to_volumes(true) , shader_outside_printer_detection_enabled(false) , is_outside(false) - , hover_select(false) - , hover_deselect(false) + , hover(None) , is_modifier(false) , is_wipe_tower(false) , is_extrusion_path(false) @@ -293,9 +292,9 @@ void GLVolume::set_render_color() if (force_native_color) set_render_color(color, 4); else { - if (hover_select) + if (hover == Select) set_render_color(HOVER_SELECT_COLOR, 4); - else if (hover_deselect) + else if (hover == Deselect) set_render_color(HOVER_DESELECT_COLOR, 4); else if (selected) set_render_color(is_outside ? SELECTED_OUTSIDE_COLOR : SELECTED_COLOR, 4); diff --git a/src/slic3r/GUI/3DScene.hpp b/src/slic3r/GUI/3DScene.hpp index fa7d6f7d1..8ed8da43f 100644 --- a/src/slic3r/GUI/3DScene.hpp +++ b/src/slic3r/GUI/3DScene.hpp @@ -234,6 +234,13 @@ public: static const float SLA_SUPPORT_COLOR[4]; static const float SLA_PAD_COLOR[4]; + enum EHoverState : unsigned char + { + None, + Select, + Deselect + }; + GLVolume(float r = 1.f, float g = 1.f, float b = 1.f, float a = 1.f); GLVolume(const float *rgba) : GLVolume(rgba[0], rgba[1], rgba[2], rgba[3]) {} ~GLVolume(); @@ -297,10 +304,8 @@ public: bool shader_outside_printer_detection_enabled; // Wheter or not this volume is outside print volume. bool is_outside; - // Boolean: Is mouse over this object to select it ? - bool hover_select; - // Boolean: Is mouse over this object to deselect it ? - bool hover_deselect; + // Is mouse or rectangle selection over this object to select/deselect it ? + EHoverState hover; // Wheter or not this volume has been generated from a modifier bool is_modifier; // Wheter or not this volume has been generated from the wipe tower diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 621a726b9..9798efecb 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -4246,8 +4246,7 @@ void GLCanvas3D::_update_volumes_hover_state() const { for (GLVolume* v : m_volumes.volumes) { - v->hover_select = false; - v->hover_deselect = false; + v->hover = GLVolume::None; } if (m_hover_volume_idxs.empty()) @@ -4268,9 +4267,9 @@ void GLCanvas3D::_update_volumes_hover_state() const if (volume->is_modifier && (!deselect || ((volume->object_idx() == m_selection.get_object_idx()) && (volume->instance_idx() == m_selection.get_instance_idx())))) { if (deselect) - volume->hover_deselect = true; + volume->hover = GLVolume::Deselect; else - volume->hover_select = true; + volume->hover = GLVolume::Select; } else { @@ -4282,9 +4281,9 @@ void GLCanvas3D::_update_volumes_hover_state() const if ((v->object_idx() == object_idx) && (v->instance_idx() == instance_idx)) { if (deselect) - v->hover_deselect = true; + v->hover = GLVolume::Deselect; else - v->hover_select = true; + v->hover = GLVolume::Select; } } } diff --git a/src/slic3r/GUI/GLSelectionRectangle.hpp b/src/slic3r/GUI/GLSelectionRectangle.hpp index db72d9415..d9869771e 100644 --- a/src/slic3r/GUI/GLSelectionRectangle.hpp +++ b/src/slic3r/GUI/GLSelectionRectangle.hpp @@ -34,7 +34,7 @@ public: bool is_dragging() const { return m_state != Off; } EState get_state() const { return m_state; } - + float get_width() const { return std::abs(m_start_corner(0) - m_end_corner(0)); } float get_height() const { return std::abs(m_start_corner(1) - m_end_corner(1)); } float get_left() const { return std::min(m_start_corner(0), m_end_corner(0)); } From d2597482e0233e33c1e09dae927049b53dc528f4 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Thu, 25 Apr 2019 11:10:01 +0200 Subject: [PATCH 11/47] Added imgui debug dialog for render statistics --- src/libslic3r/Technologies.hpp | 2 ++ src/slic3r/GUI/GLCanvas3D.cpp | 25 ++++++++++++++++++++++++- src/slic3r/GUI/GLCanvas3D.hpp | 14 +++++++++++++- 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index ea3d87888..afd8ee026 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -11,6 +11,8 @@ #define ENABLE_SELECTION_DEBUG_OUTPUT 0 // Renders a small sphere in the center of the bounding box of the current selection when no gizmo is active #define ENABLE_RENDER_SELECTION_CENTER 0 +// Shows an imgui dialog with render related data +#define ENABLE_RENDER_STATISTICS 1 //==================== diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 9798efecb..d58b40fdf 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -52,6 +52,9 @@ #include #include #include +#if ENABLE_RENDER_STATISTICS +#include +#endif // ENABLE_RENDER_STATISTICS static const float TRACKBALLSIZE = 0.8f; static const float GROUND_Z = -0.02f; @@ -1581,6 +1584,10 @@ void GLCanvas3D::render() if (!_set_current() || !_3DScene::init(m_canvas)) return; +#if ENABLE_RENDER_STATISTICS + auto start_time = std::chrono::high_resolution_clock::now(); +#endif // ENABLE_RENDER_STATISTICS + if (m_bed.get_shape().empty()) { // this happens at startup when no data is still saved under <>\AppData\Roaming\Slic3rPE @@ -1666,9 +1673,26 @@ void GLCanvas3D::render() if ((m_layers_editing.last_object_id >= 0) && (m_layers_editing.object_max_z() > 0.0f)) m_layers_editing.render_overlay(*this); +#if ENABLE_RENDER_STATISTICS + ImGuiWrapper& imgui = *wxGetApp().imgui(); + imgui.set_next_window_bg_alpha(0.5f); + imgui.begin(std::string("Render statistics"), ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); + imgui.text("Last frame: "); + ImGui::SameLine(); + imgui.text(std::to_string(m_render_stats.last_frame)); + ImGui::SameLine(); + imgui.text(" ms"); + imgui.end(); +#endif // ENABLE_RENDER_STATISTICS + wxGetApp().imgui()->render(); m_canvas->SwapBuffers(); + +#if ENABLE_RENDER_STATISTICS + auto end_time = std::chrono::high_resolution_clock::now(); + m_render_stats.last_frame = std::chrono::duration_cast(end_time - start_time).count(); +#endif // ENABLE_RENDER_STATISTICS } void GLCanvas3D::select_all() @@ -2751,7 +2775,6 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) m_regenerate_volumes = false; m_selection.translate(cur_pos - m_mouse.drag.start_position_3D); wxGetApp().obj_manipul()->update_settings_value(m_selection); - m_dirty = true; } } diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index bae9f0b5e..9e2d87bdb 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -319,7 +319,6 @@ class GLCanvas3D } }; -private: struct SlaCap { struct Triangles @@ -399,6 +398,15 @@ private: void render(const GLCanvas3D& canvas) const; }; +#if ENABLE_RENDER_STATISTICS + struct RenderStats + { + long long last_frame; + + RenderStats() : last_frame(0) {} + }; +#endif // ENABLE_RENDER_STATISTICS + public: enum ECursorType : unsigned char { @@ -464,6 +472,10 @@ private: GCodePreviewVolumeIndex m_gcode_preview_volume_index; +#if ENABLE_RENDER_STATISTICS + RenderStats m_render_stats; +#endif // ENABLE_RENDER_STATISTICS + public: GLCanvas3D(wxGLCanvas* canvas, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar); ~GLCanvas3D(); From 3fba85079359e3f33f770a29202fdb0c95a3a506 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Thu, 25 Apr 2019 11:50:30 +0200 Subject: [PATCH 12/47] Rectangle selection in 3D scene -> tweaks to the hovering detection logic --- src/slic3r/GUI/GLCanvas3D.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index d58b40fdf..d1354f2f5 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1676,7 +1676,7 @@ void GLCanvas3D::render() #if ENABLE_RENDER_STATISTICS ImGuiWrapper& imgui = *wxGetApp().imgui(); imgui.set_next_window_bg_alpha(0.5f); - imgui.begin(std::string("Render statistics"), ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); + imgui.begin(std::string("Render statistics"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); imgui.text("Last frame: "); ImGui::SameLine(); imgui.text(std::to_string(m_render_stats.last_frame)); @@ -4283,11 +4283,11 @@ void GLCanvas3D::_update_volumes_hover_state() const { GLVolume* volume = m_volumes.volumes[i]; bool deselect = volume->selected && ((is_ctrl_pressed && !is_shift_pressed) || (!is_ctrl_pressed && (m_rectangle_selection.get_state() == GLSelectionRectangle::Deselect))); - bool select = !volume->selected || (volume->is_modifier && ((is_ctrl_pressed && !is_alt_pressed) || (!is_ctrl_pressed && (!m_rectangle_selection.is_dragging() || (m_rectangle_selection.get_state() == GLSelectionRectangle::Select))))); + bool select = (!volume->selected && !is_alt_pressed) || (volume->is_modifier && ((is_ctrl_pressed && !is_alt_pressed) || (!is_ctrl_pressed && (!m_rectangle_selection.is_dragging() || (m_rectangle_selection.get_state() == GLSelectionRectangle::Select))))); if (select || deselect) { - if (volume->is_modifier && (!deselect || ((volume->object_idx() == m_selection.get_object_idx()) && (volume->instance_idx() == m_selection.get_instance_idx())))) + if (volume->is_modifier && ((!deselect && !is_ctrl_pressed) || (deselect && (volume->object_idx() == m_selection.get_object_idx()) && (volume->instance_idx() == m_selection.get_instance_idx())))) { if (deselect) volume->hover = GLVolume::Deselect; From a0640d2d24eeed796f5946e9345083288ac62718 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Thu, 25 Apr 2019 12:31:55 +0200 Subject: [PATCH 13/47] Rectangle selection in 3D scene -> selection update --- src/slic3r/GUI/GLCanvas3D.cpp | 32 ++++++++++++++++++++++++++++++++ src/slic3r/GUI/GLCanvas3D.hpp | 3 +++ 2 files changed, 35 insertions(+) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index d1354f2f5..20babc470 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -2375,6 +2375,7 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) { if (m_picking_enabled && m_rectangle_selection.is_dragging()) { + _update_selection_from_hover(); m_rectangle_selection.stop_dragging(); m_dirty = true; } @@ -2384,6 +2385,7 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) { if (m_picking_enabled && m_rectangle_selection.is_dragging()) { + _update_selection_from_hover(); m_rectangle_selection.stop_dragging(); m_dirty = true; } @@ -2840,6 +2842,9 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) } else if (evt.LeftUp() && m_picking_enabled && m_rectangle_selection.is_dragging()) { + if (evt.ShiftDown() || evt.AltDown()) + _update_selection_from_hover(); + m_rectangle_selection.stop_dragging(); } else if (evt.LeftUp() && !m_mouse.dragging && m_hover_volume_idxs.empty() && !is_layers_editing_enabled()) @@ -5584,6 +5589,33 @@ void GLCanvas3D::_resize_toolbars() const } #endif // !ENABLE_SVG_ICONS +void GLCanvas3D::_update_selection_from_hover() +{ + if (m_hover_volume_idxs.empty()) + return; + + GLSelectionRectangle::EState state = m_rectangle_selection.get_state(); + bool is_ctrl_pressed = wxGetKeyState(WXK_CONTROL); + + bool is_single_modifier = (m_hover_volume_idxs.size() == 1) && m_volumes.volumes[m_hover_volume_idxs.front()]->is_modifier; + + if ((state == GLSelectionRectangle::Select) && !is_ctrl_pressed) + m_selection.clear(); + + for (int idx : m_hover_volume_idxs) + { + if (state == GLSelectionRectangle::Select) + m_selection.add(idx, is_single_modifier && !is_ctrl_pressed); + else + m_selection.remove(idx); + } + + m_gizmos.refresh_on_off_state(m_selection); + m_gizmos.update_data(*this); + post_event(SimpleEvent(EVT_GLCANVAS_OBJECT_SELECT)); + m_dirty = true; +} + const Print* GLCanvas3D::fff_print() const { return (m_process == nullptr) ? nullptr : m_process->fff_print(); diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 9e2d87bdb..57083cfa0 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -714,6 +714,9 @@ private: void _resize_toolbars() const; #endif // !ENABLE_SVG_ICONS + // updates the selection from the content of m_hover_volume_idxs + void _update_selection_from_hover(); + static std::vector _parse_colors(const std::vector& colors); public: From f52f0f36349fa0acb501bd9d8433ce8aa265fbf1 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Thu, 25 Apr 2019 12:33:27 +0200 Subject: [PATCH 14/47] Disabled debug imgui dialog for render statistics --- src/libslic3r/Technologies.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index afd8ee026..45f04b1df 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -12,7 +12,7 @@ // Renders a small sphere in the center of the bounding box of the current selection when no gizmo is active #define ENABLE_RENDER_SELECTION_CENTER 0 // Shows an imgui dialog with render related data -#define ENABLE_RENDER_STATISTICS 1 +#define ENABLE_RENDER_STATISTICS 0 //==================== From 748a4438ba15d94fd34332028b5361b9450aac1b Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Thu, 25 Apr 2019 13:35:24 +0200 Subject: [PATCH 15/47] Attempt to fix build on Linux --- src/slic3r/GUI/3DScene.cpp | 6 +++--- src/slic3r/GUI/3DScene.hpp | 6 +++--- src/slic3r/GUI/GLCanvas3D.cpp | 10 +++++----- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/slic3r/GUI/3DScene.cpp b/src/slic3r/GUI/3DScene.cpp index 873c8b9e6..c96798c6f 100644 --- a/src/slic3r/GUI/3DScene.cpp +++ b/src/slic3r/GUI/3DScene.cpp @@ -252,7 +252,7 @@ GLVolume::GLVolume(float r, float g, float b, float a) , zoom_to_volumes(true) , shader_outside_printer_detection_enabled(false) , is_outside(false) - , hover(None) + , hover(HS_None) , is_modifier(false) , is_wipe_tower(false) , is_extrusion_path(false) @@ -292,9 +292,9 @@ void GLVolume::set_render_color() if (force_native_color) set_render_color(color, 4); else { - if (hover == Select) + if (hover == HS_Select) set_render_color(HOVER_SELECT_COLOR, 4); - else if (hover == Deselect) + else if (hover == HS_Deselect) set_render_color(HOVER_DESELECT_COLOR, 4); else if (selected) set_render_color(is_outside ? SELECTED_OUTSIDE_COLOR : SELECTED_COLOR, 4); diff --git a/src/slic3r/GUI/3DScene.hpp b/src/slic3r/GUI/3DScene.hpp index 8ed8da43f..377d89fe7 100644 --- a/src/slic3r/GUI/3DScene.hpp +++ b/src/slic3r/GUI/3DScene.hpp @@ -236,9 +236,9 @@ public: enum EHoverState : unsigned char { - None, - Select, - Deselect + HS_None, + HS_Select, + HS_Deselect }; GLVolume(float r = 1.f, float g = 1.f, float b = 1.f, float a = 1.f); diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 20babc470..c86ca594c 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -4274,7 +4274,7 @@ void GLCanvas3D::_update_volumes_hover_state() const { for (GLVolume* v : m_volumes.volumes) { - v->hover = GLVolume::None; + v->hover = GLVolume::HS_None; } if (m_hover_volume_idxs.empty()) @@ -4295,9 +4295,9 @@ void GLCanvas3D::_update_volumes_hover_state() const if (volume->is_modifier && ((!deselect && !is_ctrl_pressed) || (deselect && (volume->object_idx() == m_selection.get_object_idx()) && (volume->instance_idx() == m_selection.get_instance_idx())))) { if (deselect) - volume->hover = GLVolume::Deselect; + volume->hover = GLVolume::HS_Deselect; else - volume->hover = GLVolume::Select; + volume->hover = GLVolume::HS_Select; } else { @@ -4309,9 +4309,9 @@ void GLCanvas3D::_update_volumes_hover_state() const if ((v->object_idx() == object_idx) && (v->instance_idx() == instance_idx)) { if (deselect) - v->hover = GLVolume::Deselect; + v->hover = GLVolume::HS_Deselect; else - v->hover = GLVolume::Select; + v->hover = GLVolume::HS_Select; } } } From 905673f344191e53f2e2c08a62a84e4d0480243e Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Thu, 25 Apr 2019 13:41:00 +0200 Subject: [PATCH 16/47] Small refactoring --- src/slic3r/GUI/GLCanvas3D.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index c86ca594c..9a43ca118 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -3658,9 +3658,7 @@ void GLCanvas3D::_refresh_if_shown_on_screen() void GLCanvas3D::_picking_pass() const { - const Vec2d& pos = m_mouse.position; - - if (m_picking_enabled && !m_mouse.dragging && (pos != Vec2d(DBL_MAX, DBL_MAX))) + if (m_picking_enabled && !m_mouse.dragging && (m_mouse.position != Vec2d(DBL_MAX, DBL_MAX))) { m_hover_volume_idxs.clear(); @@ -3694,10 +3692,10 @@ void GLCanvas3D::_picking_pass() const GLubyte color[4] = { 0, 0, 0, 0 }; const Size& cnv_size = get_canvas_size(); - bool inside = (0 <= pos(0)) && (pos(0) < cnv_size.get_width()) && (0 <= pos(1)) && (pos(1) < cnv_size.get_height()); + bool inside = (0 <= m_mouse.position(0)) && (m_mouse.position(0) < cnv_size.get_width()) && (0 <= m_mouse.position(1)) && (m_mouse.position(1) < cnv_size.get_height()); if (inside) { - glsafe(::glReadPixels(pos(0), cnv_size.get_height() - pos(1) - 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, (void*)color)); + glsafe(::glReadPixels(m_mouse.position(0), cnv_size.get_height() - m_mouse.position(1) - 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, (void*)color)); volume_id = color[0] + (color[1] << 8) + (color[2] << 16); } if ((0 <= volume_id) && (volume_id < (int)m_volumes.volumes.size())) From 36252a42daad35d6334e1601e95b85e5bb1cb483 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Thu, 25 Apr 2019 15:08:14 +0200 Subject: [PATCH 17/47] Small optimization --- src/slic3r/GUI/GLCanvas3D.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 9a43ca118..e0884e6b0 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1617,12 +1617,15 @@ void GLCanvas3D::render() wxGetApp().imgui()->new_frame(); - if (m_rectangle_selection.is_dragging()) - // picking pass using rectangle selection - _rectangular_selection_picking_pass(); - else - // regular picking pass - _picking_pass(); + if (m_picking_enabled) + { + if (m_rectangle_selection.is_dragging()) + // picking pass using rectangle selection + _rectangular_selection_picking_pass(); + else + // regular picking pass + _picking_pass(); + } // draw scene glsafe(::glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)); From 3d48190616e756e9c754b70de9ba8304066288ef Mon Sep 17 00:00:00 2001 From: YuSanka Date: Thu, 25 Apr 2019 16:19:50 +0200 Subject: [PATCH 18/47] After merge fixing --- src/slic3r/GUI/GUI_ObjectList.cpp | 15 ++++++++------- src/slic3r/GUI/Plater.cpp | 3 ++- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index ff9bd763e..054f74d70 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -1182,8 +1182,8 @@ void ObjectList::append_menu_items_osx(wxMenu* menu) wxMenuItem* ObjectList::append_menu_item_fix_through_netfabb(wxMenu* menu) { -// if (!is_windows10()) -// return; + if (!is_windows10()) + return nullptr; wxMenuItem* menu_item = append_menu_item(menu, wxID_ANY, _(L("Fix through the Netfabb")), "", [this](wxCommandEvent&) { fix_through_netfabb(); }, "", menu); menu->AppendSeparator(); @@ -2735,19 +2735,20 @@ void ObjectList::update_item_error_icon(const int obj_idx, const int vol_idx) co if (get_mesh_errors_count(obj_idx, vol_idx) == 0) { // delete Error_icon if all errors are fixed wxVariant variant; - variant << PrusaDataViewBitmapText(from_u8((*m_objects)[obj_idx]->name), wxNullBitmap); + variant << DataViewBitmapText(from_u8((*m_objects)[obj_idx]->name), wxNullBitmap); m_objects_model->SetValue(variant, item, 0); } } void ObjectList::msw_rescale() { + const int em = wxGetApp().em_unit(); // update min size !!! A width of control shouldn't be a wxDefaultCoord - SetMinSize(wxSize(1, 15 * wxGetApp().em_unit())); + SetMinSize(wxSize(1, 15 * em)); - GetColumn(0)->SetWidth(19 * wxGetApp().em_unit()); - GetColumn(1)->SetWidth(8 * wxGetApp().em_unit()); - GetColumn(2)->SetWidth(int(2 * wxGetApp().em_unit())); + GetColumn(0)->SetWidth(19 * em); + GetColumn(1)->SetWidth( 8 * em); + GetColumn(2)->SetWidth( 2 * em); // rescale all icons, used by ObjectList rescale_icons(); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 91ae153dd..c221b5066 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -2951,7 +2951,8 @@ bool Plater::priv::init_common_menu(wxMenu* menu, const bool is_part/* = false*/ { q->Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_mirror()); }, item_mirror->GetId()); q->Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_delete()); }, item_delete->GetId()); - q->Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_fix_through_netfabb()); }, item_fix_through_netfabb->GetId()); + if (item_fix_through_netfabb) + q->Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_fix_through_netfabb()); }, item_fix_through_netfabb->GetId()); } return true; From 8857d556f65808182bf1069bde4e7121b776445d Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Fri, 26 Apr 2019 13:37:34 +0200 Subject: [PATCH 19/47] Rectangle selection in 3D scene -> tweaks to hovering detection and selection update logic --- src/slic3r/GUI/GLCanvas3D.cpp | 102 ++++++++++++++++++++++++++++------ 1 file changed, 85 insertions(+), 17 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index e0884e6b0..9a7c8834e 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -4281,29 +4281,75 @@ void GLCanvas3D::_update_volumes_hover_state() const if (m_hover_volume_idxs.empty()) return; - bool is_ctrl_pressed = wxGetKeyState(WXK_CONTROL); - bool is_shift_pressed = wxGetKeyState(WXK_SHIFT); - bool is_alt_pressed = wxGetKeyState(WXK_ALT); + bool ctrl_pressed = wxGetKeyState(WXK_CONTROL); // additive select/deselect + bool shift_pressed = wxGetKeyState(WXK_SHIFT); // select by rectangle + bool alt_pressed = wxGetKeyState(WXK_ALT); // deselect by rectangle + + if (alt_pressed && (shift_pressed || ctrl_pressed)) + { + // illegal combinations of keys + m_hover_volume_idxs.clear(); + return; + } + + bool selection_modifiers_only = m_selection.is_empty() || m_selection.is_any_modifier(); + + bool hover_modifiers_only = true; + for (int i : m_hover_volume_idxs) + { + if (!m_volumes.volumes[i]->is_modifier) + { + hover_modifiers_only = false; + break; + } + } + + std::set> hover_instances; + for (int i : m_hover_volume_idxs) + { + const GLVolume& v = *m_volumes.volumes[i]; + hover_instances.insert(std::make_pair(v.object_idx(), v.instance_idx())); + } + + bool hover_from_single_instance = hover_instances.size() == 1; + + if (hover_modifiers_only && !hover_from_single_instance) + { + // do not allow to select volumes from different instances + m_hover_volume_idxs.clear(); + return; + } for (int i : m_hover_volume_idxs) { - GLVolume* volume = m_volumes.volumes[i]; - bool deselect = volume->selected && ((is_ctrl_pressed && !is_shift_pressed) || (!is_ctrl_pressed && (m_rectangle_selection.get_state() == GLSelectionRectangle::Deselect))); - bool select = (!volume->selected && !is_alt_pressed) || (volume->is_modifier && ((is_ctrl_pressed && !is_alt_pressed) || (!is_ctrl_pressed && (!m_rectangle_selection.is_dragging() || (m_rectangle_selection.get_state() == GLSelectionRectangle::Select))))); + GLVolume& volume = *m_volumes.volumes[i]; + if (volume.hover != GLVolume::HS_None) + continue; + + bool deselect = volume.selected && ((ctrl_pressed && !shift_pressed) || alt_pressed); + // (volume->is_modifier && !selection_modifiers_only && !is_ctrl_pressed) -> allows hovering on selected modifiers belonging to selection of type Instance + bool select = (!volume.selected || (volume.is_modifier && !selection_modifiers_only && !ctrl_pressed)) && !alt_pressed; if (select || deselect) { - if (volume->is_modifier && ((!deselect && !is_ctrl_pressed) || (deselect && (volume->object_idx() == m_selection.get_object_idx()) && (volume->instance_idx() == m_selection.get_instance_idx())))) + bool as_volume = + volume.is_modifier && hover_from_single_instance && !ctrl_pressed && + ( + (!deselect) || + (deselect && !m_selection.is_single_full_instance() && (volume.object_idx() == m_selection.get_object_idx()) && (volume.instance_idx() == m_selection.get_instance_idx())) + ); + + if (as_volume) { if (deselect) - volume->hover = GLVolume::HS_Deselect; + volume.hover = GLVolume::HS_Deselect; else - volume->hover = GLVolume::HS_Select; + volume.hover = GLVolume::HS_Select; } else { - int object_idx = volume->object_idx(); - int instance_idx = volume->instance_idx(); + int object_idx = volume.object_idx(); + int instance_idx = volume.instance_idx(); for (GLVolume* v : m_volumes.volumes) { @@ -5592,23 +5638,45 @@ void GLCanvas3D::_resize_toolbars() const void GLCanvas3D::_update_selection_from_hover() { + bool ctrl_pressed = wxGetKeyState(WXK_CONTROL); + if (m_hover_volume_idxs.empty()) + { + if (!ctrl_pressed && (m_rectangle_selection.get_state() == GLSelectionRectangle::Select)) + m_selection.clear(); + return; + } GLSelectionRectangle::EState state = m_rectangle_selection.get_state(); - bool is_ctrl_pressed = wxGetKeyState(WXK_CONTROL); - bool is_single_modifier = (m_hover_volume_idxs.size() == 1) && m_volumes.volumes[m_hover_volume_idxs.front()]->is_modifier; + bool hover_modifiers_only = true; + for (int i : m_hover_volume_idxs) + { + if (!m_volumes.volumes[i]->is_modifier) + { + hover_modifiers_only = false; + break; + } + } - if ((state == GLSelectionRectangle::Select) && !is_ctrl_pressed) + if ((state == GLSelectionRectangle::Select) && !ctrl_pressed) m_selection.clear(); - for (int idx : m_hover_volume_idxs) + for (int i : m_hover_volume_idxs) { if (state == GLSelectionRectangle::Select) - m_selection.add(idx, is_single_modifier && !is_ctrl_pressed); + { + if (hover_modifiers_only) + { + const GLVolume& v = *m_volumes.volumes[i]; + m_selection.add_volume(v.object_idx(), v.volume_idx(), v.instance_idx(), false); + } + else + m_selection.add(i, false); + } else - m_selection.remove(idx); + m_selection.remove(i); } m_gizmos.refresh_on_off_state(m_selection); From 818f7ad647d0a5ed261820ddce8638e6a18ede72 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Fri, 26 Apr 2019 14:07:46 +0200 Subject: [PATCH 20/47] Rectangle selection in 3D scene -> Fixed selection cleared when mouse left-up follows shift-up --- src/slic3r/GUI/GLCanvas3D.cpp | 12 +++++++++++- src/slic3r/GUI/GLCanvas3D.hpp | 1 + 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index f4b6a2b99..985f7ded2 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -675,6 +675,7 @@ GLCanvas3D::Mouse::Mouse() : dragging(false) , position(DBL_MAX, DBL_MAX) , scene_position(DBL_MAX, DBL_MAX, DBL_MAX) + , ignore_left_up(false) { } @@ -2387,6 +2388,7 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) { _update_selection_from_hover(); m_rectangle_selection.stop_dragging(); + m_mouse.ignore_left_up = true; m_dirty = true; } set_cursor(Standard); @@ -2397,6 +2399,7 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) { _update_selection_from_hover(); m_rectangle_selection.stop_dragging(); + m_mouse.ignore_left_up = true; m_dirty = true; } set_cursor(Standard); @@ -2409,12 +2412,18 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) if (keyCode == WXK_SHIFT) { if (m_picking_enabled && (m_gizmos.get_current_type() != GLGizmosManager::SlaSupports)) + { + m_mouse.ignore_left_up = false; set_cursor(Cross); + } } else if (keyCode == WXK_ALT) { if (m_picking_enabled && (m_gizmos.get_current_type() != GLGizmosManager::SlaSupports)) + { + m_mouse.ignore_left_up = false; set_cursor(Cross); + } } else if (keyCode == WXK_CONTROL) m_dirty = true; @@ -2536,6 +2545,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) m_mouse.set_start_position_3D_as_invalid(); m_mouse.set_start_position_2D_as_invalid(); m_mouse.dragging = false; + m_mouse.ignore_left_up = false; m_dirty = true; if (m_canvas->HasCapture()) @@ -2857,7 +2867,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) m_rectangle_selection.stop_dragging(); } - else if (evt.LeftUp() && !m_mouse.dragging && m_hover_volume_idxs.empty() && !is_layers_editing_enabled()) + else if (evt.LeftUp() && !m_mouse.ignore_left_up && !m_mouse.dragging && m_hover_volume_idxs.empty() && !is_layers_editing_enabled()) { // deselect and propagate event through callback if (!evt.ShiftDown() && m_picking_enabled) diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 4d2c0c2b2..4670b7221 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -303,6 +303,7 @@ class GLCanvas3D Vec2d position; Vec3d scene_position; Drag drag; + bool ignore_left_up; Mouse(); From fdf1b8af81a7d7d52f720b0f639c11ee6113560a Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Mon, 29 Apr 2019 08:26:08 +0200 Subject: [PATCH 21/47] Rectangle selection -> Removed cursor change --- src/slic3r/GUI/GLCanvas3D.cpp | 8 ++++---- src/slic3r/GUI/Gizmos/GLGizmosManager.cpp | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 985f7ded2..e57eead30 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -2391,7 +2391,7 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) m_mouse.ignore_left_up = true; m_dirty = true; } - set_cursor(Standard); +// set_cursor(Standard); } else if (keyCode == WXK_ALT) { @@ -2402,7 +2402,7 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) m_mouse.ignore_left_up = true; m_dirty = true; } - set_cursor(Standard); +// set_cursor(Standard); } else if (keyCode == WXK_CONTROL) m_dirty = true; @@ -2414,7 +2414,7 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) if (m_picking_enabled && (m_gizmos.get_current_type() != GLGizmosManager::SlaSupports)) { m_mouse.ignore_left_up = false; - set_cursor(Cross); +// set_cursor(Cross); } } else if (keyCode == WXK_ALT) @@ -2422,7 +2422,7 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) if (m_picking_enabled && (m_gizmos.get_current_type() != GLGizmosManager::SlaSupports)) { m_mouse.ignore_left_up = false; - set_cursor(Cross); +// set_cursor(Cross); } } else if (keyCode == WXK_CONTROL) diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp index b7e1b3f07..a00303634 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp @@ -861,14 +861,14 @@ bool GLGizmosManager::on_key(wxKeyEvent& evt, GLCanvas3D& canvas) } } - if (processed) - canvas.set_cursor(GLCanvas3D::Standard); +// if (processed) +// canvas.set_cursor(GLCanvas3D::Standard); } else if (evt.GetEventType() == wxEVT_KEY_DOWN) { if ((m_current == SlaSupports) && ((keyCode == WXK_SHIFT) || (keyCode == WXK_ALT)) && reinterpret_cast(get_current())->is_in_editing_mode()) { - canvas.set_cursor(GLCanvas3D::Cross); +// canvas.set_cursor(GLCanvas3D::Cross); processed = true; } } From dfe271965679c20cc300ff2f0b386ea10187343a Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Mon, 29 Apr 2019 08:31:32 +0200 Subject: [PATCH 22/47] Rectangle selection -> Min size of rectangle selection set to 1 pixel --- src/slic3r/GUI/GLCanvas3D.cpp | 75 +++++++++++++++++------------------ 1 file changed, 36 insertions(+), 39 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index e57eead30..74ced68bc 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -3751,55 +3751,52 @@ void GLCanvas3D::_rectangular_selection_picking_pass() const if (m_multisample_allowed) glsafe(::glEnable(GL_MULTISAMPLE)); - int width = (int)m_rectangle_selection.get_width(); - int height = (int)m_rectangle_selection.get_height(); + int width = std::max((int)m_rectangle_selection.get_width(), 1); + int height = std::max((int)m_rectangle_selection.get_height(), 1); int px_count = width * height; - if (px_count > 0) + int left = (int)m_rectangle_selection.get_left(); + int top = get_canvas_size().get_height() - (int)m_rectangle_selection.get_top(); + if ((left >= 0) && (top >= 0)) { - int left = (int)m_rectangle_selection.get_left(); - int top = get_canvas_size().get_height() - (int)m_rectangle_selection.get_top(); - if ((left >= 0) && (top >= 0)) - { #define USE_PARALLEL 1 #if USE_PARALLEL - struct Pixel + struct Pixel + { + std::array data; + int id() const { return data[0] + (data[1] << 8) + (data[2] << 16); } + }; + + std::vector frame(px_count); + glsafe(::glReadPixels(left, top, width, height, GL_RGBA, GL_UNSIGNED_BYTE, (void*)frame.data())); + + tbb::spin_mutex mutex; + tbb::parallel_for(tbb::blocked_range(0, frame.size(), (size_t)width), + [this, &frame, &idxs, &mutex](const tbb::blocked_range& range) { + for (size_t i = range.begin(); i < range.end(); ++i) { - std::array data; - int id() const { return data[0] + (data[1] << 8) + (data[2] << 16); } - }; - - std::vector frame(px_count); - glsafe(::glReadPixels(left, top, width, height, GL_RGBA, GL_UNSIGNED_BYTE, (void*)frame.data())); - - tbb::spin_mutex mutex; - tbb::parallel_for(tbb::blocked_range(0, frame.size(), (size_t)width), - [this, &frame, &idxs, &mutex](const tbb::blocked_range& range) { - for (size_t i = range.begin(); i < range.end(); ++i) + int volume_id = frame[i].id(); + if ((0 <= volume_id) && (volume_id < (int)m_volumes.volumes.size())) { - int volume_id = frame[i].id(); - if ((0 <= volume_id) && (volume_id < (int)m_volumes.volumes.size())) - { - mutex.lock(); - idxs.insert(volume_id); - mutex.unlock(); - } + mutex.lock(); + idxs.insert(volume_id); + mutex.unlock(); } } - ); -#else - std::vector frame(4 * px_count); - glsafe(::glReadPixels(left, top, width, height, GL_RGBA, GL_UNSIGNED_BYTE, (void*)frame.data())); - - for (int i = 0; i < px_count; ++i) - { - int px_id = 4 * i; - int volume_id = frame[px_id] + (frame[px_id + 1] << 8) + (frame[px_id + 2] << 16); - if ((0 <= volume_id) && (volume_id < (int)m_volumes.volumes.size())) - idxs.insert(volume_id); - } -#endif // USE_PARALLEL } + ); +#else + std::vector frame(4 * px_count); + glsafe(::glReadPixels(left, top, width, height, GL_RGBA, GL_UNSIGNED_BYTE, (void*)frame.data())); + + for (int i = 0; i < px_count; ++i) + { + int px_id = 4 * i; + int volume_id = frame[px_id] + (frame[px_id + 1] << 8) + (frame[px_id + 2] << 16); + if ((0 <= volume_id) && (volume_id < (int)m_volumes.volumes.size())) + idxs.insert(volume_id); + } +#endif // USE_PARALLEL } } From 2a741bf8f88510114539f63eabc470370a45f6a6 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Mon, 29 Apr 2019 10:01:28 +0200 Subject: [PATCH 23/47] Rectangle selection -> Lighter color for deselect hover --- src/slic3r/GUI/3DScene.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/3DScene.cpp b/src/slic3r/GUI/3DScene.cpp index c96798c6f..037f70962 100644 --- a/src/slic3r/GUI/3DScene.cpp +++ b/src/slic3r/GUI/3DScene.cpp @@ -224,7 +224,7 @@ void GLIndexedVertexArray::render( const float GLVolume::SELECTED_COLOR[4] = { 0.0f, 1.0f, 0.0f, 1.0f }; const float GLVolume::HOVER_SELECT_COLOR[4] = { 0.4f, 0.9f, 0.1f, 1.0f }; -const float GLVolume::HOVER_DESELECT_COLOR[4] = { 0.9f, 0.4f, 0.1f, 1.0f }; +const float GLVolume::HOVER_DESELECT_COLOR[4] = { 1.0f, 0.75f, 0.75f, 1.0f }; const float GLVolume::OUTSIDE_COLOR[4] = { 0.0f, 0.38f, 0.8f, 1.0f }; const float GLVolume::SELECTED_OUTSIDE_COLOR[4] = { 0.19f, 0.58f, 1.0f, 1.0f }; const float GLVolume::DISABLED_COLOR[4] = { 0.25f, 0.25f, 0.25f, 1.0f }; From 2a47f0dc9249470815b4f4fe76dc39fc46fd29ba Mon Sep 17 00:00:00 2001 From: YuSanka Date: Mon, 29 Apr 2019 15:27:59 +0200 Subject: [PATCH 24/47] ObjectList improvements: Added warning icon for Parts with a repaired errors --- src/libslic3r/Model.cpp | 15 ++- src/libslic3r/Model.hpp | 2 + src/slic3r/GUI/GUI_ObjectList.cpp | 111 ++++++++++++---------- src/slic3r/GUI/GUI_ObjectList.hpp | 2 +- src/slic3r/GUI/GUI_ObjectManipulation.cpp | 13 ++- src/slic3r/GUI/GUI_ObjectManipulation.hpp | 3 +- src/slic3r/GUI/Plater.cpp | 3 +- src/slic3r/GUI/wxExtensions.cpp | 85 ++++++++++++++--- src/slic3r/GUI/wxExtensions.hpp | 35 +++---- 9 files changed, 180 insertions(+), 89 deletions(-) diff --git a/src/libslic3r/Model.cpp b/src/libslic3r/Model.cpp index d1f426c5b..17769a8e7 100644 --- a/src/libslic3r/Model.cpp +++ b/src/libslic3r/Model.cpp @@ -1485,9 +1485,10 @@ stl_stats ModelObject::get_object_stl_stats() const int ModelObject::get_mesh_errors_count(const int vol_idx /*= -1*/) const { - const stl_stats& stats = vol_idx == -1 ? - get_object_stl_stats() : - this->volumes[vol_idx]->mesh.stl.stats; + if (vol_idx >= 0) + return this->volumes[vol_idx]->get_mesh_errors_count(); + + const stl_stats& stats = get_object_stl_stats(); return stats.degenerate_facets + stats.edges_fixed + stats.facets_removed + stats.facets_added + stats.facets_reversed + stats.backwards_edges; @@ -1558,6 +1559,14 @@ void ModelVolume::calculate_convex_hull() m_convex_hull = mesh.convex_hull_3d(); } +int ModelVolume::get_mesh_errors_count() const +{ + const stl_stats& stats = this->mesh.stl.stats; + + return stats.degenerate_facets + stats.edges_fixed + stats.facets_removed + + stats.facets_added + stats.facets_reversed + stats.backwards_edges; +} + const TriangleMesh& ModelVolume::get_convex_hull() const { return m_convex_hull; diff --git a/src/libslic3r/Model.hpp b/src/libslic3r/Model.hpp index 0fc3fc168..4efc19f58 100644 --- a/src/libslic3r/Model.hpp +++ b/src/libslic3r/Model.hpp @@ -375,6 +375,8 @@ public: void calculate_convex_hull(); const TriangleMesh& get_convex_hull() const; + // Get count of errors in the mesh + int get_mesh_errors_count() const; // Helpers for loading / storing into AMF / 3MF files. static ModelVolumeType type_from_string(const std::string &s); diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 054f74d70..1a4245965 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -438,8 +438,8 @@ void ObjectList::update_name_in_model(const wxDataViewItem& item) const void ObjectList::init_icons() { - m_bmp_modifiermesh = ScalableBitmap(nullptr, "add_modifier"); // Add part - m_bmp_solidmesh = ScalableBitmap(nullptr, "add_part"); // Add modifier + m_bmp_solidmesh = ScalableBitmap(nullptr, "add_part"); // Add part + m_bmp_modifiermesh = ScalableBitmap(nullptr, "add_modifier"); // Add modifier m_bmp_support_enforcer = ScalableBitmap(nullptr, "support_enforcer");// Add support enforcer m_bmp_support_blocker = ScalableBitmap(nullptr, "support_blocker"); // Add support blocker @@ -455,6 +455,8 @@ void ObjectList::init_icons() // init icon for manifold warning m_bmp_manifold_warning = ScalableBitmap(nullptr, "exclamation"); + // Set warning bitmap for the model + m_objects_model->SetWarningBitmap(&m_bmp_manifold_warning.bmp()); // init bitmap for "Split to sub-objects" context menu m_bmp_split = ScalableBitmap(nullptr, "split_parts_SMALL"); @@ -468,8 +470,8 @@ void ObjectList::rescale_icons() m_bmp_vector.clear(); m_bmp_vector.reserve(4); // bitmaps for different types of parts for (ScalableBitmap* bitmap : std::vector { - &m_bmp_modifiermesh, // Add part - &m_bmp_solidmesh, // Add modifier + &m_bmp_solidmesh, // Add part + &m_bmp_modifiermesh, // Add modifier &m_bmp_support_enforcer, // Add support enforcer &m_bmp_support_blocker }) // Add support blocker { @@ -480,6 +482,9 @@ void ObjectList::rescale_icons() m_objects_model->SetVolumeBitmaps(m_bmp_vector); m_bmp_manifold_warning.msw_rescale(); + // Set warning bitmap for the model + m_objects_model->SetWarningBitmap(&m_bmp_manifold_warning.bmp()); + m_bmp_split.msw_rescale(); m_bmp_cog.msw_rescale(); @@ -541,7 +546,8 @@ void ObjectList::paste_volumes_into_list(int obj_idx, const ModelVolumePtrs& vol for (const ModelVolume* volume : volumes) { - auto vol_item = m_objects_model->AddVolumeChild(object_item, volume->name, volume->type(), + const wxDataViewItem& vol_item = m_objects_model->AddVolumeChild(object_item, volume->name, volume->type(), + volume->get_mesh_errors_count()>0 , volume->config.has("extruder") ? volume->config.option("extruder")->value : 0); auto opt_keys = volume->config.keys(); if (!opt_keys.empty() && !((opt_keys.size() == 1) && (opt_keys[0] == "extruder"))) @@ -617,12 +623,13 @@ void ObjectList::OnContextMenu(wxDataViewEvent&) if (title == " ") show_context_menu(); - else if (title == _("Name") && pt.x > 1.6f*wxGetApp().em_unit() && pt.x < 3.2f*wxGetApp().em_unit()) + else if (title == _("Name")) { int obj_idx, vol_idx; get_selected_item_indexes(obj_idx, vol_idx, item); - - if (is_windows10() && get_mesh_errors_count(obj_idx, vol_idx) > 0) + + if (is_windows10() && get_mesh_errors_count(obj_idx, vol_idx) > 0 && + pt.x > 2*wxGetApp().em_unit() && pt.x < 4*wxGetApp().em_unit() ) fix_through_netfabb(); } @@ -1374,21 +1381,23 @@ void ObjectList::load_subobject(ModelVolumeType type) int obj_idx = m_objects_model->GetIdByItem(item); if (obj_idx < 0) return; - wxArrayString part_names; - load_part((*m_objects)[obj_idx], part_names, type); + + std::vector> volumes_info; + load_part((*m_objects)[obj_idx], volumes_info, type); + changed_object(obj_idx); - for (int i = 0; i < part_names.size(); ++i) { - const wxDataViewItem sel_item = m_objects_model->AddVolumeChild(item, part_names.Item(i), type); - - if (i == part_names.size() - 1) - select_item(sel_item); - } + wxDataViewItem sel_item; + for (const auto& volume : volumes_info ) + sel_item = m_objects_model->AddVolumeChild(item, volume.first, type, volume.second); + + if (sel_item) + select_item(sel_item); } void ObjectList::load_part( ModelObject* model_object, - wxArrayString& part_names, + std::vector> &volumes_info, ModelVolumeType type) { wxWindow* parent = wxGetApp().tab_panel()->GetPage(0); @@ -1424,7 +1433,7 @@ void ObjectList::load_part( ModelObject* model_object, new_volume->set_type(type); new_volume->name = boost::filesystem::path(input_file).filename().string(); - part_names.Add(from_u8(new_volume->name)); + volumes_info.push_back(std::make_pair(from_u8(new_volume->name), new_volume->get_mesh_errors_count()>0)); // set a default extruder value, since user can't add it manually new_volume->config.set_key_value("extruder", new ConfigOptionInt(0)); @@ -1580,7 +1589,8 @@ void ObjectList::load_generic_subobject(const std::string& type_name, const Mode changed_object(obj_idx); const auto object_item = m_objects_model->GetTopParent(GetSelection()); - select_item(m_objects_model->AddVolumeChild(object_item, name, type)); + select_item(m_objects_model->AddVolumeChild(object_item, name, type, + new_volume->get_mesh_errors_count()>0)); #ifndef __WXOSX__ //#ifdef __WXMSW__ // #ys_FIXME selection_changed(); #endif //no __WXOSX__ //__WXMSW__ @@ -1612,6 +1622,10 @@ void ObjectList::del_subobject_item(wxDataViewItem& item) else if (!del_subobject_from_object(obj_idx, idx, type)) return; + // If last volume item with warning was deleted, unmark object item + if (type == itVolume && (*m_objects)[obj_idx]->get_mesh_errors_count() == 0) + m_objects_model->DeleteWarningIcon(m_objects_model->GetParent(item)); + m_objects_model->Delete(item); } @@ -1718,18 +1732,18 @@ void ObjectList::split() else parent = item; - for (auto id = 0; id < model_object->volumes.size(); id++) { - const auto vol_item = m_objects_model->AddVolumeChild(parent, from_u8(model_object->volumes[id]->name), - model_object->volumes[id]->is_modifier() ? - ModelVolumeType::PARAMETER_MODIFIER : ModelVolumeType::MODEL_PART, - model_object->volumes[id]->config.has("extruder") ? - model_object->volumes[id]->config.option("extruder")->value : 0, + for (const ModelVolume* volume : model_object->volumes) { + const wxDataViewItem& vol_item = m_objects_model->AddVolumeChild(parent, from_u8(volume->name), + volume->is_modifier() ? ModelVolumeType::PARAMETER_MODIFIER : ModelVolumeType::MODEL_PART, + volume->get_mesh_errors_count()>0, + volume->config.has("extruder") ? + volume->config.option("extruder")->value : 0, false); // add settings to the part, if it has those - auto opt_keys = model_object->volumes[id]->config.keys(); + auto opt_keys = volume->config.keys(); if ( !(opt_keys.size() == 1 && opt_keys[0] == "extruder") ) { select_item(m_objects_model->AddSettingsChild(vol_item)); - /*Collapse*/Expand(vol_item); + Expand(vol_item); } } @@ -1896,28 +1910,23 @@ void ObjectList::add_object_to_list(size_t obj_idx) const wxString& item_name = from_u8(model_object->name); const auto item = m_objects_model->Add(item_name, !model_object->config.has("extruder") ? 0 : - model_object->config.option("extruder")->value); - - // Add error icon if detected auto-repaire - if (get_mesh_errors_count(obj_idx) > 0) { - wxVariant variant; - variant << DataViewBitmapText(item_name, m_bmp_manifold_warning.bmp()); - m_objects_model->SetValue(variant, item, 0); - } + model_object->config.option("extruder")->value, + get_mesh_errors_count(obj_idx) > 0); // add volumes to the object if (model_object->volumes.size() > 1) { - for (auto id = 0; id < model_object->volumes.size(); id++) { - auto vol_item = m_objects_model->AddVolumeChild(item, - from_u8(model_object->volumes[id]->name), - model_object->volumes[id]->type(), - !model_object->volumes[id]->config.has("extruder") ? 0 : - model_object->volumes[id]->config.option("extruder")->value, + for (const ModelVolume* volume : model_object->volumes) { + const wxDataViewItem& vol_item = m_objects_model->AddVolumeChild(item, + from_u8(volume->name), + volume->type(), + volume->get_mesh_errors_count()>0, + !volume->config.has("extruder") ? 0 : + volume->config.option("extruder")->value, false); - auto opt_keys = model_object->volumes[id]->config.keys(); + auto opt_keys = volume->config.keys(); if (!opt_keys.empty() && !(opt_keys.size() == 1 && opt_keys[0] == "extruder")) { select_item(m_objects_model->AddSettingsChild(vol_item)); - /*Collapse*/Expand(vol_item); + Expand(vol_item); } } Expand(item); @@ -1931,7 +1940,7 @@ void ObjectList::add_object_to_list(size_t obj_idx) auto opt_keys = model_object->config.keys(); if (!opt_keys.empty() && !(opt_keys.size() == 1 && opt_keys[0] == "extruder")) { select_item(m_objects_model->AddSettingsChild(item)); - /*Collapse*/Expand(item); + Expand(item); } #ifndef __WXOSX__ @@ -2732,11 +2741,15 @@ void ObjectList::update_item_error_icon(const int obj_idx, const int vol_idx) co if (!item) return; - if (get_mesh_errors_count(obj_idx, vol_idx) == 0) { - // delete Error_icon if all errors are fixed - wxVariant variant; - variant << DataViewBitmapText(from_u8((*m_objects)[obj_idx]->name), wxNullBitmap); - m_objects_model->SetValue(variant, item, 0); + if (get_mesh_errors_count(obj_idx, vol_idx) == 0) + { + // if whole object has no errors more, + if (get_mesh_errors_count(obj_idx) == 0) + // unmark all items in the object + m_objects_model->DeleteWarningIcon(vol_idx >= 0 ? m_objects_model->GetParent(item) : item, true); + else + // unmark fixed item only + m_objects_model->DeleteWarningIcon(item); } } diff --git a/src/slic3r/GUI/GUI_ObjectList.hpp b/src/slic3r/GUI/GUI_ObjectList.hpp index 53acaaf3c..1ca358cd9 100644 --- a/src/slic3r/GUI/GUI_ObjectList.hpp +++ b/src/slic3r/GUI/GUI_ObjectList.hpp @@ -216,7 +216,7 @@ public: void update_opt_keys(t_config_option_keys& t_optopt_keys); void load_subobject(ModelVolumeType type); - void load_part(ModelObject* model_object, wxArrayString& part_names, ModelVolumeType type); + void load_part(ModelObject* model_object, std::vector> &volumes_info, ModelVolumeType type); void load_generic_subobject(const std::string& type_name, const ModelVolumeType type); void del_object(const int obj_idx); void del_subobject_item(wxDataViewItem& item); diff --git a/src/slic3r/GUI/GUI_ObjectManipulation.cpp b/src/slic3r/GUI/GUI_ObjectManipulation.cpp index 29e8c2558..eea53e828 100644 --- a/src/slic3r/GUI/GUI_ObjectManipulation.cpp +++ b/src/slic3r/GUI/GUI_ObjectManipulation.cpp @@ -21,7 +21,7 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) : OG_Settings(parent, true) #ifndef __APPLE__ , m_focused_option("") - , m_manifold_warning_bmp(create_scaled_bitmap(parent, "exclamation")) + , m_manifold_warning_bmp(ScalableBitmap(parent, "exclamation")) #endif // __APPLE__ { m_og->set_name(_(L("Object Manipulation"))); @@ -367,8 +367,7 @@ void ObjectManipulation::emulate_kill_focus() void ObjectManipulation::update_manifold_warning_icon_state(const wxString& tooltip) { - m_fix_throught_netfab_bitmap->SetBitmap(tooltip.IsEmpty() ? wxNullBitmap : m_manifold_warning_bmp); - + m_fix_throught_netfab_bitmap->SetBitmap(tooltip.IsEmpty() ? wxNullBitmap : m_manifold_warning_bmp.bmp()); m_fix_throught_netfab_bitmap->SetToolTip(tooltip); } @@ -559,5 +558,13 @@ void ObjectManipulation::on_fill_empty_value(const std::string& opt_key) m_og->set_value(opt_key, double_to_string(value)); } +void ObjectManipulation::msw_rescale() +{ + m_manifold_warning_bmp.msw_rescale(); + m_fix_throught_netfab_bitmap->SetBitmap(m_manifold_warning_bmp.bmp()); + + get_og()->msw_rescale(); +} + } //namespace GUI } //namespace Slic3r \ No newline at end of file diff --git a/src/slic3r/GUI/GUI_ObjectManipulation.hpp b/src/slic3r/GUI/GUI_ObjectManipulation.hpp index 9ced31a1f..f691dcc83 100644 --- a/src/slic3r/GUI/GUI_ObjectManipulation.hpp +++ b/src/slic3r/GUI/GUI_ObjectManipulation.hpp @@ -79,7 +79,7 @@ class ObjectManipulation : public OG_Settings bool m_uniform_scale {true}; LockButton* m_lock_bnt{ nullptr }; - wxBitmap m_manifold_warning_bmp; + ScalableBitmap m_manifold_warning_bmp; wxStaticBitmap* m_fix_throught_netfab_bitmap; #ifndef __APPLE__ @@ -112,6 +112,7 @@ public: #endif // __APPLE__ void update_manifold_warning_icon_state(const wxString& tooltip); + void msw_rescale(); private: void reset_settings_value(); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index c221b5066..d45abd479 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -896,8 +896,7 @@ void Sidebar::msw_rescale() p->frequently_changed_parameters->get_og(false)->msw_rescale(); p->object_list->msw_rescale(); - - p->object_manipulation->get_og()->msw_rescale(); + p->object_manipulation->msw_rescale(); p->object_settings->msw_rescale(); p->object_info->msw_rescale(); diff --git a/src/slic3r/GUI/wxExtensions.cpp b/src/slic3r/GUI/wxExtensions.cpp index d76e0da93..08069d02b 100644 --- a/src/slic3r/GUI/wxExtensions.cpp +++ b/src/slic3r/GUI/wxExtensions.cpp @@ -420,14 +420,21 @@ ObjectDataViewModel::~ObjectDataViewModel() m_bitmap_cache = nullptr; } -wxDataViewItem ObjectDataViewModel::Add(const wxString &name, const int extruder) +wxDataViewItem ObjectDataViewModel::Add(const wxString &name, + const int extruder, + const bool has_errors/* = false*/) { const wxString extruder_str = extruder == 0 ? "default" : wxString::Format("%d", extruder); auto root = new ObjectDataViewModelNode(name, extruder_str); + // Add error icon if detected auto-repaire + if (has_errors) + root->m_bmp = *m_warning_bmp; + m_objects.push_back(root); // notify control wxDataViewItem child((void*)root); wxDataViewItem parent((void*)NULL); + ItemAdded(parent, child); return child; } @@ -435,6 +442,7 @@ wxDataViewItem ObjectDataViewModel::Add(const wxString &name, const int extruder wxDataViewItem ObjectDataViewModel::AddVolumeChild( const wxDataViewItem &parent_item, const wxString &name, const Slic3r::ModelVolumeType volume_type, + const bool has_errors/* = false*/, const int extruder/* = 0*/, const bool create_frst_child/* = true*/) { @@ -448,9 +456,14 @@ wxDataViewItem ObjectDataViewModel::AddVolumeChild( const wxDataViewItem &parent if (insert_position < 0 || root->GetNthChild(insert_position)->m_type != itInstanceRoot) insert_position = -1; + const bool obj_errors = root->m_bmp.IsOk(); + if (create_frst_child && root->m_volumes_cnt == 0) { - const auto node = new ObjectDataViewModelNode(root, root->m_name, *m_volume_bmps[0], extruder_str, 0); + const Slic3r::ModelVolumeType type = Slic3r::ModelVolumeType::MODEL_PART; + const auto node = new ObjectDataViewModelNode(root, root->m_name, GetVolumeIcon(type, obj_errors), extruder_str, 0); + node->m_volume_type = type; + insert_position < 0 ? root->Append(node) : root->Insert(node, insert_position); // notify control const wxDataViewItem child((void*)node); @@ -458,12 +471,15 @@ wxDataViewItem ObjectDataViewModel::AddVolumeChild( const wxDataViewItem &parent root->m_volumes_cnt++; if (insert_position > 0) insert_position++; - - node->m_volume_type = volume_type; } - const auto node = new ObjectDataViewModelNode(root, name, *m_volume_bmps[int(volume_type)], extruder_str, root->m_volumes_cnt); + const auto node = new ObjectDataViewModelNode(root, name, GetVolumeIcon(volume_type, has_errors), extruder_str, root->m_volumes_cnt); insert_position < 0 ? root->Append(node) : root->Insert(node, insert_position); + + // if part with errors is added, but object wasn't marked, then mark it + if (!obj_errors && has_errors) + root->SetBitmap(*m_warning_bmp); + // notify control const wxDataViewItem child((void*)node); ItemAdded(parent_item, child); @@ -1228,15 +1244,61 @@ void ObjectDataViewModel::Rescale() node->msw_rescale(); if (node->m_type & itVolume) - node->m_bmp = *m_volume_bmps[node->volume_type()]; + node->m_bmp = GetVolumeIcon(node->m_volume_type, node->m_bmp.GetWidth() != node->m_bmp.GetHeight()); if (node->m_type & itObject && node->m_bmp.IsOk()) - node->m_bmp = create_scaled_bitmap(nullptr, "exclamation"); + node->m_bmp = *m_warning_bmp; ItemChanged(item); } } +wxBitmap ObjectDataViewModel::GetVolumeIcon(const Slic3r::ModelVolumeType vol_type, const bool is_marked/* = false*/) +{ + if (!is_marked) + return *m_volume_bmps[static_cast(vol_type)]; + + std::string scaled_bitmap_name = "warning" + std::to_string(static_cast(vol_type)); + scaled_bitmap_name += "-em" + std::to_string(Slic3r::GUI::wxGetApp().em_unit()); + + wxBitmap *bmp = m_bitmap_cache->find(scaled_bitmap_name); + if (bmp == nullptr) { + std::vector bmps; + + bmps.emplace_back(*m_warning_bmp); + bmps.emplace_back(*m_volume_bmps[static_cast(vol_type)]); + + bmp = m_bitmap_cache->insert(scaled_bitmap_name, bmps); + } + + return *bmp; +} + +void ObjectDataViewModel::DeleteWarningIcon(const wxDataViewItem& item, const bool unmark_object/* = false*/) +{ + if (!item.IsOk()) + return; + + ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID(); + + if (!node->GetBitmap().IsOk() || !(node->GetType() & (itVolume | itObject))) + return; + + if (node->GetType() & itVolume) { + node->SetBitmap(*m_volume_bmps[static_cast(node->volume_type())]); + return; + } + + node->SetBitmap(wxNullBitmap); + if (unmark_object) + { + wxDataViewItemArray children; + GetChildren(item, children); + for (const wxDataViewItem& child : children) + DeleteWarningIcon(child); + } +} + //----------------------------------------------------------------------------- // PrusaDataViewBitmapText //----------------------------------------------------------------------------- @@ -2351,8 +2413,7 @@ void ModeButton::SetState(const bool state) void ModeButton::focus_button(const bool focus) { - wxFont font = GetFont(); - const wxFont& new_font = focus ? font.Bold() : font.GetBaseFont(); + const wxFont& new_font = focus ? Slic3r::GUI::wxGetApp().bold_font() : Slic3r::GUI::wxGetApp().normal_font(); SetFont(new_font); @@ -2378,11 +2439,7 @@ ModeSizer::ModeSizer(wxWindow *parent, int hgap/* = 10*/) : m_mode_btns.reserve(3); for (const auto& button : buttons) { -// int x, y; -// parent->GetTextExtent(button.first, &x, &y, nullptr, nullptr, &Slic3r::GUI::wxGetApp().bold_font()); -// const wxSize size = wxSize(x + button.second.GetWidth() + Slic3r::GUI::wxGetApp().em_unit(), -// y + Slic3r::GUI::wxGetApp().em_unit()); - m_mode_btns.push_back(new ModeButton(parent, wxID_ANY, button.second, button.first/*, size*/)); + m_mode_btns.push_back(new ModeButton(parent, wxID_ANY, button.second, button.first)); } for (auto btn : m_mode_btns) diff --git a/src/slic3r/GUI/wxExtensions.hpp b/src/slic3r/GUI/wxExtensions.hpp index 589317f2b..8527e5425 100644 --- a/src/slic3r/GUI/wxExtensions.hpp +++ b/src/slic3r/GUI/wxExtensions.hpp @@ -323,14 +323,10 @@ public: return false; } - void SetBitmap(const wxBitmap &icon) - { - m_bmp = icon; - } - - ItemType GetType() const { - return m_type; - } + void SetBitmap(const wxBitmap &icon) { m_bmp = icon; } + const wxBitmap& GetBitmap() const { return m_bmp; } + const wxString& GetName() const { return m_name; } + ItemType GetType() const { return m_type; } void SetIdx(const int& idx) { m_idx = idx; @@ -339,9 +335,7 @@ public: m_name = wxString::Format("Instance_%d", m_idx + 1); } - int GetIdx() const { - return m_idx; - } + int GetIdx() const { return m_idx; } // use this function only for childrens void AssignAllVal(ObjectDataViewModelNode& from_node) @@ -374,10 +368,10 @@ public: // Set action icons for node void set_action_icon(); - void update_settings_digest_bitmaps(); - bool update_settings_digest(const std::vector& categories); - int volume_type() const { return int(m_volume_type); } - void msw_rescale(); + void update_settings_digest_bitmaps(); + bool update_settings_digest(const std::vector& categories); + int volume_type() const { return int(m_volume_type); } + void msw_rescale(); private: friend class ObjectDataViewModel; }; @@ -393,6 +387,7 @@ class ObjectDataViewModel :public wxDataViewModel { std::vector m_objects; std::vector m_volume_bmps; + wxBitmap* m_warning_bmp; wxDataViewCtrl* m_ctrl{ nullptr }; @@ -400,10 +395,13 @@ public: ObjectDataViewModel(); ~ObjectDataViewModel(); - wxDataViewItem Add(const wxString &name, const int extruder); + wxDataViewItem Add( const wxString &name, + const int extruder, + const bool has_errors = false); wxDataViewItem AddVolumeChild( const wxDataViewItem &parent_item, const wxString &name, const Slic3r::ModelVolumeType volume_type, + const bool has_errors = false, const int extruder = 0, const bool create_frst_child = true); wxDataViewItem AddSettingsChild(const wxDataViewItem &parent_item); @@ -475,11 +473,16 @@ public: const std::vector& categories); void SetVolumeBitmaps(const std::vector& volume_bmps) { m_volume_bmps = volume_bmps; } + void SetWarningBitmap(wxBitmap* bitmap) { m_warning_bmp = bitmap; } void SetVolumeType(const wxDataViewItem &item, const Slic3r::ModelVolumeType type); void SetAssociatedControl(wxDataViewCtrl* ctrl) { m_ctrl = ctrl; } // Rescale bitmaps for existing Items void Rescale(); + + wxBitmap GetVolumeIcon(const Slic3r::ModelVolumeType vol_type, + const bool is_marked = false); + void DeleteWarningIcon(const wxDataViewItem& item, const bool unmark_object = false); }; // ---------------------------------------------------------------------------- From 6ddefc6a650345dc99831fd4e280856b494de8e2 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Tue, 30 Apr 2019 09:11:57 +0200 Subject: [PATCH 25/47] Some refactoring to fix OSX build --- src/slic3r/GUI/GUI_ObjectList.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 1a4245965..2fbf4baa1 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -1886,7 +1886,8 @@ void ObjectList::part_selection_changed() if (item) { wxGetApp().obj_manipul()->get_og()->set_value("object_name", m_objects_model->GetName(item)); - wxGetApp().obj_manipul()->update_manifold_warning_icon_state(get_mesh_errors_list(obj_idx, volume_id)); + const wxString& tooltip = get_mesh_errors_list(obj_idx, volume_id); + wxGetApp().obj_manipul()->update_manifold_warning_icon_state(tooltip); } } From 3eacb0a216ded94ec535334f9c0611f7e54ed9ad Mon Sep 17 00:00:00 2001 From: YuSanka Date: Tue, 30 Apr 2019 09:38:23 +0200 Subject: [PATCH 26/47] Next try --- src/slic3r/GUI/GUI_ObjectList.cpp | 4 ++-- src/slic3r/GUI/GUI_ObjectManipulation.cpp | 4 ++-- src/slic3r/GUI/GUI_ObjectManipulation.hpp | 3 ++- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 2fbf4baa1..69c3e3f1b 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -1886,8 +1886,8 @@ void ObjectList::part_selection_changed() if (item) { wxGetApp().obj_manipul()->get_og()->set_value("object_name", m_objects_model->GetName(item)); - const wxString& tooltip = get_mesh_errors_list(obj_idx, volume_id); - wxGetApp().obj_manipul()->update_manifold_warning_icon_state(tooltip); + const wxString tooltip = get_mesh_errors_list(obj_idx, volume_id); + wxGetApp().obj_manipul()->update_warning_icon_state(tooltip); } } diff --git a/src/slic3r/GUI/GUI_ObjectManipulation.cpp b/src/slic3r/GUI/GUI_ObjectManipulation.cpp index eea53e828..86d8e9a96 100644 --- a/src/slic3r/GUI/GUI_ObjectManipulation.cpp +++ b/src/slic3r/GUI/GUI_ObjectManipulation.cpp @@ -66,7 +66,7 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) : return; wxGetApp().obj_list()->fix_through_netfabb(); - update_manifold_warning_icon_state(wxGetApp().obj_list()->get_mesh_errors_list()); + update_warning_icon_state(wxGetApp().obj_list()->get_mesh_errors_list()); }); return sizer; @@ -365,7 +365,7 @@ void ObjectManipulation::emulate_kill_focus() on_change(option, 0); } -void ObjectManipulation::update_manifold_warning_icon_state(const wxString& tooltip) +void ObjectManipulation::update_warning_icon_state(const wxString& tooltip) { m_fix_throught_netfab_bitmap->SetBitmap(tooltip.IsEmpty() ? wxNullBitmap : m_manifold_warning_bmp.bmp()); m_fix_throught_netfab_bitmap->SetToolTip(tooltip); diff --git a/src/slic3r/GUI/GUI_ObjectManipulation.hpp b/src/slic3r/GUI/GUI_ObjectManipulation.hpp index f691dcc83..da9e67d4e 100644 --- a/src/slic3r/GUI/GUI_ObjectManipulation.hpp +++ b/src/slic3r/GUI/GUI_ObjectManipulation.hpp @@ -9,6 +9,7 @@ class wxStaticText; class LockButton; class wxStaticBitmap; +class wxString; namespace Slic3r { namespace GUI { @@ -111,7 +112,7 @@ public: void emulate_kill_focus(); #endif // __APPLE__ - void update_manifold_warning_icon_state(const wxString& tooltip); + void update_warning_icon_state(const wxString& tooltip); void msw_rescale(); private: From 3bc6c29b7a388fd1ef41d0c4ac16a1cd21f3bf41 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Tue, 30 Apr 2019 11:27:41 +0200 Subject: [PATCH 27/47] Added missed include --- src/slic3r/GUI/GUI_ObjectList.cpp | 3 +-- src/slic3r/GUI/GUI_ObjectManipulation.hpp | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 69c3e3f1b..8c9f4cc4a 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -1886,8 +1886,7 @@ void ObjectList::part_selection_changed() if (item) { wxGetApp().obj_manipul()->get_og()->set_value("object_name", m_objects_model->GetName(item)); - const wxString tooltip = get_mesh_errors_list(obj_idx, volume_id); - wxGetApp().obj_manipul()->update_warning_icon_state(tooltip); + wxGetApp().obj_manipul()->update_warning_icon_state(get_mesh_errors_list(obj_idx, volume_id)); } } diff --git a/src/slic3r/GUI/GUI_ObjectManipulation.hpp b/src/slic3r/GUI/GUI_ObjectManipulation.hpp index da9e67d4e..5aa69cd15 100644 --- a/src/slic3r/GUI/GUI_ObjectManipulation.hpp +++ b/src/slic3r/GUI/GUI_ObjectManipulation.hpp @@ -2,6 +2,7 @@ #define slic3r_GUI_ObjectManipulation_hpp_ #include +#include #include "GUI_ObjectSettings.hpp" #include "GLCanvas3D.hpp" @@ -9,7 +10,6 @@ class wxStaticText; class LockButton; class wxStaticBitmap; -class wxString; namespace Slic3r { namespace GUI { From 4a5992ba6eca8e1ddb1e576a009660c80b910d1a Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Tue, 30 Apr 2019 15:43:19 +0200 Subject: [PATCH 28/47] Top toolbar use layers_white.svg icon for layers editing --- src/slic3r/GUI/GLCanvas3D.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index d02878a1a..3c7365d15 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -3377,7 +3377,7 @@ bool GLCanvas3D::_init_toolbar() item.name = "layersediting"; #if ENABLE_SVG_ICONS - item.icon_filename = "layers.svg"; + item.icon_filename = "layers_white.svg"; #endif // ENABLE_SVG_ICONS item.tooltip = GUI::L_str("Layers editing"); item.sprite_id = 10; From 11a04f918bf8b05f0d56da45bb8b3e05737ec509 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Tue, 30 Apr 2019 15:46:25 +0200 Subject: [PATCH 29/47] ObjectList: Show tooltip for warning icon only instead of whole "Name" cell --- src/slic3r/GUI/GUI_ObjectList.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 8c9f4cc4a..cb0a03547 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -244,7 +244,7 @@ wxString ObjectList::get_mesh_errors_list(const int obj_idx, const int vol_idx / for (const auto& error : error_msg) if (error.second > 0) - tooltip += wxString::Format(_("\t%d %s\n"), error.second, error.first); + tooltip += wxString::Format("\t%d %s\n", error.second, _(error.first)); if (is_windows10()) tooltip += _(L("Right button click the icon to fix STL through Netfabb")); @@ -272,8 +272,14 @@ void ObjectList::set_tooltip_for_item(const wxPoint& pt) if (col->GetTitle() == " " && GetSelectedItemsCount()<2) GetMainWindow()->SetToolTip(_(L("Right button click the icon to change the object settings"))); - else if (col->GetTitle() == _("Name") ) + else if (col->GetTitle() == _("Name")) { +#ifdef __WXMSW__ + if (pt.x < 2 * wxGetApp().em_unit() || pt.x > 4 * wxGetApp().em_unit()) { + GetMainWindow()->SetToolTip(""); // hide tooltip + return; + } +#endif //__WXMSW__ int obj_idx, vol_idx; get_selected_item_indexes(obj_idx, vol_idx, item); GetMainWindow()->SetToolTip(get_mesh_errors_list(obj_idx, vol_idx)); From 7f37f82ad4696543af0cab8f5b7453644aef639f Mon Sep 17 00:00:00 2001 From: YuSanka Date: Tue, 30 Apr 2019 16:59:40 +0200 Subject: [PATCH 30/47] Added comments --- src/slic3r/GUI/GUI_ObjectList.cpp | 5 +++++ src/slic3r/GUI/GUI_ObjectManipulation.hpp | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index cb0a03547..bb3bd2844 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -270,6 +270,11 @@ void ObjectList::set_tooltip_for_item(const wxPoint& pt) HitTest(pt, item, col); if (!item) return; + /* GetMainWindow() return window, associated with wxDataViewCtrl. + * And for this window we should to set tooltips. + * Just this->SetToolTip(tooltip) => has no effect. + */ + if (col->GetTitle() == " " && GetSelectedItemsCount()<2) GetMainWindow()->SetToolTip(_(L("Right button click the icon to change the object settings"))); else if (col->GetTitle() == _("Name")) diff --git a/src/slic3r/GUI/GUI_ObjectManipulation.hpp b/src/slic3r/GUI/GUI_ObjectManipulation.hpp index 5aa69cd15..78941135c 100644 --- a/src/slic3r/GUI/GUI_ObjectManipulation.hpp +++ b/src/slic3r/GUI/GUI_ObjectManipulation.hpp @@ -2,7 +2,7 @@ #define slic3r_GUI_ObjectManipulation_hpp_ #include -#include +#include #include "GUI_ObjectSettings.hpp" #include "GLCanvas3D.hpp" From b048669a3bf533ae0158ea9dd16bf6c6090165ea Mon Sep 17 00:00:00 2001 From: YuSanka Date: Thu, 2 May 2019 08:33:38 +0200 Subject: [PATCH 31/47] Changed update_warning_icon_state() signature (next try to fix OSX compilation) --- src/slic3r/GUI/GUI_ObjectList.cpp | 2 +- src/slic3r/GUI/GUI_ObjectManipulation.cpp | 6 ++++-- src/slic3r/GUI/GUI_ObjectManipulation.hpp | 3 +-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index bb3bd2844..61ee7e1b8 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -1897,7 +1897,7 @@ void ObjectList::part_selection_changed() if (item) { wxGetApp().obj_manipul()->get_og()->set_value("object_name", m_objects_model->GetName(item)); - wxGetApp().obj_manipul()->update_warning_icon_state(get_mesh_errors_list(obj_idx, volume_id)); + wxGetApp().obj_manipul()->update_warning_icon_state(/*get_mesh_errors_list(obj_idx, volume_id)*/); } } diff --git a/src/slic3r/GUI/GUI_ObjectManipulation.cpp b/src/slic3r/GUI/GUI_ObjectManipulation.cpp index 86d8e9a96..bb6eec963 100644 --- a/src/slic3r/GUI/GUI_ObjectManipulation.cpp +++ b/src/slic3r/GUI/GUI_ObjectManipulation.cpp @@ -66,7 +66,7 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) : return; wxGetApp().obj_list()->fix_through_netfabb(); - update_warning_icon_state(wxGetApp().obj_list()->get_mesh_errors_list()); + update_warning_icon_state(/*wxGetApp().obj_list()->get_mesh_errors_list()*/); }); return sizer; @@ -365,8 +365,10 @@ void ObjectManipulation::emulate_kill_focus() on_change(option, 0); } -void ObjectManipulation::update_warning_icon_state(const wxString& tooltip) +void ObjectManipulation::update_warning_icon_state(/*const wxString& tooltip*/) { + const wxString& tooltip = wxGetApp().obj_list()->get_mesh_errors_list(); + m_fix_throught_netfab_bitmap->SetBitmap(tooltip.IsEmpty() ? wxNullBitmap : m_manifold_warning_bmp.bmp()); m_fix_throught_netfab_bitmap->SetToolTip(tooltip); } diff --git a/src/slic3r/GUI/GUI_ObjectManipulation.hpp b/src/slic3r/GUI/GUI_ObjectManipulation.hpp index 78941135c..1bff4e22f 100644 --- a/src/slic3r/GUI/GUI_ObjectManipulation.hpp +++ b/src/slic3r/GUI/GUI_ObjectManipulation.hpp @@ -2,7 +2,6 @@ #define slic3r_GUI_ObjectManipulation_hpp_ #include -#include #include "GUI_ObjectSettings.hpp" #include "GLCanvas3D.hpp" @@ -112,7 +111,7 @@ public: void emulate_kill_focus(); #endif // __APPLE__ - void update_warning_icon_state(const wxString& tooltip); + void update_warning_icon_state(/*const wxString& tooltip*/); void msw_rescale(); private: From 88c9948c85a01474be7af47061931c9017e9a946 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Thu, 2 May 2019 09:54:18 +0200 Subject: [PATCH 32/47] Fixed typo --- src/slic3r/GUI/GUI_ObjectList.cpp | 2 +- src/slic3r/GUI/GUI_ObjectManipulation.cpp | 9 +++------ src/slic3r/GUI/GUI_ObjectManipulation.hpp | 2 +- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 61ee7e1b8..bb3bd2844 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -1897,7 +1897,7 @@ void ObjectList::part_selection_changed() if (item) { wxGetApp().obj_manipul()->get_og()->set_value("object_name", m_objects_model->GetName(item)); - wxGetApp().obj_manipul()->update_warning_icon_state(/*get_mesh_errors_list(obj_idx, volume_id)*/); + wxGetApp().obj_manipul()->update_warning_icon_state(get_mesh_errors_list(obj_idx, volume_id)); } } diff --git a/src/slic3r/GUI/GUI_ObjectManipulation.cpp b/src/slic3r/GUI/GUI_ObjectManipulation.cpp index bb6eec963..b8c37dcd0 100644 --- a/src/slic3r/GUI/GUI_ObjectManipulation.cpp +++ b/src/slic3r/GUI/GUI_ObjectManipulation.cpp @@ -66,7 +66,7 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) : return; wxGetApp().obj_list()->fix_through_netfabb(); - update_warning_icon_state(/*wxGetApp().obj_list()->get_mesh_errors_list()*/); + update_warning_icon_state(wxGetApp().obj_list()->get_mesh_errors_list()); }); return sizer; @@ -364,17 +364,14 @@ void ObjectManipulation::emulate_kill_focus() else on_change(option, 0); } +#endif // __APPLE__ -void ObjectManipulation::update_warning_icon_state(/*const wxString& tooltip*/) +void ObjectManipulation::update_warning_icon_state(const wxString& tooltip) { - const wxString& tooltip = wxGetApp().obj_list()->get_mesh_errors_list(); - m_fix_throught_netfab_bitmap->SetBitmap(tooltip.IsEmpty() ? wxNullBitmap : m_manifold_warning_bmp.bmp()); m_fix_throught_netfab_bitmap->SetToolTip(tooltip); } -#endif // __APPLE__ - void ObjectManipulation::reset_settings_value() { m_new_position = Vec3d::Zero(); diff --git a/src/slic3r/GUI/GUI_ObjectManipulation.hpp b/src/slic3r/GUI/GUI_ObjectManipulation.hpp index 1bff4e22f..f86cd6e56 100644 --- a/src/slic3r/GUI/GUI_ObjectManipulation.hpp +++ b/src/slic3r/GUI/GUI_ObjectManipulation.hpp @@ -111,7 +111,7 @@ public: void emulate_kill_focus(); #endif // __APPLE__ - void update_warning_icon_state(/*const wxString& tooltip*/); + void update_warning_icon_state(const wxString& tooltip); void msw_rescale(); private: From a3385278e5e892e644a02a288c1cf9c8bd296d00 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Thu, 2 May 2019 13:46:39 +0200 Subject: [PATCH 33/47] Export to STL of SLA supports and pad --- src/slic3r/GUI/GUI_ObjectList.cpp | 2 +- src/slic3r/GUI/MainFrame.cpp | 44 ++++++++++++++++------ src/slic3r/GUI/MainFrame.hpp | 1 + src/slic3r/GUI/Plater.cpp | 61 ++++++++++++++++++++++++++++++- src/slic3r/GUI/Plater.hpp | 2 +- 5 files changed, 95 insertions(+), 15 deletions(-) diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index f9df2649c..833cd712e 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -1147,7 +1147,7 @@ void ObjectList::append_menu_item_fix_through_netfabb(wxMenu* menu) void ObjectList::append_menu_item_export_stl(wxMenu* menu) const { append_menu_item(menu, wxID_ANY, _(L("Export as STL")) + dots, "", - [](wxCommandEvent&) { wxGetApp().plater()->export_stl(true); }, "", menu); + [](wxCommandEvent&) { wxGetApp().plater()->export_stl(false, true); }, "", menu); menu->AppendSeparator(); } diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 78d17a4f1..72843f815 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -14,6 +14,7 @@ #include "libslic3r/Print.hpp" #include "libslic3r/Polygon.hpp" +#include "libslic3r/SLAPrint.hpp" #include "Tab.hpp" #include "PresetBundle.hpp" @@ -205,12 +206,30 @@ void MainFrame::add_created_tab(Tab* panel) bool MainFrame::can_save() const { - return (m_plater != nullptr) ? !m_plater->model().objects.empty() : false; + return (m_plater != nullptr) && !m_plater->model().objects.empty(); } bool MainFrame::can_export_model() const { - return (m_plater != nullptr) ? !m_plater->model().objects.empty() : false; + return (m_plater != nullptr) && !m_plater->model().objects.empty(); +} + +bool MainFrame::can_export_supports() const +{ + if ((m_plater == nullptr) || (m_plater->printer_technology() != ptSLA) || m_plater->model().objects.empty()) + return false; + + bool can_export = false; + const PrintObjects& objects = m_plater->sla_print().objects(); + for (const SLAPrintObject* object : objects) + { + if (object->has_mesh(slaposBasePool) || object->has_mesh(slaposSupportTree)) + { + can_export = true; + break; + } + } + return can_export; } bool MainFrame::can_export_gcode() const @@ -243,17 +262,17 @@ bool MainFrame::can_change_view() const bool MainFrame::can_select() const { - return (m_plater != nullptr) ? !m_plater->model().objects.empty() : false; + return (m_plater != nullptr) && !m_plater->model().objects.empty(); } bool MainFrame::can_delete() const { - return (m_plater != nullptr) ? !m_plater->is_selection_empty() : false; + return (m_plater != nullptr) && !m_plater->is_selection_empty(); } bool MainFrame::can_delete_all() const { - return (m_plater != nullptr) ? !m_plater->model().objects.empty() : false; + return (m_plater != nullptr) && !m_plater->model().objects.empty(); } void MainFrame::on_dpi_changed(const wxRect &suggested_rect) @@ -346,6 +365,8 @@ void MainFrame::init_menubar() export_menu->AppendSeparator(); wxMenuItem* item_export_stl = append_menu_item(export_menu, wxID_ANY, _(L("Export plate as &STL")) + dots, _(L("Export current plate as STL")), [this](wxCommandEvent&) { if (m_plater) m_plater->export_stl(); }, menu_icon("export_plater")); + wxMenuItem* item_export_stl_sla = append_menu_item(export_menu, wxID_ANY, _(L("Export plate as STL including supports")) + dots, _(L("Export current plate as STL including supports")), + [this](wxCommandEvent&) { if (m_plater) m_plater->export_stl(true); }, menu_icon("export_plater")); wxMenuItem* item_export_amf = append_menu_item(export_menu, wxID_ANY, _(L("Export plate as &AMF")) + dots, _(L("Export current plate as AMF")), [this](wxCommandEvent&) { if (m_plater) m_plater->export_amf(); }, menu_icon("export_plater")); export_menu->AppendSeparator(); @@ -389,13 +410,14 @@ void MainFrame::init_menubar() [this](wxCommandEvent&) { Close(false); }); Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(m_plater != nullptr); }, item_open->GetId()); - Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable((m_plater != nullptr) && can_save()); }, item_save->GetId()); - Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable((m_plater != nullptr) && can_save()); }, item_save_as->GetId()); + Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_save()); }, item_save->GetId()); + Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_save()); }, item_save_as->GetId()); Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(m_plater != nullptr); }, item_import_model->GetId()); - Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable((m_plater != nullptr) && can_export_gcode()); }, item_export_gcode->GetId()); - Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable((m_plater != nullptr) && can_export_model()); }, item_export_stl->GetId()); - Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable((m_plater != nullptr) && can_export_model()); }, item_export_amf->GetId()); - Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable((m_plater != nullptr) && can_slice()); }, m_menu_item_reslice_now->GetId()); + Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_export_gcode()); }, item_export_gcode->GetId()); + Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_export_model()); }, item_export_stl->GetId()); + Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_export_supports()); }, item_export_stl_sla->GetId()); + Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_export_model()); }, item_export_amf->GetId()); + Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_slice()); }, m_menu_item_reslice_now->GetId()); } #ifdef _MSC_VER diff --git a/src/slic3r/GUI/MainFrame.hpp b/src/slic3r/GUI/MainFrame.hpp index 13bf07922..f3d582681 100644 --- a/src/slic3r/GUI/MainFrame.hpp +++ b/src/slic3r/GUI/MainFrame.hpp @@ -63,6 +63,7 @@ class MainFrame : public DPIFrame bool can_save() const; bool can_export_model() const; + bool can_export_supports() const; bool can_export_gcode() const; bool can_slice() const; bool can_change_view() const; diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 2195471da..4ec560274 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -2925,7 +2925,7 @@ bool Plater::priv::init_common_menu(wxMenu* menu, const bool is_part/* = false*/ [this](wxCommandEvent&) { reload_from_disk(); }); append_menu_item(menu, wxID_ANY, _(L("Export as STL")) + dots, _(L("Export the selected object as STL file")), - [this](wxCommandEvent&) { q->export_stl(true); }); + [this](wxCommandEvent&) { q->export_stl(false, true); }); menu->AppendSeparator(); } @@ -3431,7 +3431,7 @@ void Plater::export_gcode() p->export_gcode(std::move(output_path), PrintHostJob()); } -void Plater::export_stl(bool selection_only) +void Plater::export_stl(bool extended, bool selection_only) { if (p->model.objects.empty()) { return; } @@ -3466,8 +3466,65 @@ void Plater::export_stl(bool selection_only) } } else + { mesh = p->model.mesh(); + if (extended && (p->printer_technology == ptSLA)) + { + const PrintObjects& objects = p->sla_print.objects(); + for (const SLAPrintObject* object : objects) + { + const ModelObject* model_object = object->model_object(); + Transform3d mesh_trafo_inv = object->trafo().inverse(); + bool is_left_handed = object->is_left_handed(); + + TriangleMesh pad_mesh; + bool has_pad_mesh = object->has_mesh(slaposBasePool); + if (has_pad_mesh) + { + pad_mesh = object->get_mesh(slaposBasePool); + pad_mesh.transform(mesh_trafo_inv); + } + + TriangleMesh supports_mesh; + bool has_supports_mesh = object->has_mesh(slaposSupportTree); + if (has_supports_mesh) + { + supports_mesh = object->get_mesh(slaposSupportTree); + supports_mesh.transform(mesh_trafo_inv); + } + + const std::vector& obj_instances = object->instances(); + for (const SLAPrintObject::Instance& obj_instance : obj_instances) + { + auto it = std::find_if(model_object->instances.begin(), model_object->instances.end(), + [&obj_instance](const ModelInstance *mi) { return mi->id() == obj_instance.instance_id; }); + assert(it != model_object->instances.end()); + + if (it != model_object->instances.end()) + { + int instance_idx = it - model_object->instances.begin(); + const Transform3d& inst_transform = object->model_object()->instances[instance_idx]->get_transformation().get_matrix(); + + if (has_pad_mesh) + { + TriangleMesh inst_pad_mesh = pad_mesh; + inst_pad_mesh.transform(inst_transform, is_left_handed); + mesh.merge(inst_pad_mesh); + } + + if (has_supports_mesh) + { + TriangleMesh inst_supports_mesh = supports_mesh; + inst_supports_mesh.transform(inst_transform, is_left_handed); + mesh.merge(inst_supports_mesh); + } + } + } + } + } + } + Slic3r::store_stl(path_u8.c_str(), &mesh, true); p->statusbar()->set_status_text(wxString::Format(_(L("STL file exported to %s")), path)); } diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index bedc31b35..326a4507e 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -163,7 +163,7 @@ public: void cut(size_t obj_idx, size_t instance_idx, coordf_t z, bool keep_upper = true, bool keep_lower = true, bool rotate_lower = false); void export_gcode(); - void export_stl(bool selection_only = false); + void export_stl(bool extended = false, bool selection_only = false); void export_amf(); void export_3mf(const boost::filesystem::path& output_path = boost::filesystem::path()); void reslice(); From 47f27d20f196df979c0891fbae2fed83d0ab4f8b Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Thu, 2 May 2019 13:52:13 +0200 Subject: [PATCH 34/47] Added confirmation dialog for Delete All command --- src/slic3r/GUI/MainFrame.cpp | 4 ++-- src/slic3r/GUI/Plater.cpp | 7 ++++++- src/slic3r/GUI/Plater.hpp | 1 + 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 72843f815..12e59c6f5 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -442,12 +442,12 @@ void MainFrame::init_menubar() wxString hotkey_delete = "Del"; #endif wxMenuItem* item_select_all = append_menu_item(editMenu, wxID_ANY, _(L("&Select all")) + sep + GUI::shortkey_ctrl_prefix() + sep_space + "A", _(L("Selects all objects")), - [this](wxCommandEvent&) { m_plater->select_all(); }, ""); + [this](wxCommandEvent&) { if (m_plater != nullptr) m_plater->select_all(); }, ""); editMenu->AppendSeparator(); wxMenuItem* item_delete_sel = append_menu_item(editMenu, wxID_ANY, _(L("&Delete selected")) + sep + hotkey_delete, _(L("Deletes the current selection")), [this](wxCommandEvent&) { m_plater->remove_selected(); }, menu_icon("remove_menu")); wxMenuItem* item_delete_all = append_menu_item(editMenu, wxID_ANY, _(L("Delete &all")) + sep + GUI::shortkey_ctrl_prefix() + sep_space + hotkey_delete, _(L("Deletes all objects")), - [this](wxCommandEvent&) { m_plater->reset(); }, menu_icon("delete_all_menu")); + [this](wxCommandEvent&) { m_plater->reset_with_confirm(); }, menu_icon("delete_all_menu")); editMenu->AppendSeparator(); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 4ec560274..48ffaedc9 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1447,7 +1447,7 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) // 3DScene/Toolbar: view3D_canvas->Bind(EVT_GLTOOLBAR_ADD, &priv::on_action_add, this); view3D_canvas->Bind(EVT_GLTOOLBAR_DELETE, [q](SimpleEvent&) { q->remove_selected(); }); - view3D_canvas->Bind(EVT_GLTOOLBAR_DELETE_ALL, [this](SimpleEvent&) { reset(); }); + view3D_canvas->Bind(EVT_GLTOOLBAR_DELETE_ALL, [q](SimpleEvent&) { q->reset_with_confirm(); }); view3D_canvas->Bind(EVT_GLTOOLBAR_ARRANGE, [this](SimpleEvent&) { arrange(); }); view3D_canvas->Bind(EVT_GLTOOLBAR_COPY, [q](SimpleEvent&) { q->copy_selection_to_clipboard(); }); view3D_canvas->Bind(EVT_GLTOOLBAR_PASTE, [q](SimpleEvent&) { q->paste_from_clipboard(); }); @@ -3282,6 +3282,11 @@ void Plater::select_all() { p->select_all(); } void Plater::remove(size_t obj_idx) { p->remove(obj_idx); } void Plater::reset() { p->reset(); } +void Plater::reset_with_confirm() +{ + if (wxMessageDialog((wxWindow*)this, _(L("All objects will be removed, continue ?")), _(L("Delete all")), wxYES_NO | wxYES_DEFAULT | wxCENTRE).ShowModal() == wxID_YES) + reset(); +} void Plater::delete_object_from_model(size_t obj_idx) { p->delete_object_from_model(obj_idx); } diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index 326a4507e..5118fdd6c 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -153,6 +153,7 @@ public: void select_all(); void remove(size_t obj_idx); void reset(); + void reset_with_confirm(); void delete_object_from_model(size_t obj_idx); void remove_selected(); void increase_instances(size_t num = 1); From d2107fad2fb2bbd38538666fb8ab9557c9d98e31 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Thu, 2 May 2019 16:20:50 +0200 Subject: [PATCH 35/47] Fixed get_object_stl_stats() --- src/libslic3r/Model.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/libslic3r/Model.cpp b/src/libslic3r/Model.cpp index 17769a8e7..271b728b5 100644 --- a/src/libslic3r/Model.cpp +++ b/src/libslic3r/Model.cpp @@ -1456,28 +1456,28 @@ stl_stats ModelObject::get_object_stl_stats() const if (this->volumes.size() == 1) return this->volumes[0]->mesh.stl.stats; - stl_stats full_stats; - - // initialise full_stats - full_stats.degenerate_facets= 0; - full_stats.edges_fixed = 0; - full_stats.facets_removed = 0; - full_stats.facets_added = 0; - full_stats.facets_reversed = 0; - full_stats.backwards_edges = 0; - full_stats.normals_fixed = 0; + stl_stats full_stats = this->volumes[0]->mesh.stl.stats; // 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) full_stats.degenerate_facets+= stats.degenerate_facets; full_stats.edges_fixed += stats.edges_fixed; full_stats.facets_removed += stats.facets_removed; full_stats.facets_added += stats.facets_added; full_stats.facets_reversed += stats.facets_reversed; full_stats.backwards_edges += stats.backwards_edges; + + // another used satistics value + if (volume->is_model_part()) + full_stats.volume += stats.volume; + full_stats.number_of_parts += stats.number_of_parts; } return full_stats; From bf30ec439f0a92366923e777f8d2d58a12fb2a6d Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Fri, 3 May 2019 11:43:48 +0200 Subject: [PATCH 36/47] Fixed file extension when using option --export-amf in command line --- src/slic3r.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r.cpp b/src/slic3r.cpp index c3e69a189..e8f92e66d 100644 --- a/src/slic3r.cpp +++ b/src/slic3r.cpp @@ -628,7 +628,7 @@ std::string CLI::output_filepath(const Model &model, IO::ExportFormat format) co { std::string ext; switch (format) { - case IO::AMF: ext = ".amf"; break; + case IO::AMF: ext = ".zip.amf"; break; case IO::OBJ: ext = ".obj"; break; case IO::STL: ext = ".stl"; break; case IO::TMF: ext = ".3mf"; break; From 4be4dc623c097b529b417692c543eae5ec6e4c5c Mon Sep 17 00:00:00 2001 From: YuSanka Date: Fri, 3 May 2019 13:09:42 +0200 Subject: [PATCH 37/47] Fixed full statistics calculation (calculate sum of volume and part_count only for solid parts) --- src/libslic3r/Model.cpp | 19 ++++++++++--------- src/slic3r/GUI/GUI_App.cpp | 8 ++++---- src/slic3r/GUI/GUI_ObjectManipulation.cpp | 5 ++++- src/slic3r/GUI/Plater.cpp | 2 +- 4 files changed, 19 insertions(+), 15 deletions(-) diff --git a/src/libslic3r/Model.cpp b/src/libslic3r/Model.cpp index 271b728b5..ec95eb578 100644 --- a/src/libslic3r/Model.cpp +++ b/src/libslic3r/Model.cpp @@ -1467,17 +1467,18 @@ stl_stats ModelObject::get_object_stl_stats() const const stl_stats& stats = volume->mesh.stl.stats; // initialize full_stats (for repaired errors) - full_stats.degenerate_facets+= stats.degenerate_facets; - full_stats.edges_fixed += stats.edges_fixed; - full_stats.facets_removed += stats.facets_removed; - full_stats.facets_added += stats.facets_added; - full_stats.facets_reversed += stats.facets_reversed; - full_stats.backwards_edges += stats.backwards_edges; + full_stats.degenerate_facets += stats.degenerate_facets; + full_stats.edges_fixed += stats.edges_fixed; + full_stats.facets_removed += stats.facets_removed; + full_stats.facets_added += stats.facets_added; + full_stats.facets_reversed += stats.facets_reversed; + full_stats.backwards_edges += stats.backwards_edges; // another used satistics value - if (volume->is_model_part()) - full_stats.volume += stats.volume; - full_stats.number_of_parts += stats.number_of_parts; + if (volume->is_model_part()) { + full_stats.volume += stats.volume; + full_stats.number_of_parts += stats.number_of_parts; + } } return full_stats; diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 595a968bd..47141a664 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -303,13 +303,13 @@ bool GUI_App::dark_mode_menus() void GUI_App::init_label_colours() { if (dark_mode()) { - m_color_label_modified = wxColour(252, 77, 1); - m_color_label_sys = wxColour(26, 132, 57); - } - else { m_color_label_modified = wxColour(253, 111, 40); m_color_label_sys = wxColour(115, 220, 103); } + else { + m_color_label_modified = wxColour(252, 77, 1); + m_color_label_sys = wxColour(26, 132, 57); + } m_color_label_default = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT); } diff --git a/src/slic3r/GUI/GUI_ObjectManipulation.cpp b/src/slic3r/GUI/GUI_ObjectManipulation.cpp index b8c37dcd0..d50f03050 100644 --- a/src/slic3r/GUI/GUI_ObjectManipulation.cpp +++ b/src/slic3r/GUI/GUI_ObjectManipulation.cpp @@ -21,9 +21,9 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) : OG_Settings(parent, true) #ifndef __APPLE__ , m_focused_option("") - , m_manifold_warning_bmp(ScalableBitmap(parent, "exclamation")) #endif // __APPLE__ { + m_manifold_warning_bmp = ScalableBitmap(parent, "exclamation"); m_og->set_name(_(L("Object Manipulation"))); m_og->label_width = 12;//125; m_og->set_grid_vgap(5); @@ -77,6 +77,9 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) : def.gui_type = "legend"; def.tooltip = L("Object name"); def.width = 21; +#ifdef __APPLE__ + def.width = 19; +#endif def.default_value = new ConfigOptionString{ " " }; line.append_option(Option(def, "object_name")); m_og->append_line(line); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 07e1e2bae..97845f8be 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -724,7 +724,7 @@ Sidebar::Sidebar(Plater *parent) auto init_btn = [this](wxButton **btn, wxString label) { *btn = new wxButton(this, wxID_ANY, label, wxDefaultPosition, - wxDefaultSize, wxBU_EXACTFIT | wxNO_BORDER); + wxDefaultSize, wxBU_EXACTFIT); (*btn)->SetFont(wxGetApp().bold_font()); }; From 80d3cbac73f9798db3d739e9deb5f2ca25176203 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Fri, 3 May 2019 14:29:28 +0200 Subject: [PATCH 38/47] Temporary fix for crash, if try to add second settings grope for instance --- src/slic3r/GUI/GUI_ObjectList.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 833cd712e..0734028d1 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -937,6 +937,13 @@ void ObjectList::get_freq_settings_choice(const wxString& bundle_name) { const std::vector& options = get_options_for_bundle(bundle_name); + /* #ys_FIXME_delete_after_testing ! Temporary workaround to avoid a crash: + * After a right click on an instance all items in the ObjectList are unselected, + * and as a result m_config == nullptr. + */ + if (!m_config) + return; + auto opt_keys = m_config->keys(); const DynamicPrintConfig& from_config = wxGetApp().preset_bundle->prints.get_edited_preset().config; @@ -966,6 +973,10 @@ void ObjectList::update_settings_item() const auto settings_item = m_objects_model->IsSettingsItem(item) ? item : m_objects_model->GetSettingsItem(item); select_item(settings_item ? settings_item : m_objects_model->AddSettingsChild(item)); + + // update object selection on Plater + if (!m_prevent_canvas_selection_update) + update_selections_on_canvas(); } else { auto panel = wxGetApp().sidebar().scrolled_panel(); From c62006048fb01dbcc3652fb4e5a03b9a5905abda Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Fri, 3 May 2019 15:50:05 +0200 Subject: [PATCH 39/47] Associate 3mf files on Windows --- src/slic3r/GUI/GUI_App.cpp | 67 ++++++++++++++++++++++++++++++++++++++ src/slic3r/GUI/GUI_App.hpp | 3 ++ 2 files changed, 70 insertions(+) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 595a968bd..e4ee60389 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -44,6 +44,10 @@ #include "SysInfoDialog.hpp" #include "KBShortcutsDialog.hpp" +#ifdef __WXMSW__ +#include +#endif // __WXMSW__ + namespace Slic3r { namespace GUI { @@ -182,6 +186,10 @@ bool GUI_App::on_init_inner() app_config->set("version", SLIC3R_VERSION); app_config->save(); +#ifdef __WXMSW__ + associate_3mf_files(); +#endif // __WXMSW__ + preset_updater = new PresetUpdater(); Bind(EVT_SLIC3R_VERSION_ONLINE, [this](const wxCommandEvent &evt) { app_config->set("version_online", into_u8(evt.GetString())); @@ -947,5 +955,64 @@ void GUI_App::window_pos_sanitize(wxTopLevelWindow* window) // } +#ifdef __WXMSW__ +void GUI_App::associate_3mf_files() +{ + // see as reference: https://stackoverflow.com/questions/20245262/c-program-needs-an-file-association + + auto reg_set = [](HKEY hkeyHive, const wchar_t* pszVar, const wchar_t* pszValue) + { + wchar_t szValueCurrent[1000]; + DWORD dwType; + DWORD dwSize = sizeof(szValueCurrent); + + int iRC = ::RegGetValueW(hkeyHive, pszVar, nullptr, RRF_RT_ANY, &dwType, szValueCurrent, &dwSize); + + bool bDidntExist = iRC == ERROR_FILE_NOT_FOUND; + + if ((iRC != ERROR_SUCCESS) && !bDidntExist) + // an error occurred + return; + + if (!bDidntExist) + { + if (dwType != REG_SZ) + // invalid type + return; + + if (::wcscmp(szValueCurrent, pszValue) == 0) + // value already set + return; + } + + DWORD dwDisposition; + HKEY hkey; + iRC = ::RegCreateKeyExW(hkeyHive, pszVar, 0, 0, 0, KEY_ALL_ACCESS, nullptr, &hkey, &dwDisposition); + if (iRC == ERROR_SUCCESS) + iRC = ::RegSetValueExW(hkey, L"", 0, REG_SZ, (BYTE*)pszValue, (::wcslen(pszValue) + 1) * sizeof(wchar_t)); + + RegCloseKey(hkey); + }; + + wchar_t app_path[MAX_PATH]; + ::GetModuleFileNameW(nullptr, app_path, sizeof(app_path)); + + std::wstring prog_path = L"\"" + std::wstring(app_path) + L"\""; + std::wstring prog_id = L"Prusa.Slicer.1"; + std::wstring prog_desc = L"PrusaSlicer"; + std::wstring prog_command = prog_path + L" \"%1\""; + std::wstring reg_base = L"Software\\Classes"; + std::wstring reg_extension = reg_base + L"\\.3mf"; + std::wstring reg_prog_id = reg_base + L"\\" + prog_id; + std::wstring reg_prog_id_command = reg_prog_id + L"\\Shell\\Open\\Command"; + + reg_set(HKEY_CURRENT_USER, reg_extension.c_str(), prog_id.c_str()); + reg_set(HKEY_CURRENT_USER, reg_prog_id.c_str(), prog_desc.c_str()); + reg_set(HKEY_CURRENT_USER, reg_prog_id_command.c_str(), prog_command.c_str()); + + ::SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nullptr, nullptr); +} +#endif // __WXMSW__ + } // GUI } //Slic3r diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index 3a6a443f0..60dc7c2fa 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -178,6 +178,9 @@ private: void window_pos_save(wxTopLevelWindow* window, const std::string &name); void window_pos_restore(wxTopLevelWindow* window, const std::string &name, bool default_maximized = false); void window_pos_sanitize(wxTopLevelWindow* window); +#ifdef __WXMSW__ + void associate_3mf_files(); +#endif // __WXMSW__ }; DECLARE_APP(GUI_App) From 8be585893a8207dc6628330e31121189c6726c89 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Fri, 3 May 2019 16:05:49 +0200 Subject: [PATCH 40/47] Fixed a crash, if try to add second settings grope for instance --- src/slic3r/GUI/GUI_ObjectList.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 64a7ce8a6..09a6e94a8 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -1000,13 +1000,7 @@ void ObjectList::get_freq_settings_choice(const wxString& bundle_name) { const std::vector& options = get_options_for_bundle(bundle_name); - /* #ys_FIXME_delete_after_testing ! Temporary workaround to avoid a crash: - * After a right click on an instance all items in the ObjectList are unselected, - * and as a result m_config == nullptr. - */ - if (!m_config) - return; - + assert(m_config); auto opt_keys = m_config->keys(); const DynamicPrintConfig& from_config = wxGetApp().preset_bundle->prints.get_edited_preset().config; @@ -2156,6 +2150,11 @@ void ObjectList::update_selections() if (m_objects_model->GetVolumeIdByItem(m_objects_model->GetParent(item)) == gl_vol->volume_idx()) return; } + + // but if there is selected only one of several instances by context menu, + // then select this instance in ObjectList + if (selection.is_single_full_instance()) + sels.Add(m_objects_model->GetItemByInstanceId(selection.get_object_idx(), selection.get_instance_idx())); } else if (selection.is_single_full_object() || selection.is_multiple_full_object()) { From 8e007c5b6ac5142df4eb83a62a014f8d8f884b4a Mon Sep 17 00:00:00 2001 From: YuSanka Date: Sat, 4 May 2019 02:07:07 +0200 Subject: [PATCH 41/47] Localization improvements --- resources/localization/Slic3rPE.pot | 2199 +++++++++--------- src/libslic3r/Print.cpp | 11 +- src/libslic3r/PrintConfig.cpp | 16 +- src/libslic3r/PrintObject.cpp | 13 +- src/slic3r/GUI/BackgroundSlicingProcess.cpp | 18 +- src/slic3r/GUI/GLCanvas3D.cpp | 2 +- src/slic3r/GUI/GUI_ObjectSettings.cpp | 2 +- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 2 +- src/slic3r/GUI/KBShortcutsDialog.cpp | 10 +- src/slic3r/GUI/MainFrame.cpp | 2 + src/slic3r/GUI/Plater.cpp | 10 +- src/slic3r/GUI/Tab.cpp | 6 +- src/slic3r/GUI/wxExtensions.cpp | 24 +- src/slic3r/GUI/wxExtensions.hpp | 23 +- 14 files changed, 1217 insertions(+), 1121 deletions(-) diff --git a/resources/localization/Slic3rPE.pot b/resources/localization/Slic3rPE.pot index 098fc7d07..be2a344c9 100644 --- a/resources/localization/Slic3rPE.pot +++ b/resources/localization/Slic3rPE.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-04-26 11:00+0200\n" +"POT-Creation-Date: 2019-05-04 01:38+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -22,7 +22,7 @@ msgstr "" msgid "About %s" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:67 src/slic3r/GUI/MainFrame.cpp:52 +#: src/slic3r/GUI/AboutDialog.cpp:67 src/slic3r/GUI/MainFrame.cpp:53 msgid "Version" msgstr "" @@ -35,7 +35,7 @@ msgid "Rectangular" msgstr "" #: src/slic3r/GUI/BedShapeDialog.cpp:72 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:118 src/slic3r/GUI/Plater.cpp:137 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:153 src/slic3r/GUI/Plater.cpp:137 #: src/slic3r/GUI/Tab.cpp:2257 msgid "Size" msgstr "" @@ -60,37 +60,37 @@ msgstr "" #: src/slic3r/GUI/BedShapeDialog.cpp:87 src/slic3r/GUI/ConfigWizard.cpp:118 #: src/slic3r/GUI/ConfigWizard.cpp:561 src/slic3r/GUI/ConfigWizard.cpp:575 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:115 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:150 #: src/slic3r/GUI/RammingChart.cpp:81 src/slic3r/GUI/WipeTowerDialog.cpp:84 #: src/libslic3r/PrintConfig.cpp:59 src/libslic3r/PrintConfig.cpp:66 -#: src/libslic3r/PrintConfig.cpp:75 src/libslic3r/PrintConfig.cpp:209 -#: src/libslic3r/PrintConfig.cpp:284 src/libslic3r/PrintConfig.cpp:292 -#: src/libslic3r/PrintConfig.cpp:342 src/libslic3r/PrintConfig.cpp:352 -#: src/libslic3r/PrintConfig.cpp:472 src/libslic3r/PrintConfig.cpp:483 -#: src/libslic3r/PrintConfig.cpp:501 src/libslic3r/PrintConfig.cpp:679 -#: src/libslic3r/PrintConfig.cpp:1165 src/libslic3r/PrintConfig.cpp:1226 -#: src/libslic3r/PrintConfig.cpp:1244 src/libslic3r/PrintConfig.cpp:1262 -#: src/libslic3r/PrintConfig.cpp:1314 src/libslic3r/PrintConfig.cpp:1324 -#: src/libslic3r/PrintConfig.cpp:1445 src/libslic3r/PrintConfig.cpp:1453 -#: src/libslic3r/PrintConfig.cpp:1494 src/libslic3r/PrintConfig.cpp:1502 -#: src/libslic3r/PrintConfig.cpp:1512 src/libslic3r/PrintConfig.cpp:1520 -#: src/libslic3r/PrintConfig.cpp:1528 src/libslic3r/PrintConfig.cpp:1611 -#: src/libslic3r/PrintConfig.cpp:1827 src/libslic3r/PrintConfig.cpp:1897 -#: src/libslic3r/PrintConfig.cpp:1931 src/libslic3r/PrintConfig.cpp:2123 -#: src/libslic3r/PrintConfig.cpp:2130 src/libslic3r/PrintConfig.cpp:2137 -#: src/libslic3r/PrintConfig.cpp:2167 src/libslic3r/PrintConfig.cpp:2177 -#: src/libslic3r/PrintConfig.cpp:2187 src/libslic3r/PrintConfig.cpp:2295 -#: src/libslic3r/PrintConfig.cpp:2370 src/libslic3r/PrintConfig.cpp:2379 -#: src/libslic3r/PrintConfig.cpp:2388 src/libslic3r/PrintConfig.cpp:2398 -#: src/libslic3r/PrintConfig.cpp:2442 src/libslic3r/PrintConfig.cpp:2452 -#: src/libslic3r/PrintConfig.cpp:2471 src/libslic3r/PrintConfig.cpp:2481 -#: src/libslic3r/PrintConfig.cpp:2490 src/libslic3r/PrintConfig.cpp:2508 -#: src/libslic3r/PrintConfig.cpp:2523 src/libslic3r/PrintConfig.cpp:2537 -#: src/libslic3r/PrintConfig.cpp:2550 src/libslic3r/PrintConfig.cpp:2560 +#: src/libslic3r/PrintConfig.cpp:75 src/libslic3r/PrintConfig.cpp:210 +#: src/libslic3r/PrintConfig.cpp:285 src/libslic3r/PrintConfig.cpp:293 +#: src/libslic3r/PrintConfig.cpp:343 src/libslic3r/PrintConfig.cpp:353 +#: src/libslic3r/PrintConfig.cpp:473 src/libslic3r/PrintConfig.cpp:484 +#: src/libslic3r/PrintConfig.cpp:502 src/libslic3r/PrintConfig.cpp:680 +#: src/libslic3r/PrintConfig.cpp:1166 src/libslic3r/PrintConfig.cpp:1227 +#: src/libslic3r/PrintConfig.cpp:1245 src/libslic3r/PrintConfig.cpp:1263 +#: src/libslic3r/PrintConfig.cpp:1315 src/libslic3r/PrintConfig.cpp:1325 +#: src/libslic3r/PrintConfig.cpp:1446 src/libslic3r/PrintConfig.cpp:1454 +#: src/libslic3r/PrintConfig.cpp:1495 src/libslic3r/PrintConfig.cpp:1503 +#: src/libslic3r/PrintConfig.cpp:1513 src/libslic3r/PrintConfig.cpp:1521 +#: src/libslic3r/PrintConfig.cpp:1529 src/libslic3r/PrintConfig.cpp:1612 +#: src/libslic3r/PrintConfig.cpp:1828 src/libslic3r/PrintConfig.cpp:1898 +#: src/libslic3r/PrintConfig.cpp:1932 src/libslic3r/PrintConfig.cpp:2125 +#: src/libslic3r/PrintConfig.cpp:2132 src/libslic3r/PrintConfig.cpp:2139 +#: src/libslic3r/PrintConfig.cpp:2169 src/libslic3r/PrintConfig.cpp:2179 +#: src/libslic3r/PrintConfig.cpp:2189 src/libslic3r/PrintConfig.cpp:2297 +#: src/libslic3r/PrintConfig.cpp:2372 src/libslic3r/PrintConfig.cpp:2381 +#: src/libslic3r/PrintConfig.cpp:2390 src/libslic3r/PrintConfig.cpp:2400 +#: src/libslic3r/PrintConfig.cpp:2444 src/libslic3r/PrintConfig.cpp:2454 +#: src/libslic3r/PrintConfig.cpp:2473 src/libslic3r/PrintConfig.cpp:2483 +#: src/libslic3r/PrintConfig.cpp:2492 src/libslic3r/PrintConfig.cpp:2510 +#: src/libslic3r/PrintConfig.cpp:2525 src/libslic3r/PrintConfig.cpp:2539 +#: src/libslic3r/PrintConfig.cpp:2552 src/libslic3r/PrintConfig.cpp:2562 msgid "mm" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:88 src/libslic3r/PrintConfig.cpp:676 +#: src/slic3r/GUI/BedShapeDialog.cpp:88 src/libslic3r/PrintConfig.cpp:677 msgid "Diameter" msgstr "" @@ -117,7 +117,7 @@ msgstr "" msgid "Choose a file to import bed shape from (STL/OBJ/AMF/3MF/PRUSA):" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:333 src/slic3r/GUI/GUI_ObjectList.cpp:1359 +#: src/slic3r/GUI/BedShapeDialog.cpp:333 src/slic3r/GUI/GUI_ObjectList.cpp:1431 msgid "Error! " msgstr "" @@ -283,7 +283,7 @@ msgstr "" msgid "Welcome" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:298 src/slic3r/GUI/GUI_App.cpp:643 +#: src/slic3r/GUI/ConfigWizard.cpp:298 src/slic3r/GUI/GUI_App.cpp:658 #, possible-c-format msgid "Run %s" msgstr "" @@ -467,49 +467,49 @@ msgstr "" msgid "Bed Temperature:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1063 +#: src/slic3r/GUI/ConfigWizard.cpp:1089 msgid "Select all standard printers" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1066 +#: src/slic3r/GUI/ConfigWizard.cpp:1092 msgid "< &Back" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1067 +#: src/slic3r/GUI/ConfigWizard.cpp:1093 msgid "&Next >" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1068 +#: src/slic3r/GUI/ConfigWizard.cpp:1094 msgid "&Finish" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1069 src/slic3r/GUI/FirmwareDialog.cpp:147 +#: src/slic3r/GUI/ConfigWizard.cpp:1095 src/slic3r/GUI/FirmwareDialog.cpp:147 #: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:37 #: src/slic3r/GUI/ProgressStatusBar.cpp:28 msgid "Cancel" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1083 +#: src/slic3r/GUI/ConfigWizard.cpp:1109 msgid "Prusa FFF Technology Printers" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1086 +#: src/slic3r/GUI/ConfigWizard.cpp:1112 msgid "Prusa MSLA Technology Printers" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1173 +#: src/slic3r/GUI/ConfigWizard.cpp:1181 msgid "Configuration Wizard" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1174 +#: src/slic3r/GUI/ConfigWizard.cpp:1182 msgid "Configuration &Wizard" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1176 +#: src/slic3r/GUI/ConfigWizard.cpp:1184 msgid "Configuration Assistant" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1177 +#: src/slic3r/GUI/ConfigWizard.cpp:1185 msgid "Configuration &Assistant" msgstr "" @@ -665,19 +665,19 @@ msgstr "" msgid "Cancelling..." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:715 +#: src/slic3r/GUI/GLCanvas3D.cpp:719 msgid "Detected object outside print volume" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:716 +#: src/slic3r/GUI/GLCanvas3D.cpp:720 msgid "Detected toolpath outside print volume" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:717 +#: src/slic3r/GUI/GLCanvas3D.cpp:721 msgid "Some objects are not visible when editing supports" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:719 +#: src/slic3r/GUI/GLCanvas3D.cpp:723 msgid "" "Detected object outside print volume\n" "Resolve a clash to continue slicing/export process correctly" @@ -701,7 +701,7 @@ msgstr "" msgid "Cut [C]" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:188 src/libslic3r/PrintConfig.cpp:3011 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:188 src/libslic3r/PrintConfig.cpp:3013 msgid "Cut" msgstr "" @@ -745,345 +745,349 @@ msgstr "" msgid "Scale (%)" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:892 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:838 msgid "Head diameter: " msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:905 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:851 msgid "Lock supports under new islands" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:909 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1291 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:855 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1237 msgid "Remove selected points" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:913 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:966 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:859 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:912 msgid "Remove all points" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:918 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1294 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:864 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1240 msgid "Apply changes" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:923 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1295 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:869 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1241 msgid "Discard changes" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:931 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:877 msgid "Minimal points distance: " msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:942 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:888 msgid "Support points density: " msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:956 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1297 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:902 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1243 msgid "Auto-generate points" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:962 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:908 msgid "Manual editing" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:982 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:926 +msgid "Clipping of view:" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:928 msgid "Reset direction" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1049 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:995 msgid "SLA Support Points [L]" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1076 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1022 msgid "Do you want to save your manually edited support points ?\n" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1077 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1023 msgid "Save changes?" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1166 msgid "" "Autogeneration will erase all manually edited points.\n" "\n" "Are you sure you want to do it?\n" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1222 src/slic3r/GUI/GUI.cpp:288 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1168 src/slic3r/GUI/GUI.cpp:283 #: src/slic3r/GUI/WipeTowerDialog.cpp:44 src/slic3r/GUI/WipeTowerDialog.cpp:328 msgid "Warning" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1254 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1200 msgid "SLA gizmo keyboard shortcuts" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1283 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1229 msgid "Add point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1284 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1230 msgid "Remove point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1285 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1231 msgid "Move point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1286 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1232 msgid "Add point to selection" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1287 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1233 msgid "Remove point from selection" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1288 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1234 msgid "Select by rectangle" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1289 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1235 msgid "Deselect by rectangle" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1290 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1236 msgid "Select all points" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1292 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1238 msgid "Move clipping plane" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1293 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1239 msgid "Reset clipping plane" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1296 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1242 msgid "Switch to editing mode" msgstr "" -#: src/slic3r/GUI/GUI.cpp:147 src/slic3r/GUI/Tab.cpp:2796 +#: src/slic3r/GUI/GUI.cpp:142 src/slic3r/GUI/Tab.cpp:2796 msgid "It's impossible to print multi-part object(s) with SLA technology." msgstr "" -#: src/slic3r/GUI/GUI.cpp:148 +#: src/slic3r/GUI/GUI.cpp:143 msgid "Please check and fix your object list." msgstr "" -#: src/slic3r/GUI/GUI.cpp:149 src/slic3r/GUI/GUI_App.cpp:728 +#: src/slic3r/GUI/GUI.cpp:144 src/slic3r/GUI/GUI_App.cpp:743 #: src/slic3r/GUI/Tab.cpp:2798 msgid "Attention!" msgstr "" -#: src/slic3r/GUI/GUI.cpp:282 +#: src/slic3r/GUI/GUI.cpp:277 msgid "Notice" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:363 +#: src/slic3r/GUI/GUI_App.cpp:378 msgid "Changing of an application language" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:371 src/slic3r/GUI/GUI_App.cpp:380 +#: src/slic3r/GUI/GUI_App.cpp:386 src/slic3r/GUI/GUI_App.cpp:395 msgid "Recreating" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:384 +#: src/slic3r/GUI/GUI_App.cpp:399 msgid "Loading of current presets" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:392 +#: src/slic3r/GUI/GUI_App.cpp:407 msgid "Loading of a mode view" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:474 +#: src/slic3r/GUI/GUI_App.cpp:489 msgid "Choose one file (3MF):" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:486 +#: src/slic3r/GUI/GUI_App.cpp:501 msgid "Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:499 +#: src/slic3r/GUI/GUI_App.cpp:514 msgid "Array of language names and identifiers should have the same size." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:509 +#: src/slic3r/GUI/GUI_App.cpp:524 msgid "Select the language" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:509 +#: src/slic3r/GUI/GUI_App.cpp:524 msgid "Language" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:579 src/slic3r/GUI/GUI_ObjectList.cpp:1175 -#: src/libslic3r/PrintConfig.cpp:298 +#: src/slic3r/GUI/GUI_App.cpp:594 src/slic3r/GUI/GUI_ObjectList.cpp:1245 +#: src/libslic3r/PrintConfig.cpp:299 msgid "Default" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:646 +#: src/slic3r/GUI/GUI_App.cpp:661 msgid "&Configuration Snapshots" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:646 +#: src/slic3r/GUI/GUI_App.cpp:661 msgid "Inspect / activate configuration snapshots" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:647 +#: src/slic3r/GUI/GUI_App.cpp:662 msgid "Take Configuration &Snapshot" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:647 +#: src/slic3r/GUI/GUI_App.cpp:662 msgid "Capture a configuration snapshot" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:650 +#: src/slic3r/GUI/GUI_App.cpp:665 msgid "&Preferences" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:656 +#: src/slic3r/GUI/GUI_App.cpp:671 msgid "Application preferences" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:659 src/slic3r/GUI/wxExtensions.cpp:2374 +#: src/slic3r/GUI/GUI_App.cpp:674 src/slic3r/GUI/wxExtensions.cpp:2459 msgid "Simple" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:659 +#: src/slic3r/GUI/GUI_App.cpp:674 msgid "Simple View Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:660 src/slic3r/GUI/GUI_ObjectList.cpp:76 -#: src/slic3r/GUI/GUI_ObjectList.cpp:458 src/slic3r/GUI/Tab.cpp:1026 +#: src/slic3r/GUI/GUI_App.cpp:675 src/slic3r/GUI/GUI_ObjectList.cpp:76 +#: src/slic3r/GUI/GUI_ObjectList.cpp:517 src/slic3r/GUI/Tab.cpp:1026 #: src/slic3r/GUI/Tab.cpp:1041 src/slic3r/GUI/Tab.cpp:1139 #: src/slic3r/GUI/Tab.cpp:1142 src/slic3r/GUI/Tab.cpp:1515 #: src/slic3r/GUI/Tab.cpp:1940 src/slic3r/GUI/Tab.cpp:3435 -#: src/slic3r/GUI/wxExtensions.cpp:2375 src/libslic3r/PrintConfig.cpp:72 -#: src/libslic3r/PrintConfig.cpp:186 src/libslic3r/PrintConfig.cpp:349 -#: src/libslic3r/PrintConfig.cpp:987 src/libslic3r/PrintConfig.cpp:2173 +#: src/slic3r/GUI/wxExtensions.cpp:2460 src/libslic3r/PrintConfig.cpp:72 +#: src/libslic3r/PrintConfig.cpp:187 src/libslic3r/PrintConfig.cpp:350 +#: src/libslic3r/PrintConfig.cpp:988 src/libslic3r/PrintConfig.cpp:2175 msgid "Advanced" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:660 +#: src/slic3r/GUI/GUI_App.cpp:675 msgid "Advanced View Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:661 src/slic3r/GUI/wxExtensions.cpp:2376 +#: src/slic3r/GUI/GUI_App.cpp:676 src/slic3r/GUI/wxExtensions.cpp:2461 msgid "Expert" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:661 +#: src/slic3r/GUI/GUI_App.cpp:676 msgid "Expert View Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:666 +#: src/slic3r/GUI/GUI_App.cpp:681 msgid "Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:666 +#: src/slic3r/GUI/GUI_App.cpp:681 #, possible-c-format msgid "%s View Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:668 +#: src/slic3r/GUI/GUI_App.cpp:683 msgid "Change Application &Language" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:670 +#: src/slic3r/GUI/GUI_App.cpp:685 msgid "Flash printer &firmware" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:670 +#: src/slic3r/GUI/GUI_App.cpp:685 msgid "Upload a firmware image into an Arduino based printer" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:682 +#: src/slic3r/GUI/GUI_App.cpp:697 msgid "Taking configuration snapshot" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:682 +#: src/slic3r/GUI/GUI_App.cpp:697 msgid "Snapshot name" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:725 +#: src/slic3r/GUI/GUI_App.cpp:740 msgid "Application will be restarted after language change." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:726 +#: src/slic3r/GUI/GUI_App.cpp:741 msgid "3D-Scene will be cleaned." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:727 +#: src/slic3r/GUI/GUI_App.cpp:742 msgid "Please, check your changes before." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:754 +#: src/slic3r/GUI/GUI_App.cpp:769 msgid "&Configuration" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:774 +#: src/slic3r/GUI/GUI_App.cpp:789 msgid "You have unsaved changes " msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:774 +#: src/slic3r/GUI/GUI_App.cpp:789 msgid ". Discard changes and continue anyway?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:775 +#: src/slic3r/GUI/GUI_App.cpp:790 msgid "Unsaved Presets" msgstr "" #: src/slic3r/GUI/GUI_ObjectList.cpp:28 src/slic3r/GUI/GUI_ObjectList.cpp:68 -#: src/slic3r/GUI/GUI_ObjectList.cpp:450 src/libslic3r/PrintConfig.cpp:56 -#: src/libslic3r/PrintConfig.cpp:149 src/libslic3r/PrintConfig.cpp:380 -#: src/libslic3r/PrintConfig.cpp:437 src/libslic3r/PrintConfig.cpp:445 -#: src/libslic3r/PrintConfig.cpp:841 src/libslic3r/PrintConfig.cpp:1025 -#: src/libslic3r/PrintConfig.cpp:1304 src/libslic3r/PrintConfig.cpp:1370 -#: src/libslic3r/PrintConfig.cpp:1551 src/libslic3r/PrintConfig.cpp:1986 -#: src/libslic3r/PrintConfig.cpp:2042 +#: src/slic3r/GUI/GUI_ObjectList.cpp:509 src/libslic3r/PrintConfig.cpp:56 +#: src/libslic3r/PrintConfig.cpp:150 src/libslic3r/PrintConfig.cpp:381 +#: src/libslic3r/PrintConfig.cpp:438 src/libslic3r/PrintConfig.cpp:446 +#: src/libslic3r/PrintConfig.cpp:842 src/libslic3r/PrintConfig.cpp:1026 +#: src/libslic3r/PrintConfig.cpp:1305 src/libslic3r/PrintConfig.cpp:1371 +#: src/libslic3r/PrintConfig.cpp:1552 src/libslic3r/PrintConfig.cpp:1987 +#: src/libslic3r/PrintConfig.cpp:2044 msgid "Layers and Perimeters" msgstr "" #: src/slic3r/GUI/GUI_ObjectList.cpp:29 src/slic3r/GUI/GUI_ObjectList.cpp:69 -#: src/slic3r/GUI/GUI_ObjectList.cpp:451 src/slic3r/GUI/Plater.cpp:439 +#: src/slic3r/GUI/GUI_ObjectList.cpp:510 src/slic3r/GUI/Plater.cpp:439 #: src/slic3r/GUI/Tab.cpp:1030 src/slic3r/GUI/Tab.cpp:1031 -#: src/slic3r/GUI/Tab.cpp:1360 src/libslic3r/PrintConfig.cpp:166 -#: src/libslic3r/PrintConfig.cpp:388 src/libslic3r/PrintConfig.cpp:728 -#: src/libslic3r/PrintConfig.cpp:742 src/libslic3r/PrintConfig.cpp:779 -#: src/libslic3r/PrintConfig.cpp:932 src/libslic3r/PrintConfig.cpp:942 -#: src/libslic3r/PrintConfig.cpp:960 src/libslic3r/PrintConfig.cpp:978 -#: src/libslic3r/PrintConfig.cpp:997 src/libslic3r/PrintConfig.cpp:1658 -#: src/libslic3r/PrintConfig.cpp:1675 +#: src/slic3r/GUI/Tab.cpp:1360 src/libslic3r/PrintConfig.cpp:167 +#: src/libslic3r/PrintConfig.cpp:389 src/libslic3r/PrintConfig.cpp:729 +#: src/libslic3r/PrintConfig.cpp:743 src/libslic3r/PrintConfig.cpp:780 +#: src/libslic3r/PrintConfig.cpp:933 src/libslic3r/PrintConfig.cpp:943 +#: src/libslic3r/PrintConfig.cpp:961 src/libslic3r/PrintConfig.cpp:979 +#: src/libslic3r/PrintConfig.cpp:998 src/libslic3r/PrintConfig.cpp:1659 +#: src/libslic3r/PrintConfig.cpp:1676 msgid "Infill" msgstr "" #: src/slic3r/GUI/GUI_ObjectList.cpp:30 src/slic3r/GUI/GUI_ObjectList.cpp:70 -#: src/slic3r/GUI/GUI_ObjectList.cpp:452 src/slic3r/GUI/GUI_Preview.cpp:236 +#: src/slic3r/GUI/GUI_ObjectList.cpp:511 src/slic3r/GUI/GUI_Preview.cpp:236 #: src/slic3r/GUI/Tab.cpp:1059 src/slic3r/GUI/Tab.cpp:1060 -#: src/libslic3r/PrintConfig.cpp:333 src/libslic3r/PrintConfig.cpp:1431 -#: src/libslic3r/PrintConfig.cpp:1779 src/libslic3r/PrintConfig.cpp:1785 -#: src/libslic3r/PrintConfig.cpp:1793 src/libslic3r/PrintConfig.cpp:1805 -#: src/libslic3r/PrintConfig.cpp:1815 src/libslic3r/PrintConfig.cpp:1823 -#: src/libslic3r/PrintConfig.cpp:1838 src/libslic3r/PrintConfig.cpp:1859 -#: src/libslic3r/PrintConfig.cpp:1870 src/libslic3r/PrintConfig.cpp:1886 -#: src/libslic3r/PrintConfig.cpp:1895 src/libslic3r/PrintConfig.cpp:1904 -#: src/libslic3r/PrintConfig.cpp:1915 src/libslic3r/PrintConfig.cpp:1929 -#: src/libslic3r/PrintConfig.cpp:1937 src/libslic3r/PrintConfig.cpp:1938 -#: src/libslic3r/PrintConfig.cpp:1947 src/libslic3r/PrintConfig.cpp:1955 -#: src/libslic3r/PrintConfig.cpp:1969 src/libslic3r/GCode/PreviewData.cpp:172 +#: src/libslic3r/PrintConfig.cpp:334 src/libslic3r/PrintConfig.cpp:1432 +#: src/libslic3r/PrintConfig.cpp:1780 src/libslic3r/PrintConfig.cpp:1786 +#: src/libslic3r/PrintConfig.cpp:1794 src/libslic3r/PrintConfig.cpp:1806 +#: src/libslic3r/PrintConfig.cpp:1816 src/libslic3r/PrintConfig.cpp:1824 +#: src/libslic3r/PrintConfig.cpp:1839 src/libslic3r/PrintConfig.cpp:1860 +#: src/libslic3r/PrintConfig.cpp:1871 src/libslic3r/PrintConfig.cpp:1887 +#: src/libslic3r/PrintConfig.cpp:1896 src/libslic3r/PrintConfig.cpp:1905 +#: src/libslic3r/PrintConfig.cpp:1916 src/libslic3r/PrintConfig.cpp:1930 +#: src/libslic3r/PrintConfig.cpp:1938 src/libslic3r/PrintConfig.cpp:1939 +#: src/libslic3r/PrintConfig.cpp:1948 src/libslic3r/PrintConfig.cpp:1956 +#: src/libslic3r/PrintConfig.cpp:1970 src/libslic3r/GCode/PreviewData.cpp:172 msgid "Support material" msgstr "" #: src/slic3r/GUI/GUI_ObjectList.cpp:33 src/slic3r/GUI/GUI_ObjectList.cpp:72 -#: src/slic3r/GUI/GUI_ObjectList.cpp:454 src/slic3r/GUI/Tab.cpp:1119 -#: src/slic3r/GUI/Tab.cpp:1844 src/libslic3r/PrintConfig.cpp:455 -#: src/libslic3r/PrintConfig.cpp:953 src/libslic3r/PrintConfig.cpp:1339 -#: src/libslic3r/PrintConfig.cpp:1667 src/libslic3r/PrintConfig.cpp:1851 -#: src/libslic3r/PrintConfig.cpp:1877 src/libslic3r/PrintConfig.cpp:2149 -#: src/libslic3r/PrintConfig.cpp:2157 +#: src/slic3r/GUI/GUI_ObjectList.cpp:513 src/slic3r/GUI/Tab.cpp:1119 +#: src/slic3r/GUI/Tab.cpp:1844 src/libslic3r/PrintConfig.cpp:456 +#: src/libslic3r/PrintConfig.cpp:954 src/libslic3r/PrintConfig.cpp:1340 +#: src/libslic3r/PrintConfig.cpp:1668 src/libslic3r/PrintConfig.cpp:1852 +#: src/libslic3r/PrintConfig.cpp:1878 src/libslic3r/PrintConfig.cpp:2151 +#: src/libslic3r/PrintConfig.cpp:2159 msgid "Extruders" msgstr "" @@ -1091,339 +1095,340 @@ msgstr "" msgid "Pad and Support" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:71 src/slic3r/GUI/GUI_ObjectList.cpp:453 +#: src/slic3r/GUI/GUI_ObjectList.cpp:71 src/slic3r/GUI/GUI_ObjectList.cpp:512 #: src/slic3r/GUI/GUI_Preview.cpp:215 src/slic3r/GUI/Tab.cpp:1084 -#: src/libslic3r/PrintConfig.cpp:198 src/libslic3r/PrintConfig.cpp:425 -#: src/libslic3r/PrintConfig.cpp:870 src/libslic3r/PrintConfig.cpp:998 -#: src/libslic3r/PrintConfig.cpp:1360 src/libslic3r/PrintConfig.cpp:1597 -#: src/libslic3r/PrintConfig.cpp:1646 src/libslic3r/PrintConfig.cpp:1697 -#: src/libslic3r/PrintConfig.cpp:2028 +#: src/libslic3r/PrintConfig.cpp:199 src/libslic3r/PrintConfig.cpp:426 +#: src/libslic3r/PrintConfig.cpp:871 src/libslic3r/PrintConfig.cpp:999 +#: src/libslic3r/PrintConfig.cpp:1361 src/libslic3r/PrintConfig.cpp:1598 +#: src/libslic3r/PrintConfig.cpp:1647 src/libslic3r/PrintConfig.cpp:1698 +#: src/libslic3r/PrintConfig.cpp:2029 msgid "Speed" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:73 src/slic3r/GUI/GUI_ObjectList.cpp:455 -#: src/libslic3r/PrintConfig.cpp:415 src/libslic3r/PrintConfig.cpp:522 -#: src/libslic3r/PrintConfig.cpp:829 src/libslic3r/PrintConfig.cpp:961 -#: src/libslic3r/PrintConfig.cpp:1348 src/libslic3r/PrintConfig.cpp:1687 -#: src/libslic3r/PrintConfig.cpp:1860 src/libslic3r/PrintConfig.cpp:2017 +#: src/slic3r/GUI/GUI_ObjectList.cpp:73 src/slic3r/GUI/GUI_ObjectList.cpp:514 +#: src/libslic3r/PrintConfig.cpp:416 src/libslic3r/PrintConfig.cpp:523 +#: src/libslic3r/PrintConfig.cpp:830 src/libslic3r/PrintConfig.cpp:962 +#: src/libslic3r/PrintConfig.cpp:1349 src/libslic3r/PrintConfig.cpp:1688 +#: src/libslic3r/PrintConfig.cpp:1861 src/libslic3r/PrintConfig.cpp:2018 msgid "Extrusion Width" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:78 src/slic3r/GUI/GUI_ObjectList.cpp:460 +#: src/slic3r/GUI/GUI_ObjectList.cpp:78 src/slic3r/GUI/GUI_ObjectList.cpp:519 #: src/slic3r/GUI/Plater.cpp:418 src/slic3r/GUI/Tab.cpp:3397 -#: src/slic3r/GUI/Tab.cpp:3398 src/libslic3r/PrintConfig.cpp:2361 -#: src/libslic3r/PrintConfig.cpp:2368 src/libslic3r/PrintConfig.cpp:2377 -#: src/libslic3r/PrintConfig.cpp:2386 src/libslic3r/PrintConfig.cpp:2396 -#: src/libslic3r/PrintConfig.cpp:2422 src/libslic3r/PrintConfig.cpp:2429 -#: src/libslic3r/PrintConfig.cpp:2440 src/libslic3r/PrintConfig.cpp:2450 -#: src/libslic3r/PrintConfig.cpp:2459 src/libslic3r/PrintConfig.cpp:2469 -#: src/libslic3r/PrintConfig.cpp:2478 src/libslic3r/PrintConfig.cpp:2488 -#: src/libslic3r/PrintConfig.cpp:2498 src/libslic3r/PrintConfig.cpp:2506 +#: src/slic3r/GUI/Tab.cpp:3398 src/libslic3r/PrintConfig.cpp:2363 +#: src/libslic3r/PrintConfig.cpp:2370 src/libslic3r/PrintConfig.cpp:2379 +#: src/libslic3r/PrintConfig.cpp:2388 src/libslic3r/PrintConfig.cpp:2398 +#: src/libslic3r/PrintConfig.cpp:2424 src/libslic3r/PrintConfig.cpp:2431 +#: src/libslic3r/PrintConfig.cpp:2442 src/libslic3r/PrintConfig.cpp:2452 +#: src/libslic3r/PrintConfig.cpp:2461 src/libslic3r/PrintConfig.cpp:2471 +#: src/libslic3r/PrintConfig.cpp:2480 src/libslic3r/PrintConfig.cpp:2490 +#: src/libslic3r/PrintConfig.cpp:2500 src/libslic3r/PrintConfig.cpp:2508 msgid "Supports" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:79 src/slic3r/GUI/GUI_ObjectList.cpp:461 +#: src/slic3r/GUI/GUI_ObjectList.cpp:79 src/slic3r/GUI/GUI_ObjectList.cpp:520 #: src/slic3r/GUI/Tab.cpp:3425 src/slic3r/GUI/Tab.cpp:3426 -#: src/libslic3r/PrintConfig.cpp:2514 src/libslic3r/PrintConfig.cpp:2521 -#: src/libslic3r/PrintConfig.cpp:2535 src/libslic3r/PrintConfig.cpp:2545 -#: src/libslic3r/PrintConfig.cpp:2558 src/libslic3r/PrintConfig.cpp:2567 +#: src/libslic3r/PrintConfig.cpp:2516 src/libslic3r/PrintConfig.cpp:2523 +#: src/libslic3r/PrintConfig.cpp:2537 src/libslic3r/PrintConfig.cpp:2547 +#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:2569 msgid "Pad" msgstr "" #: src/slic3r/GUI/GUI_ObjectList.cpp:176 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:45 msgid "Name" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:204 -msgid "Right button click the icon to change the object settings" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:212 +#: src/slic3r/GUI/GUI_ObjectList.cpp:230 #, possible-c-format msgid "Auto-repaired (%d errors):\n" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:215 +#: src/slic3r/GUI/GUI_ObjectList.cpp:237 msgid "degenerate facets" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:216 +#: src/slic3r/GUI/GUI_ObjectList.cpp:238 msgid "edges fixed" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:217 +#: src/slic3r/GUI/GUI_ObjectList.cpp:239 msgid "facets removed" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:218 +#: src/slic3r/GUI/GUI_ObjectList.cpp:240 msgid "facets added" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:219 +#: src/slic3r/GUI/GUI_ObjectList.cpp:241 msgid "facets reversed" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:220 +#: src/slic3r/GUI/GUI_ObjectList.cpp:242 msgid "backwards edges" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:234 +#: src/slic3r/GUI/GUI_ObjectList.cpp:250 msgid "Right button click the icon to fix STL through Netfabb" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:281 src/slic3r/GUI/Tab.cpp:1479 -#: src/libslic3r/PrintConfig.cpp:454 +#: src/slic3r/GUI/GUI_ObjectList.cpp:279 +msgid "Right button click the icon to change the object settings" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:335 src/slic3r/GUI/Tab.cpp:1479 +#: src/libslic3r/PrintConfig.cpp:455 msgid "Extruder" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:791 src/slic3r/GUI/GUI_ObjectList.cpp:1071 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1077 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1307 +#: src/slic3r/GUI/GUI_ObjectList.cpp:854 src/slic3r/GUI/GUI_ObjectList.cpp:1139 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1145 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1377 #, possible-c-format msgid "Quick Add Settings (%s)" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:854 +#: src/slic3r/GUI/GUI_ObjectList.cpp:917 msgid "Select showing settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:982 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1050 msgid "Load" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:987 src/slic3r/GUI/GUI_ObjectList.cpp:1019 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1022 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1055 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1087 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1090 msgid "Box" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:987 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1055 msgid "Cylinder" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:987 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1055 msgid "Sphere" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:987 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1055 msgid "Slab" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:998 src/slic3r/GUI/GUI_ObjectList.cpp:1014 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1066 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1082 msgid "Add part" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:999 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1067 msgid "Add modifier" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1000 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1018 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1068 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1086 msgid "Add support enforcer" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1001 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1021 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1069 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1089 msgid "Add support blocker" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1042 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1110 msgid "Split to parts" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1050 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1118 msgid "Add settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1117 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1185 msgid "Change type" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1124 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1261 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1192 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1331 msgid "Set as a Separated Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1132 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1200 msgid "Rename" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1142 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1210 msgid "Fix through the Netfabb" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1149 src/slic3r/GUI/Plater.cpp:2927 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1219 src/slic3r/GUI/Plater.cpp:2927 msgid "Export as STL" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1156 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1226 msgid "Change extruder" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1181 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1251 msgid "Select new extruder for the object/part" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1187 src/slic3r/GUI/Plater.cpp:2891 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1257 src/slic3r/GUI/Plater.cpp:2891 #: src/slic3r/GUI/Plater.cpp:2909 src/slic3r/GUI/Tab.cpp:2937 msgid "Delete" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1261 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1331 msgid "Set as a Separated Objects" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1479 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1551 msgid "Generic" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1617 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1694 msgid "You can't delete the last solid part from object." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1634 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1711 msgid "You can't delete the last intance from object." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1660 src/slic3r/GUI/Plater.cpp:2279 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1737 src/slic3r/GUI/Plater.cpp:2279 msgid "" "The selected object couldn't be split because it contains only one part." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1768 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1846 msgid "Group manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1780 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1858 msgid "Object manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1790 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1868 msgid "Object Settings to modify" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1794 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1872 msgid "Part Settings to modify" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1803 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1881 msgid "Part manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1809 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1887 msgid "Instance manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2333 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2412 msgid "Object or Instance" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2333 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2412 msgid "Part" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2335 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2414 msgid "Unsupported selection" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2336 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2415 #, possible-c-format msgid "You started your selection with %s Item." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2337 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2416 #, possible-c-format msgid "In this mode you can select only other %s Items%s" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2340 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2419 msgid "of a current Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2345 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2418 src/slic3r/GUI/Plater.cpp:118 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2424 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2497 src/slic3r/GUI/Plater.cpp:118 msgid "Info" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2459 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2538 msgid "You can't change a type of the last solid part of the object." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2466 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2545 msgid "Select type of part" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2630 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2709 msgid "Enter new name" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2630 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2709 msgid "Renaming" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2646 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2742 src/slic3r/GUI/Tab.cpp:3278 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2725 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2812 src/slic3r/GUI/Tab.cpp:3278 #: src/slic3r/GUI/Tab.cpp:3282 msgid "The supplied name is not valid;" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2647 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2743 src/slic3r/GUI/Tab.cpp:3279 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2726 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2813 src/slic3r/GUI/Tab.cpp:3279 msgid "the following characters are not allowed:" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2763 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2833 msgid "Set extruder for selected items" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2764 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2834 msgid "Select extruder number for selected objects and/or parts" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2777 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2847 msgid "Select extruder number:" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2778 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2848 msgid "This extruder will be set for selected items" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:25 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:27 msgid "Object Manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:47 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:78 msgid "Object name" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:115 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:158 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:150 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:193 msgid "Position" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:116 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:159 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:151 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:194 msgid "Rotation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:117 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:199 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:219 -#: src/libslic3r/PrintConfig.cpp:3075 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:152 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:234 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:254 +#: src/libslic3r/PrintConfig.cpp:3077 msgid "Scale" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:160 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:195 msgid "Scale factors" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:198 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:218 -#: src/libslic3r/PrintConfig.cpp:3060 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:233 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:253 +#: src/libslic3r/PrintConfig.cpp:3062 msgid "Rotate" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:217 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:252 msgid "Translate" msgstr "" @@ -1440,11 +1445,11 @@ msgstr "" msgid "Feature type" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:213 src/libslic3r/PrintConfig.cpp:467 +#: src/slic3r/GUI/GUI_Preview.cpp:213 src/libslic3r/PrintConfig.cpp:468 msgid "Height" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:214 src/libslic3r/PrintConfig.cpp:2135 +#: src/slic3r/GUI/GUI_Preview.cpp:214 src/libslic3r/PrintConfig.cpp:2137 msgid "Width" msgstr "" @@ -1487,13 +1492,13 @@ msgstr "" msgid "Internal infill" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:231 src/libslic3r/PrintConfig.cpp:1686 -#: src/libslic3r/PrintConfig.cpp:1696 src/libslic3r/GCode/PreviewData.cpp:167 +#: src/slic3r/GUI/GUI_Preview.cpp:231 src/libslic3r/PrintConfig.cpp:1687 +#: src/libslic3r/PrintConfig.cpp:1697 src/libslic3r/GCode/PreviewData.cpp:167 msgid "Solid infill" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:232 src/libslic3r/PrintConfig.cpp:2016 -#: src/libslic3r/PrintConfig.cpp:2027 src/libslic3r/GCode/PreviewData.cpp:168 +#: src/slic3r/GUI/GUI_Preview.cpp:232 src/libslic3r/PrintConfig.cpp:2017 +#: src/libslic3r/PrintConfig.cpp:2028 src/libslic3r/GCode/PreviewData.cpp:168 msgid "Top solid infill" msgstr "" @@ -1501,7 +1506,7 @@ msgstr "" msgid "Bridge infill" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:234 src/libslic3r/PrintConfig.cpp:869 +#: src/slic3r/GUI/GUI_Preview.cpp:234 src/libslic3r/PrintConfig.cpp:870 #: src/libslic3r/GCode/PreviewData.cpp:170 msgid "Gap fill" msgstr "" @@ -1511,7 +1516,7 @@ msgstr "" msgid "Skirt" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:237 src/libslic3r/PrintConfig.cpp:1903 +#: src/slic3r/GUI/GUI_Preview.cpp:237 src/libslic3r/PrintConfig.cpp:1904 #: src/libslic3r/GCode/PreviewData.cpp:173 msgid "Support material interface" msgstr "" @@ -1521,7 +1526,7 @@ msgstr "" msgid "Wipe tower" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/PrintConfig.cpp:2049 +#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/PrintConfig.cpp:2051 msgid "Travel" msgstr "" @@ -1537,7 +1542,7 @@ msgstr "" msgid "Shells" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:13 src/slic3r/GUI/MainFrame.cpp:516 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:13 src/slic3r/GUI/MainFrame.cpp:566 msgid "Keyboard Shortcuts" msgstr "" @@ -1554,7 +1559,7 @@ msgid "Load Config from .ini/amf/3mf/gcode" msgstr "" #: src/slic3r/GUI/KBShortcutsDialog.cpp:108 src/slic3r/GUI/Plater.cpp:733 -#: src/slic3r/GUI/Plater.cpp:3748 src/libslic3r/PrintConfig.cpp:2962 +#: src/slic3r/GUI/Plater.cpp:3821 src/libslic3r/PrintConfig.cpp:2964 msgid "Export G-code" msgstr "" @@ -1574,7 +1579,7 @@ msgstr "" msgid "Quick slice" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 src/slic3r/GUI/MainFrame.cpp:349 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 src/slic3r/GUI/MainFrame.cpp:395 msgid "Repeat last quick slice" msgstr "" @@ -1632,7 +1637,7 @@ msgid "Show keyboard shortcuts list" msgstr "" #: src/slic3r/GUI/KBShortcutsDialog.cpp:127 -msgid "Select multiple object/Move multiple object" +msgid "Press to select multiple object or move multiple object with mouse" msgstr "" #: src/slic3r/GUI/KBShortcutsDialog.cpp:129 @@ -1788,511 +1793,531 @@ msgstr "" msgid "Layers Slider Shortcuts" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:54 +#: src/slic3r/GUI/MainFrame.cpp:55 msgid "" " - Remember to check for updates at http://github.com/prusa3d/slic3r/releases" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:160 +#: src/slic3r/GUI/MainFrame.cpp:161 msgid "Plater" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:296 +#: src/slic3r/GUI/MainFrame.cpp:339 msgid "&Open Project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:296 +#: src/slic3r/GUI/MainFrame.cpp:339 msgid "Open a project file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:298 +#: src/slic3r/GUI/MainFrame.cpp:341 msgid "&Save Project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:298 +#: src/slic3r/GUI/MainFrame.cpp:341 msgid "Save current project file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:300 +#: src/slic3r/GUI/MainFrame.cpp:343 msgid "Save Project &as" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:300 +#: src/slic3r/GUI/MainFrame.cpp:343 msgid "Save current project file as" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:306 +#: src/slic3r/GUI/MainFrame.cpp:349 msgid "Import STL/OBJ/AM&F/3MF" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:306 +#: src/slic3r/GUI/MainFrame.cpp:349 msgid "Load a model" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:309 +#: src/slic3r/GUI/MainFrame.cpp:352 msgid "Import &Config" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:309 +#: src/slic3r/GUI/MainFrame.cpp:352 msgid "Load exported configuration file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:311 +#: src/slic3r/GUI/MainFrame.cpp:354 msgid "Import Config from &project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:311 +#: src/slic3r/GUI/MainFrame.cpp:354 msgid "Load configuration from project file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:314 +#: src/slic3r/GUI/MainFrame.cpp:357 msgid "Import Config &Bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:314 +#: src/slic3r/GUI/MainFrame.cpp:357 msgid "Load presets from a bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:316 +#: src/slic3r/GUI/MainFrame.cpp:359 msgid "&Import" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:319 +#: src/slic3r/GUI/MainFrame.cpp:362 src/slic3r/GUI/MainFrame.cpp:602 msgid "Export &G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:319 +#: src/slic3r/GUI/MainFrame.cpp:362 msgid "Export current plate as G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:322 +#: src/slic3r/GUI/MainFrame.cpp:366 msgid "Export plate as &STL" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:322 +#: src/slic3r/GUI/MainFrame.cpp:366 msgid "Export current plate as STL" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:324 +#: src/slic3r/GUI/MainFrame.cpp:368 +msgid "Export plate as STL including supports" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:368 +msgid "Export current plate as STL including supports" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:370 msgid "Export plate as &AMF" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:324 +#: src/slic3r/GUI/MainFrame.cpp:370 msgid "Export current plate as AMF" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:327 +#: src/slic3r/GUI/MainFrame.cpp:373 msgid "Export &Config" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:327 +#: src/slic3r/GUI/MainFrame.cpp:373 msgid "Export current configuration to file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:329 +#: src/slic3r/GUI/MainFrame.cpp:375 msgid "Export Config &Bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:329 +#: src/slic3r/GUI/MainFrame.cpp:375 msgid "Export all presets to file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:331 +#: src/slic3r/GUI/MainFrame.cpp:377 msgid "&Export" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:337 +#: src/slic3r/GUI/MainFrame.cpp:383 msgid "Quick Slice" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:337 +#: src/slic3r/GUI/MainFrame.cpp:383 msgid "Slice a file into a G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:343 +#: src/slic3r/GUI/MainFrame.cpp:389 msgid "Quick Slice and Save As" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:343 +#: src/slic3r/GUI/MainFrame.cpp:389 msgid "Slice a file into a G-code, save as" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:349 +#: src/slic3r/GUI/MainFrame.cpp:395 msgid "Repeat Last Quick Slice" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:357 +#: src/slic3r/GUI/MainFrame.cpp:403 msgid "(Re)Slice &Now" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:357 +#: src/slic3r/GUI/MainFrame.cpp:403 msgid "Start new slicing process" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:360 +#: src/slic3r/GUI/MainFrame.cpp:406 msgid "&Repair STL file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:360 +#: src/slic3r/GUI/MainFrame.cpp:406 msgid "Automatically repair an STL file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:363 +#: src/slic3r/GUI/MainFrame.cpp:409 msgid "&Quit" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:363 +#: src/slic3r/GUI/MainFrame.cpp:409 #, possible-c-format msgid "Quit %s" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:397 +#: src/slic3r/GUI/MainFrame.cpp:444 msgid "&Select all" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:397 +#: src/slic3r/GUI/MainFrame.cpp:444 msgid "Selects all objects" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:400 +#: src/slic3r/GUI/MainFrame.cpp:447 msgid "&Delete selected" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:400 +#: src/slic3r/GUI/MainFrame.cpp:447 msgid "Deletes the current selection" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:402 +#: src/slic3r/GUI/MainFrame.cpp:449 msgid "Delete &all" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:402 +#: src/slic3r/GUI/MainFrame.cpp:449 msgid "Deletes all objects" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:407 +#: src/slic3r/GUI/MainFrame.cpp:454 msgid "&Copy" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:407 +#: src/slic3r/GUI/MainFrame.cpp:454 msgid "Copy selection to clipboard" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:409 +#: src/slic3r/GUI/MainFrame.cpp:456 msgid "&Paste" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:409 +#: src/slic3r/GUI/MainFrame.cpp:456 msgid "Paste clipboard" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:424 +#: src/slic3r/GUI/MainFrame.cpp:471 msgid "&Plater Tab" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:424 +#: src/slic3r/GUI/MainFrame.cpp:471 msgid "Show the plater" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:431 +#: src/slic3r/GUI/MainFrame.cpp:478 msgid "P&rint Settings Tab" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:431 +#: src/slic3r/GUI/MainFrame.cpp:478 msgid "Show the print settings" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:433 +#: src/slic3r/GUI/MainFrame.cpp:480 src/slic3r/GUI/MainFrame.cpp:604 msgid "&Filament Settings Tab" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:433 +#: src/slic3r/GUI/MainFrame.cpp:480 msgid "Show the filament settings" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:435 +#: src/slic3r/GUI/MainFrame.cpp:483 msgid "Print&er Settings Tab" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:435 +#: src/slic3r/GUI/MainFrame.cpp:483 msgid "Show the printer settings" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:439 +#: src/slic3r/GUI/MainFrame.cpp:487 msgid "3&D" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:439 +#: src/slic3r/GUI/MainFrame.cpp:487 msgid "Show the 3D editing view" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:441 +#: src/slic3r/GUI/MainFrame.cpp:489 msgid "Pre&view" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:441 +#: src/slic3r/GUI/MainFrame.cpp:489 msgid "Show the 3D slices preview" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:462 +#: src/slic3r/GUI/MainFrame.cpp:510 msgid "Print &Host Upload Queue" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:462 +#: src/slic3r/GUI/MainFrame.cpp:510 msgid "Display the Print Host Upload Queue window" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:471 +#: src/slic3r/GUI/MainFrame.cpp:519 msgid "Iso" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:471 +#: src/slic3r/GUI/MainFrame.cpp:519 msgid "Iso View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:473 +#. TRN To be shown in the main menu View->Top +#: src/slic3r/GUI/MainFrame.cpp:522 msgid "Top" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2041 +#. TRN To be shown in Print Settings "Top solid layers" +#: src/libslic3r/PrintConfig.cpp:2043 msgctxt "Layers" msgid "Top" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:473 +#: src/slic3r/GUI/MainFrame.cpp:522 msgid "Top View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:474 +#. TRN To be shown in the main menu View->Bottom +#: src/slic3r/GUI/MainFrame.cpp:524 msgid "Bottom" msgstr "" -#: src/libslic3r/PrintConfig.cpp:148 -msgid "Bottom" +#. TRN To be shown in Print Settings "Bottom solid layers" +#: rc/libslic3r/PrintConfig.cpp:149 msgctxt "Layers" +msgid "Bottom" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:474 +#: src/slic3r/GUI/MainFrame.cpp:524 msgid "Bottom View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:475 +#: src/slic3r/GUI/MainFrame.cpp:525 msgid "Front" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:475 +#: src/slic3r/GUI/MainFrame.cpp:525 msgid "Front View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:476 src/libslic3r/PrintConfig.cpp:1561 +#: src/slic3r/GUI/MainFrame.cpp:526 src/libslic3r/PrintConfig.cpp:1562 msgid "Rear" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:476 +#: src/slic3r/GUI/MainFrame.cpp:526 msgid "Rear View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:477 +#: src/slic3r/GUI/MainFrame.cpp:527 msgid "Left" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:477 +#: src/slic3r/GUI/MainFrame.cpp:527 msgid "Left View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:478 +#: src/slic3r/GUI/MainFrame.cpp:528 msgid "Right" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:478 +#: src/slic3r/GUI/MainFrame.cpp:528 msgid "Right View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:492 +#: src/slic3r/GUI/MainFrame.cpp:542 msgid "Prusa 3D &Drivers" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:492 +#: src/slic3r/GUI/MainFrame.cpp:542 msgid "Open the Prusa3D drivers download page in your browser" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:494 +#: src/slic3r/GUI/MainFrame.cpp:544 msgid "Prusa Edition &Releases" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:494 +#: src/slic3r/GUI/MainFrame.cpp:544 msgid "Open the Prusa Edition releases page in your browser" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:500 +#: src/slic3r/GUI/MainFrame.cpp:550 #, possible-c-format msgid "%s &Website" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:501 +#: src/slic3r/GUI/MainFrame.cpp:551 #, possible-c-format msgid "Open the %s website in your browser" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:503 +#: src/slic3r/GUI/MainFrame.cpp:553 #, possible-c-format msgid "%s &Manual" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:504 +#: src/slic3r/GUI/MainFrame.cpp:554 #, possible-c-format msgid "Open the %s manual in your browser" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:507 +#: src/slic3r/GUI/MainFrame.cpp:557 msgid "System &Info" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:507 +#: src/slic3r/GUI/MainFrame.cpp:557 msgid "Show system information" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:509 +#: src/slic3r/GUI/MainFrame.cpp:559 msgid "Show &Configuration Folder" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:509 +#: src/slic3r/GUI/MainFrame.cpp:559 msgid "Show user configuration folder (datadir)" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:511 +#: src/slic3r/GUI/MainFrame.cpp:561 msgid "Report an I&ssue" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:511 +#: src/slic3r/GUI/MainFrame.cpp:561 #, possible-c-format msgid "Report an issue on %s" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:513 +#: src/slic3r/GUI/MainFrame.cpp:563 #, possible-c-format msgid "&About %s" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:513 +#: src/slic3r/GUI/MainFrame.cpp:563 msgid "Show about dialog" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:516 +#: src/slic3r/GUI/MainFrame.cpp:566 msgid "Show the list of the keyboard shortcuts" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:524 +#: src/slic3r/GUI/MainFrame.cpp:574 msgid "&File" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:525 +#: src/slic3r/GUI/MainFrame.cpp:575 msgid "&Edit" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:526 +#: src/slic3r/GUI/MainFrame.cpp:576 msgid "&Window" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:527 +#: src/slic3r/GUI/MainFrame.cpp:577 msgid "&View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:530 +#: src/slic3r/GUI/MainFrame.cpp:580 msgid "&Help" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:558 +#: src/slic3r/GUI/MainFrame.cpp:602 src/slic3r/GUI/Plater.cpp:3821 +msgid "Export" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:604 +msgid "Mate&rial Settings Tab" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:621 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:572 +#: src/slic3r/GUI/MainFrame.cpp:635 msgid "No previously sliced file." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:573 src/slic3r/GUI/PrintHostDialogs.cpp:230 +#: src/slic3r/GUI/MainFrame.cpp:636 src/slic3r/GUI/PrintHostDialogs.cpp:230 msgid "Error" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:578 +#: src/slic3r/GUI/MainFrame.cpp:641 msgid "Previously sliced file (" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:578 +#: src/slic3r/GUI/MainFrame.cpp:641 msgid ") not found." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:579 +#: src/slic3r/GUI/MainFrame.cpp:642 msgid "File Not Found" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:614 src/slic3r/GUI/Tab.cpp:3239 +#: src/slic3r/GUI/MainFrame.cpp:677 src/slic3r/GUI/Tab.cpp:3239 msgid "Save " msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:614 +#: src/slic3r/GUI/MainFrame.cpp:677 msgid "SVG" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:614 +#: src/slic3r/GUI/MainFrame.cpp:677 msgid "G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:614 +#: src/slic3r/GUI/MainFrame.cpp:677 msgid " file as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:629 +#: src/slic3r/GUI/MainFrame.cpp:692 msgid "Save zip file as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:641 src/slic3r/GUI/Plater.cpp:2412 -#: src/slic3r/GUI/Plater.cpp:3542 src/slic3r/GUI/Tab.cpp:1159 +#: src/slic3r/GUI/MainFrame.cpp:704 src/slic3r/GUI/Plater.cpp:2412 +#: src/slic3r/GUI/Plater.cpp:3615 src/slic3r/GUI/Tab.cpp:1159 #: src/slic3r/GUI/Tab.cpp:3436 msgid "Slicing" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:641 +#: src/slic3r/GUI/MainFrame.cpp:704 msgid "Processing " msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:664 +#: src/slic3r/GUI/MainFrame.cpp:727 msgid " was successfully sliced." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:666 +#: src/slic3r/GUI/MainFrame.cpp:729 msgid "Slicing Done!" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:681 +#: src/slic3r/GUI/MainFrame.cpp:744 msgid "Select the STL file to repair:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:694 +#: src/slic3r/GUI/MainFrame.cpp:757 msgid "Save OBJ file (less prone to coordinate errors than STL) as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:709 +#: src/slic3r/GUI/MainFrame.cpp:772 msgid "Your file was repaired." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:709 src/libslic3r/PrintConfig.cpp:3056 +#: src/slic3r/GUI/MainFrame.cpp:772 src/libslic3r/PrintConfig.cpp:3058 msgid "Repair" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:723 +#: src/slic3r/GUI/MainFrame.cpp:786 msgid "Save configuration as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:743 src/slic3r/GUI/MainFrame.cpp:807 +#: src/slic3r/GUI/MainFrame.cpp:806 src/slic3r/GUI/MainFrame.cpp:870 msgid "Select configuration to load:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:780 +#: src/slic3r/GUI/MainFrame.cpp:843 msgid "Save presets bundle as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:831 +#: src/slic3r/GUI/MainFrame.cpp:894 #, possible-c-format msgid "%d presets successfully imported." msgstr "" @@ -2327,7 +2352,7 @@ msgstr "" msgid "Sliced Info" msgstr "" -#: src/slic3r/GUI/Plater.cpp:212 src/slic3r/GUI/Plater.cpp:1042 +#: src/slic3r/GUI/Plater.cpp:212 src/slic3r/GUI/Plater.cpp:1041 msgid "Used Filament (m)" msgstr "" @@ -2343,13 +2368,13 @@ msgstr "" msgid "Used Material (unit)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:216 src/slic3r/GUI/Plater.cpp:1057 -#: src/libslic3r/PrintConfig.cpp:716 +#: src/slic3r/GUI/Plater.cpp:216 src/slic3r/GUI/Plater.cpp:1056 +#: src/libslic3r/PrintConfig.cpp:717 msgid "Cost" msgstr "" -#: src/slic3r/GUI/Plater.cpp:217 src/slic3r/GUI/Plater.cpp:1029 -#: src/slic3r/GUI/Plater.cpp:1071 +#: src/slic3r/GUI/Plater.cpp:217 src/slic3r/GUI/Plater.cpp:1028 +#: src/slic3r/GUI/Plater.cpp:1070 msgid "Estimated printing time" msgstr "" @@ -2365,8 +2390,8 @@ msgstr "" msgid "Select what kind of support do you need" msgstr "" -#: src/slic3r/GUI/Plater.cpp:423 src/libslic3r/PrintConfig.cpp:1814 -#: src/libslic3r/PrintConfig.cpp:2421 +#: src/slic3r/GUI/Plater.cpp:423 src/libslic3r/PrintConfig.cpp:1815 +#: src/libslic3r/PrintConfig.cpp:2423 msgid "Support on build plate only" msgstr "" @@ -2409,12 +2434,12 @@ msgstr "" msgid "Printer" msgstr "" -#: src/slic3r/GUI/Plater.cpp:731 src/slic3r/GUI/Plater.cpp:3749 +#: src/slic3r/GUI/Plater.cpp:731 src/slic3r/GUI/Plater.cpp:3822 msgid "Send to printer" msgstr "" #: src/slic3r/GUI/Plater.cpp:734 src/slic3r/GUI/Plater.cpp:2412 -#: src/slic3r/GUI/Plater.cpp:3545 +#: src/slic3r/GUI/Plater.cpp:3618 msgid "Slice now" msgstr "" @@ -2422,52 +2447,52 @@ msgstr "" msgid "Hold Shift to Slice & Export G-code" msgstr "" -#: src/slic3r/GUI/Plater.cpp:975 +#: src/slic3r/GUI/Plater.cpp:974 #, possible-c-format msgid "%d (%d shells)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:980 +#: src/slic3r/GUI/Plater.cpp:979 #, possible-c-format msgid "Auto-repaired (%d errors)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:983 +#: src/slic3r/GUI/Plater.cpp:982 #, possible-c-format msgid "" "%d degenerate facets, %d edges fixed, %d facets removed, %d facets added, %d " "facets reversed, %d backwards edges" msgstr "" -#: src/slic3r/GUI/Plater.cpp:993 +#: src/slic3r/GUI/Plater.cpp:992 msgid "Yes" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1016 +#: src/slic3r/GUI/Plater.cpp:1015 msgid "Used Material (ml)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1019 +#: src/slic3r/GUI/Plater.cpp:1018 msgid "object(s)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1019 +#: src/slic3r/GUI/Plater.cpp:1018 msgid "supports and pad" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1044 src/slic3r/GUI/Plater.cpp:1059 +#: src/slic3r/GUI/Plater.cpp:1043 src/slic3r/GUI/Plater.cpp:1058 msgid "objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1044 src/slic3r/GUI/Plater.cpp:1059 +#: src/slic3r/GUI/Plater.cpp:1043 src/slic3r/GUI/Plater.cpp:1058 msgid "wipe tower" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1074 +#: src/slic3r/GUI/Plater.cpp:1073 msgid "normal mode" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1078 +#: src/slic3r/GUI/Plater.cpp:1077 msgid "silent mode" msgstr "" @@ -2672,77 +2697,81 @@ msgstr "" msgid "Mirror the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2964 +#: src/slic3r/GUI/Plater.cpp:2966 msgid "To objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2964 src/slic3r/GUI/Plater.cpp:2986 +#: src/slic3r/GUI/Plater.cpp:2966 src/slic3r/GUI/Plater.cpp:2988 msgid "Split the selected object into individual objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2966 +#: src/slic3r/GUI/Plater.cpp:2968 msgid "To parts" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2966 src/slic3r/GUI/Plater.cpp:3006 +#: src/slic3r/GUI/Plater.cpp:2968 src/slic3r/GUI/Plater.cpp:3008 msgid "Split the selected object into individual sub-parts" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2969 src/slic3r/GUI/Plater.cpp:2986 -#: src/slic3r/GUI/Plater.cpp:3006 src/libslic3r/PrintConfig.cpp:3080 +#: src/slic3r/GUI/Plater.cpp:2971 src/slic3r/GUI/Plater.cpp:2988 +#: src/slic3r/GUI/Plater.cpp:3008 src/libslic3r/PrintConfig.cpp:3082 msgid "Split" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2969 +#: src/slic3r/GUI/Plater.cpp:2971 msgid "Split the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2992 +#: src/slic3r/GUI/Plater.cpp:2994 msgid "Optimize orientation" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2992 +#: src/slic3r/GUI/Plater.cpp:2994 msgid "Optimize the rotation of the object for better print results." msgstr "" -#: src/slic3r/GUI/Plater.cpp:3417 +#: src/slic3r/GUI/Plater.cpp:3298 +msgid "All objects will be removed, continue ?" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3298 +msgid "Delete all" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3433 msgid "Save G-code file as:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3417 +#: src/slic3r/GUI/Plater.cpp:3433 msgid "Save SL1 file as:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3472 +#: src/slic3r/GUI/Plater.cpp:3545 #, possible-c-format msgid "STL file exported to %s" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3488 +#: src/slic3r/GUI/Plater.cpp:3561 #, possible-c-format msgid "AMF file exported to %s" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3491 +#: src/slic3r/GUI/Plater.cpp:3564 #, possible-c-format msgid "Error exporting AMF file %s" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3517 +#: src/slic3r/GUI/Plater.cpp:3590 #, possible-c-format msgid "3MF file exported to %s" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3520 +#: src/slic3r/GUI/Plater.cpp:3593 #, possible-c-format msgid "Error exporting 3MF file %s" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3748 -msgid "Export" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:3749 +#: src/slic3r/GUI/Plater.cpp:3822 msgid "Send G-code" msgstr "" @@ -2845,12 +2874,12 @@ msgstr "" #: src/slic3r/GUI/Preset.cpp:930 src/slic3r/GUI/Preset.cpp:970 #: src/slic3r/GUI/Preset.cpp:1035 src/slic3r/GUI/Preset.cpp:1067 -#: src/slic3r/GUI/PresetBundle.cpp:1478 src/slic3r/GUI/PresetBundle.cpp:1543 +#: src/slic3r/GUI/PresetBundle.cpp:1488 src/slic3r/GUI/PresetBundle.cpp:1553 msgid "System presets" msgstr "" #: src/slic3r/GUI/Preset.cpp:974 src/slic3r/GUI/Preset.cpp:1071 -#: src/slic3r/GUI/PresetBundle.cpp:1548 +#: src/slic3r/GUI/PresetBundle.cpp:1558 msgid "User presets" msgstr "" @@ -3038,10 +3067,10 @@ msgid "Time" msgstr "" #: src/slic3r/GUI/RammingChart.cpp:76 src/slic3r/GUI/RammingChart.cpp:81 -#: src/slic3r/GUI/WipeTowerDialog.cpp:82 src/libslic3r/PrintConfig.cpp:611 -#: src/libslic3r/PrintConfig.cpp:655 src/libslic3r/PrintConfig.cpp:670 -#: src/libslic3r/PrintConfig.cpp:2241 src/libslic3r/PrintConfig.cpp:2250 -#: src/libslic3r/PrintConfig.cpp:2310 src/libslic3r/PrintConfig.cpp:2317 +#: src/slic3r/GUI/WipeTowerDialog.cpp:82 src/libslic3r/PrintConfig.cpp:612 +#: src/libslic3r/PrintConfig.cpp:656 src/libslic3r/PrintConfig.cpp:671 +#: src/libslic3r/PrintConfig.cpp:2243 src/libslic3r/PrintConfig.cpp:2252 +#: src/libslic3r/PrintConfig.cpp:2312 src/libslic3r/PrintConfig.cpp:2319 msgid "s" msgstr "" @@ -3053,7 +3082,7 @@ msgstr "" msgid "System Information" msgstr "" -#: src/slic3r/GUI/Tab.cpp:50 src/libslic3r/PrintConfig.cpp:228 +#: src/slic3r/GUI/Tab.cpp:50 src/libslic3r/PrintConfig.cpp:229 msgid "Compatible printers" msgstr "" @@ -3061,7 +3090,7 @@ msgstr "" msgid "Select the printers this profile is compatible with." msgstr "" -#: src/slic3r/GUI/Tab.cpp:56 src/libslic3r/PrintConfig.cpp:243 +#: src/slic3r/GUI/Tab.cpp:56 src/libslic3r/PrintConfig.cpp:244 msgid "Compatible print profiles" msgstr "" @@ -3148,7 +3177,7 @@ msgstr "" msgid "Horizontal shells" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1014 src/libslic3r/PrintConfig.cpp:1709 +#: src/slic3r/GUI/Tab.cpp:1014 src/libslic3r/PrintConfig.cpp:1710 msgid "Solid layers" msgstr "" @@ -3232,7 +3261,7 @@ msgstr "" msgid "Output file" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1187 src/libslic3r/PrintConfig.cpp:1382 +#: src/slic3r/GUI/Tab.cpp:1187 src/libslic3r/PrintConfig.cpp:1383 msgid "Post-processing scripts" msgstr "" @@ -3332,8 +3361,8 @@ msgstr "" msgid "Cooling" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1490 src/libslic3r/PrintConfig.cpp:1285 -#: src/libslic3r/PrintConfig.cpp:2097 +#: src/slic3r/GUI/Tab.cpp:1490 src/libslic3r/PrintConfig.cpp:1286 +#: src/libslic3r/PrintConfig.cpp:2099 msgid "Enable" msgstr "" @@ -3370,17 +3399,17 @@ msgid "Custom G-code" msgstr "" #: src/slic3r/GUI/Tab.cpp:1564 src/slic3r/GUI/Tab.cpp:1949 -#: src/libslic3r/PrintConfig.cpp:1735 src/libslic3r/PrintConfig.cpp:1750 +#: src/libslic3r/PrintConfig.cpp:1736 src/libslic3r/PrintConfig.cpp:1751 msgid "Start G-code" msgstr "" #: src/slic3r/GUI/Tab.cpp:1570 src/slic3r/GUI/Tab.cpp:1955 -#: src/libslic3r/PrintConfig.cpp:358 src/libslic3r/PrintConfig.cpp:368 +#: src/libslic3r/PrintConfig.cpp:359 src/libslic3r/PrintConfig.cpp:369 msgid "End G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1681 src/slic3r/GUI/Tab.cpp:1737 -msgid " Browse " +#: src/slic3r/GUI/Tab.cpp:1681 +msgid "Browse" msgstr "" #: src/slic3r/GUI/Tab.cpp:1700 src/slic3r/GUI/Tab.cpp:1888 @@ -3401,6 +3430,10 @@ msgid "" "signed certificate." msgstr "" +#: src/slic3r/GUI/Tab.cpp:1737 +msgid " Browse " +msgstr "" + #: src/slic3r/GUI/Tab.cpp:1744 msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" msgstr "" @@ -3440,7 +3473,7 @@ msgstr "" msgid "USB/Serial connection" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1874 src/libslic3r/PrintConfig.cpp:1590 +#: src/slic3r/GUI/Tab.cpp:1874 src/libslic3r/PrintConfig.cpp:1591 msgid "Serial port" msgstr "" @@ -3464,11 +3497,11 @@ msgstr "" msgid "Before layer change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1967 src/libslic3r/PrintConfig.cpp:1030 +#: src/slic3r/GUI/Tab.cpp:1967 src/libslic3r/PrintConfig.cpp:1031 msgid "After layer change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1973 src/libslic3r/PrintConfig.cpp:2005 +#: src/slic3r/GUI/Tab.cpp:1973 src/libslic3r/PrintConfig.cpp:2006 msgid "Tool change G-code" msgstr "" @@ -3493,10 +3526,10 @@ msgid "Corrections" msgstr "" #: src/slic3r/GUI/Tab.cpp:2136 src/slic3r/GUI/Tab.cpp:2209 -#: src/libslic3r/PrintConfig.cpp:1076 src/libslic3r/PrintConfig.cpp:1086 -#: src/libslic3r/PrintConfig.cpp:1096 src/libslic3r/PrintConfig.cpp:1109 -#: src/libslic3r/PrintConfig.cpp:1120 src/libslic3r/PrintConfig.cpp:1131 -#: src/libslic3r/PrintConfig.cpp:1142 +#: src/libslic3r/PrintConfig.cpp:1077 src/libslic3r/PrintConfig.cpp:1087 +#: src/libslic3r/PrintConfig.cpp:1097 src/libslic3r/PrintConfig.cpp:1110 +#: src/libslic3r/PrintConfig.cpp:1121 src/libslic3r/PrintConfig.cpp:1132 +#: src/libslic3r/PrintConfig.cpp:1143 msgid "Machine limits" msgstr "" @@ -4013,12 +4046,21 @@ msgstr "" msgid "Show advanced settings" msgstr "" -#: src/slic3r/GUI/wxExtensions.cpp:2328 +#: src/slic3r/GUI/wxExtensions.cpp:358 +msgid "Instances" +msgstr "" + +#: src/slic3r/GUI/wxExtensions.cpp:365 +#, possible-c-format +msgid "Instance_%d" +msgstr "" + +#: src/slic3r/GUI/wxExtensions.cpp:2412 #, possible-c-format msgid "Switch to the %s mode" msgstr "" -#: src/slic3r/GUI/wxExtensions.cpp:2329 +#: src/slic3r/GUI/wxExtensions.cpp:2413 #, possible-c-format msgid "Current mode is %s" msgstr "" @@ -4406,11 +4448,27 @@ msgstr "" msgid "Layer height can't be greater than nozzle diameter" msgstr "" +#: src/libslic3r/Print.cpp:1476 +msgid "Infilling layers" +msgstr "" + +#: src/libslic3r/Print.cpp:1484 +msgid "Generating skirt" +msgstr "" + +#: src/libslic3r/Print.cpp:1492 +msgid "Generating brim" +msgstr "" + +#: src/libslic3r/Print.cpp:1517 +msgid "Exporting G-code" +msgstr "" + #: src/libslic3r/SLAPrint.cpp:55 msgid "Slicing model" msgstr "" -#: src/libslic3r/SLAPrint.cpp:56 src/libslic3r/SLAPrint.cpp:810 +#: src/libslic3r/SLAPrint.cpp:56 src/libslic3r/SLAPrint.cpp:809 msgid "Generating support points" msgstr "" @@ -4445,16 +4503,16 @@ msgid "Elevation is too low for object." msgstr "" #. TRN To be shown at the status bar on SLA slicing error. -#: src/libslic3r/SLAPrint.cpp:707 +#: src/libslic3r/SLAPrint.cpp:709 msgid "Slicing had to be stopped due to an internal error." msgstr "" -#: src/libslic3r/SLAPrint.cpp:858 src/libslic3r/SLAPrint.cpp:868 -#: src/libslic3r/SLAPrint.cpp:916 +#: src/libslic3r/SLAPrint.cpp:857 src/libslic3r/SLAPrint.cpp:867 +#: src/libslic3r/SLAPrint.cpp:915 msgid "Visualizing supports" msgstr "" -#: src/libslic3r/SLAPrint.cpp:1458 +#: src/libslic3r/SLAPrint.cpp:1459 msgid "Slicing done" msgstr "" @@ -4517,6 +4575,17 @@ msgid "" "the API Key or the password required for authentication." msgstr "" +#: src/libslic3r/PrintConfig.cpp:95 +msgid "HTTPS CA File" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:96 +msgid "" +"Custom CA certificate file can be specified for HTTPS OctoPrint connections, " +"in crt/pem format. If left blank, the default OS CA certificate repository " +"is used." +msgstr "" + #: src/libslic3r/PrintConfig.cpp:111 msgid "Avoid crossing perimeters" msgstr "" @@ -4528,7 +4597,7 @@ msgid "" "feature slows down both the print and the G-code generation." msgstr "" -#: src/libslic3r/PrintConfig.cpp:119 src/libslic3r/PrintConfig.cpp:1976 +#: src/libslic3r/PrintConfig.cpp:119 src/libslic3r/PrintConfig.cpp:1977 msgid "Other layers" msgstr "" @@ -4563,69 +4632,69 @@ msgid "" "S[first_layer_temperature]\" command wherever you want." msgstr "" -#: src/libslic3r/PrintConfig.cpp:150 +#: src/libslic3r/PrintConfig.cpp:151 msgid "Number of solid layers to generate on bottom surfaces." msgstr "" -#: src/libslic3r/PrintConfig.cpp:151 +#: src/libslic3r/PrintConfig.cpp:152 msgid "Bottom solid layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:156 +#: src/libslic3r/PrintConfig.cpp:157 msgid "Bridge" msgstr "" -#: src/libslic3r/PrintConfig.cpp:157 +#: src/libslic3r/PrintConfig.cpp:158 msgid "" "This is the acceleration your printer will use for bridges. Set zero to " "disable acceleration control for bridges." msgstr "" -#: src/libslic3r/PrintConfig.cpp:159 src/libslic3r/PrintConfig.cpp:302 -#: src/libslic3r/PrintConfig.cpp:814 src/libslic3r/PrintConfig.cpp:935 -#: src/libslic3r/PrintConfig.cpp:1088 src/libslic3r/PrintConfig.cpp:1133 -#: src/libslic3r/PrintConfig.cpp:1144 src/libslic3r/PrintConfig.cpp:1333 +#: src/libslic3r/PrintConfig.cpp:160 src/libslic3r/PrintConfig.cpp:303 +#: src/libslic3r/PrintConfig.cpp:815 src/libslic3r/PrintConfig.cpp:936 +#: src/libslic3r/PrintConfig.cpp:1089 src/libslic3r/PrintConfig.cpp:1134 +#: src/libslic3r/PrintConfig.cpp:1145 src/libslic3r/PrintConfig.cpp:1334 msgid "mm/s²" msgstr "" -#: src/libslic3r/PrintConfig.cpp:165 +#: src/libslic3r/PrintConfig.cpp:166 msgid "Bridging angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:167 +#: src/libslic3r/PrintConfig.cpp:168 msgid "" "Bridging angle override. If left to zero, the bridging angle will be " "calculated automatically. Otherwise the provided angle will be used for all " "bridges. Use 180° for zero angle." msgstr "" -#: src/libslic3r/PrintConfig.cpp:170 src/libslic3r/PrintConfig.cpp:732 -#: src/libslic3r/PrintConfig.cpp:1569 src/libslic3r/PrintConfig.cpp:1579 -#: src/libslic3r/PrintConfig.cpp:1807 src/libslic3r/PrintConfig.cpp:1961 -#: src/libslic3r/PrintConfig.cpp:2461 +#: src/libslic3r/PrintConfig.cpp:171 src/libslic3r/PrintConfig.cpp:733 +#: src/libslic3r/PrintConfig.cpp:1570 src/libslic3r/PrintConfig.cpp:1580 +#: src/libslic3r/PrintConfig.cpp:1808 src/libslic3r/PrintConfig.cpp:1962 +#: src/libslic3r/PrintConfig.cpp:2146 src/libslic3r/PrintConfig.cpp:2463 msgid "°" msgstr "" -#: src/libslic3r/PrintConfig.cpp:176 +#: src/libslic3r/PrintConfig.cpp:177 msgid "Bridges fan speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:177 +#: src/libslic3r/PrintConfig.cpp:178 msgid "This fan speed is enforced during all bridges and overhangs." msgstr "" -#: src/libslic3r/PrintConfig.cpp:178 src/libslic3r/PrintConfig.cpp:744 -#: src/libslic3r/PrintConfig.cpp:1153 src/libslic3r/PrintConfig.cpp:1216 -#: src/libslic3r/PrintConfig.cpp:1461 src/libslic3r/PrintConfig.cpp:2258 -#: src/libslic3r/PrintConfig.cpp:2500 +#: src/libslic3r/PrintConfig.cpp:179 src/libslic3r/PrintConfig.cpp:745 +#: src/libslic3r/PrintConfig.cpp:1154 src/libslic3r/PrintConfig.cpp:1217 +#: src/libslic3r/PrintConfig.cpp:1462 src/libslic3r/PrintConfig.cpp:2260 +#: src/libslic3r/PrintConfig.cpp:2502 msgid "%" msgstr "" -#: src/libslic3r/PrintConfig.cpp:185 +#: src/libslic3r/PrintConfig.cpp:186 msgid "Bridge flow ratio" msgstr "" -#: src/libslic3r/PrintConfig.cpp:187 +#: src/libslic3r/PrintConfig.cpp:188 msgid "" "This factor affects the amount of plastic for bridging. You can decrease it " "slightly to pull the extrudates and prevent sagging, although default " @@ -4633,83 +4702,83 @@ msgid "" "before tweaking this." msgstr "" -#: src/libslic3r/PrintConfig.cpp:197 +#: src/libslic3r/PrintConfig.cpp:198 msgid "Bridges" msgstr "" -#: src/libslic3r/PrintConfig.cpp:199 +#: src/libslic3r/PrintConfig.cpp:200 msgid "Speed for printing bridges." msgstr "" -#: src/libslic3r/PrintConfig.cpp:200 src/libslic3r/PrintConfig.cpp:576 -#: src/libslic3r/PrintConfig.cpp:584 src/libslic3r/PrintConfig.cpp:593 -#: src/libslic3r/PrintConfig.cpp:601 src/libslic3r/PrintConfig.cpp:628 -#: src/libslic3r/PrintConfig.cpp:647 src/libslic3r/PrintConfig.cpp:873 -#: src/libslic3r/PrintConfig.cpp:1000 src/libslic3r/PrintConfig.cpp:1078 -#: src/libslic3r/PrintConfig.cpp:1098 src/libslic3r/PrintConfig.cpp:1111 -#: src/libslic3r/PrintConfig.cpp:1122 src/libslic3r/PrintConfig.cpp:1175 -#: src/libslic3r/PrintConfig.cpp:1234 src/libslic3r/PrintConfig.cpp:1362 -#: src/libslic3r/PrintConfig.cpp:1536 src/libslic3r/PrintConfig.cpp:1545 -#: src/libslic3r/PrintConfig.cpp:1940 src/libslic3r/PrintConfig.cpp:2051 +#: src/libslic3r/PrintConfig.cpp:201 src/libslic3r/PrintConfig.cpp:577 +#: src/libslic3r/PrintConfig.cpp:585 src/libslic3r/PrintConfig.cpp:594 +#: src/libslic3r/PrintConfig.cpp:602 src/libslic3r/PrintConfig.cpp:629 +#: src/libslic3r/PrintConfig.cpp:648 src/libslic3r/PrintConfig.cpp:874 +#: src/libslic3r/PrintConfig.cpp:1001 src/libslic3r/PrintConfig.cpp:1079 +#: src/libslic3r/PrintConfig.cpp:1099 src/libslic3r/PrintConfig.cpp:1112 +#: src/libslic3r/PrintConfig.cpp:1123 src/libslic3r/PrintConfig.cpp:1176 +#: src/libslic3r/PrintConfig.cpp:1235 src/libslic3r/PrintConfig.cpp:1363 +#: src/libslic3r/PrintConfig.cpp:1537 src/libslic3r/PrintConfig.cpp:1546 +#: src/libslic3r/PrintConfig.cpp:1941 src/libslic3r/PrintConfig.cpp:2053 msgid "mm/s" msgstr "" -#: src/libslic3r/PrintConfig.cpp:207 +#: src/libslic3r/PrintConfig.cpp:208 msgid "Brim width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:208 +#: src/libslic3r/PrintConfig.cpp:209 msgid "" "Horizontal width of the brim that will be printed around each object on the " "first layer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:215 +#: src/libslic3r/PrintConfig.cpp:216 msgid "Clip multi-part objects" msgstr "" -#: src/libslic3r/PrintConfig.cpp:216 +#: src/libslic3r/PrintConfig.cpp:217 msgid "" "When printing multi-material objects, this settings will make Slic3r to clip " "the overlapping object parts one by the other (2nd part will be clipped by " "the 1st, 3rd part will be clipped by the 1st and 2nd etc)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:223 +#: src/libslic3r/PrintConfig.cpp:224 msgid "Colorprint height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:224 +#: src/libslic3r/PrintConfig.cpp:225 msgid "Heights at which a filament change is to occur. " msgstr "" -#: src/libslic3r/PrintConfig.cpp:234 +#: src/libslic3r/PrintConfig.cpp:235 msgid "Compatible printers condition" msgstr "" -#: src/libslic3r/PrintConfig.cpp:235 +#: src/libslic3r/PrintConfig.cpp:236 msgid "" "A boolean expression using the configuration values of an active printer " "profile. If this expression evaluates to true, this profile is considered " "compatible with the active printer profile." msgstr "" -#: src/libslic3r/PrintConfig.cpp:249 +#: src/libslic3r/PrintConfig.cpp:250 msgid "Compatible print profiles condition" msgstr "" -#: src/libslic3r/PrintConfig.cpp:250 +#: src/libslic3r/PrintConfig.cpp:251 msgid "" "A boolean expression using the configuration values of an active print " "profile. If this expression evaluates to true, this profile is considered " "compatible with the active print profile." msgstr "" -#: src/libslic3r/PrintConfig.cpp:267 +#: src/libslic3r/PrintConfig.cpp:268 msgid "Complete individual objects" msgstr "" -#: src/libslic3r/PrintConfig.cpp:268 +#: src/libslic3r/PrintConfig.cpp:269 msgid "" "When printing multiple objects or copies, this feature will complete each " "object before moving onto next one (and starting it from its bottom layer). " @@ -4717,114 +4786,114 @@ msgid "" "warn and prevent you from extruder collisions, but beware." msgstr "" -#: src/libslic3r/PrintConfig.cpp:276 +#: src/libslic3r/PrintConfig.cpp:277 msgid "Enable auto cooling" msgstr "" -#: src/libslic3r/PrintConfig.cpp:277 +#: src/libslic3r/PrintConfig.cpp:278 msgid "" "This flag enables the automatic cooling logic that adjusts print speed and " "fan speed according to layer printing time." msgstr "" -#: src/libslic3r/PrintConfig.cpp:282 +#: src/libslic3r/PrintConfig.cpp:283 msgid "Cooling tube position" msgstr "" -#: src/libslic3r/PrintConfig.cpp:283 +#: src/libslic3r/PrintConfig.cpp:284 msgid "Distance of the center-point of the cooling tube from the extruder tip " msgstr "" -#: src/libslic3r/PrintConfig.cpp:290 +#: src/libslic3r/PrintConfig.cpp:291 msgid "Cooling tube length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:291 +#: src/libslic3r/PrintConfig.cpp:292 msgid "Length of the cooling tube to limit space for cooling moves inside it " msgstr "" -#: src/libslic3r/PrintConfig.cpp:299 +#: src/libslic3r/PrintConfig.cpp:300 msgid "" "This is the acceleration your printer will be reset to after the role-" "specific acceleration values are used (perimeter/infill). Set zero to " "prevent resetting acceleration at all." msgstr "" -#: src/libslic3r/PrintConfig.cpp:308 +#: src/libslic3r/PrintConfig.cpp:309 msgid "Default filament profile" msgstr "" -#: src/libslic3r/PrintConfig.cpp:309 +#: src/libslic3r/PrintConfig.cpp:310 msgid "" "Default filament profile associated with the current printer profile. On " "selection of the current printer profile, this filament profile will be " "activated." msgstr "" -#: src/libslic3r/PrintConfig.cpp:315 +#: src/libslic3r/PrintConfig.cpp:316 msgid "Default print profile" msgstr "" -#: src/libslic3r/PrintConfig.cpp:316 src/libslic3r/PrintConfig.cpp:2339 -#: src/libslic3r/PrintConfig.cpp:2350 +#: src/libslic3r/PrintConfig.cpp:317 src/libslic3r/PrintConfig.cpp:2341 +#: src/libslic3r/PrintConfig.cpp:2352 msgid "" "Default print profile associated with the current printer profile. On " "selection of the current printer profile, this print profile will be " "activated." msgstr "" -#: src/libslic3r/PrintConfig.cpp:322 +#: src/libslic3r/PrintConfig.cpp:323 msgid "Disable fan for the first" msgstr "" -#: src/libslic3r/PrintConfig.cpp:323 +#: src/libslic3r/PrintConfig.cpp:324 msgid "" "You can set this to a positive value to disable fan at all during the first " "layers, so that it does not make adhesion worse." msgstr "" -#: src/libslic3r/PrintConfig.cpp:325 src/libslic3r/PrintConfig.cpp:945 -#: src/libslic3r/PrintConfig.cpp:1434 src/libslic3r/PrintConfig.cpp:1619 -#: src/libslic3r/PrintConfig.cpp:1680 src/libslic3r/PrintConfig.cpp:1843 -#: src/libslic3r/PrintConfig.cpp:1888 +#: src/libslic3r/PrintConfig.cpp:326 src/libslic3r/PrintConfig.cpp:946 +#: src/libslic3r/PrintConfig.cpp:1435 src/libslic3r/PrintConfig.cpp:1620 +#: src/libslic3r/PrintConfig.cpp:1681 src/libslic3r/PrintConfig.cpp:1844 +#: src/libslic3r/PrintConfig.cpp:1889 msgid "layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:332 +#: src/libslic3r/PrintConfig.cpp:333 msgid "Don't support bridges" msgstr "" -#: src/libslic3r/PrintConfig.cpp:334 +#: src/libslic3r/PrintConfig.cpp:335 msgid "" "Experimental option for preventing support material from being generated " "under bridged areas." msgstr "" -#: src/libslic3r/PrintConfig.cpp:340 +#: src/libslic3r/PrintConfig.cpp:341 msgid "Distance between copies" msgstr "" -#: src/libslic3r/PrintConfig.cpp:341 +#: src/libslic3r/PrintConfig.cpp:342 msgid "Distance used for the auto-arrange feature of the plater." msgstr "" -#: src/libslic3r/PrintConfig.cpp:348 +#: src/libslic3r/PrintConfig.cpp:349 msgid "Elephant foot compensation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:350 +#: src/libslic3r/PrintConfig.cpp:351 msgid "" "The first layer will be shrunk in the XY plane by the configured value to " "compensate for the 1st layer squish aka an Elephant Foot effect." msgstr "" -#: src/libslic3r/PrintConfig.cpp:359 +#: src/libslic3r/PrintConfig.cpp:360 msgid "" "This end procedure is inserted at the end of the output file. Note that you " "can use placeholder variables for all Slic3r settings." msgstr "" -#: src/libslic3r/PrintConfig.cpp:369 +#: src/libslic3r/PrintConfig.cpp:370 msgid "" "This end procedure is inserted at the end of the output file, before the " "printer end gcode. Note that you can use placeholder variables for all " @@ -4832,62 +4901,62 @@ msgid "" "extruder order." msgstr "" -#: src/libslic3r/PrintConfig.cpp:379 +#: src/libslic3r/PrintConfig.cpp:380 msgid "Ensure vertical shell thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:381 +#: src/libslic3r/PrintConfig.cpp:382 msgid "" "Add solid infill near sloping surfaces to guarantee the vertical shell " "thickness (top+bottom solid layers)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:387 +#: src/libslic3r/PrintConfig.cpp:388 msgid "Top fill pattern" msgstr "" -#: src/libslic3r/PrintConfig.cpp:389 +#: src/libslic3r/PrintConfig.cpp:390 msgid "" "Fill pattern for top infill. This only affects the top visible layer, and " "not its adjacent solid shells." msgstr "" -#: src/libslic3r/PrintConfig.cpp:397 src/libslic3r/PrintConfig.cpp:795 -#: src/libslic3r/PrintConfig.cpp:1921 +#: src/libslic3r/PrintConfig.cpp:398 src/libslic3r/PrintConfig.cpp:796 +#: src/libslic3r/PrintConfig.cpp:1922 msgid "Rectilinear" msgstr "" -#: src/libslic3r/PrintConfig.cpp:398 src/libslic3r/PrintConfig.cpp:801 +#: src/libslic3r/PrintConfig.cpp:399 src/libslic3r/PrintConfig.cpp:802 msgid "Concentric" msgstr "" -#: src/libslic3r/PrintConfig.cpp:399 src/libslic3r/PrintConfig.cpp:805 +#: src/libslic3r/PrintConfig.cpp:400 src/libslic3r/PrintConfig.cpp:806 msgid "Hilbert Curve" msgstr "" -#: src/libslic3r/PrintConfig.cpp:400 src/libslic3r/PrintConfig.cpp:806 +#: src/libslic3r/PrintConfig.cpp:401 src/libslic3r/PrintConfig.cpp:807 msgid "Archimedean Chords" msgstr "" -#: src/libslic3r/PrintConfig.cpp:401 src/libslic3r/PrintConfig.cpp:807 +#: src/libslic3r/PrintConfig.cpp:402 src/libslic3r/PrintConfig.cpp:808 msgid "Octagram Spiral" msgstr "" -#: src/libslic3r/PrintConfig.cpp:408 +#: src/libslic3r/PrintConfig.cpp:409 msgid "Bottom fill pattern" msgstr "" -#: src/libslic3r/PrintConfig.cpp:409 +#: src/libslic3r/PrintConfig.cpp:410 msgid "" "Fill pattern for bottom infill. This only affects the bottom external " "visible layer, and not its adjacent solid shells." msgstr "" -#: src/libslic3r/PrintConfig.cpp:414 src/libslic3r/PrintConfig.cpp:424 +#: src/libslic3r/PrintConfig.cpp:415 src/libslic3r/PrintConfig.cpp:425 msgid "External perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:416 +#: src/libslic3r/PrintConfig.cpp:417 msgid "" "Set this to a non-zero value to set a manual extrusion width for external " "perimeters. If left zero, default extrusion width will be used if set, " @@ -4895,41 +4964,41 @@ msgid "" "(for example 200%), it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:419 src/libslic3r/PrintConfig.cpp:834 -#: src/libslic3r/PrintConfig.cpp:966 src/libslic3r/PrintConfig.cpp:1353 -#: src/libslic3r/PrintConfig.cpp:1691 src/libslic3r/PrintConfig.cpp:1864 -#: src/libslic3r/PrintConfig.cpp:2022 +#: src/libslic3r/PrintConfig.cpp:420 src/libslic3r/PrintConfig.cpp:835 +#: src/libslic3r/PrintConfig.cpp:967 src/libslic3r/PrintConfig.cpp:1354 +#: src/libslic3r/PrintConfig.cpp:1692 src/libslic3r/PrintConfig.cpp:1865 +#: src/libslic3r/PrintConfig.cpp:2023 msgid "mm or % (leave 0 for default)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:426 +#: src/libslic3r/PrintConfig.cpp:427 msgid "" "This separate setting will affect the speed of external perimeters (the " "visible ones). If expressed as percentage (for example: 80%) it will be " "calculated on the perimeters speed setting above. Set to zero for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:429 src/libslic3r/PrintConfig.cpp:855 -#: src/libslic3r/PrintConfig.cpp:1650 src/libslic3r/PrintConfig.cpp:1701 -#: src/libslic3r/PrintConfig.cpp:1907 src/libslic3r/PrintConfig.cpp:2034 +#: src/libslic3r/PrintConfig.cpp:430 src/libslic3r/PrintConfig.cpp:856 +#: src/libslic3r/PrintConfig.cpp:1651 src/libslic3r/PrintConfig.cpp:1702 +#: src/libslic3r/PrintConfig.cpp:1908 src/libslic3r/PrintConfig.cpp:2035 msgid "mm/s or %" msgstr "" -#: src/libslic3r/PrintConfig.cpp:436 +#: src/libslic3r/PrintConfig.cpp:437 msgid "External perimeters first" msgstr "" -#: src/libslic3r/PrintConfig.cpp:438 +#: src/libslic3r/PrintConfig.cpp:439 msgid "" "Print contour perimeters from the outermost one to the innermost one instead " "of the default inverse order." msgstr "" -#: src/libslic3r/PrintConfig.cpp:444 +#: src/libslic3r/PrintConfig.cpp:445 msgid "Extra perimeters if needed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:446 +#: src/libslic3r/PrintConfig.cpp:447 #, no-c-format msgid "" "Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r " @@ -4937,14 +5006,14 @@ msgid "" "is supported." msgstr "" -#: src/libslic3r/PrintConfig.cpp:456 +#: src/libslic3r/PrintConfig.cpp:457 msgid "" "The extruder to use (unless more specific extruder settings are specified). " "This value overrides perimeter and infill extruders, but not the support " "extruders." msgstr "" -#: src/libslic3r/PrintConfig.cpp:468 +#: src/libslic3r/PrintConfig.cpp:469 msgid "" "Set this to the vertical distance between your nozzle tip and (usually) the " "X carriage rods. In other words, this is the height of the clearance " @@ -4952,30 +5021,30 @@ msgid "" "extruder can peek before colliding with other printed objects." msgstr "" -#: src/libslic3r/PrintConfig.cpp:478 +#: src/libslic3r/PrintConfig.cpp:479 msgid "Radius" msgstr "" -#: src/libslic3r/PrintConfig.cpp:479 +#: src/libslic3r/PrintConfig.cpp:480 msgid "" "Set this to the clearance radius around your extruder. If the extruder is " "not centered, choose the largest value for safety. This setting is used to " "check for collisions and to display the graphical preview in the plater." msgstr "" -#: src/libslic3r/PrintConfig.cpp:489 +#: src/libslic3r/PrintConfig.cpp:490 msgid "Extruder Color" msgstr "" -#: src/libslic3r/PrintConfig.cpp:490 src/libslic3r/PrintConfig.cpp:550 +#: src/libslic3r/PrintConfig.cpp:491 src/libslic3r/PrintConfig.cpp:551 msgid "This is only used in the Slic3r interface as a visual help." msgstr "" -#: src/libslic3r/PrintConfig.cpp:496 +#: src/libslic3r/PrintConfig.cpp:497 msgid "Extruder offset" msgstr "" -#: src/libslic3r/PrintConfig.cpp:497 +#: src/libslic3r/PrintConfig.cpp:498 msgid "" "If your firmware doesn't handle the extruder displacement you need the G-" "code to take it into account. This option lets you specify the displacement " @@ -4983,21 +5052,21 @@ msgid "" "coordinates (they will be subtracted from the XY coordinate)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:506 +#: src/libslic3r/PrintConfig.cpp:507 msgid "Extrusion axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:507 +#: src/libslic3r/PrintConfig.cpp:508 msgid "" "Use this option to set the axis letter associated to your printer's extruder " "(usually E but some printers use A)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:512 +#: src/libslic3r/PrintConfig.cpp:513 msgid "Extrusion multiplier" msgstr "" -#: src/libslic3r/PrintConfig.cpp:513 +#: src/libslic3r/PrintConfig.cpp:514 msgid "" "This factor changes the amount of flow proportionally. You may need to tweak " "this setting to get nice surface finish and correct single wall widths. " @@ -5005,11 +5074,11 @@ msgid "" "more, check filament diameter and your firmware E steps." msgstr "" -#: src/libslic3r/PrintConfig.cpp:521 +#: src/libslic3r/PrintConfig.cpp:522 msgid "Default extrusion width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:523 +#: src/libslic3r/PrintConfig.cpp:524 msgid "" "Set this to a non-zero value to allow a manual extrusion width. If left to " "zero, Slic3r derives extrusion widths from the nozzle diameter (see the " @@ -5018,131 +5087,131 @@ msgid "" "height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:527 +#: src/libslic3r/PrintConfig.cpp:528 msgid "mm or % (leave 0 for auto)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:532 +#: src/libslic3r/PrintConfig.cpp:533 msgid "Keep fan always on" msgstr "" -#: src/libslic3r/PrintConfig.cpp:533 +#: src/libslic3r/PrintConfig.cpp:534 msgid "" "If this is enabled, fan will never be disabled and will be kept running at " "least at its minimum speed. Useful for PLA, harmful for ABS." msgstr "" -#: src/libslic3r/PrintConfig.cpp:538 +#: src/libslic3r/PrintConfig.cpp:539 msgid "Enable fan if layer print time is below" msgstr "" -#: src/libslic3r/PrintConfig.cpp:539 +#: src/libslic3r/PrintConfig.cpp:540 msgid "" "If layer print time is estimated below this number of seconds, fan will be " "enabled and its speed will be calculated by interpolating the minimum and " "maximum speeds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:541 src/libslic3r/PrintConfig.cpp:1637 +#: src/libslic3r/PrintConfig.cpp:542 src/libslic3r/PrintConfig.cpp:1638 msgid "approximate seconds" msgstr "" -#: src/libslic3r/PrintConfig.cpp:549 +#: src/libslic3r/PrintConfig.cpp:550 msgid "Color" msgstr "" -#: src/libslic3r/PrintConfig.cpp:555 +#: src/libslic3r/PrintConfig.cpp:556 msgid "Filament notes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:556 +#: src/libslic3r/PrintConfig.cpp:557 msgid "You can put your notes regarding the filament here." msgstr "" -#: src/libslic3r/PrintConfig.cpp:564 src/libslic3r/PrintConfig.cpp:1181 +#: src/libslic3r/PrintConfig.cpp:565 src/libslic3r/PrintConfig.cpp:1182 msgid "Max volumetric speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:565 +#: src/libslic3r/PrintConfig.cpp:566 msgid "" "Maximum volumetric speed allowed for this filament. Limits the maximum " "volumetric speed of a print to the minimum of print and filament volumetric " "speed. Set to zero for no limit." msgstr "" -#: src/libslic3r/PrintConfig.cpp:568 src/libslic3r/PrintConfig.cpp:1184 +#: src/libslic3r/PrintConfig.cpp:569 src/libslic3r/PrintConfig.cpp:1185 msgid "mm³/s" msgstr "" -#: src/libslic3r/PrintConfig.cpp:574 +#: src/libslic3r/PrintConfig.cpp:575 msgid "Loading speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:575 +#: src/libslic3r/PrintConfig.cpp:576 msgid "Speed used for loading the filament on the wipe tower. " msgstr "" -#: src/libslic3r/PrintConfig.cpp:582 +#: src/libslic3r/PrintConfig.cpp:583 msgid "Loading speed at the start" msgstr "" -#: src/libslic3r/PrintConfig.cpp:583 +#: src/libslic3r/PrintConfig.cpp:584 msgid "Speed used at the very beginning of loading phase. " msgstr "" -#: src/libslic3r/PrintConfig.cpp:590 +#: src/libslic3r/PrintConfig.cpp:591 msgid "Unloading speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:591 +#: src/libslic3r/PrintConfig.cpp:592 msgid "" "Speed used for unloading the filament on the wipe tower (does not affect " "initial part of unloading just after ramming). " msgstr "" -#: src/libslic3r/PrintConfig.cpp:599 +#: src/libslic3r/PrintConfig.cpp:600 msgid "Unloading speed at the start" msgstr "" -#: src/libslic3r/PrintConfig.cpp:600 +#: src/libslic3r/PrintConfig.cpp:601 msgid "" "Speed used for unloading the tip of the filament immediately after ramming. " msgstr "" -#: src/libslic3r/PrintConfig.cpp:607 +#: src/libslic3r/PrintConfig.cpp:608 msgid "Delay after unloading" msgstr "" -#: src/libslic3r/PrintConfig.cpp:608 +#: src/libslic3r/PrintConfig.cpp:609 msgid "" "Time to wait after the filament is unloaded. May help to get reliable " "toolchanges with flexible materials that may need more time to shrink to " "original dimensions. " msgstr "" -#: src/libslic3r/PrintConfig.cpp:617 +#: src/libslic3r/PrintConfig.cpp:618 msgid "Number of cooling moves" msgstr "" -#: src/libslic3r/PrintConfig.cpp:618 +#: src/libslic3r/PrintConfig.cpp:619 msgid "" "Filament is cooled by being moved back and forth in the cooling tubes. " "Specify desired number of these moves " msgstr "" -#: src/libslic3r/PrintConfig.cpp:626 +#: src/libslic3r/PrintConfig.cpp:627 msgid "Speed of the first cooling move" msgstr "" -#: src/libslic3r/PrintConfig.cpp:627 +#: src/libslic3r/PrintConfig.cpp:628 msgid "Cooling moves are gradually accelerating beginning at this speed. " msgstr "" -#: src/libslic3r/PrintConfig.cpp:634 +#: src/libslic3r/PrintConfig.cpp:635 msgid "Minimal purge on wipe tower" msgstr "" -#: src/libslic3r/PrintConfig.cpp:635 +#: src/libslic3r/PrintConfig.cpp:636 msgid "" "After a tool change, the exact position of the newly loaded filament inside " "the nozzle may not be known, and the filament pressure is likely not yet " @@ -5151,62 +5220,62 @@ msgid "" "to produce successive infill or sacrificial object extrusions reliably." msgstr "" -#: src/libslic3r/PrintConfig.cpp:639 +#: src/libslic3r/PrintConfig.cpp:640 msgid "mm³" msgstr "" -#: src/libslic3r/PrintConfig.cpp:645 +#: src/libslic3r/PrintConfig.cpp:646 msgid "Speed of the last cooling move" msgstr "" -#: src/libslic3r/PrintConfig.cpp:646 +#: src/libslic3r/PrintConfig.cpp:647 msgid "Cooling moves are gradually accelerating towards this speed. " msgstr "" -#: src/libslic3r/PrintConfig.cpp:653 +#: src/libslic3r/PrintConfig.cpp:654 msgid "Filament load time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:654 +#: src/libslic3r/PrintConfig.cpp:655 msgid "" "Time for the printer firmware (or the Multi Material Unit 2.0) to load a new " "filament during a tool change (when executing the T code). This time is " "added to the total print time by the G-code time estimator." msgstr "" -#: src/libslic3r/PrintConfig.cpp:661 +#: src/libslic3r/PrintConfig.cpp:662 msgid "Ramming parameters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:662 +#: src/libslic3r/PrintConfig.cpp:663 msgid "" "This string is edited by RammingDialog and contains ramming specific " "parameters " msgstr "" -#: src/libslic3r/PrintConfig.cpp:668 +#: src/libslic3r/PrintConfig.cpp:669 msgid "Filament unload time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:669 +#: src/libslic3r/PrintConfig.cpp:670 msgid "" "Time for the printer firmware (or the Multi Material Unit 2.0) to unload a " "filament during a tool change (when executing the T code). This time is " "added to the total print time by the G-code time estimator." msgstr "" -#: src/libslic3r/PrintConfig.cpp:677 +#: src/libslic3r/PrintConfig.cpp:678 msgid "" "Enter your filament diameter here. Good precision is required, so use a " "caliper and do multiple measurements along the filament, then compute the " "average." msgstr "" -#: src/libslic3r/PrintConfig.cpp:684 +#: src/libslic3r/PrintConfig.cpp:685 msgid "Density" msgstr "" -#: src/libslic3r/PrintConfig.cpp:685 +#: src/libslic3r/PrintConfig.cpp:686 msgid "" "Enter your filament density here. This is only for statistical information. " "A decent way is to weigh a known length of filament and compute the ratio of " @@ -5214,113 +5283,113 @@ msgid "" "displacement." msgstr "" -#: src/libslic3r/PrintConfig.cpp:688 +#: src/libslic3r/PrintConfig.cpp:689 msgid "g/cm³" msgstr "" -#: src/libslic3r/PrintConfig.cpp:693 +#: src/libslic3r/PrintConfig.cpp:694 msgid "Filament type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:694 +#: src/libslic3r/PrintConfig.cpp:695 msgid "The filament material type for use in custom G-codes." msgstr "" -#: src/libslic3r/PrintConfig.cpp:710 +#: src/libslic3r/PrintConfig.cpp:711 msgid "Soluble material" msgstr "" -#: src/libslic3r/PrintConfig.cpp:711 +#: src/libslic3r/PrintConfig.cpp:712 msgid "Soluble material is most likely used for a soluble support." msgstr "" -#: src/libslic3r/PrintConfig.cpp:717 +#: src/libslic3r/PrintConfig.cpp:718 msgid "" "Enter your filament cost per kg here. This is only for statistical " "information." msgstr "" -#: src/libslic3r/PrintConfig.cpp:718 +#: src/libslic3r/PrintConfig.cpp:719 msgid "money/kg" msgstr "" -#: src/libslic3r/PrintConfig.cpp:727 +#: src/libslic3r/PrintConfig.cpp:728 msgid "Fill angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:729 +#: src/libslic3r/PrintConfig.cpp:730 msgid "" "Default base angle for infill orientation. Cross-hatching will be applied to " "this. Bridges will be infilled using the best direction Slic3r can detect, " "so this setting does not affect them." msgstr "" -#: src/libslic3r/PrintConfig.cpp:741 +#: src/libslic3r/PrintConfig.cpp:742 msgid "Fill density" msgstr "" -#: src/libslic3r/PrintConfig.cpp:743 +#: src/libslic3r/PrintConfig.cpp:744 msgid "Density of internal infill, expressed in the range 0% - 100%." msgstr "" -#: src/libslic3r/PrintConfig.cpp:778 +#: src/libslic3r/PrintConfig.cpp:779 msgid "Fill pattern" msgstr "" -#: src/libslic3r/PrintConfig.cpp:780 +#: src/libslic3r/PrintConfig.cpp:781 msgid "Fill pattern for general low-density infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:796 +#: src/libslic3r/PrintConfig.cpp:797 msgid "Grid" msgstr "" -#: src/libslic3r/PrintConfig.cpp:797 +#: src/libslic3r/PrintConfig.cpp:798 msgid "Triangles" msgstr "" -#: src/libslic3r/PrintConfig.cpp:798 +#: src/libslic3r/PrintConfig.cpp:799 msgid "Stars" msgstr "" -#: src/libslic3r/PrintConfig.cpp:799 +#: src/libslic3r/PrintConfig.cpp:800 msgid "Cubic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:800 +#: src/libslic3r/PrintConfig.cpp:801 msgid "Line" msgstr "" -#: src/libslic3r/PrintConfig.cpp:802 src/libslic3r/PrintConfig.cpp:1923 +#: src/libslic3r/PrintConfig.cpp:803 src/libslic3r/PrintConfig.cpp:1924 msgid "Honeycomb" msgstr "" -#: src/libslic3r/PrintConfig.cpp:803 +#: src/libslic3r/PrintConfig.cpp:804 msgid "3D Honeycomb" msgstr "" -#: src/libslic3r/PrintConfig.cpp:804 +#: src/libslic3r/PrintConfig.cpp:805 msgid "Gyroid" msgstr "" -#: src/libslic3r/PrintConfig.cpp:811 src/libslic3r/PrintConfig.cpp:820 -#: src/libslic3r/PrintConfig.cpp:828 src/libslic3r/PrintConfig.cpp:861 +#: src/libslic3r/PrintConfig.cpp:812 src/libslic3r/PrintConfig.cpp:821 +#: src/libslic3r/PrintConfig.cpp:829 src/libslic3r/PrintConfig.cpp:862 msgid "First layer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:812 +#: src/libslic3r/PrintConfig.cpp:813 msgid "" "This is the acceleration your printer will use for first layer. Set zero to " "disable acceleration control for first layer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:821 +#: src/libslic3r/PrintConfig.cpp:822 msgid "" "Heated build plate temperature for the first layer. Set this to zero to " "disable bed temperature control commands in the output." msgstr "" -#: src/libslic3r/PrintConfig.cpp:830 +#: src/libslic3r/PrintConfig.cpp:831 msgid "" "Set this to a non-zero value to set a manual extrusion width for first " "layer. You can use this to force fatter extrudates for better adhesion. If " @@ -5328,11 +5397,11 @@ msgid "" "layer height. If set to zero, it will use the default extrusion width." msgstr "" -#: src/libslic3r/PrintConfig.cpp:840 +#: src/libslic3r/PrintConfig.cpp:841 msgid "First layer height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:842 +#: src/libslic3r/PrintConfig.cpp:843 msgid "" "When printing with very low layer heights, you might still want to print a " "thicker bottom layer to improve adhesion and tolerance for non perfect build " @@ -5340,52 +5409,52 @@ msgid "" "example: 150%) over the default layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:846 src/libslic3r/PrintConfig.cpp:991 -#: src/libslic3r/PrintConfig.cpp:1796 +#: src/libslic3r/PrintConfig.cpp:847 src/libslic3r/PrintConfig.cpp:992 +#: src/libslic3r/PrintConfig.cpp:1797 msgid "mm or %" msgstr "" -#: src/libslic3r/PrintConfig.cpp:851 +#: src/libslic3r/PrintConfig.cpp:852 msgid "First layer speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:852 +#: src/libslic3r/PrintConfig.cpp:853 msgid "" "If expressed as absolute value in mm/s, this speed will be applied to all " "the print moves of the first layer, regardless of their type. If expressed " "as a percentage (for example: 40%) it will scale the default speeds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:862 +#: src/libslic3r/PrintConfig.cpp:863 msgid "" "Extruder temperature for first layer. If you want to control temperature " "manually during print, set this to zero to disable temperature control " "commands in the output file." msgstr "" -#: src/libslic3r/PrintConfig.cpp:871 +#: src/libslic3r/PrintConfig.cpp:872 msgid "" "Speed for filling small gaps using short zigzag moves. Keep this reasonably " "low to avoid too much shaking and resonance issues. Set zero to disable gaps " "filling." msgstr "" -#: src/libslic3r/PrintConfig.cpp:879 +#: src/libslic3r/PrintConfig.cpp:880 msgid "Verbose G-code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:880 +#: src/libslic3r/PrintConfig.cpp:881 msgid "" "Enable this to get a commented G-code file, with each line explained by a " "descriptive text. If you print from SD card, the additional weight of the " "file could make your firmware slow down." msgstr "" -#: src/libslic3r/PrintConfig.cpp:887 +#: src/libslic3r/PrintConfig.cpp:888 msgid "G-code flavor" msgstr "" -#: src/libslic3r/PrintConfig.cpp:888 +#: src/libslic3r/PrintConfig.cpp:889 msgid "" "Some G/M-code commands, including temperature control and others, are not " "universal. Set this option to your printer's firmware to get a compatible " @@ -5393,50 +5462,62 @@ msgid "" "extrusion value at all." msgstr "" -#: src/libslic3r/PrintConfig.cpp:911 +#: src/libslic3r/PrintConfig.cpp:912 msgid "No extrusion" msgstr "" -#: src/libslic3r/PrintConfig.cpp:924 -msgid "High extruder current on filament swap" +#: src/libslic3r/PrintConfig.cpp:917 +msgid "Label objects" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:918 +msgid "" +"Enable this to add comments into the G-Code labeling print moves with what " +"object they belong to, which is useful for the Octoprint CancelObject " +"plugin. This settings is NOT compatible with Single Extruder Multi Material " +"setup and Wipe into Object / Wipe into Infill." msgstr "" #: src/libslic3r/PrintConfig.cpp:925 +msgid "High extruder current on filament swap" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:926 msgid "" "It may be beneficial to increase the extruder motor current during the " "filament exchange sequence to allow for rapid ramming feed rates and to " "overcome resistance when loading a filament with an ugly shaped tip." msgstr "" -#: src/libslic3r/PrintConfig.cpp:933 +#: src/libslic3r/PrintConfig.cpp:934 msgid "" "This is the acceleration your printer will use for infill. Set zero to " "disable acceleration control for infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:941 +#: src/libslic3r/PrintConfig.cpp:942 msgid "Combine infill every" msgstr "" -#: src/libslic3r/PrintConfig.cpp:943 +#: src/libslic3r/PrintConfig.cpp:944 msgid "" "This feature allows to combine infill and speed up your print by extruding " "thicker infill layers while preserving thin perimeters, thus accuracy." msgstr "" -#: src/libslic3r/PrintConfig.cpp:946 +#: src/libslic3r/PrintConfig.cpp:947 msgid "Combine infill every n layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:952 +#: src/libslic3r/PrintConfig.cpp:953 msgid "Infill extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:954 +#: src/libslic3r/PrintConfig.cpp:955 msgid "The extruder to use when printing infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:962 +#: src/libslic3r/PrintConfig.cpp:963 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill. If " "left zero, default extrusion width will be used if set, otherwise 1.125 x " @@ -5445,32 +5526,32 @@ msgid "" "example 90%) it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:971 +#: src/libslic3r/PrintConfig.cpp:972 msgid "Infill before perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:972 +#: src/libslic3r/PrintConfig.cpp:973 msgid "" "This option will switch the print order of perimeters and infill, making the " "latter first." msgstr "" -#: src/libslic3r/PrintConfig.cpp:977 +#: src/libslic3r/PrintConfig.cpp:978 msgid "Only infill where needed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:979 +#: src/libslic3r/PrintConfig.cpp:980 msgid "" "This option will limit infill to the areas actually needed for supporting " "ceilings (it will act as internal support material). If enabled, slows down " "the G-code generation due to the multiple checks involved." msgstr "" -#: src/libslic3r/PrintConfig.cpp:986 +#: src/libslic3r/PrintConfig.cpp:987 msgid "Infill/perimeters overlap" msgstr "" -#: src/libslic3r/PrintConfig.cpp:988 +#: src/libslic3r/PrintConfig.cpp:989 msgid "" "This setting applies an additional overlap between infill and perimeters for " "better bonding. Theoretically this shouldn't be needed, but backlash might " @@ -5478,30 +5559,30 @@ msgid "" "perimeter extrusion width." msgstr "" -#: src/libslic3r/PrintConfig.cpp:999 +#: src/libslic3r/PrintConfig.cpp:1000 msgid "Speed for printing the internal fill. Set to zero for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1007 +#: src/libslic3r/PrintConfig.cpp:1008 msgid "Inherits profile" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1008 +#: src/libslic3r/PrintConfig.cpp:1009 msgid "Name of the profile, from which this profile inherits." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1021 +#: src/libslic3r/PrintConfig.cpp:1022 msgid "Interface shells" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1022 +#: src/libslic3r/PrintConfig.cpp:1023 msgid "" "Force the generation of solid shells between adjacent materials/volumes. " "Useful for multi-extruder prints with translucent materials or manual " "soluble support material." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1031 +#: src/libslic3r/PrintConfig.cpp:1032 msgid "" "This custom code is inserted at every layer change, right after the Z move " "and before the extruder moves to the first layer point. Note that you can " @@ -5509,11 +5590,11 @@ msgid "" "[layer_z]." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1042 +#: src/libslic3r/PrintConfig.cpp:1043 msgid "Supports remaining times" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1043 +#: src/libslic3r/PrintConfig.cpp:1044 msgid "" "Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute " "intervals into the G-code to let the firmware show accurate remaining time. " @@ -5521,63 +5602,63 @@ msgid "" "firmware supports M73 Qxx Sxx for the silent mode." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1051 +#: src/libslic3r/PrintConfig.cpp:1052 msgid "Supports silent mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1052 +#: src/libslic3r/PrintConfig.cpp:1053 msgid "Set silent mode for the G-code flavor" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1075 +#: src/libslic3r/PrintConfig.cpp:1076 msgid "Maximum feedrate %1%" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1077 +#: src/libslic3r/PrintConfig.cpp:1078 msgid "Maximum feedrate of the %1% axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1085 +#: src/libslic3r/PrintConfig.cpp:1086 msgid "Maximum acceleration %1%" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1087 +#: src/libslic3r/PrintConfig.cpp:1088 msgid "Maximum acceleration of the %1% axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1095 +#: src/libslic3r/PrintConfig.cpp:1096 msgid "Maximum jerk %1%" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1097 +#: src/libslic3r/PrintConfig.cpp:1098 msgid "Maximum jerk of the %1% axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1108 src/libslic3r/PrintConfig.cpp:1110 +#: src/libslic3r/PrintConfig.cpp:1109 src/libslic3r/PrintConfig.cpp:1111 msgid "Minimum feedrate when extruding" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1119 src/libslic3r/PrintConfig.cpp:1121 +#: src/libslic3r/PrintConfig.cpp:1120 src/libslic3r/PrintConfig.cpp:1122 msgid "Minimum travel feedrate" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1130 src/libslic3r/PrintConfig.cpp:1132 +#: src/libslic3r/PrintConfig.cpp:1131 src/libslic3r/PrintConfig.cpp:1133 msgid "Maximum acceleration when extruding" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1141 src/libslic3r/PrintConfig.cpp:1143 +#: src/libslic3r/PrintConfig.cpp:1142 src/libslic3r/PrintConfig.cpp:1144 msgid "Maximum acceleration when retracting" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1151 src/libslic3r/PrintConfig.cpp:1160 +#: src/libslic3r/PrintConfig.cpp:1152 src/libslic3r/PrintConfig.cpp:1161 msgid "Max" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1152 +#: src/libslic3r/PrintConfig.cpp:1153 msgid "This setting represents the maximum speed of your fan." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1161 +#: src/libslic3r/PrintConfig.cpp:1162 #, no-c-format msgid "" "This is the highest printable layer height for this extruder, used to cap " @@ -5586,28 +5667,28 @@ msgid "" "adhesion. If set to 0, layer height is limited to 75% of the nozzle diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1171 +#: src/libslic3r/PrintConfig.cpp:1172 msgid "Max print speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1172 +#: src/libslic3r/PrintConfig.cpp:1173 msgid "" "When setting other speed settings to 0 Slic3r will autocalculate the optimal " "speed in order to keep constant extruder pressure. This experimental setting " "is used to set the highest print speed you want to allow." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1182 +#: src/libslic3r/PrintConfig.cpp:1183 msgid "" "This experimental setting is used to set the maximum volumetric speed your " "extruder supports." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1191 +#: src/libslic3r/PrintConfig.cpp:1192 msgid "Max volumetric slope positive" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1192 src/libslic3r/PrintConfig.cpp:1203 +#: src/libslic3r/PrintConfig.cpp:1193 src/libslic3r/PrintConfig.cpp:1204 msgid "" "This experimental setting is used to limit the speed of change in extrusion " "rate. A value of 1.8 mm³/s² ensures, that a change from the extrusion rate " @@ -5615,99 +5696,99 @@ msgid "" "s) to 5.4 mm³/s (feedrate 60 mm/s) will take at least 2 seconds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1196 src/libslic3r/PrintConfig.cpp:1207 +#: src/libslic3r/PrintConfig.cpp:1197 src/libslic3r/PrintConfig.cpp:1208 msgid "mm³/s²" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1202 +#: src/libslic3r/PrintConfig.cpp:1203 msgid "Max volumetric slope negative" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1214 src/libslic3r/PrintConfig.cpp:1223 +#: src/libslic3r/PrintConfig.cpp:1215 src/libslic3r/PrintConfig.cpp:1224 msgid "Min" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1215 +#: src/libslic3r/PrintConfig.cpp:1216 msgid "This setting represents the minimum PWM your fan needs to work." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1224 +#: src/libslic3r/PrintConfig.cpp:1225 msgid "" "This is the lowest printable layer height for this extruder and limits the " "resolution for variable layer height. Typical values are between 0.05 mm and " "0.1 mm." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1232 +#: src/libslic3r/PrintConfig.cpp:1233 msgid "Min print speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1233 +#: src/libslic3r/PrintConfig.cpp:1234 msgid "Slic3r will not scale speed down below this speed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1240 +#: src/libslic3r/PrintConfig.cpp:1241 msgid "Minimal filament extrusion length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1241 +#: src/libslic3r/PrintConfig.cpp:1242 msgid "" "Generate no less than the number of skirt loops required to consume the " "specified amount of filament on the bottom layer. For multi-extruder " "machines, this minimum applies to each extruder." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1250 +#: src/libslic3r/PrintConfig.cpp:1251 msgid "Configuration notes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1251 +#: src/libslic3r/PrintConfig.cpp:1252 msgid "" "You can put here your personal notes. This text will be added to the G-code " "header comments." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1260 +#: src/libslic3r/PrintConfig.cpp:1261 msgid "Nozzle diameter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1261 +#: src/libslic3r/PrintConfig.cpp:1262 msgid "" "This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1266 +#: src/libslic3r/PrintConfig.cpp:1267 msgid "Host Type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1267 +#: src/libslic3r/PrintConfig.cpp:1268 msgid "" "Slic3r can upload G-code files to a printer host. This field must contain " "the kind of the host." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1278 +#: src/libslic3r/PrintConfig.cpp:1279 msgid "Only retract when crossing perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1279 +#: src/libslic3r/PrintConfig.cpp:1280 msgid "" "Disables retraction when the travel path does not exceed the upper layer's " "perimeters (and thus any ooze will be probably invisible)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1286 +#: src/libslic3r/PrintConfig.cpp:1287 msgid "" "This option will drop the temperature of the inactive extruders to prevent " "oozing. It will enable a tall skirt automatically and move extruders outside " "such skirt when changing temperatures." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1293 +#: src/libslic3r/PrintConfig.cpp:1294 msgid "Output filename format" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1294 +#: src/libslic3r/PrintConfig.cpp:1295 msgid "" "You can use all configuration options as variables inside this template. For " "example: [layer_height], [fill_density] etc. You can also use [timestamp], " @@ -5715,31 +5796,31 @@ msgid "" "[input_filename], [input_filename_base]." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1303 +#: src/libslic3r/PrintConfig.cpp:1304 msgid "Detect bridging perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1305 +#: src/libslic3r/PrintConfig.cpp:1306 msgid "" "Experimental option to adjust flow for overhangs (bridge flow will be used), " "to apply bridge speed to them and enable fan." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1311 +#: src/libslic3r/PrintConfig.cpp:1312 msgid "Filament parking position" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1312 +#: src/libslic3r/PrintConfig.cpp:1313 msgid "" "Distance of the extruder tip from the position where the filament is parked " "when unloaded. This should match the value in printer firmware. " msgstr "" -#: src/libslic3r/PrintConfig.cpp:1320 +#: src/libslic3r/PrintConfig.cpp:1321 msgid "Extra loading distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1321 +#: src/libslic3r/PrintConfig.cpp:1322 msgid "" "When set to zero, the distance the filament is moved from parking position " "during load is exactly the same as it was moved back during unload. When " @@ -5747,28 +5828,28 @@ msgid "" "than unloading. " msgstr "" -#: src/libslic3r/PrintConfig.cpp:1329 src/libslic3r/PrintConfig.cpp:1347 -#: src/libslic3r/PrintConfig.cpp:1359 src/libslic3r/PrintConfig.cpp:1369 +#: src/libslic3r/PrintConfig.cpp:1330 src/libslic3r/PrintConfig.cpp:1348 +#: src/libslic3r/PrintConfig.cpp:1360 src/libslic3r/PrintConfig.cpp:1370 msgid "Perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1330 +#: src/libslic3r/PrintConfig.cpp:1331 msgid "" "This is the acceleration your printer will use for perimeters. A high value " "like 9000 usually gives good results if your hardware is up to the job. Set " "zero to disable acceleration control for perimeters." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1338 +#: src/libslic3r/PrintConfig.cpp:1339 msgid "Perimeter extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1340 +#: src/libslic3r/PrintConfig.cpp:1341 msgid "" "The extruder to use when printing perimeters and brim. First extruder is 1." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1349 +#: src/libslic3r/PrintConfig.cpp:1350 msgid "" "Set this to a non-zero value to set a manual extrusion width for perimeters. " "You may want to use thinner extrudates to get more accurate surfaces. If " @@ -5777,12 +5858,12 @@ msgid "" "it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1361 +#: src/libslic3r/PrintConfig.cpp:1362 msgid "" "Speed for perimeters (contours, aka vertical shells). Set to zero for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1371 +#: src/libslic3r/PrintConfig.cpp:1372 msgid "" "This option sets the number of perimeters to generate for each layer. Note " "that Slic3r may increase this number automatically when it detects sloping " @@ -5790,11 +5871,11 @@ msgid "" "Perimeters option is enabled." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1375 +#: src/libslic3r/PrintConfig.cpp:1376 msgid "(minimum)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1383 +#: src/libslic3r/PrintConfig.cpp:1384 msgid "" "If you want to process the output G-code through custom scripts, just list " "their absolute paths here. Separate multiple scripts with a semicolon. " @@ -5803,55 +5884,55 @@ msgid "" "environment variables." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1395 +#: src/libslic3r/PrintConfig.cpp:1396 msgid "Printer type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1396 +#: src/libslic3r/PrintConfig.cpp:1397 msgid "Type of the printer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1401 +#: src/libslic3r/PrintConfig.cpp:1402 msgid "Printer notes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1402 +#: src/libslic3r/PrintConfig.cpp:1403 msgid "You can put your notes regarding the printer here." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1410 +#: src/libslic3r/PrintConfig.cpp:1411 msgid "Printer vendor" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1411 +#: src/libslic3r/PrintConfig.cpp:1412 msgid "Name of the printer vendor." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1416 +#: src/libslic3r/PrintConfig.cpp:1417 msgid "Printer variant" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1417 +#: src/libslic3r/PrintConfig.cpp:1418 msgid "" "Name of the printer variant. For example, the printer variants may be " "differentiated by a nozzle diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1430 +#: src/libslic3r/PrintConfig.cpp:1431 msgid "Raft layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1432 +#: src/libslic3r/PrintConfig.cpp:1433 msgid "" "The object will be raised by this number of layers, and support material " "will be generated under it." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1440 +#: src/libslic3r/PrintConfig.cpp:1441 msgid "Resolution" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1441 +#: src/libslic3r/PrintConfig.cpp:1442 msgid "" "Minimum detail resolution, used to simplify the input file for speeding up " "the slicing job and reducing memory usage. High-resolution models often " @@ -5859,278 +5940,278 @@ msgid "" "simplification and use full resolution from input." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1451 +#: src/libslic3r/PrintConfig.cpp:1452 msgid "Minimum travel after retraction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1452 +#: src/libslic3r/PrintConfig.cpp:1453 msgid "" "Retraction is not triggered when travel moves are shorter than this length." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1458 +#: src/libslic3r/PrintConfig.cpp:1459 msgid "Retract amount before wipe" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1459 +#: src/libslic3r/PrintConfig.cpp:1460 msgid "" "With bowden extruders, it may be wise to do some amount of quick retract " "before doing the wipe movement." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1466 +#: src/libslic3r/PrintConfig.cpp:1467 msgid "Retract on layer change" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1467 +#: src/libslic3r/PrintConfig.cpp:1468 msgid "This flag enforces a retraction whenever a Z move is done." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1472 src/libslic3r/PrintConfig.cpp:1480 +#: src/libslic3r/PrintConfig.cpp:1473 src/libslic3r/PrintConfig.cpp:1481 msgid "Length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1473 +#: src/libslic3r/PrintConfig.cpp:1474 msgid "Retraction Length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1474 +#: src/libslic3r/PrintConfig.cpp:1475 msgid "" "When retraction is triggered, filament is pulled back by the specified " "amount (the length is measured on raw filament, before it enters the " "extruder)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1476 src/libslic3r/PrintConfig.cpp:1485 +#: src/libslic3r/PrintConfig.cpp:1477 src/libslic3r/PrintConfig.cpp:1486 msgid "mm (zero to disable)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1481 +#: src/libslic3r/PrintConfig.cpp:1482 msgid "Retraction Length (Toolchange)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1482 +#: src/libslic3r/PrintConfig.cpp:1483 msgid "" "When retraction is triggered before changing tool, filament is pulled back " "by the specified amount (the length is measured on raw filament, before it " "enters the extruder)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1490 +#: src/libslic3r/PrintConfig.cpp:1491 msgid "Lift Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1491 +#: src/libslic3r/PrintConfig.cpp:1492 msgid "" "If you set this to a positive value, Z is quickly raised every time a " "retraction is triggered. When using multiple extruders, only the setting for " "the first extruder will be considered." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1498 +#: src/libslic3r/PrintConfig.cpp:1499 msgid "Above Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1499 +#: src/libslic3r/PrintConfig.cpp:1500 msgid "Only lift Z above" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1500 +#: src/libslic3r/PrintConfig.cpp:1501 msgid "" "If you set this to a positive value, Z lift will only take place above the " "specified absolute Z. You can tune this setting for skipping lift on the " "first layers." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1507 +#: src/libslic3r/PrintConfig.cpp:1508 msgid "Below Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1508 +#: src/libslic3r/PrintConfig.cpp:1509 msgid "Only lift Z below" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1509 +#: src/libslic3r/PrintConfig.cpp:1510 msgid "" "If you set this to a positive value, Z lift will only take place below the " "specified absolute Z. You can tune this setting for limiting lift to the " "first layers." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1517 src/libslic3r/PrintConfig.cpp:1525 +#: src/libslic3r/PrintConfig.cpp:1518 src/libslic3r/PrintConfig.cpp:1526 msgid "Extra length on restart" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1518 +#: src/libslic3r/PrintConfig.cpp:1519 msgid "" "When the retraction is compensated after the travel move, the extruder will " "push this additional amount of filament. This setting is rarely needed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1526 +#: src/libslic3r/PrintConfig.cpp:1527 msgid "" "When the retraction is compensated after changing tool, the extruder will " "push this additional amount of filament." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1533 src/libslic3r/PrintConfig.cpp:1534 +#: src/libslic3r/PrintConfig.cpp:1534 src/libslic3r/PrintConfig.cpp:1535 msgid "Retraction Speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1535 +#: src/libslic3r/PrintConfig.cpp:1536 msgid "The speed for retractions (it only applies to the extruder motor)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1541 src/libslic3r/PrintConfig.cpp:1542 +#: src/libslic3r/PrintConfig.cpp:1542 src/libslic3r/PrintConfig.cpp:1543 msgid "Deretraction Speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1543 +#: src/libslic3r/PrintConfig.cpp:1544 msgid "" "The speed for loading of a filament into extruder after retraction (it only " "applies to the extruder motor). If left to zero, the retraction speed is " "used." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1550 +#: src/libslic3r/PrintConfig.cpp:1551 msgid "Seam position" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1552 +#: src/libslic3r/PrintConfig.cpp:1553 msgid "Position of perimeters starting points." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1558 +#: src/libslic3r/PrintConfig.cpp:1559 msgid "Random" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1559 +#: src/libslic3r/PrintConfig.cpp:1560 msgid "Nearest" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1560 +#: src/libslic3r/PrintConfig.cpp:1561 msgid "Aligned" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1568 +#: src/libslic3r/PrintConfig.cpp:1569 msgid "Direction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1570 +#: src/libslic3r/PrintConfig.cpp:1571 msgid "Preferred direction of the seam" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1571 +#: src/libslic3r/PrintConfig.cpp:1572 msgid "Seam preferred direction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1578 +#: src/libslic3r/PrintConfig.cpp:1579 msgid "Jitter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1580 +#: src/libslic3r/PrintConfig.cpp:1581 msgid "Seam preferred direction jitter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1581 +#: src/libslic3r/PrintConfig.cpp:1582 msgid "Preferred direction of the seam - jitter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1591 +#: src/libslic3r/PrintConfig.cpp:1592 msgid "USB/serial port for printer connection." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1598 +#: src/libslic3r/PrintConfig.cpp:1599 msgid "Serial port speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1599 +#: src/libslic3r/PrintConfig.cpp:1600 msgid "Speed (baud) of USB/serial port for printer connection." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1608 +#: src/libslic3r/PrintConfig.cpp:1609 msgid "Distance from object" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1609 +#: src/libslic3r/PrintConfig.cpp:1610 msgid "" "Distance between skirt and object(s). Set this to zero to attach the skirt " "to the object(s) and get a brim for better adhesion." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1616 +#: src/libslic3r/PrintConfig.cpp:1617 msgid "Skirt height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1617 +#: src/libslic3r/PrintConfig.cpp:1618 msgid "" "Height of skirt expressed in layers. Set this to a tall value to use skirt " "as a shield against drafts." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1624 +#: src/libslic3r/PrintConfig.cpp:1625 msgid "Loops (minimum)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1625 +#: src/libslic3r/PrintConfig.cpp:1626 msgid "Skirt Loops" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1626 +#: src/libslic3r/PrintConfig.cpp:1627 msgid "" "Number of loops for the skirt. If the Minimum Extrusion Length option is " "set, the number of loops might be greater than the one configured here. Set " "this to zero to disable skirt completely." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1634 +#: src/libslic3r/PrintConfig.cpp:1635 msgid "Slow down if layer print time is below" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1635 +#: src/libslic3r/PrintConfig.cpp:1636 msgid "" "If layer print time is estimated below this number of seconds, print moves " "speed will be scaled down to extend duration to this value." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1645 +#: src/libslic3r/PrintConfig.cpp:1646 msgid "Small perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1647 +#: src/libslic3r/PrintConfig.cpp:1648 msgid "" "This separate setting will affect the speed of perimeters having radius <= " "6.5mm (usually holes). If expressed as percentage (for example: 80%) it will " "be calculated on the perimeters speed setting above. Set to zero for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1657 +#: src/libslic3r/PrintConfig.cpp:1658 msgid "Solid infill threshold area" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1659 +#: src/libslic3r/PrintConfig.cpp:1660 msgid "" "Force solid infill for regions having a smaller area than the specified " "threshold." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1660 +#: src/libslic3r/PrintConfig.cpp:1661 msgid "mm²" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1666 +#: src/libslic3r/PrintConfig.cpp:1667 msgid "Solid infill extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1668 +#: src/libslic3r/PrintConfig.cpp:1669 msgid "The extruder to use when printing solid infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1674 +#: src/libslic3r/PrintConfig.cpp:1675 msgid "Solid infill every" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1676 +#: src/libslic3r/PrintConfig.cpp:1677 msgid "" "This feature allows to force a solid layer every given number of layers. " "Zero to disable. You can set this to any value (for example 9999); Slic3r " @@ -6138,7 +6219,7 @@ msgid "" "according to nozzle diameter and layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1688 +#: src/libslic3r/PrintConfig.cpp:1689 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill for " "solid surfaces. If left zero, default extrusion width will be used if set, " @@ -6146,22 +6227,22 @@ msgid "" "(for example 90%) it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1698 +#: src/libslic3r/PrintConfig.cpp:1699 msgid "" "Speed for printing solid regions (top/bottom/internal horizontal shells). " "This can be expressed as a percentage (for example: 80%) over the default " "infill speed above. Set to zero for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1710 +#: src/libslic3r/PrintConfig.cpp:1711 msgid "Number of solid layers to generate on top and bottom surfaces." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1716 +#: src/libslic3r/PrintConfig.cpp:1717 msgid "Spiral vase" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1717 +#: src/libslic3r/PrintConfig.cpp:1718 msgid "" "This feature will raise Z gradually while printing a single-walled object in " "order to remove any visible seam. This option requires a single perimeter, " @@ -6170,18 +6251,18 @@ msgid "" "when printing more than an object." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1725 +#: src/libslic3r/PrintConfig.cpp:1726 msgid "Temperature variation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1726 +#: src/libslic3r/PrintConfig.cpp:1727 msgid "" "Temperature difference to be applied when an extruder is not active. Enables " "a full-height \"sacrificial\" skirt on which the nozzles are periodically " "wiped." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1736 +#: src/libslic3r/PrintConfig.cpp:1737 msgid "" "This start procedure is inserted at the beginning, after bed has reached the " "target temperature and extruder just started heating, and before extruder " @@ -6192,7 +6273,7 @@ msgid "" "\"M109 S[first_layer_temperature]\" command wherever you want." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1751 +#: src/libslic3r/PrintConfig.cpp:1752 msgid "" "This start procedure is inserted at the beginning, after any printer start " "gcode. This is used to override settings for a specific filament. If Slic3r " @@ -6204,93 +6285,93 @@ msgid "" "extruders, the gcode is processed in extruder order." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1766 +#: src/libslic3r/PrintConfig.cpp:1767 msgid "Single Extruder Multi Material" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1767 +#: src/libslic3r/PrintConfig.cpp:1768 msgid "The printer multiplexes filaments into a single hot end." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1772 +#: src/libslic3r/PrintConfig.cpp:1773 msgid "Prime all printing extruders" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1773 +#: src/libslic3r/PrintConfig.cpp:1774 msgid "" "If enabled, all printing extruders will be primed at the front edge of the " "print bed at the start of the print." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1778 +#: src/libslic3r/PrintConfig.cpp:1779 msgid "Generate support material" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1780 +#: src/libslic3r/PrintConfig.cpp:1781 msgid "Enable support material generation." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1784 +#: src/libslic3r/PrintConfig.cpp:1785 msgid "Auto generated supports" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1786 +#: src/libslic3r/PrintConfig.cpp:1787 msgid "" "If checked, supports will be generated automatically based on the overhang " "threshold value. If unchecked, supports will be generated inside the " "\"Support Enforcer\" volumes only." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1792 +#: src/libslic3r/PrintConfig.cpp:1793 msgid "XY separation between an object and its support" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1794 +#: src/libslic3r/PrintConfig.cpp:1795 msgid "" "XY separation between an object and its support. If expressed as percentage " "(for example 50%), it will be calculated over external perimeter width." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1804 +#: src/libslic3r/PrintConfig.cpp:1805 msgid "Pattern angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1806 +#: src/libslic3r/PrintConfig.cpp:1807 msgid "" "Use this setting to rotate the support material pattern on the horizontal " "plane." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1816 src/libslic3r/PrintConfig.cpp:2423 +#: src/libslic3r/PrintConfig.cpp:1817 src/libslic3r/PrintConfig.cpp:2425 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1822 +#: src/libslic3r/PrintConfig.cpp:1823 msgid "Contact Z distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1824 +#: src/libslic3r/PrintConfig.cpp:1825 msgid "" "The vertical distance between object and support material interface. Setting " "this to 0 will also prevent Slic3r from using bridge flow and speed for the " "first object layer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1831 +#: src/libslic3r/PrintConfig.cpp:1832 msgid "soluble" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1832 +#: src/libslic3r/PrintConfig.cpp:1833 msgid "detachable" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1837 +#: src/libslic3r/PrintConfig.cpp:1838 msgid "Enforce support for the first" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1839 +#: src/libslic3r/PrintConfig.cpp:1840 msgid "" "Generate support material for the specified number of layers counting from " "bottom, regardless of whether normal support material is enabled or not and " @@ -6298,21 +6379,21 @@ msgid "" "of objects having a very thin or poor footprint on the build plate." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1844 +#: src/libslic3r/PrintConfig.cpp:1845 msgid "Enforce support for the first n layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1850 +#: src/libslic3r/PrintConfig.cpp:1851 msgid "Support material/raft/skirt extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1852 +#: src/libslic3r/PrintConfig.cpp:1853 msgid "" "The extruder to use when printing support material, raft and skirt (1+, 0 to " "use the current extruder to minimize tool changes)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1861 +#: src/libslic3r/PrintConfig.cpp:1862 msgid "" "Set this to a non-zero value to set a manual extrusion width for support " "material. If left zero, default extrusion width will be used if set, " @@ -6320,89 +6401,89 @@ msgid "" "example 90%) it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1869 +#: src/libslic3r/PrintConfig.cpp:1870 msgid "Interface loops" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1871 +#: src/libslic3r/PrintConfig.cpp:1872 msgid "" "Cover the top contact layer of the supports with loops. Disabled by default." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1876 +#: src/libslic3r/PrintConfig.cpp:1877 msgid "Support material/raft interface extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1878 +#: src/libslic3r/PrintConfig.cpp:1879 msgid "" "The extruder to use when printing support material interface (1+, 0 to use " "the current extruder to minimize tool changes). This affects raft too." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1885 +#: src/libslic3r/PrintConfig.cpp:1886 msgid "Interface layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1887 +#: src/libslic3r/PrintConfig.cpp:1888 msgid "" "Number of interface layers to insert between the object(s) and support " "material." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1894 +#: src/libslic3r/PrintConfig.cpp:1895 msgid "Interface pattern spacing" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1896 +#: src/libslic3r/PrintConfig.cpp:1897 msgid "Spacing between interface lines. Set zero to get a solid interface." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1905 +#: src/libslic3r/PrintConfig.cpp:1906 msgid "" "Speed for printing support material interface layers. If expressed as " "percentage (for example 50%) it will be calculated over support material " "speed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1914 +#: src/libslic3r/PrintConfig.cpp:1915 msgid "Pattern" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1916 +#: src/libslic3r/PrintConfig.cpp:1917 msgid "Pattern used to generate support material." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1922 +#: src/libslic3r/PrintConfig.cpp:1923 msgid "Rectilinear grid" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1928 +#: src/libslic3r/PrintConfig.cpp:1929 msgid "Pattern spacing" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1930 +#: src/libslic3r/PrintConfig.cpp:1931 msgid "Spacing between support material lines." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1939 +#: src/libslic3r/PrintConfig.cpp:1940 msgid "Speed for printing support material." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1946 +#: src/libslic3r/PrintConfig.cpp:1947 msgid "Synchronize with object layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1948 +#: src/libslic3r/PrintConfig.cpp:1949 msgid "" "Synchronize support layers with the object print layers. This is useful with " "multi-material printers, where the extruder switch is expensive." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1954 +#: src/libslic3r/PrintConfig.cpp:1955 msgid "Overhang threshold" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1956 +#: src/libslic3r/PrintConfig.cpp:1957 msgid "" "Support material will not be generated for overhangs whose slope angle (90° " "= vertical) is above the given threshold. In other words, this value " @@ -6411,54 +6492,54 @@ msgid "" "detection (recommended)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1968 +#: src/libslic3r/PrintConfig.cpp:1969 msgid "With sheath around the support" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1970 +#: src/libslic3r/PrintConfig.cpp:1971 msgid "" "Add a sheath (a single perimeter line) around the base support. This makes " "the support more reliable, but also more difficult to remove." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1977 +#: src/libslic3r/PrintConfig.cpp:1978 msgid "" "Extruder temperature for layers after the first one. Set this to zero to " "disable temperature control commands in the output." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1979 +#: src/libslic3r/PrintConfig.cpp:1980 msgid "Temperature" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1985 +#: src/libslic3r/PrintConfig.cpp:1986 msgid "Detect thin walls" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1987 +#: src/libslic3r/PrintConfig.cpp:1988 msgid "" "Detect single-width walls (parts where two extrusions don't fit and we need " "to collapse them into a single trace)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1993 +#: src/libslic3r/PrintConfig.cpp:1994 msgid "Threads" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1994 +#: src/libslic3r/PrintConfig.cpp:1995 msgid "" "Threads are used to parallelize long-running tasks. Optimal threads number " "is slightly above the number of available cores/processors." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2006 +#: src/libslic3r/PrintConfig.cpp:2007 msgid "" "This custom code is inserted right before every extruder change. Note that " "you can use placeholder variables for all Slic3r settings as well as " "[previous_extruder] and [next_extruder]." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2018 +#: src/libslic3r/PrintConfig.cpp:2019 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill for " "top surfaces. You may want to use thinner extrudates to fill all narrow " @@ -6467,7 +6548,7 @@ msgid "" "percentage (for example 90%) it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2029 +#: src/libslic3r/PrintConfig.cpp:2030 msgid "" "Speed for printing top solid layers (it only applies to the uppermost " "external layers and not to their internal solid layers). You may want to " @@ -6476,43 +6557,43 @@ msgid "" "for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2043 +#: src/libslic3r/PrintConfig.cpp:2045 msgid "Number of solid layers to generate on top surfaces." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2044 +#: src/libslic3r/PrintConfig.cpp:2046 msgid "Top solid layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2050 +#: src/libslic3r/PrintConfig.cpp:2052 msgid "Speed for travel moves (jumps between distant extrusion points)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2058 +#: src/libslic3r/PrintConfig.cpp:2060 msgid "Use firmware retraction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2059 +#: src/libslic3r/PrintConfig.cpp:2061 msgid "" "This experimental setting uses G10 and G11 commands to have the firmware " "handle the retraction. This is only supported in recent Marlin." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2065 +#: src/libslic3r/PrintConfig.cpp:2067 msgid "Use relative E distances" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2066 +#: src/libslic3r/PrintConfig.cpp:2068 msgid "" "If your firmware requires relative E values, check this, otherwise leave it " "unchecked. Most firmwares use absolute values." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2072 +#: src/libslic3r/PrintConfig.cpp:2074 msgid "Use volumetric E" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2073 +#: src/libslic3r/PrintConfig.cpp:2075 msgid "" "This experimental setting uses outputs the E values in cubic millimeters " "instead of linear millimeters. If your firmware doesn't already know " @@ -6522,131 +6603,127 @@ msgid "" "only supported in recent Marlin." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2083 +#: src/libslic3r/PrintConfig.cpp:2085 msgid "Enable variable layer height feature" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2084 +#: src/libslic3r/PrintConfig.cpp:2086 msgid "" "Some printers or printer setups may have difficulties printing with a " "variable layer height. Enabled by default." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2090 +#: src/libslic3r/PrintConfig.cpp:2092 msgid "Wipe while retracting" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2091 +#: src/libslic3r/PrintConfig.cpp:2093 msgid "" "This flag will move the nozzle while retracting to minimize the possible " "blob on leaky extruders." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2098 +#: src/libslic3r/PrintConfig.cpp:2100 msgid "" "Multi material printers may need to prime or purge extruders on tool " "changes. Extrude the excess material into the wipe tower." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2104 +#: src/libslic3r/PrintConfig.cpp:2106 msgid "Purging volumes - load/unload volumes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2105 +#: src/libslic3r/PrintConfig.cpp:2107 msgid "" "This vector saves required volumes to change from/to each tool used on the " "wipe tower. These values are used to simplify creation of the full purging " "volumes below. " msgstr "" -#: src/libslic3r/PrintConfig.cpp:2111 +#: src/libslic3r/PrintConfig.cpp:2113 msgid "Purging volumes - matrix" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2112 +#: src/libslic3r/PrintConfig.cpp:2114 msgid "" "This matrix describes volumes (in cubic milimetres) required to purge the " "new filament on the wipe tower for any given pair of tools. " msgstr "" -#: src/libslic3r/PrintConfig.cpp:2121 +#: src/libslic3r/PrintConfig.cpp:2123 msgid "Position X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2122 +#: src/libslic3r/PrintConfig.cpp:2124 msgid "X coordinate of the left front corner of a wipe tower" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2128 +#: src/libslic3r/PrintConfig.cpp:2130 msgid "Position Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2129 +#: src/libslic3r/PrintConfig.cpp:2131 msgid "Y coordinate of the left front corner of a wipe tower" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2136 +#: src/libslic3r/PrintConfig.cpp:2138 msgid "Width of a wipe tower" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2142 +#: src/libslic3r/PrintConfig.cpp:2144 msgid "Wipe tower rotation angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2143 +#: src/libslic3r/PrintConfig.cpp:2145 msgid "Wipe tower rotation angle with respect to x-axis " msgstr "" -#: src/libslic3r/PrintConfig.cpp:2144 src/libslic3r/PrintConfig.cpp:2570 -msgid "degrees" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:2150 +#: src/libslic3r/PrintConfig.cpp:2152 msgid "Wipe into this object's infill" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2151 +#: src/libslic3r/PrintConfig.cpp:2153 msgid "" "Purging after toolchange will done inside this object's infills. This lowers " "the amount of waste but may result in longer print time due to additional " "travel moves." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2158 +#: src/libslic3r/PrintConfig.cpp:2160 msgid "Wipe into this object" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2159 +#: src/libslic3r/PrintConfig.cpp:2161 msgid "" "Object will be used to purge the nozzle after a toolchange to save material " "that would otherwise end up in the wipe tower and decrease print time. " "Colours of the objects will be mixed as a result." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2165 +#: src/libslic3r/PrintConfig.cpp:2167 msgid "Maximal bridging distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2166 +#: src/libslic3r/PrintConfig.cpp:2168 msgid "Maximal distance between supports on sparse infill sections. " msgstr "" -#: src/libslic3r/PrintConfig.cpp:2172 +#: src/libslic3r/PrintConfig.cpp:2174 msgid "XY Size Compensation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2174 +#: src/libslic3r/PrintConfig.cpp:2176 msgid "" "The object will be grown/shrunk in the XY plane by the configured value " "(negative = inwards, positive = outwards). This might be useful for fine-" "tuning hole sizes." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2182 +#: src/libslic3r/PrintConfig.cpp:2184 msgid "Z offset" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2183 +#: src/libslic3r/PrintConfig.cpp:2185 msgid "" "This value will be added (or subtracted) from all the Z coordinates in the " "output G-code. It is used to compensate for bad Z endstop position: for " @@ -6654,312 +6731,312 @@ msgid "" "print bed, set this to -0.3 (or fix your endstop)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2200 +#: src/libslic3r/PrintConfig.cpp:2202 msgid "Display width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2201 +#: src/libslic3r/PrintConfig.cpp:2203 msgid "Width of the display" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2206 +#: src/libslic3r/PrintConfig.cpp:2208 msgid "Display height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2207 +#: src/libslic3r/PrintConfig.cpp:2209 msgid "Height of the display" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2212 +#: src/libslic3r/PrintConfig.cpp:2214 msgid "Number of pixels in" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2214 +#: src/libslic3r/PrintConfig.cpp:2216 msgid "Number of pixels in X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2220 +#: src/libslic3r/PrintConfig.cpp:2222 msgid "Number of pixels in Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2225 +#: src/libslic3r/PrintConfig.cpp:2227 msgid "Display orientation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2226 +#: src/libslic3r/PrintConfig.cpp:2228 msgid "" "Set the actual LCD display orientation inside the SLA printer. Portrait mode " "will flip the meaning of display width and height parameters and the output " "images will be rotated by 90 degrees." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2232 +#: src/libslic3r/PrintConfig.cpp:2234 msgid "Landscape" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2233 +#: src/libslic3r/PrintConfig.cpp:2235 msgid "Portrait" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2238 +#: src/libslic3r/PrintConfig.cpp:2240 msgid "Fast" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2239 +#: src/libslic3r/PrintConfig.cpp:2241 msgid "Fast tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2240 +#: src/libslic3r/PrintConfig.cpp:2242 msgid "Time of the fast tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2247 +#: src/libslic3r/PrintConfig.cpp:2249 msgid "Slow" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2248 +#: src/libslic3r/PrintConfig.cpp:2250 msgid "Slow tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2249 +#: src/libslic3r/PrintConfig.cpp:2251 msgid "Time of the slow tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2256 +#: src/libslic3r/PrintConfig.cpp:2258 msgid "Area fill" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2257 +#: src/libslic3r/PrintConfig.cpp:2259 msgid "" "The percentage of the bed area. \n" "If the print area exceeds the specified value, \n" "then a slow tilt will be used, otherwise - a fast tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2264 src/libslic3r/PrintConfig.cpp:2265 -#: src/libslic3r/PrintConfig.cpp:2266 +#: src/libslic3r/PrintConfig.cpp:2266 src/libslic3r/PrintConfig.cpp:2267 +#: src/libslic3r/PrintConfig.cpp:2268 msgid "Printer scaling correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2272 src/libslic3r/PrintConfig.cpp:2273 +#: src/libslic3r/PrintConfig.cpp:2274 src/libslic3r/PrintConfig.cpp:2275 msgid "Printer absolute correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2274 +#: src/libslic3r/PrintConfig.cpp:2276 msgid "" "Will inflate or deflate the sliced 2D polygons according to the sign of the " "correction." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2280 src/libslic3r/PrintConfig.cpp:2281 +#: src/libslic3r/PrintConfig.cpp:2282 src/libslic3r/PrintConfig.cpp:2283 msgid "Printer gamma correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2282 +#: src/libslic3r/PrintConfig.cpp:2284 msgid "" "This will apply a gamma correction to the rasterized 2D polygons. A gamma " "value of zero means thresholding with the threshold in the middle. This " "behaviour eliminates antialiasing without losing holes in polygons." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2293 src/libslic3r/PrintConfig.cpp:2294 +#: src/libslic3r/PrintConfig.cpp:2295 src/libslic3r/PrintConfig.cpp:2296 msgid "Initial layer height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2300 +#: src/libslic3r/PrintConfig.cpp:2302 msgid "Faded layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2301 +#: src/libslic3r/PrintConfig.cpp:2303 msgid "" "Number of the layers needed for the exposure time fade from initial exposure " "time to the exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2308 src/libslic3r/PrintConfig.cpp:2309 +#: src/libslic3r/PrintConfig.cpp:2310 src/libslic3r/PrintConfig.cpp:2311 msgid "Exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2315 src/libslic3r/PrintConfig.cpp:2316 +#: src/libslic3r/PrintConfig.cpp:2317 src/libslic3r/PrintConfig.cpp:2318 msgid "Initial exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2322 src/libslic3r/PrintConfig.cpp:2323 +#: src/libslic3r/PrintConfig.cpp:2324 src/libslic3r/PrintConfig.cpp:2325 msgid "Correction for expansion" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2329 +#: src/libslic3r/PrintConfig.cpp:2331 msgid "SLA print material notes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2330 +#: src/libslic3r/PrintConfig.cpp:2332 msgid "You can put your notes regarding the SLA print material here." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2338 src/libslic3r/PrintConfig.cpp:2349 +#: src/libslic3r/PrintConfig.cpp:2340 src/libslic3r/PrintConfig.cpp:2351 msgid "Default SLA material profile" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2360 +#: src/libslic3r/PrintConfig.cpp:2362 msgid "Generate supports" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2362 +#: src/libslic3r/PrintConfig.cpp:2364 msgid "Generate supports for the models" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2367 +#: src/libslic3r/PrintConfig.cpp:2369 msgid "Support head front diameter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2369 +#: src/libslic3r/PrintConfig.cpp:2371 msgid "Diameter of the pointing side of the head" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2376 +#: src/libslic3r/PrintConfig.cpp:2378 msgid "Support head penetration" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2378 +#: src/libslic3r/PrintConfig.cpp:2380 msgid "How much the pinhead has to penetrate the model surface" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2385 +#: src/libslic3r/PrintConfig.cpp:2387 msgid "Support head width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2387 +#: src/libslic3r/PrintConfig.cpp:2389 msgid "Width from the back sphere center to the front sphere center" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2395 +#: src/libslic3r/PrintConfig.cpp:2397 msgid "Support pillar diameter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2397 +#: src/libslic3r/PrintConfig.cpp:2399 msgid "Diameter in mm of the support pillars" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2405 +#: src/libslic3r/PrintConfig.cpp:2407 msgid "Support pillar connection mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2406 +#: src/libslic3r/PrintConfig.cpp:2408 msgid "" "Controls the bridge type between two neigboring pillars. Can be zig-zag, " "cross (double zig-zag) or dynamic which will automatically switch between " "the first two depending on the distance of the two pillars." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2414 +#: src/libslic3r/PrintConfig.cpp:2416 msgid "Zig-Zag" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2415 +#: src/libslic3r/PrintConfig.cpp:2417 msgid "Cross" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2416 +#: src/libslic3r/PrintConfig.cpp:2418 msgid "Dynamic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2428 +#: src/libslic3r/PrintConfig.cpp:2430 msgid "Pillar widening factor" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2430 +#: src/libslic3r/PrintConfig.cpp:2432 msgid "" "Merging bridges or pillars into another pillars can increase the radius. " "Zero means no increase, one means full increase." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2439 +#: src/libslic3r/PrintConfig.cpp:2441 msgid "Support base diameter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2441 +#: src/libslic3r/PrintConfig.cpp:2443 msgid "Diameter in mm of the pillar base" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2449 +#: src/libslic3r/PrintConfig.cpp:2451 msgid "Support base height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2451 +#: src/libslic3r/PrintConfig.cpp:2453 msgid "The height of the pillar base cone" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2458 +#: src/libslic3r/PrintConfig.cpp:2460 msgid "Critical angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2460 +#: src/libslic3r/PrintConfig.cpp:2462 msgid "The default angle for connecting support sticks and junctions." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2468 +#: src/libslic3r/PrintConfig.cpp:2470 msgid "Max bridge length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2470 +#: src/libslic3r/PrintConfig.cpp:2472 msgid "The max length of a bridge" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2477 +#: src/libslic3r/PrintConfig.cpp:2479 msgid "Max pillar linking distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2479 +#: src/libslic3r/PrintConfig.cpp:2481 msgid "" "The max distance of two pillars to get linked with each other. A zero value " "will prohibit pillar cascading." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2487 +#: src/libslic3r/PrintConfig.cpp:2489 msgid "Object elevation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2489 +#: src/libslic3r/PrintConfig.cpp:2491 msgid "How much the supports should lift up the supported object." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2497 +#: src/libslic3r/PrintConfig.cpp:2499 msgid "Support points density" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2499 +#: src/libslic3r/PrintConfig.cpp:2501 msgid "This is a relative measure of support points density." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2505 +#: src/libslic3r/PrintConfig.cpp:2507 msgid "Minimal distance of the support points" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2507 +#: src/libslic3r/PrintConfig.cpp:2509 msgid "No support points will be placed closer than this threshold." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2513 +#: src/libslic3r/PrintConfig.cpp:2515 msgid "Use pad" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2515 +#: src/libslic3r/PrintConfig.cpp:2517 msgid "Add a pad underneath the supported model" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2520 +#: src/libslic3r/PrintConfig.cpp:2522 msgid "Pad wall thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2522 +#: src/libslic3r/PrintConfig.cpp:2524 msgid "The thickness of the pad and its optional cavity walls." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2530 +#: src/libslic3r/PrintConfig.cpp:2532 msgid "Pad wall height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2531 +#: src/libslic3r/PrintConfig.cpp:2533 msgid "" "Defines the pad cavity depth. Set to zero to disable the cavity. Be careful " "when enabling this feature, as some resins may produce an extreme suction " @@ -6967,279 +7044,283 @@ msgid "" "difficult." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2544 +#: src/libslic3r/PrintConfig.cpp:2546 msgid "Max merge distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2546 +#: src/libslic3r/PrintConfig.cpp:2548 msgid "" "Some objects can get along with a few smaller pads instead of a single big " "one. This parameter defines how far the center of two smaller pads should " "be. If theyare closer, they will get merged into one pad." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2557 +#: src/libslic3r/PrintConfig.cpp:2559 msgid "Pad edge radius" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2566 +#: src/libslic3r/PrintConfig.cpp:2568 msgid "Pad wall slope" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2568 +#: src/libslic3r/PrintConfig.cpp:2570 msgid "" "The slope of the pad wall relative to the bed plane. 90 degrees means " "straight walls." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2929 +#: src/libslic3r/PrintConfig.cpp:2572 +msgid "degrees" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2931 msgid "Export OBJ" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2930 +#: src/libslic3r/PrintConfig.cpp:2932 msgid "Export the model(s) as OBJ." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2941 +#: src/libslic3r/PrintConfig.cpp:2943 msgid "Export SLA" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2942 +#: src/libslic3r/PrintConfig.cpp:2944 msgid "Slice the model and export SLA printing layers as PNG." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2947 +#: src/libslic3r/PrintConfig.cpp:2949 msgid "Export 3MF" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2948 +#: src/libslic3r/PrintConfig.cpp:2950 msgid "Export the model(s) as 3MF." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2952 +#: src/libslic3r/PrintConfig.cpp:2954 msgid "Export AMF" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2953 +#: src/libslic3r/PrintConfig.cpp:2955 msgid "Export the model(s) as AMF." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2957 +#: src/libslic3r/PrintConfig.cpp:2959 msgid "Export STL" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2958 +#: src/libslic3r/PrintConfig.cpp:2960 msgid "Export the model(s) as STL." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2963 +#: src/libslic3r/PrintConfig.cpp:2965 msgid "Slice the model and export toolpaths as G-code." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2968 +#: src/libslic3r/PrintConfig.cpp:2970 msgid "Slice" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2969 +#: src/libslic3r/PrintConfig.cpp:2971 msgid "" "Slice the model as FFF or SLA based on the printer_technology configuration " "value." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2974 +#: src/libslic3r/PrintConfig.cpp:2976 msgid "Help" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2975 +#: src/libslic3r/PrintConfig.cpp:2977 msgid "Show this help." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2980 +#: src/libslic3r/PrintConfig.cpp:2982 msgid "Help (FFF options)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2981 +#: src/libslic3r/PrintConfig.cpp:2983 msgid "Show the full list of print/G-code configuration options." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2985 +#: src/libslic3r/PrintConfig.cpp:2987 msgid "Help (SLA options)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2986 +#: src/libslic3r/PrintConfig.cpp:2988 msgid "Show the full list of SLA print configuration options." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2990 +#: src/libslic3r/PrintConfig.cpp:2992 msgid "Output Model Info" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2991 +#: src/libslic3r/PrintConfig.cpp:2993 msgid "Write information about the model to the console." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2995 +#: src/libslic3r/PrintConfig.cpp:2997 msgid "Save config file" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2996 +#: src/libslic3r/PrintConfig.cpp:2998 msgid "Save configuration to the specified file." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3006 +#: src/libslic3r/PrintConfig.cpp:3008 msgid "Align XY" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3007 +#: src/libslic3r/PrintConfig.cpp:3009 msgid "Align the model to the given point." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3012 +#: src/libslic3r/PrintConfig.cpp:3014 msgid "Cut model at the given Z." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3033 +#: src/libslic3r/PrintConfig.cpp:3035 msgid "Center" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3034 +#: src/libslic3r/PrintConfig.cpp:3036 msgid "Center the print around the given center." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3038 +#: src/libslic3r/PrintConfig.cpp:3040 msgid "Don't arrange" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3039 +#: src/libslic3r/PrintConfig.cpp:3041 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3042 +#: src/libslic3r/PrintConfig.cpp:3044 msgid "Duplicate" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3043 +#: src/libslic3r/PrintConfig.cpp:3045 msgid "Multiply copies by this factor." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3047 +#: src/libslic3r/PrintConfig.cpp:3049 msgid "Duplicate by grid" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3048 +#: src/libslic3r/PrintConfig.cpp:3050 msgid "Multiply copies by creating a grid." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3051 +#: src/libslic3r/PrintConfig.cpp:3053 msgid "Merge" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3052 +#: src/libslic3r/PrintConfig.cpp:3054 msgid "" "Arrange the supplied models in a plate and merge them in a single model in " "order to perform actions once." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3057 +#: src/libslic3r/PrintConfig.cpp:3059 msgid "" "Try to repair any non-manifold meshes (this option is implicitly added " "whenever we need to slice the model to perform the requested action)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3061 +#: src/libslic3r/PrintConfig.cpp:3063 msgid "Rotation angle around the Z axis in degrees." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3065 +#: src/libslic3r/PrintConfig.cpp:3067 msgid "Rotate around X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3066 +#: src/libslic3r/PrintConfig.cpp:3068 msgid "Rotation angle around the X axis in degrees." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3070 +#: src/libslic3r/PrintConfig.cpp:3072 msgid "Rotate around Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3071 +#: src/libslic3r/PrintConfig.cpp:3073 msgid "Rotation angle around the Y axis in degrees." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3076 +#: src/libslic3r/PrintConfig.cpp:3078 msgid "Scaling factor or percentage." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3081 +#: src/libslic3r/PrintConfig.cpp:3083 msgid "" "Detect unconnected parts in the given model(s) and split them into separate " "objects." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3084 +#: src/libslic3r/PrintConfig.cpp:3086 msgid "Scale to Fit" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3085 +#: src/libslic3r/PrintConfig.cpp:3087 msgid "Scale to fit the given volume." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3094 +#: src/libslic3r/PrintConfig.cpp:3096 msgid "Ignore non-existent config files" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3095 +#: src/libslic3r/PrintConfig.cpp:3097 msgid "Do not fail if a file supplied to --load does not exist." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3098 +#: src/libslic3r/PrintConfig.cpp:3100 msgid "Load config file" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3099 +#: src/libslic3r/PrintConfig.cpp:3101 msgid "" "Load configuration from the specified file. It can be used more than once to " "load options from multiple files." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3102 +#: src/libslic3r/PrintConfig.cpp:3104 msgid "Output File" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3103 +#: src/libslic3r/PrintConfig.cpp:3105 msgid "" "The file where the output will be written (if not specified, it will be " "based on the input file)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3113 +#: src/libslic3r/PrintConfig.cpp:3115 msgid "Data directory" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3114 +#: src/libslic3r/PrintConfig.cpp:3116 msgid "" "Load and store settings at the given directory. This is useful for " "maintaining different profiles or including configurations from a network " "storage." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3117 +#: src/libslic3r/PrintConfig.cpp:3119 msgid "Logging level" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3118 +#: src/libslic3r/PrintConfig.cpp:3120 msgid "" "Messages with severity lower or eqal to the loglevel will be printed out. 0:" "trace, 1:debug, 2:info, 3:warning, 4:error, 5:fatal" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3123 +#: src/libslic3r/PrintConfig.cpp:3125 msgid "Render with a software renderer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3124 +#: src/libslic3r/PrintConfig.cpp:3126 msgid "" "Render with a software renderer. The bundled MESA software renderer is " "loaded instead of the default OpenGL driver." diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index d743a9b23..72e3597d5 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -1473,7 +1473,7 @@ void Print::process() BOOST_LOG_TRIVIAL(info) << "Staring the slicing process." << log_memory_info(); for (PrintObject *obj : m_objects) obj->make_perimeters(); - this->set_status(70, "Infilling layers"); + this->set_status(70, L("Infilling layers")); for (PrintObject *obj : m_objects) obj->infill(); for (PrintObject *obj : m_objects) @@ -1481,7 +1481,7 @@ void Print::process() if (this->set_started(psSkirt)) { m_skirt.clear(); if (this->has_skirt()) { - this->set_status(88, "Generating skirt"); + this->set_status(88, L("Generating skirt")); this->_make_skirt(); } this->set_done(psSkirt); @@ -1489,7 +1489,7 @@ void Print::process() if (this->set_started(psBrim)) { m_brim.clear(); if (m_config.brim_width > 0) { - this->set_status(88, "Generating brim"); + this->set_status(88, L("Generating brim")); this->_make_brim(); } this->set_done(psBrim); @@ -1497,7 +1497,7 @@ void Print::process() if (this->set_started(psWipeTower)) { m_wipe_tower_data.clear(); if (this->has_wipe_tower()) { - //this->set_status(95, "Generating wipe tower"); + //this->set_status(95, L("Generating wipe tower")); this->_make_wipe_tower(); } this->set_done(psWipeTower); @@ -1514,7 +1514,8 @@ std::string Print::export_gcode(const std::string &path_template, GCodePreviewDa // output everything to a G-code file // The following call may die if the output_filename_format template substitution fails. std::string path = this->output_filepath(path_template); - std::string message = "Exporting G-code"; + std::string message = L("Exporting G-code"); + // #ys_FIXME_localization if (! path.empty() && preview_data == nullptr) { // Only show the path if preview_data is not set -> running from command line. message += " to "; diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 3e1fc5c3d..f2aba0e97 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -92,9 +92,9 @@ void PrintConfigDef::init_common_params() def->default_value = new ConfigOptionString(""); def = this->add("printhost_cafile", coString); - def->label = "HTTPS CA File"; - def->tooltip = "Custom CA certificate file can be specified for HTTPS OctoPrint connections, in crt/pem format. " - "If left blank, the default OS CA certificate repository is used."; + def->label = L("HTTPS CA File"); + def->tooltip = L("Custom CA certificate file can be specified for HTTPS OctoPrint connections, in crt/pem format. " + "If left blank, the default OS CA certificate repository is used."); def->mode = comAdvanced; def->default_value = new ConfigOptionString(""); } @@ -145,6 +145,7 @@ void PrintConfigDef::init_fff_params() def->default_value = new ConfigOptionString(""); def = this->add("bottom_solid_layers", coInt); + //TRN To be shown in Print Settings "Bottom solid layers" def->label = L("Bottom"); def->category = L("Layers and Perimeters"); def->tooltip = L("Number of solid layers to generate on bottom surfaces."); @@ -913,10 +914,10 @@ void PrintConfigDef::init_fff_params() def->default_value = new ConfigOptionEnum(gcfRepRap); def = this->add("gcode_label_objects", coBool); - def->label = "Label objects"; - def->tooltip = "Enable this to add comments into the G-Code labeling print moves with what object they belong to," + def->label = L("Label objects"); + def->tooltip = L("Enable this to add comments into the G-Code labeling print moves with what object they belong to," " which is useful for the Octoprint CancelObject plugin. This settings is NOT compatible with " - "Single Extruder Multi Material setup and Wipe into Object / Wipe into Infill."; + "Single Extruder Multi Material setup and Wipe into Object / Wipe into Infill."); def->mode = comAdvanced; def->default_value = new ConfigOptionBool(0); @@ -2038,6 +2039,7 @@ void PrintConfigDef::init_fff_params() def->default_value = new ConfigOptionFloatOrPercent(15, false); def = this->add("top_solid_layers", coInt); + //TRN To be shown in Print Settings "Top solid layers" def->label = L("Top"); def->category = L("Layers and Perimeters"); def->tooltip = L("Number of solid layers to generate on top surfaces."); @@ -2141,7 +2143,7 @@ void PrintConfigDef::init_fff_params() def = this->add("wipe_tower_rotation_angle", coFloat); def->label = L("Wipe tower rotation angle"); def->tooltip = L("Wipe tower rotation angle with respect to x-axis "); - def->sidetext = L("degrees"); + def->sidetext = L("°"); def->mode = comAdvanced; def->default_value = new ConfigOptionFloat(0.); diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index bb03d1e9d..fddb71193 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -2,6 +2,7 @@ #include "BoundingBox.hpp" #include "ClipperUtils.hpp" #include "Geometry.hpp" +#include "I18N.hpp" #include "SupportMaterial.hpp" #include "Surface.hpp" #include "Slicing.hpp" @@ -17,6 +18,10 @@ #include +//! macro used to mark string used at localization, +//! return same string +#define L(s) Slic3r::I18N::translate(s) + #ifdef SLIC3R_DEBUG_SLICE_PROCESSING #define SLIC3R_DEBUG #endif @@ -102,7 +107,7 @@ void PrintObject::slice() { if (! this->set_started(posSlice)) return; - m_print->set_status(10, "Processing triangulated mesh"); + m_print->set_status(10, L("Processing triangulated mesh")); std::vector layer_height_profile; this->update_layer_height_profile(*this->model_object(), m_slicing_params, layer_height_profile); m_print->throw_if_canceled(); @@ -133,7 +138,7 @@ void PrintObject::make_perimeters() if (! this->set_started(posPerimeters)) return; - m_print->set_status(20, "Generating perimeters"); + m_print->set_status(20, L("Generating perimeters")); BOOST_LOG_TRIVIAL(info) << "Generating perimeters..." << log_memory_info(); // merge slices if they were split into types @@ -243,7 +248,7 @@ void PrintObject::prepare_infill() if (! this->set_started(posPrepareInfill)) return; - m_print->set_status(30, "Preparing infill"); + m_print->set_status(30, L("Preparing infill")); // This will assign a type (top/bottom/internal) to $layerm->slices. // Then the classifcation of $layerm->slices is transfered onto @@ -383,7 +388,7 @@ void PrintObject::generate_support_material() if (this->set_started(posSupportMaterial)) { this->clear_support_layers(); if ((m_config.support_material || m_config.raft_layers > 0) && m_layers.size() > 1) { - m_print->set_status(85, "Generating support material"); + m_print->set_status(85, L("Generating support material")); this->_generate_support_material(); m_print->throw_if_canceled(); } else { diff --git a/src/slic3r/GUI/BackgroundSlicingProcess.cpp b/src/slic3r/GUI/BackgroundSlicingProcess.cpp index e5135ef43..2a61e3ce7 100644 --- a/src/slic3r/GUI/BackgroundSlicingProcess.cpp +++ b/src/slic3r/GUI/BackgroundSlicingProcess.cpp @@ -28,6 +28,7 @@ #include #include #include +#include "I18N.hpp" namespace Slic3r { @@ -81,13 +82,14 @@ void BackgroundSlicingProcess::process_fff() std::string export_path = m_fff_print->print_statistics().finalize_output_path(m_export_path); if (copy_file(m_temp_output_path, export_path) != 0) throw std::runtime_error("Copying of the temporary G-code to the output G-code failed"); - m_print->set_status(95, "Running post-processing scripts"); + m_print->set_status(95, L("Running post-processing scripts")); run_post_process_scripts(export_path, m_fff_print->config()); - m_print->set_status(100, "G-code file exported to " + export_path); + // #ys_FIXME_localization + m_print->set_status(100, L("G-code file exported to ") + export_path); } else if (! m_upload_job.empty()) { prepare_upload(); } else { - m_print->set_status(100, "Slicing complete"); + m_print->set_status(100, L("Slicing complete")); } this->set_step_done(bspsGCodeFinalize); } @@ -101,11 +103,12 @@ void BackgroundSlicingProcess::process_sla() if (! m_export_path.empty()) { const std::string export_path = m_sla_print->print_statistics().finalize_output_path(m_export_path); m_sla_print->export_raster(export_path); - m_print->set_status(100, "Masked SLA file exported to " + export_path); + // #ys_FIXME_localization + m_print->set_status(100, L("Masked SLA file exported to ") + export_path); } else if (! m_upload_job.empty()) { prepare_upload(); } else { - m_print->set_status(100, "Slicing complete"); + m_print->set_status(100, L("Slicing complete")); } this->set_step_done(bspsGCodeFinalize); } @@ -394,7 +397,7 @@ void BackgroundSlicingProcess::prepare_upload() / boost::filesystem::unique_path("." SLIC3R_APP_KEY ".upload.%%%%-%%%%-%%%%-%%%%"); if (m_print == m_fff_print) { - m_print->set_status(95, "Running post-processing scripts"); + m_print->set_status(95, L("Running post-processing scripts")); if (copy_file(m_temp_output_path, source_path.string()) != 0) { throw std::runtime_error("Copying of the temporary G-code to the output G-code failed"); } @@ -405,7 +408,8 @@ void BackgroundSlicingProcess::prepare_upload() m_sla_print->export_raster(source_path.string(), m_upload_job.upload_data.upload_path.string()); } - m_print->set_status(100, (boost::format("Scheduling upload to `%1%`. See Window -> Print Host Upload Queue") % m_upload_job.printhost->get_host()).str()); + // #ys_FIXME_localization + m_print->set_status(100, (boost::format(L("Scheduling upload to `%1%`. See Window -> Print Host Upload Queue")) % m_upload_job.printhost->get_host()).str()); m_upload_job.upload_data.source_path = std::move(source_path); diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 586ab910f..490c685ad 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -795,7 +795,7 @@ bool GLCanvas3D::WarningTexture::_generate(const std::string& msg_utf8, const GL if (msg_utf8.empty()) return false; - wxString msg = GUI::from_u8(msg_utf8); + wxString msg = _(msg_utf8);//GUI::from_u8(msg_utf8); wxMemoryDC memDC; diff --git a/src/slic3r/GUI/GUI_ObjectSettings.cpp b/src/slic3r/GUI/GUI_ObjectSettings.cpp index b7ba2d4fc..8ea60cff0 100644 --- a/src/slic3r/GUI/GUI_ObjectSettings.cpp +++ b/src/slic3r/GUI/GUI_ObjectSettings.cpp @@ -121,7 +121,7 @@ void ObjectSettings::update_settings_list() if (cat.second.size() == 1 && cat.second[0] == "extruder") continue; - auto optgroup = std::make_shared(m_og->ctrl_parent(), cat.first, config, false, extra_column); + auto optgroup = std::make_shared(m_og->ctrl_parent(), _(cat.first), config, false, extra_column); optgroup->label_width = 15; optgroup->sidetext_width = 5.5; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index 5be5e9a89..017c00143 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -923,7 +923,7 @@ RENDER_AGAIN: // Following is rendered in both editing and non-editing mode: m_imgui->text(""); if (m_clipping_plane_distance == 0.f) - m_imgui->text("Clipping of view: "); + m_imgui->text(_(L("Clipping of view:"))+ " "); else { if (m_imgui->button(_(L("Reset direction")))) { wxGetApp().CallAfter([this](){ diff --git a/src/slic3r/GUI/KBShortcutsDialog.cpp b/src/slic3r/GUI/KBShortcutsDialog.cpp index 066bc54fa..c80ee2ce4 100644 --- a/src/slic3r/GUI/KBShortcutsDialog.cpp +++ b/src/slic3r/GUI/KBShortcutsDialog.cpp @@ -48,9 +48,9 @@ KBShortcutsDialog::KBShortcutsDialog() m_head_bitmaps.reserve(m_full_shortcuts.size()); const wxSize topic_size = wxSize(10 * wxGetApp().em_unit(), -1); - for (auto& sc : m_full_shortcuts) + for (auto& shortcut : m_full_shortcuts) { - auto sizer = sc.second.second == szLeft ? l_sizer : r_sizer; + auto sizer = shortcut.second.second == szLeft ? l_sizer : r_sizer; wxBoxSizer* hsizer = new wxBoxSizer(wxHORIZONTAL); sizer->Add(hsizer, 0, wxEXPAND | wxTOP | wxBOTTOM, 10); @@ -59,7 +59,7 @@ KBShortcutsDialog::KBShortcutsDialog() hsizer->Add(m_head_bitmaps.back(), 0, wxEXPAND | wxLEFT | wxRIGHT, 15); // head - wxStaticText* head = new wxStaticText(panel, wxID_ANY, sc.first, wxDefaultPosition, topic_size); + wxStaticText* head = new wxStaticText(panel, wxID_ANY, shortcut.first, wxDefaultPosition, topic_size); head->SetFont(head_font); hsizer->Add(head, 0, wxALIGN_CENTER_VERTICAL); @@ -68,7 +68,7 @@ KBShortcutsDialog::KBShortcutsDialog() auto grid_sizer = new wxFlexGridSizer(2, 5, 15); sizer->Add(grid_sizer, 0, wxEXPAND | wxLEFT| wxRIGHT, 15); - for (auto pair : sc.second.first) + for (auto pair : shortcut.second.first) { auto shortcut = new wxStaticText(panel, wxID_ANY, _(pair.first)); shortcut->SetFont(bold_font); @@ -124,7 +124,7 @@ void KBShortcutsDialog::fill_shortcuts() main_shortcuts.push_back(Shortcut("+" ,L("Add Instance to selected object "))); main_shortcuts.push_back(Shortcut("-" ,L("Remove Instance from selected object"))); main_shortcuts.push_back(Shortcut("?" ,L("Show keyboard shortcuts list"))); - main_shortcuts.push_back(Shortcut(ctrl+"LeftMouse" ,L("Select multiple object/Move multiple object"))); + main_shortcuts.push_back(Shortcut(ctrl/*+"LeftMouse"*/,L("Press to select multiple object or move multiple object with mouse"))); m_full_shortcuts.push_back(std::make_pair(_(L("Main Shortcuts")), std::make_pair(main_shortcuts, szLeft))); diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 12e59c6f5..fd63889fc 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -518,7 +518,9 @@ void MainFrame::init_menubar() // The camera control accelerators are captured by GLCanvas3D::on_char(). wxMenuItem* item_iso = append_menu_item(viewMenu, wxID_ANY, _(L("Iso")) + sep + "&0", _(L("Iso View")), [this](wxCommandEvent&) { select_view("iso"); }); viewMenu->AppendSeparator(); + //TRN To be shown in the main menu View->Top wxMenuItem* item_top = append_menu_item(viewMenu, wxID_ANY, _(L("Top")) + sep + "&1", _(L("Top View")), [this](wxCommandEvent&) { select_view("top"); }); + //TRN To be shown in the main menu View->Bottom wxMenuItem* item_bottom = append_menu_item(viewMenu, wxID_ANY, _(L("Bottom")) + sep + "&2", _(L("Bottom View")), [this](wxCommandEvent&) { select_view("bottom"); }); wxMenuItem* item_front = append_menu_item(viewMenu, wxID_ANY, _(L("Front")) + sep + "&3", _(L("Front View")), [this](wxCommandEvent&) { select_view("front"); }); wxMenuItem* item_rear = append_menu_item(viewMenu, wxID_ANY, _(L("Rear")) + sep + "&4", _(L("Rear View")), [this](wxCommandEvent&) { select_view("rear"); }); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index f3e4bee25..2d44237bd 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -989,7 +989,7 @@ void Sidebar::show_info_sizer() p->object_info->manifold_warning_icon->SetToolTip(tooltip); } else { - p->object_info->info_manifold->SetLabel(L("Yes")); + p->object_info->info_manifold->SetLabel(_(L("Yes"))); p->object_info->showing_manifold_warning_icon = false; p->object_info->info_manifold->SetToolTip(""); p->object_info->manifold_warning_icon->SetToolTip(""); @@ -2403,7 +2403,7 @@ unsigned int Plater::priv::update_background_process(bool force_validation) // Background data is valid. if ((return_state & UPDATE_BACKGROUND_PROCESS_RESTART) != 0 || (return_state & UPDATE_BACKGROUND_PROCESS_REFRESH_SCENE) != 0 ) - this->statusbar()->set_status_text(L("Ready to slice")); + this->statusbar()->set_status_text(_(L("Ready to slice"))); sidebar->set_btn_label(ActionButtonType::abExport, _(label_btn_export)); sidebar->set_btn_label(ActionButtonType::abSendGCode, _(label_btn_send)); @@ -2441,7 +2441,7 @@ bool Plater::priv::restart_background_process(unsigned int state) // The print is valid and it can be started. if (this->background_process.start()) { this->statusbar()->set_cancel_callback([this]() { - this->statusbar()->set_status_text(L("Cancelling")); + this->statusbar()->set_status_text(_(L("Cancelling"))); this->background_process.stop(); }); return true; @@ -2665,7 +2665,7 @@ void Plater::priv::on_slicing_update(SlicingStatusEvent &evt) } this->statusbar()->set_progress(evt.status.percent); - this->statusbar()->set_status_text(_(L(evt.status.text)) + wxString::FromUTF8("…")); + this->statusbar()->set_status_text(_(evt.status.text) + wxString::FromUTF8("…")); } if (evt.status.flags & (PrintBase::SlicingStatus::RELOAD_SCENE || PrintBase::SlicingStatus::RELOAD_SLA_SUPPORT_POINTS)) { switch (this->printer_technology) { @@ -2724,7 +2724,7 @@ void Plater::priv::on_process_completed(wxCommandEvent &evt) this->statusbar()->set_status_text(message); } if (canceled) - this->statusbar()->set_status_text(L("Cancelled")); + this->statusbar()->set_status_text(_(L("Cancelled"))); this->sidebar->show_sliced_info_sizer(success); diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index fb8147ad2..add192770 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -1678,7 +1678,7 @@ void TabPrinter::build_printhost(ConfigOptionsGroup *optgroup) } auto printhost_browse = [=](wxWindow* parent) { - add_scaled_button(parent, &m_printhost_browse_btn, "browse", _(L(" Browse ")) + dots, wxBU_LEFT | wxBU_EXACTFIT); + add_scaled_button(parent, &m_printhost_browse_btn, "browse", _(L("Browse")) + " "+ dots, wxBU_LEFT | wxBU_EXACTFIT); ScalableButton* btn = m_printhost_browse_btn; btn->SetFont(Slic3r::GUI::wxGetApp().normal_font()); @@ -2057,7 +2057,7 @@ void TabPrinter::build_sla() optgroup->append_single_option_line("area_fill"); optgroup = page->new_optgroup(_(L("Corrections"))); - line = Line{ m_config->def()->get("relative_correction")->full_label, "" }; + line = Line{ _(m_config->def()->get("relative_correction")->full_label), "" }; // std::vector axes{ "X", "Y", "Z" }; std::vector axes{ "XY", "Z" }; int id = 0; @@ -3313,7 +3313,7 @@ void TabSLAMaterial::build() // std::vector axes{ "X", "Y", "Z" }; std::vector axes{ "XY", "Z" }; for (auto& opt_key : corrections) { - auto line = Line{ m_config->def()->get(opt_key)->full_label, "" }; + auto line = Line{ _(m_config->def()->get(opt_key)->full_label), "" }; int id = 0; for (auto& axis : axes) { auto opt = optgroup->get_option(opt_key, id); diff --git a/src/slic3r/GUI/wxExtensions.cpp b/src/slic3r/GUI/wxExtensions.cpp index 1d4dd8f88..124af56ce 100644 --- a/src/slic3r/GUI/wxExtensions.cpp +++ b/src/slic3r/GUI/wxExtensions.cpp @@ -346,6 +346,28 @@ wxBitmap create_scaled_bitmap(wxWindow *win, const std::string& bmp_name_in, con // ObjectDataViewModelNode // ---------------------------------------------------------------------------- +ObjectDataViewModelNode::ObjectDataViewModelNode(ObjectDataViewModelNode* parent, const ItemType type) : + m_parent(parent), + m_type(type), + m_extruder(wxEmptyString) +{ + if (type == itSettings) { + m_name = "Settings to modified"; + } + else if (type == itInstanceRoot) { + m_name = _(L("Instances")); +#ifdef __WXGTK__ + m_container = true; +#endif //__WXGTK__ + } + else if (type == itInstance) { + m_idx = parent->GetChildCount(); + m_name = wxString::Format(_(L("Instance_%d")), m_idx + 1); + + set_action_icon(); + } +} + void ObjectDataViewModelNode::set_action_icon() { m_action_icon_name = m_type == itObject ? "advanced_plus" : @@ -384,7 +406,7 @@ bool ObjectDataViewModelNode::update_settings_digest(const std::vectorGetChildCount(); - m_name = wxString::Format("Instance_%d", m_idx+1); - - set_action_icon(); - } - } + ObjectDataViewModelNode(ObjectDataViewModelNode* parent, const ItemType type); ~ObjectDataViewModelNode() { From e515ef4fbe31e86c7bc225e9965289c2d21a5f72 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Sat, 4 May 2019 14:03:50 +0200 Subject: [PATCH 42/47] Fixed make_cylinder() / make_sphere() functions to produce meshes without errors. --- src/libslic3r/TriangleMesh.cpp | 157 +++++++++++++++------------------ 1 file changed, 71 insertions(+), 86 deletions(-) diff --git a/src/libslic3r/TriangleMesh.cpp b/src/libslic3r/TriangleMesh.cpp index f449ac2b4..128124c97 100644 --- a/src/libslic3r/TriangleMesh.cpp +++ b/src/libslic3r/TriangleMesh.cpp @@ -1847,116 +1847,101 @@ TriangleMesh make_cube(double x, double y, double z) { // Generate the mesh for a cylinder and return it, using // the generated angle to calculate the top mesh triangles. // Default is 360 sides, angle fa is in radians. -TriangleMesh make_cylinder(double r, double h, double fa) { - Pointf3s vertices; - std::vector facets; +TriangleMesh make_cylinder(double r, double h, double fa) +{ + size_t n_steps = (size_t)ceil(2. * PI / fa); + double angle_step = 2. * PI / n_steps; + + Pointf3s vertices; + std::vector facets; + vertices.reserve(2 * n_steps + 2); + facets.reserve(4 * n_steps); // 2 special vertices, top and bottom center, rest are relative to this vertices.emplace_back(Vec3d(0.0, 0.0, 0.0)); vertices.emplace_back(Vec3d(0.0, 0.0, h)); - // adjust via rounding to get an even multiple for any provided angle. - double angle = (2*PI / floor(2*PI / fa)); - // for each line along the polygon approximating the top/bottom of the // circle, generate four points and four facets (2 for the wall, 2 for the // top and bottom. // Special case: Last line shares 2 vertices with the first line. - unsigned id = vertices.size() - 1; - vertices.emplace_back(Vec3d(sin(0) * r , cos(0) * r, 0)); - vertices.emplace_back(Vec3d(sin(0) * r , cos(0) * r, h)); - for (double i = 0; i < 2*PI; i+=angle) { - Vec2d p = Eigen::Rotation2Dd(i) * Eigen::Vector2d(0, r); + Vec2d p = Eigen::Rotation2Dd(0.) * Eigen::Vector2d(0, r); + vertices.emplace_back(Vec3d(p(0), p(1), 0.)); + vertices.emplace_back(Vec3d(p(0), p(1), h)); + for (size_t i = 1; i < n_steps; ++i) { + p = Eigen::Rotation2Dd(angle_step * i) * Eigen::Vector2d(0, r); vertices.emplace_back(Vec3d(p(0), p(1), 0.)); vertices.emplace_back(Vec3d(p(0), p(1), h)); - id = vertices.size() - 1; + int id = (int)vertices.size() - 1; facets.emplace_back(Vec3crd( 0, id - 1, id - 3)); // top facets.emplace_back(Vec3crd(id, 1, id - 2)); // bottom - facets.emplace_back(Vec3crd(id, id - 2, id - 3)); // upper-right of side + facets.emplace_back(Vec3crd(id, id - 2, id - 3)); // upper-right of side facets.emplace_back(Vec3crd(id, id - 3, id - 1)); // bottom-left of side } // Connect the last set of vertices with the first. - facets.emplace_back(Vec3crd( 2, 0, id - 1)); - facets.emplace_back(Vec3crd( 1, 3, id)); - facets.emplace_back(Vec3crd(id, 3, 2)); - facets.emplace_back(Vec3crd(id, 2, id - 1)); + int id = (int)vertices.size() - 1; + facets.emplace_back(Vec3crd( 0, 2, id - 1)); + facets.emplace_back(Vec3crd( 3, 1, id)); + facets.emplace_back(Vec3crd(id, 2, 3)); + facets.emplace_back(Vec3crd(id, id - 1, 2)); - TriangleMesh mesh(vertices, facets); - return mesh; + return TriangleMesh(std::move(vertices), std::move(facets)); } // Generates mesh for a sphere centered about the origin, using the generated angle // to determine the granularity. // Default angle is 1 degree. -TriangleMesh make_sphere(double rho, double fa) { - Pointf3s vertices; - std::vector facets; +//FIXME better to discretize an Icosahedron recursively http://www.songho.ca/opengl/gl_sphere.html +TriangleMesh make_sphere(double radius, double fa) +{ + int sectorCount = ceil(2. * M_PI / fa); + int stackCount = ceil(M_PI / fa); + float sectorStep = 2. * M_PI / sectorCount; + float stackStep = M_PI / stackCount; - // Algorithm: - // Add points one-by-one to the sphere grid and form facets using relative coordinates. - // Sphere is composed effectively of a mesh of stacked circles. + Pointf3s vertices; + vertices.reserve((stackCount - 1) * sectorCount + 2); + for (int i = 0; i <= stackCount; ++ i) { + // from pi/2 to -pi/2 + double stackAngle = 0.5 * M_PI - stackStep * i; + double xy = radius * cos(stackAngle); + double z = radius * sin(stackAngle); + if (i == 0 || i == stackCount) + vertices.emplace_back(Vec3d(xy, 0., z)); + else + for (int j = 0; j < sectorCount; ++ j) { + // from 0 to 2pi + double sectorAngle = sectorStep * j; + vertices.emplace_back(Vec3d(xy * cos(sectorAngle), xy * sin(sectorAngle), z)); + } + } - // adjust via rounding to get an even multiple for any provided angle. - double angle = (2*PI / floor(2*PI / fa)); - - // Ring to be scaled to generate the steps of the sphere - std::vector ring; - for (double i = 0; i < 2*PI; i+=angle) { - ring.emplace_back(i); - } - const size_t steps = ring.size(); - const double increment = (double)(1.0 / (double)steps); - - // special case: first ring connects to 0,0,0 - // insert and form facets. - vertices.emplace_back(Vec3d(0.0, 0.0, -rho)); - size_t id = vertices.size(); - for (size_t i = 0; i < ring.size(); i++) { - // Fixed scaling - const double z = -rho + increment*rho*2.0; - // radius of the circle for this step. - const double r = sqrt(abs(rho*rho - z*z)); - Vec2d b = Eigen::Rotation2Dd(ring[i]) * Eigen::Vector2d(0, r); - vertices.emplace_back(Vec3d(b(0), b(1), z)); - facets.emplace_back((i == 0) ? Vec3crd(1, 0, ring.size()) : Vec3crd(id, 0, id - 1)); - ++ id; - } - - // General case: insert and form facets for each step, joining it to the ring below it. - for (size_t s = 2; s < steps - 1; s++) { - const double z = -rho + increment*(double)s*2.0*rho; - const double r = sqrt(abs(rho*rho - z*z)); - - for (size_t i = 0; i < ring.size(); i++) { - Vec2d b = Eigen::Rotation2Dd(ring[i]) * Eigen::Vector2d(0, r); - vertices.emplace_back(Vec3d(b(0), b(1), z)); - if (i == 0) { - // wrap around - facets.emplace_back(Vec3crd(id + ring.size() - 1 , id, id - 1)); - facets.emplace_back(Vec3crd(id, id - ring.size(), id - 1)); - } else { - facets.emplace_back(Vec3crd(id , id - ring.size(), (id - 1) - ring.size())); - facets.emplace_back(Vec3crd(id, id - 1 - ring.size() , id - 1)); - } - id++; - } - } - - - // special case: last ring connects to 0,0,rho*2.0 - // only form facets. - vertices.emplace_back(Vec3d(0.0, 0.0, rho)); - for (size_t i = 0; i < ring.size(); i++) { - if (i == 0) { - // third vertex is on the other side of the ring. - facets.emplace_back(Vec3crd(id, id - ring.size(), id - 1)); - } else { - facets.emplace_back(Vec3crd(id, id - ring.size() + i, id - ring.size() + (i - 1))); - } - } - id++; - TriangleMesh mesh(vertices, facets); - return mesh; + std::vector facets; + facets.reserve(2 * (stackCount - 1) * sectorCount); + for (int i = 0; i < stackCount; ++ i) { + // Beginning of current stack. + int k1 = (i == 0) ? 0 : (1 + (i - 1) * sectorCount); + int k1_first = k1; + // Beginning of next stack. + int k2 = (i == 0) ? 1 : (k1 + sectorCount); + int k2_first = k2; + for (int j = 0; j < sectorCount; ++ j) { + // 2 triangles per sector excluding first and last stacks + int k1_next = k1; + int k2_next = k2; + if (i != 0) { + k1_next = (j + 1 == sectorCount) ? k1_first : (k1 + 1); + facets.emplace_back(Vec3crd(k1, k2, k1_next)); + } + if (i + 1 != stackCount) { + k2_next = (j + 1 == sectorCount) ? k2_first : (k2 + 1); + facets.emplace_back(Vec3crd(k1_next, k2, k2_next)); + } + k1 = k1_next; + k2 = k2_next; + } + } + return TriangleMesh(std::move(vertices), std::move(facets)); } } From 045879f68a07758aef43e4ae475d664f1c12f418 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Sat, 4 May 2019 21:40:58 +0200 Subject: [PATCH 43/47] Fix of a crash when deleting an object while it is edited with the smooth variable layer editing tool. --- src/slic3r/GUI/GLCanvas3D.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 490c685ad..005b9db9d 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -261,7 +261,7 @@ void GLCanvas3D::LayersEditing::select_object(const Model &model, int object_id) // Maximum height of an object changes when the object gets rotated or scaled. // Changing maximum height of an object will invalidate the layer heigth editing profile. // m_model_object->raw_bounding_box() is cached, therefore it is cheap even if this method is called frequently. - float new_max_z = (m_model_object == nullptr) ? 0.f : m_model_object->raw_bounding_box().size().z(); + float new_max_z = (model_object_new == nullptr) ? 0.f : model_object_new->raw_bounding_box().size().z(); if (m_model_object != model_object_new || this->last_object_id != object_id || m_object_max_z != new_max_z || (model_object_new != nullptr && m_model_object->id() != model_object_new->id())) { m_layer_height_profile.clear(); From cf3b9922693caaf3337a241d3fcc45ac7fb984a7 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Mon, 6 May 2019 14:48:59 +0200 Subject: [PATCH 44/47] GCode.cpp: Update the 'current_extruder' placeholder even if filament start gcode is empty --- src/libslic3r/GCode.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index bf1d24e8a..8e48a56d6 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -201,12 +201,13 @@ std::string WipeTowerIntegration::append_tcr(GCode &gcodegen, const WipeTower::T // Let the m_writer know the current extruder_id, but ignore the generated G-code. if (new_extruder_id >= 0 && gcodegen.writer().need_toolchange(new_extruder_id)) gcodegen.writer().toolchange(new_extruder_id); + gcodegen.placeholder_parser().set("current_extruder", new_extruder_id); + // Always append the filament start G-code even if the extruder did not switch, // because the wipe tower resets the linear advance and we want it to be re-enabled. const std::string &start_filament_gcode = gcodegen.config().start_filament_gcode.get_at(new_extruder_id); if (! start_filament_gcode.empty()) { // Process the start_filament_gcode for the active filament only. - gcodegen.placeholder_parser().set("current_extruder", new_extruder_id); DynamicConfig config; config.set_key_value("filament_extruder_id", new ConfigOptionInt(new_extruder_id)); gcode += gcodegen.placeholder_parser_process("start_filament_gcode", start_filament_gcode, new_extruder_id, &config); From 1634cd1a3cb1e1a2a8ee44002873ce8c462d14cf Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Mon, 6 May 2019 16:57:46 +0200 Subject: [PATCH 45/47] Fix asan crash on statistics step --- src/libslic3r/SLAPrint.hpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/libslic3r/SLAPrint.hpp b/src/libslic3r/SLAPrint.hpp index f43c3bf7a..64b2160b0 100644 --- a/src/libslic3r/SLAPrint.hpp +++ b/src/libslic3r/SLAPrint.hpp @@ -176,6 +176,8 @@ private: { return level(r1) < level(r2); }); + + if(it == cont.end()) return it; T diff = std::abs(level(*it) - lvl); From c9cd4818c7e8e15e48f1f88e6a29af9f1a2f5182 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Mon, 6 May 2019 18:28:23 +0200 Subject: [PATCH 46/47] Improvements of High DPI scaling on Windows. --- src/slic3r/GUI/GUI_App.cpp | 16 ++++++++++------ src/slic3r/GUI/GUI_App.hpp | 2 +- src/slic3r/GUI/GUI_Utils.cpp | 4 +++- src/slic3r/GUI/GUI_Utils.hpp | 27 +++++++++++++++------------ src/slic3r/GUI/MainFrame.cpp | 19 ++++++++++--------- src/slic3r/GUI/Plater.cpp | 2 ++ src/slic3r/GUI/ProgressStatusBar.cpp | 1 + src/slic3r/GUI/Tab.cpp | 1 + src/slic3r/GUI/wxExtensions.cpp | 6 +++++- 9 files changed, 48 insertions(+), 30 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 47141a664..4eb6c5aa8 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -340,15 +340,19 @@ void GUI_App::init_fonts() #endif /*__WXMAC__*/ } -void GUI_App::update_fonts() +void GUI_App::update_fonts(const MainFrame *main_frame) { /* Only normal and bold fonts are used for an application rescale, * because of under MSW small and normal fonts are the same. * To avoid same rescaling twice, just fill this values * from rescaled MainFrame */ - m_normal_font = mainframe->normal_font(); - m_bold_font = mainframe->normal_font().Bold(); + if (main_frame == nullptr) + main_frame = this->mainframe; + m_normal_font = main_frame->normal_font(); + m_small_font = m_normal_font; + m_bold_font = main_frame->normal_font().Bold(); + m_em_unit = main_frame->em_unit(); } void GUI_App::set_label_clr_modified(const wxColour& clr) { @@ -773,14 +777,14 @@ void GUI_App::add_config_menu(wxMenuBar *menu) // to notify the user whether he is aware that some preset changes will be lost. bool GUI_App::check_unsaved_changes() { - std::string dirty; + wxString dirty; PrinterTechnology printer_technology = preset_bundle->printers.get_edited_preset().printer_technology(); for (Tab *tab : tabs_list) if (tab->supports_printer_technology(printer_technology) && tab->current_preset_is_dirty()) if (dirty.empty()) - dirty = tab->name(); + dirty = _(tab->name()); else - dirty += std::string(", ") + tab->name(); + dirty += wxString(", ") + _(tab->name()); if (dirty.empty()) // No changes, the application may close or reload presets. return true; diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index 3a6a443f0..5c2ead49c 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -100,7 +100,7 @@ public: void init_label_colours(); void update_label_colours_from_appconfig(); void init_fonts(); - void update_fonts(); + void update_fonts(const MainFrame *main_frame = nullptr); void set_label_clr_modified(const wxColour& clr); void set_label_clr_sys(const wxColour& clr); diff --git a/src/slic3r/GUI/GUI_Utils.cpp b/src/slic3r/GUI/GUI_Utils.cpp index 6dc5c5b4c..754e69351 100644 --- a/src/slic3r/GUI/GUI_Utils.cpp +++ b/src/slic3r/GUI/GUI_Utils.cpp @@ -64,6 +64,7 @@ template typename F::FN winapi_get_function(const wchar_t *dll, const c } #endif +// If called with nullptr, a DPI for the primary monitor is returned. int get_dpi_for_window(wxWindow *window) { #ifdef _WIN32 @@ -82,7 +83,8 @@ int get_dpi_for_window(wxWindow *window) static auto GetDpiForWindow_fn = winapi_get_function(L"User32.dll", "GetDpiForWindow"); static auto GetDpiForMonitor_fn = winapi_get_function(L"Shcore.dll", "GetDpiForMonitor"); - const HWND hwnd = window->GetHandle(); + // Desktop Window is the window of the primary monitor. + const HWND hwnd = (window == nullptr) ? ::GetDesktopWindow() : window->GetHandle(); if (GetDpiForWindow_fn != nullptr) { // We're on Windows 10, we have per-screen DPI settings diff --git a/src/slic3r/GUI/GUI_Utils.hpp b/src/slic3r/GUI/GUI_Utils.hpp index 25cf25b16..8cefb68d0 100644 --- a/src/slic3r/GUI/GUI_Utils.hpp +++ b/src/slic3r/GUI/GUI_Utils.hpp @@ -59,13 +59,16 @@ public: : P(parent, id, title, pos, size, style, name) { m_scale_factor = (float)get_dpi_for_window(this) / (float)DPI_DEFAULT; - m_normal_font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); + m_prev_scale_factor = m_scale_factor; + float scale_primary_display = (float)get_dpi_for_window(nullptr) / (float)DPI_DEFAULT; + m_normal_font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); + if (std::abs(m_scale_factor - scale_primary_display) > 1e-6) + m_normal_font = m_normal_font.Scale(m_scale_factor / scale_primary_display); + // An analog of em_unit value from GUI_App. m_em_unit = std::max(10, 10 * m_scale_factor); - m_prev_scale_factor = m_scale_factor; - - recalc_font(); +// recalc_font(); this->Bind(EVT_DPI_CHANGED, [this](const DpiChangedEvent &evt) { m_scale_factor = (float)evt.dpi / (float)DPI_DEFAULT; @@ -107,7 +110,7 @@ public: float prev_scale_factor() const { return m_prev_scale_factor; } int em_unit() const { return m_em_unit; } - int font_size() const { return m_font_size; } +// int font_size() const { return m_font_size; } const wxFont& normal_font() const { return m_normal_font; } protected: @@ -116,19 +119,19 @@ protected: private: float m_scale_factor; int m_em_unit; - int m_font_size; +// int m_font_size; wxFont m_normal_font; float m_prev_scale_factor; bool m_can_rescale{ true }; - void recalc_font() - { - wxClientDC dc(this); - const auto metrics = dc.GetFontMetrics(); - m_font_size = metrics.height; +// void recalc_font() +// { +// wxClientDC dc(this); +// const auto metrics = dc.GetFontMetrics(); +// m_font_size = metrics.height; // m_em_unit = metrics.averageWidth; - } +// } // check if new scale is differ from previous bool is_new_scale_factor() const { return fabs(m_scale_factor - m_prev_scale_factor) > 0.001; } diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index fd63889fc..cf5cd416d 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -36,6 +36,12 @@ MainFrame::MainFrame() : DPIFrame(NULL, wxID_ANY, SLIC3R_BUILD, wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE, "mainframe"), m_printhost_queue_dlg(new PrintHostQueueDialog(this)) { + // Fonts were created by the DPIFrame constructor for the monitor, on which the window opened. + wxGetApp().update_fonts(this); + this->SetFont(this->normal_font()); + // initialize default width_unit according to the width of the one symbol ("m") of the currently active font of this window. + wxGetApp().set_em_unit(std::max(10, GetTextExtent("m").x - 1)); + // Load the icon either from the exe, or from the ico file. #if _WIN32 { @@ -54,11 +60,6 @@ DPIFrame(NULL, wxID_ANY, SLIC3R_BUILD, wxDefaultPosition, wxDefaultSize, wxDEFAU SLIC3R_VERSION + _(L(" - Remember to check for updates at http://github.com/prusa3d/slic3r/releases"))); - - // initialize default width_unit according to the width of the one symbol ("x") of the current system font - const wxSize size = GetTextExtent("m"); - wxGetApp().set_em_unit(std::max(10, size.x - 1)); - /* Load default preset bitmaps before a tabpanel initialization, * but after filling of an em_unit value */ @@ -141,6 +142,7 @@ void MainFrame::init_tabpanel() // wxNB_NOPAGETHEME: Disable Windows Vista theme for the Notebook background. The theme performance is terrible on Windows 10 // with multiple high resolution displays connected. m_tabpanel = new wxNotebook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNB_TOP | wxTAB_TRAVERSAL | wxNB_NOPAGETHEME); + m_tabpanel->SetFont(Slic3r::GUI::wxGetApp().normal_font()); m_tabpanel->Bind(wxEVT_NOTEBOOK_PAGE_CHANGED, [this](wxEvent&) { auto panel = m_tabpanel->GetCurrentPage(); @@ -278,10 +280,9 @@ bool MainFrame::can_delete_all() const void MainFrame::on_dpi_changed(const wxRect &suggested_rect) { wxGetApp().update_fonts(); - - // _strange_ workaround for correct em_unit calculation - const int new_em_unit = scale_factor() * 10; - wxGetApp().set_em_unit(std::max(10, new_em_unit)); + this->SetFont(this->normal_font()); + // initialize default width_unit according to the width of the one symbol ("m") of the currently active font of this window. + wxGetApp().set_em_unit(std::max(10, GetTextExtent("m").x - 1)); /* Load default preset bitmaps before a tabpanel initialization, * but after filling of an em_unit value diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 2d44237bd..8130990f0 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1377,6 +1377,8 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) , view_toolbar(GLToolbar::Radio) #endif // ENABLE_SVG_ICONS { + this->q->SetFont(Slic3r::GUI::wxGetApp().normal_font()); + arranging = false; rotoptimizing = false; background_process.set_fff_print(&fff_print); diff --git a/src/slic3r/GUI/ProgressStatusBar.cpp b/src/slic3r/GUI/ProgressStatusBar.cpp index 83c5e5b24..2f1937623 100644 --- a/src/slic3r/GUI/ProgressStatusBar.cpp +++ b/src/slic3r/GUI/ProgressStatusBar.cpp @@ -32,6 +32,7 @@ ProgressStatusBar::ProgressStatusBar(wxWindow *parent, int id): m_prog->Hide(); m_cancelbutton->Hide(); + self->SetFont(GUI::wxGetApp().normal_font()); self->SetFieldsCount(3); int w[] = {-1, 150, 155}; self->SetStatusWidths(3, w); diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index add192770..b97623648 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -42,6 +42,7 @@ Tab::Tab(wxNotebook* parent, const wxString& title, const char* name) : m_parent(parent), m_title(title), m_name(name) { Create(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBK_LEFT | wxTAB_TRAVERSAL, name); + this->SetFont(Slic3r::GUI::wxGetApp().normal_font()); set_type(); m_compatible_printers.type = Preset::TYPE_PRINTER; diff --git a/src/slic3r/GUI/wxExtensions.cpp b/src/slic3r/GUI/wxExtensions.cpp index 124af56ce..bb6ab1e16 100644 --- a/src/slic3r/GUI/wxExtensions.cpp +++ b/src/slic3r/GUI/wxExtensions.cpp @@ -299,9 +299,13 @@ int em_unit(wxWindow* win) { if (win) { - Slic3r::GUI::DPIDialog* dlg = dynamic_cast(Slic3r::GUI::find_toplevel_parent(win)); + wxTopLevelWindow *toplevel = Slic3r::GUI::find_toplevel_parent(win); + Slic3r::GUI::DPIDialog* dlg = dynamic_cast(toplevel); if (dlg) return dlg->em_unit(); + Slic3r::GUI::DPIFrame* frame = dynamic_cast(toplevel); + if (frame) + return frame->em_unit(); } return Slic3r::GUI::wxGetApp().em_unit(); From 4fdcc99d35e7a20c9f76e870583dc4aec4152156 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Mon, 6 May 2019 18:30:59 +0200 Subject: [PATCH 47/47] Require Boost 1.64.0 and newer on Linux & OSX due to the Boost::process library --- CMakeLists.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3e59090e3..9477f68d8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -234,7 +234,11 @@ if(SLIC3R_STATIC) endif() #set(Boost_DEBUG ON) # set(Boost_COMPILER "-vc120") -find_package(Boost REQUIRED COMPONENTS system filesystem thread log locale regex) +if(NOT WIN32) + # boost::process was introduced first in version 1.64.0 + set(MINIMUM_BOOST_VERSION "1.64.0") +endif() +find_package(Boost ${MINIMUM_BOOST_VERSION} REQUIRED COMPONENTS system filesystem thread log locale regex) if(Boost_FOUND) include_directories(${Boost_INCLUDE_DIRS}) if (APPLE)