mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2024-11-15 10:08:34 +05:00
0020676: EDF 1212 GEOM: Partition operation creates vertices which causes mesh computation to fail with netgen
* fix pb of CheckNodeUV() with INTERNAL shapes + /*! + * \brief Return iterator on ancestors of the given type + */ + static PShapeIteratorPtr GetAncestors(const TopoDS_Shape& shape, + const SMESH_Mesh& mesh, + TopAbs_ShapeEnum ancestorType);
This commit is contained in:
parent
b51a02ed24
commit
d5768a3f63
@ -331,7 +331,7 @@ gp_XY SMESH_MesherHelper::GetNodeUV(const TopoDS_Face& F,
|
||||
const SMDS_MeshNode* n2,
|
||||
bool* check) const
|
||||
{
|
||||
gp_Pnt2d uv( 1e100, 1e100 );
|
||||
gp_Pnt2d uv( Precision::Infinite(), Precision::Infinite() );
|
||||
const SMDS_PositionPtr Pos = n->GetPosition();
|
||||
bool uvOK = false;
|
||||
if(Pos->GetTypeOfPosition()==SMDS_TOP_FACE)
|
||||
@ -416,6 +416,7 @@ gp_XY SMESH_MesherHelper::GetNodeUV(const TopoDS_Face& F,
|
||||
}
|
||||
}
|
||||
else {
|
||||
uvOK = false;
|
||||
TopTools_ListIteratorOfListOfShape it( myMesh->GetAncestors( V ));
|
||||
for ( ; it.More(); it.Next() ) {
|
||||
if ( it.Value().ShapeType() == TopAbs_EDGE ) {
|
||||
@ -425,6 +426,7 @@ gp_XY SMESH_MesherHelper::GetNodeUV(const TopoDS_Face& F,
|
||||
if ( !C2d.IsNull() ) {
|
||||
double u = ( V == TopExp::FirstVertex( edge ) ) ? f : l;
|
||||
uv = C2d->Value( u );
|
||||
uvOK = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -460,7 +462,9 @@ bool SMESH_MesherHelper::CheckNodeUV(const TopoDS_Face& F,
|
||||
Handle(Geom_Surface) surface = BRep_Tool::Surface( F,loc );
|
||||
gp_Pnt nodePnt = XYZ( n );
|
||||
if ( !loc.IsIdentity() ) nodePnt.Transform( loc.Transformation().Inverted() );
|
||||
if ( nodePnt.Distance( surface->Value( uv.X(), uv.Y() )) > tol )
|
||||
if ( Precision::IsInfinite( uv.X() ) ||
|
||||
Precision::IsInfinite( uv.Y() ) ||
|
||||
nodePnt.Distance( surface->Value( uv.X(), uv.Y() )) > tol )
|
||||
{
|
||||
// uv incorrect, project the node to surface
|
||||
GeomAPI_ProjectPointOnSurf projector( nodePnt, surface, tol );
|
||||
@ -1378,6 +1382,8 @@ TopAbs_Orientation SMESH_MesherHelper::GetSubShapeOri(const TopoDS_Shape& shape,
|
||||
if ( !shape.IsNull() && !subShape.IsNull() )
|
||||
{
|
||||
TopExp_Explorer e( shape, subShape.ShapeType() );
|
||||
if ( shape.Orientation() >= TopAbs_INTERNAL ) // TopAbs_INTERNAL or TopAbs_EXTERNAL
|
||||
e.Init( shape.Oriented(TopAbs_FORWARD), subShape.ShapeType() );
|
||||
for ( ; e.More(); e.Next())
|
||||
if ( subShape.IsSame( e.Current() ))
|
||||
break;
|
||||
@ -2631,3 +2637,46 @@ void SMESH_MesherHelper::FixQuadraticElements(bool volumeOnly)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
/*!
|
||||
* \brief Iterator on ancestors of the given type
|
||||
*/
|
||||
//=======================================================================
|
||||
|
||||
struct TAncestorsIterator : public SMDS_Iterator<const TopoDS_Shape*>
|
||||
{
|
||||
TopTools_ListIteratorOfListOfShape _ancIter;
|
||||
TopAbs_ShapeEnum _type;
|
||||
TAncestorsIterator( const TopTools_ListOfShape& ancestors, TopAbs_ShapeEnum type)
|
||||
: _ancIter( ancestors ), _type( type )
|
||||
{
|
||||
if ( _ancIter.More() && _ancIter.Value().ShapeType() != _type ) next();
|
||||
}
|
||||
virtual bool more()
|
||||
{
|
||||
return _ancIter.More();
|
||||
}
|
||||
virtual const TopoDS_Shape* next()
|
||||
{
|
||||
const TopoDS_Shape* s = _ancIter.More() ? & _ancIter.Value() : 0;
|
||||
if ( _ancIter.More() )
|
||||
for ( _ancIter.Next(); _ancIter.More(); _ancIter.Next())
|
||||
if ( _ancIter.Value().ShapeType() == _type )
|
||||
break;
|
||||
return s;
|
||||
}
|
||||
};
|
||||
|
||||
//=======================================================================
|
||||
/*!
|
||||
* \brief Return iterator on ancestors of the given type
|
||||
*/
|
||||
//=======================================================================
|
||||
|
||||
PShapeIteratorPtr SMESH_MesherHelper::GetAncestors(const TopoDS_Shape& shape,
|
||||
const SMESH_Mesh& mesh,
|
||||
TopAbs_ShapeEnum ancestorType)
|
||||
{
|
||||
return PShapeIteratorPtr( new TAncestorsIterator( mesh.GetAncestors(shape), ancestorType));
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user