44#define MESHREPAIRPLUGINT_CC
46#include "MeshRepairPlugin.hh"
50template<
typename MeshT>
55 std::vector< unsigned int > valence;
56 std::vector< typename MeshT::VertexHandle > vhandles;
60 bool selected =
false;
63 for (
auto f_it : _mesh.faces())
64 if ( _mesh.status(f_it).selected() ) {
74 for (
auto v_it : _mesh.vertices()) {
78 for (
typename MeshT::VertexFaceIter vf_it = _mesh.vf_iter(v_it); !tagged && vf_it.is_valid(); ++vf_it)
79 if (_mesh.status(*vf_it).selected())
82 _mesh.status(v_it).set_tagged(tagged);
87 _mesh.add_property(vmap);
90 for (
auto v_it : _mesh.vertices()) {
92 typename MeshT::VertexHandle vh = v_it;
94 if (_mesh.status(v_it).tagged() )
95 for (
auto vf_it : v_it.faces())
97 if (!_mesh.status(vf_it).tagged()) {
99 typename MeshT::Point tmpPoint = _mesh.point(v_it);
105 _mesh.status(vh).set_tagged(
true);
108 _mesh.status(v_it).set_tagged(
false);
112 _mesh.property(vmap, v_it) = vh;
116 for (
auto f_it : _mesh.faces()) {
118 if (_mesh.status(f_it).selected()) {
121 typename MeshT::FaceVertexIter fv_it = _mesh.fv_iter(f_it);
123 valence.push_back(f_it.valence());
124 while (fv_it.is_valid()) {
125 vhandles.push_back(*fv_it);
137 for (std::size_t i = 0; i < valence.size(); i++) {
139 std::vector<typename MeshT::VertexHandle> faceVertices;
144 for (
unsigned int j = 1; j <= valence[i]; ++j)
145 faceVertices.push_back(_mesh.property(vmap,vhandles[pos - j]) );
150 _mesh.remove_property(vmap);
154 std::vector < typename MeshT::Point > points;
158 for (
auto v_it : _mesh.vertices())
159 points.push_back(_mesh.point(v_it));
162 const unsigned int n_VerticesPerFace = _mesh.is_trimesh() ? 3 : 4;
165 std::vector< typename MeshT::VertexHandle > vhandles;
166 vhandles.reserve( _mesh.
n_faces() * n_VerticesPerFace);
167 for (
auto f_it : _mesh.faces()) {
169 valence.push_back( f_it.valence() );
171 for (
auto fv_it : f_it.vertices())
172 vhandles.push_back(fv_it);
179 for (
unsigned int i = 0; i < points.size(); ++i)
185 for (std::size_t i = 0; i < valence.size(); i++) {
187 std::vector<typename MeshT::VertexHandle> faceVertices;
192 for (
unsigned int j = 1; j <= valence[i]; ++j)
193 faceVertices.push_back(vhandles[pos - j]);
201 _mesh.garbage_collection();
202 _mesh.update_normals();
void flipOrientation(int _objectId)
Flips the normals of all selected faces by changing the vertex order.
VertexHandle add_vertex(const VecT &_p)
Add a geometric point to the mesh.
size_t n_vertices() const override
Get number of vertices in mesh.
virtual FaceIter delete_face(FaceHandle _h)
Delete face from mesh.
virtual FaceHandle add_face(std::vector< HalfEdgeHandle > _halfedges, bool _topologyCheck=false)
Add face via incident edges.
size_t n_faces() const override
Get number of faces in mesh.