Salome HOME
Fix crash after 'Belong to' filter creation if there are no mesh in the study
[modules/smesh.git] / src / SMESHGUI / SMESHGUI.cxx
index 2440a84392aab590794a51e30cf6e76072512397..72493fd507a187280006c009d34aa5fbcce66a6c 100644 (file)
@@ -64,6 +64,7 @@
 #include "SMESHGUI_Selection.h"
 #include "SMESHGUI_CreatePolyhedralVolumeDlg.h"
 #include "SMESHGUI_MeshOp.h"
+#include "SMESHGUI_Displayer.h"
 
 #include "SMESHGUI_Utils.h"
 #include "SMESHGUI_GEOMGenUtils.h"
@@ -804,8 +805,9 @@ SalomeApp_Module( "SMESH" )
     myComponentSMESH = SMESH::SMESH_Gen::_narrow( comp );
   }
 
-  myActiveDialogBox = 0 ;
-  myState = -1 ;
+  myActiveDialogBox = 0;
+  myState = -1;
+  myDisplayer = 0;
 
   SMESH::GetFilterManager();
   SMESH::GetPattern();
@@ -822,6 +824,7 @@ SalomeApp_Module( "SMESH" )
 SMESHGUI::~SMESHGUI()
 {
   SMESH::GetFilterManager()->Destroy();
+  SMESH::GetFilterManager() = SMESH::FilterManager::_nil();
 }
 
 //=============================================================================
@@ -1056,6 +1059,10 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
   if( !mgr )
     return false;
 
+  if (CORBA::is_nil(GetSMESHGen()->GetCurrentStudy())) {
+    GetSMESHGen()->SetCurrentStudy(_CAST(Study,aStudy)->GetStudy());
+  }
+
   SUIT_ViewWindow* view = application()->desktop()->activeWindow();
   SVTK_ViewWindow* vtkwnd = dynamic_cast<SVTK_ViewWindow*>( view );
 
@@ -1153,12 +1160,46 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       }
 
       SalomeApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
-      SALOME_ListIO selected;
+      SALOME_ListIO sel_objects, to_process;
       if (aSel)
-        aSel->selectedObjects( selected );
+        aSel->selectedObjects( sel_objects );
+
+      SALOME_ListIteratorOfListIO anIt( sel_objects );
+      for( ; anIt.More(); anIt.Next() )
+      {
+       Handle( SALOME_InteractiveObject ) obj = anIt.Value();
+       if( obj->hasEntry() )
+       {
+         _PTR(SObject) SO = activeStudy()->studyDS()->FindObjectID( obj->getEntry() );
+         if( SO && QString( SO->GetID().c_str() ) == SO->GetFatherComponent()->GetID().c_str() )
+         { //component is selected
+           _PTR(SComponent) SC( SO->GetFatherComponent() );
+           _PTR(ChildIterator) anIter ( activeStudy()->studyDS()->NewChildIterator( SC ) );
+           anIter->InitEx( true );
+           while( anIter->More() )
+           {
+             _PTR(SObject) valSO ( anIter->Value() );
+             _PTR(SObject) refSO;
+             if( !valSO->ReferencedObject( refSO ) )
+             {
+               QString id = valSO->GetID().c_str(),
+                        comp = SC->ComponentDataType().c_str(),
+                       val = valSO->GetName().c_str();
+
+               Handle( SALOME_InteractiveObject ) new_obj =
+                 new SALOME_InteractiveObject( id.latin1(), comp.latin1(), val.latin1() );
+               to_process.Append( new_obj );
+             }
+             anIter->Next();
+           }
+           continue;
+         }
+       }
+       to_process.Append( obj );
+      }
 
       if (vtkwnd) {
-       SALOME_ListIteratorOfListIO It (selected);
+       SALOME_ListIteratorOfListIO It( to_process );
        for (; It.More(); It.Next()) {
          Handle(SALOME_InteractiveObject) IOS = It.Value();
          if (IOS->hasEntry()) {
@@ -1174,7 +1215,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
        aSel->setSelectedObjects( l1 );
       }
       else
-       aSel->setSelectedObjects( selected );
+       aSel->setSelectedObjects( to_process );
       break;
     }
 
@@ -2546,7 +2587,8 @@ void SMESHGUI::initialize( CAM_Application* app )
 
   QString lc = QtxPopupMgr::Selection::defEquality();
   QString aClient = QString( "%1client in {%2}" ).arg( lc ).arg( "'VTKViewer'" );
-  QString aType = QString( "%1type in {%2}" ).arg( QtxPopupMgr::Selection::defEquality() ).arg( mesh_group );
+  QString aType = QString( "%1type in {%2}" ).arg( QtxPopupMgr::Selection::defEquality() );
+  aType = aType.arg( mesh_group );
   QString aMeshInVTK = aClient + "&&" + aType;
 
   //-------------------------------------------------
@@ -2715,15 +2757,17 @@ void SMESHGUI::initialize( CAM_Application* app )
   aClient = "($client in {'VTKViewer' 'ObjectBrowser'})";
   QString anActiveVTK = QString("activeView = '%1'").arg(VTKViewer_Viewer::Type());
   QString aSelCount = QString( "%1 > 0" ).arg( QtxPopupMgr::Selection::defSelCountParam() );
-  QString aRule = aClient + " and " + aType + " and " + aSelCount + " and " + anActiveVTK;
+
+  QString aRule = "$component={'SMESH'} and ( type='Component' or (" + aClient + " and " +
+    aType + " and " + aSelCount + " and " + anActiveVTK + " and " + isNotEmpty + " %1 ) )";
   popupMgr()->insert( action( 301 ), -1, -1 ); // DISPLAY
-  popupMgr()->setRule( action( 301 ), aRule + "&&" + isNotEmpty + "&&" + isInvisible, true);
+  popupMgr()->setRule( action( 301 ), aRule.arg( "and (not isVisible)" ), true);
 
   popupMgr()->insert( action( 300 ), -1, -1 ); // ERASE
-  popupMgr()->setRule( action( 300 ), aRule + "&&" + isNotEmpty + "&& isVisible", true );
+  popupMgr()->setRule( action( 300 ), aRule.arg( "and isVisible" ), true );
 
   popupMgr()->insert( action( 302 ), -1, -1 ); // DISPLAY_ONLY
-  popupMgr()->setRule( action( 302 ), aRule + "&&" + isNotEmpty, true );
+  popupMgr()->setRule( action( 302 ), aRule.arg( "" ), true );
 
   popupMgr()->insert( separator(), -1, -1 );
 
@@ -3045,5 +3089,14 @@ SalomeApp_Operation* SMESHGUI::createOperation( const int id ) const
     break;
   }
 
+  if( !op )
+    op = SalomeApp_Module::createOperation( id );
   return op;
 }
+
+SalomeApp_Displayer* SMESHGUI::displayer()
+{
+  if( !myDisplayer )
+    myDisplayer = new SMESHGUI_Displayer( dynamic_cast<SalomeApp_Study*>( getApp()->activeStudy() ) );
+  return myDisplayer;
+}