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

QmitkSegmentationView Class Reference

#include <QmitkSegmentationView.h>

Inheritance diagram for QmitkSegmentationView:
Inheritance graph
[legend]
Collaboration diagram for QmitkSegmentationView:
Collaboration graph
[legend]

List of all members.

Public Member Functions

 QmitkSegmentationView ()
virtual ~QmitkSegmentationView ()
virtual void OnSelectionChanged (mitk::DataNode *node)
 Invoked when the DataManager selection changed.
virtual void OnSelectionChanged (std::vector< mitk::DataNode * > nodes)
void NewNodesGenerated ()
void NewNodeObjectsGenerated (mitk::ToolManager::DataVectorType *)
virtual void Activated ()
virtual void Deactivated ()
virtual void StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget)
virtual void StdMultiWidgetNotAvailable ()
virtual void StdMultiWidgetClosed (QmitkStdMultiWidget &stdMultiWidget)
virtual void OnPreferencesChanged (const berry::IBerryPreferences *)
void RenderingManagerReinitialized (const itk::EventObject &)
void SliceRotation (const itk::EventObject &)

Protected Types

typedef std::vector
< mitk::DataNode * > 
NodeList

Protected Slots

void OnComboBoxSelectionChanged (const mitk::DataNode *node)
void CreateNewSegmentation ()
void CreateSegmentationFromSurface ()
void ManualToolSelected (int id)
void ToolboxStackPageChanged (int id)
void OnSurfaceSelectionChanged ()

Protected Member Functions

void SetMultiWidget (QmitkStdMultiWidget *multiWidget)
mitk::DataNode::Pointer FindFirstRegularImage (std::vector< mitk::DataNode * > nodes)
mitk::DataNode::Pointer FindFirstSegmentation (std::vector< mitk::DataNode * > nodes)
void SetToolManagerSelection (const mitk::DataNode *referenceData, const mitk::DataNode *workingData)
void CheckImageAlignment ()
bool IsRenderWindowAligned (QmitkRenderWindow *renderWindow, mitk::Image *image)
void ForceDisplayPreferencesUponAllImages ()
void ApplyDisplayOptions (mitk::DataNode *node)
void CreateQtPartControl (QWidget *parent)
QStringList GetDefaultOrganColorString ()
void UpdateOrganList (QStringList &organColors, const QString &organname, mitk::Color colorname)
void AppendToOrganList (QStringList &organColors, const QString &organname, int r, int g, int b)

Protected Attributes

QWidget * m_Parent
Ui::QmitkSegmentationControlsm_Controls
QmitkStdMultiWidgetm_MultiWidget
QmitkSegmentationPostProcessingm_PostProcessing
unsigned long m_RenderingManagerObserverTag
unsigned long m_SlicesRotationObserverTag1
unsigned long m_SlicesRotationObserverTag2

Detailed Description

Warning:
Implementation of this class is split up into two .cpp files to make things more compact. Check both this file and QmitkSegmentationOrganNamesHandling.cpp

Definition at line 34 of file QmitkSegmentationView.h.


Member Typedef Documentation

typedef std::vector<mitk::DataNode*> QmitkSegmentationView::NodeList [protected]

Definition at line 92 of file QmitkSegmentationView.h.


Constructor & Destructor Documentation

QmitkSegmentationView::QmitkSegmentationView (  )

Definition at line 39 of file QmitkSegmentationView.cpp.

QmitkSegmentationView::~QmitkSegmentationView (  ) [virtual]

Definition at line 48 of file QmitkSegmentationView.cpp.

References m_Controls, and m_PostProcessing.

{
  delete m_PostProcessing;
  delete m_Controls;
}

Member Function Documentation

void QmitkSegmentationView::Activated (  ) [virtual]
void QmitkSegmentationView::AppendToOrganList ( QStringList &  organColors,
const QString &  organname,
int  r,
int  g,
int  b 
) [protected]

Definition at line 98 of file QmitkSegmentationOrganNamesHandling.cpp.

Referenced by GetDefaultOrganColorString().

{
  organColors.append( organname + QColor(r, g, b).name() );
}
void QmitkSegmentationView::ApplyDisplayOptions ( mitk::DataNode node ) [protected]

Definition at line 726 of file QmitkSegmentationView.cpp.

References QmitkFunctionality::GetPreferences(), mitk::DataNode::GetPropertyValue(), mitk::FloatProperty::New(), mitk::BoolProperty::New(), and mitk::DataNode::SetProperty().

Referenced by ForceDisplayPreferencesUponAllImages().

{
  if (!node) return;

  bool isBinary(false);
  node->GetPropertyValue("binary", isBinary);

  if (isBinary)
  {
    node->SetProperty( "outline binary", mitk::BoolProperty::New( this->GetPreferences()->GetBool("draw outline", true)) );
    node->SetProperty( "outline width", mitk::FloatProperty::New( 2.0 ) );
    node->SetProperty( "opacity", mitk::FloatProperty::New( this->GetPreferences()->GetBool("draw outline", true) ? 1.0 : 0.3 ) );
    node->SetProperty( "volumerendering", mitk::BoolProperty::New( this->GetPreferences()->GetBool("volume rendering", false) ) );
  }
}
void QmitkSegmentationView::CheckImageAlignment (  ) [protected]
void QmitkSegmentationView::CreateNewSegmentation (  ) [protected, slot]

Definition at line 190 of file QmitkSegmentationView.cpp.

References mitk::Tool::CreateEmptySegmentationNode(), QmitkFunctionality::FireNodeSelected(), QmitkNewSegmentationDialog::GetColor(), QmitkFunctionality::GetDefaultDataStorage(), GetDefaultOrganColorString(), QmitkFunctionality::GetPreferences(), mitk::ToolManager::GetReferenceData(), QmitkNewSegmentationDialog::GetSegmentationName(), mitk::ToolManager::GetToolById(), QmitkToolSelectionBox::GetToolManager(), m_Controls, Ui_QmitkSegmentationControls::m_ManualToolSelectionBox, m_Parent, MITK_DEBUG, MITK_ERROR, OnSelectionChanged(), QmitkNewSegmentationDialog::SetSuggestionList(), and UpdateOrganList().

Referenced by CreateQtPartControl().

{
  mitk::DataNode::Pointer node = m_Controls->m_ManualToolSelectionBox->GetToolManager()->GetReferenceData(0);
  if (node.IsNotNull())
  {
    mitk::Image::Pointer image = dynamic_cast<mitk::Image*>( node->GetData() );
    if (image.IsNotNull())
    {
      if (image->GetDimension()>2)
      {
        // ask about the name and organ type of the new segmentation
        QmitkNewSegmentationDialog* dialog = new QmitkNewSegmentationDialog( m_Parent ); // needs a QWidget as parent, "this" is not QWidget

        QString storedList = QString::fromStdString( this->GetPreferences()->GetByteArray("Organ-Color-List","") );
        QStringList organColors;
        if (storedList.isEmpty())
        {
          organColors = GetDefaultOrganColorString();
        }
        else
        {
          /*
             a couple of examples of how organ names are stored:

             a simple item is built up like 'name#AABBCC' where #AABBCC is the hexadecimal notation of a color as known from HTML

             items are stored separated by ';'
             this makes it necessary to escape occurrences of ';' in name.
             otherwise the string "hugo;ypsilon#AABBCC;eugen#AABBCC" could not be parsed as two organs
             but we would get "hugo" and "ypsilon#AABBCC" and "eugen#AABBCC"

             so the organ name "hugo;ypsilon" is stored as "hugo\;ypsilon"
             and must be unescaped after loading

             the following lines could be one split with Perl's negative lookbehind
          */

          // recover string list from BlueBerry view's preferences
          QString storedString = QString::fromStdString( this->GetPreferences()->GetByteArray("Organ-Color-List","") );
          MITK_DEBUG << "storedString: " << storedString.toStdString();
          // match a string consisting of any number of repetitions of either "anything but ;" or "\;". This matches everything until the next unescaped ';'
          QRegExp onePart("(?:[^;]|\\\\;)*");
          MITK_DEBUG << "matching " << onePart.pattern().toStdString();
          int count = 0;
          int pos = 0;
          while( (pos = onePart.indexIn( storedString, pos )) != -1 )
          {
            ++count;
            int length = onePart.matchedLength();
            if (length == 0) break;
            QString matchedString = storedString.mid(pos, length);
            MITK_DEBUG << "   Captured length " << length << ": " << matchedString.toStdString();
            pos += length + 1; // skip separating ';'

            // unescape possible occurrences of '\;' in the string
            matchedString.replace("\\;", ";");

            // add matched string part to output list
            organColors << matchedString;
          }
          MITK_DEBUG << "Captured " << count << " organ name/colors";
        }

        dialog->SetSuggestionList( organColors );

        int dialogReturnValue = dialog->exec();

        if ( dialogReturnValue == QDialog::Rejected ) return; // user clicked cancel or pressed Esc or something similar

        // ask the user about an organ type and name, add this information to the image's (!) propertylist
        // create a new image of the same dimensions and smallest possible pixel type
        mitk::ToolManager* toolManager = m_Controls->m_ManualToolSelectionBox->GetToolManager();
        mitk::Tool* firstTool = toolManager->GetToolById(0);
        if (firstTool)
        {
          try
          {
            mitk::DataNode::Pointer emptySegmentation =
              firstTool->CreateEmptySegmentationNode( image, dialog->GetSegmentationName().toStdString(), dialog->GetColor() );

            if (!emptySegmentation) return; // could be aborted by user

            UpdateOrganList( organColors, dialog->GetSegmentationName(), dialog->GetColor() );

            /*
               escape ';' here (replace by '\;'), see longer comment above
            */
            std::string stringForStorage = organColors.replaceInStrings(";","\\;").join(";").toStdString();
            MITK_DEBUG << "Will store: " << stringForStorage;
            this->GetPreferences()->PutByteArray("Organ-Color-List", stringForStorage );
            this->GetPreferences()->Flush();

            this->GetDefaultDataStorage()->Add( emptySegmentation, node ); // add as a child, because the segmentation "derives" from the original

            this->FireNodeSelected( emptySegmentation );
            this->OnSelectionChanged( emptySegmentation );
          }
          catch (std::bad_alloc)
          {
            QMessageBox::warning(NULL,"Create new segmentation","Could not allocate memory for new segmentation");
          }
        }
      }
      else
      {
        QMessageBox::information(NULL,"Segmentation","Segmentation is currently not supported for 2D images");
      }
    }
  }
  else
  {
    MITK_ERROR << "'Create new segmentation' button should never be clickable unless a patient image is selected...";
  }
}
void QmitkSegmentationView::CreateQtPartControl ( QWidget *  parent ) [protected, virtual]

Implements berry::QtViewPart.

Definition at line 742 of file QmitkSegmentationView.cpp.

References Ui_QmitkSegmentationControls::btnNewSegmentation, CreateNewSegmentation(), CreateSegmentationFromSurface(), Ui_QmitkSegmentationControls::CreateSegmentationFromSurface, QmitkToolSelectionBox::EnabledWithReferenceAndWorkingData, QmitkToolSelectionBox::EnabledWithReferenceData, QmitkFunctionality::GetDefaultDataStorage(), QmitkDataStorageComboBox::GetSelectedNode(), QmitkToolSelectionBox::GetToolManager(), Ui_QmitkSegmentationControls::lblAlignmentWarning, Ui_QmitkSegmentationControls::lblReferenceImageSelectionWarning, Ui_QmitkSegmentationControls::lblSegImage, Ui_QmitkSegmentationControls::lblSegmentation, Ui_QmitkSegmentationControls::lblWorkingImageSelectionWarning, m_Controls, Ui_QmitkSegmentationControls::m_LesionToolGUIContainer, Ui_QmitkSegmentationControls::m_LesionToolSelectionBox, Ui_QmitkSegmentationControls::m_ManualToolGUIContainer, Ui_QmitkSegmentationControls::m_ManualToolSelectionBox, Ui_QmitkSegmentationControls::m_OrganToolGUIContainer, Ui_QmitkSegmentationControls::m_OrganToolSelectionBox, m_Parent, m_PostProcessing, ManualToolSelected(), Ui_QmitkSegmentationControls::MaskSurfaces, mitk::NodePredicateDataType::New(), NewNodeObjectsGenerated(), mitk::ToolManager::NewNodeObjectsGenerated, NewNodesGenerated(), mitk::ToolManager::NewNodesGenerated, OnComboBoxSelectionChanged(), OnSelectionChanged(), OnSurfaceSelectionChanged(), Ui_QmitkSegmentationControls::refImageSelector, mitk::ToolManager::SetDataStorage(), QmitkDataStorageComboBox::SetDataStorage(), QmitkToolSelectionBox::SetDisplayedToolGroups(), QmitkToolSelectionBox::SetEnabledMode(), QmitkToolSelectionBox::SetGenerateAccelerators(), QmitkDataStorageComboBox::SetPredicate(), QmitkToolSelectionBox::SetToolGUIArea(), QmitkToolSelectionBox::SetToolManager(), Ui_QmitkSegmentationControls::setupUi(), ToolboxStackPageChanged(), and Ui_QmitkSegmentationControls::widgetStack.

{
  // setup the basic GUI of this view
  m_Parent = parent;

  m_Controls = new Ui::QmitkSegmentationControls;
  m_Controls->setupUi(parent);
  m_Controls->lblWorkingImageSelectionWarning->hide();
  m_Controls->lblAlignmentWarning->hide();
  m_Controls->lblSegImage->hide();
  m_Controls->lblSegmentation->hide();
  
  m_Controls->refImageSelector->SetDataStorage(this->GetDefaultDataStorage());
  m_Controls->refImageSelector->SetPredicate(mitk::NodePredicateDataType::New("Image"));

  if( m_Controls->refImageSelector->GetSelectedNode().IsNotNull() )
    m_Controls->lblReferenceImageSelectionWarning->hide();
  else
    m_Controls->refImageSelector->hide();


  mitk::ToolManager* toolManager = m_Controls->m_ManualToolSelectionBox->GetToolManager();
  toolManager->SetDataStorage( *(this->GetDefaultDataStorage()) );
  assert ( toolManager );

  // all part of open source MITK
  m_Controls->m_ManualToolSelectionBox->SetGenerateAccelerators(true);
  m_Controls->m_ManualToolSelectionBox->SetToolGUIArea( m_Controls->m_ManualToolGUIContainer );
  m_Controls->m_ManualToolSelectionBox->SetDisplayedToolGroups("Add Subtract Paint Wipe 'Region Growing' Correction Fill Erase");
  m_Controls->m_ManualToolSelectionBox->SetEnabledMode( QmitkToolSelectionBox::EnabledWithReferenceAndWorkingData );

  // available only in the 3M application
  if ( !m_Controls->m_OrganToolSelectionBox->children().count() )
  {
    m_Controls->widgetStack->setItemEnabled( 1, false );
  }
  m_Controls->m_OrganToolSelectionBox->SetToolManager( *toolManager );
  m_Controls->m_OrganToolSelectionBox->SetToolGUIArea( m_Controls->m_OrganToolGUIContainer );
  m_Controls->m_OrganToolSelectionBox->SetDisplayedToolGroups("'Hippocampus left' 'Hippocampus right' 'Lung left' 'Lung right' 'Liver' 'Heart LV' 'Endocard LV' 'Epicard LV' 'Prostate'");
  m_Controls->m_OrganToolSelectionBox->SetEnabledMode( QmitkToolSelectionBox::EnabledWithReferenceData );

  // available only in the 3M application
  if ( !m_Controls->m_LesionToolSelectionBox->children().count() )
  {
    m_Controls->widgetStack->setItemEnabled( 2, false );
  }
  m_Controls->m_LesionToolSelectionBox->SetToolManager( *toolManager );
  m_Controls->m_LesionToolSelectionBox->SetToolGUIArea( m_Controls->m_LesionToolGUIContainer );
  m_Controls->m_LesionToolSelectionBox->SetDisplayedToolGroups("'Lymph Node'");
  m_Controls->m_LesionToolSelectionBox->SetEnabledMode( QmitkToolSelectionBox::EnabledWithReferenceData );

  toolManager->NewNodesGenerated +=
    mitk::MessageDelegate<QmitkSegmentationView>( this, &QmitkSegmentationView::NewNodesGenerated );          // update the list of segmentations
  toolManager->NewNodeObjectsGenerated +=
    mitk::MessageDelegate1<QmitkSegmentationView, mitk::ToolManager::DataVectorType*>( this, &QmitkSegmentationView::NewNodeObjectsGenerated );          // update the list of segmentations

  // create signal/slot connections
  connect( m_Controls->refImageSelector, SIGNAL( OnSelectionChanged( const mitk::DataNode* ) ), 
           this, SLOT( OnComboBoxSelectionChanged( const mitk::DataNode* ) ) );
  connect( m_Controls->btnNewSegmentation, SIGNAL(clicked()), this, SLOT(CreateNewSegmentation()) );
  connect( m_Controls->CreateSegmentationFromSurface, SIGNAL(clicked()), this, SLOT(CreateSegmentationFromSurface()) );
  connect( m_Controls->m_ManualToolSelectionBox, SIGNAL(ToolSelected(int)), this, SLOT(ManualToolSelected(int)) );
  connect( m_Controls->widgetStack, SIGNAL(currentChanged(int)), this, SLOT(ToolboxStackPageChanged(int)) );


  connect(m_Controls->MaskSurfaces,  SIGNAL( OnSelectionChanged( const mitk::DataNode* ) ), 
           this, SLOT( OnSurfaceSelectionChanged( ) ) );

  m_Controls->MaskSurfaces->SetDataStorage(this->GetDefaultDataStorage());
  m_Controls->MaskSurfaces->SetPredicate(mitk::NodePredicateDataType::New("Surface"));

  m_PostProcessing = new QmitkSegmentationPostProcessing(this->GetDefaultDataStorage(), this, m_Parent);
}
void QmitkSegmentationView::CreateSegmentationFromSurface (  ) [protected, slot]

Definition at line 305 of file QmitkSegmentationView.cpp.

References QmitkFunctionality::GetDataStorage(), mitk::ToolManager::GetReferenceData(), QmitkDataStorageComboBox::GetSelectedNode(), QmitkToolSelectionBox::GetToolManager(), QmitkFunctionality::HandleException(), m_Controls, Ui_QmitkSegmentationControls::m_ManualToolSelectionBox, m_Parent, Ui_QmitkSegmentationControls::MaskSurfaces, mitk::BoolProperty::New(), mitk::StringProperty::New(), mitk::DataNode::New(), and mitk::SurfaceToImageFilter::New().

Referenced by CreateQtPartControl().

{ 
  mitk::DataNode::Pointer surfaceNode =
      m_Controls->MaskSurfaces->GetSelectedNode();
  mitk::Surface::Pointer surface(0);
  if(surfaceNode.IsNotNull())
    surface = dynamic_cast<mitk::Surface*> ( surfaceNode->GetData() );
  if(surface.IsNull())
  {
    this->HandleException( "No surface selected.", m_Parent, true);
    return;
  }

  mitk::DataNode::Pointer imageNode
      = m_Controls->m_ManualToolSelectionBox->GetToolManager()->GetReferenceData(0);
  mitk::Image::Pointer image(0);
  if (imageNode.IsNotNull())
    image = dynamic_cast<mitk::Image*>( imageNode->GetData() );
  if(image.IsNull())
  {
    this->HandleException( "No image selected.", m_Parent, true);
    return;
  }

  mitk::SurfaceToImageFilter::Pointer s2iFilter
      = mitk::SurfaceToImageFilter::New();

  s2iFilter->MakeOutputBinaryOn();
  s2iFilter->SetInput(surface);
  s2iFilter->SetImage(image);
  s2iFilter->Update();

  mitk::DataNode::Pointer resultNode = mitk::DataNode::New();
  std::string nameOfResultImage = imageNode->GetName();
  nameOfResultImage.append(surfaceNode->GetName());
  resultNode->SetProperty("name", mitk::StringProperty::New(nameOfResultImage) );
  resultNode->SetProperty("binary", mitk::BoolProperty::New(true) );
  resultNode->SetData( s2iFilter->GetOutput() );

  this->GetDataStorage()->Add(resultNode, imageNode);

}
void QmitkSegmentationView::Deactivated (  ) [virtual]
mitk::DataNode::Pointer QmitkSegmentationView::FindFirstRegularImage ( std::vector< mitk::DataNode * >  nodes ) [protected]

Definition at line 525 of file QmitkSegmentationView.cpp.

Referenced by OnSelectionChanged().

{
  if (nodes.empty()) return NULL;

  for(unsigned int i = 0; i < nodes.size(); ++i)
  {
      //mitk::DataNode::Pointer node = i.value()
      bool isImage(false);
      if (nodes.at(i)->GetData())
      {
        isImage = dynamic_cast<mitk::Image*>(nodes.at(i)->GetData()) != NULL;
      }

      // make sure this is not a binary image
      bool isSegmentation(false);
      nodes.at(i)->GetBoolProperty("binary", isSegmentation);

      // return first proper mitk::Image
      if (isImage && !isSegmentation) return nodes.at(i);
  }

  return NULL;
}
mitk::DataNode::Pointer QmitkSegmentationView::FindFirstSegmentation ( std::vector< mitk::DataNode * >  nodes ) [protected]

Definition at line 550 of file QmitkSegmentationView.cpp.

Referenced by OnSelectionChanged().

{
  if (nodes.empty()) return NULL;


  for(unsigned int i = 0; i < nodes.size(); ++i)
  {
      bool isImage(false);
      if (nodes.at(i)->GetData())
      {
        isImage = dynamic_cast<mitk::Image*>(nodes.at(i)->GetData()) != NULL;
      }

      bool isSegmentation(false);
      nodes.at(i)->GetBoolProperty("binary", isSegmentation);

      // return first proper binary mitk::Image
      if (isImage && isSegmentation) 
      {
        return nodes.at(i);
      }
  }

  return NULL;
}
void QmitkSegmentationView::ForceDisplayPreferencesUponAllImages (  ) [protected]

Definition at line 672 of file QmitkSegmentationView.cpp.

References ApplyDisplayOptions(), QmitkFunctionality::GetDefaultDataStorage(), mitk::RenderingManager::GetInstance(), mitk::ToolManager::GetReferenceData(), QmitkToolSelectionBox::GetToolManager(), mitk::ToolManager::GetWorkingData(), m_Controls, Ui_QmitkSegmentationControls::m_ManualToolSelectionBox, m_Parent, and mitk::DataNode::SetVisibility().

Referenced by NewNodesGenerated(), OnPreferencesChanged(), and OnSelectionChanged().

{
  if (!m_Parent || !m_Parent->isVisible()) return;

  // check all images and segmentations in DataStorage:
  // (items in brackets are implicitly done by previous steps)
  // 1.
  //   if  a reference image is selected,
  //     show the reference image
  //     and hide all other images (orignal and segmentation),
  //     (and hide all segmentations of the other original images)
  //     and show all the reference's segmentations
  //   if no reference image is selected, do do nothing
  //
  // 2.
  //   if  a segmentation is selected,
  //     show it
  //     (and hide all all its siblings (childs of the same parent, incl, NULL parent))
  //   if no segmentation is selected, do nothing

  if (!m_Controls) return; // might happen on initialization (preferences loaded)
  mitk::DataNode::Pointer referenceData = m_Controls->m_ManualToolSelectionBox->GetToolManager()->GetReferenceData(0);
  mitk::DataNode::Pointer workingData =   m_Controls->m_ManualToolSelectionBox->GetToolManager()->GetWorkingData(0);

  // 1.
  if (referenceData.IsNotNull())
  {
    // iterate all images
    mitk::TNodePredicateDataType<mitk::Image>::Pointer isImage = mitk::TNodePredicateDataType<mitk::Image>::New();

    mitk::DataStorage::SetOfObjects::ConstPointer allImages = this->GetDefaultDataStorage()->GetSubset( isImage );
    for ( mitk::DataStorage::SetOfObjects::const_iterator iter = allImages->begin();
          iter != allImages->end();
          ++iter)

    {
      mitk::DataNode* node = *iter;
      // apply display preferences
      ApplyDisplayOptions(node);

      // set visibility
      node->SetVisibility(node == referenceData);
    }
  }

  // 2.
  if (workingData.IsNotNull())
  {
    workingData->SetVisibility(true);
  }

  mitk::RenderingManager::GetInstance()->RequestUpdateAll();
}
QStringList QmitkSegmentationView::GetDefaultOrganColorString (  ) [protected]

Definition at line 20 of file QmitkSegmentationOrganNamesHandling.cpp.

References AppendToOrganList().

Referenced by CreateNewSegmentation().

{
  QStringList organColors;

  AppendToOrganList(organColors, "Ankle", 255, 255, 153);
  AppendToOrganList(organColors, "Appendix", 161, 107, 54);
  AppendToOrganList(organColors, "Blood vessels", 255, 49, 49);
  AppendToOrganList(organColors, "Bone", 255, 255, 153);
  AppendToOrganList(organColors, "Brain", 255, 156, 202);
  AppendToOrganList(organColors, "Bronchial tree", 0, 160, 209);
  AppendToOrganList(organColors, "Coccyx", 255, 255, 153);
  AppendToOrganList(organColors, "Colon", 161, 107, 54);
  AppendToOrganList(organColors, "Cyst", 150, 189, 228);
  AppendToOrganList(organColors, "Elbow", 255, 255, 153);
  AppendToOrganList(organColors, "Eye", 18, 7, 161);
  AppendToOrganList(organColors, "Fallopian tube", 161, 19, 39);
  AppendToOrganList(organColors, "Fat", 237, 255, 41);
  AppendToOrganList(organColors, "Gall Bladder", 86, 127, 24);
  AppendToOrganList(organColors, "Hand", 255, 222, 199);
  AppendToOrganList(organColors, "Heart", 153, 0, 0);
  AppendToOrganList(organColors, "Hip", 255, 255, 153);
  AppendToOrganList(organColors, "Kidney", 250, 89, 0);
  AppendToOrganList(organColors, "Knee", 255, 255, 153);
  AppendToOrganList(organColors, "Larynx", 102, 0, 0);
  AppendToOrganList(organColors, "Liver", 194, 142, 0);
  AppendToOrganList(organColors, "Lung", 107, 220, 255);
  AppendToOrganList(organColors, "Lymph node", 10, 250, 56);
  AppendToOrganList(organColors, "Muscle", 102, 0, 0);
  AppendToOrganList(organColors, "Nerve", 255, 234, 79);
  AppendToOrganList(organColors, "Nose", 255, 222, 199);
  AppendToOrganList(organColors, "Oesophagus", 102, 0, 0);
  AppendToOrganList(organColors, "Ovaries", 234, 0, 117);
  AppendToOrganList(organColors, "Pancreas", 249, 171, 61);
  AppendToOrganList(organColors, "Pelvis", 255, 255, 153);
  AppendToOrganList(organColors, "Penis", 255, 222, 199);
  AppendToOrganList(organColors, "Pharynx", 102, 0, 0);
  AppendToOrganList(organColors, "Prostate", 209, 163, 117);
  AppendToOrganList(organColors, "Rectum", 161, 107, 54);
  AppendToOrganList(organColors, "Sacrum", 255, 255, 153);
  AppendToOrganList(organColors, "Seminal vesicle", 199, 232, 255);
  AppendToOrganList(organColors, "Shoulder", 255, 255, 153);
  AppendToOrganList(organColors, "Spinal cord", 255, 234, 79);
  AppendToOrganList(organColors, "Spleen", 249, 108, 61);
  AppendToOrganList(organColors, "Stomach", 161, 107, 54);
  AppendToOrganList(organColors, "Teeth", 255, 252, 216);
  AppendToOrganList(organColors, "Testicles", 199, 232, 255);
  AppendToOrganList(organColors, "Thyroid", 255, 179, 184);
  AppendToOrganList(organColors, "Tongue", 102, 0, 0);
  AppendToOrganList(organColors, "Tumor", 147, 112, 17);
  AppendToOrganList(organColors, "Urethra", 197, 204, 0);
  AppendToOrganList(organColors, "Urinary bladder", 197, 204, 0);
  AppendToOrganList(organColors, "Uterus", 161, 19, 39);
  AppendToOrganList(organColors, "Vagina", 161, 19, 39);
  AppendToOrganList(organColors, "Vertebra", 255, 255, 153);
  AppendToOrganList(organColors, "Wrist", 255, 255, 153);

  return organColors;
}
bool QmitkSegmentationView::IsRenderWindowAligned ( QmitkRenderWindow renderWindow,
mitk::Image image 
) [protected]

Definition at line 659 of file QmitkSegmentationView.cpp.

References mitk::SegTool2D::DetermineAffectedImageSlice(), mitk::BaseRenderer::GetCurrentWorldGeometry2D(), and mitk::RenderWindowBase::GetRenderer().

Referenced by CheckImageAlignment().

{
  if (!renderWindow) return false;

  // for all 2D renderwindows of m_MultiWidget check alignment
  mitk::PlaneGeometry::ConstPointer displayPlane = dynamic_cast<const mitk::PlaneGeometry*>( renderWindow->GetRenderer()->GetCurrentWorldGeometry2D() );
  if (displayPlane.IsNull()) return false;

  int affectedDimension(-1);
  int affectedSlice(-1);
  return mitk::SegTool2D::DetermineAffectedImageSlice( image, displayPlane, affectedDimension, affectedSlice );
}
void QmitkSegmentationView::ManualToolSelected ( int  id ) [protected, slot]

Definition at line 348 of file QmitkSegmentationView.cpp.

References QmitkStdMultiWidget::DisableNavigationControllerEventListening(), QmitkStdMultiWidget::EnableNavigationControllerEventListening(), and m_MultiWidget.

Referenced by CreateQtPartControl().

{
  // disable crosshair movement when a manual drawing tool is active (otherwise too much visual noise)
  if (m_MultiWidget)
  {
    if (id >= 0)
    {
      m_MultiWidget->DisableNavigationControllerEventListening();
    }
    else
    {
      m_MultiWidget->EnableNavigationControllerEventListening();
    }
  }
}
void QmitkSegmentationView::NewNodeObjectsGenerated ( mitk::ToolManager::DataVectorType nodes )

Definition at line 59 of file QmitkSegmentationView.cpp.

References QmitkFunctionality::FireNodeSelected(), QmitkToolSelectionBox::GetToolManager(), m_Controls, and Ui_QmitkSegmentationControls::m_ManualToolSelectionBox.

Referenced by CreateQtPartControl().

{
  if (!nodes) return;

  mitk::ToolManager* toolManager = m_Controls->m_ManualToolSelectionBox->GetToolManager();
  if (!toolManager) return;
  for (mitk::ToolManager::DataVectorType::iterator iter = nodes->begin(); iter != nodes->end(); ++iter)
  {
    this->FireNodeSelected( *iter );
    // only last iteration meaningful, multiple generated objects are not taken into account here
  }
}
void QmitkSegmentationView::NewNodesGenerated (  )
void QmitkSegmentationView::OnComboBoxSelectionChanged ( const mitk::DataNode node ) [protected, slot]
void QmitkSegmentationView::OnPreferencesChanged ( const berry::IBerryPreferences  ) [virtual]

Called when the preferences object of this view changed.

See also:
GetPreferences()

Reimplemented from QmitkFunctionality.

Definition at line 172 of file QmitkSegmentationView.cpp.

References ForceDisplayPreferencesUponAllImages().

void QmitkSegmentationView::OnSelectionChanged ( std::vector< mitk::DataNode * >   ) [virtual]

Called when the selection in the workbench changed

Reimplemented from QmitkFunctionality.

Definition at line 440 of file QmitkSegmentationView.cpp.

References Ui_QmitkSegmentationControls::CreateSegmentationFromSurface, QmitkDataStorageComboBox::Find(), FindFirstRegularImage(), FindFirstSegmentation(), ForceDisplayPreferencesUponAllImages(), QmitkFunctionality::GetDefaultDataStorage(), QmitkDataStorageComboBox::GetSelectedNode(), m_Controls, m_Parent, Ui_QmitkSegmentationControls::MaskSurfaces, MITK_ERROR, mitk::NodePredicateAnd::New(), mitk::NodePredicateNot::New(), mitk::BoolProperty::New(), mitk::NodePredicateProperty::New(), OnComboBoxSelectionChanged(), OnSelectionChanged(), Ui_QmitkSegmentationControls::refImageSelector, and SetToolManagerSelection().

{
  // if Image and Surface are selected, enable button
  if ( (m_Controls->refImageSelector->GetSelectedNode().IsNull()) ||
       (m_Controls->MaskSurfaces->GetSelectedNode().IsNull()))
    m_Controls->CreateSegmentationFromSurface->setEnabled(false);
  else
    m_Controls->CreateSegmentationFromSurface->setEnabled(true);

  if (!m_Parent || !m_Parent->isVisible()) return;

  // reaction to BlueBerry selection events
  //   this method will try to figure out if a relevant segmentation and its corresponding original image were selected
  //   a warning is issued if the selection is invalid
  //   appropriate reactions are triggered otherwise

  mitk::DataNode::Pointer referenceData = FindFirstRegularImage( nodes ); //m_Controls->refImageSelector->GetSelectedNode(); //FindFirstRegularImage( nodes );
  mitk::DataNode::Pointer workingData =   FindFirstSegmentation( nodes );

  bool invalidSelection( !nodes.empty() &&
                         (
                           nodes.size() > 2 ||    // maximum 2 selected nodes
                           (nodes.size() == 2 && (workingData.IsNull() || referenceData.IsNull()) ) || // with two nodes, one must be the original image, one the segmentation
                           ( workingData.GetPointer() == referenceData.GetPointer() ) //one node is selected as reference and working image
                           // one item is always ok (might be working or reference or nothing
                         )
                       );

  if (invalidSelection)
  {
    // TODO visible warning when two images are selected
    MITK_ERROR << "WARNING: No image, too many (>2) or two equal images were selected.";
    workingData = NULL;

    if( m_Controls->refImageSelector->GetSelectedNode().IsNull() )
      referenceData = NULL;
  }

  if ( workingData.IsNotNull() && referenceData.IsNull() )
  {
    // find the DataStorage parent of workingData
    // try to find a "normal image" parent, select this as reference image
    mitk::TNodePredicateDataType<mitk::Image>::Pointer isImage = mitk::TNodePredicateDataType<mitk::Image>::New();
    mitk::NodePredicateProperty::Pointer isBinary = mitk::NodePredicateProperty::New("binary", mitk::BoolProperty::New(true));
    mitk::NodePredicateNot::Pointer isNotBinary = mitk::NodePredicateNot::New( isBinary );
    mitk::NodePredicateAnd::Pointer isNormalImage = mitk::NodePredicateAnd::New( isImage, isNotBinary );

    mitk::DataStorage::SetOfObjects::ConstPointer possibleParents = this->GetDefaultDataStorage()->GetSources( workingData, isNormalImage );

    if (possibleParents->size() > 0)
    {
      if (possibleParents->size() > 1)
      {
        // TODO visible warning for this rare case
        MITK_ERROR << "Selected binary image has multiple parents. Using arbitrary first one for segmentation.";
      }

      referenceData = (*possibleParents)[0];
    }
  }

  //set comboBox to reference image
  disconnect( m_Controls->refImageSelector, SIGNAL( OnSelectionChanged( const mitk::DataNode* ) ), 
           this, SLOT( OnComboBoxSelectionChanged( const mitk::DataNode* ) ) );

  m_Controls->refImageSelector->setCurrentIndex( m_Controls->refImageSelector->Find(referenceData) );

  connect( m_Controls->refImageSelector, SIGNAL( OnSelectionChanged( const mitk::DataNode* ) ), 
    this, SLOT( OnComboBoxSelectionChanged( const mitk::DataNode* ) ) );


  // if Image and Surface are selected, enable button
  if ( (m_Controls->refImageSelector->GetSelectedNode().IsNull()) ||
       (m_Controls->MaskSurfaces->GetSelectedNode().IsNull()) ||
       (!referenceData))
    m_Controls->CreateSegmentationFromSurface->setEnabled(false);
  else
    m_Controls->CreateSegmentationFromSurface->setEnabled(true);


  SetToolManagerSelection(referenceData, workingData);
  ForceDisplayPreferencesUponAllImages();
}
void QmitkSegmentationView::OnSelectionChanged ( mitk::DataNode node ) [virtual]

Invoked when the DataManager selection changed.

Definition at line 421 of file QmitkSegmentationView.cpp.

Referenced by CreateNewSegmentation(), CreateQtPartControl(), OnComboBoxSelectionChanged(), and OnSelectionChanged().

{
  std::vector<mitk::DataNode*> nodes;
  nodes.push_back( node );
  this->OnSelectionChanged( nodes );
}
void QmitkSegmentationView::OnSurfaceSelectionChanged (  ) [protected, slot]
void QmitkSegmentationView::RenderingManagerReinitialized ( const itk::EventObject &   )

Definition at line 177 of file QmitkSegmentationView.cpp.

References CheckImageAlignment().

Referenced by Activated().

void QmitkSegmentationView::SetMultiWidget ( QmitkStdMultiWidget multiWidget ) [protected]

Definition at line 120 of file QmitkSegmentationView.cpp.

References QmitkFunctionality::GetDefaultDataStorage(), QmitkStdMultiWidget::GetSlicesRotator(), QmitkStdMultiWidget::GetSlicesSwiveller(), QmitkToolSelectionBox::GetToolManager(), QmitkSlicesInterpolator::Initialize(), m_Controls, Ui_QmitkSegmentationControls::m_ManualToolSelectionBox, m_MultiWidget, m_Parent, Ui_QmitkSegmentationControls::m_SlicesInterpolator, m_SlicesRotationObserverTag1, m_SlicesRotationObserverTag2, QmitkSlicesInterpolator::SetDataStorage(), and SliceRotation().

Referenced by StdMultiWidgetAvailable(), StdMultiWidgetClosed(), and StdMultiWidgetNotAvailable().

{
  if (m_MultiWidget)
  {
  mitk::SlicesCoordinator* coordinator = m_MultiWidget->GetSlicesRotator();
  if (coordinator)
  {
    coordinator->RemoveObserver( m_SlicesRotationObserverTag1 );
  }
  coordinator = m_MultiWidget->GetSlicesSwiveller();
  if (coordinator)
  {
    coordinator->RemoveObserver( m_SlicesRotationObserverTag2 );
  }
  }

  // save the current multiwidget as the working widget
  m_MultiWidget = multiWidget;

  if (m_MultiWidget)
  {
    mitk::SlicesCoordinator* coordinator = m_MultiWidget->GetSlicesRotator();
    if (coordinator)
    {
      itk::ReceptorMemberCommand<QmitkSegmentationView>::Pointer command2 = itk::ReceptorMemberCommand<QmitkSegmentationView>::New();
      command2->SetCallbackFunction( this, &QmitkSegmentationView::SliceRotation );
      m_SlicesRotationObserverTag1 = coordinator->AddObserver( mitk::SliceRotationEvent(), command2 );
    }

    coordinator = m_MultiWidget->GetSlicesSwiveller();
    if (coordinator)
    {
      itk::ReceptorMemberCommand<QmitkSegmentationView>::Pointer command2 = itk::ReceptorMemberCommand<QmitkSegmentationView>::New();
      command2->SetCallbackFunction( this, &QmitkSegmentationView::SliceRotation );
      m_SlicesRotationObserverTag2 = coordinator->AddObserver( mitk::SliceRotationEvent(), command2 );
    }
  }

  if (m_Parent)
  {
    m_Parent->setEnabled(m_MultiWidget);
  }

  // tell the interpolation about toolmanager and multiwidget (and data storage)
  if (m_Controls && m_MultiWidget)
  {
    mitk::ToolManager* toolManager = m_Controls->m_ManualToolSelectionBox->GetToolManager();
    m_Controls->m_SlicesInterpolator->SetDataStorage( *(this->GetDefaultDataStorage()));
    m_Controls->m_SlicesInterpolator->Initialize( toolManager, m_MultiWidget );
  }
}
void QmitkSegmentationView::SetToolManagerSelection ( const mitk::DataNode referenceData,
const mitk::DataNode workingData 
) [protected]

Definition at line 576 of file QmitkSegmentationView.cpp.

References Ui_QmitkSegmentationControls::btnNewSegmentation, CheckImageAlignment(), mitk::DataNode::GetName(), QmitkToolSelectionBox::GetToolManager(), Ui_QmitkSegmentationControls::lblReferenceImageSelectionWarning, Ui_QmitkSegmentationControls::lblSegImage, Ui_QmitkSegmentationControls::lblSegmentation, Ui_QmitkSegmentationControls::lblWorkingImageSelectionWarning, m_Controls, Ui_QmitkSegmentationControls::m_ManualToolSelectionBox, mitk::ToolManager::SetReferenceData(), mitk::ToolManager::SetWorkingData(), and Ui_QmitkSegmentationControls::widgetStack.

Referenced by OnSelectionChanged().

{
  // called as a result of new BlueBerry selections
  //   tells the ToolManager for manual segmentation about new selections
  //   updates GUI information about what the user should select
  mitk::ToolManager* toolManager = m_Controls->m_ManualToolSelectionBox->GetToolManager();
  toolManager->SetReferenceData(const_cast<mitk::DataNode*>(referenceData));
  toolManager->SetWorkingData(  const_cast<mitk::DataNode*>(workingData));

  
  // check original image
  m_Controls->btnNewSegmentation->setEnabled(referenceData != NULL);
  if (referenceData)
  {
    m_Controls->lblReferenceImageSelectionWarning->hide();
  }
  else
  {
    m_Controls->lblReferenceImageSelectionWarning->show();
    m_Controls->lblWorkingImageSelectionWarning->hide();
    m_Controls->lblSegImage->hide();
    m_Controls->lblSegmentation->hide();
  }

  // check, wheter reference image is aligned like render windows. Otherwise display a visible warning (because 2D tools will probably not work)
  CheckImageAlignment();

  // check segmentation
  if (referenceData)
  { 
    if (!workingData)
    {
      m_Controls->lblWorkingImageSelectionWarning->show();

      if( m_Controls->widgetStack->currentIndex() == 0 )
      {
        m_Controls->lblSegImage->hide();
        m_Controls->lblSegmentation->hide();
      }
    }
    else
    {
      m_Controls->lblWorkingImageSelectionWarning->hide();

      if( m_Controls->widgetStack->currentIndex() == 0 )
      {
        m_Controls->lblSegmentation->setText( workingData->GetName().c_str() );
        m_Controls->lblSegmentation->show();
        m_Controls->lblSegImage->show();
      }
    }
  }
}
void QmitkSegmentationView::SliceRotation ( const itk::EventObject &   )

Definition at line 182 of file QmitkSegmentationView.cpp.

References CheckImageAlignment().

Referenced by SetMultiWidget().

void QmitkSegmentationView::StdMultiWidgetAvailable ( QmitkStdMultiWidget stdMultiWidget ) [virtual]

Called when a StdMultiWidget is available. Should not be used anymore, see GetActiveStdMultiWidget()

See also:
GetActiveStdMultiWidget()

Reimplemented from QmitkFunctionality.

Definition at line 105 of file QmitkSegmentationView.cpp.

References SetMultiWidget().

{
  SetMultiWidget(&stdMultiWidget);
}
void QmitkSegmentationView::StdMultiWidgetClosed ( QmitkStdMultiWidget stdMultiWidget ) [virtual]

Called when a StdMultiWidget is available. Should not be used anymore, see GetActiveStdMultiWidget()

See also:
GetActiveStdMultiWidget()

Reimplemented from QmitkFunctionality.

Definition at line 115 of file QmitkSegmentationView.cpp.

References SetMultiWidget().

{
  SetMultiWidget(NULL);
}
void QmitkSegmentationView::StdMultiWidgetNotAvailable (  ) [virtual]

Called when no StdMultiWidget is available anymore. Should not be used anymore, see GetActiveStdMultiWidget()

See also:
GetActiveStdMultiWidget()

Reimplemented from QmitkFunctionality.

Definition at line 110 of file QmitkSegmentationView.cpp.

References SetMultiWidget().

{
  SetMultiWidget(NULL);
}
void QmitkSegmentationView::ToolboxStackPageChanged ( int  id ) [protected, slot]

Definition at line 364 of file QmitkSegmentationView.cpp.

References QmitkSlicesInterpolator::EnableInterpolation(), mitk::ToolManager::GetReferenceData(), QmitkToolSelectionBox::GetToolManager(), mitk::ToolManager::GetWorkingData(), Ui_QmitkSegmentationControls::lblSegImage, Ui_QmitkSegmentationControls::lblSegmentation, m_Controls, Ui_QmitkSegmentationControls::m_ManualToolSelectionBox, Ui_QmitkSegmentationControls::m_SlicesInterpolator, and Ui_QmitkSegmentationControls::widgetStack.

Referenced by CreateQtPartControl().

{
  // interpolation only with manual tools visible
  m_Controls->m_SlicesInterpolator->EnableInterpolation( id == 0 );

  if( id == 0 )
  {
    mitk::DataNode::Pointer workingData =   m_Controls->m_ManualToolSelectionBox->GetToolManager()->GetWorkingData(0);
    if( workingData.IsNotNull() )
    {
      m_Controls->lblSegmentation->setText( workingData->GetName().c_str() );
      m_Controls->lblSegImage->show();
      m_Controls->lblSegmentation->show();
    }
  }
  else
  {
    m_Controls->lblSegImage->hide();
    m_Controls->lblSegmentation->hide();
  }

  // this is just a workaround, should be removed when all tools support 3D+t
  if (id==2) // lesions
  {
    mitk::DataNode::Pointer node = m_Controls->m_ManualToolSelectionBox->GetToolManager()->GetReferenceData(0);
    if (node.IsNotNull())
    {
      mitk::Image::Pointer image = dynamic_cast<mitk::Image*>( node->GetData() );
      if (image.IsNotNull())
      {
        if (image->GetDimension()>3)
        {
          m_Controls->widgetStack->setCurrentIndex(0);
          QMessageBox::information(NULL,"Segmentation","Lesion segmentation is currently not supported for 4D images");
        }
      }
    }
  }
}
void QmitkSegmentationView::UpdateOrganList ( QStringList &  organColors,
const QString &  organname,
mitk::Color  colorname 
) [protected]

Definition at line 79 of file QmitkSegmentationOrganNamesHandling.cpp.

Referenced by CreateNewSegmentation().

{
  QString listElement( organname + QColor(color.GetRed() * 255 , color.GetGreen() * 255 , color.GetBlue() * 255).name() );
  
  // remove previous definition if necessary
  int oldIndex = organColors.indexOf( QRegExp(QRegExp::escape(organname) + "#......", Qt::CaseInsensitive));
  if (oldIndex < 0 || organColors.at(oldIndex) != listElement )
  {
    if (oldIndex >= 0)
    {
      organColors.removeAt( oldIndex );
    }

    // add colored organ name AND sort list
    organColors.append( listElement );
    organColors.sort();
  }
}

Member Data Documentation

QWidget* QmitkSegmentationView::m_Parent [protected]

Definition at line 138 of file QmitkSegmentationView.h.

Referenced by CreateQtPartControl(), and ~QmitkSegmentationView().

Definition at line 140 of file QmitkSegmentationView.h.

Referenced by Activated(), and Deactivated().

Definition at line 141 of file QmitkSegmentationView.h.

Referenced by SetMultiWidget().

Definition at line 142 of file QmitkSegmentationView.h.

Referenced by SetMultiWidget().


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