diff --git a/Core/Code/TestingHelper/mitkInteractionTestHelper.cpp b/Core/Code/TestingHelper/mitkInteractionTestHelper.cpp index e47367bca6..5aaa9e4414 100644 --- a/Core/Code/TestingHelper/mitkInteractionTestHelper.cpp +++ b/Core/Code/TestingHelper/mitkInteractionTestHelper.cpp @@ -1,83 +1,145 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ //MITK #include #include #include #include +//us +#include + mitk::InteractionTestHelper::InteractionTestHelper() { this->Initialize(); } void mitk::InteractionTestHelper::Initialize() { // Global interaction must(!) be initialized - mitk::GlobalInteraction::GetInstance()->Initialize("global"); + if(! mitk::GlobalInteraction::GetInstance()->IsInitialized()) + mitk::GlobalInteraction::GetInstance()->Initialize("global"); + + mitk::RenderingManager* rm = mitk::RenderingManager::GetInstance(); + + //########### setup axial renderwindow ################## + //create renderWindow, renderer and dispatcher + m_RenderWindowAxial = mitk::RenderWindow::New(NULL, "stdmulti.widget1", rm); //VtkRenderWindow is created within constructor if NULL + //create data storage + m_DataStorage = mitk::StandaloneDataStorage::New(); + //set storage of renderer + m_RenderWindowAxial->GetRenderer()->SetDataStorage(m_DataStorage); + + //set view direction to axial + m_RenderWindowAxial->GetSliceNavigationController()->SetDefaultViewDirection( mitk::SliceNavigationController::Axial ); + + //set renderer to render 2D + m_RenderWindowAxial->GetRenderer()->SetMapperID(mitk::BaseRenderer::Standard2D); + + //########### setup sagittal renderwindow ################## + //create renderWindow, renderer and dispatcher + m_RenderWindowSagittal = mitk::RenderWindow::New(NULL, "stdmulti.widget2", rm); //VtkRenderWindow is created within constructor if NULL + //create data storage + m_DataStorage = mitk::StandaloneDataStorage::New(); + //set storage of renderer + m_RenderWindowSagittal->GetRenderer()->SetDataStorage(m_DataStorage); + + //set view direction to axial + m_RenderWindowSagittal->GetSliceNavigationController()->SetDefaultViewDirection( mitk::SliceNavigationController::Sagittal ); + + //set renderer to render 2D + m_RenderWindowSagittal->GetRenderer()->SetMapperID(mitk::BaseRenderer::Standard2D); + //########### setup frontal renderwindow ################## //create renderWindow, renderer and dispatcher - m_RenderWindow = mitk::RenderWindow::New(); + m_RenderWindowFrontal = mitk::RenderWindow::New(NULL, "stdmulti.widget3", rm); //VtkRenderWindow is created within constructor if NULL //create data storage m_DataStorage = mitk::StandaloneDataStorage::New(); //set storage of renderer - m_RenderWindow->GetRenderer()->SetDataStorage(m_DataStorage); + m_RenderWindowFrontal->GetRenderer()->SetDataStorage(m_DataStorage); + + //set view direction to axial + m_RenderWindowFrontal->GetSliceNavigationController()->SetDefaultViewDirection( mitk::SliceNavigationController::Frontal ); + + //set renderer to render 2D + m_RenderWindowFrontal->GetRenderer()->SetMapperID(mitk::BaseRenderer::Standard2D); + + //########### register display interactor to handle scroll events ################## + //use MouseModeSwitcher to ensure that the statemachine of DisplayInteractor is loaded correctly + m_MouseModeSwitcher = mitk::MouseModeSwitcher::New(); + + + //########### connect SliceNavigationControllers to timestep changed event of TimeNavigationController ############# + m_RenderWindowAxial->GetSliceNavigationController()->ConnectGeometryTimeEvent(mitk::RenderingManager::GetInstance()->GetTimeNavigationController(), false); + m_RenderWindowSagittal->GetSliceNavigationController()->ConnectGeometryTimeEvent(mitk::RenderingManager::GetInstance()->GetTimeNavigationController(), false); + m_RenderWindowFrontal->GetSliceNavigationController()->ConnectGeometryTimeEvent(mitk::RenderingManager::GetInstance()->GetTimeNavigationController(), false); } mitk::InteractionTestHelper::~InteractionTestHelper() { + mitk::BaseRenderer::RemoveInstance(m_RenderWindowAxial->GetVtkRenderWindow()); + mitk::BaseRenderer::RemoveInstance(m_RenderWindowSagittal->GetVtkRenderWindow()); + mitk::BaseRenderer::RemoveInstance(m_RenderWindowFrontal->GetVtkRenderWindow()); } mitk::DataStorage::Pointer mitk::InteractionTestHelper::GetDataStorage() { return m_DataStorage; } -mitk::BaseRenderer* mitk::InteractionTestHelper::GetRenderer() -{ - return m_Renderer; -} + void mitk::InteractionTestHelper::AddNodeToStorage(mitk::DataNode::Pointer node) { this->m_DataStorage->Add(node); - mitk::RenderingManager::GetInstance()->InitializeViews( m_DataStorage->ComputeBoundingGeometry3D(m_DataStorage->GetAll()) ); + mitk::RenderingManager::GetInstance()->InitializeViewsByBoundingObjects(m_DataStorage); } void mitk::InteractionTestHelper::PlaybackInteraction() { for (unsigned long i=0; i < m_Events.size(); ++i) { m_Events.at(i)->GetSender()->GetDispatcher()->ProcessEvent(m_Events.at(i)); } } void mitk::InteractionTestHelper::LoadInteraction(std::string interactionXmlPath) { //load interaction pattern std::ifstream xmlStream(interactionXmlPath.c_str()); mitk::XML2EventParser parser(xmlStream); m_Events = parser.GetInteractions(); xmlStream.close(); } + + +void mitk::InteractionTestHelper::SetTimeStep(int newTimeStep) +{ + bool timeStepIsvalid = mitk::RenderingManager::GetInstance()->GetTimeNavigationController()->GetCreatedWorldGeometry()->IsValidTimeStep(newTimeStep); + + if(timeStepIsvalid) + { + mitk::RenderingManager::GetInstance()->GetTimeNavigationController()->GetTime()->SetPos(newTimeStep); + } +} diff --git a/Core/Code/TestingHelper/mitkInteractionTestHelper.h b/Core/Code/TestingHelper/mitkInteractionTestHelper.h index 0b7cb0f143..1d968df929 100644 --- a/Core/Code/TestingHelper/mitkInteractionTestHelper.h +++ b/Core/Code/TestingHelper/mitkInteractionTestHelper.h @@ -1,103 +1,106 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef mitkInteractionTestHelper_h #define mitkInteractionTestHelper_h #include #include #include #include +#include #include class vtkRenderWindow; class vtkRenderer; namespace mitk { /** @brief Creates everything needed to load and playback interaction events. * * The interaction is loaded from an xml file and the event are created. This file is * usually a recorded user interaction with the GUI. This can be done with InteractionEventRecorder * plugin. Also all necessary objects to handle interaction events are generated. * The user of this class is responsible to add the data object to interact with to the data storage * of InteractionTestHelper. And must also make sure that a proper data interactor is associated with the data object. * * To test PointSet interaction for instance make sure you have a PointSet node and a PointSetDataInteractor. * Then just add the node to the storage of the your InteractionTestHelper by calling InteractionTestHelper::AddNodeToStorage. * Use InteractionTestHelper::PlaybackInteraction to execute. * * \sa XML2EventParser * \sa EventFactory * \sa EventRecorder */ class MITK_TESTINGHELPER_EXPORT InteractionTestHelper { public: - /** - **/ + InteractionTestHelper(); - /** Default destructor */ ~InteractionTestHelper(); - /** @brief Getter for the Renderer. - **/ - BaseRenderer* GetRenderer(); - /** @brief Returns the datastorage, in order to modify the data inside a rendering test. **/ mitk::DataStorage::Pointer GetDataStorage(); /** * @brief AddNodeToStorage Add a node to the datastorage and perform a reinit which is necessary for rendering. * @param node The data you want to add. */ void AddNodeToStorage(mitk::DataNode::Pointer node); /** - * @brief PlaybackInteraction plays loaded interaction by passing events to the dispatcher. + * @brief PlaybackInteraction playback loaded interaction by passing events to the dispatcher. */ void PlaybackInteraction(); /** * @brief LoadInteraction loads events from xml file. * @param interactionXmlPath path to xml file with interaction events. */ void LoadInteraction(std::string interactionXmlPath); + /** + * @brief SetTimeStep Sets timesteps of all SliceNavigationControllers to given timestep. + * @param newTimeStep new timestep + * + * Does the same as using ImageNavigators Time slider. Use this if your data was modified in a timestep other than 0. + */ + void SetTimeStep(int newTimeStep); + protected: /** * @brief Initialize Internal method to initialize the renderwindow and set the datastorage. - * @param width Height of renderwindow. - * @param height Width of renderwindow. - * @param interactionFilePath path to xml file containing interaction events. */ void Initialize(); mitk::XML2EventParser::EventContainerType m_Events; // List with loaded interaction events mitk::VtkPropRenderer::Pointer m_Renderer; - mitk::RenderWindow::Pointer m_RenderWindow; + mitk::RenderWindow::Pointer m_RenderWindowAxial; + mitk::RenderWindow::Pointer m_RenderWindowSagittal; + mitk::RenderWindow::Pointer m_RenderWindowFrontal; mitk::DataStorage::Pointer m_DataStorage; + mitk::MouseModeSwitcher::Pointer m_MouseModeSwitcher; }; }//namespace mitk #endif