X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FSVTK%2FSVTK_Renderer.cxx;h=e6a0b74df3b037a7d1a5d8ec9f7c4ed241d8ccd8;hb=5d44d2f6ea60a50bbbc593f2b45a6075fe9e5154;hp=d5ccedbefe59f7690d755967d4b7c4002986c054;hpb=c47605c13ccf37a7b3fcb9cb6c8baf38d3643f77;p=modules%2Fgui.git diff --git a/src/SVTK/SVTK_Renderer.cxx b/src/SVTK/SVTK_Renderer.cxx old mode 100755 new mode 100644 index d5ccedbef..e6a0b74df --- a/src/SVTK/SVTK_Renderer.cxx +++ b/src/SVTK/SVTK_Renderer.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2023 CEA, EDF, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -55,24 +55,24 @@ #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){ @@ -697,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 */