VTK/Examples/Cxx/Widgets/SphereWidgetEvents

From KitwarePublic

Jump to: navigation, search
VTK Examples Baseline Widgets TestSphereWidgetEvents.png

This example shows how to subclass a widget so that events can be further customized.

SphereWidgetEvents.cxx

#include <vtkCallbackCommand.h>
#include <vtkCommand.h>
#include <vtkObjectFactory.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkSmartPointer.h>
#include <vtkSphereWidget.h>
#include <vtkSphereRepresentation.h>
 
class MySphereWidget : public vtkSphereWidget
{
 public:
  static MySphereWidget* New();
  vtkTypeMacro(MySphereWidget, vtkSphereWidget);
 
  // Handles the events
  static void ProcessEvents(vtkObject* object,
                            unsigned long event,
                            void* clientdata,
                            void* calldata);
 
  virtual void OnLeftButtonUp()
  {
    std::cout << "Left button up!" << std::endl;
    this->Superclass::OnLeftButtonUp();
  }
 
protected:
  MySphereWidget();
};
 
MySphereWidget::MySphereWidget()
{
  this->EventCallbackCommand->SetCallback( MySphereWidget::ProcessEvents );
}
 
void MySphereWidget::ProcessEvents( vtkObject* vtkNotUsed(object),
                                    unsigned long event,
                                    void* clientdata,
                                    void* vtkNotUsed(calldata) )
{
  MySphereWidget* self = reinterpret_cast<MySphereWidget *>( clientdata );
 
  switch(event)
    {
    case vtkCommand::LeftButtonPressEvent:
      self->OnLeftButtonDown();
      break;
    case vtkCommand::LeftButtonReleaseEvent:
      self->OnLeftButtonUp();
      break;
    case vtkCommand::RightButtonPressEvent:
      self->OnRightButtonDown();
      break;
    case vtkCommand::RightButtonReleaseEvent:
      self->OnRightButtonUp();
      break;
    case vtkCommand::MouseMoveEvent:
      self->OnMouseMove();
      break;
    }
}
vtkStandardNewMacro(MySphereWidget);
 
int main(int, char *[])
{
  // Create  a renderer and render window
  vtkSmartPointer<vtkRenderer> renderer = 
    vtkSmartPointer<vtkRenderer>::New();
  vtkSmartPointer<vtkRenderWindow> renderWindow = 
    vtkSmartPointer<vtkRenderWindow>::New();
  renderWindow->AddRenderer(renderer);
 
  // Create an interactor
  vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = 
    vtkSmartPointer<vtkRenderWindowInteractor>::New();
  renderWindowInteractor->SetRenderWindow(renderWindow);
 
  vtkSmartPointer<MySphereWidget> sphereWidget = 
    vtkSmartPointer<MySphereWidget>::New();
  sphereWidget->SetInteractor(renderWindowInteractor);
  sphereWidget->SetRepresentationToSurface();
  sphereWidget->HandleVisibilityOn();
 
  renderWindow->Render();
  renderWindowInteractor->Initialize();
  renderWindow->Render();
  sphereWidget->On();
  renderWindowInteractor->Start();
 
  return EXIT_SUCCESS;
}

CMakeLists.txt

cmake_minimum_required(VERSION 2.6)
 
PROJECT(SphereWidgetEvents)
 
FIND_PACKAGE(VTK REQUIRED)
INCLUDE(${VTK_USE_FILE})
 
ADD_EXECUTABLE(SphereWidgetEvents SphereWidgetEvents.cxx)
TARGET_LINK_LIBRARIES(SphereWidgetEvents vtkHybrid vtkWidgets)

Color.

Personal tools