diff --git a/src/GUI/Plater.cpp b/src/GUI/Plater.cpp index ef43fc18a..7eb51d9a8 100644 --- a/src/GUI/Plater.cpp +++ b/src/GUI/Plater.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include "Plater.hpp" @@ -841,7 +842,7 @@ wxMenu* Plater::object_menu() { append_menu_item(menu, _("Delete"), _("Remove the selected object."), [=](wxCommandEvent& e) { this->remove();}, wxID_ANY, "brick_delete.png", "Ctrl+Del"); append_menu_item(menu, _("Increase copies"), _("Place one more copy of the selected object."), [=](wxCommandEvent& e) { this->increase();}, wxID_ANY, "add.png", "Ctrl++"); append_menu_item(menu, _("Decrease copies"), _("Remove one copy of the selected object."), [=](wxCommandEvent& e) { this->decrease();}, wxID_ANY, "delete.png", "Ctrl+-"); - append_menu_item(menu, _(L"Set number of copies…"), _("Change the number of copies of the selected object."), [=](wxCommandEvent& e) { this->decrease();}, wxID_ANY, "textfield.png"); + append_menu_item(menu, _(L"Set number of copies…"), _("Change the number of copies of the selected object."), [=](wxCommandEvent& e) { this->set_number_of_copies();}, wxID_ANY, "textfield.png"); menu->AppendSeparator(); append_menu_item(menu, _(L"Move to bed center"), _(L"Center object around bed center."), [=](wxCommandEvent& e) { this->center_selected_object_on_bed();}, wxID_ANY, "arrow_in.png"); append_menu_item(menu, _(L"Rotate 45° clockwise"), _(L"Rotate the selected object by 45° clockwise."), [=](wxCommandEvent& e) { this->rotate(45);}, wxID_ANY, "arrow_rotate_clockwise.png"); @@ -939,5 +940,40 @@ wxMenu* Plater::object_menu() { return menu; } +void Plater::set_number_of_copies() { + this->pause_background_process(); + + ObjRef obj {this->selected_object()}; + if (obj == this->objects.end()) return; + auto* model_object { this->model->objects.at(obj->identifier) }; + + long copies = -1; + copies = wxGetNumberFromUser("", _("Enter the number of copies of the selected object:"), _("Copies"), model_object->instances.size(), 0, 1000, this); + if (copies < 0) return; + long diff {copies - model_object->instances.size() }; + + if (diff == 0) { this->resume_background_process(); } + else if (diff > 0) { this->increase(diff); } + else if (diff < 0) { this->decrease(-diff); } +} +void Plater::center_selected_object_on_bed() { + ObjRef obj {this->selected_object()}; + + if (obj == this->objects.end()) return; + auto* model_object { this->model->objects.at(obj->identifier) }; + auto bb {model_object->bounding_box()}; + auto size {bb.size()}; + + auto vector { Slic3r::Pointf( + this->bed_centerf().x - bb.min.x - size.x/2.0, + this->bed_centerf().y - bb.min.y - size.y/2.0)}; + for (auto* inst : model_object->instances) { + inst->offset.translate(vector); + } + + this->refresh_canvases(); + +} + }} // Namespace Slic3r::GUI diff --git a/src/GUI/Plater.hpp b/src/GUI/Plater.hpp index a1c81e60b..d6d5977f6 100644 --- a/src/GUI/Plater.hpp +++ b/src/GUI/Plater.hpp @@ -145,7 +145,6 @@ private: /// Complete thumbnail transformation and refresh canvases void on_thumbnail_made(size_t idx); - /// Issue a repaint event to all of the canvasses. void refresh_canvases(); @@ -164,7 +163,6 @@ private: void object_settings_dialog(ObjIdx obj_idx); void object_settings_dialog(ObjRef obj); - /// Instantiate the toolbar void build_toolbar(); @@ -204,6 +202,11 @@ private: void pause_background_process(); void resume_background_process(); + + /// Move the selected object to the center of bed. + void center_selected_object_on_bed(); + + void set_number_of_copies(); };