Salome HOME
bos #20256: [CEA 18523] Porting SMESH to int 64 bits
[modules/smesh.git] / src / SMESHGUI / SMESHGUI_VTKUtils.cxx
index b74d29e50b73237b8359e46843b9b364a6356a8d..eb7a7e5bfe006b415fc318cba4554f059a288510 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2016  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2021  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
@@ -232,6 +232,86 @@ namespace SMESH
     }
   }
 
+  //================================================================================
+  /*!
+   * \brief Remove/update actors while module activation
+   *  \param [in] wnd - window
+   *
+   * At module activation, groups and sub-meshes can be removed on engine side due
+   * to modification of meshed geometry, while their actors can remain.
+   * Here we remove/update SMESH_Actor's of changed objects. State (emptiness) of objects
+   * is defined by their icons in the Object Browser
+   */
+  //================================================================================
+
+  void UpdateActorsAfterUpdateStudy( SUIT_ViewWindow* theWindow )
+  {
+    const char* emptyIcon = "ICON_SMESH_TREE_MESH_WARN";
+    _PTR(Study) aStudy = SMESH::getStudy();
+
+    if ( SVTK_ViewWindow* aViewWindow = GetVtkViewWindow( theWindow ))
+    {
+      vtkRenderer *aRenderer = aViewWindow->getRenderer();
+      VTK::ActorCollectionCopy aCopy(aRenderer->GetActors());
+      vtkActorCollection *aCollection = aCopy.GetActors();
+      aCollection->InitTraversal();
+      while ( vtkActor *actor = aCollection->GetNextActor() ) {
+        if ( SMESH_Actor *smeshActor = dynamic_cast<SMESH_Actor*>( actor ))
+        {
+          if ( !smeshActor->hasIO() )
+            continue;
+          Handle(SALOME_InteractiveObject) io = smeshActor->getIO();
+          if ( !io->hasEntry() )
+            continue;
+          _PTR(SObject) so = aStudy->FindObjectID( io->getEntry() );
+          if ( !so )
+            continue; // seems impossible
+
+          CORBA::Object_var obj = SMESH::SObjectToObject( so );
+          if ( CORBA::is_nil( obj )) // removed object
+          {
+            RemoveActor( theWindow, smeshActor );
+            continue;
+          }
+
+          bool toShow = smeshActor->GetVisibility();
+          _PTR(GenericAttribute) attr;
+          if ( toShow && so->FindAttribute( attr, "AttributePixMap" )) // check emptiness
+          {
+            _PTR(AttributePixMap) pixMap = attr;
+            toShow = ( pixMap->GetPixMap() != emptyIcon );
+          }
+          //smeshActor->Update();
+          UpdateView( theWindow, toShow ? eDisplay : eErase, io->getEntry() );
+        }
+      }
+    }
+    return;
+  }
+
+  //================================================================================
+  /*!
+   * \brief Remove/update actors while module activation
+   *
+   * At module activation, groups and sub-meshes can be removed on engine side due
+   * to modification of meshed geometry, while their actors can remain.
+   * Here we remove/update SMESH_Actor's of changed objects. State (emptiness) of objects
+   * is defined by their icons in the Object Browser
+   */
+  //================================================================================
+
+  void UpdateActorsAfterUpdateStudy()
+  {
+    SUIT_Study* study = SMESH::GetActiveStudy();
+    if ( SUIT_Desktop* desk = study->application()->desktop() )
+    {
+      QList<SUIT_ViewWindow*> wndList = desk->windows();
+      SUIT_ViewWindow* wnd;
+      foreach ( wnd, wndList )
+        SMESH::UpdateActorsAfterUpdateStudy(wnd);
+    }
+  }
+
   //================================================================================
   /*!
    * \brief Notify the user on problems during visualization
@@ -646,9 +726,10 @@ namespace SMESH
    */
   //================================================================================
 
-  bool noSmeshActors(SUIT_ViewWindow *theWnd)
+  bool NoSmeshActors(SUIT_ViewWindow *theWnd)
   {
-    if(SVTK_ViewWindow* aViewWindow = GetVtkViewWindow(theWnd)) {
+    SUIT_ViewWindow* aWnd = ( theWnd == nullptr ) ? GetActiveWindow() : theWnd;
+    if(SVTK_ViewWindow* aViewWindow = GetVtkViewWindow(aWnd)) {
       vtkRenderer *aRenderer = aViewWindow->getRenderer();
       VTK::ActorCollectionCopy aCopy(aRenderer->GetActors());
       vtkActorCollection *aCollection = aCopy.GetActors();
@@ -677,6 +758,7 @@ namespace SMESH
     if (!aStudy)
       return OK;
 
+    SUIT_ResourceMgr* resMgr;
     {
       OK = true;
       vtkRenderer *aRenderer = aViewWnd->getRenderer();
@@ -712,6 +794,7 @@ namespace SMESH
         }
         aStudy->setVisibilityStateForAll(Qtx::HiddenState);
       }
+      // fall through
       default: {
         if (SMESH_Actor *anActor = FindActorByEntry(theWnd,theEntry)) {
           switch (theAction) {
@@ -722,6 +805,10 @@ namespace SMESH
               anActor->SetVisibility(true);
               if (theAction == eDisplayOnly) aRenderer->ResetCameraClippingRange();
               aStudy->setVisibilityState(theEntry, Qtx::ShownState);
+              if (( theAction == eDisplayOnly ) &&
+                  ( resMgr = SMESHGUI::resourceMgr() ) &&
+                  ( resMgr->booleanValue( "SMESH", "fitall_on_displayonly", false )))
+                FitAll(); // PAL23615
               break;
             case eErase:
               //MESSAGE("--- erase " << anActor);
@@ -741,13 +828,21 @@ namespace SMESH
               if ( (aVisualObj = GetVisualObj(theEntry)) && aVisualObj->IsValid())
               {
                 if ((anActor = CreateActor(theEntry,true))) {
-                  bool needFitAll = noSmeshActors(theWnd); // fit for the first object only
+                  bool needFitAll = NoSmeshActors(theWnd); // fit for the first object only
                   DisplayActor(theWnd,anActor);
                   anActor->SetVisibility(true);
                   aStudy->setVisibilityState(theEntry, Qtx::ShownState);
                   // FitAll(); - PAL16770(Display of a group performs an automatic fit all)
-                  if (needFitAll) FitAll();
-                } else {
+                  if (( !needFitAll ) &&
+                      ( theAction == eDisplayOnly ) &&
+                      ( resMgr = SMESHGUI::resourceMgr() ))
+                  {
+                    needFitAll = resMgr->booleanValue( "SMESH", "fitall_on_displayonly", false );
+                  }
+                  if ( needFitAll )
+                    FitAll();
+                }
+                else {
                   OK = false;
                 }
               }
@@ -883,7 +978,7 @@ namespace SMESH
     SMESH_ActorProps::props()->reset();
 
     QColor
-      aHiColor = mgr->colorValue( "SMESH", "selection_object_color", Qt::white ),
+      //aHiColor = mgr->colorValue( "SMESH", "selection_object_color", Qt::white ),
       aSelColor = mgr->colorValue( "SMESH", "selection_element_color", Qt::yellow ),
       aPreColor = mgr->colorValue( "SMESH", "highlight_color", Qt::cyan );
 
@@ -923,7 +1018,7 @@ namespace SMESH
         aCollection->InitTraversal();
         while ( vtkActor *anAct = aCollection->GetNextActor() ) {
           if ( SMESH_Actor *anActor = dynamic_cast<SMESH_Actor*>(anAct) ) {
-           anActor->UpdateSelectionProps();
+            anActor->UpdateSelectionProps();
           }
         }
       }
@@ -1099,7 +1194,7 @@ namespace SMESH
                              QString&                                theName)
   {
     theName = "";
-    TColStd_IndexedMapOfInteger aMapIndex;
+    SVTK_TIndexedMapOfVtkId aMapIndex;
     theSelector->GetIndex(theIO,aMapIndex);
 
     for(int i = 1; i <= aMapIndex.Extent(); i++)
@@ -1113,10 +1208,10 @@ namespace SMESH
                                 QString& theName)
   {
     theName = "";
-    TColStd_IndexedMapOfInteger aMapIndex;
+    SVTK_TIndexedMapOfVtkId aMapIndex;
     theSelector->GetIndex(theIO,aMapIndex);
 
-    typedef std::set<int> TIdContainer;
+    typedef std::set<vtkIdType> TIdContainer;
     TIdContainer anIdContainer;
     for( int i = 1; i <= aMapIndex.Extent(); i++)
       anIdContainer.insert(aMapIndex(i));
@@ -1131,8 +1226,8 @@ namespace SMESH
 
   int GetEdgeNodes(SVTK_Selector* theSelector,
                    const TVisualObjPtr& theVisualObject,
-                   int& theId1,
-                   int& theId2)
+                   smIdType& theId1,
+                   smIdType& theId2)
   {
     const SALOME_ListIO& selected = theSelector->StoredIObjects();
 
@@ -1143,14 +1238,14 @@ namespace SMESH
     if ( anIO.IsNull() || !anIO->hasEntry() )
       return -1;
 
-    TColStd_IndexedMapOfInteger aMapIndex;
+    SVTK_TIndexedMapOfVtkId aMapIndex;
     theSelector->GetIndex( anIO, aMapIndex );
     if ( aMapIndex.Extent() != 2 )
       return -1;
 
-    int anObjId = -1, anEdgeNum = -1;
-    for ( int i = 1; i <= aMapIndex.Extent(); i++ ) {
-      int aVal = aMapIndex( i );
+    smIdType anObjId = -1, anEdgeNum = -1;
+    for ( smIdType i = 1; i <= aMapIndex.Extent(); i++ ) {
+      smIdType aVal = aMapIndex( i );
       if ( aVal > 0 )
         anObjId = aVal;
       else
@@ -1232,7 +1327,7 @@ namespace SMESH
 
   int GetSelected(LightApp_SelectionMgr*       theMgr,
                   TColStd_IndexedMapOfInteger& theMap,
-                  const bool                   theIsElement)
+                  const bool                   /*theIsElement*/)
   {
     theMap.Clear();
     SALOME_ListIO selected; theMgr->selectedObjects( selected );
@@ -1248,7 +1343,7 @@ namespace SMESH
   }
 
 
-  int GetEdgeNodes( LightApp_SelectionMgr* theMgr, int& theId1, int& theId2 )
+  int GetEdgeNodes( LightApp_SelectionMgr* theMgr, smIdType& theId1, smIdType& theId2 )
   {
     SALOME_ListIO selected; theMgr->selectedObjects( selected );
 
@@ -1268,9 +1363,9 @@ namespace SMESH
     if ( aMapIndex.Extent() != 2 )
       return -1;
 
-    int anObjId = -1, anEdgeNum = -1;
-    for ( int i = 1; i <= aMapIndex.Extent(); i++ ) {
-      int aVal = aMapIndex( i );
+    smIdType anObjId = -1, anEdgeNum = -1;
+    for ( smIdType i = 1; i <= aMapIndex.Extent(); i++ ) {
+      smIdType aVal = aMapIndex( i );
       if ( aVal > 0 )
         anObjId = aVal;
       else