Salome HOME
0019296: EDF 681 SMESH - Pre-evaluation of the number of elements before mesh
authoreap <eap@opencascade.com>
Mon, 1 Feb 2010 11:12:17 +0000 (11:12 +0000)
committereap <eap@opencascade.com>
Mon, 1 Feb 2010 11:12:17 +0000 (11:12 +0000)
  * Evaluate():
  ** do not read from out of vector range
  ** report error if algo->Evaluate() returns negative number

src/SMESH_I/SMESH_Gen_i.cxx

index c644c20875c70c718f68ac84f39b406cec2a2fd2..f5de7bd50b7ae91c6273458691d9cce33fbd68f5 100644 (file)
@@ -1686,8 +1686,20 @@ SMESH::long_array* SMESH_Gen_i::Evaluate(SMESH::SMESH_Mesh_ptr theMesh,
       MapShapeNbElemsItr anIt = aResMap.begin();
       for(; anIt!=aResMap.end(); anIt++) {
         const vector<int>& aVec = (*anIt).second;
-        for(i = SMESH::Entity_Node; i < SMESH::Entity_Last; i++) {
-          nbels[i] += aVec[i];
+        for(i = SMESH::Entity_Node; i < aVec.size(); i++) {
+          int nbElem = aVec[i];
+          if ( nbElem < 0 ) // algo failed, check that it has reported a message
+          {
+            SMESH_subMesh* sm = anIt->first;
+            SMESH_ComputeErrorPtr& error = sm->GetComputeError();
+            const SMESH_Algo* algo = myGen.GetAlgo( myLocMesh, sm->GetSubShape());
+            if ( algo && !error.get() || error->IsOK() )
+              error.reset( new SMESH_ComputeError( COMPERR_ALGO_FAILED,"Failed to evaluate",algo));
+          }
+          else
+          {
+            nbels[i] += aVec[i];
+          }
         }
       }
       return nbels._retn();