diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 95944a8da5..3b3bfb35fd 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -5632,14 +5632,10 @@ void GLCanvas3D::do_move(const std::string& snapshot_type, bool force_volume_mov // Fixes sinking/flying instances (snaps object to buildplate) for (const std::pair& i : done) { ModelObject* mo = m_model->objects[i.first]; - - if (!mo->auto_drop) { - continue; - } const double shift_z = mo->get_instance_min_z(i.second); //BBS: don't call translate if the z is zero - if ((current_printer_technology() == ptSLA || shift_z > SINKING_Z_THRESHOLD) && (shift_z != 0.0f)) { + if (mo->auto_drop && (current_printer_technology() == ptSLA || shift_z > SINKING_Z_THRESHOLD) && (shift_z != 0.0f)) { const Vec3d shift(0.0, 0.0, -shift_z); m_selection.translate(i.first, i.second, shift); mo->translate_instance(i.second, shift); @@ -5763,14 +5759,10 @@ void GLCanvas3D::do_rotate(const std::string& snapshot_type) for (const std::pair &i : done) { ModelObject *mo = m_model->objects[i.first]; - if (!mo->auto_drop) { - continue; - } - // BBS: don't call translate if the z is zero const double shift_z = mo->get_instance_min_z(i.second); // leave sinking instances as sinking - if ((min_zs.find({i.first, i.second})->second >= SINKING_Z_THRESHOLD || shift_z > SINKING_Z_THRESHOLD) && (shift_z != 0.0f)) { + if (mo->auto_drop && (min_zs.find({i.first, i.second})->second >= SINKING_Z_THRESHOLD || shift_z > SINKING_Z_THRESHOLD) && (shift_z != 0.0f)) { const Vec3d shift(0.0, 0.0, -shift_z); m_selection.translate(i.first, i.second, shift); mo->translate_instance(i.second, shift); @@ -5865,14 +5857,10 @@ void GLCanvas3D::do_scale(const std::string& snapshot_type) for (const std::pair& i : done) { ModelObject* mo = m_model->objects[i.first]; - if (!mo->auto_drop) { - continue; - } - //BBS: don't call translate if the z is zero double shift_z = mo->get_instance_min_z(i.second); // leave sinking instances as sinking - if ((min_zs.empty() || min_zs.find({ i.first, i.second })->second >= SINKING_Z_THRESHOLD || shift_z > SINKING_Z_THRESHOLD) && (shift_z != 0.0f)) { + if (mo->auto_drop && (min_zs.empty() || min_zs.find({ i.first, i.second })->second >= SINKING_Z_THRESHOLD || shift_z > SINKING_Z_THRESHOLD) && (shift_z != 0.0f)) { Vec3d shift(0.0, 0.0, -shift_z); m_selection.translate(i.first, i.second, shift); mo->translate_instance(i.second, shift); @@ -5985,14 +5973,10 @@ void GLCanvas3D::do_mirror(const std::string& snapshot_type) for (const std::pair& i : done) { ModelObject* mo = m_model->objects[i.first]; - if (!mo->auto_drop) { - continue; - } - //BBS: don't call translate if the z is zero double shift_z = mo->get_instance_min_z(i.second); // leave sinking instances as sinking - if ((min_zs.empty() || min_zs.find({ i.first, i.second })->second >= SINKING_Z_THRESHOLD || shift_z > SINKING_Z_THRESHOLD)&&(shift_z != 0.0f)) { + if (mo->auto_drop && (min_zs.empty() || min_zs.find({ i.first, i.second })->second >= SINKING_Z_THRESHOLD || shift_z > SINKING_Z_THRESHOLD) && (shift_z != 0.0f)) { Vec3d shift(0.0, 0.0, -shift_z); m_selection.translate(i.first, i.second, shift); mo->translate_instance(i.second, shift); diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index e7d1041cb6..5961d5af47 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -1618,7 +1618,9 @@ void ObjectList::list_manipulation(const wxPoint& mouse_pos, bool evt_context_me get_selected_item_indexes(obj_idx, vol_idx, item); if (obj_idx != -1) { Plater::TakeSnapshot snapshot(plater, _u8L("Shift objects to bed")); - (*m_objects)[obj_idx]->ensure_on_bed(); + // Shift on request also when auto drop is off, which ensure_on_bed() skips. + ModelObject* mo = (*m_objects)[obj_idx]; + mo->translate_instances(-mo->min_z() * Vec3d::UnitZ()); cnv->reload_scene(true, true); update_info_items(obj_idx); notify_instance_updated(obj_idx); @@ -6734,7 +6736,9 @@ void ObjectList::OnEditingStarted(wxDataViewEvent &event) Plater::TakeSnapshot snapshot(plater, _u8L("Shift objects to bed")); int obj_idx, vol_idx; get_selected_item_indexes(obj_idx, vol_idx, item); - (*m_objects)[obj_idx]->ensure_on_bed(); + // Shift on request also when auto drop is off, which ensure_on_bed() skips. + ModelObject* mo = (*m_objects)[obj_idx]; + mo->translate_instances(-mo->min_z() * Vec3d::UnitZ()); cnv->reload_scene(true, true); update_info_items(obj_idx); notify_instance_updated(obj_idx); diff --git a/src/slic3r/GUI/Selection.cpp b/src/slic3r/GUI/Selection.cpp index 4d7f1591ee..e9c91bc337 100644 --- a/src/slic3r/GUI/Selection.cpp +++ b/src/slic3r/GUI/Selection.cpp @@ -579,29 +579,12 @@ void Selection::drop() wxGetApp().plater()->take_snapshot(L("Move object")); - this->move_to_center(Vec3d(0, 0, -min_z)); - - for (unsigned int i : m_list) { - GLVolume& volume = *(*m_volumes)[i]; - // Skip the wipe tower: its synthetic id (>= 1000) is not an index into m_model->objects. - if (volume.object_idx() >= 1000) - continue; - ModelObject* model_object = m_model->objects[volume.object_idx()]; - - if (model_object != nullptr) { - if (m_mode == Volume) { - ModelVolume* cur_mv = model_object->volumes[volume.volume_idx()]; - cur_mv->set_transformation(volume.get_volume_transformation()); - } else if (m_mode == Instance) { - model_object->instances[volume.instance_idx()]->set_transformation(volume.get_instance_transformation()); - } - - model_object->invalidate_bounding_box(); - this->notify_instance_update(volume.object_idx(), volume.instance_idx()); - } - } - - wxGetApp().plater()->get_view3D_canvas3D()->post_event(SimpleEvent(EVT_GLCANVAS_INSTANCE_MOVED)); + // do_move() writes every volume back to the model and refreshes the view. + setup_cache(); + TransformationType transformation_type; + transformation_type.set_relative(); + translate(Vec3d(0, 0, -min_z), transformation_type); + wxGetApp().plater()->get_view3D_canvas3D()->do_move(""); } void Selection::center_plate(const int plate_idx) {