Salome HOME
PAL10491. "... algo misses some hypothesis" -> "... algo misses nD hypothesis"
[modules/smesh.git] / src / SMESHGUI / SMESHGUI_HypothesesUtils.cxx
index 507ac2563d7f4e738b8acb545b3515195ef38905..3e48afa89d70c9412aa760f42f013a077cd9c107 100644 (file)
@@ -66,14 +66,7 @@ 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,
@@ -160,8 +153,12 @@ 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 {
            SUIT_MessageBox::error1(SMESHGUI::desktop(),
@@ -193,7 +190,9 @@ namespace SMESH{
   }
 
 
-  QStringList GetAvailableHypotheses(const bool isAlgo)
+  QStringList GetAvailableHypotheses( const bool isAlgo, 
+                                      const int theDim,                          
+                                      const bool isAux )
   {
     QStringList aHypList;
 
@@ -201,23 +200,48 @@ namespace SMESH{
     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)
   {
@@ -254,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;
 
@@ -422,55 +445,38 @@ namespace SMESH{
     int res = SMESH::HYP_UNKNOWN_FATAL;
     SUIT_OverrideCursor wc;
 
-    if (IObject->hasReference()) {
-      try {
-       _PTR(Study) aStudy = GetActiveStudyDocument();
-       SMESH_Hypothesis_var anHyp = IObjectToInterface<SMESH_Hypothesis>(IObject);
-       _PTR(SObject) aHypSObj = aStudy->FindObjectID(IObject->getReference());
-       if (aHypSObj) {
-         _PTR(SObject) MorSM = SMESH::GetMeshOrSubmesh(aHypSObj);
-         if (MorSM) {
-           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) {
-                  _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();
-               }
-             }
-           }
-         }
+    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.suspend();
-       SalomeApp_Tools::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 (_PTR(SObject) MorSM,
-                                         SMESH::SMESH_Hypothesis_ptr anHyp)
+                                          SMESH::SMESH_Hypothesis_ptr anHyp)
   {
     SALOMEDS::GenericAttribute_var anAttr;
     SALOMEDS::AttributeIOR_var anIOR;
@@ -479,9 +485,9 @@ 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);
+        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())
@@ -525,7 +531,7 @@ namespace SMESH{
        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) {
+         if (SO) {
            _PTR(SObject) aFather = SO->GetFather();
            if (aFather) {
              _PTR(SObject) SOfatherFather = aFather->GetFather();
@@ -543,4 +549,35 @@ namespace SMESH{
     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;
+  }
+
 }