From 085713d32f19ed0860b0ce2dd2f1206a29421674 Mon Sep 17 00:00:00 2001 From: jfa Date: Thu, 23 Mar 2006 07:36:24 +0000 Subject: [PATCH] Fix bug 11884: BordersAtMulticonnection2D worked incorrect. Also fix FreeEdges functor. --- src/Controls/SMESH_Controls.cxx | 96 ++++++++++++++++----------------- 1 file changed, 47 insertions(+), 49 deletions(-) diff --git a/src/Controls/SMESH_Controls.cxx b/src/Controls/SMESH_Controls.cxx index 2537cbd74..7edaa0e21 100644 --- a/src/Controls/SMESH_Controls.cxx +++ b/src/Controls/SMESH_Controls.cxx @@ -1294,60 +1294,58 @@ double MultiConnection2D::GetValue( const TSequenceOfXYZ& P ) double MultiConnection2D::GetValue( long theElementId ) { - TSequenceOfXYZ P; int aResult = 0; - if (GetPoints(theElementId,P)){ - const SMDS_MeshElement* anFaceElem = myMesh->FindElement( theElementId ); - SMDSAbs_ElementType aType = anFaceElem->GetType(); - - int len = P.size(); - - TColStd_MapOfInteger aMap; - int aResult = 0; + const SMDS_MeshElement* aFaceElem = myMesh->FindElement(theElementId); + SMDSAbs_ElementType aType = aFaceElem->GetType(); - switch (aType){ - case SMDSAbs_All: - case SMDSAbs_Node: - case SMDSAbs_Edge: - case SMDSAbs_Face: - if (len == 3){ // triangles - int Nb[3] = {0,0,0}; - - int i=0; - SMDS_ElemIteratorPtr anIter = anFaceElem->nodesIterator(); - if ( anIter != 0 ) { - while( anIter->more() ) { - const SMDS_MeshNode* aNode = (SMDS_MeshNode*)anIter->next(); - if ( aNode == 0 ){ - break; - } - SMDS_ElemIteratorPtr anElemIter = aNode->GetInverseElementIterator(); - while( anElemIter->more() ) { - const SMDS_MeshElement* anElem = anElemIter->next(); - if ( anElem != 0 && anElem->GetType() != SMDSAbs_Edge ) { - int anId = anElem->GetID(); - - if ( anIter->more() ) // i.e. first node - aMap.Add( anId ); - else if ( aMap.Contains( anId ) ){ - Nb[i]++; - } - } - else if ( anElem != 0 && anElem->GetType() == SMDSAbs_Edge ) i++; - } - } - } - - aResult = Max(Max(Nb[0],Nb[1]),Nb[2]); + switch (aType) { + case SMDSAbs_Face: + { + int i = 0, len = aFaceElem->NbNodes(); + SMDS_ElemIteratorPtr anIter = aFaceElem->nodesIterator(); + if (!anIter) break; + + const SMDS_MeshNode *aNode, *aNode0; + TColStd_MapOfInteger aMap, aMapPrev; + + for (i = 0; i <= len; i++) { + aMapPrev = aMap; + aMap.Clear(); + + int aNb = 0; + if (anIter->more()) { + aNode = (SMDS_MeshNode*)anIter->next(); + } else { + if (i == len) + aNode = aNode0; + else + break; + } + if (!aNode) break; + if (i == 0) aNode0 = aNode; + + SMDS_ElemIteratorPtr anElemIter = aNode->GetInverseElementIterator(); + while (anElemIter->more()) { + const SMDS_MeshElement* anElem = anElemIter->next(); + if (anElem != 0 && anElem->GetType() == SMDSAbs_Face) { + int anId = anElem->GetID(); + + aMap.Add(anId); + if (aMapPrev.Contains(anId)) { + aNb++; + } + } + } + aResult = Max(aResult, aNb); } - break; - case SMDSAbs_Volume: - default: aResult=0; } - + break; + default: + aResult = 0; } - return aResult;//getNbMultiConnection( myMesh, theId ); + + return aResult; } double MultiConnection2D::GetBadRate( double Value, int /*nbNodes*/ ) const @@ -1547,7 +1545,7 @@ bool FreeEdges::IsSatisfy( long theId ) else { anIter = aFace->nodesIterator(); } - if ( anIter != 0 ) + if ( anIter == 0 ) return false; int i = 0, nbNodes = aFace->NbNodes(); -- 2.39.2