+ //================================================================================
+ /*!
+ * \brief Remove small faces
+ */
+ //================================================================================
+
+ void removeSmallFaces( SMDS_Mesh* theMesh,
+ SMESH_MeshAlgos::TElemIntPairVec& theNew2OldFaces,
+ const double theTol2 )
+ {
+ std::vector< SMESH_NodeXYZ > points(3);
+ std::vector< const SMDS_MeshNode* > nodes(3);
+ for ( SMDS_ElemIteratorPtr faceIt = theMesh->elementsIterator(); faceIt->more(); )
+ {
+ const SMDS_MeshElement* face = faceIt->next();
+ points.assign( face->begin_nodes(), face->end_nodes() );
+
+ SMESH_NodeXYZ* prevN = & points.back();
+ for ( size_t i = 0; i < points.size(); ++i )
+ {
+ double dist2 = ( *prevN - points[ i ]).SquareModulus();
+ if ( dist2 < theTol2 )
+ {
+ const SMDS_MeshNode* nToRemove =
+ (*prevN)->GetID() > points[ i ]->GetID() ? prevN->Node() : points[ i ].Node();
+ const SMDS_MeshNode* nToKeep =
+ nToRemove == points[ i ].Node() ? prevN->Node() : points[ i ].Node();
+ for ( SMDS_ElemIteratorPtr fIt = nToRemove->GetInverseElementIterator(); fIt->more(); )
+ {
+ const SMDS_MeshElement* f = fIt->next();
+ if ( f == face )
+ continue;
+ nodes.assign( f->begin_nodes(), f->end_nodes() );
+ nodes[ f->GetNodeIndex( nToRemove )] = nToKeep;
+ theMesh->ChangeElementNodes( f, &nodes[0], nodes.size() );
+ }
+ theNew2OldFaces[ face->GetID() ].first = 0;
+ theMesh->RemoveFreeElement( face );
+ break;
+ }
+ prevN = & points[ i ];
+ }
+ continue;
+ }
+ return;
+ }
+