mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-10-17 04:41:21 +00:00
Fix Ctrl+A (select current plate) and Delete All skipping objects that no longer fit or while one of instances not on the bed (#15895)
* Fix Ctrl+A (select current plate) skipping objects that no longer fit the bed Selection::add_curr_plate() used PartPlate::contain_instance_totally(), which excludes any instance flagged in instance_outside_set -- an instance too big for, or dragged outside, the bed. Since that is exactly the kind of object a user reaches for Ctrl+A to move or delete, it silently dropped out of "select all" (and out of the selection entirely when it was the only object on the plate). Selection::remove_curr_plate(), used for "delete all on this plate", already does this correctly with the plain membership check, PartPlate::contain_instance() (no outside-bed exclusion). Match it. Likely reachable since #12236 changed Ctrl+A's target from "all plates" to "current plate", switching it onto this pre-existing function. Fixes OrcaSlicer/OrcaSlicer#15888 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * Trim comment verbosity per review feedback Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * fix behaviour for instances * simplify code * Update Selection.cpp * Update Selection.cpp * update * update --------- Co-authored-by: Fernando Marino <f.marino@rheagroup.com> Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com> Co-authored-by: yw4z <ywsyildiz@gmail.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
Fernando Marino
yw4z
parent
9b2fcaa53a
commit
fd28f6c189
@@ -474,17 +474,14 @@ void Selection::add_curr_plate()
|
||||
if (!m_valid)
|
||||
return;
|
||||
|
||||
std::vector<unsigned int> volume_idxs = get_volume_idxs_from_plate(wxGetApp().plater()->get_partplate_list().get_curr_plate_index());
|
||||
if (volume_idxs.empty())
|
||||
return;
|
||||
|
||||
wxGetApp().plater()->take_snapshot(std::string("Selection-Add Curr Plate All!"));
|
||||
m_mode = Instance;
|
||||
clear();
|
||||
|
||||
PartPlate* plate = wxGetApp().plater()->get_partplate_list().get_curr_plate();
|
||||
for (int obj_idx = 0; obj_idx < m_model->objects.size(); obj_idx++) {
|
||||
if (plate && plate->contain_instance_totally(obj_idx, 0)) {
|
||||
std::vector<unsigned int> volume_idxs = get_volume_idxs_from_object(obj_idx);
|
||||
do_add_volumes(volume_idxs);
|
||||
}
|
||||
}
|
||||
do_add_volumes(volume_idxs);
|
||||
|
||||
update_type();
|
||||
this->set_bounding_boxes_dirty();
|
||||
@@ -511,20 +508,14 @@ void Selection::remove_curr_plate()
|
||||
if (!m_valid)
|
||||
return;
|
||||
|
||||
PartPlate* plate = wxGetApp().plater()->get_partplate_list().get_curr_plate();
|
||||
if (plate->empty())
|
||||
std::vector<unsigned int> volume_idxs = get_volume_idxs_from_plate(wxGetApp().plater()->get_partplate_list().get_curr_plate_index());
|
||||
if (volume_idxs.empty())
|
||||
return;
|
||||
|
||||
wxGetApp().plater()->take_snapshot(std::string("Selection-Delete Curr Plate All"));
|
||||
m_mode = Instance;
|
||||
clear();
|
||||
|
||||
for (int obj_idx = 0; obj_idx < m_model->objects.size(); obj_idx++) {
|
||||
if (plate && plate->contain_instance(obj_idx, 0)) {
|
||||
std::vector<unsigned int> volume_idxs = get_volume_idxs_from_object(obj_idx);
|
||||
do_add_volumes(volume_idxs);
|
||||
}
|
||||
}
|
||||
do_add_volumes(volume_idxs);
|
||||
|
||||
update_type();
|
||||
this->set_bounding_boxes_dirty();
|
||||
@@ -2270,6 +2261,27 @@ std::vector<unsigned int> Selection::get_volume_idxs_from_volume(unsigned int ob
|
||||
return idxs;
|
||||
}
|
||||
|
||||
std::vector<unsigned int> Selection::get_volume_idxs_from_plate(const int plate_idx) const
|
||||
{
|
||||
PartPlate* plate = wxGetApp().plater()->get_partplate_list().get_plate(plate_idx);
|
||||
std::vector<unsigned int> idxs;
|
||||
if (!plate)
|
||||
return idxs;
|
||||
|
||||
for (int obj_idx = 0; obj_idx < (int)m_model->objects.size(); obj_idx++) {
|
||||
const ModelObject* obj = m_model->objects[obj_idx];
|
||||
for (int inst_idx = 0; inst_idx < (int)obj->instances.size(); inst_idx++) {
|
||||
// on this plate or overlapping it in some way (fully inside, oversized or partly outside)
|
||||
if (plate->contain_instance(obj_idx, inst_idx) || plate->intersect_instance(obj_idx, inst_idx)) {
|
||||
std::vector<unsigned int> inst_idxs = get_volume_idxs_from_instance(obj_idx, inst_idx);
|
||||
idxs.insert(idxs.end(), inst_idxs.begin(), inst_idxs.end());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return idxs;
|
||||
}
|
||||
|
||||
std::vector<unsigned int> Selection::get_missing_volume_idxs_from(const std::vector<unsigned int>& volume_idxs) const
|
||||
{
|
||||
std::vector<unsigned int> idxs;
|
||||
|
||||
@@ -409,6 +409,8 @@ public:
|
||||
std::vector<unsigned int> get_volume_idxs_from_instance(unsigned int object_idx, unsigned int instance_idx) const;
|
||||
// returns the idx of the volume corresponding to the volume with the given idxs
|
||||
std::vector<unsigned int> get_volume_idxs_from_volume(unsigned int object_idx, unsigned int instance_idx, unsigned int volume_idx) const;
|
||||
// returns the list of idxs of the volumes of all instances on the given plate or overlapping it. (fully inside, oversized or partly outside)
|
||||
std::vector<unsigned int> get_volume_idxs_from_plate(const int plate_idx) const;
|
||||
// returns the list of idxs of the volumes contained in the selection but not in the given list
|
||||
std::vector<unsigned int> get_missing_volume_idxs_from(const std::vector<unsigned int>& volume_idxs) const;
|
||||
// returns the list of idxs of the volumes contained in the given list but not in the selection
|
||||
|
||||
Reference in New Issue
Block a user