/*////////////////////////////////////////////////////////////////////////////// // CMT Cosmic Muon Tomography project ////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// Copyright (c) 2014, Universita' degli Studi di Padova, INFN sez. di Padova All rights reserved Authors: Andrea Rigoni Garola < andrea.rigoni@pd.infn.it > ------------------------------------------------------------------ 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 3.0 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 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library. //////////////////////////////////////////////////////////////////////////////*/ #include "Math/ContainerBox.h" #include "Vtk/uLibVtkViewer.h" #include "Vtk/Math/vtkContainerBox.h" #include "Vtk/vtkHandlerWidget.h" #include "testing-prototype.h" #include #include #include #include #include #include using namespace uLib; int main() { BEGIN_TESTING(vtkHandlerWidget with ContainerBox); // 1. Create a ContainerBox (Math object) ContainerBox box; box.Scale(Vector3f(2.0, 3.0, 4.0)); box.SetPosition(Vector3f(1.0, 1.0, 1.0)); // 3. Setup the Viewer Vtk::Viewer viewer; // 2. Wrap it in a Vtk::vtkContainerBox (Vtk Puppet) Vtk::vtkContainerBox v_box(&box); v_box.SetRepresentation(Vtk::Puppet::Surface); v_box.SetOpacity(0.5); viewer.AddPuppet(v_box); // 4. Create and setup the vtkHandlerWidget vtkSmartPointer handler = vtkSmartPointer::New(); handler->SetInteractor(viewer.GetInteractor()); // Get the prop from the puppet and cast it to vtkProp3D vtkProp *v_prop = v_box.GetProp(); vtkProp3D *prop = vtkProp3D::SafeDownCast(v_prop); if (!prop) { // If it's a PropAssembly, try to get the first part (the cube) ::vtkPropAssembly *assembly = ::vtkPropAssembly::SafeDownCast(v_prop); if (assembly && assembly->GetParts()->GetNumberOfItems() > 0) { assembly->GetParts()->InitTraversal(); prop = vtkProp3D::SafeDownCast(assembly->GetParts()->GetNextProp()); } } TEST1(prop != nullptr); handler->SetProp3D(prop); handler->PlaceWidget(); handler->EnabledOn(); // 5. Add a key callback to switch modes auto key_callback = vtkSmartPointer::New(); key_callback->SetCallback([](vtkObject *caller, unsigned long, void *clientData, void *) { auto interactor = static_cast(caller); auto h = static_cast(clientData); std::string key = interactor->GetKeySym(); if (key == "g") { std::cout << "Switching to GLOBAL frame" << std::endl; h->SetReferenceFrame(Vtk::vtkHandlerWidget::GLOBAL); } else if (key == "l") { std::cout << "Switching to LOCAL frame" << std::endl; h->SetReferenceFrame(Vtk::vtkHandlerWidget::LOCAL); } else if (key == "c") { std::cout << "Switching to CENTER frame" << std::endl; h->SetReferenceFrame(Vtk::vtkHandlerWidget::CENTER); } else if (key == "k") { std::cout << "Switching to CENTER_LOCAL frame" << std::endl; h->SetReferenceFrame(Vtk::vtkHandlerWidget::CENTER_LOCAL); } }); key_callback->SetClientData(handler.GetPointer()); viewer.GetInteractor()->AddObserver(vtkCommand::CharEvent, key_callback); // 6. Start interaction if not in a continuous integration environment if (std::getenv("CTEST_PROJECT_NAME") == nullptr) { std::cout << "Interactive test: use the gizmos to transform the ContainerBox" << std::endl; std::cout << "Keys: [g] GLOBAL, [l] LOCAL, [c] CENTER, [k] CENTER_LOCAL" << std::endl; viewer.Start(); } else { std::cout << "Non-interactive test: widget initialized successfully" << std::endl; } handler->EnabledOff(); END_TESTING; }