/*========================================================================= 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 "vtkAppendPolyData.h" #include "vtkBoxRepresentation.h" #include "vtkBoxWidget2.h" #include "vtkCamera.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 "vtkSmartPointer.h" #include "vtkSphereSource.h" #include "vtkTransform.h" #include "vtkTransformFilter.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; }