add vtkHandlerWidget
This commit is contained in:
116
src/Vtk/testing/vtkHandlerWidget.cpp
Normal file
116
src/Vtk/testing/vtkHandlerWidget.cpp
Normal file
@@ -0,0 +1,116 @@
|
||||
/*//////////////////////////////////////////////////////////////////////////////
|
||||
// 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/vtkContainerBox.h"
|
||||
#include "Vtk/vtkHandlerWidget.h"
|
||||
#include "testing-prototype.h"
|
||||
|
||||
#include <vtkProp3D.h>
|
||||
#include <vtkPropAssembly.h>
|
||||
#include <vtkPropCollection.h>
|
||||
#include <vtkSmartPointer.h>
|
||||
#include <vtkCallbackCommand.h>
|
||||
#include <vtkRenderWindowInteractor.h>
|
||||
|
||||
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));
|
||||
|
||||
// 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);
|
||||
|
||||
// 3. Setup the Viewer
|
||||
Vtk::Viewer viewer;
|
||||
viewer.AddPuppet(v_box);
|
||||
|
||||
// 4. Create and setup the vtkHandlerWidget
|
||||
vtkSmartPointer<Vtk::vtkHandlerWidget> handler =
|
||||
vtkSmartPointer<Vtk::vtkHandlerWidget>::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<vtkCallbackCommand>::New();
|
||||
key_callback->SetCallback([](vtkObject *caller, unsigned long, void *clientData, void *) {
|
||||
auto interactor = static_cast<vtkRenderWindowInteractor *>(caller);
|
||||
auto h = static_cast<Vtk::vtkHandlerWidget *>(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;
|
||||
}
|
||||
|
||||
END_TESTING;
|
||||
}
|
||||
Reference in New Issue
Block a user