Salome HOME
Copyright update 2022
[modules/gui.git] / src / SVTK / SVTK_Renderer.cxx
index 8bbed38032062ccaa891a9cbfff9e052b1426b98..3d8aa0aa4d3c5ca4618d0cdbbcd9801c638c6e0b 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2014  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2022  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
 #undef max
 
 
-vtkStandardNewMacro(SVTK_Renderer);
+vtkStandardNewMacro(SVTK_Renderer)
 
 /*!
   Constructor
 */
 SVTK_Renderer
 ::SVTK_Renderer():
-  myDevice(VTKViewer_OpenGLRenderer::New()),
-  myInteractor(NULL),
   myPriority(0.0),
   myEventCallbackCommand(vtkCallbackCommand::New()),
+  myDevice(VTKViewer_OpenGLRenderer::New()),
+  myInteractor(NULL),
+  myTransform(VTKViewer_Transform::New()),
   myPointPicker(vtkPointPicker::New()),
   myCellPicker(vtkCellPicker::New()),
   myPointAreaPicker(SVTK_AreaPicker::New()),
   myCellAreaPicker(SVTK_AreaPicker::New()),
   myPreHighlightProperty(vtkProperty::New()),
   myHighlightProperty(vtkProperty::New()),
-  myTransform(VTKViewer_Transform::New()),
   myCubeAxes(SVTK_CubeAxesActor2D::New()),
   myTrihedron(SVTK_Trihedron::New()),
   myTrihedronSize(105),
@@ -395,9 +395,9 @@ inline
 bool
 CheckBndBox(const double theBounds[6])
 {
-  if(theBounds[0] > -VTK_LARGE_FLOAT && theBounds[1] < VTK_LARGE_FLOAT &&
-     theBounds[2] > -VTK_LARGE_FLOAT && theBounds[3] < VTK_LARGE_FLOAT &&
-     theBounds[4] > -VTK_LARGE_FLOAT && theBounds[5] < VTK_LARGE_FLOAT)
+  if(theBounds[0] > -VTK_FLOAT_MAX && theBounds[1] < VTK_FLOAT_MAX &&
+     theBounds[2] > -VTK_FLOAT_MAX && theBounds[3] < VTK_FLOAT_MAX &&
+     theBounds[4] > -VTK_FLOAT_MAX && theBounds[5] < VTK_FLOAT_MAX)
     return true;
   return false;
 }
@@ -413,8 +413,8 @@ SVTK_Renderer
   bool aCDisplayed = IsCubeAxesDisplayed();
 
   double aNewBndBox[6];
-  aNewBndBox[ 0 ] = aNewBndBox[ 2 ] = aNewBndBox[ 4 ] = VTK_LARGE_FLOAT;
-  aNewBndBox[ 1 ] = aNewBndBox[ 3 ] = aNewBndBox[ 5 ] = -VTK_LARGE_FLOAT;
+  aNewBndBox[ 0 ] = aNewBndBox[ 2 ] = aNewBndBox[ 4 ] = VTK_FLOAT_MAX;
+  aNewBndBox[ 1 ] = aNewBndBox[ 3 ] = aNewBndBox[ 5 ] = -VTK_FLOAT_MAX;
 
   int aVisibleNum = myTrihedron->GetVisibleActorCount(GetDevice());
   if(aVisibleNum){
@@ -558,6 +558,18 @@ SVTK_Renderer
     myTrihedron->VisibilityOn();
 }
 
+/*!
+  Set trihedron visibility
+*/
+void 
+SVTK_Renderer
+::SetTrihedronVisibility( const bool show ) {
+  if(show)
+    myTrihedron->VisibilityOn();
+  else
+    myTrihedron->VisibilityOff();  
+}
+
 /*!
   Adjust size of the trihedron to the bounding box of the scene
 */
@@ -685,6 +697,72 @@ SVTK_Renderer
   ::ResetCameraClippingRange(GetDevice());
 }
 
+/*!
+  Fit all selected presentation in the scene
+*/
+void SVTK_Renderer::onFitSelection()
+{
+  vtkActorCollection* aSelectedCollection = vtkActorCollection::New();
+
+  VTK::ActorCollectionCopy aCopy( GetDevice()->GetActors() );
+  vtkActorCollection* aCollection = aCopy.GetActors();
+  aCollection->InitTraversal();
+  while ( vtkActor* aProp = aCollection->GetNextActor() )
+    if ( SALOME_Actor* anActor = SALOME_Actor::SafeDownCast( aProp ) ) {
+      const Handle(SALOME_InteractiveObject)& io = anActor->getIO();
+      if ( !io.IsNull() && mySelector->IsSelected( io ) )
+        aSelectedCollection->AddItem( aProp );
+    }
+  
+  if( aSelectedCollection->GetNumberOfItems() == 0 )
+    return; // if collection is empty
+  
+  double bounds[6];
+  ::ComputeBounds( aSelectedCollection, bounds );
+
+  if ( aSelectedCollection->GetNumberOfItems() && ::isBoundValid( bounds ) ) {
+    GetDevice()->ResetCamera( bounds );
+    GetDevice()->ResetCameraClippingRange( bounds );
+  }
+}
+
+void SVTK_Renderer::OnFitIObjects(const SALOME_ListIO& objects)
+{
+  vtkActorCollection* aSelectedCollection = vtkActorCollection::New();
+
+  VTK::ActorCollectionCopy aCopy( GetDevice()->GetActors() );
+  vtkActorCollection* aCollection = aCopy.GetActors();
+  aCollection->InitTraversal();
+  while ( vtkActor* aProp = aCollection->GetNextActor() )
+  {
+    if ( SALOME_Actor* anActor = SALOME_Actor::SafeDownCast( aProp ) ) {
+      const Handle(SALOME_InteractiveObject)& io = anActor->getIO();
+      if ( anActor->GetVisibility() && !io.IsNull() ) {
+       SALOME_ListIteratorOfListIO iter( objects );
+       for ( ; iter.More(); iter.Next() ) {
+         if ( iter.Value().IsNull() )
+           continue;
+         if ( io->isSame( iter.Value() ) ) {
+           aSelectedCollection->AddItem( aProp );
+           break;
+         }
+       }
+      }
+    }
+  }
+
+  if( aSelectedCollection->GetNumberOfItems() == 0 )
+    return; // if collection is empty
+  
+  double bounds[6];
+  ::ComputeBounds( aSelectedCollection, bounds );
+
+  if ( aSelectedCollection->GetNumberOfItems() && ::isBoundValid( bounds ) ) {
+    GetDevice()->ResetCamera( bounds );
+    GetDevice()->ResetCameraClippingRange( bounds );
+  }
+}
+
 /*!
   Reset camera clipping range to adjust the range to the bounding box of the scene
 */