-// Copyright (C) 2007-2012 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
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
+// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
#include "SVTK_Trihedron.h"
#include "SVTK_CubeAxesActor2D.h"
-#include "SVTK_RectPicker.h"
+#include "SVTK_AreaPicker.h"
#include "SALOME_Actor.h"
#include "VTKViewer_Actor.h"
#include <vtkCellPicker.h>
#include <vtkProperty.h>
+#include <vtkProp3DCollection.h>
// undefining min and max because CASCADE's defines them and
// it clashes with std::min(), std::max() included in utilities.h
#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()),
- myPointRectPicker(SVTK_RectPicker::New()),
- myCellRectPicker(SVTK_RectPicker::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),
myPointPicker->Delete();
myCellPicker->Delete();
- myPointRectPicker->Delete();
- myPointRectPicker->PickFromListOn();
+ myPointAreaPicker->Delete();
+ myPointAreaPicker->PickFromListOn();
- myCellRectPicker->Delete();
- myCellRectPicker->PickFromListOn();
- myCellRectPicker->PickPointsOff();
+ myCellAreaPicker->Delete();
+ myCellAreaPicker->PickFromListOn();
+ myCellAreaPicker->PickPointsOff();
//SetPreselectionProp();
myPreHighlightProperty->Delete();
anActor->SetPointPicker(myPointPicker.GetPointer());
anActor->SetCellPicker(myCellPicker.GetPointer());
- anActor->SetPointRectPicker(myPointRectPicker.GetPointer());
- anActor->SetCellRectPicker(myCellRectPicker.GetPointer());
+ anActor->SetPointAreaPicker(myPointAreaPicker.GetPointer());
+ anActor->SetCellAreaPicker(myCellAreaPicker.GetPointer());
anActor->SetPreHighlightProperty(myPreHighlightProperty.GetPointer());
anActor->SetHighlightProperty(myHighlightProperty.GetPointer());
anActor->SetPointPicker(NULL);
anActor->SetCellPicker(NULL);
- anActor->SetPointRectPicker(NULL);
- anActor->SetCellRectPicker(NULL);
+ anActor->SetPointAreaPicker(NULL);
+ anActor->SetCellAreaPicker(NULL);
anActor->SetPreHighlightProperty(NULL);
anActor->SetHighlightProperty(NULL);
anActor->RemoveFromRender(GetDevice());
+ while ( int i = myPointPicker->GetProp3Ds()->IsItemPresent( theActor ))
+ myPointPicker->GetProp3Ds()->RemoveItem( i-1 );
+ while ( int i = myCellPicker->GetProp3Ds()->IsItemPresent( theActor ))
+ myCellPicker->GetProp3Ds()->RemoveItem( i-1 );
+
+ while ( int i = myPointPicker->GetActors()->IsItemPresent( theActor ))
+ myPointPicker->GetActors()->RemoveItem( i-1 );
+ while ( int i = myCellPicker->GetActors()->IsItemPresent( theActor ))
+ myCellPicker->GetActors()->RemoveItem( i-1 );
+
if(theIsAdjustActors)
AdjustActors();
}
myPointPicker->SetTolerance( theTolNodes );
myCellPicker->SetTolerance( theTolCell );
- myPointRectPicker->SetTolerance( theTolNodes );
- myCellRectPicker->SetTolerance( theTolCell );
+ myPointAreaPicker->SetTolerance( theTolNodes );
+ myCellAreaPicker->SetTolerance( theTolCell );
mySelector->SetTolerance( theTolObjects );
}
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;
}
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){
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
*/
::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
*/