23395: EDF 13855 - Crash SALOME when creating a mesh

Pb with a prism whose base face includes 3 wires and only one wire in internal
This commit is contained in:
eap 2016-11-23 21:04:46 +03:00
parent 164f564028
commit 952c6dca84
9 changed files with 95 additions and 48 deletions

View File

@ -2368,7 +2368,7 @@ bool SMESH_Mesh::SortByMeshOrder(std::vector<SMESH_subMesh*>& theListToSort) con
vector<SMESH_subMesh*>::iterator onlyBIt = onlyOrderedList.begin(); vector<SMESH_subMesh*>::iterator onlyBIt = onlyOrderedList.begin();
vector<SMESH_subMesh*>::iterator onlyEIt = onlyOrderedList.end(); vector<SMESH_subMesh*>::iterator onlyEIt = onlyOrderedList.end();
// iterate on ordered submeshes and insert them in detected positions // iterate on ordered sub-meshes and insert them in detected positions
map< int, TPosInList >::iterator i_pos = sortedPos.begin(); map< int, TPosInList >::iterator i_pos = sortedPos.begin();
for ( ; onlyBIt != onlyEIt; ++onlyBIt, ++i_pos ) for ( ; onlyBIt != onlyEIt; ++onlyBIt, ++i_pos )
*(i_pos->second) = *onlyBIt; *(i_pos->second) = *onlyBIt;
@ -2386,18 +2386,27 @@ bool SMESH_Mesh::IsOrderOK( const SMESH_subMesh* smBefore,
const SMESH_subMesh* smAfter ) const const SMESH_subMesh* smAfter ) const
{ {
TListOfListOfInt::const_iterator listIdsIt = _mySubMeshOrder.begin(); TListOfListOfInt::const_iterator listIdsIt = _mySubMeshOrder.begin();
TListOfInt::const_iterator idBef, idAft;
for( ; listIdsIt != _mySubMeshOrder.end(); listIdsIt++) for( ; listIdsIt != _mySubMeshOrder.end(); listIdsIt++)
{ {
const TListOfInt& listOfId = *listIdsIt; const TListOfInt& listOfId = *listIdsIt;
idBef = std::find( listOfId.begin(), listOfId.end(), smBefore->GetId() ); int iB = -1, iA = -1, i = 0;
if ( idBef != listOfId.end() ) for ( TListOfInt::const_iterator id = listOfId.begin(); id != listOfId.end(); ++id, ++i )
idAft = std::find( listOfId.begin(), listOfId.end(), smAfter->GetId() ); {
if ( idAft != listOfId.end () ) if ( *id == smBefore->GetId() )
return ( std::distance( listOfId.begin(), idBef ) < {
std::distance( listOfId.begin(), idAft ) ); iB = i;
if ( iA > -1 )
return iB < iA;
}
else if ( *id == smAfter->GetId() )
{
iA = i;
if ( iB > -1 )
return iB < iA;
}
}
} }
return true; // no order imposed to given submeshes return true; // no order imposed to given sub-meshes
} }
//============================================================================= //=============================================================================

View File

@ -2930,7 +2930,7 @@ bool SMESH_MesherHelper::IsReversedSubMesh (const TopoDS_Face& theFace)
TopoDS_Shape s0 = GetSubShapeByNode( nn[0], GetMeshDS() ); TopoDS_Shape s0 = GetSubShapeByNode( nn[0], GetMeshDS() );
TopoDS_Shape s1 = GetSubShapeByNode( nn[1], GetMeshDS() ); TopoDS_Shape s1 = GetSubShapeByNode( nn[1], GetMeshDS() );
TopoDS_Shape E = GetCommonAncestor( s0, s1, *myMesh, TopAbs_EDGE ); TopoDS_Shape E = GetCommonAncestor( s0, s1, *myMesh, TopAbs_EDGE );
if ( !E.IsNull() && !s0.IsSame( s1 )) if ( !E.IsNull() && !s0.IsSame( s1 ) && E.Orientation() != TopAbs_INTERNAL )
{ {
// is E seam edge? // is E seam edge?
int nb = 0; int nb = 0;

View File

@ -448,8 +448,11 @@ const std::vector<UVPtStruct>& StdMeshers_FaceSide::GetUVPtStruct(bool isXCons
if ((int) u2node.size() + nbProxyNodes != myNbPonits && if ((int) u2node.size() + nbProxyNodes != myNbPonits &&
(int) u2node.size() + nbProxyNodes != NbPoints( /*update=*/true )) (int) u2node.size() + nbProxyNodes != NbPoints( /*update=*/true ))
{ {
MESSAGE("Wrong node parameters on edges, u2node.size():" return myPoints;
<<u2node.size()<<" != myNbPonits:"<<myNbPonits); }
if (( myNbPonits > 0 ) &&
( u2node.begin()->first < 0 || u2node.rbegin()->first > 1 ))
{
return myPoints; return myPoints;
} }

View File

@ -2544,8 +2544,8 @@ namespace // utils used by StdMeshers_Prism_3D::IsApplicable()
bool _isBase; /* is used in a base FACE */ bool _isBase; /* is used in a base FACE */
EdgeWithNeighbors(const TopoDS_Edge& E, int iE, int nbE, int shift, bool isBase ): EdgeWithNeighbors(const TopoDS_Edge& E, int iE, int nbE, int shift, bool isBase ):
_edge( E ), _iBase( iE + shift ), _edge( E ), _iBase( iE + shift ),
_iL( SMESH_MesherHelper::WrapIndex( iE-1, nbE ) + shift ), _iL( SMESH_MesherHelper::WrapIndex( iE-1, Max( 1, nbE )) + shift ),
_iR( SMESH_MesherHelper::WrapIndex( iE+1, nbE ) + shift ), _iR( SMESH_MesherHelper::WrapIndex( iE+1, Max( 1, nbE )) + shift ),
_isBase( isBase ) _isBase( isBase )
{ {
} }
@ -2674,16 +2674,16 @@ namespace // utils used by StdMeshers_Prism_3D::IsApplicable()
edges[ iFirst ]._iL = edges[ iFirst ]._iBase; // connect to self edges[ iFirst ]._iL = edges[ iFirst ]._iBase; // connect to self
edges[ iLast ]._iR = edges[ iLast ]._iBase; edges[ iLast ]._iR = edges[ iLast ]._iBase;
// look for an EDGE of the outer WIRE connected to vv // look for an EDGE of the outer WIREs connected to vv
TopoDS_Vertex v0, v1; TopoDS_Vertex v0, v1;
for ( iE = 0; iE < nbEdgesInWires.front(); ++iE ) for ( iE = 0; iE < iFirst; ++iE )
{ {
v0 = SMESH_MesherHelper::IthVertex( 0, edges[ iE ]._edge ); v0 = SMESH_MesherHelper::IthVertex( 0, edges[ iE ]._edge );
v1 = SMESH_MesherHelper::IthVertex( 1, edges[ iE ]._edge ); v1 = SMESH_MesherHelper::IthVertex( 1, edges[ iE ]._edge );
if ( vv[0].IsSame( v0 ) || vv[0].IsSame( v1 )) if ( vv[0].IsSame( v0 ) || vv[0].IsSame( v1 ))
edges[ iFirst ]._iL = edges[ iE ]._iBase; edges[ iFirst ]._iL = edges[ iE ]._iBase;
if ( vv[1].IsSame( v0 ) || vv[1].IsSame( v1 )) if ( vv[1].IsSame( v0 ) || vv[1].IsSame( v1 ))
edges[ iLast ]._iR = edges[ iE ]._iBase; edges[ iLast ]._iR = edges[ iE ]._iBase;
} }
} }
iFirst += *nbE; iFirst += *nbE;

View File

@ -49,12 +49,14 @@
#include <utilities.h> #include <utilities.h>
#include <BRepAdaptor_Curve.hxx>
#include <BRepAdaptor_Surface.hxx> #include <BRepAdaptor_Surface.hxx>
#include <BRepMesh_Delaun.hxx> #include <BRepMesh_Delaun.hxx>
#include <BRep_Tool.hxx> #include <BRep_Tool.hxx>
#include <Bnd_B2d.hxx> #include <Bnd_B2d.hxx>
#include <GeomAPI_ProjectPointOnSurf.hxx> #include <GeomAPI_ProjectPointOnSurf.hxx>
#include <GeomLib_IsPlanarSurface.hxx> #include <GeomLib_IsPlanarSurface.hxx>
#include <Precision.hxx>
#include <TopExp.hxx> #include <TopExp.hxx>
#include <TopExp_Explorer.hxx> #include <TopExp_Explorer.hxx>
#include <TopTools_DataMapIteratorOfDataMapOfShapeShape.hxx> #include <TopTools_DataMapIteratorOfDataMapOfShapeShape.hxx>
@ -656,6 +658,8 @@ namespace {
SMESH_MesherHelper srcHelper( *srcMesh ); SMESH_MesherHelper srcHelper( *srcMesh );
srcHelper.SetSubShape( srcFace ); srcHelper.SetSubShape( srcFace );
SMESH_MesherHelper edgeHelper( *tgtMesh );
edgeHelper.ToFixNodeParameters( true );
const SMDS_MeshNode* nullNode = 0; const SMDS_MeshNode* nullNode = 0;
TAssocTool::TNodeNodeMap::iterator srcN_tgtN; TAssocTool::TNodeNodeMap::iterator srcN_tgtN;
@ -694,10 +698,30 @@ namespace {
} }
case SMDS_TOP_EDGE: case SMDS_TOP_EDGE:
{ {
const TopoDS_Shape & srcE = srcMeshDS->IndexToShape( srcNode->getshapeId() ); const TopoDS_Edge& srcE = TopoDS::Edge( srcMeshDS->IndexToShape( srcNode->getshapeId()));
const TopoDS_Shape & tgtE = shape2ShapeMap( srcE, /*isSrc=*/true ); const TopoDS_Edge& tgtE = TopoDS::Edge( shape2ShapeMap( srcE, /*isSrc=*/true ));
double srcU = srcHelper.GetNodeU( TopoDS::Edge( srcE ), srcNode ); double srcU = srcHelper.GetNodeU( srcE, srcNode );
tgtMeshDS->SetNodeOnEdge( n, TopoDS::Edge( tgtE ), srcU ); tgtMeshDS->SetNodeOnEdge( n, tgtE, srcU );
if ( !tgtFace.IsPartner( srcFace ))
{
bool isOk = true;
edgeHelper.SetSubShape( tgtE );
edgeHelper.GetNodeU( tgtE, n, 0, &isOk );
if ( !isOk ) // projection of n to tgtE failed (23395)
{
double sF, sL, tF, tL;
BRep_Tool::Range( srcE, sF, sL );
BRep_Tool::Range( tgtE, tF, tL );
double srcR = ( srcU - sF ) / ( sL - sF );
double tgtU = tF + srcR * ( tL - tF );
tgtMeshDS->SetNodeOnEdge( n, tgtE, tgtU );
gp_Pnt newP = BRepAdaptor_Curve( tgtE ).Value( tgtU );
double dist = newP.Distance( tgtP );
double tol = BRep_Tool::Tolerance( tgtE );
if ( tol < dist && dist < 1000*tol )
tgtMeshDS->MoveNode( n, newP.X(), newP.Y(), newP.Z() );
}
}
break; break;
} }
case SMDS_TOP_VERTEX: case SMDS_TOP_VERTEX:
@ -728,12 +752,9 @@ namespace {
if ( !tgtFace.IsPartner( srcFace ) ) if ( !tgtFace.IsPartner( srcFace ) )
{ {
SMESH_MesherHelper edgeHelper( *tgtMesh );
edgeHelper.ToFixNodeParameters( true );
helper.ToFixNodeParameters( true ); helper.ToFixNodeParameters( true );
int nbOkPos = 0; int nbOkPos = 0;
bool toCheck = true;
const double tol2d = 1e-12; const double tol2d = 1e-12;
srcN_tgtN = src2tgtNodes.begin(); srcN_tgtN = src2tgtNodes.begin();
for ( ; srcN_tgtN != src2tgtNodes.end(); ++srcN_tgtN ) for ( ; srcN_tgtN != src2tgtNodes.end(); ++srcN_tgtN )
@ -754,9 +775,9 @@ namespace {
} }
case SMDS_TOP_EDGE: case SMDS_TOP_EDGE:
{ {
const TopoDS_Edge & tgtE = TopoDS::Edge( tgtMeshDS->IndexToShape( n->getshapeId() )); // const TopoDS_Edge & tgtE = TopoDS::Edge( tgtMeshDS->IndexToShape( n->getshapeId() ));
edgeHelper.SetSubShape( tgtE ); // edgeHelper.SetSubShape( tgtE );
edgeHelper.GetNodeU( tgtE, n, 0, &toCheck ); // edgeHelper.GetNodeU( tgtE, n, 0, &toCheck );
break; break;
} }
default:; default:;

View File

@ -287,11 +287,14 @@ void StdMeshers_ProjectionSource1D_i::LoadFrom( const char* theStream )
} }
myCorbaMesh = SMESH::SMESH_Mesh::_duplicate( mesh ); myCorbaMesh = SMESH::SMESH_Mesh::_duplicate( mesh );
GetImpl()->SetSourceMesh ( meshImpl ); try {
GetImpl()->SetSourceEdge ( shapes[ SRC_EDGE ] ); GetImpl()->SetSourceMesh ( meshImpl );
GetImpl()->SetVertexAssociation( shapes[ SRC_VERTEX ], GetImpl()->SetSourceEdge ( shapes[ SRC_EDGE ] );
shapes[ TGT_VERTEX ]); GetImpl()->SetVertexAssociation( shapes[ SRC_VERTEX ],
shapes[ TGT_VERTEX ]);
}
catch (...) {
}
myBaseImpl->LoadFrom( is ); myBaseImpl->LoadFrom( is );
std::istringstream str( theStream ); std::istringstream str( theStream );

View File

@ -298,12 +298,16 @@ void StdMeshers_ProjectionSource2D_i::LoadFrom( const char* theStream )
myCorbaMesh = SMESH::SMESH_Mesh::_duplicate( mesh ); myCorbaMesh = SMESH::SMESH_Mesh::_duplicate( mesh );
GetImpl()->SetSourceMesh ( meshImpl ); try {
GetImpl()->SetSourceFace ( shapes[ SRC_FACE ] ); GetImpl()->SetSourceMesh ( meshImpl );
GetImpl()->SetVertexAssociation( shapes[ SRC_VERTEX1 ], GetImpl()->SetSourceFace ( shapes[ SRC_FACE ] );
shapes[ SRC_VERTEX2 ], GetImpl()->SetVertexAssociation( shapes[ SRC_VERTEX1 ],
shapes[ TGT_VERTEX1 ], shapes[ SRC_VERTEX2 ],
shapes[ TGT_VERTEX2 ]); shapes[ TGT_VERTEX1 ],
shapes[ TGT_VERTEX2 ]);
}
catch( ... ) {
}
myBaseImpl->LoadFrom( is ); myBaseImpl->LoadFrom( is );
std::istringstream str( theStream ); std::istringstream str( theStream );

View File

@ -252,7 +252,7 @@ CORBA::Boolean StdMeshers_ProjectionSource3D_i::IsDimSupported( SMESH::Dimension
//================================================================================ //================================================================================
/*! /*!
* \brief Write parameters in a string * \brief Write parameters in a string
* \retval char* - resulting string * \retval char* - resulting string
*/ */
//================================================================================ //================================================================================
@ -273,7 +273,7 @@ char* StdMeshers_ProjectionSource3D_i::SaveTo()
//================================================================================ //================================================================================
/*! /*!
* \brief Retrieve parameters from the string * \brief Retrieve parameters from the string
* \param theStream - the input string * \param theStream - the input string
*/ */
//================================================================================ //================================================================================
@ -299,13 +299,16 @@ void StdMeshers_ProjectionSource3D_i::LoadFrom( const char* theStream )
myCorbaMesh = SMESH::SMESH_Mesh::_duplicate( mesh ); myCorbaMesh = SMESH::SMESH_Mesh::_duplicate( mesh );
GetImpl()->SetSourceMesh ( meshImpl ); try {
GetImpl()->SetSource3DShape ( shapes[ SRC_SHAPE3D ] ); GetImpl()->SetSourceMesh ( meshImpl );
GetImpl()->SetVertexAssociation( shapes[ SRC_VERTEX1 ], GetImpl()->SetSource3DShape ( shapes[ SRC_SHAPE3D ] );
shapes[ SRC_VERTEX2 ], GetImpl()->SetVertexAssociation( shapes[ SRC_VERTEX1 ],
shapes[ TGT_VERTEX1 ], shapes[ SRC_VERTEX2 ],
shapes[ TGT_VERTEX2 ]); shapes[ TGT_VERTEX1 ],
shapes[ TGT_VERTEX2 ]);
}
catch (...) {
}
myBaseImpl->LoadFrom( is ); myBaseImpl->LoadFrom( is );
std::istringstream str( theStream ); std::istringstream str( theStream );

View File

@ -379,7 +379,11 @@ void StdMeshers_QuadrangleParams_i::LoadFrom( const char* theStream )
for ( int i = 0; i < nb; ++i ) for ( int i = 0; i < nb; ++i )
shapes.push_back( StdMeshers_ObjRefUlils::LoadFromStream( is, & myShapeEntries[i] )); shapes.push_back( StdMeshers_ObjRefUlils::LoadFromStream( is, & myShapeEntries[i] ));
GetImpl()->SetEnforcedNodes( shapes, points ); try {
GetImpl()->SetEnforcedNodes( shapes, points );
}
catch (...) {
}
} }
} }