/*========================================================================= Program: Visualization Toolkit Module: BoxWidget2.cxx Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen All rights reserved. See Copyright.txt or http://www.kitware.com/Copyright.htm 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 "vtkSmartPointer.h" #include "vtkAppendPolyData.h" #include "vtkBoxWidget2.h" #include "vtkBoxRepresentation.h" #include "vtkCommand.h" #include "vtkConeSource.h" #include "vtkGlyph3D.h" #include "vtkInteractorEventRecorder.h" #include "vtkPolyData.h" #include "vtkPolyDataMapper.h" #include "vtkRenderWindow.h" #include "vtkRenderWindowInteractor.h" #include "vtkRenderer.h" #include "vtkRenderer.h" #include "vtkSphereSource.h" #include "vtkTransformFilter.h" #include "vtkTransform.h" #include "vtkCamera.h" // Callback for the interaction class vtkSBWCallback2 : public vtkCommand { public: static vtkSBWCallback2 *New() { return new vtkSBWCallback2; } virtual void Execute(vtkObject *caller, unsigned long, void*) { vtkBoxWidget2 *boxWidget = reinterpret_cast(caller); vtkBoxRepresentation *boxRep = reinterpret_cast(boxWidget->GetRepresentation()); boxRep->GetTransform(this->Transform); vtkCamera *camera = boxRep->GetRenderer()->GetActiveCamera(); // this->Actor->SetUserTransform(this->Transform); } vtkSBWCallback2():Transform(0),Actor(0) {} vtkTransform *Transform; vtkActor *Actor; }; char ScaledBoxWidgetEventLog2[] = "# StreamVersion 1\n" "CharEvent 187 242 0 0 105 1 i\n" "KeyReleaseEvent 187 242 0 0 105 1 i\n" ; int ScaledBoxWidget2( int , char *[] ) { vtkSmartPointer renderer = vtkSmartPointer::New(); vtkSmartPointer renWin = vtkSmartPointer::New(); renWin->AddRenderer(renderer); vtkSmartPointer iren = vtkSmartPointer::New(); iren->SetRenderWindow(renWin); vtkSmartPointer cone = vtkSmartPointer::New(); cone->SetResolution(6); vtkSmartPointer sphere = vtkSmartPointer::New(); sphere->SetThetaResolution(8); sphere->SetPhiResolution(8); vtkSmartPointer glyph = vtkSmartPointer::New(); glyph->SetInputConnection(sphere->GetOutputPort()); glyph->SetSource(cone->GetOutput()); glyph->SetVectorModeToUseNormal(); glyph->SetScaleModeToScaleByVector(); glyph->SetScaleFactor(0.25); glyph->Update(); vtkSmartPointer append = vtkSmartPointer::New(); append->AddInput(glyph->GetOutput()); append->AddInput(sphere->GetOutput()); vtkSmartPointer dataTransform = vtkSmartPointer::New(); dataTransform->Identity(); dataTransform->Scale(1,2,1); vtkSmartPointer tf = vtkSmartPointer::New(); tf->SetTransform(dataTransform); tf->SetInputConnection(append->GetOutputPort()); tf->Update(); vtkSmartPointer maceMapper = vtkSmartPointer::New(); maceMapper->SetInputConnection(tf->GetOutputPort()); vtkSmartPointer maceActor = vtkSmartPointer::New(); maceActor->SetMapper(maceMapper); // Configure the box widget including callbacks vtkSmartPointer t = vtkSmartPointer::New(); vtkSmartPointer myCallback = vtkSmartPointer::New(); myCallback->Transform = t; myCallback->Actor = maceActor; vtkSmartPointer boxRep = vtkSmartPointer::New(); boxRep->SetPlaceFactor( 1.25 ); boxRep->PlaceWidget(tf->GetOutput()->GetBounds()); vtkSmartPointer boxWidget = vtkSmartPointer::New(); boxWidget->SetInteractor( iren ); boxWidget->SetRepresentation( boxRep ); boxWidget->AddObserver(vtkCommand::InteractionEvent,myCallback); boxWidget->SetPriority(1); renderer->AddActor(maceActor); renderer->SetBackground(0,0,0); renWin->SetSize(1024,768); // Introduce scale to test out calculation of clipping range // by vtkRenderer. vtkSmartPointer scaleTransform = vtkSmartPointer::New(); scaleTransform->SetInput(dataTransform); vtkCamera *camera = renderer->GetActiveCamera(); camera->SetModelTransformMatrix(scaleTransform->GetMatrix()); // record events vtkSmartPointer recorder = vtkSmartPointer::New(); recorder->SetInteractor(iren); recorder->ReadFromInputStringOn(); recorder->SetInputString(ScaledBoxWidgetEventLog2); // interact with data // render the image // iren->Initialize(); renWin->Render(); recorder->Play(); // Remove the observers so we can go interactive. Without this the "-I" // testing option fails. recorder->Off(); boxRep->SetPlaceFactor( 1.0 ); boxRep->HandlesOff(); boxRep->SetPlaceFactor( 1.25 ); boxRep->HandlesOn(); renderer->ResetCamera(); iren->Start(); return EXIT_SUCCESS; }