fix FindShape() to resolve a regression of SMESH_TEST/Grids/smesh/bugs/L9

This commit is contained in:
eap 2011-04-28 09:40:21 +00:00
parent 2db2c3ab90
commit 5a57da6b1e

View File

@ -365,45 +365,55 @@ int SMESH_MeshEditor::FindShape (const SMDS_MeshElement * theElem)
if ( aMesh->ShapeToMesh().IsNull() ) if ( aMesh->ShapeToMesh().IsNull() )
return 0; return 0;
if ( theElem->GetType() == SMDSAbs_Node ) int aShapeID = theElem->getshapeId();
{ if ( aShapeID < 1 )
int aShapeID = theElem->getshapeId(); return 0;
if (aShapeID <= 0)
return 0;
else
return aShapeID;
}
TopoDS_Shape aShape; // the shape a node is on if ( SMESHDS_SubMesh * sm = aMesh->MeshElements( aShapeID ))
SMDS_ElemIteratorPtr nodeIt = theElem->nodesIterator(); if ( sm->Contains( theElem ))
while ( nodeIt->more() ) { return aShapeID;
const SMDS_MeshNode* node = static_cast<const SMDS_MeshNode*>( nodeIt->next() );
int aShapeID = node->getshapeId(); if ( theElem->GetType() == SMDSAbs_Node ) {
if (aShapeID > 0) { MESSAGE( ":( Error: invalid myShapeId of node " << theElem->GetID() );
SMESHDS_SubMesh * sm = aMesh->MeshElements( aShapeID ); }
if ( sm ) { else {
if ( sm->Contains( theElem )) MESSAGE( ":( Error: invalid myShapeId of element " << theElem->GetID() );
return aShapeID; }
if ( aShape.IsNull() )
aShape = aMesh->IndexToShape( aShapeID ); TopoDS_Shape aShape; // the shape a node of theElem is on
} if ( theElem->GetType() != SMDSAbs_Node )
else { {
//MESSAGE ( "::FindShape() No SubShape for aShapeID " << aShapeID ); SMDS_ElemIteratorPtr nodeIt = theElem->nodesIterator();
while ( nodeIt->more() ) {
const SMDS_MeshNode* node = static_cast<const SMDS_MeshNode*>( nodeIt->next() );
if ((aShapeID = node->getshapeId()) > 0) {
if ( SMESHDS_SubMesh * sm = aMesh->MeshElements( aShapeID ) ) {
if ( sm->Contains( theElem ))
return aShapeID;
if ( aShape.IsNull() )
aShape = aMesh->IndexToShape( aShapeID );
}
} }
} }
} }
// None of nodes is on a proper shape, // None of nodes is on a proper shape,
// find the shape among ancestors of aShape on which a node is // find the shape among ancestors of aShape on which a node is
if ( aShape.IsNull() ) { if ( !aShape.IsNull() ) {
//MESSAGE ("::FindShape() - NONE node is on shape") TopTools_ListIteratorOfListOfShape ancIt( GetMesh()->GetAncestors( aShape ));
return 0; for ( ; ancIt.More(); ancIt.Next() ) {
SMESHDS_SubMesh * sm = aMesh->MeshElements( ancIt.Value() );
if ( sm && sm->Contains( theElem ))
return aMesh->ShapeToIndex( ancIt.Value() );
}
} }
TopTools_ListIteratorOfListOfShape ancIt( GetMesh()->GetAncestors( aShape )); else
for ( ; ancIt.More(); ancIt.Next() ) { {
SMESHDS_SubMesh * sm = aMesh->MeshElements( ancIt.Value() ); const map<int,SMESHDS_SubMesh*>& id2sm = GetMeshDS()->SubMeshes();
if ( sm && sm->Contains( theElem )) map<int,SMESHDS_SubMesh*>::const_iterator id_sm = id2sm.begin();
return aMesh->ShapeToIndex( ancIt.Value() ); for ( ; id_sm != id2sm.end(); ++id_sm )
if ( id_sm->second->Contains( theElem ))
return id_sm->first;
} }
//MESSAGE ("::FindShape() - SHAPE NOT FOUND") //MESSAGE ("::FindShape() - SHAPE NOT FOUND")