Files
ThirdParty-6/ParaView-5.0.1/ParaViewCore/ClientServerCore/Rendering/vtk3DWidgetRepresentation.cxx

254 lines
7.8 KiB
C++

/*=========================================================================
Program: ParaView
Module: vtk3DWidgetRepresentation.cxx
Copyright (c) Kitware, Inc.
All rights reserved.
See Copyright.txt or http://www.paraview.org/HTML/Copyright.html for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
#include "vtk3DWidgetRepresentation.h"
#include "vtkAbstractWidget.h"
#include "vtkCommand.h"
#include "vtkObjectFactory.h"
#include "vtkPVImplicitPlaneRepresentation.h"
#include "vtkPVRenderView.h"
#include "vtkRenderer.h"
#include "vtkTransform.h"
#include "vtkWidgetRepresentation.h"
vtkStandardNewMacro(vtk3DWidgetRepresentation);
vtkCxxSetObjectMacro(vtk3DWidgetRepresentation, Widget, vtkAbstractWidget);
//----------------------------------------------------------------------------
vtk3DWidgetRepresentation::vtk3DWidgetRepresentation()
{
this->SetNumberOfInputPorts(0);
this->Widget = 0;
this->Representation = 0;
this->UseNonCompositedRenderer = false;
this->Enabled = false;
this->CustomTransform = vtkTransform::New();
this->CustomTransform->PostMultiply();
this->CustomTransform->Identity();
this->RepresentationObserverTag = 0;
this->ViewObserverTag = 0;
}
//----------------------------------------------------------------------------
vtk3DWidgetRepresentation::~vtk3DWidgetRepresentation()
{
this->SetWidget(0);
this->SetRepresentation(0);
this->CustomTransform->Delete();
}
//-----------------------------------------------------------------------------
void vtk3DWidgetRepresentation::SetRepresentation(vtkWidgetRepresentation* repr)
{
if (this->Representation == repr)
{
return;
}
if (this->Representation)
{
this->Representation->RemoveObserver(this->RepresentationObserverTag);
this->RepresentationObserverTag = 0;
}
vtkSetObjectBodyMacro(Representation, vtkWidgetRepresentation, repr);
if (this->Representation)
{
this->RepresentationObserverTag = this->Representation->AddObserver(
vtkCommand::ModifiedEvent,
this, &vtk3DWidgetRepresentation::OnRepresentationModified);
}
this->UpdateEnabled();
this->UpdateTransform();
}
//----------------------------------------------------------------------------
bool vtk3DWidgetRepresentation::AddToView(vtkView* view)
{
vtkPVRenderView* pvview = vtkPVRenderView::SafeDownCast(view);
if (pvview)
{
vtkRenderer* activeRenderer = this->UseNonCompositedRenderer?
pvview->GetNonCompositedRenderer() : pvview->GetRenderer();
if (this->Widget)
{
// If DefaultRenderer is non-null, SetCurrentRenderer() will have no
// effect.
this->Widget->SetDefaultRenderer(NULL);
this->Widget->SetCurrentRenderer(activeRenderer);
// Set the DefaultRenderer to ensure that it doesn't get overridden by the
// Widget. The Widget should use the specified renderer. Period.
this->Widget->SetDefaultRenderer(activeRenderer);
}
if (this->Representation)
{
this->Representation->SetRenderer(activeRenderer);
activeRenderer->AddActor(this->Representation);
}
if (this->View)
{
this->View->RemoveObserver(this->ViewObserverTag);
this->ViewObserverTag = 0;
}
this->View = pvview;
// observer the view so we know when it gets a new interactor.
this->ViewObserverTag = this->View->AddObserver(vtkCommand::ModifiedEvent,
this, &vtk3DWidgetRepresentation::OnViewModified);
this->UpdateEnabled();
this->UpdateTransform();
return true;
}
return false;
}
//-----------------------------------------------------------------------------
void vtk3DWidgetRepresentation::SetEnabled(bool enable)
{
if (this->Enabled != enable)
{
this->Enabled = enable;
this->UpdateEnabled();
}
}
//-----------------------------------------------------------------------------
void vtk3DWidgetRepresentation::UpdateEnabled()
{
if (this->Widget == NULL)
{
return;
}
bool enable_widget = (this->View != NULL)? this->Enabled : false;
// BUG #14913: Don't enable widget when the representation is missing or not
// visible.
if (this->Representation == NULL ||
this->Representation->GetVisibility() == 0)
{
enable_widget = false;
}
// Not all processes have the interactor setup. Enable 3D widgets only on
// those processes that have an interactor.
if (this->View == NULL || this->View->GetInteractor() == NULL)
{
enable_widget = false;
}
if (this->Widget->GetEnabled() != (enable_widget? 1 : 0))
{
// We do this here, instead of AddToView() since
// the View may not have the interactor setup when
// AddToView() is called (which happens when loading state files).
this->Widget->SetInteractor(this->View->GetInteractor());
this->Widget->SetEnabled(enable_widget? 1 : 0);
}
}
//----------------------------------------------------------------------------
void vtk3DWidgetRepresentation::OnRepresentationModified()
{
// This will be called everytime the representation is modified, but since the
// work done in this->UpdateEnabled() is minimal, we let it do it.
this->UpdateEnabled();
}
//----------------------------------------------------------------------------
void vtk3DWidgetRepresentation::OnViewModified()
{
if (this->View && this->Widget &&
this->View->GetInteractor() != this->Widget->GetInteractor())
{
this->UpdateEnabled();
}
}
//----------------------------------------------------------------------------
bool vtk3DWidgetRepresentation::RemoveFromView(vtkView* view)
{
vtkPVRenderView* pvview = vtkPVRenderView::SafeDownCast(view);
if (pvview)
{
this->View = NULL;
if (this->Widget)
{
this->Widget->SetEnabled(0);
this->Widget->SetDefaultRenderer(0);
this->Widget->SetCurrentRenderer(0);
this->Widget->SetInteractor(0);
}
if (this->Representation)
{
vtkRenderer* renderer = this->Representation->GetRenderer();
if (renderer)
{
renderer->RemoveActor(this->Representation);
// NOTE: this will modify the Representation and call
// this->OnRepresentationModified().
this->Representation->SetRenderer(0);
}
}
this->UpdateTransform();
return true;
}
return false;
}
//----------------------------------------------------------------------------
void vtk3DWidgetRepresentation::SetCustomWidgetTransform(vtkTransform *transform)
{
if (this->CustomTransform->GetInput () != transform)
{
this->CustomTransform->SetInput(transform);
if (!transform)
{
this->CustomTransform->Identity();
}
this->UpdateTransform();
}
}
//----------------------------------------------------------------------------
void vtk3DWidgetRepresentation::UpdateTransform()
{
if (vtkPVImplicitPlaneRepresentation *plane =
vtkPVImplicitPlaneRepresentation::SafeDownCast(this->Representation))
{
if (this->View)
{
plane->SetTransform(this->CustomTransform);
plane->UpdateTransformLocation();
}
else
{
plane->ClearTransform();
}
}
}
//----------------------------------------------------------------------------
void vtk3DWidgetRepresentation::PrintSelf(ostream& os, vtkIndent indent)
{
this->Superclass::PrintSelf(os, indent);
os << indent << "UseNonCompositedRenderer: " << this->UseNonCompositedRenderer
<< endl;
os << indent << "Widget: " << this->Widget << endl;
os << indent << "Representation: " << this->Representation << endl;
os << indent << "Enabled: " << this->Enabled << endl;
os << indent << "CustomTransform: ";
this->CustomTransform->Print(os);
}