From ade5352649b55f15fe7e0b4c21bd01eabc5371cf Mon Sep 17 00:00:00 2001 From: Martin Stepniewski Date: Fri, 22 May 2020 21:41:53 +0200 Subject: [PATCH 1/4] Extended selection tools by 'RestrictSelectionToSubset' which deselects all elements from the selection that are not in the specified subset. --- register_selection_tools.cpp | 5 ++- tools/selection_tools.cpp | 59 ++++++++++++++++++++++++++++++++++++ tools/selection_tools.h | 2 ++ 3 files changed, 65 insertions(+), 1 deletion(-) diff --git a/register_selection_tools.cpp b/register_selection_tools.cpp index ff0b2f6..6cab034 100644 --- a/register_selection_tools.cpp +++ b/register_selection_tools.cpp @@ -327,7 +327,10 @@ void RegisterSelectionTools(ProMeshRegistry& reg, string baseGrp) "vertices || value=true #" "edges || value=true #" "faces || value=true #" - "volumes || value=true", TOOLTIP_SELECT_UNASSIGNED_ELEMENTS); + "volumes || value=true", TOOLTIP_SELECT_UNASSIGNED_ELEMENTS) + .add_function("RestrictSelectionToSubset", &RestrictSelectionToSubset, grp, "", + "mesh #" + "subset index#", TOOLTIP_RESTRICT_SELECTION_TO_SUBSET); grp = baseGrp + "/Coordinate Range"; diff --git a/tools/selection_tools.cpp b/tools/selection_tools.cpp index 2f00635..3cba3fa 100644 --- a/tools/selection_tools.cpp +++ b/tools/selection_tools.cpp @@ -255,6 +255,65 @@ void CloseSelection(Mesh* obj) CloseSelection (obj->selector()); } +void RestrictSelectionToSubset(Mesh* obj, int si) +{ + SubsetHandler& sh = obj->subset_handler(); + Selector& sel = obj->selector(); + +// Store selected elements that are contained in the specified subset + std::vector vVertices; + for(VertexIterator vIter = sel.begin(); vIter != sel.end(); ++vIter){ + Vertex* vrt = *vIter; + if(sh.get_subset_index(vrt) == si){ + vVertices.push_back(vrt); + } + } + + std::vector vEdges; + for(EdgeIterator eIter = sel.begin(); eIter != sel.end(); ++eIter){ + Edge* e = *eIter; + if(sh.get_subset_index(e) == si){ + vEdges.push_back(e); + } + } + + std::vector vFaces; + for(FaceIterator fIter = sel.begin(); fIter != sel.end(); ++fIter){ + Face* f = *fIter; + if(sh.get_subset_index(f) == si){ + vFaces.push_back(f); + } + } + + std::vector vVolumes; + for(VolumeIterator volIter = sel.begin(); volIter != sel.end(); ++volIter){ + Volume* v = *volIter; + if(sh.get_subset_index(v) == si){ + vVolumes.push_back(v); + } + } + +// Clear selector + sel.clear(); + +// Reselect elements that were originally selected and are contained in the specified subset + for(size_t i = 0; i < vVertices.size(); ++i){ + sel.select(vVertices[i]); + } + + for(size_t i = 0; i < vEdges.size(); ++i){ + sel.select(vEdges[i]); + } + + for(size_t i = 0; i < vFaces.size(); ++i){ + sel.select(vFaces[i]); + } + + for(size_t i = 0; i < vVolumes.size(); ++i){ + sel.select(vVolumes[i]); + } +} + //////////////////////////////////////////////////////////////////////////////// // VERTICES void SelectBoundaryVertices(Mesh* obj) diff --git a/tools/selection_tools.h b/tools/selection_tools.h index 4dd102b..b9f2230 100644 --- a/tools/selection_tools.h +++ b/tools/selection_tools.h @@ -109,6 +109,7 @@ #define TOOLTIP_SELECT_SELECTION_BOUNDARY "Selects the boundary of the current selection." #define TOOLTIP_SELECT_BENT_QUADRILATERALS "Selects quadrilaterals which do not lie in a plane." #define TOOLTIP_CLOSE_SELECTION "Selects all associated elements of lower dimensions." +#define TOOLTIP_RESTRICT_SELECTION_TO_SUBSET "Deselects all elements from the selection that are not in the specified subset." #define TOOLTIP_SELECT_SLIVERS "Selects flat tetrahedrons. Threshold-ratio specifies the minimal ratio between the distance of two opposing edges to the length of the longest edge." #define TOOLTIP_SELECT_SELECTION_KINK_VERTICES "Selects kink vertices in selected paths" #define TOOLTIP_SELECT_SUBSET_KINK_VERTICES "Selects kink vertices in subset-paths" @@ -225,6 +226,7 @@ void SelectSelectionBoundary(Mesh* obj); void CloseSelection(Mesh* obj); +void RestrictSelectionToSubset(Mesh* obj, int si); template void SelectInterfaceElements(Mesh* obj, bool regardSelectedNbrsOnly) From 67afd05cf712ac85a1b3e7cd5374020f6a408d4b Mon Sep 17 00:00:00 2001 From: Martin Stepniewski Date: Fri, 5 Jun 2020 18:08:07 +0200 Subject: [PATCH 2/4] Adressed requested changes for pull request. --- register_selection_tools.cpp | 2 +- tools/selection_tools.cpp | 66 ++++++------------------------------ 2 files changed, 12 insertions(+), 56 deletions(-) diff --git a/register_selection_tools.cpp b/register_selection_tools.cpp index 6cab034..a998f28 100644 --- a/register_selection_tools.cpp +++ b/register_selection_tools.cpp @@ -330,7 +330,7 @@ void RegisterSelectionTools(ProMeshRegistry& reg, string baseGrp) "volumes || value=true", TOOLTIP_SELECT_UNASSIGNED_ELEMENTS) .add_function("RestrictSelectionToSubset", &RestrictSelectionToSubset, grp, "", "mesh #" - "subset index#", TOOLTIP_RESTRICT_SELECTION_TO_SUBSET); + "subset index", TOOLTIP_RESTRICT_SELECTION_TO_SUBSET); grp = baseGrp + "/Coordinate Range"; diff --git a/tools/selection_tools.cpp b/tools/selection_tools.cpp index 3cba3fa..e5db2da 100644 --- a/tools/selection_tools.cpp +++ b/tools/selection_tools.cpp @@ -257,61 +257,17 @@ void CloseSelection(Mesh* obj) void RestrictSelectionToSubset(Mesh* obj, int si) { - SubsetHandler& sh = obj->subset_handler(); - Selector& sel = obj->selector(); - -// Store selected elements that are contained in the specified subset - std::vector vVertices; - for(VertexIterator vIter = sel.begin(); vIter != sel.end(); ++vIter){ - Vertex* vrt = *vIter; - if(sh.get_subset_index(vrt) == si){ - vVertices.push_back(vrt); - } - } - - std::vector vEdges; - for(EdgeIterator eIter = sel.begin(); eIter != sel.end(); ++eIter){ - Edge* e = *eIter; - if(sh.get_subset_index(e) == si){ - vEdges.push_back(e); - } - } - - std::vector vFaces; - for(FaceIterator fIter = sel.begin(); fIter != sel.end(); ++fIter){ - Face* f = *fIter; - if(sh.get_subset_index(f) == si){ - vFaces.push_back(f); - } - } - - std::vector vVolumes; - for(VolumeIterator volIter = sel.begin(); volIter != sel.end(); ++volIter){ - Volume* v = *volIter; - if(sh.get_subset_index(v) == si){ - vVolumes.push_back(v); - } - } - -// Clear selector - sel.clear(); - -// Reselect elements that were originally selected and are contained in the specified subset - for(size_t i = 0; i < vVertices.size(); ++i){ - sel.select(vVertices[i]); - } - - for(size_t i = 0; i < vEdges.size(); ++i){ - sel.select(vEdges[i]); - } - - for(size_t i = 0; i < vFaces.size(); ++i){ - sel.select(vFaces[i]); - } - - for(size_t i = 0; i < vVolumes.size(); ++i){ - sel.select(vVolumes[i]); - } + SubsetHandler& sh = obj->subset_handler(); + Selector& sel = obj->selector(); + + for(int i = 0; i < sh.num_subsets(); ++i){ + if(i != si){ + sel.deselect(sh.begin(i), sh.end(i)); + sel.deselect(sh.begin(i), sh.end(i)); + sel.deselect(sh.begin(i), sh.end(i)); + sel.deselect(sh.begin(i), sh.end(i)); + } + } } //////////////////////////////////////////////////////////////////////////////// From 4d2053f30bc509073ac9937559d7ff47dd8e0667 Mon Sep 17 00:00:00 2001 From: Martin Stepniewski Date: Fri, 5 Jun 2020 21:36:42 +0200 Subject: [PATCH 3/4] Taking care of unassigned elements in RestrictSelectionToSubset procedure introducing helper procedure DeselectUnassignedElementsHelper. --- tools/selection_tools.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/tools/selection_tools.cpp b/tools/selection_tools.cpp index e5db2da..e5a6339 100644 --- a/tools/selection_tools.cpp +++ b/tools/selection_tools.cpp @@ -192,6 +192,21 @@ static void SelectUnassignedElementsHelper( } } +template +static void DeselectUnassignedElementsHelper( + Grid& grid, + SubsetHandler& sh, + Selector& sel) +{ + typedef typename geometry_traits::iterator iterator; + for(iterator iter = grid.begin(); iter != grid.end(); ++iter) + { + if(sh.get_subset_index(*iter) == -1){ + sel.deselect(*iter); + } + } +} + void SelectUnassignedElements( Mesh* obj, bool selVrts, @@ -259,6 +274,12 @@ void RestrictSelectionToSubset(Mesh* obj, int si) { SubsetHandler& sh = obj->subset_handler(); Selector& sel = obj->selector(); + Grid& grid = obj->grid(); + + DeselectUnassignedElementsHelper(grid, sh, sel); + DeselectUnassignedElementsHelper(grid, sh, sel); + DeselectUnassignedElementsHelper(grid, sh, sel); + DeselectUnassignedElementsHelper(grid, sh, sel); for(int i = 0; i < sh.num_subsets(); ++i){ if(i != si){ From d63f343a29d9e00ee36a902a7fe363be2238e9cd Mon Sep 17 00:00:00 2001 From: Martin Stepniewski Date: Mon, 8 Jun 2020 12:11:41 +0200 Subject: [PATCH 4/4] More efficient implementation of 'RestrictSelectionToSubset'. --- tools/selection_tools.cpp | 57 ++++++++++++++++++++------------------- 1 file changed, 30 insertions(+), 27 deletions(-) diff --git a/tools/selection_tools.cpp b/tools/selection_tools.cpp index e5a6339..09b11dd 100644 --- a/tools/selection_tools.cpp +++ b/tools/selection_tools.cpp @@ -194,17 +194,17 @@ static void SelectUnassignedElementsHelper( template static void DeselectUnassignedElementsHelper( - Grid& grid, - SubsetHandler& sh, - Selector& sel) + Grid& grid, + SubsetHandler& sh, + Selector& sel) { - typedef typename geometry_traits::iterator iterator; - for(iterator iter = grid.begin(); iter != grid.end(); ++iter) - { - if(sh.get_subset_index(*iter) == -1){ - sel.deselect(*iter); - } - } + typedef typename geometry_traits::iterator iterator; + for(iterator iter = grid.begin(); iter != grid.end(); ++iter) + { + if(sh.get_subset_index(*iter) == -1){ + sel.deselect(*iter); + } + } } void SelectUnassignedElements( @@ -270,25 +270,28 @@ void CloseSelection(Mesh* obj) CloseSelection (obj->selector()); } +template +void RestrictSelectionToSubset (Selector& sel, const SubsetHandler& sh, int si) +{ + typedef typename geometry_traits::iterator iterator; + + for (iterator iter = sel.begin(); iter != sel.end();){ + TElem* elem = *iter; + ++iter; + if (sh.get_subset_index(elem) != si) + sel.deselect(elem); + } +} + void RestrictSelectionToSubset(Mesh* obj, int si) { - SubsetHandler& sh = obj->subset_handler(); - Selector& sel = obj->selector(); - Grid& grid = obj->grid(); - - DeselectUnassignedElementsHelper(grid, sh, sel); - DeselectUnassignedElementsHelper(grid, sh, sel); - DeselectUnassignedElementsHelper(grid, sh, sel); - DeselectUnassignedElementsHelper(grid, sh, sel); - - for(int i = 0; i < sh.num_subsets(); ++i){ - if(i != si){ - sel.deselect(sh.begin(i), sh.end(i)); - sel.deselect(sh.begin(i), sh.end(i)); - sel.deselect(sh.begin(i), sh.end(i)); - sel.deselect(sh.begin(i), sh.end(i)); - } - } + SubsetHandler& sh = obj->subset_handler(); + Selector& sel = obj->selector(); + + RestrictSelectionToSubset(sel, sh, si); + RestrictSelectionToSubset(sel, sh, si); + RestrictSelectionToSubset(sel, sh, si); + RestrictSelectionToSubset(sel, sh, si); } ////////////////////////////////////////////////////////////////////////////////