GUI for slices interpolation. More...
#include <QmitkSlicesInterpolator.h>
GUI for slices interpolation.
There is a separate page describing the general design of QmitkInteractiveSegmentation: QmitkInteractiveSegmentationTechnicalPage
While mitk::SegmentationInterpolation does the bookkeeping of interpolation (keeping track of which slices contain how much segmentation) and the algorithmic work, QmitkSlicesInterpolator is responsible to watch the GUI, to notice, which slice is currently visible. It triggers generation of interpolation suggestions and also triggers acception of suggestions.
Last contributor:
Definition at line 61 of file QmitkSlicesInterpolator.h.
QmitkSlicesInterpolator::QmitkSlicesInterpolator | ( | QWidget * | parent = 0 , |
const char * | name = 0 |
||
) |
Definition at line 61 of file QmitkSlicesInterpolator.cpp.
References mitk::CoreObjectFactory::GetInstance(), InterpolationInfoChangedObserverTag, m_BtnAcceptAllInterpolations, m_BtnAcceptInterpolation, m_FeedbackNode, m_Interpolator, mitk::FloatProperty::New(), mitk::StringProperty::New(), mitk::LevelWindowProperty::New(), mitk::IntProperty::New(), mitk::ColorProperty::New(), mitk::BoolProperty::New(), mitk::DataNode::New(), OnAcceptAllInterpolationsClicked(), OnAcceptInterpolationClicked(), and OnInterpolationInfoChanged().
:QWidget(parent), ACTION_TO_SLICEDIMENSION( createActionToSliceDimension() ), m_Interpolator( mitk::SegmentationInterpolationController::New() ), m_MultiWidget(NULL), m_ToolManager(NULL), m_Initialized(false), m_LastSliceDimension(2), m_LastSliceIndex(0), m_InterpolationEnabled(false) { QHBoxLayout* layout = new QHBoxLayout(this); m_BtnAcceptInterpolation = new QPushButton("Accept...", this); m_BtnAcceptInterpolation->setEnabled( false ); connect( m_BtnAcceptInterpolation, SIGNAL(clicked()), this, SLOT(OnAcceptInterpolationClicked()) ); layout->addWidget( m_BtnAcceptInterpolation, 1 ); m_BtnAcceptAllInterpolations = new QPushButton("... for all slices", this); m_BtnAcceptAllInterpolations->setEnabled( false ); connect( m_BtnAcceptAllInterpolations, SIGNAL(clicked()), this, SLOT(OnAcceptAllInterpolationsClicked()) ); layout->addWidget( m_BtnAcceptAllInterpolations ); itk::ReceptorMemberCommand<QmitkSlicesInterpolator>::Pointer command = itk::ReceptorMemberCommand<QmitkSlicesInterpolator>::New(); command->SetCallbackFunction( this, &QmitkSlicesInterpolator::OnInterpolationInfoChanged ); InterpolationInfoChangedObserverTag = m_Interpolator->AddObserver( itk::ModifiedEvent(), command ); // feedback node and its visualization properties m_FeedbackNode = mitk::DataNode::New(); mitk::CoreObjectFactory::GetInstance()->SetDefaultProperties( m_FeedbackNode ); m_FeedbackNode->SetProperty( "binary", mitk::BoolProperty::New(true) ); m_FeedbackNode->SetProperty( "outline binary", mitk::BoolProperty::New(true) ); m_FeedbackNode->SetProperty( "color", mitk::ColorProperty::New(0.0, 1.0, 1.0) ); m_FeedbackNode->SetProperty( "texture interpolation", mitk::BoolProperty::New(false) ); m_FeedbackNode->SetProperty( "layer", mitk::IntProperty::New( 20 ) ); m_FeedbackNode->SetProperty( "levelwindow", mitk::LevelWindowProperty::New( mitk::LevelWindow(0, 1) ) ); m_FeedbackNode->SetProperty( "name", mitk::StringProperty::New("Interpolation feedback") ); m_FeedbackNode->SetProperty( "opacity", mitk::FloatProperty::New(0.8) ); m_FeedbackNode->SetProperty( "helper object", mitk::BoolProperty::New(true) ); QWidget::setContentsMargins(0, 0, 0, 0); if ( QWidget::layout() != NULL ) { QWidget::layout()->setContentsMargins(0, 0, 0, 0); } }
QmitkSlicesInterpolator::~QmitkSlicesInterpolator | ( | ) | [virtual] |
Definition at line 227 of file QmitkSlicesInterpolator.cpp.
References FSliceObserverTag, FTimeObserverTag, mitk::RenderWindowBase::GetSliceNavigationController(), m_MultiWidget, QmitkStdMultiWidget::mitkWidget1, QmitkStdMultiWidget::mitkWidget2, QmitkStdMultiWidget::mitkWidget3, SSliceObserverTag, STimeObserverTag, TSliceObserverTag, and TTimeObserverTag.
{ if (m_MultiWidget) { mitk::SliceNavigationController* slicer; if(m_MultiWidget->mitkWidget1 != NULL) { slicer = m_MultiWidget->mitkWidget1->GetSliceNavigationController(); slicer->RemoveObserver( TSliceObserverTag ); slicer->RemoveObserver( TTimeObserverTag ); } if(m_MultiWidget->mitkWidget2 != NULL) { slicer = m_MultiWidget->mitkWidget2->GetSliceNavigationController(); slicer->RemoveObserver( SSliceObserverTag ); slicer->RemoveObserver( STimeObserverTag ); } if(m_MultiWidget->mitkWidget3 != NULL) { slicer = m_MultiWidget->mitkWidget3->GetSliceNavigationController(); slicer->RemoveObserver( FSliceObserverTag ); slicer->RemoveObserver( FTimeObserverTag ); } } }
void QmitkSlicesInterpolator::AcceptAllInterpolations | ( | unsigned int | windowID ) | [protected] |
Definition at line 412 of file QmitkSlicesInterpolator.cpp.
References mitk::UndoStackItem::ExecuteIncrement(), mitk::PixelType::GetBpe(), mitk::UndoController::GetCurrentUndoModel(), mitk::Image::GetDimension(), mitk::Image::GetDimensions(), mitk::RenderingManager::GetInstance(), mitk::ProgressBar::GetInstance(), mitk::DiffImageApplier::GetInstanceForUndo(), GetSliceForWindowsID(), mitk::UndoStackItem::IncCurrGroupEventId(), mitk::UndoStackItem::IncCurrObjectEventId(), m_FeedbackNode, m_Interpolator, m_Segmentation, m_TimeStep, mitk::OverwriteSliceImageFilter::New(), mitk::Image::New(), mitk::OpTEST, and mitk::ApplyDiffImageOperation::SetFactor().
Referenced by FinishInterpolation(), and OnAcceptAllPopupActivated().
{ // first creates a 3D diff image, then applies this diff to the segmentation if (m_Segmentation) { int sliceDimension(-1); int dummySliceIndex(-1); if (!GetSliceForWindowsID(windowID, sliceDimension, dummySliceIndex)) { return; // cannot determine slice orientation } //making interpolation separately undoable mitk::UndoStackItem::IncCurrObjectEventId(); mitk::UndoStackItem::IncCurrGroupEventId(); mitk::UndoStackItem::ExecuteIncrement(); // create a diff image for the undo operation mitk::Image::Pointer diffImage = mitk::Image::New(); diffImage->Initialize( m_Segmentation ); mitk::PixelType pixelType( typeid(short signed int) ); diffImage->Initialize( pixelType, 3, m_Segmentation->GetDimensions() ); memset( diffImage->GetData(), 0, (pixelType.GetBpe() >> 3) * diffImage->GetDimension(0) * diffImage->GetDimension(1) * diffImage->GetDimension(2) ); // now the diff image is all 0 unsigned int timeStep( m_TimeStep[windowID] ); // a slicewriter to create the diff image mitk::OverwriteSliceImageFilter::Pointer diffslicewriter = mitk::OverwriteSliceImageFilter::New(); diffslicewriter->SetCreateUndoInformation( false ); diffslicewriter->SetInput( diffImage ); diffslicewriter->SetSliceDimension( sliceDimension ); diffslicewriter->SetTimeStep( timeStep ); unsigned int totalChangedSlices(0); unsigned int zslices = m_Segmentation->GetDimension( sliceDimension ); mitk::ProgressBar::GetInstance()->AddStepsToDo(zslices); for (unsigned int sliceIndex = 0; sliceIndex < zslices; ++sliceIndex) { mitk::Image::Pointer interpolation = m_Interpolator->Interpolate( sliceDimension, sliceIndex, timeStep ); if (interpolation.IsNotNull()) // we don't check if interpolation is necessary/sensible - but m_Interpolator does { diffslicewriter->SetSliceImage( interpolation ); diffslicewriter->SetSliceIndex( sliceIndex ); diffslicewriter->Update(); ++totalChangedSlices; } mitk::ProgressBar::GetInstance()->Progress(); } if (totalChangedSlices > 0) { // store undo stack items if ( true ) { // create do/undo operations (we don't execute the doOp here, because it has already been executed during calculation of the diff image mitk::ApplyDiffImageOperation* doOp = new mitk::ApplyDiffImageOperation( mitk::OpTEST, m_Segmentation, diffImage, timeStep ); mitk::ApplyDiffImageOperation* undoOp = new mitk::ApplyDiffImageOperation( mitk::OpTEST, m_Segmentation, diffImage, timeStep ); undoOp->SetFactor( -1.0 ); std::stringstream comment; comment << "Accept all interpolations (" << totalChangedSlices << ")"; mitk::OperationEvent* undoStackItem = new mitk::OperationEvent( mitk::DiffImageApplier::GetInstanceForUndo(), doOp, undoOp, comment.str() ); mitk::UndoController::GetCurrentUndoModel()->SetOperationEvent( undoStackItem ); // acutally apply the changes here mitk::DiffImageApplier::GetInstanceForUndo()->ExecuteOperation( doOp ); } } m_FeedbackNode->SetData(NULL); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } }
const std::map< QAction *, unsigned int > QmitkSlicesInterpolator::createActionToSliceDimension | ( | ) | [protected] |
Definition at line 51 of file QmitkSlicesInterpolator.cpp.
{ std::map<QAction*, unsigned int> actionToSliceDimension; actionToSliceDimension[new QAction("Transversal (red window)", 0)] = 2; actionToSliceDimension[new QAction("Sagittal (green window)", 0)] = 0; actionToSliceDimension[new QAction("Coronal (blue window)", 0)] = 1; return actionToSliceDimension; }
void QmitkSlicesInterpolator::EnableInterpolation | ( | bool | on ) | [slot] |
Call this from the outside to enable/disable interpolation
Definition at line 585 of file QmitkSlicesInterpolator.cpp.
References OnInterpolationActivated().
Referenced by QmitkSegmentationView::Activated(), QmitkSegmentationView::Deactivated(), and QmitkSegmentationView::ToolboxStackPageChanged().
{ // only to be called from the outside world // just a redirection to OnInterpolationActivated OnInterpolationActivated(on); }
void QmitkSlicesInterpolator::FinishInterpolation | ( | int | windowID = -1 ) |
[slot] |
Call this from the outside to accept all interpolations
Definition at line 486 of file QmitkSlicesInterpolator.cpp.
References AcceptAllInterpolations(), and OnAcceptAllInterpolationsClicked().
{ //this redirect is for calling from outside if (windowID < 0) OnAcceptAllInterpolationsClicked(); else AcceptAllInterpolations( (unsigned int)windowID ); }
mitk::DataStorage * QmitkSlicesInterpolator::GetDataStorage | ( | ) |
Definition at line 114 of file QmitkSlicesInterpolator.cpp.
References mitk::WeakPointer< TObjectType >::IsNotNull(), and m_DataStorage.
{ if ( m_DataStorage.IsNotNull() ) { return m_DataStorage; } else { return NULL; } }
bool QmitkSlicesInterpolator::GetSliceForWindowsID | ( | unsigned | windowID, |
int & | sliceDimension, | ||
int & | sliceIndex | ||
) | [protected] |
Tries to figure out the slice position and orientation for a given render window.
windowID | is 2 for transversal, 1 for frontal, 0 for sagittal (similar to sliceDimension in other methods) |
Definition at line 634 of file QmitkSlicesInterpolator.cpp.
References mitk::SegTool2D::DetermineAffectedImageSlice(), mitk::SlicedGeometry3D::GetGeometry2D(), mitk::TimeSlicedGeometry::GetGeometry3D(), mitk::BaseRenderer::GetMapperID(), mitk::RenderWindowBase::GetRenderer(), mitk::BaseRenderer::GetSlice(), mitk::BaseRenderer::GetWorldGeometry(), Interpolate(), m_MultiWidget, m_Segmentation, m_TimeStep, QmitkStdMultiWidget::mitkWidget1, QmitkStdMultiWidget::mitkWidget2, QmitkStdMultiWidget::mitkWidget3, and mitk::BaseRenderer::Standard2D.
Referenced by AcceptAllInterpolations().
{ mitk::BaseRenderer* renderer(NULL); // find sliceDimension for windowID: // windowID 2: transversal window = renderWindow1 // windowID 1: frontal window = renderWindow3 // windowID 0: sagittal window = renderWindow2 if ( m_MultiWidget ) { switch (windowID) { case 2: default: renderer = m_MultiWidget->mitkWidget1->GetRenderer(); break; case 1: renderer = m_MultiWidget->mitkWidget3->GetRenderer(); break; case 0: renderer = m_MultiWidget->mitkWidget2->GetRenderer(); break; } } if ( m_Segmentation && renderer && renderer->GetMapperID() == mitk::BaseRenderer::Standard2D) { const mitk::TimeSlicedGeometry* timeSlicedGeometry = dynamic_cast<const mitk::TimeSlicedGeometry*>( renderer->GetWorldGeometry() ); if (timeSlicedGeometry) { mitk::SlicedGeometry3D* slicedGeometry = dynamic_cast<mitk::SlicedGeometry3D*>(timeSlicedGeometry->GetGeometry3D(m_TimeStep[windowID])); if (slicedGeometry) { mitk::PlaneGeometry* plane = dynamic_cast<mitk::PlaneGeometry*>(slicedGeometry->GetGeometry2D( renderer->GetSlice() )); Interpolate( plane, m_TimeStep[windowID] ); return mitk::SegTool2D::DetermineAffectedImageSlice( m_Segmentation, plane, sliceDimension, sliceIndex ); } } } return false; }
void QmitkSlicesInterpolator::Initialize | ( | mitk::ToolManager * | toolManager, |
QmitkStdMultiWidget * | multiWidget | ||
) |
To be called once before real use.
Definition at line 127 of file QmitkSlicesInterpolator.cpp.
References FSliceObserverTag, FTimeObserverTag, mitk::Stepper::GetPos(), mitk::RenderWindowBase::GetSliceNavigationController(), mitk::BaseController::GetTime(), mitk::ToolManager::GetWorkingData(), m_Initialized, m_MultiWidget, m_TimeStep, m_ToolManager, QmitkStdMultiWidget::mitkWidget1, QmitkStdMultiWidget::mitkWidget2, QmitkStdMultiWidget::mitkWidget3, OnFrontalSliceChanged(), OnFrontalTimeChanged(), OnMultiWidgetDeleted(), OnSagittalSliceChanged(), OnSagittalTimeChanged(), OnToolManagerReferenceDataModified(), OnToolManagerWorkingDataModified(), OnTransversalSliceChanged(), OnTransversalTimeChanged(), mitk::ToolManager::ReferenceDataChanged, SSliceObserverTag, STimeObserverTag, TSliceObserverTag, TTimeObserverTag, and mitk::ToolManager::WorkingDataChanged.
Referenced by QmitkSegmentationView::SetMultiWidget().
{ if (m_Initialized) { // remove old observers if (m_ToolManager) { m_ToolManager->WorkingDataChanged -= mitk::MessageDelegate<QmitkSlicesInterpolator>( this, &QmitkSlicesInterpolator::OnToolManagerWorkingDataModified ); m_ToolManager->ReferenceDataChanged -= mitk::MessageDelegate<QmitkSlicesInterpolator>( this, &QmitkSlicesInterpolator::OnToolManagerReferenceDataModified ); } if (m_MultiWidget) { disconnect( m_MultiWidget, SIGNAL(destroyed(QObject*)), this, SLOT(OnMultiWidgetDeleted(QObject*)) ); mitk::SliceNavigationController* slicer = m_MultiWidget->mitkWidget1->GetSliceNavigationController(); slicer->RemoveObserver( TSliceObserverTag ); slicer->RemoveObserver( TTimeObserverTag ); slicer = m_MultiWidget->mitkWidget2->GetSliceNavigationController(); slicer->RemoveObserver( SSliceObserverTag ); slicer->RemoveObserver( STimeObserverTag ); slicer = m_MultiWidget->mitkWidget3->GetSliceNavigationController(); slicer->RemoveObserver( FSliceObserverTag ); slicer->RemoveObserver( FTimeObserverTag ); } //return; } m_MultiWidget = multiWidget; connect( m_MultiWidget, SIGNAL(destroyed(QObject*)), this, SLOT(OnMultiWidgetDeleted(QObject*)) ); m_ToolManager = toolManager; if (m_ToolManager) { // set enabled only if a segmentation is selected mitk::DataNode* node = m_ToolManager->GetWorkingData(0); QWidget::setEnabled( node != NULL ); // react whenever the set of selected segmentation changes m_ToolManager->WorkingDataChanged += mitk::MessageDelegate<QmitkSlicesInterpolator>( this, &QmitkSlicesInterpolator::OnToolManagerWorkingDataModified ); m_ToolManager->ReferenceDataChanged += mitk::MessageDelegate<QmitkSlicesInterpolator>( this, &QmitkSlicesInterpolator::OnToolManagerReferenceDataModified ); // connect to the steppers of the three multi widget widgets. after each change, call the interpolator if (m_MultiWidget) { mitk::SliceNavigationController* slicer = m_MultiWidget->mitkWidget1->GetSliceNavigationController(); m_TimeStep.resize(3); m_TimeStep[2] = slicer->GetTime()->GetPos(); { itk::MemberCommand<QmitkSlicesInterpolator>::Pointer command = itk::MemberCommand<QmitkSlicesInterpolator>::New(); command->SetCallbackFunction( this, &QmitkSlicesInterpolator::OnTransversalTimeChanged ); TTimeObserverTag = slicer->AddObserver( mitk::SliceNavigationController::GeometryTimeEvent(NULL, 0), command ); } { itk::ReceptorMemberCommand<QmitkSlicesInterpolator>::Pointer command = itk::ReceptorMemberCommand<QmitkSlicesInterpolator>::New(); command->SetCallbackFunction( this, &QmitkSlicesInterpolator::OnTransversalSliceChanged ); TSliceObserverTag = slicer->AddObserver( mitk::SliceNavigationController::GeometrySliceEvent(NULL, 0), command ); } // connect to the steppers of the three multi widget widgets. after each change, call the interpolator slicer = m_MultiWidget->mitkWidget2->GetSliceNavigationController(); m_TimeStep[0] = slicer->GetTime()->GetPos(); { itk::MemberCommand<QmitkSlicesInterpolator>::Pointer command = itk::MemberCommand<QmitkSlicesInterpolator>::New(); command->SetCallbackFunction( this, &QmitkSlicesInterpolator::OnSagittalTimeChanged ); STimeObserverTag = slicer->AddObserver( mitk::SliceNavigationController::GeometryTimeEvent(NULL, 0), command ); } { itk::ReceptorMemberCommand<QmitkSlicesInterpolator>::Pointer command = itk::ReceptorMemberCommand<QmitkSlicesInterpolator>::New(); command->SetCallbackFunction( this, &QmitkSlicesInterpolator::OnSagittalSliceChanged ); SSliceObserverTag = slicer->AddObserver( mitk::SliceNavigationController::GeometrySliceEvent(NULL, 0), command ); } // connect to the steppers of the three multi widget widgets. after each change, call the interpolator slicer = m_MultiWidget->mitkWidget3->GetSliceNavigationController(); m_TimeStep[1] = slicer->GetTime()->GetPos(); { itk::MemberCommand<QmitkSlicesInterpolator>::Pointer command = itk::MemberCommand<QmitkSlicesInterpolator>::New(); command->SetCallbackFunction( this, &QmitkSlicesInterpolator::OnFrontalTimeChanged ); FTimeObserverTag = slicer->AddObserver( mitk::SliceNavigationController::GeometryTimeEvent(NULL, 0), command ); } { itk::ReceptorMemberCommand<QmitkSlicesInterpolator>::Pointer command = itk::ReceptorMemberCommand<QmitkSlicesInterpolator>::New(); command->SetCallbackFunction( this, &QmitkSlicesInterpolator::OnFrontalSliceChanged ); FSliceObserverTag = slicer->AddObserver( mitk::SliceNavigationController::GeometrySliceEvent(NULL, 0), command ); } } } m_Initialized = true; }
void QmitkSlicesInterpolator::Interpolate | ( | mitk::PlaneGeometry * | plane, |
unsigned int | timeStep | ||
) | [protected] |
Given a PlaneGeometry, this method figures out which slice of the first working image (of the associated ToolManager) should be interpolated. The actual work is then done by our SegmentationInterpolation object.
Definition at line 365 of file QmitkSlicesInterpolator.cpp.
References mitk::SegTool2D::DetermineAffectedImageSlice(), mitk::DataNode::GetData(), mitk::ToolManager::GetWorkingData(), m_FeedbackNode, m_Interpolator, m_LastSliceDimension, m_LastSliceIndex, m_Segmentation, and m_ToolManager.
Referenced by GetSliceForWindowsID(), and TranslateAndInterpolateChangedSlice().
{ if (m_ToolManager) { mitk::DataNode* node = m_ToolManager->GetWorkingData(0); if (node) { m_Segmentation = dynamic_cast<mitk::Image*>(node->GetData()); if (m_Segmentation) { int clickedSliceDimension(-1); int clickedSliceIndex(-1); // calculate real slice position, i.e. slice of the image and not slice of the TimeSlicedGeometry mitk::SegTool2D::DetermineAffectedImageSlice( m_Segmentation, plane, clickedSliceDimension, clickedSliceIndex ); mitk::Image::Pointer interpolation = m_Interpolator->Interpolate( clickedSliceDimension, clickedSliceIndex, timeStep ); m_FeedbackNode->SetData( interpolation ); m_LastSliceDimension = clickedSliceDimension; m_LastSliceIndex = clickedSliceIndex; } } } }
void QmitkSlicesInterpolator::OnAcceptAllInterpolationsClicked | ( | ) | [protected, slot] |
Definition at line 496 of file QmitkSlicesInterpolator.cpp.
References ACTION_TO_SLICEDIMENSION, and OnAcceptAllPopupActivated().
Referenced by FinishInterpolation(), and QmitkSlicesInterpolator().
{ QMenu orientationPopup(this); std::map<QAction*, unsigned int>::const_iterator it; for(it = ACTION_TO_SLICEDIMENSION.begin(); it != ACTION_TO_SLICEDIMENSION.end(); it++) orientationPopup.addAction(it->first); connect( &orientationPopup, SIGNAL(triggered(QAction*)), this, SLOT(OnAcceptAllPopupActivated(QAction*)) ); orientationPopup.exec( QCursor::pos() ); }
void QmitkSlicesInterpolator::OnAcceptAllPopupActivated | ( | QAction * | action ) | [protected, slot] |
Definition at line 508 of file QmitkSlicesInterpolator.cpp.
References AcceptAllInterpolations(), and ACTION_TO_SLICEDIMENSION.
Referenced by OnAcceptAllInterpolationsClicked().
{ try { std::map<QAction*, unsigned int>::const_iterator iter = ACTION_TO_SLICEDIMENSION.find( action ); if (iter != ACTION_TO_SLICEDIMENSION.end()) { int windowID = iter->second; AcceptAllInterpolations( windowID ); } } catch(...) { std::cerr << "Ill construction in " __FILE__ " l. " << __LINE__ << std::endl; } }
void QmitkSlicesInterpolator::OnAcceptInterpolationClicked | ( | ) | [protected, slot] |
Reaction to button clicks.
Definition at line 390 of file QmitkSlicesInterpolator.cpp.
References mitk::UndoStackItem::ExecuteIncrement(), mitk::RenderingManager::GetInstance(), mitk::UndoStackItem::IncCurrGroupEventId(), mitk::UndoStackItem::IncCurrObjectEventId(), m_FeedbackNode, m_LastSliceDimension, m_LastSliceIndex, m_Segmentation, m_TimeStep, and mitk::OverwriteSliceImageFilter::New().
Referenced by QmitkSlicesInterpolator().
{ if (m_Segmentation && m_FeedbackNode->GetData()) { //making interpolation separately undoable mitk::UndoStackItem::IncCurrObjectEventId(); mitk::UndoStackItem::IncCurrGroupEventId(); mitk::UndoStackItem::ExecuteIncrement(); mitk::OverwriteSliceImageFilter::Pointer slicewriter = mitk::OverwriteSliceImageFilter::New(); slicewriter->SetInput( m_Segmentation ); slicewriter->SetCreateUndoInformation( true ); slicewriter->SetSliceImage( dynamic_cast<mitk::Image*>(m_FeedbackNode->GetData()) ); slicewriter->SetSliceDimension( m_LastSliceDimension ); slicewriter->SetSliceIndex( m_LastSliceIndex ); slicewriter->SetTimeStep( m_TimeStep[m_LastSliceDimension] ); slicewriter->Update(); m_FeedbackNode->SetData(NULL); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } }
void QmitkSlicesInterpolator::OnFrontalSliceChanged | ( | const itk::EventObject & | e ) |
Just public because it is called by itk::Commands. You should not need to call this.
Definition at line 326 of file QmitkSlicesInterpolator.cpp.
References mitk::BaseRenderer::GetInstance(), m_MultiWidget, QmitkStdMultiWidget::mitkWidget3, and TranslateAndInterpolateChangedSlice().
Referenced by Initialize().
{ if ( TranslateAndInterpolateChangedSlice( e, 1 ) ) { if (m_MultiWidget) { mitk::BaseRenderer::GetInstance(m_MultiWidget->mitkWidget3->GetRenderWindow())->RequestUpdate(); } } }
void QmitkSlicesInterpolator::OnFrontalTimeChanged | ( | itk::Object * | sender, |
const itk::EventObject & | e | ||
) |
Just public because it is called by itk::Commands. You should not need to call this.
Definition at line 290 of file QmitkSlicesInterpolator.cpp.
References m_LastSliceDimension, m_TimeStep, and mitk::SliceNavigationController::SendSlice().
Referenced by Initialize().
{ const mitk::SliceNavigationController::GeometryTimeEvent& event = dynamic_cast<const mitk::SliceNavigationController::GeometryTimeEvent&>(e); m_TimeStep[1] = event.GetPos(); if (m_LastSliceDimension == 1) { mitk::SliceNavigationController* snc = dynamic_cast<mitk::SliceNavigationController*>( sender ); if (snc) snc->SendSlice(); // will trigger a new interpolation //mitk::BaseRenderer::GetInstance(m_MultiWidget->mitkWidget3->GetRenderWindow())->RequestUpdate(); // done in SendSlice } }
void QmitkSlicesInterpolator::OnInterpolationActivated | ( | bool | on ) | [protected, slot] |
Called on activation/deactivation
Definition at line 526 of file QmitkSlicesInterpolator.cpp.
References mitk::DataNode::GetData(), mitk::RenderingManager::GetInstance(), mitk::DataNode::GetProperty(), mitk::ToolManager::GetReferenceData(), mitk::ToolManager::GetWorkingData(), mitk::WeakPointer< TObjectType >::IsNotNull(), m_BtnAcceptAllInterpolations, m_BtnAcceptInterpolation, m_DataStorage, m_FeedbackNode, m_InterpolationEnabled, m_Interpolator, m_ToolManager, and UpdateVisibleSuggestion().
Referenced by EnableInterpolation(), OnToolManagerReferenceDataModified(), and OnToolManagerWorkingDataModified().
{ m_InterpolationEnabled = on; try { if ( m_DataStorage.IsNotNull() ) { if (on) { m_DataStorage->Add( m_FeedbackNode ); } else { m_DataStorage->Remove( m_FeedbackNode ); } } } catch(...) { // don't care (double add/remove) } if (m_ToolManager) { mitk::DataNode* workingNode = m_ToolManager->GetWorkingData(0); mitk::DataNode* referenceNode = m_ToolManager->GetReferenceData(0); QWidget::setEnabled( workingNode != NULL ); m_BtnAcceptAllInterpolations->setEnabled( on ); m_BtnAcceptInterpolation->setEnabled( on ); m_FeedbackNode->SetVisibility( on ); if (!on) { mitk::RenderingManager::GetInstance()->RequestUpdateAll(); return; } if (workingNode) { m_FeedbackNode->ReplaceProperty( "color", workingNode->GetProperty("color") ); // use the same color as the original image (but outline - see constructor) mitk::Image* segmentation = dynamic_cast<mitk::Image*>(workingNode->GetData()); if (segmentation) { m_Interpolator->SetSegmentationVolume( segmentation ); if (referenceNode) { mitk::Image* referenceImage = dynamic_cast<mitk::Image*>(referenceNode->GetData()); m_Interpolator->SetReferenceVolume( referenceImage ); // may be NULL } } } } UpdateVisibleSuggestion(); }
void QmitkSlicesInterpolator::OnInterpolationInfoChanged | ( | const itk::EventObject & | ) |
Just public because it is called by itk::Commands. You should not need to call this.
Definition at line 628 of file QmitkSlicesInterpolator.cpp.
References UpdateVisibleSuggestion().
Referenced by QmitkSlicesInterpolator().
{ // something (e.g. undo) changed the interpolation info, we should refresh our display UpdateVisibleSuggestion(); }
void QmitkSlicesInterpolator::OnMultiWidgetDeleted | ( | QObject * | ) | [protected, slot] |
Definition at line 677 of file QmitkSlicesInterpolator.cpp.
References m_MultiWidget.
Referenced by Initialize().
{ if (m_MultiWidget) { m_MultiWidget = NULL; } }
void QmitkSlicesInterpolator::OnSagittalSliceChanged | ( | const itk::EventObject & | e ) |
Just public because it is called by itk::Commands. You should not need to call this.
Definition at line 315 of file QmitkSlicesInterpolator.cpp.
References mitk::BaseRenderer::GetInstance(), m_MultiWidget, QmitkStdMultiWidget::mitkWidget2, and TranslateAndInterpolateChangedSlice().
Referenced by Initialize().
{ if ( TranslateAndInterpolateChangedSlice( e, 0 ) ) { if (m_MultiWidget) { mitk::BaseRenderer::GetInstance(m_MultiWidget->mitkWidget2->GetRenderWindow())->RequestUpdate(); } } }
void QmitkSlicesInterpolator::OnSagittalTimeChanged | ( | itk::Object * | sender, |
const itk::EventObject & | e | ||
) |
Just public because it is called by itk::Commands. You should not need to call this.
Definition at line 277 of file QmitkSlicesInterpolator.cpp.
References m_LastSliceDimension, m_TimeStep, and mitk::SliceNavigationController::SendSlice().
Referenced by Initialize().
{ const mitk::SliceNavigationController::GeometryTimeEvent& event = dynamic_cast<const mitk::SliceNavigationController::GeometryTimeEvent&>(e); m_TimeStep[0] = event.GetPos(); if (m_LastSliceDimension == 0) { mitk::SliceNavigationController* snc = dynamic_cast<mitk::SliceNavigationController*>( sender ); if (snc) snc->SendSlice(); // will trigger a new interpolation //mitk::BaseRenderer::GetInstance(m_MultiWidget->mitkWidget2->GetRenderWindow())->RequestUpdate(); // done in SendSlice } }
void QmitkSlicesInterpolator::OnToolManagerReferenceDataModified | ( | ) |
Just public because it is called by itk::Commands. You should not need to call this.
Definition at line 258 of file QmitkSlicesInterpolator.cpp.
References m_InterpolationEnabled, and OnInterpolationActivated().
Referenced by Initialize().
{ OnInterpolationActivated( m_InterpolationEnabled ); // re-initialize if needed }
void QmitkSlicesInterpolator::OnToolManagerWorkingDataModified | ( | ) |
Just public because it is called by itk::Commands. You should not need to call this.
Definition at line 253 of file QmitkSlicesInterpolator.cpp.
References m_InterpolationEnabled, and OnInterpolationActivated().
Referenced by Initialize().
{ OnInterpolationActivated( m_InterpolationEnabled ); // re-initialize if needed }
void QmitkSlicesInterpolator::OnTransversalSliceChanged | ( | const itk::EventObject & | e ) |
Just public because it is called by itk::Commands. You should not need to call this.
Definition at line 304 of file QmitkSlicesInterpolator.cpp.
References mitk::BaseRenderer::GetInstance(), m_MultiWidget, QmitkStdMultiWidget::mitkWidget1, and TranslateAndInterpolateChangedSlice().
Referenced by Initialize().
{ if ( TranslateAndInterpolateChangedSlice( e, 2 ) ) { if (m_MultiWidget) { mitk::BaseRenderer::GetInstance(m_MultiWidget->mitkWidget1->GetRenderWindow())->RequestUpdate(); } } }
void QmitkSlicesInterpolator::OnTransversalTimeChanged | ( | itk::Object * | sender, |
const itk::EventObject & | e | ||
) |
Just public because it is called by itk::Commands. You should not need to call this.
Definition at line 264 of file QmitkSlicesInterpolator.cpp.
References m_LastSliceDimension, m_TimeStep, and mitk::SliceNavigationController::SendSlice().
Referenced by Initialize().
{ const mitk::SliceNavigationController::GeometryTimeEvent& event = dynamic_cast<const mitk::SliceNavigationController::GeometryTimeEvent&>(e); m_TimeStep[2] = event.GetPos(); if (m_LastSliceDimension == 2) { mitk::SliceNavigationController* snc = dynamic_cast<mitk::SliceNavigationController*>( sender ); if (snc) snc->SendSlice(); // will trigger a new interpolation //mitk::BaseRenderer::GetInstance(m_MultiWidget->mitkWidget1->GetRenderWindow())->RequestUpdate(); // done in SendSlice } }
void QmitkSlicesInterpolator::SetDataStorage | ( | mitk::DataStorage & | storage ) |
Definition at line 109 of file QmitkSlicesInterpolator.cpp.
References m_DataStorage.
Referenced by QmitkSegmentationView::SetMultiWidget().
{ m_DataStorage = &storage; }
bool QmitkSlicesInterpolator::TranslateAndInterpolateChangedSlice | ( | const itk::EventObject & | e, |
unsigned int | windowID | ||
) | [protected] |
Retrieves the currently selected PlaneGeometry from a SlicedGeometry3D that is generated by a SliceNavigationController and calls Interpolate to further process this PlaneGeometry into an interpolation.
e | is a actually a mitk::SliceNavigationController::GeometrySliceEvent, sent by a SliceNavigationController |
windowID | is 2 for transversal, 1 for frontal, 0 for sagittal (similar to sliceDimension in other methods) |
Definition at line 337 of file QmitkSlicesInterpolator.cpp.
References mitk::SlicedGeometry3D::GetGeometry2D(), mitk::TimeSlicedGeometry::GetGeometry3D(), Interpolate(), m_InterpolationEnabled, and m_TimeStep.
Referenced by OnFrontalSliceChanged(), OnSagittalSliceChanged(), OnTransversalSliceChanged(), and UpdateVisibleSuggestion().
{ if (!m_InterpolationEnabled) return false; try { const mitk::SliceNavigationController::GeometrySliceEvent& event = dynamic_cast<const mitk::SliceNavigationController::GeometrySliceEvent&>(e); mitk::TimeSlicedGeometry* tsg = event.GetTimeSlicedGeometry(); if (tsg && m_TimeStep.size() > windowID) { mitk::SlicedGeometry3D* slicedGeometry = dynamic_cast<mitk::SlicedGeometry3D*>(tsg->GetGeometry3D(m_TimeStep[windowID])); if (slicedGeometry) { mitk::PlaneGeometry* plane = dynamic_cast<mitk::PlaneGeometry*>(slicedGeometry->GetGeometry2D( event.GetPos() )); Interpolate( plane, m_TimeStep[windowID] ); return true; } } } catch(std::bad_cast) { return false; // so what } return false; }
void QmitkSlicesInterpolator::UpdateVisibleSuggestion | ( | ) | [protected] |
Called internally to update the interpolation suggestion. Finds out about the focused render window and requests an interpolation.
Definition at line 592 of file QmitkSlicesInterpolator.cpp.
References mitk::BaseRenderer::GetCurrentWorldGeometry2DNode(), mitk::RenderingManager::GetInstance(), mitk::GlobalInteraction::GetInstance(), mitk::BaseRenderer::GetMapperID(), mitk::BaseRenderer::GetSlice(), mitk::BaseRenderer::GetWorldGeometry(), m_InterpolationEnabled, mitk::BaseRenderer::Standard2D, and TranslateAndInterpolateChangedSlice().
Referenced by OnInterpolationActivated(), and OnInterpolationInfoChanged().
{ if (m_InterpolationEnabled) { // determine which one is the current view, try to do an initial interpolation mitk::BaseRenderer* renderer = mitk::GlobalInteraction::GetInstance()->GetFocus(); if (renderer && renderer->GetMapperID() == mitk::BaseRenderer::Standard2D) { const mitk::TimeSlicedGeometry* timeSlicedGeometry = dynamic_cast<const mitk::TimeSlicedGeometry*>( renderer->GetWorldGeometry() ); if (timeSlicedGeometry) { mitk::SliceNavigationController::GeometrySliceEvent event( const_cast<mitk::TimeSlicedGeometry*>(timeSlicedGeometry), renderer->GetSlice() ); std::string s; if ( renderer->GetCurrentWorldGeometry2DNode() && renderer->GetCurrentWorldGeometry2DNode()->GetName(s) ) { if (s == "widget1Plane") { TranslateAndInterpolateChangedSlice( event, 2 ); } else if (s == "widget2Plane") { TranslateAndInterpolateChangedSlice( event, 0 ); } else if (s == "widget3Plane") { TranslateAndInterpolateChangedSlice( event, 1 ); } } } } } mitk::RenderingManager::GetInstance()->RequestUpdateAll(); }
const std::map<QAction*, unsigned int> QmitkSlicesInterpolator::ACTION_TO_SLICEDIMENSION [protected] |
Definition at line 165 of file QmitkSlicesInterpolator.h.
Referenced by OnAcceptAllInterpolationsClicked(), and OnAcceptAllPopupActivated().
unsigned int QmitkSlicesInterpolator::FSliceObserverTag [protected] |
Definition at line 204 of file QmitkSlicesInterpolator.h.
Referenced by Initialize(), and ~QmitkSlicesInterpolator().
unsigned int QmitkSlicesInterpolator::FTimeObserverTag [protected] |
Definition at line 207 of file QmitkSlicesInterpolator.h.
Referenced by Initialize(), and ~QmitkSlicesInterpolator().
unsigned int QmitkSlicesInterpolator::InterpolationInfoChangedObserverTag [protected] |
Definition at line 208 of file QmitkSlicesInterpolator.h.
Referenced by QmitkSlicesInterpolator().
QPushButton* QmitkSlicesInterpolator::m_BtnAcceptAllInterpolations [protected] |
Definition at line 211 of file QmitkSlicesInterpolator.h.
Referenced by OnInterpolationActivated(), and QmitkSlicesInterpolator().
QPushButton* QmitkSlicesInterpolator::m_BtnAcceptInterpolation [protected] |
Definition at line 210 of file QmitkSlicesInterpolator.h.
Referenced by OnInterpolationActivated(), and QmitkSlicesInterpolator().
Definition at line 223 of file QmitkSlicesInterpolator.h.
Referenced by GetDataStorage(), OnInterpolationActivated(), and SetDataStorage().
Definition at line 213 of file QmitkSlicesInterpolator.h.
Referenced by AcceptAllInterpolations(), Interpolate(), OnAcceptInterpolationClicked(), OnInterpolationActivated(), and QmitkSlicesInterpolator().
bool QmitkSlicesInterpolator::m_Initialized [protected] |
Definition at line 200 of file QmitkSlicesInterpolator.h.
Referenced by Initialize().
bool QmitkSlicesInterpolator::m_InterpolationEnabled [protected] |
Definition at line 221 of file QmitkSlicesInterpolator.h.
Referenced by OnInterpolationActivated(), OnToolManagerReferenceDataModified(), OnToolManagerWorkingDataModified(), TranslateAndInterpolateChangedSlice(), and UpdateVisibleSuggestion().
mitk::SegmentationInterpolationController::Pointer QmitkSlicesInterpolator::m_Interpolator [protected] |
Definition at line 196 of file QmitkSlicesInterpolator.h.
Referenced by AcceptAllInterpolations(), Interpolate(), OnInterpolationActivated(), and QmitkSlicesInterpolator().
unsigned int QmitkSlicesInterpolator::m_LastSliceDimension [protected] |
Definition at line 216 of file QmitkSlicesInterpolator.h.
Referenced by Interpolate(), OnAcceptInterpolationClicked(), OnFrontalTimeChanged(), OnSagittalTimeChanged(), and OnTransversalTimeChanged().
unsigned int QmitkSlicesInterpolator::m_LastSliceIndex [protected] |
Definition at line 217 of file QmitkSlicesInterpolator.h.
Referenced by Interpolate(), and OnAcceptInterpolationClicked().
Definition at line 198 of file QmitkSlicesInterpolator.h.
Referenced by GetSliceForWindowsID(), Initialize(), OnFrontalSliceChanged(), OnMultiWidgetDeleted(), OnSagittalSliceChanged(), OnTransversalSliceChanged(), and ~QmitkSlicesInterpolator().
mitk::Image* QmitkSlicesInterpolator::m_Segmentation [protected] |
Definition at line 215 of file QmitkSlicesInterpolator.h.
Referenced by AcceptAllInterpolations(), GetSliceForWindowsID(), Interpolate(), and OnAcceptInterpolationClicked().
std::vector<unsigned int> QmitkSlicesInterpolator::m_TimeStep [protected] |
Definition at line 219 of file QmitkSlicesInterpolator.h.
Referenced by AcceptAllInterpolations(), GetSliceForWindowsID(), Initialize(), OnAcceptInterpolationClicked(), OnFrontalTimeChanged(), OnSagittalTimeChanged(), OnTransversalTimeChanged(), and TranslateAndInterpolateChangedSlice().
mitk::ToolManager* QmitkSlicesInterpolator::m_ToolManager [protected] |
Definition at line 199 of file QmitkSlicesInterpolator.h.
Referenced by Initialize(), Interpolate(), and OnInterpolationActivated().
unsigned int QmitkSlicesInterpolator::SSliceObserverTag [protected] |
Definition at line 203 of file QmitkSlicesInterpolator.h.
Referenced by Initialize(), and ~QmitkSlicesInterpolator().
unsigned int QmitkSlicesInterpolator::STimeObserverTag [protected] |
Definition at line 206 of file QmitkSlicesInterpolator.h.
Referenced by Initialize(), and ~QmitkSlicesInterpolator().
unsigned int QmitkSlicesInterpolator::TSliceObserverTag [protected] |
Definition at line 202 of file QmitkSlicesInterpolator.h.
Referenced by Initialize(), and ~QmitkSlicesInterpolator().
unsigned int QmitkSlicesInterpolator::TTimeObserverTag [protected] |
Definition at line 205 of file QmitkSlicesInterpolator.h.
Referenced by Initialize(), and ~QmitkSlicesInterpolator().