New selection -> Removed old plater selection

This commit is contained in:
Enrico Turri 2018-10-17 09:30:07 +02:00
parent b4a09d3d86
commit b8ec71ab28

View File

@ -672,6 +672,7 @@ std::vector<PresetComboBox*>& Sidebar::combos_filament()
return p->combos_filament; return p->combos_filament;
} }
#if !ENABLE_EXTENDED_SELECTION
// Plater::Object // Plater::Object
struct PlaterObject struct PlaterObject
@ -681,6 +682,7 @@ struct PlaterObject
PlaterObject(std::string name) : name(std::move(name)), selected(false) {} PlaterObject(std::string name) : name(std::move(name)), selected(false) {}
}; };
#endif // !ENABLE_EXTENDED_SELECTION
// Plater::DropTarget // Plater::DropTarget
@ -730,7 +732,9 @@ struct Plater::priv
Slic3r::Print print; Slic3r::Print print;
Slic3r::Model model; Slic3r::Model model;
Slic3r::GCodePreviewData gcode_preview_data; Slic3r::GCodePreviewData gcode_preview_data;
#if !ENABLE_EXTENDED_SELECTION
std::vector<PlaterObject> objects; std::vector<PlaterObject> objects;
#endif // !ENABLE_EXTENDED_SELECTION
fs::path export_gcode_output_file; fs::path export_gcode_output_file;
fs::path send_gcode_file; fs::path send_gcode_file;
@ -761,9 +765,15 @@ struct Plater::priv
std::vector<size_t> load_model_objects(const ModelObjectPtrs &model_objects); std::vector<size_t> load_model_objects(const ModelObjectPtrs &model_objects);
std::unique_ptr<CheckboxFileDialog> get_export_file(GUI::FileType file_type); std::unique_ptr<CheckboxFileDialog> get_export_file(GUI::FileType file_type);
#if ENABLE_EXTENDED_SELECTION
const GLCanvas3D::Selection& get_selection() const;
GLCanvas3D::Selection& get_selection();
int get_selected_object_idx() const;
#else
void select_object(optional<size_t> obj_idx); void select_object(optional<size_t> obj_idx);
void select_object_from_cpp(); void select_object_from_cpp();
optional<size_t> selected_object() const; optional<size_t> selected_object() const;
#endif // ENABLE_EXTENDED_SELECTION
void selection_changed(); void selection_changed();
void object_list_changed(); void object_list_changed();
void select_view(); void select_view();
@ -808,7 +818,9 @@ struct Plater::priv
void on_viewport_changed(SimpleEvent&); void on_viewport_changed(SimpleEvent&);
void on_right_click(Vec2dEvent&); void on_right_click(Vec2dEvent&);
void on_model_update(SimpleEvent&); void on_model_update(SimpleEvent&);
#if !ENABLE_EXTENDED_SELECTION
void on_scale_uniformly(SimpleEvent&); void on_scale_uniformly(SimpleEvent&);
#endif // !ENABLE_EXTENDED_SELECTION
void on_wipetower_moved(Vec3dEvent&); void on_wipetower_moved(Vec3dEvent&);
void on_enable_action_buttons(Event<bool>&); void on_enable_action_buttons(Event<bool>&);
void on_update_geometry(Vec3dsEvent<2>&); void on_update_geometry(Vec3dsEvent<2>&);
@ -1114,12 +1126,19 @@ std::vector<size_t> Plater::priv::load_model_objects(const ModelObjectPtrs &mode
bool need_arrange = false; bool need_arrange = false;
bool scaled_down = false; bool scaled_down = false;
std::vector<size_t> obj_idxs; std::vector<size_t> obj_idxs;
#if ENABLE_EXTENDED_SELECTION
unsigned int obj_count = 0;
#endif // ENABLE_EXTENDED_SELECTION
for (ModelObject *model_object : model_objects) { for (ModelObject *model_object : model_objects) {
auto *object = model.add_object(*model_object); auto *object = model.add_object(*model_object);
std::string object_name = object->name.empty() ? fs::path(object->input_file).filename().string() : object->name; std::string object_name = object->name.empty() ? fs::path(object->input_file).filename().string() : object->name;
#if ENABLE_EXTENDED_SELECTION
obj_idxs.push_back(obj_count++);
#else
objects.emplace_back(std::move(object_name)); objects.emplace_back(std::move(object_name));
obj_idxs.push_back(objects.size() - 1); obj_idxs.push_back(objects.size() - 1);
#endif // ENABLE_EXTENDED_SELECTION
if (model_object->instances.empty()) { if (model_object->instances.empty()) {
// if object has no defined position(s) we need to rearrange everything after loading // if object has no defined position(s) we need to rearrange everything after loading
@ -1227,6 +1246,23 @@ std::unique_ptr<CheckboxFileDialog> Plater::priv::get_export_file(GUI::FileType
return dlg; return dlg;
} }
#if ENABLE_EXTENDED_SELECTION
const GLCanvas3D::Selection& Plater::priv::get_selection() const
{
return _3DScene::get_canvas(canvas3D)->get_selection();
}
GLCanvas3D::Selection& Plater::priv::get_selection()
{
return _3DScene::get_canvas(canvas3D)->get_selection();
}
int Plater::priv::get_selected_object_idx() const
{
int idx = get_selection().get_object_idx();
return ((0 <= idx) && (idx < 1000)) ? idx : -1;
}
#else
void Plater::priv::select_object(optional<size_t> obj_idx) void Plater::priv::select_object(optional<size_t> obj_idx)
{ {
for (auto &obj : objects) { for (auto &obj : objects) {
@ -1253,15 +1289,13 @@ optional<size_t> Plater::priv::selected_object() const
return boost::none; return boost::none;
} }
#endif // ENABLE_EXTENDED_SELECTION
void Plater::priv::selection_changed() void Plater::priv::selection_changed()
{ {
#if ENABLE_EXTENDED_SELECTION #if ENABLE_EXTENDED_SELECTION
const GUI::GLCanvas3D* canvas = _3DScene::get_canvas(this->canvas3D); int obj_idx = get_selected_object_idx();
const GUI::GLCanvas3D::Selection& selection = canvas->get_selection(); bool have_sel = (obj_idx != -1);
int obj_idx = selection.get_object_idx();
bool have_sel = !selection.is_empty() && (0 <= obj_idx) && (obj_idx < 1000);
#else #else
const auto obj_idx = selected_object(); const auto obj_idx = selected_object();
const bool have_sel = !!obj_idx; const bool have_sel = !!obj_idx;
@ -1354,7 +1388,11 @@ void Plater::priv::selection_changed()
void Plater::priv::object_list_changed() void Plater::priv::object_list_changed()
{ {
// Enable/disable buttons depending on whether there are any objects on the platter. // Enable/disable buttons depending on whether there are any objects on the platter.
#if ENABLE_EXTENDED_SELECTION
const bool have_objects = !model.objects.empty();
#else
const bool have_objects = !objects.empty(); const bool have_objects = !objects.empty();
#endif // ENABLE_EXTENDED_SELECTION
_3DScene::enable_toolbar_item(canvas3D, "deleteall", have_objects); _3DScene::enable_toolbar_item(canvas3D, "deleteall", have_objects);
_3DScene::enable_toolbar_item(canvas3D, "arrange", have_objects); _3DScene::enable_toolbar_item(canvas3D, "arrange", have_objects);
@ -1378,7 +1416,9 @@ void Plater::priv::remove(size_t obj_idx)
// Prevent toolpaths preview from rendering while we modify the Print object // Prevent toolpaths preview from rendering while we modify the Print object
preview->set_enabled(false); preview->set_enabled(false);
#if !ENABLE_EXTENDED_SELECTION
objects.erase(objects.begin() + obj_idx); objects.erase(objects.begin() + obj_idx);
#endif // !ENABLE_EXTENDED_SELECTION
model.delete_object(obj_idx); model.delete_object(obj_idx);
print.delete_object(obj_idx); print.delete_object(obj_idx);
// Delete object from Sidebar list // Delete object from Sidebar list
@ -1386,7 +1426,9 @@ void Plater::priv::remove(size_t obj_idx)
object_list_changed(); object_list_changed();
#if !ENABLE_EXTENDED_SELECTION
select_object(boost::none); select_object(boost::none);
#endif // !ENABLE_EXTENDED_SELECTION
update(); update();
} }
@ -1397,7 +1439,9 @@ void Plater::priv::reset()
// Prevent toolpaths preview from rendering while we modify the Print object // Prevent toolpaths preview from rendering while we modify the Print object
preview->set_enabled(false); preview->set_enabled(false);
#if !ENABLE_EXTENDED_SELECTION
objects.clear(); objects.clear();
#endif // !ENABLE_EXTENDED_SELECTION
model.clear_objects(); model.clear_objects();
print.clear_objects(); print.clear_objects();
@ -1405,7 +1449,9 @@ void Plater::priv::reset()
sidebar->obj_list()->delete_all_objects_from_list(); sidebar->obj_list()->delete_all_objects_from_list();
object_list_changed(); object_list_changed();
#if !ENABLE_EXTENDED_SELECTION
select_object(boost::none); select_object(boost::none);
#endif // !ENABLE_EXTENDED_SELECTION
update(); update();
} }
@ -1416,11 +1462,20 @@ void Plater::priv::rotate()
void Plater::priv::mirror(const Axis &axis) void Plater::priv::mirror(const Axis &axis)
{ {
#if ENABLE_EXTENDED_SELECTION
int obj_idx = get_selected_object_idx();
if (obj_idx == -1)
return;
ModelObject* model_object = model.objects[obj_idx];
ModelInstance* model_instance = model_object->instances.front();
#else
const auto obj_idx = selected_object(); const auto obj_idx = selected_object();
if (! obj_idx) { return; } if (! obj_idx) { return; }
auto *model_object = model.objects[*obj_idx]; auto *model_object = model.objects[*obj_idx];
auto *model_instance = model_object->instances[0]; auto *model_instance = model_object->instances[0];
#endif // ENABLE_EXTENDED_SELECTION
// XXX: ? // XXX: ?
// # apply Z rotation before mirroring // # apply Z rotation before mirroring
@ -1432,7 +1487,11 @@ void Plater::priv::mirror(const Axis &axis)
model_object->mirror(axis); model_object->mirror(axis);
// $self->stop_background_process; // TODO // $self->stop_background_process; // TODO
#if ENABLE_EXTENDED_SELECTION
print.add_model_object(model_object, obj_idx);
#else
print.add_model_object(model_object, *obj_idx); print.add_model_object(model_object, *obj_idx);
#endif // ENABLE_EXTENDED_SELECTION
selection_changed(); selection_changed();
update(); update();
} }
@ -1663,6 +1722,7 @@ void Plater::priv::on_model_update(SimpleEvent&)
// TODO // TODO
} }
#if !ENABLE_EXTENDED_SELECTION
void Plater::priv::on_scale_uniformly(SimpleEvent&) void Plater::priv::on_scale_uniformly(SimpleEvent&)
{ {
// my ($scale) = @_; // my ($scale) = @_;
@ -1697,6 +1757,7 @@ void Plater::priv::on_scale_uniformly(SimpleEvent&)
// $self->update; // $self->update;
// $self->schedule_background_process; // $self->schedule_background_process;
} }
#endif // !ENABLE_EXTENDED_SELECTION
void Plater::priv::on_wipetower_moved(Vec3dEvent &evt) void Plater::priv::on_wipetower_moved(Vec3dEvent &evt)
{ {
@ -1741,19 +1802,34 @@ void Plater::remove(size_t obj_idx) { p->remove(obj_idx); }
void Plater::remove_selected() void Plater::remove_selected()
{ {
#if ENABLE_EXTENDED_SELECTION
int obj_idx = p->get_selected_object_idx();
if (obj_idx != -1)
remove((size_t)obj_idx);
#else
const auto selected = p->selected_object(); const auto selected = p->selected_object();
if (selected) { if (selected) {
remove(*selected); remove(*selected);
} }
#endif // ENABLE_EXTENDED_SELECTION
} }
void Plater::increase(size_t num) void Plater::increase(size_t num)
{ {
#if ENABLE_EXTENDED_SELECTION
int obj_idx = p->get_selected_object_idx();
if (obj_idx == -1)
return;
ModelObject* model_object = p->model.objects[obj_idx];
ModelInstance* model_instance = model_object->instances.back();
#else
const auto obj_idx = p->selected_object(); const auto obj_idx = p->selected_object();
if (! obj_idx) { return; } if (! obj_idx) { return; }
auto *model_object = p->model.objects[*obj_idx]; auto *model_object = p->model.objects[*obj_idx];
auto *model_instance = model_object->instances[model_object->instances.size() - 1]; auto *model_instance = model_object->instances[model_object->instances.size() - 1];
#endif // ENABLE_EXTENDED_SELECTION
// $self->stop_background_process; // $self->stop_background_process;
@ -1761,10 +1837,18 @@ void Plater::increase(size_t num)
for (size_t i = 0; i < num; i++, offset += 10.0) { for (size_t i = 0; i < num; i++, offset += 10.0) {
Vec3d offset_vec = model_instance->get_offset() + Vec3d(offset, offset, 0.0); Vec3d offset_vec = model_instance->get_offset() + Vec3d(offset, offset, 0.0);
auto *new_instance = model_object->add_instance(offset_vec, model_instance->get_scaling_factor(), model_instance->get_rotation()); auto *new_instance = model_object->add_instance(offset_vec, model_instance->get_scaling_factor(), model_instance->get_rotation());
#if ENABLE_EXTENDED_SELECTION
p->print.get_object(obj_idx)->add_copy(Slic3r::to_2d(offset_vec));
#else
p->print.get_object(*obj_idx)->add_copy(Slic3r::to_2d(offset_vec)); p->print.get_object(*obj_idx)->add_copy(Slic3r::to_2d(offset_vec));
#endif // ENABLE_EXTENDED_SELECTION
} }
#if ENABLE_EXTENDED_SELECTION
sidebar().obj_list()->set_object_count(obj_idx, model_object->instances.size());
#else
sidebar().obj_list()->set_object_count(*obj_idx, model_object->instances.size()); sidebar().obj_list()->set_object_count(*obj_idx, model_object->instances.size());
#endif // ENABLE_EXTENDED_SELECTION
if (p->get_config("autocenter") == "1") { if (p->get_config("autocenter") == "1") {
p->arrange(); p->arrange();
@ -1779,18 +1863,39 @@ void Plater::increase(size_t num)
void Plater::decrease(size_t num) void Plater::decrease(size_t num)
{ {
#if ENABLE_EXTENDED_SELECTION
int obj_idx = p->get_selected_object_idx();
if (obj_idx == -1)
return;
ModelObject* model_object = p->model.objects[obj_idx];
#else
const auto obj_idx = p->selected_object(); const auto obj_idx = p->selected_object();
if (! obj_idx) { return; } if (! obj_idx) { return; }
auto *model_object = p->model.objects[*obj_idx]; auto *model_object = p->model.objects[*obj_idx];
#endif // ENABLE_EXTENDED_SELECTION
if (model_object->instances.size() > num) { if (model_object->instances.size() > num) {
for (size_t i = 0; i < num; i++) { for (size_t i = 0; i < num; i++) {
model_object->delete_last_instance(); model_object->delete_last_instance();
#if ENABLE_EXTENDED_SELECTION
p->print.get_object(obj_idx)->delete_last_copy();
#else
p->print.get_object(*obj_idx)->delete_last_copy(); p->print.get_object(*obj_idx)->delete_last_copy();
#endif // ENABLE_EXTENDED_SELECTION
} }
#if ENABLE_EXTENDED_SELECTION
sidebar().obj_list()->set_object_count(obj_idx, model_object->instances.size());
#else
sidebar().obj_list()->set_object_count(*obj_idx, model_object->instances.size()); sidebar().obj_list()->set_object_count(*obj_idx, model_object->instances.size());
} else { #endif // ENABLE_EXTENDED_SELECTION
}
else {
#if ENABLE_EXTENDED_SELECTION
remove(obj_idx);
#else
remove(*obj_idx); remove(*obj_idx);
#endif // ENABLE_EXTENDED_SELECTION
} }
p->update(); p->update();
@ -1798,12 +1903,20 @@ void Plater::decrease(size_t num)
void Plater::set_number_of_copies(size_t num) void Plater::set_number_of_copies(size_t num)
{ {
#if ENABLE_EXTENDED_SELECTION
int obj_idx = p->get_selected_object_idx();
if (obj_idx == -1)
return;
ModelObject* model_object = p->model.objects[obj_idx];
#else
const auto obj_idx = p->selected_object(); const auto obj_idx = p->selected_object();
if (! obj_idx) { return; } if (! obj_idx) { return; }
auto *model_object = p->model.objects[*obj_idx]; auto *model_object = p->model.objects[*obj_idx];
#endif // ENABLE_EXTENDED_SELECTION
auto diff = (ptrdiff_t)num - (ptrdiff_t)model_object->instances.size(); int diff = (int)num - (int)model_object->instances.size();
if (diff > 0) { if (diff > 0) {
increase(diff); increase(diff);
} else if (diff < 0) { } else if (diff < 0) {
@ -1813,7 +1926,11 @@ void Plater::set_number_of_copies(size_t num)
fs::path Plater::export_gcode(const fs::path &output_path) fs::path Plater::export_gcode(const fs::path &output_path)
{ {
#if ENABLE_EXTENDED_SELECTION
if (p->model.objects.empty()) { return ""; }
#else
if (p->objects.empty()) { return ""; } if (p->objects.empty()) { return ""; }
#endif // ENABLE_EXTENDED_SELECTION
if (! p->export_gcode_output_file.empty()) { if (! p->export_gcode_output_file.empty()) {
GUI::show_error(this, _(L("Another export job is currently running."))); GUI::show_error(this, _(L("Another export job is currently running.")));
@ -1866,7 +1983,11 @@ fs::path Plater::export_gcode(const fs::path &output_path)
void Plater::export_stl() void Plater::export_stl()
{ {
#if ENABLE_EXTENDED_SELECTION
if (p->model.objects.empty()) { return; }
#else
if (p->objects.empty()) { return; } if (p->objects.empty()) { return; }
#endif // ENABLE_EXTENDED_SELECTION
auto dialog = p->get_export_file(FT_STL); auto dialog = p->get_export_file(FT_STL);
if (! dialog) { return; } if (! dialog) { return; }
@ -1881,7 +2002,11 @@ void Plater::export_stl()
void Plater::export_amf() void Plater::export_amf()
{ {
#if ENABLE_EXTENDED_SELECTION
if (p->model.objects.empty()) { return; }
#else
if (p->objects.empty()) { return; } if (p->objects.empty()) { return; }
#endif // ENABLE_EXTENDED_SELECTION
auto dialog = p->get_export_file(FT_AMF); auto dialog = p->get_export_file(FT_AMF);
if (! dialog) { return; } if (! dialog) { return; }
@ -1900,7 +2025,11 @@ void Plater::export_amf()
void Plater::export_3mf() void Plater::export_3mf()
{ {
#if ENABLE_EXTENDED_SELECTION
if (p->model.objects.empty()) { return; }
#else
if (p->objects.empty()) { return; } if (p->objects.empty()) { return; }
#endif // ENABLE_EXTENDED_SELECTION
auto dialog = p->get_export_file(FT_3MF); auto dialog = p->get_export_file(FT_3MF);
if (! dialog) { return; } if (! dialog) { return; }