diff --git a/Modules/QmitkExt/QmitkSliceWidget.cpp b/Modules/QmitkExt/QmitkSliceWidget.cpp index 844ee939ec..f49fcac431 100644 --- a/Modules/QmitkExt/QmitkSliceWidget.cpp +++ b/Modules/QmitkExt/QmitkSliceWidget.cpp @@ -1,345 +1,376 @@ /*========================================================================= - -Program: Medical Imaging & Interaction Toolkit -Language: C++ -Date: $Date$ -Version: $Revision$ - -Copyright (c) German Cancer Research Center, Division of Medical and -Biological Informatics. All rights reserved. -See MITKCopyright.txt or http://www.mitk.org/copyright.html 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 notices for more information. - -=========================================================================*/ -#include "QmitkSliceWidget.h" + Program: Medical Imaging & Interaction Toolkit + Language: C++ + Date: $Date$ + Version: $Revision$ + + Copyright (c) German Cancer Research Center, Division of Medical and + Biological Informatics. All rights reserved. + See MITKCopyright.txt or http://www.mitk.org/copyright.html 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 notices for more information. + + =========================================================================*/ +#include "QmitkSliceWidget.h" #include "QmitkStepperAdapter.h" +#include "mitkNodePredicateDataType.h" //#include "QmitkRenderWindow.h" // //#include "mitkSliceNavigationController.h" //#include "QmitkLevelWindowWidget.h" // //#include //#include "mitkRenderingManager.h" #include #include -QmitkSliceWidget::QmitkSliceWidget(QWidget* parent, const char* name, Qt::WindowFlags f) - : QWidget(parent, f) +QmitkSliceWidget::QmitkSliceWidget(QWidget* parent, const char* name, + Qt::WindowFlags f) : + QWidget(parent, f) { - this->setupUi(this); - - if (name != 0) - this->setObjectName(name); - - popUp = new QMenu(this); - popUp->addAction("Transversal"); - popUp->addAction("Frontal"); - popUp->addAction("Sagittal"); - - QObject::connect(popUp, SIGNAL(triggered(QAction*)), this, SLOT(ChangeView(QAction*)) ); - setPopUpEnabled(false); - - m_DataTreeIterator = 0; - m_SlicedGeometry = 0; - m_View = mitk::SliceNavigationController::Transversal; - - QHBoxLayout *hlayout = new QHBoxLayout(container); - hlayout->setMargin(0); - - // create widget - QString composedName("QmitkSliceWidget::"); - if(!this->objectName().isEmpty()) - composedName+=this->objectName(); - else - composedName+="QmitkGLWidget"; - m_RenderWindow = new QmitkRenderWindow(container, composedName); - m_Renderer = m_RenderWindow->GetRenderer(); - hlayout->addWidget(m_RenderWindow); - - new QmitkStepperAdapter( m_NavigatorWidget, - m_RenderWindow->GetSliceNavigationController()->GetSlice(), "navigation" - ); - - SetLevelWindowEnabled(true); -} + this->setupUi(this); + + if (name != 0) + this->setObjectName(name); + + popUp = new QMenu(this); + popUp->addAction("Transversal"); + popUp->addAction("Frontal"); + popUp->addAction("Sagittal"); + QObject::connect(popUp, SIGNAL(triggered(QAction*)), this, SLOT(ChangeView(QAction*)) ); + setPopUpEnabled(false); + + m_SlicedGeometry = 0; + m_View = mitk::SliceNavigationController::Transversal; + + QHBoxLayout *hlayout = new QHBoxLayout(container); + hlayout->setMargin(0); + + // create widget + QString composedName("QmitkSliceWidget::"); + if (!this->objectName().isEmpty()) + composedName += this->objectName(); + else + composedName += "QmitkGLWidget"; + m_RenderWindow = new QmitkRenderWindow(container, composedName); + m_Renderer = m_RenderWindow->GetRenderer(); + hlayout->addWidget(m_RenderWindow); + + new QmitkStepperAdapter(m_NavigatorWidget, + m_RenderWindow->GetSliceNavigationController()->GetSlice(), + "navigation"); + + SetLevelWindowEnabled(true); + +} mitk::VtkPropRenderer* QmitkSliceWidget::GetRenderer() { - return m_Renderer; + return m_Renderer; } - QFrame* QmitkSliceWidget::GetSelectionFrame() { - return SelectionFrame; + return SelectionFrame; } - -void QmitkSliceWidget::SetData( mitk::DataTreeIteratorBase * it ) +void QmitkSliceWidget::SetDataStorage(mitk::StandaloneDataStorage::Pointer storage) { - SetData(it, m_View); + m_DataStorage = storage; + m_Renderer->SetDataStorage(m_DataStorage); } -void QmitkSliceWidget::SetData( mitk::DataTreeNode::Pointer node ) +mitk::StandaloneDataStorage* QmitkSliceWidget::GetDataStorage() { - if ( m_DataTree.IsNotNull() ) - { - m_DataTree = NULL; - } - m_DataTree = mitk::DataTree::New(); - mitk::DataTreePreOrderIterator it(m_DataTree); - it.Add(node); - SetData(&it, m_View); + if (m_DataStorage.IsNotNull()) + { + return m_DataStorage; + } + else + { + return NULL; + } } -void QmitkSliceWidget::AddData( mitk::DataTreeNode::Pointer node) +void QmitkSliceWidget::SetData(mitk::DataStorage::SetOfObjects::ConstIterator it) { - if ( m_DataTree.IsNull() ) - { - m_DataTree = mitk::DataTree::New(); - } - mitk::DataTreePreOrderIterator it(m_DataTree); - it.Add( node ); - SetData(&it, m_View); + SetData(it->Value(), m_View); } - -void QmitkSliceWidget::SetData( mitk::DataTreeIteratorBase* it, mitk::SliceNavigationController::ViewDirection view ) +void QmitkSliceWidget::SetData(mitk::DataStorage::SetOfObjects::ConstIterator it, mitk::SliceNavigationController::ViewDirection view) { - m_DataTreeIterator = it; - mitk::DataTreeIteratorClone tmpIterator=m_DataTreeIterator.GetPointer(); - levelWindow->setDataTree(dynamic_cast(tmpIterator->GetTree())); - while ( !tmpIterator->IsAtEnd() ) - { - mitk::Image::Pointer image = - dynamic_cast(tmpIterator->Get()->GetData()); - - if ( image.IsNotNull() && tmpIterator->Get()->IsVisible(GetRenderer()) ) - { - m_SlicedGeometry = image->GetSlicedGeometry(); - - mitk::LevelWindow picLevelWindow; - tmpIterator->Get()->GetLevelWindow(picLevelWindow,NULL); - - GetRenderer()->SetData(tmpIterator.GetPointer()); - break; - } - - ++tmpIterator; - } - InitWidget(view); + SetData(it->Value(), view); } -void QmitkSliceWidget::InitWidget( mitk::SliceNavigationController::ViewDirection viewDirection ) +void QmitkSliceWidget::SetData(mitk::DataTreeNode::Pointer node) { - m_View = viewDirection; - - mitk::SliceNavigationController* controller = - m_RenderWindow->GetSliceNavigationController(); - - if (viewDirection == mitk::SliceNavigationController::Transversal) - { - controller->SetViewDirection(mitk::SliceNavigationController::Transversal); - } - else if (viewDirection == mitk::SliceNavigationController::Frontal) - { - controller->SetViewDirection(mitk::SliceNavigationController::Frontal); - } - // init sagittal view - else - { - controller->SetViewDirection(mitk::SliceNavigationController::Sagittal); - } - - int currentPos = 0; - if ( m_RenderWindow->GetSliceNavigationController() ) - { - currentPos = controller->GetSlice()->GetPos(); - } - - if (m_DataTreeIterator.IsNull() || m_SlicedGeometry.IsNull() ) - { - return; - } - - // compute bounding box with respect to first images geometry - const mitk::BoundingBox::BoundsArrayType imageBounds = - m_SlicedGeometry->GetBoundingBox()->GetBounds(); - -// mitk::SlicedGeometry3D::Pointer correctGeometry = m_SlicedGeometry.GetPointer(); - mitk::Geometry3D::Pointer geometry = static_cast(m_SlicedGeometry->Clone().GetPointer()); - - const mitk::BoundingBox::Pointer boundingbox = mitk::DataTree::ComputeVisibleBoundingBox(m_DataTreeIterator.GetPointer(), NULL, "includeInBoundingBox"); - if(boundingbox->GetPoints()->Size()>0) - { - ////geometry = mitk::Geometry3D::New(); - ////geometry->Initialize(); - //geometry->SetBounds(boundingbox->GetBounds()); - //geometry->SetSpacing(correctGeometry->GetSpacing()); - - //let's see if we have data with a limited live-span ... - mitk::TimeBounds timebounds = mitk::DataTree::ComputeTimeBounds( - m_DataTreeIterator.GetPointer(), NULL, "includeInBoundingBox" - ); - - if (timebounds[1]InitializeEvenlyTimed( - geometry.GetPointer(), (unsigned int) duration - ); - - timegeometry->SetTimeBounds(timebounds); //@bug really required? FIXME - - timebounds[1] = timebounds[0]+1.0f; - geometry->SetTimeBounds(timebounds); - - geometry=timegeometry; - } - - if(const_cast(geometry->GetBoundingBox())->GetDiagonalLength2()>=mitk::eps) - { - controller->SetInputWorldGeometry(geometry); - controller->Update(); - } - } - - GetRenderer()->GetDisplayGeometry()->Fit(); - mitk::RenderingManager::GetInstance()->RequestUpdate(GetRenderer()->GetRenderWindow()); - //int w=vtkObject::GetGlobalWarningDisplay(); - //vtkObject::GlobalWarningDisplayOff(); - //vtkRenderer * vtkrenderer = ((mitk::OpenGLRenderer*)(GetRenderer()))->GetVtkRenderer(); - //if(vtkrenderer!=NULL) vtkrenderer->ResetCamera(); - //vtkObject::SetGlobalWarningDisplay(w); + try + { + if (m_DataStorage.IsNotNull()) + { + m_DataStorage->Add(node); + } + } catch (...) + { + } + SetData(node, m_View); } +//void QmitkSliceWidget::AddData( mitk::DataTreeNode::Pointer node) +//{ +// if ( m_DataTree.IsNull() ) +// { +// m_DataTree = mitk::DataTree::New(); +// } +// mitk::DataTreePreOrderIterator it(m_DataTree); +// it.Add( node ); +// SetData(&it, m_View); +//} -void QmitkSliceWidget::UpdateGL() + +void QmitkSliceWidget::SetData(mitk::DataTreeNode::Pointer treeNode, + mitk::SliceNavigationController::ViewDirection view) { - GetRenderer()->GetDisplayGeometry()->Fit(); - mitk::RenderingManager::GetInstance()->RequestUpdate(GetRenderer()->GetRenderWindow()); + try + { + if (m_DataStorage.IsNotNull()) + { + levelWindow->SetDataStorage(m_DataStorage); + mitk::DataStorage::SetOfObjects::ConstPointer rs = + m_DataStorage->GetSubset(mitk::NodePredicateDataType::New( + "Image")); + mitk::DataStorage::SetOfObjects::ConstIterator it; + bool noVisibleImage = true; + std::cout << "1" << std::endl; +// std::cout << rs->Begin()->Value() << std::endl; +// std::cout << rs->End()->Value() << std::endl; + for (it = rs->Begin(); it != rs->End(); ++it) + { + std::cout << "2" << std::endl; + + mitk::DataTreeNode::Pointer node = it.Value(); + node->SetName("currentImage"); + mitk::Image::Pointer image = m_DataStorage->GetNamedObject< + mitk::Image> ("currentImage"); + + if (image.IsNotNull() && node->IsVisible(GetRenderer())) + { + std::cout << "3" << std::endl; + + m_SlicedGeometry = image->GetSlicedGeometry(); + mitk::LevelWindow picLevelWindow; + node->GetLevelWindow(picLevelWindow, NULL); + noVisibleImage = false; + break; + } + } + + std::cout << "4" << std::endl; + + if (noVisibleImage) + LOG_INFO << " No image visible!"; + + GetRenderer()->SetDataStorage(m_DataStorage); + } + InitWidget(view); + } catch (...) + { + } } -void QmitkSliceWidget::mousePressEvent( QMouseEvent * e ) +void QmitkSliceWidget::InitWidget( + mitk::SliceNavigationController::ViewDirection viewDirection) { - if (e->button() == Qt::RightButton && popUpEnabled) - { - popUp->popup(QCursor::pos()); - } + m_View = viewDirection; + + mitk::SliceNavigationController* controller = + m_RenderWindow->GetSliceNavigationController(); + + if (viewDirection == mitk::SliceNavigationController::Transversal) + { + controller->SetViewDirection( + mitk::SliceNavigationController::Transversal); + } + else if (viewDirection == mitk::SliceNavigationController::Frontal) + { + controller->SetViewDirection(mitk::SliceNavigationController::Frontal); + } + // init sagittal view + else + { + controller->SetViewDirection(mitk::SliceNavigationController::Sagittal); + } + + int currentPos = 0; + if (m_RenderWindow->GetSliceNavigationController()) + { + currentPos = controller->GetSlice()->GetPos(); + } + + if (m_SlicedGeometry.IsNull()) + { + return; + } + + // compute bounding box with respect to first images geometry + const mitk::BoundingBox::BoundsArrayType imageBounds = + m_SlicedGeometry->GetBoundingBox()->GetBounds(); + + // mitk::SlicedGeometry3D::Pointer correctGeometry = m_SlicedGeometry.GetPointer(); + mitk::Geometry3D::Pointer + geometry = + static_cast (m_SlicedGeometry->Clone().GetPointer()); + + const mitk::BoundingBox::Pointer boundingbox = + m_DataStorage->ComputeVisibleBoundingBox(GetRenderer(), NULL); + if (boundingbox->GetPoints()->Size() > 0) + { + ////geometry = mitk::Geometry3D::New(); + ////geometry->Initialize(); + //geometry->SetBounds(boundingbox->GetBounds()); + //geometry->SetSpacing(correctGeometry->GetSpacing()); + + //let's see if we have data with a limited live-span ... + mitk::TimeBounds timebounds = m_DataStorage->ComputeTimeBounds( + GetRenderer(), NULL); + + if (timebounds[1] < mitk::ScalarTypeNumericTraits::max()) + { + mitk::ScalarType duration = timebounds[1] - timebounds[0]; + + mitk::TimeSlicedGeometry::Pointer timegeometry = + mitk::TimeSlicedGeometry::New(); + + timegeometry->InitializeEvenlyTimed(geometry.GetPointer(), + (unsigned int) duration); + + timegeometry->SetTimeBounds(timebounds); //@bug really required? FIXME + + timebounds[1] = timebounds[0] + 1.0f; + geometry->SetTimeBounds(timebounds); + + geometry = timegeometry; + } + + if (const_cast (geometry->GetBoundingBox())->GetDiagonalLength2() + >= mitk::eps) + { + controller->SetInputWorldGeometry(geometry); + controller->Update(); + } + } + + GetRenderer()->GetDisplayGeometry()->Fit(); + mitk::RenderingManager::GetInstance()->RequestUpdate( + GetRenderer()->GetRenderWindow()); + //int w=vtkObject::GetGlobalWarningDisplay(); + //vtkObject::GlobalWarningDisplayOff(); + //vtkRenderer * vtkrenderer = ((mitk::OpenGLRenderer*)(GetRenderer()))->GetVtkRenderer(); + //if(vtkrenderer!=NULL) vtkrenderer->ResetCamera(); + //vtkObject::SetGlobalWarningDisplay(w); } -void QmitkSliceWidget::wheelEvent( QWheelEvent * e ) +void QmitkSliceWidget::UpdateGL() { - int val = m_NavigatorWidget->GetPos(); - - if (e->orientation() * e->delta() > 0) - { - m_NavigatorWidget->SetPos( val+1 ); - } - else - { - if (val > 0) - m_NavigatorWidget->SetPos( val-1 ); - } + GetRenderer()->GetDisplayGeometry()->Fit(); + mitk::RenderingManager::GetInstance()->RequestUpdate( + GetRenderer()->GetRenderWindow()); } -void QmitkSliceWidget::ChangeView(QAction* val) +void QmitkSliceWidget::mousePressEvent(QMouseEvent * e) { - if (val->text() == "Transversal") - { - InitWidget(mitk::SliceNavigationController::Transversal); - } - else if (val->text() == "Frontal") - { - InitWidget(mitk::SliceNavigationController::Frontal); - } - else if (val->text() == "Sagittal") - { - InitWidget(mitk::SliceNavigationController::Sagittal); - } + if (e->button() == Qt::RightButton && popUpEnabled) + { + popUp->popup(QCursor::pos()); + } } - -void QmitkSliceWidget::setPopUpEnabled( bool b ) +void QmitkSliceWidget::wheelEvent(QWheelEvent * e) { - popUpEnabled = b; + int val = m_NavigatorWidget->GetPos(); + + if (e->orientation() * e->delta() > 0) + { + m_NavigatorWidget->SetPos(val + 1); + } + else + { + if (val > 0) + m_NavigatorWidget->SetPos(val - 1); + } } -mitk::DataTreeIteratorBase* QmitkSliceWidget::GetDataTreeIterator() +void QmitkSliceWidget::ChangeView(QAction* val) { - return m_DataTreeIterator.GetPointer(); + if (val->text() == "Transversal") + { + InitWidget(mitk::SliceNavigationController::Transversal); + } + else if (val->text() == "Frontal") + { + InitWidget(mitk::SliceNavigationController::Frontal); + } + else if (val->text() == "Sagittal") + { + InitWidget(mitk::SliceNavigationController::Sagittal); + } } -mitk::DataTree::Pointer QmitkSliceWidget::GetDataTree() +void QmitkSliceWidget::setPopUpEnabled(bool b) { - return m_DataTree; + popUpEnabled = b; } - QmitkSliderNavigatorWidget* QmitkSliceWidget::GetNavigatorWidget() { - return m_NavigatorWidget; + return m_NavigatorWidget; } - - -void QmitkSliceWidget::SetLevelWindowEnabled( bool enable ) +void QmitkSliceWidget::SetLevelWindowEnabled(bool enable) { - levelWindow->setEnabled(enable); - if (!enable) - { - levelWindow->setMinimumWidth(0); - levelWindow->setMaximumWidth(0); - } - else - { - levelWindow->setMinimumWidth(28); - levelWindow->setMaximumWidth(28); - } + levelWindow->setEnabled(enable); + if (!enable) + { + levelWindow->setMinimumWidth(0); + levelWindow->setMaximumWidth(0); + } + else + { + levelWindow->setMinimumWidth(28); + levelWindow->setMaximumWidth(28); + } } - bool QmitkSliceWidget::IsLevelWindowEnabled() { - return levelWindow->isEnabled(); + return levelWindow->isEnabled(); } - QmitkRenderWindow* QmitkSliceWidget::GetRenderWindow() { - return m_RenderWindow; + return m_RenderWindow; } mitk::SliceNavigationController* -QmitkSliceWidget -::GetSliceNavigationController() const +QmitkSliceWidget::GetSliceNavigationController() const { - return m_RenderWindow->GetSliceNavigationController(); + return m_RenderWindow->GetSliceNavigationController(); } - mitk::CameraRotationController* -QmitkSliceWidget -::GetCameraRotationController() const +QmitkSliceWidget::GetCameraRotationController() const { - return m_RenderWindow->GetCameraRotationController(); + return m_RenderWindow->GetCameraRotationController(); } - mitk::BaseController* -QmitkSliceWidget -::GetController() const +QmitkSliceWidget::GetController() const { - return m_RenderWindow->GetController(); + return m_RenderWindow->GetController(); } diff --git a/Modules/QmitkExt/QmitkSliceWidget.h b/Modules/QmitkExt/QmitkSliceWidget.h index af759f6032..49d0f583b0 100644 --- a/Modules/QmitkExt/QmitkSliceWidget.h +++ b/Modules/QmitkExt/QmitkSliceWidget.h @@ -1,100 +1,104 @@ /*========================================================================= - + Program: Medical Imaging & Interaction Toolkit Language: C++ Date: $Date$ Version: $Revision$ - + Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. See MITKCopyright.txt or http://www.mitk.org/copyright.html 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 notices for more information. - + =========================================================================*/ #ifndef QMITKSLICEWIDGET_H_ #define QMITKSLICEWIDGET_H_ #include "ui_QmitkSliceWidget.h" #include "QmitkRenderWindow.h" #include "mitkSliceNavigationController.h" +#include "mitkDataStorage.h" +#include "mitkStandaloneDataStorage.h" #include class QMITKEXT_EXPORT QmitkSliceWidget : public QWidget, public Ui::QmitkSliceWidgetUi { Q_OBJECT - + public: - + QmitkSliceWidget(QWidget* parent = 0, const char* name = 0, Qt::WindowFlags f = 0); mitk::VtkPropRenderer* GetRenderer(); QFrame* GetSelectionFrame(); - + void UpdateGL(); void mousePressEvent( QMouseEvent * e ); void setPopUpEnabled( bool b ); - mitk::DataTreeIteratorBase* GetDataTreeIterator(); + void SetDataStorage( mitk::StandaloneDataStorage::Pointer storage ); - mitk::DataTree::Pointer GetDataTree(); + mitk::StandaloneDataStorage* GetDataStorage(); QmitkSliderNavigatorWidget* GetNavigatorWidget(); bool IsLevelWindowEnabled(); QmitkRenderWindow* GetRenderWindow(); mitk::SliceNavigationController* GetSliceNavigationController() const; mitk::CameraRotationController* GetCameraRotationController() const; mitk::BaseController* GetController() const; - + public slots: - void SetData( mitk::DataTreeIteratorBase * it ); + void SetData(mitk::DataStorage::SetOfObjects::ConstIterator it); + + void SetData(mitk::DataStorage::SetOfObjects::ConstIterator it, mitk::SliceNavigationController::ViewDirection view); - void SetData( mitk::DataTreeNode::Pointer node ); + void SetData( mitk::DataTreeNode::Pointer node ); - void AddData( mitk::DataTreeNode::Pointer node); + // void AddData( mitk::DataTreeNode::Pointer node); - void SetData( mitk::DataTreeIteratorBase* it, mitk::SliceNavigationController::ViewDirection view ); + void SetData( mitk::DataTreeNode::Pointer node, mitk::SliceNavigationController::ViewDirection view ); void InitWidget( mitk::SliceNavigationController::ViewDirection viewDirection ); void wheelEvent( QWheelEvent * e ); void ChangeView(QAction* val); - + void SetLevelWindowEnabled( bool enable ); - - + + protected: - + QmitkRenderWindow* m_RenderWindow; mitk::SliceNavigationController::ViewDirection m_View; //int newVariable; - + private: - - mitk::DataTree::Pointer m_DataTree; + bool popUpEnabled; - mitk::DataTreeIteratorClone m_DataTreeIterator; mitk::VtkPropRenderer::Pointer m_Renderer; mitk::SlicedGeometry3D::Pointer m_SlicedGeometry; + mitk::StandaloneDataStorage::Pointer m_DataStorage; + QMenu* popUp; - + }; #endif /*QMITKSLICEWIDGET_H_*/