mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-24 15:13:58 -06:00
Merge branch 'dev' of https://github.com/Prusa3d/PrusaSlicer into dev
This commit is contained in:
commit
8d4dd294b2
5 changed files with 97 additions and 61 deletions
|
@ -1236,7 +1236,8 @@ std::string Print::validate() const
|
||||||
|
|
||||||
// The comparison of the profiles is not just about element-wise equality, some layers may not be
|
// The comparison of the profiles is not just about element-wise equality, some layers may not be
|
||||||
// explicitely included. Always remember z and height of last reference layer that in the vector
|
// explicitely included. Always remember z and height of last reference layer that in the vector
|
||||||
// and compare to that.
|
// and compare to that. In case some layers are in the vectors multiple times, only the last entry is
|
||||||
|
// taken into account and compared.
|
||||||
size_t i = 0; // index into tested profile
|
size_t i = 0; // index into tested profile
|
||||||
size_t j = 0; // index into reference profile
|
size_t j = 0; // index into reference profile
|
||||||
coordf_t ref_z = -1.;
|
coordf_t ref_z = -1.;
|
||||||
|
@ -1244,8 +1245,12 @@ std::string Print::validate() const
|
||||||
coordf_t ref_height = -1.;
|
coordf_t ref_height = -1.;
|
||||||
while (i < layer_height_profile.size()) {
|
while (i < layer_height_profile.size()) {
|
||||||
coordf_t this_z = layer_height_profile[i];
|
coordf_t this_z = layer_height_profile[i];
|
||||||
|
// find the last entry with this z
|
||||||
|
while (i+2 < layer_height_profile.size() && layer_height_profile[i+2] == this_z)
|
||||||
|
i += 2;
|
||||||
|
|
||||||
coordf_t this_height = layer_height_profile[i+1];
|
coordf_t this_height = layer_height_profile[i+1];
|
||||||
if (next_ref_z < this_z + EPSILON) {
|
if (ref_height < -1. || next_ref_z < this_z + EPSILON) {
|
||||||
ref_z = next_ref_z;
|
ref_z = next_ref_z;
|
||||||
do { // one layer can be in the vector several times
|
do { // one layer can be in the vector several times
|
||||||
ref_height = layer_height_profile_tallest[j+1];
|
ref_height = layer_height_profile_tallest[j+1];
|
||||||
|
|
|
@ -1094,7 +1094,7 @@ void GLCanvas3D::LegendTexture::render(const GLCanvas3D& canvas) const
|
||||||
wxDEFINE_EVENT(EVT_GLCANVAS_INIT, SimpleEvent);
|
wxDEFINE_EVENT(EVT_GLCANVAS_INIT, SimpleEvent);
|
||||||
wxDEFINE_EVENT(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS, SimpleEvent);
|
wxDEFINE_EVENT(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS, SimpleEvent);
|
||||||
wxDEFINE_EVENT(EVT_GLCANVAS_OBJECT_SELECT, SimpleEvent);
|
wxDEFINE_EVENT(EVT_GLCANVAS_OBJECT_SELECT, SimpleEvent);
|
||||||
wxDEFINE_EVENT(EVT_GLCANVAS_RIGHT_CLICK, Vec2dEvent);
|
wxDEFINE_EVENT(EVT_GLCANVAS_RIGHT_CLICK, RBtnEvent);
|
||||||
wxDEFINE_EVENT(EVT_GLCANVAS_REMOVE_OBJECT, SimpleEvent);
|
wxDEFINE_EVENT(EVT_GLCANVAS_REMOVE_OBJECT, SimpleEvent);
|
||||||
wxDEFINE_EVENT(EVT_GLCANVAS_ARRANGE, SimpleEvent);
|
wxDEFINE_EVENT(EVT_GLCANVAS_ARRANGE, SimpleEvent);
|
||||||
wxDEFINE_EVENT(EVT_GLCANVAS_SELECT_ALL, SimpleEvent);
|
wxDEFINE_EVENT(EVT_GLCANVAS_SELECT_ALL, SimpleEvent);
|
||||||
|
@ -3012,15 +3012,16 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
|
||||||
wxGetApp().obj_manipul()->set_dirty();
|
wxGetApp().obj_manipul()->set_dirty();
|
||||||
// forces a frame render to update the view before the context menu is shown
|
// forces a frame render to update the view before the context menu is shown
|
||||||
render();
|
render();
|
||||||
|
|
||||||
Vec2d logical_pos = pos.cast<double>();
|
|
||||||
#if ENABLE_RETINA_GL
|
|
||||||
const float factor = m_retina_helper->get_scale_factor();
|
|
||||||
logical_pos = logical_pos.cwiseQuotient(Vec2d(factor, factor));
|
|
||||||
#endif // ENABLE_RETINA_GL
|
|
||||||
post_event(Vec2dEvent(EVT_GLCANVAS_RIGHT_CLICK, logical_pos));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Vec2d logical_pos = pos.cast<double>();
|
||||||
|
#if ENABLE_RETINA_GL
|
||||||
|
const float factor = m_retina_helper->get_scale_factor();
|
||||||
|
logical_pos = logical_pos.cwiseQuotient(Vec2d(factor, factor));
|
||||||
|
#endif // ENABLE_RETINA_GL
|
||||||
|
if (!m_mouse.dragging)
|
||||||
|
// do not post the event if the user is panning the scene
|
||||||
|
post_event(RBtnEvent(EVT_GLCANVAS_RIGHT_CLICK, { logical_pos, m_hover_volume_idxs.empty() }));
|
||||||
}
|
}
|
||||||
|
|
||||||
mouse_up_cleanup();
|
mouse_up_cleanup();
|
||||||
|
@ -3372,7 +3373,7 @@ void GLCanvas3D::do_mirror(const std::string& snapshot_type)
|
||||||
void GLCanvas3D::set_camera_zoom(double zoom)
|
void GLCanvas3D::set_camera_zoom(double zoom)
|
||||||
{
|
{
|
||||||
const Size& cnv_size = get_canvas_size();
|
const Size& cnv_size = get_canvas_size();
|
||||||
m_camera.set_zoom(zoom, _max_bounding_box(false, false), cnv_size.get_width(), cnv_size.get_height());
|
m_camera.set_zoom(zoom, _max_bounding_box(false, true), cnv_size.get_width(), cnv_size.get_height());
|
||||||
m_dirty = true;
|
m_dirty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -71,6 +71,8 @@ public:
|
||||||
wxDECLARE_EVENT(EVT_GLCANVAS_OBJECT_SELECT, SimpleEvent);
|
wxDECLARE_EVENT(EVT_GLCANVAS_OBJECT_SELECT, SimpleEvent);
|
||||||
|
|
||||||
using Vec2dEvent = Event<Vec2d>;
|
using Vec2dEvent = Event<Vec2d>;
|
||||||
|
// _bool_ value is used as a indicator of selection in the 3DScene
|
||||||
|
using RBtnEvent = Event<std::pair<Vec2d, bool>>;
|
||||||
template <size_t N> using Vec2dsEvent = ArrayEvent<Vec2d, N>;
|
template <size_t N> using Vec2dsEvent = ArrayEvent<Vec2d, N>;
|
||||||
|
|
||||||
using Vec3dEvent = Event<Vec3d>;
|
using Vec3dEvent = Event<Vec3d>;
|
||||||
|
@ -78,7 +80,7 @@ template <size_t N> using Vec3dsEvent = ArrayEvent<Vec3d, N>;
|
||||||
|
|
||||||
wxDECLARE_EVENT(EVT_GLCANVAS_INIT, SimpleEvent);
|
wxDECLARE_EVENT(EVT_GLCANVAS_INIT, SimpleEvent);
|
||||||
wxDECLARE_EVENT(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS, SimpleEvent);
|
wxDECLARE_EVENT(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS, SimpleEvent);
|
||||||
wxDECLARE_EVENT(EVT_GLCANVAS_RIGHT_CLICK, Vec2dEvent);
|
wxDECLARE_EVENT(EVT_GLCANVAS_RIGHT_CLICK, RBtnEvent);
|
||||||
wxDECLARE_EVENT(EVT_GLCANVAS_REMOVE_OBJECT, SimpleEvent);
|
wxDECLARE_EVENT(EVT_GLCANVAS_REMOVE_OBJECT, SimpleEvent);
|
||||||
wxDECLARE_EVENT(EVT_GLCANVAS_ARRANGE, SimpleEvent);
|
wxDECLARE_EVENT(EVT_GLCANVAS_ARRANGE, SimpleEvent);
|
||||||
wxDECLARE_EVENT(EVT_GLCANVAS_SELECT_ALL, SimpleEvent);
|
wxDECLARE_EVENT(EVT_GLCANVAS_SELECT_ALL, SimpleEvent);
|
||||||
|
|
|
@ -255,21 +255,30 @@ void ObjectList::create_objects_ctrl()
|
||||||
EnableDropTarget(wxDF_UNICODETEXT);
|
EnableDropTarget(wxDF_UNICODETEXT);
|
||||||
#endif // wxUSE_DRAG_AND_DROP && wxUSE_UNICODE
|
#endif // wxUSE_DRAG_AND_DROP && wxUSE_UNICODE
|
||||||
|
|
||||||
|
const int em = wxGetApp().em_unit();
|
||||||
|
|
||||||
// column ItemName(Icon+Text) of the view control:
|
// column ItemName(Icon+Text) of the view control:
|
||||||
// And Icon can be consisting of several bitmaps
|
// And Icon can be consisting of several bitmaps
|
||||||
AppendColumn(new wxDataViewColumn(_(L("Name")), new BitmapTextRenderer(),
|
AppendColumn(new wxDataViewColumn(_(L("Name")), new BitmapTextRenderer(),
|
||||||
colName, 20*wxGetApp().em_unit()/*200*/, wxALIGN_LEFT, wxDATAVIEW_COL_RESIZABLE));
|
colName, 20*em, wxALIGN_LEFT, wxDATAVIEW_COL_RESIZABLE));
|
||||||
|
|
||||||
// column PrintableProperty (Icon) of the view control:
|
// column PrintableProperty (Icon) of the view control:
|
||||||
AppendBitmapColumn(" ", colPrint, wxDATAVIEW_CELL_INERT, int(2 * wxGetApp().em_unit()),
|
AppendBitmapColumn(" ", colPrint, wxDATAVIEW_CELL_INERT, 3*em,
|
||||||
wxALIGN_CENTER_HORIZONTAL, wxDATAVIEW_COL_RESIZABLE);
|
wxALIGN_CENTER_HORIZONTAL, wxDATAVIEW_COL_RESIZABLE);
|
||||||
|
|
||||||
// column Extruder of the view control:
|
// column Extruder of the view control:
|
||||||
AppendColumn(create_objects_list_extruder_column(4));
|
AppendColumn(create_objects_list_extruder_column(4));
|
||||||
|
|
||||||
// column ItemEditing of the view control:
|
// column ItemEditing of the view control:
|
||||||
AppendBitmapColumn(_(L("Editing")), colEditing, wxDATAVIEW_CELL_INERT, int(2.5 * wxGetApp().em_unit())/*25*/,
|
AppendBitmapColumn(_(L("Editing")), colEditing, wxDATAVIEW_CELL_INERT, 3*em,
|
||||||
wxALIGN_CENTER_HORIZONTAL, wxDATAVIEW_COL_RESIZABLE);
|
wxALIGN_CENTER_HORIZONTAL, wxDATAVIEW_COL_RESIZABLE);
|
||||||
|
|
||||||
|
if (wxOSX)
|
||||||
|
{
|
||||||
|
GetColumn(colName)->SetWidth(20*em);
|
||||||
|
GetColumn(colPrint)->SetWidth(3*em);
|
||||||
|
GetColumn(colExtruder)->SetWidth(8*em);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ObjectList::create_popup_menus()
|
void ObjectList::create_popup_menus()
|
||||||
|
@ -822,12 +831,18 @@ void ObjectList::list_manipulation(bool evt_context_menu/* = false*/)
|
||||||
show_context_menu(evt_context_menu);
|
show_context_menu(evt_context_menu);
|
||||||
else if (title == _("Name"))
|
else if (title == _("Name"))
|
||||||
{
|
{
|
||||||
int obj_idx, vol_idx;
|
if (wxOSX)
|
||||||
get_selected_item_indexes(obj_idx, vol_idx, item);
|
show_context_menu(evt_context_menu); // return context menu under OSX (related to #2909)
|
||||||
|
|
||||||
if (is_windows10() && get_mesh_errors_count(obj_idx, vol_idx) > 0 &&
|
if (is_windows10())
|
||||||
pt.x > 2*wxGetApp().em_unit() && pt.x < 4*wxGetApp().em_unit() )
|
{
|
||||||
fix_through_netfabb();
|
int obj_idx, vol_idx;
|
||||||
|
get_selected_item_indexes(obj_idx, vol_idx, item);
|
||||||
|
|
||||||
|
if (get_mesh_errors_count(obj_idx, vol_idx) > 0 &&
|
||||||
|
pt.x > 2*wxGetApp().em_unit() && pt.x < 4*wxGetApp().em_unit() )
|
||||||
|
fix_through_netfabb();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef __WXMSW__
|
#ifndef __WXMSW__
|
||||||
|
|
|
@ -1340,6 +1340,8 @@ struct Plater::priv
|
||||||
MenuWithSeparators part_menu;
|
MenuWithSeparators part_menu;
|
||||||
// SLA-Object popup menu
|
// SLA-Object popup menu
|
||||||
MenuWithSeparators sla_object_menu;
|
MenuWithSeparators sla_object_menu;
|
||||||
|
// Default popup menu (when nothing is selected on 3DScene)
|
||||||
|
MenuWithSeparators default_menu;
|
||||||
|
|
||||||
// Removed/Prepended Items according to the view mode
|
// Removed/Prepended Items according to the view mode
|
||||||
std::vector<wxMenuItem*> items_increase;
|
std::vector<wxMenuItem*> items_increase;
|
||||||
|
@ -1879,7 +1881,7 @@ struct Plater::priv
|
||||||
void on_action_layersediting(SimpleEvent&);
|
void on_action_layersediting(SimpleEvent&);
|
||||||
|
|
||||||
void on_object_select(SimpleEvent&);
|
void on_object_select(SimpleEvent&);
|
||||||
void on_right_click(Vec2dEvent&);
|
void on_right_click(RBtnEvent&);
|
||||||
void on_wipetower_moved(Vec3dEvent&);
|
void on_wipetower_moved(Vec3dEvent&);
|
||||||
void on_wipetower_rotated(Vec3dEvent&);
|
void on_wipetower_rotated(Vec3dEvent&);
|
||||||
void on_update_geometry(Vec3dsEvent<2>&);
|
void on_update_geometry(Vec3dsEvent<2>&);
|
||||||
|
@ -3446,57 +3448,66 @@ void Plater::priv::on_object_select(SimpleEvent& evt)
|
||||||
selection_changed();
|
selection_changed();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Plater::priv::on_right_click(Vec2dEvent& evt)
|
void Plater::priv::on_right_click(RBtnEvent& evt)
|
||||||
{
|
{
|
||||||
int obj_idx = get_selected_object_idx();
|
int obj_idx = get_selected_object_idx();
|
||||||
|
|
||||||
|
wxMenu* menu = nullptr;
|
||||||
|
|
||||||
if (obj_idx == -1)
|
if (obj_idx == -1)
|
||||||
return;
|
menu = &default_menu;
|
||||||
|
else
|
||||||
wxMenu* menu = printer_technology == ptSLA ? &sla_object_menu :
|
|
||||||
get_selection().is_single_full_instance() ? // show "Object menu" for each FullInstance instead of FullObject
|
|
||||||
&object_menu : &part_menu;
|
|
||||||
|
|
||||||
sidebar->obj_list()->append_menu_item_settings(menu);
|
|
||||||
|
|
||||||
if (printer_technology != ptSLA)
|
|
||||||
sidebar->obj_list()->append_menu_item_change_extruder(menu);
|
|
||||||
|
|
||||||
if (menu != &part_menu)
|
|
||||||
{
|
{
|
||||||
/* Remove/Prepend "increase/decrease instances" menu items according to the view mode.
|
// If in 3DScene is(are) selected volume(s), but right button was clicked on empty space
|
||||||
* Suppress to show those items for a Simple mode
|
if (evt.data.second)
|
||||||
*/
|
return;
|
||||||
const MenuIdentifier id = printer_technology == ptSLA ? miObjectSLA : miObjectFFF;
|
|
||||||
if (wxGetApp().get_mode() == comSimple) {
|
menu = printer_technology == ptSLA ? &sla_object_menu :
|
||||||
if (menu->FindItem(_(L("Add instance"))) != wxNOT_FOUND)
|
get_selection().is_single_full_instance() ? // show "Object menu" for each FullInstance instead of FullObject
|
||||||
{
|
&object_menu : &part_menu;
|
||||||
/* Detach an items from the menu, but don't delete them
|
|
||||||
* so that they can be added back later
|
sidebar->obj_list()->append_menu_item_settings(menu);
|
||||||
* (after switching to the Advanced/Expert mode)
|
|
||||||
*/
|
if (printer_technology != ptSLA)
|
||||||
menu->Remove(items_increase[id]);
|
sidebar->obj_list()->append_menu_item_change_extruder(menu);
|
||||||
menu->Remove(items_decrease[id]);
|
|
||||||
menu->Remove(items_set_number_of_copies[id]);
|
if (menu != &part_menu)
|
||||||
|
{
|
||||||
|
/* Remove/Prepend "increase/decrease instances" menu items according to the view mode.
|
||||||
|
* Suppress to show those items for a Simple mode
|
||||||
|
*/
|
||||||
|
const MenuIdentifier id = printer_technology == ptSLA ? miObjectSLA : miObjectFFF;
|
||||||
|
if (wxGetApp().get_mode() == comSimple) {
|
||||||
|
if (menu->FindItem(_(L("Add instance"))) != wxNOT_FOUND)
|
||||||
|
{
|
||||||
|
/* Detach an items from the menu, but don't delete them
|
||||||
|
* so that they can be added back later
|
||||||
|
* (after switching to the Advanced/Expert mode)
|
||||||
|
*/
|
||||||
|
menu->Remove(items_increase[id]);
|
||||||
|
menu->Remove(items_decrease[id]);
|
||||||
|
menu->Remove(items_set_number_of_copies[id]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
else {
|
||||||
else {
|
if (menu->FindItem(_(L("Add instance"))) == wxNOT_FOUND)
|
||||||
if (menu->FindItem(_(L("Add instance"))) == wxNOT_FOUND)
|
{
|
||||||
{
|
// Prepend items to the menu, if those aren't not there
|
||||||
// Prepend items to the menu, if those aren't not there
|
menu->Prepend(items_set_number_of_copies[id]);
|
||||||
menu->Prepend(items_set_number_of_copies[id]);
|
menu->Prepend(items_decrease[id]);
|
||||||
menu->Prepend(items_decrease[id]);
|
menu->Prepend(items_increase[id]);
|
||||||
menu->Prepend(items_increase[id]);
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (q != nullptr) {
|
if (q != nullptr && menu) {
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
// For some reason on Linux the menu isn't displayed if position is specified
|
// For some reason on Linux the menu isn't displayed if position is specified
|
||||||
// (even though the position is sane).
|
// (even though the position is sane).
|
||||||
q->PopupMenu(menu);
|
q->PopupMenu(menu);
|
||||||
#else
|
#else
|
||||||
q->PopupMenu(menu, (int)evt.data.x(), (int)evt.data.y());
|
q->PopupMenu(menu, (int)evt.data.first.x(), (int)evt.data.first.y());
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3548,12 +3559,14 @@ bool Plater::priv::init_object_menu()
|
||||||
init_common_menu(&part_menu, true);
|
init_common_menu(&part_menu, true);
|
||||||
complit_init_part_menu();
|
complit_init_part_menu();
|
||||||
|
|
||||||
|
sidebar->obj_list()->create_default_popupmenu(&default_menu);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Plater::priv::msw_rescale_object_menu()
|
void Plater::priv::msw_rescale_object_menu()
|
||||||
{
|
{
|
||||||
for (MenuWithSeparators* menu : { &object_menu, &sla_object_menu, &part_menu })
|
for (MenuWithSeparators* menu : { &object_menu, &sla_object_menu, &part_menu, &default_menu })
|
||||||
msw_rescale_menu(dynamic_cast<wxMenu*>(menu));
|
msw_rescale_menu(dynamic_cast<wxMenu*>(menu));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4323,14 +4336,14 @@ void Plater::set_number_of_copies(/*size_t num*/)
|
||||||
|
|
||||||
ModelObject* model_object = p->model.objects[obj_idx];
|
ModelObject* model_object = p->model.objects[obj_idx];
|
||||||
|
|
||||||
const auto num = wxGetNumberFromUser( " ", _("Enter the number of copies:"),
|
const int num = wxGetNumberFromUser( " ", _("Enter the number of copies:"),
|
||||||
_("Copies of the selected object"), model_object->instances.size(), 0, 1000, this );
|
_("Copies of the selected object"), model_object->instances.size(), 0, 1000, this );
|
||||||
if (num < 0)
|
if (num < 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Plater::TakeSnapshot snapshot(this, wxString::Format(_(L("Set numbers of copies to %d")), num));
|
Plater::TakeSnapshot snapshot(this, wxString::Format(_(L("Set numbers of copies to %d")), num));
|
||||||
|
|
||||||
int diff = (int)num - (int)model_object->instances.size();
|
int diff = num - (int)model_object->instances.size();
|
||||||
if (diff > 0)
|
if (diff > 0)
|
||||||
increase_instances(diff);
|
increase_instances(diff);
|
||||||
else if (diff < 0)
|
else if (diff < 0)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue