IPAL22173 TC6.2.0: "Netgen1D-2D" algorithm doesn't work on "flight_solid.brep"

Treate a case where a valid mesh is computed anyhow while the algo reports errors

+  enum EMeshError { MEr_OK = 0, MEr_HOLES, MEr_BAD_ORI, MEr_EMPTY };
+
+  /*!
+   * \brief Finds topological errors of a sub-mesh
+   */
+  static EMeshError GetMeshError(SMESH_subMesh* subMesh);
This commit is contained in:
eap 2011-06-28 11:53:37 +00:00
parent 454d871477
commit 3eefc085d8
2 changed files with 97 additions and 5 deletions

View File

@ -26,16 +26,19 @@
// Module : SMESH // Module : SMESH
// //
#include "SMESH_Algo.hxx" #include "SMESH_Algo.hxx"
#include "SMESH_Comment.hxx"
#include "SMESH_Gen.hxx"
#include "SMESH_Mesh.hxx"
#include "SMESH_HypoFilter.hxx"
#include "SMDS_FacePosition.hxx"
#include "SMDS_EdgePosition.hxx" #include "SMDS_EdgePosition.hxx"
#include "SMDS_FacePosition.hxx"
#include "SMDS_MeshElement.hxx" #include "SMDS_MeshElement.hxx"
#include "SMDS_MeshNode.hxx" #include "SMDS_MeshNode.hxx"
#include "SMDS_VolumeTool.hxx"
#include "SMESHDS_Mesh.hxx" #include "SMESHDS_Mesh.hxx"
#include "SMESHDS_SubMesh.hxx" #include "SMESHDS_SubMesh.hxx"
#include "SMESH_Comment.hxx"
#include "SMESH_Gen.hxx"
#include "SMESH_HypoFilter.hxx"
#include "SMESH_Mesh.hxx"
#include "SMESH_TypeDefs.hxx"
#include <BRepAdaptor_Curve.hxx> #include <BRepAdaptor_Curve.hxx>
#include <BRepLProp.hxx> #include <BRepLProp.hxx>
@ -554,6 +557,88 @@ vector< const SMDS_MeshNode*> SMESH_Algo::GetCommonNodes(const SMDS_MeshElement*
return common; return common;
} }
//=======================================================================
//function : GetMeshError
//purpose : Finds topological errors of a sub-mesh
//WARNING : 1D check is NOT implemented so far
//=======================================================================
SMESH_Algo::EMeshError SMESH_Algo::GetMeshError(SMESH_subMesh* subMesh)
{
EMeshError err = MEr_OK;
SMESHDS_SubMesh* smDS = subMesh->GetSubMeshDS();
if ( !smDS )
return MEr_EMPTY;
switch ( subMesh->GetSubShape().ShapeType() )
{
case TopAbs_FACE: { // ====================== 2D =====================
SMDS_ElemIteratorPtr fIt = smDS->GetElements();
if ( !fIt->more() )
return MEr_EMPTY;
// We check that olny links on EDGEs encouter once, the rest links, twice
set< SMESH_TLink > links;
while ( fIt->more() )
{
const SMDS_MeshElement* f = fIt->next();
int nbNodes = f->NbCornerNodes(); // ignore medium nodes
for ( int i = 0; i < nbNodes; ++i )
{
const SMDS_MeshNode* n1 = f->GetNode( i );
const SMDS_MeshNode* n2 = f->GetNode(( i+1 ) % nbNodes);
std::pair< set< SMESH_TLink >::iterator, bool > it_added =
links.insert( SMESH_TLink( n1, n2 ));
if ( !it_added.second )
// As we do NOT(!) check if mesh is manifold, we believe that a link can
// encounter once or twice only (not three times), we erase a link as soon
// as it encounters twice to speed up search in the <links> map.
links.erase( it_added.first );
}
}
// the links remaining in the <links> should all be on EDGE
set< SMESH_TLink >::iterator linkIt = links.begin();
for ( ; linkIt != links.end(); ++linkIt )
{
const SMESH_TLink& link = *linkIt;
if ( link.node1()->GetPosition()->GetTypeOfPosition() > SMDS_TOP_EDGE ||
link.node2()->GetPosition()->GetTypeOfPosition() > SMDS_TOP_EDGE )
return MEr_HOLES;
}
// TODO: to check orientation
break;
}
case TopAbs_SOLID: { // ====================== 3D =====================
SMDS_ElemIteratorPtr vIt = smDS->GetElements();
if ( !vIt->more() )
return MEr_EMPTY;
SMDS_VolumeTool vTool;
while ( !vIt->more() )
{
if (!vTool.Set( vIt->next() ))
continue; // strange
for ( int iF = 0; iF < vTool.NbFaces(); ++iF )
if ( vTool.IsFreeFace( iF ))
{
int nbN = vTool.NbFaceNodes( iF );
const SMDS_MeshNode** nodes = vTool.GetFaceNodes( iF );
for ( int i = 0; i < nbN; ++i )
if ( nodes[i]->GetPosition()->GetTypeOfPosition() > SMDS_TOP_FACE )
return MEr_HOLES;
}
}
break;
}
default:;
}
return err;
}
//================================================================================ //================================================================================
/*! /*!
* \brief Sets event listener to submeshes if necessary * \brief Sets event listener to submeshes if necessary

View File

@ -328,6 +328,13 @@ public:
static std::vector< const SMDS_MeshNode*> GetCommonNodes(const SMDS_MeshElement* e1, static std::vector< const SMDS_MeshNode*> GetCommonNodes(const SMDS_MeshElement* e1,
const SMDS_MeshElement* e2); const SMDS_MeshElement* e2);
enum EMeshError { MEr_OK = 0, MEr_HOLES, MEr_BAD_ORI, MEr_EMPTY };
/*!
* \brief Finds topological errors of a sub-mesh
*/
static EMeshError GetMeshError(SMESH_subMesh* subMesh);
protected: protected:
/*! /*!