Public Slots | Public Member Functions | Protected Slots | Protected Member Functions | Protected Attributes

QmitkSlicesInterpolator Class Reference
[Classes related to InteractiveSegmentationWidgets]

GUI for slices interpolation. More...

#include <QmitkSlicesInterpolator.h>

Collaboration diagram for QmitkSlicesInterpolator:
Collaboration graph
[legend]

List of all members.

Public Slots

void EnableInterpolation (bool)
void FinishInterpolation (int windowID=-1)

Public Member Functions

 QmitkSlicesInterpolator (QWidget *parent=0, const char *name=0)
void Initialize (mitk::ToolManager *toolManager, QmitkStdMultiWidget *multiWidget)
virtual ~QmitkSlicesInterpolator ()
void SetDataStorage (mitk::DataStorage &storage)
mitk::DataStorageGetDataStorage ()
void OnToolManagerWorkingDataModified ()
void OnToolManagerReferenceDataModified ()
void OnTransversalTimeChanged (itk::Object *sender, const itk::EventObject &)
void OnSagittalTimeChanged (itk::Object *sender, const itk::EventObject &)
void OnFrontalTimeChanged (itk::Object *sender, const itk::EventObject &)
void OnTransversalSliceChanged (const itk::EventObject &)
void OnSagittalSliceChanged (const itk::EventObject &)
void OnFrontalSliceChanged (const itk::EventObject &)
void OnInterpolationInfoChanged (const itk::EventObject &)

Protected Slots

void OnAcceptInterpolationClicked ()
void OnAcceptAllInterpolationsClicked ()
void OnAcceptAllPopupActivated (QAction *action)
void OnInterpolationActivated (bool)
void OnMultiWidgetDeleted (QObject *)

Protected Member Functions

const std::map< QAction
*, unsigned int > 
createActionToSliceDimension ()
void AcceptAllInterpolations (unsigned int windowID)
bool TranslateAndInterpolateChangedSlice (const itk::EventObject &e, unsigned int windowID)
void Interpolate (mitk::PlaneGeometry *plane, unsigned int timeStep)
void UpdateVisibleSuggestion ()
bool GetSliceForWindowsID (unsigned windowID, int &sliceDimension, int &sliceIndex)

Protected Attributes

const std::map< QAction
*, unsigned int > 
ACTION_TO_SLICEDIMENSION
mitk::SegmentationInterpolationController::Pointer m_Interpolator
QmitkStdMultiWidgetm_MultiWidget
mitk::ToolManagerm_ToolManager
bool m_Initialized
unsigned int TSliceObserverTag
unsigned int SSliceObserverTag
unsigned int FSliceObserverTag
unsigned int TTimeObserverTag
unsigned int STimeObserverTag
unsigned int FTimeObserverTag
unsigned int InterpolationInfoChangedObserverTag
QPushButton * m_BtnAcceptInterpolation
QPushButton * m_BtnAcceptAllInterpolations
mitk::DataNode::Pointer m_FeedbackNode
mitk::Imagem_Segmentation
unsigned int m_LastSliceDimension
unsigned int m_LastSliceIndex
std::vector< unsigned int > m_TimeStep
bool m_InterpolationEnabled
mitk::WeakPointer
< mitk::DataStorage
m_DataStorage

Detailed Description

GUI for slices interpolation.

See also:
QmitkInteractiveSegmentation
mitk::SegmentationInterpolation

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:

Author:
maleike

Definition at line 61 of file QmitkSlicesInterpolator.h.


Constructor & Destructor Documentation

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]

Member Function Documentation

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.

Parameters:
windowIDis 2 for transversal, 1 for frontal, 0 for sagittal (similar to sliceDimension in other methods)
Returns:
false if orientation could not be determined

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.

Parameters:
eis a actually a mitk::SliceNavigationController::GeometrySliceEvent, sent by a SliceNavigationController
windowIDis 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();
}

Member Data Documentation

const std::map<QAction*, unsigned int> QmitkSlicesInterpolator::ACTION_TO_SLICEDIMENSION [protected]

Definition at line 204 of file QmitkSlicesInterpolator.h.

Referenced by Initialize(), and ~QmitkSlicesInterpolator().

Definition at line 207 of file QmitkSlicesInterpolator.h.

Referenced by Initialize(), and ~QmitkSlicesInterpolator().

Definition at line 208 of file QmitkSlicesInterpolator.h.

Referenced by QmitkSlicesInterpolator().

Definition at line 211 of file QmitkSlicesInterpolator.h.

Referenced by OnInterpolationActivated(), and QmitkSlicesInterpolator().

Definition at line 210 of file QmitkSlicesInterpolator.h.

Referenced by OnInterpolationActivated(), and QmitkSlicesInterpolator().

Definition at line 200 of file QmitkSlicesInterpolator.h.

Referenced by Initialize().

Definition at line 217 of file QmitkSlicesInterpolator.h.

Referenced by Interpolate(), and OnAcceptInterpolationClicked().

std::vector<unsigned int> QmitkSlicesInterpolator::m_TimeStep [protected]

Definition at line 199 of file QmitkSlicesInterpolator.h.

Referenced by Initialize(), Interpolate(), and OnInterpolationActivated().

Definition at line 203 of file QmitkSlicesInterpolator.h.

Referenced by Initialize(), and ~QmitkSlicesInterpolator().

Definition at line 206 of file QmitkSlicesInterpolator.h.

Referenced by Initialize(), and ~QmitkSlicesInterpolator().

Definition at line 202 of file QmitkSlicesInterpolator.h.

Referenced by Initialize(), and ~QmitkSlicesInterpolator().

Definition at line 205 of file QmitkSlicesInterpolator.h.

Referenced by Initialize(), and ~QmitkSlicesInterpolator().


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines