Salome HOME
PAL10491. "... algo misses some hypothesis" -> "... algo misses nD hypothesis"
[modules/smesh.git] / src / SMESHGUI / SMESHGUI_HypothesesUtils.cxx
index 323b1ec6815f28dd28af0c74a3e8fd3f52e8d11c..3e48afa89d70c9412aa760f42f013a077cd9c107 100644 (file)
@@ -1,49 +1,54 @@
 //  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
-// 
-//  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. 
-// 
-//  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 
-// 
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+//  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.
+//
+//  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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
 
-#include <map>
-#include <string>
-
-#include <dlfcn.h>
-
-#include "QAD.h"
-#include "QAD_Tools.h"
-#include "QAD_Config.h"
-#include "QAD_Desktop.h"
-#include "QAD_MessageBox.h"
-#include "QAD_WaitCursor.h"
-#include "QAD_ResourceMgr.h"
-
-#include "SALOMEGUI_QtCatchCorbaException.hxx"
-
 #include "SMESHGUI_HypothesesUtils.h"
+
+#include "SMESHGUI.h"
 #include "SMESHGUI_Hypotheses.h"
 #include "SMESHGUI_XmlHandler.h"
-#include "SMESHGUI.h"
-
 #include "SMESHGUI_Utils.h"
 #include "SMESHGUI_GEOMGenUtils.h"
-#include "SMESHGUI_SMESHGenUtils.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"
+
+#include "SalomeApp_Study.h"
+#include "SalomeApp_Tools.h"
+#include "SalomeApp_Application.h"
+
+#include <SALOMEDSClient_Study.hxx>
+#include <SALOMEDSClient_SObject.hxx>
 
 #include "SALOMEconfig.h"
 #include CORBA_CLIENT_HEADER(SALOMEDS_Attributes)
 
+#include <map>
+#include <string>
+
+#include <dlfcn.h>
+
 #ifdef _DEBUG_
 static int MYDEBUG = 0;
 #else
@@ -51,7 +56,7 @@ static int MYDEBUG = 0;
 #endif
 
 namespace SMESH{
-  
+
   using namespace std;
 
   typedef map<string,HypothesisData*> THypothesisDataMap;
@@ -61,92 +66,86 @@ namespace SMESH{
   typedef map<string,SMESHGUI_GenericHypothesisCreator*> THypCreatorMap;
   THypCreatorMap myHypCreatorMap;
 
-  void addMap( const THypothesisDataMap& theMap,
-              THypothesisDataMap& toMap)
-  {
-    THypothesisDataMap::const_iterator it;
-    for ( it = theMap.begin(); it != theMap.end(); it++ )
-      toMap.insert( *it );
-  }
-
+  list<HypothesesSet*> myListOfHypothesesSets;
 
   void processHypothesisStatus(const int theHypStatus,
                               SMESH::SMESH_Hypothesis_ptr theHyp,
                               const bool theIsAddition)
   {
-    if ( theHypStatus > SMESH::HYP_OK ) {
-      
+    if (theHypStatus > SMESH::HYP_OK) {
+
       // get Hyp name
       QString aHypName ("NULL Hypothesis");
-      if ( !CORBA::is_nil( theHyp )) {
-       SALOMEDS::SObject_var Shyp = SMESH::FindSObject( theHyp );
-       if ( !CORBA::is_nil( Shyp ))
+      if (!CORBA::is_nil(theHyp)) {
+       _PTR(SObject) Shyp = SMESH::FindSObject(theHyp);
+       if (Shyp)
          // name in study
-         aHypName = Shyp->GetName();
+         aHypName = Shyp->GetName().c_str();
        else
          // label in xml file
-         aHypName = GetHypothesisData( theHyp->GetName() )->Label;
+         aHypName = GetHypothesisData(theHyp->GetName())->Label;
       }
 
       // message
-      bool isFatal = ( theHypStatus >= SMESH::HYP_UNKNOWN_FATAL );
+      bool isFatal = (theHypStatus >= SMESH::HYP_UNKNOWN_FATAL);
       QString aMsg;
-      if ( theIsAddition )
-       aMsg = ( isFatal ? "SMESH_CANT_ADD_HYP" : "SMESH_ADD_HYP_WRN");
+      if (theIsAddition)
+       aMsg = (isFatal ? "SMESH_CANT_ADD_HYP" : "SMESH_ADD_HYP_WRN");
       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 ));
-      
-      QAD_MessageBox::warn1(QAD_Application::getDesktop(),
-                           QObject::tr( "SMESH_WRN_WARNING" ),
+       aMsg = (isFatal ? "SMESH_CANT_RM_HYP"  : "SMESH_RM_HYP_WRN");
+
+      aMsg = QObject::tr(aMsg).arg(aHypName) +
+       QObject::tr(QString("SMESH_HYP_%1").arg(theHypStatus));
+
+      SUIT_MessageBox::warn1(SMESHGUI::desktop(),
+                           QObject::tr("SMESH_WRN_WARNING"),
                            aMsg,
-                           QObject::tr( "SMESH_BUT_OK" ));
+                           QObject::tr("SMESH_BUT_OK"));
     }
   }
 
 
   void InitAvailableHypotheses()
   {
-    QAD_WaitCursor wc;
+    SUIT_OverrideCursor wc;
     if (myHypothesesMap.empty() && myAlgorithmsMap.empty()) {
       // Resource manager
-      QAD_ResourceMgr* resMgr = QAD_Desktop::createResourceManager();
+      SUIT_ResourceMgr* resMgr = SMESHGUI::resourceMgr();
       if (!resMgr) return;
-      
+
       // Find name of a resource XML file ("SMESH_Meshers.xml");
       QString HypsXml;
       char* cenv = getenv("SMESH_MeshersList");
       if (cenv)
        HypsXml.sprintf("%s", cenv);
-      
-      QStringList HypsXmlList = QStringList::split( ":", HypsXml, false );
+
+      QStringList HypsXmlList = QStringList::split(":", HypsXml, false);
       if (HypsXmlList.count() == 0)
        {
-         QAD_MessageBox::error1(QAD_Application::getDesktop(),
+         SUIT_MessageBox::error1(SMESHGUI::desktop(),
                                 QObject::tr("SMESH_WRN_WARNING"),
                                 QObject::tr("MESHERS_FILE_NO_VARIABLE"),
                                 QObject::tr("SMESH_BUT_OK"));
          return;
        }
-      
+
       // loop on files in HypsXml
       QString aNoAccessFiles;
-      for ( int i = 0; i < HypsXmlList.count(); i++ ) {
+      for (int i = 0; i < HypsXmlList.count(); i++) {
        QString HypsXml = HypsXmlList[ i ];
-       
+
        // Find full path to the resource XML file
-       QString xmlFile = HypsXml + ".xml";
-       xmlFile = QAD_Tools::addSlash(resMgr->findFile(xmlFile, HypsXml)) + xmlFile;
-       
-       QFile file (QAD_Tools::unix2win(xmlFile));
+       QString xmlFile = resMgr->path("resources", "SMESH", HypsXml + ".xml");
+        if ( xmlFile.isEmpty() ) // try PLUGIN resources
+          xmlFile = resMgr->path("resources", HypsXml, HypsXml + ".xml");
+        
+       QFile file (xmlFile);
        if (file.exists() && file.open(IO_ReadOnly)) {
          file.close();
-         
+
          SMESHGUI_XmlHandler* aXmlHandler = new SMESHGUI_XmlHandler();
          ASSERT(aXmlHandler);
-         
+
          QXmlInputSource source (file);
          QXmlSimpleReader reader;
          reader.setContentHandler(aXmlHandler);
@@ -154,11 +153,15 @@ namespace SMESH{
          bool ok = reader.parse(source);
          file.close();
          if (ok) {
-           addMap( aXmlHandler->myHypothesesMap, myHypothesesMap );
-           addMap( aXmlHandler->myAlgorithmsMap, myAlgorithmsMap );
+            myHypothesesMap.insert( aXmlHandler->myHypothesesMap.begin(),
+                                    aXmlHandler->myHypothesesMap.end() );
+            myAlgorithmsMap.insert( aXmlHandler->myAlgorithmsMap.begin(),
+                                    aXmlHandler->myAlgorithmsMap.end() );
+            myListOfHypothesesSets.splice( myListOfHypothesesSets.begin(),
+                                           aXmlHandler->myListOfHypothesesSets );
          }
          else {
-           QAD_MessageBox::error1(QAD_Application::getDesktop(), 
+           SUIT_MessageBox::error1(SMESHGUI::desktop(),
                                   QObject::tr("INF_PARSE_ERROR"),
                                   QObject::tr(aXmlHandler->errorProtocol()),
                                   QObject::tr("SMESH_BUT_OK"));
@@ -171,47 +174,74 @@ namespace SMESH{
            aNoAccessFiles += ", " + xmlFile;
        }
       } // end loop
-      
-      
+
+
       if (!aNoAccessFiles.isEmpty()) {
        QString aMess = QObject::tr("MESHERS_FILE_CANT_OPEN") + " " + aNoAccessFiles + "\n";
        aMess += QObject::tr("MESHERS_FILE_CHECK_VARIABLE");
-       wc.stop();
-       QAD_MessageBox::warn1(QAD_Application::getDesktop(),
+       wc.suspend();
+       SUIT_MessageBox::warn1(SMESHGUI::desktop(),
                              QObject::tr("SMESH_WRN_WARNING"),
                              aMess,
                              QObject::tr("SMESH_BUT_OK"));
-       wc.start();
+       wc.resume();
       }
     }
   }
 
 
-  QStringList GetAvailableHypotheses(const bool isAlgo)
+  QStringList GetAvailableHypotheses( const bool isAlgo, 
+                                      const int theDim,                          
+                                      const bool isAux )
   {
     QStringList aHypList;
-    
+
     // Init list of available hypotheses, if needed
     InitAvailableHypotheses();
-    
+
     // fill list of hypotheses/algorithms
+    THypothesisDataMap* pMap = isAlgo ? &myAlgorithmsMap : &myHypothesesMap;
     THypothesisDataMap::iterator anIter;
-    if (isAlgo) {
-      anIter = myAlgorithmsMap.begin();
-      for (; anIter != myAlgorithmsMap.end(); anIter++) {
-       aHypList.append(((*anIter).first).c_str());
-      }
+    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());
     }
-    else {
-      anIter = myHypothesesMap.begin();
-      for (; anIter != myHypothesesMap.end(); anIter++) {
-       aHypList.append(((*anIter).first).c_str());
+    return aHypList;
+  }
+
+
+  QStringList GetHypothesesSets()
+  {
+    QStringList aSetNameList;
+
+    // Init list of available hypotheses, if needed
+    InitAvailableHypotheses();
+
+    list<HypothesesSet*>::iterator hypoSet = myListOfHypothesesSets.begin();
+    for ( ; hypoSet != myListOfHypothesesSets.end(); ++hypoSet )
+    {
+      HypothesesSet* aSet = *hypoSet;
+      if ( aSet && aSet->AlgoList.count() ) {
+        aSetNameList.append( aSet->HypoSetName );
       }
     }
-    
-    return aHypList;
+
+    return aSetNameList;
+  }
+
+  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;
+    }
+    return 0;
   }
-  
 
   HypothesisData* GetHypothesisData (const char* aHypType)
   {
@@ -237,7 +267,7 @@ namespace SMESH{
     if(MYDEBUG) MESSAGE("Get HypothesisCreator for " << aHypType);
 
     SMESHGUI_GenericHypothesisCreator* aCreator = 0;
-    
+
     // check, if creator for this hypothesis type already exists
     if (myHypCreatorMap.find(aHypType) != myHypCreatorMap.end()) {
       aCreator = myHypCreatorMap[aHypType];
@@ -248,9 +278,8 @@ namespace SMESH{
 
       // 2. Get names of plugin libraries
       HypothesisData* aHypData = GetHypothesisData(aHypType);
-      if (!aHypData) {
-       return aCreator;
-      }
+      if (!aHypData) 
+        return aCreator;
       QString aClientLibName = aHypData->ClientLibName;
       QString aServerLibName = aHypData->ServerLibName;
 
@@ -270,7 +299,7 @@ namespace SMESH{
          typedef SMESHGUI_GenericHypothesisCreator* (*GetHypothesisCreator) \
            (QString aHypType, QString aServerLibName, SMESHGUI* aSMESHGUI);
          GetHypothesisCreator procHandle =
-           (GetHypothesisCreator)dlsym( libHandle, "GetHypothesisCreator" );
+           (GetHypothesisCreator)dlsym(libHandle, "GetHypothesisCreator");
          if (!procHandle) {
            if(MYDEBUG) MESSAGE("bad hypothesis client plugin library");
            dlclose(libHandle);
@@ -290,7 +319,7 @@ namespace SMESH{
        }
       }
       catch (const SALOME::SALOME_Exception& S_ex) {
-       QtCatchCorbaException(S_ex);
+       SalomeApp_Tools::QtCatchCorbaException(S_ex);
       }
     }
 
@@ -305,24 +334,29 @@ namespace SMESH{
     if(MYDEBUG) MESSAGE("Create " << aHypType << " with name " << aHypName);
 
     SMESH::SMESH_Hypothesis_var Hyp;
-    
+
     HypothesisData* aHypData = GetHypothesisData(aHypType);
     QString aServLib = aHypData->ServerLibName;
-    
+
     try {
-      Hyp = SMESH::GetSMESHGen()->CreateHypothesis(aHypType, aServLib);
+      Hyp = SMESHGUI::GetSMESHGen()->CreateHypothesis(aHypType, aServLib);
       if (!Hyp->_is_nil()) {
-       SALOMEDS::SObject_var SHyp = SMESH::FindSObject(Hyp.in());
-       if (!SHyp->_is_nil()) {
-         if ( strcmp(aHypName,"") != 0 )
-           SMESH::SetName( SHyp, aHypName );
-         GetActiveStudy()->updateObjBrowser(true);
+       _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();
        }
       }
     }
     catch (const SALOME::SALOME_Exception & S_ex) {
-      QtCatchCorbaException(S_ex);
+      SalomeApp_Tools::QtCatchCorbaException(S_ex);
     }
 
     return SMESH::SMESH_Hypothesis::_nil();
@@ -332,29 +366,29 @@ namespace SMESH{
   bool AddHypothesisOnMesh (SMESH::SMESH_Mesh_ptr aMesh, SMESH::SMESH_Hypothesis_ptr aHyp)
   {
     if(MYDEBUG) MESSAGE ("SMESHGUI::AddHypothesisOnMesh");
-    int res = SMESH::HYP_UNKNOWN_FATAL; 
-    QAD_WaitCursor wc;
-    
-    if ( !aMesh->_is_nil() ) {
-      SALOMEDS::SObject_var SM = SMESH::FindSObject( aMesh );
+    int res = SMESH::HYP_UNKNOWN_FATAL;
+    SUIT_OverrideCursor wc;
+
+    if (!aMesh->_is_nil()) {
+      _PTR(SObject) SM = SMESH::FindSObject(aMesh);
       GEOM::GEOM_Object_var aShapeObject = SMESH::GetShapeOnMeshOrSubMesh(SM);
       try {
-       res = aMesh->AddHypothesis( aShapeObject, aHyp );
-       if ( res < SMESH::HYP_UNKNOWN_FATAL ) {
-         SALOMEDS::SObject_var SH = SMESH::FindSObject(aHyp);
-         if ( !SM->_is_nil() && !SH->_is_nil() ) {
+       res = aMesh->AddHypothesis(aShapeObject, aHyp);
+       if (res < SMESH::HYP_UNKNOWN_FATAL) {
+         _PTR(SObject) SH = SMESH::FindSObject(aHyp);
+         if (SM && SH) {
            SMESH::ModifiedMesh(SM, false);
          }
        }
-       if ( res > SMESH::HYP_OK ) {
-         wc.stop();
-         processHypothesisStatus( res, aHyp, true );
-         wc.start();
+       if (res > SMESH::HYP_OK) {
+         wc.suspend();
+         processHypothesisStatus(res, aHyp, true);
+         wc.resume();
        }
       }
-      catch( const SALOME::SALOME_Exception& S_ex ) {
-       wc.stop();
-       QtCatchCorbaException( S_ex );
+      catch(const SALOME::SALOME_Exception& S_ex) {
+       wc.suspend();
+       SalomeApp_Tools::QtCatchCorbaException(S_ex);
        res = SMESH::HYP_UNKNOWN_FATAL;
       }
     }
@@ -364,182 +398,147 @@ namespace SMESH{
 
   bool AddHypothesisOnSubMesh (SMESH::SMESH_subMesh_ptr aSubMesh, SMESH::SMESH_Hypothesis_ptr aHyp)
   {
-    if(MYDEBUG) MESSAGE( "SMESHGUI::AddHypothesisOnSubMesh() ");
+    if(MYDEBUG) MESSAGE("SMESHGUI::AddHypothesisOnSubMesh() ");
     int res = SMESH::HYP_UNKNOWN_FATAL;
-    QAD_WaitCursor wc;
-    
-    if ( !aSubMesh->_is_nil() && ! aHyp->_is_nil() ) {
+    SUIT_OverrideCursor wc;
+
+    if (!aSubMesh->_is_nil() && ! aHyp->_is_nil()) {
       try {
        SMESH::SMESH_Mesh_var aMesh = aSubMesh->GetFather();
-       SALOMEDS::SObject_var SsubM = SMESH::FindSObject( aSubMesh );
-       GEOM::GEOM_Object_var aShapeObject = SMESH::GetShapeOnMeshOrSubMesh( SsubM );
-       if ( !aMesh->_is_nil() && !SsubM->_is_nil() && !aShapeObject->_is_nil() ) {
-         res = aMesh->AddHypothesis( aShapeObject, aHyp );
-         if ( res < SMESH::HYP_UNKNOWN_FATAL )  {
-           SMESH::ModifiedMesh( SsubM, false );
+       _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 (res < SMESH::HYP_UNKNOWN_FATAL)  {
+            _PTR(SObject) meshSO = SMESH::FindSObject(aMesh);
+            if (meshSO)
+              SMESH::ModifiedMesh(meshSO, false);
          }
-         if ( res > SMESH::HYP_OK ) {
-           wc.stop();
-           processHypothesisStatus( res, aHyp, true );
-           wc.start();
+         if (res > SMESH::HYP_OK) {
+           wc.suspend();
+           processHypothesisStatus(res, aHyp, true);
+           wc.resume();
          }
        }
        else {
-         SCRUTE( aHyp->_is_nil() );
-         SCRUTE( aMesh->_is_nil() );
-         SCRUTE( SsubM->_is_nil() );
-         SCRUTE( aShapeObject->_is_nil() );
+         SCRUTE(aHyp->_is_nil());
+         SCRUTE(aMesh->_is_nil());
+         SCRUTE(!SsubM);
+         SCRUTE(aShapeObject->_is_nil());
        }
       }
-      catch( const SALOME::SALOME_Exception& S_ex ) {
-       wc.stop();
-       QtCatchCorbaException( S_ex );
+      catch(const SALOME::SALOME_Exception& S_ex) {
+       wc.suspend();
+       SalomeApp_Tools::QtCatchCorbaException(S_ex);
        res = SMESH::HYP_UNKNOWN_FATAL;
       }
     }
     else {
-      SCRUTE( aSubMesh->_is_nil() );
-      SCRUTE( aHyp->_is_nil() );
+      SCRUTE(aSubMesh->_is_nil());
+      SCRUTE(aHyp->_is_nil());
     }
     return res < SMESH::HYP_UNKNOWN_FATAL;
   }
-  
+
   bool RemoveHypothesisOrAlgorithmOnMesh (const Handle(SALOME_InteractiveObject)& IObject)
   {
     int res = SMESH::HYP_UNKNOWN_FATAL;
-    QAD_WaitCursor wc;
-    
-    if (IObject->hasReference()) {
-      try {
-       SALOMEDS::Study_var aStudy = GetActiveStudyDocument();
-       SMESH_Hypothesis_var anHyp = IObjectToInterface<SMESH_Hypothesis>(IObject);
-       SALOMEDS::SObject_var aHypSObj = aStudy->FindObjectID(IObject->getReference());
-       if (!aHypSObj->_is_nil()) {
-         SALOMEDS::SObject_var MorSM = SMESH::GetMeshOrSubmesh(aHypSObj);
-         if (!MorSM->_is_nil()) {
-           GEOM::GEOM_Object_var aShape = SMESH::GetShapeOnMeshOrSubMesh(MorSM);
-           if (!aShape->_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(aShape, anHyp);
-               if ( res < SMESH::HYP_UNKNOWN_FATAL )
-                 SMESH::ModifiedMesh(MorSM, false);
-               if ( res > SMESH::HYP_OK ) {
-                 wc.stop();
-                 processHypothesisStatus( res, anHyp, false );
-                 wc.start();
-               }
-             }
-           }
-         }
-         
-         SALOMEDS::SObject_var aHypSObj = aStudy->FindObjectID(IObject->getReference());
-         if (!aHypSObj->_is_nil()) {
-           SALOMEDS::SObject_var MorSM = SMESH::GetMeshOrSubmesh(aHypSObj);
-           if (!MorSM->_is_nil()) {
-             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);
-                 if ( res < SMESH::HYP_UNKNOWN_FATAL )
-                   SMESH::ModifiedMesh(MorSM, false);
-                 if ( res > SMESH::HYP_OK ) {
-                   wc.stop();
-                   processHypothesisStatus( res, anHyp, false );
-                   wc.start();
-                 }
-               }
-             }
-           }
-         }
+    SUIT_OverrideCursor wc;
+
+    try {
+      _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 );
        }
       }
-      catch( const SALOME::SALOME_Exception& S_ex ) {
-       wc.stop();
-       QtCatchCorbaException( S_ex );
-       res = SMESH::HYP_UNKNOWN_FATAL;
-      }
-    } 
-    else if (IObject->hasEntry()) {
-      if(MYDEBUG) MESSAGE("IObject entry " << IObject->getEntry());
+    }
+    catch(const SALOME::SALOME_Exception& S_ex)
+    {
+      wc.suspend();
+      SalomeApp_Tools::QtCatchCorbaException(S_ex);
+      res = SMESH::HYP_UNKNOWN_FATAL;
     }
     return res < SMESH::HYP_UNKNOWN_FATAL;
   }
-  
-  bool RemoveHypothesisOrAlgorithmOnMesh (SALOMEDS::SObject_ptr MorSM,
-                                         SMESH::SMESH_Hypothesis_ptr anHyp)
+
+  bool RemoveHypothesisOrAlgorithmOnMesh (_PTR(SObject) MorSM,
+                                          SMESH::SMESH_Hypothesis_ptr anHyp)
   {
-    SALOMEDS::SObject_var AHR, aRef;
     SALOMEDS::GenericAttribute_var anAttr;
     SALOMEDS::AttributeIOR_var anIOR;
     int res = SMESH::HYP_UNKNOWN_FATAL;
-    QAD_WaitCursor wc;
-    
-    if (!MorSM->_is_nil()) {
+    SUIT_OverrideCursor wc;
+
+    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);
+        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() )
+
+         if (!aSubMesh->_is_nil())
            aMesh = aSubMesh->GetFather();
-         
+
          if (!aMesh->_is_nil()) {
            res = aMesh->RemoveHypothesis(aShapeObject, anHyp);
-           if ( res < SMESH::HYP_UNKNOWN_FATAL )
-             SMESH::ModifiedMesh(MorSM, false);
-           if ( res > SMESH::HYP_OK ) {
-             wc.stop();
-             processHypothesisStatus( res, anHyp, false );
-             wc.start();
+           if (res < SMESH::HYP_UNKNOWN_FATAL) {
+              _PTR(SObject) meshSO = SMESH::FindSObject(aMesh);
+              if (meshSO)
+                SMESH::ModifiedMesh(meshSO, false);
+            }
+           if (res > SMESH::HYP_OK) {
+             wc.suspend();
+             processHypothesisStatus(res, anHyp, false);
+             wc.resume();
            }
          }
        }
-      } catch( const SALOME::SALOME_Exception& S_ex ) {
-       wc.stop();
-       QtCatchCorbaException( S_ex );
+      } catch(const SALOME::SALOME_Exception& S_ex) {
+       wc.suspend();
+       SalomeApp_Tools::QtCatchCorbaException(S_ex);
        res = SMESH::HYP_UNKNOWN_FATAL;
       }
     }
     return res < SMESH::HYP_UNKNOWN_FATAL;
   }
 
-  SALOMEDS::Study::ListOfSObject* GetMeshesUsingAlgoOrHypothesis( SMESH::SMESH_Hypothesis_ptr AlgoOrHyp )
+  SObjectList GetMeshesUsingAlgoOrHypothesis(SMESH::SMESH_Hypothesis_ptr AlgoOrHyp)
   {
-    SALOMEDS::Study::ListOfSObject_var listSOmesh =
-      new SALOMEDS::Study::ListOfSObject;
-    listSOmesh->length(0);
+    SObjectList listSOmesh;
+    listSOmesh.resize(0);
+
     unsigned int index = 0;
     if (!AlgoOrHyp->_is_nil()) {
-      SALOMEDS::SObject_var SO_Hypothesis = SMESH::FindSObject(AlgoOrHyp);
-      if (!SO_Hypothesis->_is_nil()) {
-       SALOMEDS::Study::ListOfSObject_var listSO =
-         GetActiveStudyDocument()->FindDependances(SO_Hypothesis);
-       if(MYDEBUG) MESSAGE("SMESHGUI::GetMeshesUsingAlgoOrHypothesis(): dependency number ="<<listSO->length());
-       for (unsigned int i = 0; i < listSO->length(); i++) {
-         SALOMEDS::SObject_ptr SO = listSO[i];
-         if (!SO->_is_nil()) { 
-           SALOMEDS::SObject_var aFather = SO->GetFather();
-           if (!aFather->_is_nil()) {
-             SALOMEDS::SObject_var SOfatherFather = aFather->GetFather();
-             if (!SOfatherFather->_is_nil()) {
+      _PTR(SObject) SO_Hypothesis = SMESH::FindSObject(AlgoOrHyp);
+      if (SO_Hypothesis) {
+       SObjectList listSO =
+         SMESHGUI::activeStudy()->studyDS()->FindDependances(SO_Hypothesis);
+
+       if(MYDEBUG) MESSAGE("SMESHGUI::GetMeshesUsingAlgoOrHypothesis(): dependency number ="<<listSO.size());
+       for (unsigned int i = 0; i < listSO.size(); i++) {
+         _PTR(SObject) SO = listSO[i];
+         if (SO) {
+           _PTR(SObject) aFather = SO->GetFather();
+           if (aFather) {
+             _PTR(SObject) SOfatherFather = aFather->GetFather();
+             if (SOfatherFather) {
                if(MYDEBUG) MESSAGE("SMESHGUI::GetMeshesUsingAlgoOrHypothesis(): dependency added to list");
                index++;
-               listSOmesh->length(index);
+               listSOmesh.resize(index);
                listSOmesh[index - 1] = SOfatherFather;
              }
            }
@@ -547,8 +546,38 @@ namespace SMESH{
        }
       }
     }
-    if(MYDEBUG) MESSAGE("SMESHGUI::GetMeshesUsingAlgoOrHypothesis(): completed");
-    return listSOmesh._retn();
+    if (MYDEBUG) MESSAGE("SMESHGUI::GetMeshesUsingAlgoOrHypothesis(): completed");
+    return listSOmesh;
+  }
+
+#define CASE2MESSAGE(enum) case SMESH::enum: msg = QObject::tr( #enum ); break;
+  QString GetMessageOnAlgoStateErrors(const algo_error_array& errors)
+  {
+    QString resMsg = QObject::tr("SMESH_WRN_MISSING_PARAMETERS") + ":\n";
+    for ( int i = 0; i < errors.length(); ++i ) {
+      const SMESH::AlgoStateError & error = errors[ i ];
+      QString msg;
+      switch( error.name ) {
+        CASE2MESSAGE( MISSING_ALGO );
+        CASE2MESSAGE( MISSING_HYPO );
+        CASE2MESSAGE( NOT_CONFORM_MESH );
+      default: continue;
+      }
+      // apply args to message:
+      // %1 - algo name
+      if ( error.algoName.in() != 0 )
+        msg = msg.arg( error.algoName.in() );
+      // %2 - dimention
+      msg = msg.arg( error.algoDim );
+      // %3 - global/local
+      msg = msg.arg( QObject::tr( error.isGlobalAlgo ? "GLOBAL_ALGO" : "LOCAL_ALGO" ));
+      // %4 - hypothesis dim == algoDim
+      msg = msg.arg( error.algoDim );
+
+      if ( i ) resMsg += ";\n";
+      resMsg += msg;
+    }
+    return resMsg;
   }
 
 }