Salome HOME
*** empty log message ***
[modules/smesh.git] / src / SMESHGUI / SMESHGUI_HypothesesUtils.cxx
index 556dc5591ffda71982444351eefd0765be1905b0..14a12754e98ff5d1327d84edd10dd189a6be3b6e 100644 (file)
@@ -1,22 +1,28 @@
-//  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+// SMESH SMESHGUI : GUI for SMESH component
 //
-//  This library is free software; you can redistribute it and/or
-//  modify it under the terms of the GNU Lesser General Public
-//  License as published by the Free Software Foundation; either
-//  version 2.1 of the License.
+// Copyright (C) 2003  CEA
 //
-//  This library is distributed in the hope that it will be useful,
-//  but WITHOUT ANY WARRANTY; without even the implied warranty of
-//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-//  Lesser General Public License for more details.
+// This library is free software; you can redistribute it and/or 
+// modify it under the terms of the GNU Lesser General Public 
+// License as published by the Free Software Foundation; either 
+// version 2.1 of the License. 
 //
-//  You should have received a copy of the GNU Lesser General Public
-//  License along with this library; if not, write to the Free Software
-//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+// This library is distributed in the hope that it will be useful, 
+// but WITHOUT ANY WARRANTY; without even the implied warranty of 
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+// Lesser General Public License for more details. 
+//
+// You should have received a copy of the GNU Lesser General Public 
+// License along with this library; if not, write to the Free Software 
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+// File   : SMESHGUI_HypothesesUtils.cxx
+// Author : Julia DOROVSKIKH, Open CASCADE S.A.S.
 //
-//  See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
 
+// SMESH includes
 #include "SMESHGUI_HypothesesUtils.h"
 
 #include "SMESHGUI.h"
 #include "SMESHGUI_Utils.h"
 #include "SMESHGUI_GEOMGenUtils.h"
 
-#include "SUIT_Tools.h"
-#include "SUIT_Desktop.h"
-#include "SUIT_MessageBox.h"
-#include "SUIT_OverrideCursor.h"
-#include "SUIT_ResourceMgr.h"
-#include "SUIT_Session.h"
-
-#include "OB_Browser.h"
+// SALOME GUI includes
+#include <SUIT_Desktop.h>
+#include <SUIT_MessageBox.h>
+#include <SUIT_OverrideCursor.h>
+#include <SUIT_ResourceMgr.h>
 
-#include "SalomeApp_Study.h"
-#include "SalomeApp_Tools.h"
-#include "SalomeApp_Application.h"
+#include <SalomeApp_Study.h>
+#include <SalomeApp_Tools.h>
 
-#include <SALOMEDSClient_Study.hxx>
-#include <SALOMEDSClient_SObject.hxx>
-
-#include "SALOMEconfig.h"
-#include CORBA_CLIENT_HEADER(SALOMEDS_Attributes)
+// SALOME KERNEL includes
+#include <utilities.h>
 
+// STL includes
 #include <map>
 #include <string>
 
+// Other includes
+#ifdef WNT
+#include <windows.h>
+#else
 #include <dlfcn.h>
+#endif
+
+#ifdef WNT
+#define LibHandle HMODULE
+#define LoadLib( name ) LoadLibrary( name )
+#define GetProc GetProcAddress
+#define UnLoadLib( handle ) FreeLibrary( handle );
+#else
+#define LibHandle void*
+#define LoadLib( name ) dlopen( name, RTLD_LAZY )
+#define GetProc dlsym
+#define UnLoadLib( handle ) dlclose( handle );
+#endif
 
 #ifdef _DEBUG_
 static int MYDEBUG = 0;
@@ -55,18 +72,16 @@ static int MYDEBUG = 0;
 static int MYDEBUG = 0;
 #endif
 
-namespace SMESH{
-
-  using namespace std;
-
-  typedef map<string,HypothesisData*> THypothesisDataMap;
+namespace SMESH
+{
+  typedef std::map<std::string,HypothesisData*> THypothesisDataMap;
   THypothesisDataMap myHypothesesMap;
   THypothesisDataMap myAlgorithmsMap;
 
-  typedef map<string,SMESHGUI_GenericHypothesisCreator*> THypCreatorMap;
+  typedef std::map<std::string,SMESHGUI_GenericHypothesisCreator*> THypCreatorMap;
   THypCreatorMap myHypCreatorMap;
 
-  list<HypothesesSet*> myListOfHypothesesSets;
+  std::list<HypothesesSet*> myListOfHypothesesSets;
 
   void processHypothesisStatus(const int theHypStatus,
                               SMESH::SMESH_Hypothesis_ptr theHyp,
@@ -94,13 +109,15 @@ namespace SMESH{
       else
        aMsg = (isFatal ? "SMESH_CANT_RM_HYP"  : "SMESH_RM_HYP_WRN");
 
-      aMsg = QObject::tr(aMsg).arg(aHypName) +
-       QObject::tr(QString("SMESH_HYP_%1").arg(theHypStatus));
+      aMsg = QObject::tr(aMsg.toLatin1().data()).arg(aHypName) +
+       QObject::tr(QString("SMESH_HYP_%1").arg(theHypStatus).toLatin1().data());
 
-      SUIT_MessageBox::warn1(SMESHGUI::desktop(),
-                           QObject::tr("SMESH_WRN_WARNING"),
-                           aMsg,
-                           QObject::tr("SMESH_BUT_OK"));
+      if ( theHypStatus == SMESH::HYP_HIDDEN_ALGO ) // PAL18501
+        aMsg = aMsg.arg( GetHypothesisData(theHyp->GetName())->Dim[0] );
+
+      SUIT_MessageBox::warning(SMESHGUI::desktop(),
+                              QObject::tr("SMESH_WRN_WARNING"),
+                              aMsg);
     }
   }
 
@@ -119,13 +136,12 @@ namespace SMESH{
       if (cenv)
        HypsXml.sprintf("%s", cenv);
 
-      QStringList HypsXmlList = QStringList::split(":", HypsXml, false);
+      QStringList HypsXmlList = HypsXml.split(":", QString::SkipEmptyParts);
       if (HypsXmlList.count() == 0)
        {
-         SUIT_MessageBox::error1(SMESHGUI::desktop(),
-                                QObject::tr("SMESH_WRN_WARNING"),
-                                QObject::tr("MESHERS_FILE_NO_VARIABLE"),
-                                QObject::tr("SMESH_BUT_OK"));
+         SUIT_MessageBox::critical(SMESHGUI::desktop(),
+                                   QObject::tr("SMESH_WRN_WARNING"),
+                                   QObject::tr("MESHERS_FILE_NO_VARIABLE"));
          return;
        }
 
@@ -140,13 +156,13 @@ namespace SMESH{
           xmlFile = resMgr->path("resources", HypsXml, HypsXml + ".xml");
         
        QFile file (xmlFile);
-       if (file.exists() && file.open(IO_ReadOnly)) {
+       if (file.exists() && file.open(QIODevice::ReadOnly)) {
          file.close();
 
          SMESHGUI_XmlHandler* aXmlHandler = new SMESHGUI_XmlHandler();
          ASSERT(aXmlHandler);
 
-         QXmlInputSource source (file);
+         QXmlInputSource source (&file);
          QXmlSimpleReader reader;
          reader.setContentHandler(aXmlHandler);
          reader.setErrorHandler(aXmlHandler);
@@ -161,10 +177,9 @@ namespace SMESH{
                                            aXmlHandler->myListOfHypothesesSets );
          }
          else {
-           SUIT_MessageBox::error1(SMESHGUI::desktop(),
-                                  QObject::tr("INF_PARSE_ERROR"),
-                                  QObject::tr(aXmlHandler->errorProtocol()),
-                                  QObject::tr("SMESH_BUT_OK"));
+           SUIT_MessageBox::critical(SMESHGUI::desktop(),
+                                     QObject::tr("INF_PARSE_ERROR"),
+                                     QObject::tr(aXmlHandler->errorProtocol().toLatin1().data()));
          }
        }
        else {
@@ -180,10 +195,9 @@ namespace SMESH{
        QString aMess = QObject::tr("MESHERS_FILE_CANT_OPEN") + " " + aNoAccessFiles + "\n";
        aMess += QObject::tr("MESHERS_FILE_CHECK_VARIABLE");
        wc.suspend();
-       SUIT_MessageBox::warn1(SMESHGUI::desktop(),
-                             QObject::tr("SMESH_WRN_WARNING"),
-                             aMess,
-                             QObject::tr("SMESH_BUT_OK"));
+       SUIT_MessageBox::warning(SMESHGUI::desktop(),
+                                QObject::tr("SMESH_WRN_WARNING"),
+                                aMess);
        wc.resume();
       }
     }
@@ -192,22 +206,28 @@ namespace SMESH{
 
   QStringList GetAvailableHypotheses( const bool isAlgo, 
                                       const int theDim,                          
-                                      const bool isAux )
+                                      const bool isAux,
+                                      const bool isNeedGeometry)
   {
     QStringList aHypList;
 
     // Init list of available hypotheses, if needed
     InitAvailableHypotheses();
-
+    bool checkGeometry = !isNeedGeometry;
     // fill list of hypotheses/algorithms
     THypothesisDataMap* pMap = isAlgo ? &myAlgorithmsMap : &myHypothesesMap;
     THypothesisDataMap::iterator anIter;
     for ( anIter = pMap->begin(); anIter != pMap->end(); anIter++ )
-    {
-      HypothesisData* aData = (*anIter).second;
-      if ( ( theDim < 0 || aData->Dim.contains( theDim ) ) && aData->IsAux == isAux )
-        aHypList.append(((*anIter).first).c_str());
-    }
+      {
+       HypothesisData* aData = (*anIter).second;
+       if ( ( theDim < 0 || aData->Dim.contains( theDim ) ) && aData->IsAux == isAux)
+         if (checkGeometry){
+           if (aData->IsNeedGeometry == isNeedGeometry)
+             aHypList.append(((*anIter).first).c_str());
+         }
+         else
+           aHypList.append(((*anIter).first).c_str());
+      }
     return aHypList;
   }
 
@@ -221,41 +241,41 @@ namespace SMESH{
 
     list<HypothesesSet*>::iterator hypoSet = myListOfHypothesesSets.begin();
     for ( ; hypoSet != myListOfHypothesesSets.end(); ++hypoSet )
-    {
-      HypothesesSet* aSet = *hypoSet;
-      if ( aSet && aSet->AlgoList.count() ) {
-        aSetNameList.append( aSet->HypoSetName );
+      {
+       HypothesesSet* aSet = *hypoSet;
+       if ( aSet && aSet->AlgoList.count() ) {
+         aSetNameList.append( aSet->HypoSetName );
+       }
       }
-    }
 
     return aSetNameList;
   }
 
-  HypothesesSet* GetHypothesesSet(const QString theSetName)
+  HypothesesSet* GetHypothesesSet(const QString& theSetName)
   {
     list<HypothesesSet*>::iterator hypoSet = myListOfHypothesesSets.begin();
     for ( ; hypoSet != myListOfHypothesesSets.end(); ++hypoSet )
-    {
-      HypothesesSet* aSet = *hypoSet;
-      if ( aSet && aSet->HypoSetName == theSetName )
-        return aSet;
-    }
+      {
+       HypothesesSet* aSet = *hypoSet;
+       if ( aSet && aSet->HypoSetName == theSetName )
+         return aSet;
+      }
     return 0;
   }
 
-  HypothesisData* GetHypothesisData (const char* aHypType)
+  HypothesisData* GetHypothesisData (const QString& aHypType)
   {
     HypothesisData* aHypData = 0;
 
     // Init list of available hypotheses, if needed
     InitAvailableHypotheses();
 
-    THypothesisDataMap::iterator type_data = myHypothesesMap.find(aHypType);
+    THypothesisDataMap::iterator type_data = myHypothesesMap.find(aHypType.toLatin1().data());
     if (type_data != myHypothesesMap.end()) {
       aHypData = type_data->second;
     }
     else {
-      type_data = myAlgorithmsMap.find(aHypType);
+      type_data = myAlgorithmsMap.find(aHypType.toLatin1().data());
       if (type_data != myAlgorithmsMap.end())
         aHypData = type_data->second;
     }
@@ -295,15 +315,15 @@ namespace SMESH{
     return false;
   }
 
-  SMESHGUI_GenericHypothesisCreator* GetHypothesisCreator(const char* aHypType)
+  SMESHGUI_GenericHypothesisCreator* GetHypothesisCreator(const QString& aHypType)
   {
-    if(MYDEBUG) MESSAGE("Get HypothesisCreator for " << aHypType);
+    if(MYDEBUG) MESSAGE("Get HypothesisCreator for " << aHypType.toLatin1().data());
 
     SMESHGUI_GenericHypothesisCreator* aCreator = 0;
 
     // check, if creator for this hypothesis type already exists
-    if (myHypCreatorMap.find(aHypType) != myHypCreatorMap.end()) {
-      aCreator = myHypCreatorMap[aHypType];
+    if (myHypCreatorMap.find(aHypType.toLatin1().data()) != myHypCreatorMap.end()) {
+      aCreator = myHypCreatorMap[aHypType.toLatin1().data()];
     }
     else {
       // 1. Init list of available hypotheses, if needed
@@ -320,11 +340,18 @@ namespace SMESH{
       try {
        // load plugin library
        if(MYDEBUG) MESSAGE("Loading client meshers plugin library ...");
-       void* libHandle = dlopen (aClientLibName, RTLD_LAZY);
+       LibHandle libHandle = LoadLib( aClientLibName.toLatin1().data() );
        if (!libHandle) {
          // report any error, if occured
-         const char* anError = dlerror();
-         if(MYDEBUG) MESSAGE(anError);
+         if ( MYDEBUG )
+           {
+#ifdef WIN32
+             const char* anError = "Can't load client meshers plugin library";
+#else
+             const char* anError = dlerror();    
+#endif
+             MESSAGE(anError);
+           }
        }
        else {
          // get method, returning hypothesis creator
@@ -332,21 +359,21 @@ namespace SMESH{
          typedef SMESHGUI_GenericHypothesisCreator* (*GetHypothesisCreator) \
            ( const QString& );
          GetHypothesisCreator procHandle =
-           (GetHypothesisCreator)dlsym(libHandle, "GetHypothesisCreator");
+           (GetHypothesisCreator)GetProc(libHandle, "GetHypothesisCreator");
          if (!procHandle) {
            if(MYDEBUG) MESSAGE("bad hypothesis client plugin library");
-           dlclose(libHandle);
+           UnLoadLib(libHandle);
          }
          else {
            // get hypothesis creator
-           if(MYDEBUG) MESSAGE("Get Hypothesis Creator for " << aHypType);
+           if(MYDEBUG) MESSAGE("Get Hypothesis Creator for " << aHypType.toLatin1().data());
            aCreator = procHandle( aHypType );
            if (!aCreator) {
              if(MYDEBUG) MESSAGE("no such a hypothesis in this plugin");
            }
            else {
              // map hypothesis creator to a hypothesis name
-             myHypCreatorMap[aHypType] = aCreator;
+             myHypCreatorMap[aHypType.toLatin1().data()] = aCreator;
            }
          }
        }
@@ -360,35 +387,28 @@ namespace SMESH{
   }
 
 
-  SMESH::SMESH_Hypothesis_ptr CreateHypothesis(const char* aHypType,
-                                              const char* aHypName,
+  SMESH::SMESH_Hypothesis_ptr CreateHypothesis(const QString& aHypType,
+                                              const QString& aHypName,
                                               const bool isAlgo)
   {
-    if(MYDEBUG) MESSAGE("Create " << aHypType << " with name " << aHypName);
-
-    SMESH::SMESH_Hypothesis_var Hyp;
-
+    if(MYDEBUG) MESSAGE("Create " << aHypType.toLatin1().data() << 
+                       " with name " << aHypName.toLatin1().data());
     HypothesisData* aHypData = GetHypothesisData(aHypType);
     QString aServLib = aHypData->ServerLibName;
-
     try {
-      Hyp = SMESHGUI::GetSMESHGen()->CreateHypothesis(aHypType, aServLib);
-      if (!Hyp->_is_nil()) {
-       _PTR(SObject) SHyp = SMESH::FindSObject(Hyp.in());
-       if (SHyp) {
-         //if (strcmp(aHypName,"") != 0)
-         if (strlen(aHypName) > 0)
-           SMESH::SetName(SHyp, aHypName);
-         //SalomeApp_Application* app =
-         //  dynamic_cast<SalomeApp_Application*>(SUIT_Session::session()->activeApplication());
-         //if (app)
-         //  app->objectBrowser()->updateTree();
-          SMESHGUI::GetSMESHGUI()->updateObjBrowser();
-         return Hyp._retn();
+      SMESH::SMESH_Hypothesis_var aHypothesis;
+      aHypothesis = SMESHGUI::GetSMESHGen()->CreateHypothesis(aHypType.toLatin1().data(),
+                                                             aServLib.toLatin1().data());
+      if (!aHypothesis->_is_nil()) {
+       _PTR(SObject) aHypSObject = SMESH::FindSObject(aHypothesis.in());
+       if (aHypSObject) {
+         if (!aHypName.isEmpty())
+           SMESH::SetName(aHypSObject, aHypName);
+         SMESHGUI::GetSMESHGUI()->updateObjBrowser();
+         return aHypothesis._retn();
        }
       }
-    }
-    catch (const SALOME::SALOME_Exception & S_ex) {
+    } catch (const SALOME::SALOME_Exception & S_ex) {
       SalomeApp_Tools::QtCatchCorbaException(S_ex);
     }
 
@@ -410,7 +430,7 @@ namespace SMESH{
        if (res < SMESH::HYP_UNKNOWN_FATAL) {
          _PTR(SObject) aSH = SMESH::FindSObject(aHyp);
          if (SM && aSH) {
-           SMESH::ModifiedMesh(SM, false);
+           SMESH::ModifiedMesh(SM, false, aMesh->NbNodes()==0);
          }
        }
        if (res > SMESH::HYP_OK) {
@@ -445,7 +465,7 @@ namespace SMESH{
          if (res < SMESH::HYP_UNKNOWN_FATAL)  {
             _PTR(SObject) meshSO = SMESH::FindSObject(aMesh);
             if (meshSO)
-              SMESH::ModifiedMesh(meshSO, false);
+              SMESH::ModifiedMesh(meshSO, false, aMesh->NbNodes()==0);
          }
          if (res > SMESH::HYP_OK) {
            wc.suspend();
@@ -482,29 +502,29 @@ namespace SMESH{
       _PTR(Study) aStudy = GetActiveStudyDocument();
       _PTR(SObject) aHypObj = aStudy->FindObjectID( IObject->getEntry() );
       if( aHypObj )
-      {
-       _PTR(SObject) MorSM = SMESH::GetMeshOrSubmesh( aHypObj );
-       _PTR(SObject) aRealHypo;
-       if( aHypObj->ReferencedObject( aRealHypo ) )
        {
-         SMESH_Hypothesis_var hypo = SMESH_Hypothesis::_narrow( SObjectToObject( aRealHypo ) );
-         RemoveHypothesisOrAlgorithmOnMesh( MorSM, hypo );
-       }
-       else
-       {
-         SMESH_Hypothesis_var hypo = SMESH_Hypothesis::_narrow( SObjectToObject( aHypObj ) );
-         SObjectList meshList = GetMeshesUsingAlgoOrHypothesis( hypo );
-         for( int i = 0; i < meshList.size(); i++ )
-           RemoveHypothesisOrAlgorithmOnMesh( meshList[ i ], hypo );
+         _PTR(SObject) MorSM = SMESH::GetMeshOrSubmesh( aHypObj );
+         _PTR(SObject) aRealHypo;
+         if( aHypObj->ReferencedObject( aRealHypo ) )
+           {
+             SMESH_Hypothesis_var hypo = SMESH_Hypothesis::_narrow( SObjectToObject( aRealHypo ) );
+             RemoveHypothesisOrAlgorithmOnMesh( MorSM, hypo );
+           }
+         else
+           {
+             SMESH_Hypothesis_var hypo = SMESH_Hypothesis::_narrow( SObjectToObject( aHypObj ) );
+             SObjectList meshList = GetMeshesUsingAlgoOrHypothesis( hypo );
+             for( int i = 0; i < meshList.size(); i++ )
+               RemoveHypothesisOrAlgorithmOnMesh( meshList[ i ], hypo );
+           }
        }
-      }
     }
     catch(const SALOME::SALOME_Exception& S_ex)
-    {
-      wc.suspend();
-      SalomeApp_Tools::QtCatchCorbaException(S_ex);
-      res = SMESH::HYP_UNKNOWN_FATAL;
-    }
+      {
+       wc.suspend();
+       SalomeApp_Tools::QtCatchCorbaException(S_ex);
+       res = SMESH::HYP_UNKNOWN_FATAL;
+      }
     return res < SMESH::HYP_UNKNOWN_FATAL;
   }
 
@@ -519,27 +539,36 @@ namespace SMESH{
     if (MorSM) {
       try {
         GEOM::GEOM_Object_var aShapeObject = SMESH::GetShapeOnMeshOrSubMesh(MorSM);
-        if (!aShapeObject->_is_nil()) {
-          SMESH::SMESH_Mesh_var aMesh = SMESH::SObjectToInterface<SMESH::SMESH_Mesh>(MorSM);
-         SMESH::SMESH_subMesh_var aSubMesh = SMESH::SObjectToInterface<SMESH::SMESH_subMesh>(MorSM);
-
-         if (!aSubMesh->_is_nil())
-           aMesh = aSubMesh->GetFather();
-
-         if (!aMesh->_is_nil()) {
-           res = aMesh->RemoveHypothesis(aShapeObject, anHyp);
+        SMESH::SMESH_Mesh_var aMesh = SMESH::SObjectToInterface<SMESH::SMESH_Mesh>(MorSM);
+        SMESH::SMESH_subMesh_var aSubMesh = SMESH::SObjectToInterface<SMESH::SMESH_subMesh>(MorSM);
+        
+        if (!aSubMesh->_is_nil())
+          aMesh = aSubMesh->GetFather();
+        
+        if (!aMesh->_is_nil()) {    
+          if (aMesh->HasShapeToMesh() && !aShapeObject->_is_nil()) {
+            res = aMesh->RemoveHypothesis(aShapeObject, anHyp);
+            if (res < SMESH::HYP_UNKNOWN_FATAL) {
+              _PTR(SObject) meshSO = SMESH::FindSObject(aMesh);
+              if (meshSO)
+                SMESH::ModifiedMesh(meshSO, false, aMesh->NbNodes()==0);
+            }
+            
+          }
+          else if(!aMesh->HasShapeToMesh()){
+            res = aMesh->RemoveHypothesis(aShapeObject, anHyp);
            if (res < SMESH::HYP_UNKNOWN_FATAL) {
               _PTR(SObject) meshSO = SMESH::FindSObject(aMesh);
               if (meshSO)
-                SMESH::ModifiedMesh(meshSO, false);
+                SMESH::ModifiedMesh(meshSO, false, aMesh->NbNodes()==0);              
             }
-           if (res > SMESH::HYP_OK) {
-             wc.suspend();
-             processHypothesisStatus(res, anHyp, false);
-             wc.resume();
-           }
-         }
-       }
+          }
+          if (res > SMESH::HYP_OK) {
+            wc.suspend();
+            processHypothesisStatus(res, anHyp, false);
+            wc.resume();
+          }
+        }
       } catch(const SALOME::SALOME_Exception& S_ex) {
        wc.suspend();
        SalomeApp_Tools::QtCatchCorbaException(S_ex);
@@ -583,24 +612,29 @@ namespace SMESH{
     return listSOmesh;
   }
 
-#define CASE2MESSAGE(enum) case SMESH::enum: msg = QObject::tr( #enum ); break;
+#define CASE2MESSAGE(enum) case SMESH::enum: msg = QObject::tr( "STATE_" #enum ); break;
   QString GetMessageOnAlgoStateErrors(const algo_error_array& errors)
   {
-    QString resMsg = QObject::tr("SMESH_WRN_MISSING_PARAMETERS") + ":\n";
+    QString resMsg; // PAL14861 = QObject::tr("SMESH_WRN_MISSING_PARAMETERS") + ":\n";
     for ( int i = 0; i < errors.length(); ++i ) {
       const SMESH::AlgoStateError & error = errors[ i ];
+      const bool hasAlgo = ( strlen( error.algoName ) != 0 );
       QString msg;
-      switch( error.name ) {
-        CASE2MESSAGE( MISSING_ALGO );
-        CASE2MESSAGE( MISSING_HYPO );
-        CASE2MESSAGE( NOT_CONFORM_MESH );
-      default: continue;
-      }
+      if ( !hasAlgo )
+        msg = QObject::tr( "STATE_ALGO_MISSING" );
+      else 
+        switch( error.state ) {
+          CASE2MESSAGE( HYP_MISSING );
+          CASE2MESSAGE( HYP_NOTCONFORM );
+          CASE2MESSAGE( HYP_BAD_PARAMETER );
+          CASE2MESSAGE( HYP_BAD_GEOMETRY );
+        default: continue;
+        }
       // apply args to message:
       // %1 - algo name
-      if ( error.algoName.in() != 0 )
+      if ( hasAlgo )
         msg = msg.arg( error.algoName.in() );
-      // %2 - dimention
+      // %2 - dimension
       msg = msg.arg( error.algoDim );
       // %3 - global/local
       msg = msg.arg( QObject::tr( error.isGlobalAlgo ? "GLOBAL_ALGO" : "LOCAL_ALGO" ));
@@ -612,5 +646,4 @@ namespace SMESH{
     }
     return resMsg;
   }
-
-}
+} // end of namespace SMESH