mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2025-02-03 11:10:32 +05:00
0020222: Quandrangle_2D meshing fail
unite only edges shared by two same faces
This commit is contained in:
parent
d77ce4938d
commit
9fd4726f74
@ -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_
|
||||||
|
Loading…
Reference in New Issue
Block a user