[Bug NPAL14335] EDF 344 SMESH : "ERROR : Iterator not implemented " when loading a script

Optimize performance of FindFace() and FindEdge()
This commit is contained in:
eap 2007-01-09 12:13:09 +00:00
parent 943384c960
commit 7cb53eb2a5

View File

@ -1319,10 +1319,20 @@ const SMDS_MeshEdge* SMDS_Mesh::FindEdge(const SMDS_MeshNode * node1,
SMDS_ElemIteratorPtr it1 = node1->GetInverseElementIterator(SMDSAbs_Edge); SMDS_ElemIteratorPtr it1 = node1->GetInverseElementIterator(SMDSAbs_Edge);
while(it1->more()) { while(it1->more()) {
const SMDS_MeshElement * e = it1->next(); const SMDS_MeshElement * e = it1->next();
if ( e->NbNodes() == 3 && if ( e->NbNodes() == 3 ) {
e->GetNodeIndex( node2 ) >= 0 && SMDS_ElemIteratorPtr it2 = e->nodesIterator();
e->GetNodeIndex( node3 ) >= 0 ) { while(it2->more()) {
return static_cast<const SMDS_MeshEdge*>( e ); const SMDS_MeshElement* n = it2->next();
if( n!=node1 &&
n!=node2 &&
n!=node3 )
{
e = 0;
break;
}
}
if ( e )
return static_cast<const SMDS_MeshEdge *> (e);
} }
} }
return 0; return 0;
@ -1351,13 +1361,23 @@ const SMDS_MeshFace* SMDS_Mesh::FindFace(const SMDS_MeshNode *node1,
SMDS_ElemIteratorPtr it1 = node1->GetInverseElementIterator(SMDSAbs_Face); SMDS_ElemIteratorPtr it1 = node1->GetInverseElementIterator(SMDSAbs_Face);
while(it1->more()) { while(it1->more()) {
const SMDS_MeshElement * e = it1->next(); const SMDS_MeshElement * e = it1->next();
if ( e->NbNodes() == 3 && if ( e->NbNodes() == 3 ) {
e->GetNodeIndex( node2 ) >= 0 && SMDS_ElemIteratorPtr it2 = e->nodesIterator();
e->GetNodeIndex( node3 ) >= 0 ) { while(it2->more()) {
return static_cast<const SMDS_MeshFace*>( e ); const SMDS_MeshElement* n = it2->next();
if( n!=node1 &&
n!=node2 &&
n!=node3 )
{
e = 0;
break;
} }
} }
return NULL; if ( e )
return static_cast<const SMDS_MeshFace *> (e);
}
}
return 0;
} }
SMDS_MeshFace* SMDS_Mesh::FindFaceOrCreate(const SMDS_MeshNode *node1, SMDS_MeshFace* SMDS_Mesh::FindFaceOrCreate(const SMDS_MeshNode *node1,
@ -1396,14 +1416,25 @@ const SMDS_MeshFace* SMDS_Mesh::FindFace(const SMDS_MeshNode *node1,
if ( !node1 ) return 0; if ( !node1 ) return 0;
SMDS_ElemIteratorPtr it1 = node1->GetInverseElementIterator(SMDSAbs_Face); SMDS_ElemIteratorPtr it1 = node1->GetInverseElementIterator(SMDSAbs_Face);
while(it1->more()) { while(it1->more()) {
const SMDS_MeshElement* f = it1->next(); const SMDS_MeshElement * e = it1->next();
if ( f->NbNodes() == 4 && if ( e->NbNodes() == 4 ) {
f->GetNodeIndex( node2 ) >= 0 && SMDS_ElemIteratorPtr it2 = e->nodesIterator();
f->GetNodeIndex( node3 ) >= 0 && while(it2->more()) {
f->GetNodeIndex( node4 ) >= 0 ) const SMDS_MeshElement* n = it2->next();
return static_cast<const SMDS_MeshFace *>( f ); if( n!=node1 &&
n!=node2 &&
n!=node3 &&
n!=node4 )
{
e = 0;
break;
} }
return NULL; }
if ( e )
return static_cast<const SMDS_MeshFace *> (e);
}
}
return 0;
} }
SMDS_MeshFace* SMDS_Mesh::FindFaceOrCreate(const SMDS_MeshNode *node1, SMDS_MeshFace* SMDS_Mesh::FindFaceOrCreate(const SMDS_MeshNode *node1,
@ -1448,16 +1479,27 @@ const SMDS_MeshFace* SMDS_Mesh::FindFace(const SMDS_MeshNode *node1,
if ( !node1 ) return 0; if ( !node1 ) return 0;
SMDS_ElemIteratorPtr it1 = node1->GetInverseElementIterator(SMDSAbs_Face); SMDS_ElemIteratorPtr it1 = node1->GetInverseElementIterator(SMDSAbs_Face);
while(it1->more()) { while(it1->more()) {
const SMDS_MeshElement* f = it1->next(); const SMDS_MeshElement * e = it1->next();
if ( f->NbNodes() == 6 && if ( e->NbNodes() == 6 ) {
f->GetNodeIndex( node2 ) >= 0 && SMDS_ElemIteratorPtr it2 = e->nodesIterator();
f->GetNodeIndex( node3 ) >= 0 && while(it2->more()) {
f->GetNodeIndex( node4 ) >= 0 && const SMDS_MeshElement* n = it2->next();
f->GetNodeIndex( node5 ) >= 0 && if( n!=node1 &&
f->GetNodeIndex( node6 ) >= 0 ) n!=node2 &&
return static_cast<const SMDS_MeshFace *>( f ); n!=node3 &&
n!=node4 &&
n!=node5 &&
n!=node6 )
{
e = 0;
break;
} }
return NULL; }
if ( e )
return static_cast<const SMDS_MeshFace *> (e);
}
}
return 0;
} }
@ -1494,18 +1536,29 @@ const SMDS_MeshFace* SMDS_Mesh::FindFace(const SMDS_MeshNode *node1,
if ( !node1 ) return 0; if ( !node1 ) return 0;
SMDS_ElemIteratorPtr it1 = node1->GetInverseElementIterator(SMDSAbs_Face); SMDS_ElemIteratorPtr it1 = node1->GetInverseElementIterator(SMDSAbs_Face);
while(it1->more()) { while(it1->more()) {
const SMDS_MeshElement* f = it1->next(); const SMDS_MeshElement * e = it1->next();
if ( f->NbNodes() == 8 && if ( e->NbNodes() == 8 ) {
f->GetNodeIndex( node2 ) >= 0 && SMDS_ElemIteratorPtr it2 = e->nodesIterator();
f->GetNodeIndex( node3 ) >= 0 && while(it2->more()) {
f->GetNodeIndex( node4 ) >= 0 && const SMDS_MeshElement* n = it2->next();
f->GetNodeIndex( node5 ) >= 0 && if( n!=node1 &&
f->GetNodeIndex( node6 ) >= 0 && n!=node2 &&
f->GetNodeIndex( node7 ) >= 0 && n!=node3 &&
f->GetNodeIndex( node8 ) >= 0 ) n!=node4 &&
return static_cast<const SMDS_MeshFace *>( f ); n!=node5 &&
n!=node6 &&
n!=node7 &&
n!=node8 )
{
e = 0;
break;
} }
return NULL; }
if ( e )
return static_cast<const SMDS_MeshFace *> (e);
}
}
return 0;
} }
@ -1542,12 +1595,15 @@ const SMDS_MeshFace* SMDS_Mesh::FindFace (std::vector<const SMDS_MeshNode *> nod
while (itF->more()) { while (itF->more()) {
const SMDS_MeshElement* f = itF->next(); const SMDS_MeshElement* f = itF->next();
if ( f->NbNodes() == nodes.size() ) { if ( f->NbNodes() == nodes.size() ) {
int ok = true, i = 1; SMDS_ElemIteratorPtr it2 = f->nodesIterator();
while ( ok && i < nodes.size() ) { while(it2->more()) {
ok = ( f->GetNodeIndex( nodes[ i++ ] ) >= 0 ); if ( find( nodes.begin(), nodes.end(), it2->next() ) == nodes.end() ) {
f = 0;
break;
} }
if ( ok ) }
return static_cast<const SMDS_MeshFace *>( f ); if ( f )
return static_cast<const SMDS_MeshFace *> (f);
} }
} }
} }