/*===========================================================================*\
* *
* OpenFlipper *
* Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen *
* www.openflipper.org *
* *
*--------------------------------------------------------------------------- *
* This file is part of OpenFlipper. *
* *
* OpenFlipper is free software: you can redistribute it and/or modify *
* it under the terms of the GNU Lesser General Public License as *
* published by the Free Software Foundation, either version 3 of *
* the License, or (at your option) any later version with the *
* following exceptions: *
* *
* If other files instantiate templates or use macros *
* or inline functions from this file, or you compile this file and *
* link it with other files to produce an executable, this file does *
* not by itself cause the resulting executable to be covered by the *
* GNU Lesser General Public License. This exception does not however *
* invalidate any other reasons why the executable file might be *
* covered by the GNU Lesser General Public License. *
* *
* OpenFlipper is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU Lesser General Public License for more details. *
* *
* You should have received a copy of the GNU LesserGeneral Public *
* License along with OpenFlipper. If not, *
* see . *
* *
\*===========================================================================*/
/*===========================================================================*\
* *
* $Revision$ *
* $LastChangedBy$ *
* $Date$ *
* *
\*===========================================================================*/
//=============================================================================
//
// IMPLEMENTATION
//
//=============================================================================
#define MESHSELECTION_C
//== INCLUDES =================================================================
#include "MeshSelectionT.hh"
#include
#include
#include
//== NAMESPACES ===============================================================
namespace MeshSelection {
//== IMPLEMENTATION ==========================================================
//=========================================================
//== Vertex Selection =====================================
//=========================================================
template< typename MeshT >
inline
void selectVertices(MeshT* _mesh, const std::vector< int >& _vertices) {
const int n_vertices = (int)_mesh->n_vertices();
for ( uint i = 0 ; i < _vertices.size() ; ++i )
if ( (_vertices[i] >= 0) && ( _vertices[i] < n_vertices ) ) {
typename MeshT::VertexHandle vh(_vertices[i]);
_mesh->status(vh).set_selected(true);
}
}
//=========================================================
template< typename MeshT >
inline
void unselectVertices(MeshT* _mesh, const std::vector< int >& _vertices) {
const int n_vertices = (int)_mesh->n_vertices();
for ( uint i = 0 ; i < _vertices.size() ; ++i )
if ( (_vertices[i] >= 0) && ( _vertices[i] < n_vertices ) ) {
typename MeshT::VertexHandle vh(_vertices[i]);
_mesh->status(vh).set_selected(false);
}
}
//=========================================================
template< typename MeshT >
inline
void selectAllVertices(MeshT* _mesh) {
typename MeshT::VertexIter v_it, v_end=_mesh->vertices_end();
for (v_it = _mesh->vertices_begin(); v_it != v_end ; ++v_it)
_mesh->status(*v_it).set_selected(true);
}
//=========================================================
template< typename MeshT >
inline
void clearVertexSelection(MeshT* _mesh) {
typename MeshT::VertexIter v_it, v_end=_mesh->vertices_end();
for (v_it = _mesh->vertices_begin(); v_it != v_end ; ++v_it)
_mesh->status(*v_it).set_selected(false);
}
//=========================================================
template< typename MeshT >
inline
void invertVertexSelection(MeshT* _mesh) {
typename MeshT::VertexIter v_it, v_end=_mesh->vertices_end();
for (v_it = _mesh->vertices_begin(); v_it != v_end ; ++v_it)
_mesh->status(*v_it).set_selected( ! _mesh->status(*v_it).selected());
}
//=========================================================
template< typename MeshT >
inline
void selectBoundaryVertices(MeshT* _mesh) {
typename MeshT::HalfedgeIter he_it, he_end=_mesh->halfedges_end();
for (he_it = _mesh->halfedges_begin(); he_it != he_end ; ++he_it)
if (_mesh->is_boundary(*he_it) ) {
_mesh->status(_mesh->to_vertex_handle(*he_it)).set_selected(true);
_mesh->status(_mesh->from_vertex_handle(*he_it)).set_selected(true);
}
}
//-----------------------------------------------------------------------------
template< typename MeshT >
inline
void shrinkVertexSelection(MeshT* _mesh) {
OpenMesh::VPropHandleT< bool > temp_shrink;
_mesh->add_property( temp_shrink, "Temp property for Vertex selection shrinking" );
typename MeshT::VertexIter v_it, v_end=_mesh->vertices_end();
// initialize property ( copy status to new property )
for (v_it = _mesh->vertices_begin(); v_it != v_end ; ++v_it)
_mesh->property(temp_shrink,*v_it) = _mesh->status(*v_it).selected();
// update selection
for (v_it = _mesh->vertices_begin(); v_it != v_end ; ++v_it)
if ( _mesh->property(temp_shrink,*v_it) ) {
_mesh->status(*v_it).set_selected( true );
for ( typename MeshT::VertexVertexIter vv_it(*_mesh,*v_it); vv_it.is_valid(); ++vv_it)
if ( ! _mesh->property(temp_shrink,*vv_it) ){
_mesh->status(*v_it).set_selected( false );
break;
}
}
_mesh->remove_property(temp_shrink);
}
//=========================================================
template< typename MeshT >
inline
void growVertexSelection(MeshT* _mesh) {
OpenMesh::VPropHandleT< bool > temp_grow;
_mesh->add_property( temp_grow, "Temp property for Vertex selection growing" );
// initialize property ( copy status to new property )
typename MeshT::VertexIter v_it, v_end=_mesh->vertices_end();
for (v_it = _mesh->vertices_begin(); v_it != v_end ; ++v_it)
_mesh->property(temp_grow,*v_it) = _mesh->status(*v_it).selected();
// update selection
for (v_it = _mesh->vertices_begin(); v_it != v_end ; ++v_it)
if ( _mesh->property(temp_grow,*v_it) )
for ( typename MeshT::VertexVertexIter vv_it(*_mesh,*v_it); vv_it.is_valid(); ++vv_it)
_mesh->status(*vv_it).set_selected( true );
_mesh->remove_property(temp_grow);
}
//=========================================================
template< typename MeshT >
inline
std::vector< int > getVertexSelection(MeshT* _mesh) {
std::vector< int > selection;
for ( typename MeshT::VertexIter v_it= _mesh->vertices_begin() ; v_it != _mesh->vertices_end() ; ++v_it )
if ( _mesh->status(*v_it).selected() )
selection.push_back( v_it->idx() );
return selection;
}
//=========================================================
template< typename MeshT >
inline
std::vector< int > getVertexSelection(MeshT* _mesh, bool& _invert) {
std::vector< int > selection;
int count = 0;
for ( typename MeshT::VertexIter v_it= _mesh->vertices_begin() ; v_it != _mesh->vertices_end() ; ++v_it )
if ( _mesh->status(*v_it).selected() )
++count;
if ( count > (int)( _mesh->n_vertices() / 2) )
_invert = true;
else
_invert = false;
for ( typename MeshT::VertexIter v_it= _mesh->vertices_begin() ; v_it != _mesh->vertices_end() ; ++v_it )
if ( _mesh->status(*v_it).selected() ^ _invert )
selection.push_back( v_it->idx() );
return selection;
}
template< typename MeshT >
inline
void selectBoundaryVertices(MeshT* _mesh, const typename MeshT::VertexHandle& _vh){
OpenMesh::VPropHandleT< bool > visited;
_mesh->add_property(visited, "Visited Vertices");
typename MeshT::VertexIter v_it, v_end = _mesh->vertices_end();
for (v_it = _mesh->vertices_begin(); v_it != v_end; ++v_it)
_mesh->property(visited, *v_it) = false;
std::stack< typename MeshT::VertexHandle > stack;
stack.push( _vh );
while (!stack.empty()){
typename MeshT::VertexHandle vh = stack.top();
stack.pop();
if (_mesh->property(visited,vh))
continue;
//find outgoing boundary-edges
for (typename MeshT::VertexOHalfedgeIter voh_it(*_mesh,vh); voh_it.is_valid(); ++voh_it)
if ( _mesh->is_boundary( _mesh->edge_handle( *voh_it ) ) )
stack.push( _mesh->to_vertex_handle(*voh_it) );
//select vertex
_mesh->property(visited,vh) = true;
_mesh->status( vh ).set_selected(true);
}
_mesh->remove_property(visited);
}
template< typename MeshT >
inline
void convertVertexToEdgeSelection(MeshT* _mesh, const std::vector< int >& _vertices) {
for ( std::vector::const_iterator v = _vertices.begin(); v != _vertices.end(); ++v) {
typename MeshT::VertexHandle vh(*v);
typename MeshT::VertexOHalfedgeIter ohe_iter = _mesh->voh_iter(vh);
for (; ohe_iter.is_valid(); ++ohe_iter) {
// test if both incident vertices are in _vertices
typename MeshT::VertexHandle ovh = _mesh->to_vertex_handle(*ohe_iter);
// search for ovh in _vertices
for(std::vector::const_iterator it = _vertices.begin(); it != _vertices.end(); ++it) {
if((*it) == ovh.idx()) {
_mesh->status(_mesh->edge_handle(*ohe_iter)).set_selected(true);
break;
}
}
}
}
}
template< typename MeshT >
inline
void convertVertexToEdgeSelection(MeshT* _mesh) {
typename MeshT::VertexIter v_it, v_end = _mesh->vertices_end();
for (v_it = _mesh->vertices_begin(); v_it != v_end; ++v_it) {
if ( _mesh->status( *v_it ).selected() ) {
typename MeshT::VertexOHalfedgeIter ohe_iter = _mesh->voh_iter(*v_it);
for (; ohe_iter.is_valid(); ++ohe_iter) {
// test if both incident vertices are in _vertices
typename MeshT::VertexHandle ovh = _mesh->to_vertex_handle(*ohe_iter);
if (_mesh->status(ovh).selected())
_mesh->status(_mesh->edge_handle(*ohe_iter)).set_selected(true);
}
}
}
}
template< typename MeshT >
inline
void convertVertexToHalfedgeSelection(MeshT* _mesh, const std::vector< int >& _vertices) {
for (std::vector::const_iterator v = _vertices.begin(); v != _vertices.end(); ++v) {
typename MeshT::VertexHandle vh(*v);
typename MeshT::VertexOHalfedgeIter ohe_iter = _mesh->voh_iter(vh);
for (; ohe_iter.is_valid(); ++ohe_iter) {
// test if both incident vertices are in _vertices
typename MeshT::VertexHandle ovh = _mesh->to_vertex_handle(*ohe_iter);
// search for ovh in _vertices
for(std::vector::const_iterator it = _vertices.begin(); it != _vertices.end(); ++it) {
if((*it) == ovh.idx()) {
_mesh->status(*ohe_iter).set_selected(true);
_mesh->status(_mesh->opposite_halfedge_handle(*ohe_iter)).set_selected(true);
break;
}
}
}
}
}
template< typename MeshT >
inline
void convertVertexToHalfedgeSelection(MeshT* _mesh) {
typename MeshT::VertexIter v_it, v_end = _mesh->vertices_end();
for (v_it = _mesh->vertices_begin(); v_it != v_end; ++v_it) {
if ( _mesh->status( *v_it ).selected() ) {
typename MeshT::VertexOHalfedgeIter ohe_iter = _mesh->voh_iter(*v_it);
for (; ohe_iter.is_valid(); ++ohe_iter) {
// test if both incident vertices are in _vertices
typename MeshT::VertexHandle ovh = _mesh->to_vertex_handle(*ohe_iter);
if (_mesh->status(ovh).selected()) {
_mesh->status(*ohe_iter).set_selected(true);
_mesh->status(_mesh->opposite_halfedge_handle(*ohe_iter)).set_selected(true);
}
}
}
}
}
template< typename MeshT >
inline
void convertVertexToFaceSelection(MeshT* _mesh, const std::vector< int >& _vertices) {
for(typename MeshT::FaceIter f_it = _mesh->faces_begin(); f_it != _mesh->faces_end(); ++f_it) {
typename MeshT::FaceVertexIter fv_it = _mesh->fv_iter(*f_it);
// go over each vertex of each face and test if it's selected
bool allfound = true;
for(; fv_it.is_valid(); ++fv_it) {
// search fv_it in _vertices
bool onefound = false;
for(std::vector::const_iterator it = _vertices.begin(); it != _vertices.end(); ++it) {
if((*it) == fv_it->idx()) { onefound = true; break; }
}
if(!onefound) {
allfound = false;
break;
}
}
if(allfound) {
// all incident vertices are selected -> select face
_mesh->status(*f_it).set_selected(true);
}
}
}
template< typename MeshT >
inline
void convertVertexToFaceSelection(MeshT* _mesh) {
typename MeshT::FaceIter f_it, f_end = _mesh->faces_end();
for (f_it = _mesh->faces_begin(); f_it != f_end; ++f_it) {
typename MeshT::FaceVertexIter fv_it = _mesh->fv_iter(*f_it);
// test if all incident vertices are selected
bool allfound = true;
for(; fv_it.is_valid(); ++fv_it) {
if(!_mesh->status(*fv_it).selected()) {
allfound = false;
break;
}
}
if(allfound)
_mesh->status(*f_it).set_selected(true);
}
}
template< typename MeshT >
inline
void convertVertexSelectionToFeatureVertices(MeshT* _mesh) {
for (typename MeshT::VertexIter v_it = _mesh->vertices_begin(); v_it != _mesh->vertices_end(); ++v_it) {
if (_mesh->status(*v_it).selected()) {
_mesh->status(*v_it).set_feature(true);
} else {
_mesh->status(*v_it).set_feature(false);
}
}
}
template< typename MeshT >
inline
void convertFeatureVerticesToVertexSelection(MeshT* _mesh) {
for (typename MeshT::VertexIter v_it = _mesh->vertices_begin(); v_it != _mesh->vertices_end(); ++v_it) {
if (_mesh->status(*v_it).feature()) {
_mesh->status(*v_it).set_selected(true);
} else {
_mesh->status(*v_it).set_selected(false);
}
}
}
template< typename MeshT >
inline
void clearFeatureVertices(MeshT* _mesh) {
for (typename MeshT::VertexIter v_it = _mesh->vertices_begin(); v_it != _mesh->vertices_end(); ++v_it) {
_mesh->status(*v_it).set_feature(false);
}
}
//=========================================================
//== Modeling Regions =====================================
//=========================================================
template< typename MeshT >
inline
void setArea(MeshT* _mesh, const std::vector< int >& _vertices , unsigned int _type, bool _state) {
for ( uint i = 0 ; i < _vertices.size() ; ++i ) {
if ( _vertices[i] > (int)_mesh->n_vertices() )
continue;
typename MeshT::VertexHandle vh(_vertices[i]);
_mesh->status(vh).change_bit(_type, _state);
}
}
template< typename MeshT >
inline
void setArea(MeshT* _mesh , unsigned int _type, bool _state) {
for ( typename MeshT::VertexIter v_it= _mesh->vertices_begin() ; v_it != _mesh->vertices_end() ; ++v_it )
_mesh->status(*v_it).change_bit(_type, _state);
}
template< typename MeshT >
inline
std::vector< int > getArea(MeshT* _mesh, unsigned int _type) {
std::vector< int > selection;
for ( typename MeshT::VertexIter v_it= _mesh->vertices_begin() ; v_it != _mesh->vertices_end() ; ++v_it )
if ( _mesh->status(*v_it).is_bit_set( _type ) )
selection.push_back( v_it->idx() );
return selection;
}
template< typename MeshT >
inline
std::vector< int > getArea(MeshT* _mesh, unsigned int _type , bool& _invert) {
std::vector< int > selection;
int count = 0;
for ( typename MeshT::VertexIter v_it= _mesh->vertices_begin() ; v_it != _mesh->vertices_end() ; ++v_it )
if ( _mesh->status(*v_it).is_bit_set( _type ) )
++count;
if ( count > (int)( _mesh->n_vertices() / 2) )
_invert = true;
else
_invert = false;
for ( typename MeshT::VertexIter v_it= _mesh->vertices_begin() ; v_it != _mesh->vertices_end() ; ++v_it )
if ( _mesh->status(*v_it).is_bit_set( _type ) ^ _invert )
selection.push_back( v_it->idx() );
return selection;
}
//=========================================================
//== Edge Selection =====================================
//=========================================================
template< typename MeshT >
inline
void selectEdges(MeshT* _mesh, const std::vector< int >& _edges) {
const int n_edges = (int)_mesh->n_edges();
for ( uint i = 0 ; i < _edges.size() ; ++i )
if ( (_edges[i] >= 0) && ( _edges[i] < n_edges ) ) {
typename MeshT::EdgeHandle eh(_edges[i]);
_mesh->status(eh).set_selected(true);
}
}
//=========================================================
template< typename MeshT >
inline
void unselectEdges(MeshT* _mesh, const std::vector< int >& _edges) {
const int n_edges = (int)_mesh->n_edges();
for ( uint i = 0 ; i < _edges.size() ; ++i )
if ( (_edges[i] >= 0) && ( _edges[i] < n_edges ) ) {
typename MeshT::EdgeHandle eh(_edges[i]);
_mesh->status(eh).set_selected(false);
}
}
//=========================================================
template< typename MeshT >
inline
void selectAllEdges(MeshT* _mesh) {
typename MeshT::EdgeIter e_it, e_end=_mesh->edges_end();
for (e_it = _mesh->edges_begin(); e_it != e_end ; ++e_it)
_mesh->status(*e_it).set_selected(true);
}
//=========================================================
template< typename MeshT >
inline
void clearEdgeSelection(MeshT* _mesh) {
typename MeshT::EdgeIter e_it, e_end=_mesh->edges_end();
for (e_it = _mesh->edges_begin(); e_it != e_end ; ++e_it)
_mesh->status(*e_it).set_selected(false);
}
//=========================================================
template< typename MeshT >
inline
void invertEdgeSelection(MeshT* _mesh) {
typename MeshT::EdgeIter e_it, e_end=_mesh->edges_end();
for (e_it = _mesh->edges_begin(); e_it != e_end ; ++e_it)
_mesh->status(*e_it).set_selected( ! _mesh->status(*e_it).selected());
}
//=========================================================
template
inline
void growEdgeSelection(MeshT* _mesh) {
std::set selectedEhs;
for (typename MeshT::EdgeIter e_it = _mesh->edges_begin(), e_end = _mesh->edges_end();
e_it != e_end; ++e_it) {
if (!_mesh->status(*e_it).selected()) continue;
const typename MeshT::HalfedgeHandle he = _mesh->halfedge_handle(*e_it, 0);
const typename MeshT::VertexHandle vhs[] = { _mesh->from_vertex_handle(he),
_mesh->to_vertex_handle(he) };
for (int i = 0; i < 2; ++i) {
for (typename MeshT::VertexEdgeIter ve_it = _mesh->ve_begin(vhs[i]), ve_end = _mesh->ve_end(vhs[i]);
ve_it != ve_end; ++ve_it) {
selectedEhs.insert(ve_it.handle());
}
}
}
for (typename std::set::const_iterator it = selectedEhs.begin(); it != selectedEhs.end(); ++it)
_mesh->status(*it).set_selected(true);
}
//=========================================================
template< typename MeshT >
inline
void selectBoundaryEdges(MeshT* _mesh) {
typename MeshT::EdgeIter e_it, e_end=_mesh->edges_end();
for (e_it = _mesh->edges_begin(); e_it != e_end ; ++e_it)
if ( _mesh->is_boundary( _mesh->halfedge_handle(*e_it,0) ) ||
_mesh->is_boundary( _mesh->halfedge_handle(*e_it,1) ) )
_mesh->status(*e_it).set_selected( true );
}
//=========================================================
template< typename MeshT >
inline
std::vector< int > getEdgeSelection(MeshT* _mesh) {
std::vector< int > selection;
for ( typename MeshT::EdgeIter e_it= _mesh->edges_begin() ; e_it != _mesh->edges_end() ; ++e_it )
if ( _mesh->status(*e_it).selected() )
selection.push_back( e_it->idx() );
return selection;
}
//=========================================================
template< typename MeshT >
inline
std::vector< int > getEdgeSelection(MeshT* _mesh, bool& _invert) {
std::vector< int > selection;
int count = 0;
for ( typename MeshT::VertexIter e_it= _mesh->edges_begin() ; e_it != _mesh->edges_end() ; ++e_it )
if ( _mesh->status(*e_it).selected() )
++count;
if ( count > (int)( _mesh->n_vertices() / 2) )
_invert = true;
else
_invert = false;
for ( typename MeshT::VertexIter e_it= _mesh->edges_begin() ; e_it != _mesh->edges_end() ; ++e_it )
if ( _mesh->status(*e_it).selected() ^ _invert )
selection.push_back( e_it->idx() );
return selection;
}
template< typename MeshT >
inline
void convertEdgeToVertexSelection(MeshT* _mesh, const std::vector< int >& _edges) {
for (std::vector::const_iterator e = _edges.begin(); e != _edges.end(); ++e) {
typename MeshT::EdgeHandle eh(*e);
typename MeshT::HalfedgeHandle heh0 = _mesh->halfedge_handle(eh, 0);
typename MeshT::VertexHandle vh0 = _mesh->to_vertex_handle(heh0);
typename MeshT::VertexHandle vh1 = _mesh->from_vertex_handle(heh0);
_mesh->status(vh0).set_selected(true);
_mesh->status(vh1).set_selected(true);
}
}
template< typename MeshT >
inline
void convertEdgeToVertexSelection(MeshT* _mesh) {
for ( typename MeshT::EdgeIter e_it= _mesh->edges_begin() ; e_it != _mesh->edges_end() ; ++e_it )
if ( _mesh->status(*e_it).selected() ){
typename MeshT::HalfedgeHandle heh0 = _mesh->halfedge_handle(*e_it, 0);
typename MeshT::VertexHandle vh0 = _mesh->to_vertex_handle(heh0);
typename MeshT::VertexHandle vh1 = _mesh->from_vertex_handle(heh0);
_mesh->status(vh0).set_selected(true);
_mesh->status(vh1).set_selected(true);
}
}
template< typename MeshT >
inline
void convertEdgeToFaceSelection(MeshT* _mesh, const std::vector< int >& _edges) {
for(typename MeshT::FaceIter f_it = _mesh->faces_begin(); f_it != _mesh->faces_end(); ++f_it) {
typename MeshT::FaceEdgeIter fe_it = _mesh->fe_iter(*f_it);
// go over each edge of each face and test if it's selected
bool allfound = true;
for(; fe_it.is_valid(); ++fe_it) {
// search fe_it in _edges
bool onefound = false;
for(std::vector::const_iterator it = _edges.begin(); it != _edges.end(); ++it) {
if((*it) == fe_it->idx()) { onefound = true; break; }
}
if(!onefound) {
allfound = false;
break;
}
}
if(allfound) {
// all incident vertices are selected -> select face
_mesh->status(*f_it).set_selected(true);
}
}
}
template< typename MeshT >
inline
void convertEdgeToFaceSelection(MeshT* _mesh) {
typename MeshT::FaceIter f_it, f_end = _mesh->faces_end();
for (f_it = _mesh->faces_begin(); f_it != f_end; ++f_it) {
typename MeshT::FaceEdgeIter fe_it = _mesh->fe_iter(*f_it);
// test if all incident edges are selected
bool allfound = true;
for(; fe_it.is_valid(); ++fe_it) {
if(!_mesh->status(*fe_it).selected()) {
allfound = false;
break;
}
}
if(allfound)
_mesh->status(*f_it).set_selected(true);
}
}
template< typename MeshT >
inline
void convertEdgeToHalfedgeSelection(MeshT* _mesh) {
for ( typename MeshT::EdgeIter e_it= _mesh->edges_begin() ; e_it != _mesh->edges_end() ; ++e_it )
if ( _mesh->status(*e_it).selected() ){
_mesh->status(_mesh->halfedge_handle(*e_it, 0)).set_selected(true);
_mesh->status(_mesh->halfedge_handle(*e_it, 1)).set_selected(true);
}
}
template< typename MeshT >
inline
void convertEdgeSelectionToFeatureEdges(MeshT* _mesh) {
for (typename MeshT::EdgeIter e_it = _mesh->edges_begin(); e_it != _mesh->edges_end(); ++e_it) {
if (_mesh->status(*e_it).selected()) {
_mesh->status(*e_it).set_feature(true);
} else {
_mesh->status(*e_it).set_feature(false);
}
}
}
template< typename MeshT >
inline
void convertFeatureEdgesToEdgeSelection(MeshT* _mesh) {
for (typename MeshT::EdgeIter e_it = _mesh->edges_begin(); e_it != _mesh->edges_end(); ++e_it) {
if (_mesh->status(*e_it).feature()) {
_mesh->status(*e_it).set_selected(true);
} else {
_mesh->status(*e_it).set_selected(false);
}
}
}
template< typename MeshT >
inline
void clearFeatureEdges(MeshT* _mesh) {
for (typename MeshT::EdgeIter e_it = _mesh->edges_begin(); e_it != _mesh->edges_end(); ++e_it) {
_mesh->status(*e_it).set_feature(false);
}
}
//=========================================================
//== Halfedge Selection =====================================
//=========================================================
template< typename MeshT >
inline
void selectHalfedges(MeshT* _mesh, const std::vector< int >& _halfedges) {
const int n_halfedges = (int)_mesh->n_halfedges();
for ( uint i = 0 ; i < _halfedges.size() ; ++i )
if ( (_halfedges[i] >= 0) && ( _halfedges[i] < n_halfedges ) ) {
typename MeshT::HalfedgeHandle heh(_halfedges[i]);
_mesh->status(heh).set_selected(true);
}
}
//=========================================================
template< typename MeshT >
inline
void unselectHalfedges(MeshT* _mesh, const std::vector< int >& _halfedges) {
const int n_halfedges = (int)_mesh->n_halfedges();
for ( uint i = 0 ; i < _halfedges.size() ; ++i )
if ( (_halfedges[i] >= 0) && ( _halfedges[i] < n_halfedges ) ) {
typename MeshT::HalfedgeHandle heh(_halfedges[i]);
_mesh->status(heh).set_selected(false);
}
}
//=========================================================
template< typename MeshT >
inline
void selectAllHalfedges(MeshT* _mesh) {
typename MeshT::HalfedgeIter he_it, he_end=_mesh->halfedges_end();
for (he_it = _mesh->halfedges_begin(); he_it != he_end ; ++he_it)
_mesh->status(*he_it).set_selected(true);
}
//=========================================================
template< typename MeshT >
inline
void clearHalfedgeSelection(MeshT* _mesh) {
typename MeshT::HalfedgeIter he_it, he_end=_mesh->halfedges_end();
for (he_it = _mesh->halfedges_begin(); he_it != he_end ; ++he_it)
_mesh->status(*he_it).set_selected(false);
}
//=========================================================
template< typename MeshT >
inline
void invertHalfedgeSelection(MeshT* _mesh) {
typename MeshT::HalfedgeIter he_it, he_end=_mesh->halfedges_end();
for (he_it = _mesh->halfedges_begin(); he_it != he_end ; ++he_it)
_mesh->status(*he_it).set_selected( ! _mesh->status(*he_it).selected());
}
//=========================================================
template< typename MeshT >
inline
void selectBoundaryHalfedges(MeshT* _mesh) {
typename MeshT::HalfedgeIter he_it, he_end=_mesh->halfedges_end();
for (he_it = _mesh->halfedges_begin(); he_it != he_end ; ++he_it)
if ( _mesh->is_boundary( *he_it))
_mesh->status(*he_it).set_selected( true );
}
//=========================================================
template< typename MeshT >
inline
std::vector< int > getHalfedgeSelection(MeshT* _mesh) {
std::vector< int > selection;
for ( typename MeshT::HalfedgeIter he_it= _mesh->halfedges_begin() ; he_it != _mesh->halfedges_end() ; ++he_it )
if ( _mesh->status(*he_it).selected() )
selection.push_back( he_it->idx() );
return selection;
}
template< typename MeshT >
inline
void convertHalfedgeToVertexSelection(MeshT* _mesh) {
for ( typename MeshT::HalfedgeIter he_it= _mesh->halfedges_begin() ; he_it != _mesh->halfedges_end() ; ++he_it ) {
if(_mesh->status(*he_it).selected()) {
_mesh->status(_mesh->to_vertex_handle(*he_it)).set_selected(true);
_mesh->status(_mesh->from_vertex_handle(*he_it)).set_selected(true);
}
}
}
template< typename MeshT >
inline
void convertHalfedgeToEdgeSelection(MeshT* _mesh) {
for ( typename MeshT::HalfedgeIter he_it= _mesh->halfedges_begin() ; he_it != _mesh->halfedges_end() ; ++he_it ) {
if(_mesh->status(*he_it).selected()) {
_mesh->status(_mesh->edge_handle(*he_it)).set_selected(true);
}
}
}
template< typename MeshT >
inline
void convertHalfedgeToFaceSelection(MeshT* _mesh) {
// Note: A face is not only selected
// iff all incident halfedges are selected but
// at least one of them. This is, however,
// desired in some cases.
for ( typename MeshT::HalfedgeIter he_it= _mesh->halfedges_begin() ; he_it != _mesh->halfedges_end() ; ++he_it ) {
if(_mesh->status(*he_it).selected()) {
_mesh->status(_mesh->face_handle(*he_it)).set_selected(true);
}
}
}
//=========================================================
//== Face Selection =======================================
//=========================================================
template< typename MeshT >
inline
void selectFaces(MeshT* _mesh, const std::vector< int >& _faces) {
const int n_faces = (int)_mesh->n_faces();
for ( uint i = 0 ; i < _faces.size() ; ++i )
if ( (_faces[i] >= 0) && ( _faces[i] < n_faces ) ) {
typename MeshT::FaceHandle fh(_faces[i]);
_mesh->status(fh).set_selected(true);
}
}
//=========================================================
template< typename MeshT >
inline
void unselectFaces(MeshT* _mesh, const std::vector< int >& _faces) {
const int n_faces = (int)_mesh->n_faces();
for ( uint i = 0 ; i < _faces.size() ; ++i )
if ( (_faces[i] >= 0) && ( _faces[i] < n_faces ) ) {
typename MeshT::FaceHandle fh(_faces[i]);
_mesh->status(fh).set_selected(false);
}
}
//=========================================================
template< typename MeshT >
inline
void selectAllFaces(MeshT* _mesh) {
typename MeshT::FaceIter f_it, f_end=_mesh->faces_end();
for (f_it = _mesh->faces_begin(); f_it != f_end ; ++f_it)
_mesh->status(*f_it).set_selected(true);
}
//=========================================================
template< typename MeshT >
inline
void clearFaceSelection(MeshT* _mesh) {
typename MeshT::FaceIter f_it, f_end=_mesh->faces_end();
for (f_it = _mesh->faces_begin(); f_it != f_end ; ++f_it)
_mesh->status(*f_it).set_selected(false);
}
//-----------------------------------------------------------------------------
template< typename MeshT >
inline
void invertFaceSelection(MeshT* _mesh) {
typename MeshT::FaceIter f_it, f_end=_mesh->faces_end();
for (f_it = _mesh->faces_begin(); f_it != f_end ; ++f_it)
_mesh->status(*f_it).set_selected( ! _mesh->status(*f_it).selected());
}
//=========================================================
template< typename MeshT >
inline
void selectBoundaryFaces(MeshT* _mesh) {
typename MeshT::HalfedgeIter he_it, he_end=_mesh->halfedges_end();
for (he_it = _mesh->halfedges_begin(); he_it != he_end ; ++he_it)
if (_mesh->is_boundary(*he_it) ) {
for (typename MeshT::VertexFaceIter vf_it(*_mesh ,_mesh->to_vertex_handle(*he_it) ) ; vf_it.is_valid() ; ++vf_it)
_mesh->status(*vf_it).set_selected(true);
for (typename MeshT::VertexFaceIter vf_it(*_mesh ,_mesh->from_vertex_handle(*he_it) ) ; vf_it.is_valid() ; ++vf_it)
_mesh->status(*vf_it).set_selected(true);
}
}
//=========================================================
template< typename MeshT >
inline
void shrinkFaceSelection(MeshT* _mesh) {
OpenMesh::FPropHandleT< bool > temp_shrink;
_mesh->add_property( temp_shrink, "Temp property for Face selection shrinking" );
typename MeshT::FaceIter f_it, f_end=_mesh->faces_end();
// initialize property ( copy status to new property )
for (f_it = _mesh->faces_begin(); f_it != f_end ; ++f_it)
_mesh->property(temp_shrink,*f_it) = _mesh->status(*f_it).selected();
// Shrink selection ( deselects all faces which are adjacent to a boundary vertex of the original selection)
for (f_it = _mesh->faces_begin(); f_it != f_end ; ++f_it)
if ( _mesh->property(temp_shrink,*f_it) ) {
bool boundary = false;
for ( typename MeshT::FaceVertexIter fv_it(*_mesh,*f_it); fv_it.is_valid() ; ++fv_it) {
for ( typename MeshT::VertexFaceIter vf_it(*_mesh,*fv_it); vf_it.is_valid() ; ++vf_it) {
if ( ! _mesh->property(temp_shrink,*vf_it) ) {
boundary = true;
}
}
if ( boundary )
break;
}
_mesh->status(*f_it).set_selected( !boundary );
}
_mesh->remove_property(temp_shrink);
}
//=========================================================
template< typename MeshT >
inline
void growFaceSelection(MeshT* _mesh) {
OpenMesh::FPropHandleT< bool > temp_grow;
_mesh->add_property( temp_grow, "Temp property for Face selection growing" );
typename MeshT::FaceIter f_it, f_end=_mesh->faces_end();
// initialize property ( copy status to new property )
for (f_it = _mesh->faces_begin(); f_it != f_end ; ++f_it)
_mesh->property(temp_grow,*f_it) = _mesh->status(*f_it).selected();
// Grow selection ( selects all faces which are adjacent to a vertex of a already selected face)
for (f_it = _mesh->faces_begin(); f_it != f_end ; ++f_it)
if ( _mesh->property(temp_grow,*f_it) )
for ( typename MeshT::FaceVertexIter fv_it(*_mesh,*f_it); fv_it.is_valid() ; ++fv_it)
for ( typename MeshT::VertexFaceIter vf_it(*_mesh,*fv_it); vf_it.is_valid() ; ++vf_it)
_mesh->status(*vf_it).set_selected( true );
_mesh->remove_property(temp_grow);
}
//=========================================================
template< typename MeshT >
inline
std::vector< int > getFaceSelection(MeshT* _mesh) {
std::vector< int > selection;
for ( typename MeshT::FaceIter f_it= _mesh->faces_begin() ; f_it != _mesh->faces_end() ; ++f_it )
if ( _mesh->status(*f_it).selected() )
selection.push_back( f_it->idx() );
return selection;
}
//=========================================================
template< typename MeshT >
inline
std::vector< int > getFaceSelection(MeshT* _mesh, bool& _invert) {
std::vector< int > selection;
int count = 0;
for ( typename MeshT::FaceIter f_it= _mesh->faces_begin() ; f_it != _mesh->faces_end() ; ++f_it )
if ( _mesh->status(*f_it).selected() )
++count;
if ( count > (int)( _mesh->n_vertices() / 2) )
_invert = true;
else
_invert = false;
for ( typename MeshT::FaceIter f_it= _mesh->faces_begin() ; f_it != _mesh->faces_end() ; ++f_it )
if ( _mesh->status(*f_it).selected() ^ _invert )
selection.push_back( f_it->idx() );
return selection;
}
template< typename MeshT >
inline
void convertFaceToVertexSelection(MeshT* _mesh, const std::vector< int >& _faces) {
for (std::vector::const_iterator f = _faces.begin(); f != _faces.end(); ++f) {
typename MeshT::FaceHandle fh(*f);
typename MeshT::FaceVertexIter v_iter = _mesh->fv_iter(fh);
for (; v_iter.is_valid(); ++v_iter) {
_mesh->status(*v_iter).set_selected(true);
}
}
}
template< typename MeshT >
inline
void convertFaceToVertexSelection(MeshT* _mesh) {
for ( typename MeshT::FaceIter f_it= _mesh->faces_begin() ; f_it != _mesh->faces_end() ; ++f_it )
if ( _mesh->status(*f_it).selected() ){
typename MeshT::FaceVertexIter v_iter = _mesh->fv_iter(*f_it);
for (; v_iter.is_valid(); ++v_iter)
_mesh->status(*v_iter).set_selected(true);
}
}
template< typename MeshT >
inline
void convertFaceToEdgeSelection(MeshT* _mesh, const std::vector< int >& _faces) {
for (std::vector::const_iterator f = _faces.begin(); f != _faces.end(); ++f) {
typename MeshT::FaceHandle fh(*f);
typename MeshT::FaceEdgeIter e_iter = _mesh->fe_iter(fh);
for (; e_iter.is_valid(); ++e_iter) {
_mesh->status(*e_iter).set_selected(true);
}
}
}
template< typename MeshT >
inline
void convertFaceToEdgeSelection(MeshT* _mesh) {
for ( typename MeshT::FaceIter f_it= _mesh->faces_begin() ; f_it != _mesh->faces_end() ; ++f_it )
if ( _mesh->status(*f_it).selected() ){
typename MeshT::FaceEdgeIter e_iter = _mesh->fe_iter(*f_it);
for (; e_iter.is_valid(); ++e_iter)
_mesh->status(*e_iter).set_selected(true);
}
}
template< typename MeshT >
inline
void convertFaceToHalfedgeSelection(MeshT* _mesh) {
for ( typename MeshT::FaceIter f_it= _mesh->faces_begin() ; f_it != _mesh->faces_end() ; ++f_it )
if ( _mesh->status(*f_it).selected() ){
typename MeshT::FaceHalfedgeIter fh_iter = _mesh->fh_iter(*f_it);
for (; fh_iter.is_valid(); ++fh_iter)
_mesh->status(*fh_iter).set_selected(true);
}
}
template< typename MeshT >
inline
void convertFaceSelectionToFeatureFaces(MeshT* _mesh) {
for (typename MeshT::FaceIter f_it = _mesh->faces_begin(); f_it != _mesh->faces_end(); ++f_it) {
if (_mesh->status(*f_it).selected()) {
_mesh->status(*f_it).set_feature(true);
} else {
_mesh->status(*f_it).set_feature(false);
}
}
}
template< typename MeshT >
inline
void convertFeatureFacesToFaceSelection(MeshT* _mesh) {
for (typename MeshT::FaceIter f_it = _mesh->faces_begin(); f_it != _mesh->faces_end(); ++f_it) {
if (_mesh->status(*f_it).feature()) {
_mesh->status(*f_it).set_selected(true);
} else {
_mesh->status(*f_it).set_selected(false);
}
}
}
template< typename MeshT >
inline
void clearFeatureFaces(MeshT* _mesh) {
for (typename MeshT::FaceIter f_it = _mesh->faces_begin(); f_it != _mesh->faces_end(); ++f_it) {
_mesh->status(*f_it).set_feature(false);
}
}
//=============================================================================
} // MeshSelection Namespace
//=============================================================================