Salome HOME
BUG: impossible to import a med file of size more than MAX_INT (~2.1 Gb)
[modules/smesh.git] / src / SMESHGUI / SMESHGUI_HypothesesUtils.cxx
index 878163738503d7c11750c49d8a28003c3fb89311..fc1f8c5e2b84acaffaf20d423ed597131efadbb3 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2014  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2016  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -74,7 +74,7 @@
 #endif
 
 #ifdef _DEBUG_
-static int MYDEBUG = 1;
+static int MYDEBUG = 0;
 #else
 static int MYDEBUG = 0;
 #endif
@@ -91,21 +91,25 @@ namespace SMESH
 
   QList<HypothesesSet*> myListOfHypothesesSets;
 
-  void processHypothesisStatus(const int theHypStatus,
+  void processHypothesisStatus(const int                   theHypStatus,
                                SMESH::SMESH_Hypothesis_ptr theHyp,
-                               const bool theIsAddition)
+                               const bool                  theIsAddition,
+                               const char*                 theError = 0)
   {
     if (theHypStatus > SMESH::HYP_OK) {
       // get Hyp name
       QString aHypName ("NULL Hypothesis");
       if (!CORBA::is_nil(theHyp)) {
         _PTR(SObject) Shyp = SMESH::FindSObject(theHyp);
-        if (Shyp)
+        if (Shyp) {
           // name in study
           aHypName = Shyp->GetName().c_str();
-        else
+        }
+        else {
           // label in xml file
-          aHypName = GetHypothesisData(theHyp->GetName())->Label;
+          CORBA::String_var hypType = theHyp->GetName();
+          aHypName = GetHypothesisData( hypType.in() )->Label;
+        }
       }
 
       // message
@@ -116,12 +120,22 @@ namespace SMESH
       else
         aMsg = (isFatal ? "SMESH_CANT_RM_HYP"  : "SMESH_RM_HYP_WRN");
 
-      aMsg = QObject::tr(aMsg.toLatin1().data()).arg(aHypName) +
-        QObject::tr(QString("SMESH_HYP_%1").arg(theHypStatus).toLatin1().data());
+      aMsg = QObject::tr(aMsg.toLatin1().data()).arg(aHypName);
 
-      if ( theHypStatus == SMESH::HYP_HIDDEN_ALGO ) // PAL18501
-        aMsg = aMsg.arg( GetHypothesisData(theHyp->GetName())->Dim[0] );
+      if ( theError && theError[0] )
+      {
+        aMsg += theError;
+      }
+      else
+      {
+        aMsg += QObject::tr(QString("SMESH_HYP_%1").arg(theHypStatus).toLatin1().data());
 
+        if ( theHypStatus == SMESH::HYP_HIDDEN_ALGO ) { // PAL18501
+          CORBA::String_var hypType = theHyp->GetName();
+          if ( HypothesisData* hd = GetHypothesisData( hypType.in() ))
+            aMsg = aMsg.arg( hd->Dim[0] );
+        }
+      }
       SUIT_MessageBox::warning(SMESHGUI::desktop(),
                                QObject::tr("SMESH_WRN_WARNING"),
                                aMsg);
@@ -364,7 +378,7 @@ namespace SMESH
       return false;
     if ( algoData->BasicHypos.contains( hypType ))
       return true;
-    if ( algoData->OptionalHypos.contains( hypType)) {
+    if ( algoData->OptionalHypos.contains( hypType )) {
       isAuxiliary = true;
       return true;
     }
@@ -455,7 +469,7 @@ namespace SMESH
               //      It is used to obtain plugin root dir environment variable
               //      in the SMESHGUI_HypothesisDlg class. Plugin root dir environment
               //      variable is used to display documentation.
-              aCreator->setProperty(PLUGIN_NAME,aHypData->PluginName);
+              aCreator->setProperty(SMESH::Plugin_Name(),aHypData->PluginName);
             }
           }
         }
@@ -497,10 +511,14 @@ namespace SMESH
 
     return SMESH::SMESH_Hypothesis::_nil();
   }
+
   bool IsApplicable(const QString&        aHypType,
                     GEOM::GEOM_Object_ptr theGeomObject,
                     const bool            toCheckAll)
   {
+    if ( getenv("NO_LIMIT_ALGO_BY_SHAPE")) // allow a workaround for a case if
+      return true;                         // IsApplicable() returns false due to a bug
+
     HypothesisData* aHypData = GetHypothesisData(aHypType);
     QString aServLib = aHypData->ServerLibName;
     return SMESHGUI::GetSMESHGen()->IsApplicable( aHypType.toLatin1().data(),
@@ -520,7 +538,8 @@ namespace SMESH
       _PTR(SObject) SM = SMESH::FindSObject(aMesh);
       GEOM::GEOM_Object_var aShapeObject = SMESH::GetShapeOnMeshOrSubMesh(SM);
       try {
-        res = aMesh->AddHypothesis(aShapeObject, aHyp);
+        CORBA::String_var error;
+        res = aMesh->AddHypothesis(aShapeObject, aHyp, error.out());
         if (res < SMESH::HYP_UNKNOWN_FATAL) {
           _PTR(SObject) aSH = SMESH::FindSObject(aHyp);
           if (SM && aSH) {
@@ -529,7 +548,7 @@ namespace SMESH
         }
         if (res > SMESH::HYP_OK) {
           wc.suspend();
-          processHypothesisStatus(res, aHyp, true);
+          processHypothesisStatus(res, aHyp, true, error.in() );
           wc.resume();
         }
       }
@@ -554,8 +573,10 @@ namespace SMESH
         SMESH::SMESH_Mesh_var aMesh = aSubMesh->GetFather();
         _PTR(SObject) SsubM = SMESH::FindSObject(aSubMesh);
         GEOM::GEOM_Object_var aShapeObject = SMESH::GetShapeOnMeshOrSubMesh(SsubM);
-        if (!aMesh->_is_nil() && SsubM && !aShapeObject->_is_nil()) {
-          res = aMesh->AddHypothesis(aShapeObject, aHyp);
+        if (!aMesh->_is_nil() && SsubM && !aShapeObject->_is_nil())
+        {
+          CORBA::String_var error;
+          res = aMesh->AddHypothesis( aShapeObject, aHyp, error.out() );
           if (res < SMESH::HYP_UNKNOWN_FATAL)  {
             _PTR(SObject) meshSO = SMESH::FindSObject(aMesh);
             if (meshSO)
@@ -563,7 +584,7 @@ namespace SMESH
           }
           if (res > SMESH::HYP_OK) {
             wc.suspend();
-            processHypothesisStatus(res, aHyp, true);
+            processHypothesisStatus( res, aHyp, true, error.in() );
             wc.resume();
           }
         }
@@ -608,7 +629,7 @@ namespace SMESH
             {
               SMESH_Hypothesis_var hypo = SMESH_Hypothesis::_narrow( SObjectToObject( aHypObj ) );
               SObjectList meshList = GetMeshesUsingAlgoOrHypothesis( hypo );
-              for( int i = 0; i < meshList.size(); i++ )
+              for( size_t i = 0; i < meshList.size(); i++ )
                 RemoveHypothesisOrAlgorithmOnMesh( meshList[ i ], hypo );
             }
         }
@@ -708,7 +729,7 @@ namespace SMESH
   QString GetMessageOnAlgoStateErrors(const algo_error_array& errors)
   {
     QString resMsg; // PAL14861 = QObject::tr("SMESH_WRN_MISSING_PARAMETERS") + ":\n";
-    for ( int i = 0; i < errors.length(); ++i ) {
+    for ( size_t i = 0; i < errors.length(); ++i ) {
       const SMESH::AlgoStateError & error = errors[ i ];
       const bool hasAlgo = ( strlen( error.algoName ) != 0 );
       QString msg;