void QmitkSegmentationView::ForceDisplayPreferencesUponAllImages()
{
   if (!m_Parent)
   {
     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, nullptr parent))
   //   if no segmentation is selected, do nothing

   if (!m_Controls)
   {
     return; // might happen on initialization (preferences loaded)
   }

   mitk::ToolManager* toolManager = mitk::ToolManagerProvider::GetInstance()->GetToolManager();
   mitk::DataNode::Pointer referenceData = toolManager->GetReferenceData(0);
   mitk::DataNode::Pointer workingData =   toolManager->GetWorkingData(0);

   // 1.
   if (referenceData.IsNotNull())
   {
      // iterate all images
     mitk::DataStorage::SetOfObjects::ConstPointer allImages = this->GetDataStorage()->GetSubset(m_IsASegmentationImagePredicate);

      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();
}
void QmitkSegmentationView::NodeAdded(const mitk::DataNode *node)
{
  if (!m_IsOfTypeImagePredicate->CheckNode(node))
  {
    return;
  }

  itk::SimpleMemberCommand<QmitkSegmentationView>::Pointer command = itk::SimpleMemberCommand<QmitkSegmentationView>::New();
  command->SetCallbackFunction(this, &QmitkSegmentationView::OnVisiblePropertyChanged);
  m_WorkingDataObserverTags.insert(std::pair<mitk::DataNode*, unsigned long>(const_cast<mitk::DataNode*>(node), node->GetProperty("visible")->AddObserver(itk::ModifiedEvent(), command)));

  itk::SimpleMemberCommand<QmitkSegmentationView>::Pointer command2 = itk::SimpleMemberCommand<QmitkSegmentationView>::New();
  command2->SetCallbackFunction(this, &QmitkSegmentationView::OnBinaryPropertyChanged);
  m_BinaryPropertyObserverTags.insert(std::pair<mitk::DataNode*, unsigned long>(const_cast<mitk::DataNode*>(node), node->GetProperty("binary")->AddObserver(itk::ModifiedEvent(), command2)));

  ApplyDisplayOptions(const_cast<mitk::DataNode*>(node));
}
Esempio n. 3
0
void QmitkSegmentationView::OnWorkingNodeVisibilityChanged(/*const itk::Object* caller, const itk::EventObject& e*/)
{
  if (!m_Parent || !m_Parent->isVisible()) return;

  // The new selection behaviour is:
  //
  // When clicking on the checkbox of a segmentation the node will e selected and its reference node either
  // The previous selected segmentation (if there is one) will be deselected. Additionally a reinit on the
  // selected segmenation will be performed.
  // If more than one segmentation is selected the tools will be disabled.

  if (!m_Controls) return; // might happen on initialization (preferences loaded)
  mitk::DataNode::Pointer referenceDataNew;
  mitk::DataNode::Pointer workingData;

  bool workingNodeIsVisible (true);

  unsigned int numberOfSelectedSegmentations (0);

  // 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);

    bool isSegmentation(false);
    node->GetBoolProperty("binary", isSegmentation);
    if (node->IsSelected() && isSegmentation)
    {
      workingNodeIsVisible =  node->IsVisible(mitk::BaseRenderer::GetInstance( mitk::BaseRenderer::GetRenderWindowByName("stdmulti.widget1")));
      if (!workingNodeIsVisible)
        return;
      numberOfSelectedSegmentations++;

      workingData = node;

      if (this->GetDefaultDataStorage()->GetSources(node)->Size() != 0)
      {
          referenceDataNew = this->GetDefaultDataStorage()->GetSources(node)->ElementAt(0);
      }

      bool isBinary(false);

      //Find topmost source or first source which is no binary image
      while (referenceDataNew.IsNotNull() && this->GetDefaultDataStorage()->GetSources(referenceDataNew)->Size() != 0)
      {
        referenceDataNew = this->GetDefaultDataStorage()->GetSources(referenceDataNew)->ElementAt(0);

        referenceDataNew->GetBoolProperty("binary",isBinary);
        if (!isBinary)
            break;
      }

      if (workingNodeIsVisible && referenceDataNew)
      {
          //Since the binary property of a segmentation can be set to false and afterwards you can create a new segmentation out of it
          //->could lead to a deadloop
          NodeTagMapType::iterator searchIter = m_WorkingDataObserverTags.find( referenceDataNew );
          if ( searchIter != m_WorkingDataObserverTags.end())
          {
              referenceDataNew->GetProperty("visible")->RemoveObserver( (*searchIter).second );
          }
          referenceDataNew->SetVisibility(true);
      }

      //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(referenceDataNew) );

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

      continue;
    }
    if (workingData.IsNull() || (workingNodeIsVisible && node != referenceDataNew))
    {
      node->SetVisibility((false));
    }
  }