From 63e09bcbc223465cff815dd1a80b0ee27c3607e4 Mon Sep 17 00:00:00 2001 From: wmayer Date: Wed, 24 Feb 2016 21:31:12 +0100 Subject: [PATCH] + add convenience methods to query/alter selection of mesh object --- src/Mod/Mesh/App/Mesh.cpp | 16 ++++++++++++---- src/Mod/Mesh/App/Mesh.h | 2 ++ src/Mod/Mesh/Gui/ViewProvider.cpp | 25 +++++++++++++++++++++++++ src/Mod/Mesh/Gui/ViewProvider.h | 2 ++ 4 files changed, 41 insertions(+), 4 deletions(-) diff --git a/src/Mod/Mesh/App/Mesh.cpp b/src/Mod/Mesh/App/Mesh.cpp index 43f619bed..6a2e726b3 100644 --- a/src/Mod/Mesh/App/Mesh.cpp +++ b/src/Mod/Mesh/App/Mesh.cpp @@ -592,16 +592,24 @@ void MeshObject::getPointsFromSelection(std::vector& inds) const MeshCore::MeshAlgorithm(this->_kernel).GetPointsFlag(inds, MeshCore::MeshPoint::SELECTED); } +unsigned long MeshObject::countSelectedFacets() const +{ + return MeshCore::MeshAlgorithm(this->_kernel).CountFacetFlag(MeshCore::MeshFacet::SELECTED); +} + bool MeshObject::hasSelectedFacets() const { - unsigned long ct = MeshCore::MeshAlgorithm(this->_kernel).CountFacetFlag(MeshCore::MeshFacet::SELECTED); - return ct > 0; + return (countSelectedFacets() > 0); +} + +unsigned long MeshObject::countSelectedPoints() const +{ + return MeshCore::MeshAlgorithm(this->_kernel).CountPointFlag(MeshCore::MeshPoint::SELECTED); } bool MeshObject::hasSelectedPoints() const { - unsigned long ct = MeshCore::MeshAlgorithm(this->_kernel).CountPointFlag(MeshCore::MeshPoint::SELECTED); - return ct > 0; + return (countSelectedPoints() > 0); } std::vector MeshObject::getPointsFromFacets(const std::vector& facets) const diff --git a/src/Mod/Mesh/App/Mesh.h b/src/Mod/Mesh/App/Mesh.h index 74d224382..5e75bf3ee 100644 --- a/src/Mod/Mesh/App/Mesh.h +++ b/src/Mod/Mesh/App/Mesh.h @@ -220,7 +220,9 @@ public: void addPointsToSelection(const std::vector&) const; void removeFacetsFromSelection(const std::vector&) const; void removePointsFromSelection(const std::vector&) const; + unsigned long countSelectedFacets() const; bool hasSelectedFacets() const; + unsigned long countSelectedPoints() const; bool hasSelectedPoints() const; void getFacetsFromSelection(std::vector&) const; void getPointsFromSelection(std::vector&) const; diff --git a/src/Mod/Mesh/Gui/ViewProvider.cpp b/src/Mod/Mesh/Gui/ViewProvider.cpp index 3cf05a785..fc0b8dd50 100644 --- a/src/Mod/Mesh/Gui/ViewProvider.cpp +++ b/src/Mod/Mesh/Gui/ViewProvider.cpp @@ -1697,6 +1697,13 @@ void ViewProviderMesh::deselectFacet(unsigned long facet) } } +bool ViewProviderMesh::isFacetSelected(unsigned long facet) +{ + const Mesh::MeshObject& rMesh = static_cast(pcObject)->Mesh.getValue(); + const MeshCore::MeshFacetArray& faces = rMesh.getKernel().GetFacets(); + return faces[facet].IsFlag(MeshCore::MeshFacet::SELECTED); +} + void ViewProviderMesh::selectComponent(unsigned long uFacet) { std::vector selection; @@ -1766,6 +1773,24 @@ void ViewProviderMesh::removeSelection(const std::vector& indices unhighlightSelection(); } +void ViewProviderMesh::invertSelection() +{ + const Mesh::MeshObject& rMesh = static_cast(pcObject)->Mesh.getValue(); + const MeshCore::MeshFacetArray& faces = rMesh.getKernel().GetFacets(); + unsigned long num_notsel = std::count_if(faces.begin(), faces.end(), + std::bind2nd(MeshCore::MeshIsNotFlag(), + MeshCore::MeshFacet::SELECTED)); + std::vector notselect; + notselect.reserve(num_notsel); + MeshCore::MeshFacetArray::_TConstIterator beg = faces.begin(); + MeshCore::MeshFacetArray::_TConstIterator end = faces.end(); + for (MeshCore::MeshFacetArray::_TConstIterator jt = beg; jt != end; ++jt) { + if (!jt->IsFlag(MeshCore::MeshFacet::SELECTED)) + notselect.push_back(jt-beg); + } + setSelection(notselect); +} + void ViewProviderMesh::clearSelection() { const Mesh::MeshObject& rMesh = static_cast(pcObject)->Mesh.getValue(); diff --git a/src/Mod/Mesh/Gui/ViewProvider.h b/src/Mod/Mesh/Gui/ViewProvider.h index c684e5abf..d0e5af03d 100644 --- a/src/Mod/Mesh/Gui/ViewProvider.h +++ b/src/Mod/Mesh/Gui/ViewProvider.h @@ -138,6 +138,7 @@ public: /** @name Editing */ //@{ bool doubleClicked(void){ return false; } + bool isFacetSelected(unsigned long facet); void selectComponent(unsigned long facet); void deselectComponent(unsigned long facet); void selectFacet(unsigned long facet); @@ -145,6 +146,7 @@ public: void setSelection(const std::vector&); void addSelection(const std::vector&); void removeSelection(const std::vector&); + void invertSelection(); void clearSelection(); void deleteSelection(); void getFacetsFromPolygon(const std::vector& picked,