0020222: Quandrangle_2D meshing fail

unite only edges shared by two same faces
This commit is contained in:
eap 2009-03-19 07:14:16 +00:00
parent d77ce4938d
commit 9fd4726f74

View File

@ -24,7 +24,6 @@
// Moved here from SMESH_Quadrangle_2D.cxx // Moved here from SMESH_Quadrangle_2D.cxx
// Author : Paul RASCLE, EDF // Author : Paul RASCLE, EDF
// Module : SMESH // Module : SMESH
// $Header$
// //
#include "StdMeshers_Quadrangle_2D.hxx" #include "StdMeshers_Quadrangle_2D.hxx"
@ -42,7 +41,6 @@
#include "SMDS_EdgePosition.hxx" #include "SMDS_EdgePosition.hxx"
#include "SMDS_FacePosition.hxx" #include "SMDS_FacePosition.hxx"
#include <BRepTools.hxx>
#include <BRepTools_WireExplorer.hxx> #include <BRepTools_WireExplorer.hxx>
#include <BRep_Tool.hxx> #include <BRep_Tool.hxx>
#include <Geom_Surface.hxx> #include <Geom_Surface.hxx>
@ -51,6 +49,7 @@
#include <TColStd_SequenceOfReal.hxx> #include <TColStd_SequenceOfReal.hxx>
#include <TColgp_SequenceOfXY.hxx> #include <TColgp_SequenceOfXY.hxx>
#include <TopExp.hxx> #include <TopExp.hxx>
#include <TopTools_ListIteratorOfListOfShape.hxx>
#include <TopoDS.hxx> #include <TopoDS.hxx>
#include "utilities.h" #include "utilities.h"
@ -588,6 +587,27 @@ bool StdMeshers_Quadrangle_2D::Compute (SMESH_Mesh& aMesh,
return isOk; return isOk;
} }
//================================================================================
/*!
* \brief Return true if only two given edges meat at their common vertex
*/
//================================================================================
static bool twoEdgesMeatAtVertex(const TopoDS_Edge& e1,
const TopoDS_Edge& e2,
SMESH_Mesh & mesh)
{
TopoDS_Vertex v;
if ( !TopExp::CommonVertex( e1, e2, v ))
return false;
TopTools_ListIteratorOfListOfShape ancestIt( mesh.GetAncestors( v ));
for ( ; ancestIt.More() ; ancestIt.Next() )
if ( ancestIt.Value().ShapeType() == TopAbs_EDGE )
if ( !e1.IsSame( ancestIt.Value() ) && !e2.IsSame( ancestIt.Value() ))
return false;
return true;
}
//============================================================================= //=============================================================================
/*! /*!
* *
@ -644,6 +664,41 @@ FaceQuadStruct* StdMeshers_Quadrangle_2D::CheckNbEdges(SMESH_Mesh & aMes
nbSides<TOP_SIDE, ignoreMediumNodes)); nbSides<TOP_SIDE, ignoreMediumNodes));
++nbSides; ++nbSides;
} }
// issue 20222. Try to unite only edges shared by two same faces
if (nbSides < 4) {
// delete found sides
{ FaceQuadStruct cleaner( *quad ); }
quad->side.clear();
quad->side.reserve(nbEdgesInWire.front());
nbSides = 0;
SMESH_Block::GetOrderedEdges (F, V, edges, nbEdgesInWire);
while ( !edges.empty()) {
sideEdges.clear();
sideEdges.splice( sideEdges.end(), edges, edges.begin());
bool sameSide = true;
while ( !edges.empty() && sameSide ) {
sameSide =
SMESH_Algo::IsContinuous( sideEdges.back(), edges.front() ) &&
twoEdgesMeatAtVertex( sideEdges.back(), edges.front(), aMesh );
if ( sameSide )
sideEdges.splice( sideEdges.end(), edges, edges.begin());
}
if ( nbSides == 0 ) { // go backward from the first edge
sameSide = true;
while ( !edges.empty() && sameSide ) {
sameSide =
SMESH_Algo::IsContinuous( sideEdges.front(), edges.back() ) &&
twoEdgesMeatAtVertex( sideEdges.front(), edges.back(), aMesh );
if ( sameSide )
sideEdges.splice( sideEdges.begin(), edges, --edges.end());
}
}
quad->side.push_back( new StdMeshers_FaceSide(F, sideEdges, &aMesh,
nbSides<TOP_SIDE, ignoreMediumNodes));
++nbSides;
}
}
} }
if (nbSides != 4) { if (nbSides != 4) {
#ifdef _DEBUG_ #ifdef _DEBUG_