0021422: EDF 1963 SMESH: Viscous layer algorithm fails in some cases

protect from SIGSEGV when used with "Viscous layers"
This commit is contained in:
eap 2011-11-24 14:35:35 +00:00
parent b8043c6073
commit 3b5470266a
2 changed files with 12 additions and 8 deletions

View File

@ -1689,16 +1689,17 @@ bool StdMeshers_PrismAsBlock::GetLayersTransformation(vector<gp_Trsf> & trsf) co
for ( int iE = 0; iE < nbEdgesInWires.front(); ++iE, ++edgeIt ) for ( int iE = 0; iE < nbEdgesInWires.front(); ++iE, ++edgeIt )
{ {
if ( BRep_Tool::Degenerated( *edgeIt )) continue; if ( BRep_Tool::Degenerated( *edgeIt )) continue;
const TParam2ColumnMap& u2colMap = const TParam2ColumnMap* u2colMap =
GetParam2ColumnMap( myHelper->GetMeshDS()->ShapeToIndex( *edgeIt ), isReverse ); GetParam2ColumnMap( myHelper->GetMeshDS()->ShapeToIndex( *edgeIt ), isReverse );
if ( !u2colMap ) return false;
isReverse = ( edgeIt->Orientation() == TopAbs_REVERSED ); isReverse = ( edgeIt->Orientation() == TopAbs_REVERSED );
double f = u2colMap.begin()->first, l = u2colMap.rbegin()->first; double f = u2colMap->begin()->first, l = u2colMap->rbegin()->first;
if ( isReverse ) swap ( f, l ); if ( isReverse ) swap ( f, l );
const int nbCol = 5; const int nbCol = 5;
for ( int i = 0; i < nbCol; ++i ) for ( int i = 0; i < nbCol; ++i )
{ {
double u = f + i/double(nbCol) * ( l - f ); double u = f + i/double(nbCol) * ( l - f );
const TNodeColumn* col = & getColumn( & u2colMap, u )->second; const TNodeColumn* col = & getColumn( u2colMap, u )->second;
if ( columns.empty() || col != columns.back() ) if ( columns.empty() || col != columns.back() )
columns.push_back( col ); columns.push_back( col );
} }

View File

@ -148,15 +148,18 @@ public:
* \brief Return TParam2ColumnMap for a base edge * \brief Return TParam2ColumnMap for a base edge
* \param baseEdgeID - base edge SMESHDS Index * \param baseEdgeID - base edge SMESHDS Index
* \param isReverse - columns in-block orientation * \param isReverse - columns in-block orientation
* \retval const TParam2ColumnMap& - map * \retval const TParam2ColumnMap* - map
*/ */
const TParam2ColumnMap& GetParam2ColumnMap(const int baseEdgeID, const TParam2ColumnMap* GetParam2ColumnMap(const int baseEdgeID,
bool & isReverse) const bool & isReverse) const
{ {
std::pair< TParam2ColumnMap*, bool > col_frw = std::map< int, std::pair< TParam2ColumnMap*, bool > >::const_iterator i_mo =
myShapeIndex2ColumnMap.find( baseEdgeID )->second; myShapeIndex2ColumnMap.find( baseEdgeID );
if ( i_mo == myShapeIndex2ColumnMap.end() ) return 0;
const std::pair< TParam2ColumnMap*, bool >& col_frw = i_mo->second;
isReverse = !col_frw.second; isReverse = !col_frw.second;
return * col_frw.first; return col_frw.first;
} }
/*! /*!