diff --git a/Plugins/org.mitk.gui.qt.multilabelsegmentation/src/QmitkMultiLabelSegmentationPreferencePage.cpp b/Plugins/org.mitk.gui.qt.multilabelsegmentation/src/QmitkMultiLabelSegmentationPreferencePage.cpp index 84034f3c57..0c32df3229 100644 --- a/Plugins/org.mitk.gui.qt.multilabelsegmentation/src/QmitkMultiLabelSegmentationPreferencePage.cpp +++ b/Plugins/org.mitk.gui.qt.multilabelsegmentation/src/QmitkMultiLabelSegmentationPreferencePage.cpp @@ -1,170 +1,170 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkMultiLabelSegmentationPreferencePage.h" #include #include #include #include #include #include #include #include #include #include QmitkMultiLabelSegmentationPreferencePage::QmitkMultiLabelSegmentationPreferencePage() : m_MainControl(0) , m_Initializing(false) { } QmitkMultiLabelSegmentationPreferencePage::~QmitkMultiLabelSegmentationPreferencePage() { } void QmitkMultiLabelSegmentationPreferencePage::Init(berry::IWorkbench::Pointer ) { } void QmitkMultiLabelSegmentationPreferencePage::CreateQtControl(QWidget* parent) { m_Initializing = true; berry::IPreferencesService* prefService = berry::Platform::GetPreferencesService(); m_SegmentationPreferencesNode = prefService->GetSystemPreferences()->Node("/org.mitk.views.multilabelsegmentation"); m_MainControl = new QWidget(parent); QVBoxLayout* displayOptionsLayout = new QVBoxLayout; m_RadioOutline = new QRadioButton( "Draw as outline", m_MainControl); displayOptionsLayout->addWidget( m_RadioOutline ); m_RadioOverlay = new QRadioButton( "Draw as transparent overlay", m_MainControl); displayOptionsLayout->addWidget( m_RadioOverlay ); QFormLayout *formLayout = new QFormLayout; formLayout->setHorizontalSpacing(8); formLayout->setVerticalSpacing(24); formLayout->addRow( "2D display", displayOptionsLayout ); m_VolumeRenderingCheckBox = new QCheckBox( "Show as volume rendering", m_MainControl ); formLayout->addRow( "3D display", m_VolumeRenderingCheckBox ); connect( m_VolumeRenderingCheckBox, SIGNAL(stateChanged(int)), this, SLOT(OnVolumeRenderingCheckboxChecked(int)) ); QFormLayout* surfaceLayout = new QFormLayout; surfaceLayout->setSpacing(8); m_SmoothingSpinBox = new QDoubleSpinBox(m_MainControl); m_SmoothingSpinBox->setMinimum(0.0); m_SmoothingSpinBox->setSingleStep(0.5); m_SmoothingSpinBox->setValue(0.1); m_SmoothingSpinBox->setToolTip("The Smoothing value is used as Sigma for a gaussian blur."); surfaceLayout->addRow("Smoothing value (mm)", m_SmoothingSpinBox); m_DecimationSpinBox = new QDoubleSpinBox(m_MainControl); m_DecimationSpinBox->setMinimum(0.0); m_DecimationSpinBox->setMaximum(0.99); m_DecimationSpinBox->setSingleStep(0.1); m_DecimationSpinBox->setValue(0.5); m_DecimationSpinBox->setToolTip("Valid range is [0, 1). High values increase decimation, especially when very close to 1. A value of 0 disables decimation."); surfaceLayout->addRow("Decimation rate", m_DecimationSpinBox); m_SelectionModeCheckBox = new QCheckBox("Enable auto-selection mode", m_MainControl); m_SelectionModeCheckBox->setToolTip("If checked the segmentation plugin ensures that only one segmentation and the according greyvalue image are visible at one time."); formLayout->addRow("Data node selection mode",m_SelectionModeCheckBox); formLayout->addRow("Smoothed surface creation", surfaceLayout); m_MainControl->setLayout(formLayout); this->Update(); m_Initializing = false; } QWidget* QmitkMultiLabelSegmentationPreferencePage::GetQtControl() const { return m_MainControl; } bool QmitkMultiLabelSegmentationPreferencePage::PerformOk() { m_SegmentationPreferencesNode->PutBool("draw outline", m_RadioOutline->isChecked()); m_SegmentationPreferencesNode->PutBool("volume rendering", m_VolumeRenderingCheckBox->isChecked()); m_SegmentationPreferencesNode->PutDouble("smoothing value", m_SmoothingSpinBox->value()); m_SegmentationPreferencesNode->PutDouble("decimation rate", m_DecimationSpinBox->value()); m_SegmentationPreferencesNode->PutBool("auto selection", m_SelectionModeCheckBox->isChecked()); return true; } void QmitkMultiLabelSegmentationPreferencePage::PerformCancel() { } void QmitkMultiLabelSegmentationPreferencePage::Update() { //m_EnableSingleEditing->setChecked(m_SegmentationPreferencesNode->GetBool("Single click property editing", true)); if (m_SegmentationPreferencesNode->GetBool("draw outline", true) ) { m_RadioOutline->setChecked( true ); } else { m_RadioOverlay->setChecked( true ); } m_VolumeRenderingCheckBox->setChecked( m_SegmentationPreferencesNode->GetBool("volume rendering", false) ); if (m_SegmentationPreferencesNode->GetBool("smoothing hint", true)) { m_SmoothingSpinBox->setDisabled(true); } else { m_SmoothingSpinBox->setEnabled(true); } - m_SelectionModeCheckBox->setChecked( m_SegmentationPreferencesNode->GetBool("auto selection", true) ); + m_SelectionModeCheckBox->setChecked( m_SegmentationPreferencesNode->GetBool("auto selection", false) ); m_SmoothingSpinBox->setValue(m_SegmentationPreferencesNode->GetDouble("smoothing value", 0.1)); m_DecimationSpinBox->setValue(m_SegmentationPreferencesNode->GetDouble("decimation rate", 0.5)); } void QmitkMultiLabelSegmentationPreferencePage::OnVolumeRenderingCheckboxChecked(int state) { if (m_Initializing) return; if ( state != Qt::Unchecked ) { QMessageBox::information(NULL, "Memory warning", "Turning on volume rendering of segmentations will make the application more memory intensive (and potentially prone to crashes).\n\n" "If you encounter out-of-memory problems, try turning off volume rendering again."); } } void QmitkMultiLabelSegmentationPreferencePage::OnSmoothingCheckboxChecked(int state) { if (state != Qt::Unchecked) m_SmoothingSpinBox->setDisabled(true); else m_SmoothingSpinBox->setEnabled(true); } diff --git a/Plugins/org.mitk.gui.qt.multilabelsegmentation/src/internal/QmitkMultiLabelSegmentationView.cpp b/Plugins/org.mitk.gui.qt.multilabelsegmentation/src/internal/QmitkMultiLabelSegmentationView.cpp index 5574c18133..bc648337b3 100644 --- a/Plugins/org.mitk.gui.qt.multilabelsegmentation/src/internal/QmitkMultiLabelSegmentationView.cpp +++ b/Plugins/org.mitk.gui.qt.multilabelsegmentation/src/internal/QmitkMultiLabelSegmentationView.cpp @@ -1,1036 +1,1138 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkMultiLabelSegmentationView.h" // blueberry #include #include // mitk #include "mitkApplicationCursor.h" #include "mitkLabelSetImage.h" #include "mitkStatusBar.h" #include "mitkToolManagerProvider.h" //#include "mitkSegmentationObjectFactory.h" #include "mitkInteractionEventObserver.h" #include "mitkPlanePositionManager.h" #include "mitkPluginActivator.h" #include "mitkSegTool2D.h" #include "mitkDICOMSegmentationPropertyHelper.cpp" // Qmitk #include "QmitkNewSegmentationDialog.h" #include "QmitkRenderWindow.h" #include "QmitkSegmentationOrganNamesHandling.cpp" // us #include #include #include #include #include // Qt #include #include #include #include #include "tinyxml.h" #include const std::string QmitkMultiLabelSegmentationView::VIEW_ID = "org.mitk.views.multilabelsegmentation"; QmitkMultiLabelSegmentationView::QmitkMultiLabelSegmentationView() : m_Parent(NULL), m_IRenderWindowPart(NULL), m_ReferenceNode(NULL), m_ToolManager(NULL), m_WorkingNode(NULL), + m_AutoSelectionEnabled(false), m_MouseCursorSet(false) { m_SegmentationPredicate = mitk::NodePredicateAnd::New(); m_SegmentationPredicate->AddPredicate(mitk::TNodePredicateDataType::New()); m_SegmentationPredicate->AddPredicate(mitk::NodePredicateNot::New(mitk::NodePredicateProperty::New("helper object"))); mitk::TNodePredicateDataType::Pointer isImage = mitk::TNodePredicateDataType::New(); mitk::NodePredicateProperty::Pointer isBinary = mitk::NodePredicateProperty::New("binary", mitk::BoolProperty::New(true)); mitk::NodePredicateAnd::Pointer isMask = mitk::NodePredicateAnd::New(isBinary, isImage); mitk::NodePredicateDataType::Pointer isDwi = mitk::NodePredicateDataType::New("DiffusionImage"); mitk::NodePredicateDataType::Pointer isDti = mitk::NodePredicateDataType::New("TensorImage"); mitk::NodePredicateDataType::Pointer isQbi = mitk::NodePredicateDataType::New("QBallImage"); mitk::NodePredicateOr::Pointer validImages = mitk::NodePredicateOr::New(); validImages->AddPredicate(isImage); validImages->AddPredicate(isDwi); validImages->AddPredicate(isDti); validImages->AddPredicate(isQbi); m_ReferencePredicate = mitk::NodePredicateAnd::New(); m_ReferencePredicate->AddPredicate(validImages); m_ReferencePredicate->AddPredicate(mitk::NodePredicateNot::New(m_SegmentationPredicate)); m_ReferencePredicate->AddPredicate(mitk::NodePredicateNot::New(isMask)); m_ReferencePredicate->AddPredicate(mitk::NodePredicateNot::New(mitk::NodePredicateProperty::New("helper object"))); } QmitkMultiLabelSegmentationView::~QmitkMultiLabelSegmentationView() { // m_ToolManager->ActivateTool(-1); /* todo: check this m_Controls.m_SliceBasedInterpolatorWidget->EnableInterpolation(false); ctkPluginContext* context = mitk::PluginActivator::getContext(); ctkServiceReference ppmRef = context->getServiceReference(); mitk::PlanePositionManagerService* service = context->getService(ppmRef); service->RemoveAllPlanePositions(); context->ungetService(ppmRef); */ // m_ToolManager->SetReferenceData(NULL); // m_ToolManager->SetWorkingData(NULL); // m_ServiceRegistration.Unregister(); // Loose LabelSetConnections OnLooseLabelSetConnection(); } void QmitkMultiLabelSegmentationView::CreateQtPartControl(QWidget *parent) { // setup the basic GUI of this view m_Parent = parent; m_Controls.setupUi(parent); // *------------------------ // * DATA SELECTION WIDGETS // *------------------------ m_Controls.m_cbReferenceNodeSelector->SetAutoSelectNewItems(true); m_Controls.m_cbReferenceNodeSelector->SetPredicate(m_ReferencePredicate); m_Controls.m_cbReferenceNodeSelector->SetDataStorage(this->GetDataStorage()); m_Controls.m_cbWorkingNodeSelector->SetAutoSelectNewItems(true); m_Controls.m_cbWorkingNodeSelector->SetPredicate(m_SegmentationPredicate); m_Controls.m_cbWorkingNodeSelector->SetDataStorage(this->GetDataStorage()); connect(m_Controls.m_cbReferenceNodeSelector, SIGNAL(OnSelectionChanged(const mitk::DataNode *)), this, SLOT(OnReferenceSelectionChanged(const mitk::DataNode *))); connect(m_Controls.m_cbWorkingNodeSelector, SIGNAL(OnSelectionChanged(const mitk::DataNode *)), this, SLOT(OnSegmentationSelectionChanged(const mitk::DataNode *))); // *------------------------ // * ToolManager // *------------------------ m_ToolManager = mitk::ToolManagerProvider::GetInstance()->GetToolManager(); assert(m_ToolManager); m_ToolManager->SetDataStorage(*(this->GetDataStorage())); m_ToolManager->InitializeTools(); // use the same ToolManager instance for our 3D Tools m_Controls.m_ManualToolSelectionBox3D->SetToolManager(*m_ToolManager); // *------------------------ // * LabelSetWidget // *------------------------ m_Controls.m_LabelSetWidget->SetDataStorage(this->GetDataStorage()); m_Controls.m_LabelSetWidget->SetOrganColors(mitk::OrganNamesHandling::GetDefaultOrganColorString()); m_Controls.m_LabelSetWidget->hide(); // *------------------------ // * Interpolation // *------------------------ m_Controls.m_SurfaceBasedInterpolatorWidget->SetDataStorage(*(this->GetDataStorage())); m_Controls.m_SliceBasedInterpolatorWidget->SetDataStorage(*(this->GetDataStorage())); connect(m_Controls.m_cbInterpolation, SIGNAL(activated(int)), this, SLOT(OnInterpolationSelectionChanged(int))); m_Controls.m_cbInterpolation->setCurrentIndex(0); m_Controls.m_swInterpolation->hide(); // *------------------------ // * ToolSelection 2D // *------------------------ m_Controls.m_ManualToolSelectionBox2D->SetGenerateAccelerators(true); m_Controls.m_ManualToolSelectionBox2D->SetToolGUIArea(m_Controls.m_ManualToolGUIContainer2D); m_Controls.m_ManualToolSelectionBox2D->SetDisplayedToolGroups( "Add Subtract Fill Erase Paint Wipe 'Region Growing' FastMarching2D Correction 'Live Wire'"); // todo: "Correction // 'Live Wire'" m_Controls.m_ManualToolSelectionBox2D->SetEnabledMode( QmitkToolSelectionBox::EnabledWithReferenceAndWorkingDataVisible); connect(m_Controls.m_ManualToolSelectionBox2D, SIGNAL(ToolSelected(int)), this, SLOT(OnManualTool2DSelected(int))); // *------------------------ // * ToolSelection 3D // *------------------------ m_Controls.m_ManualToolSelectionBox3D->SetGenerateAccelerators(true); m_Controls.m_ManualToolSelectionBox3D->SetToolGUIArea(m_Controls.m_ManualToolGUIContainer3D); m_Controls.m_ManualToolSelectionBox3D->SetDisplayedToolGroups( "Threshold 'Two Thresholds' 'Auto Threshold' 'Multiple Otsu'"); // todo add : FastMarching3D RegionGrowing Watershed m_Controls.m_ManualToolSelectionBox3D->SetLayoutColumns(2); m_Controls.m_ManualToolSelectionBox3D->SetEnabledMode( QmitkToolSelectionBox::EnabledWithReferenceAndWorkingDataVisible); // *------------------------* // * Connect PushButtons (pb) // *------------------------* connect(m_Controls.m_pbNewLabel, SIGNAL(clicked()), this, SLOT(OnNewLabel())); connect(m_Controls.m_pbNewSegmentationSession, SIGNAL(clicked()), this, SLOT(OnNewSegmentationSession())); connect(m_Controls.m_pbShowLabelTable, SIGNAL(toggled(bool)), this, SLOT(OnShowLabelTable(bool))); // *------------------------* // * Connect LabelSetWidget // *------------------------* connect(m_Controls.m_LabelSetWidget, SIGNAL(goToLabel(const mitk::Point3D &)), this, SLOT(OnGoToLabel(const mitk::Point3D &))); connect(m_Controls.m_LabelSetWidget, SIGNAL(resetView()), this, SLOT(OnResetView())); // *------------------------* // * DATA SLECTION WIDGET // *------------------------* m_IRenderWindowPart = this->GetRenderWindowPart(); if (m_IRenderWindowPart) { QList controllers; controllers.push_back(m_IRenderWindowPart->GetQmitkRenderWindow("axial")->GetSliceNavigationController()); controllers.push_back(m_IRenderWindowPart->GetQmitkRenderWindow("sagittal")->GetSliceNavigationController()); controllers.push_back(m_IRenderWindowPart->GetQmitkRenderWindow("coronal")->GetSliceNavigationController()); m_Controls.m_SliceBasedInterpolatorWidget->SetSliceNavigationControllers(controllers); // m_Controls.m_LabelSetWidget->SetRenderWindowPart(this->m_IRenderWindowPart); } // this->InitializeListeners(); connect(m_Controls.m_btAddLayer, SIGNAL(clicked()), this, SLOT(OnAddLayer())); connect(m_Controls.m_btDeleteLayer, SIGNAL(clicked()), this, SLOT(OnDeleteLayer())); connect(m_Controls.m_btPreviousLayer, SIGNAL(clicked()), this, SLOT(OnPreviousLayer())); connect(m_Controls.m_btNextLayer, SIGNAL(clicked()), this, SLOT(OnNextLayer())); connect(m_Controls.m_btLockExterior, SIGNAL(toggled(bool)), this, SLOT(OnLockExteriorToggled(bool))); connect(m_Controls.m_cbActiveLayer, SIGNAL(currentIndexChanged(int)), this, SLOT(OnChangeLayer(int))); m_Controls.m_btAddLayer->setEnabled(false); m_Controls.m_btDeleteLayer->setEnabled(false); m_Controls.m_btNextLayer->setEnabled(false); m_Controls.m_btPreviousLayer->setEnabled(false); m_Controls.m_cbActiveLayer->setEnabled(false); m_Controls.m_pbNewLabel->setEnabled(false); m_Controls.m_btLockExterior->setEnabled(false); m_Controls.m_pbShowLabelTable->setEnabled(false); // Make sure the GUI notices if appropriate data is already present on creation this->OnReferenceSelectionChanged(m_Controls.m_cbReferenceNodeSelector->GetSelectedNode()); this->OnSegmentationSelectionChanged(m_Controls.m_cbWorkingNodeSelector->GetSelectedNode()); } void QmitkMultiLabelSegmentationView::Activated() { m_ToolManager->SetReferenceData(m_Controls.m_cbReferenceNodeSelector->GetSelectedNode()); m_ToolManager->SetWorkingData(m_Controls.m_cbWorkingNodeSelector->GetSelectedNode()); } void QmitkMultiLabelSegmentationView::Deactivated() { // Not yet implemented } void QmitkMultiLabelSegmentationView::Visible() { // Not yet implemented } void QmitkMultiLabelSegmentationView::Hidden() { // Not yet implemented } -void QmitkMultiLabelSegmentationView::InitializeListeners() -{ - if (m_Interactor.IsNull()) - { - us::Module *module = us::GetModuleContext()->GetModule(); - std::vector resources = module->FindResources("/", "*", true); - for (std::vector::iterator iter = resources.begin(); iter != resources.end(); ++iter) - { - MITK_INFO << iter->GetResourcePath(); - } - - m_Interactor = mitk::SegmentationInteractor::New(); - if (!m_Interactor->LoadStateMachine("SegmentationInteraction.xml", module)) - { - MITK_WARN << "Error loading state machine"; - } - - if (!m_Interactor->SetEventConfig("ConfigSegmentation.xml", module)) - { - MITK_WARN << "Error loading state machine configuration"; - } - - // Register as listener via micro services - us::ServiceProperties props; - props["name"] = std::string("SegmentationInteraction"); - m_ServiceRegistration = - us::GetModuleContext()->RegisterService(m_Interactor.GetPointer(), props); - } -} - -void QmitkMultiLabelSegmentationView::SetFocus() -{ -} - -bool QmitkMultiLabelSegmentationView::CheckForSameGeometry(const mitk::Image *image1, const mitk::Image *image2) const -{ - bool isSameGeometry(true); - - if (image1 && image2) - { - mitk::BaseGeometry::Pointer geo1 = image1->GetGeometry(); - mitk::BaseGeometry::Pointer geo2 = image2->GetGeometry(); - - isSameGeometry = isSameGeometry && mitk::Equal(geo1->GetOrigin(), geo2->GetOrigin()); - isSameGeometry = isSameGeometry && mitk::Equal(geo1->GetExtent(0), geo2->GetExtent(0)); - isSameGeometry = isSameGeometry && mitk::Equal(geo1->GetExtent(1), geo2->GetExtent(1)); - isSameGeometry = isSameGeometry && mitk::Equal(geo1->GetExtent(2), geo2->GetExtent(2)); - isSameGeometry = isSameGeometry && mitk::Equal(geo1->GetSpacing(), geo2->GetSpacing()); - isSameGeometry = isSameGeometry && mitk::MatrixEqualElementWise(geo1->GetIndexToWorldTransform()->GetMatrix(), - geo2->GetIndexToWorldTransform()->GetMatrix()); - - return isSameGeometry; - } - else - { - return false; - } -} - -void QmitkMultiLabelSegmentationView::RenderWindowPartActivated(mitk::IRenderWindowPart *renderWindowPart) -{ - if (m_IRenderWindowPart != renderWindowPart) - { - m_IRenderWindowPart = renderWindowPart; - m_Parent->setEnabled(true); - - QList controllers; - controllers.push_back(m_IRenderWindowPart->GetQmitkRenderWindow("axial")->GetSliceNavigationController()); - controllers.push_back(m_IRenderWindowPart->GetQmitkRenderWindow("sagittal")->GetSliceNavigationController()); - controllers.push_back(m_IRenderWindowPart->GetQmitkRenderWindow("coronal")->GetSliceNavigationController()); - m_Controls.m_SliceBasedInterpolatorWidget->SetSliceNavigationControllers(controllers); - } -} - -void QmitkMultiLabelSegmentationView::RenderWindowPartDeactivated(mitk::IRenderWindowPart * /*renderWindowPart*/) -{ - m_ToolManager->ActivateTool(-1); - m_IRenderWindowPart = 0; - m_Parent->setEnabled(false); -} - int QmitkMultiLabelSegmentationView::GetSizeFlags(bool width) { if (!width) { return berry::Constants::MIN | berry::Constants::MAX | berry::Constants::FILL; } else { return 0; } } int QmitkMultiLabelSegmentationView::ComputePreferredSize(bool width, int /*availableParallel*/, int /*availablePerpendicular*/, int preferredResult) { if (width == false) { return 100; } else { return preferredResult; } } -void QmitkMultiLabelSegmentationView::UpdateControls() +/************************************************************************/ +/* protected slots */ +/************************************************************************/ +void QmitkMultiLabelSegmentationView::OnManualTool2DSelected(int id) { - mitk::DataNode *referenceNode = m_ToolManager->GetReferenceData(0); - bool hasReferenceNode = referenceNode != NULL; + this->ResetMouseCursor(); + mitk::StatusBar::GetInstance()->DisplayText(""); - mitk::DataNode *workingNode = m_ToolManager->GetWorkingData(0); - bool hasValidWorkingNode = workingNode != NULL; + if (id >= 0) + { + std::string text = "Active Tool: \""; + text += m_ToolManager->GetToolById(id)->GetName(); + text += "\""; + mitk::StatusBar::GetInstance()->DisplayText(text.c_str()); - m_Controls.m_pbNewLabel->setEnabled(false); - m_Controls.m_gbInterpolation->setEnabled(false); - m_Controls.m_SliceBasedInterpolatorWidget->setEnabled(false); - m_Controls.m_SurfaceBasedInterpolatorWidget->setEnabled(false); - m_Controls.m_LabelSetWidget->setEnabled(false); - m_Controls.m_btAddLayer->setEnabled(false); - m_Controls.m_btDeleteLayer->setEnabled(false); - m_Controls.m_cbActiveLayer->setEnabled(false); - m_Controls.m_btPreviousLayer->setEnabled(false); - m_Controls.m_btNextLayer->setEnabled(false); - m_Controls.m_btLockExterior->setChecked(false); - m_Controls.m_btLockExterior->setEnabled(false); - m_Controls.m_pbShowLabelTable->setChecked(false); - m_Controls.m_pbShowLabelTable->setEnabled(false); + us::ModuleResource resource = m_ToolManager->GetToolById(id)->GetCursorIconResource(); + if (resource.IsValid()) + this->SetMouseCursor(resource, 0, 0); + } +} - m_Controls.m_ManualToolSelectionBox3D->SetEnabledMode( - QmitkToolSelectionBox::EnabledWithReferenceAndWorkingDataVisible); - m_Controls.m_ManualToolSelectionBox2D->SetEnabledMode( - QmitkToolSelectionBox::EnabledWithReferenceAndWorkingDataVisible); +void QmitkMultiLabelSegmentationView::OnNewLabel() +{ + m_ToolManager->ActivateTool(-1); - if (hasValidWorkingNode) + mitk::DataNode* workingNode = m_ToolManager->GetWorkingData(0); + if (!workingNode) { - // TODO adapt tool manager so that this check is done there, e.g. convenience function - mitk::LabelSetImage *workingImage = dynamic_cast(workingNode->GetData()); - hasValidWorkingNode = workingImage != nullptr; - if (hasValidWorkingNode) - { - m_Controls.m_pbNewLabel->setEnabled(true); - m_Controls.m_btLockExterior->setEnabled(true); - m_Controls.m_pbShowLabelTable->setEnabled(true); - m_Controls.m_gbInterpolation->setEnabled(true); - m_Controls.m_SliceBasedInterpolatorWidget->setEnabled(true); - m_Controls.m_SurfaceBasedInterpolatorWidget->setEnabled(true); - m_Controls.m_LabelSetWidget->setEnabled(true); - m_Controls.m_btAddLayer->setEnabled(true); - - int activeLayer = workingImage->GetActiveLayer(); - int numberOfLayers = workingImage->GetNumberOfLayers(); - - m_Controls.m_cbActiveLayer->blockSignals(true); - m_Controls.m_cbActiveLayer->clear(); - for (unsigned int lidx = 0; lidx < workingImage->GetNumberOfLayers(); ++lidx) - m_Controls.m_cbActiveLayer->addItem(QString::number(lidx)); - m_Controls.m_cbActiveLayer->setCurrentIndex(activeLayer); - m_Controls.m_cbActiveLayer->blockSignals(false); + QMessageBox::information( + m_Parent, "New Segmentation Session", "Please load and select a patient image before starting some action."); + return; + } - m_Controls.m_cbActiveLayer->setEnabled(numberOfLayers > 1); - m_Controls.m_btDeleteLayer->setEnabled(numberOfLayers > 1); - m_Controls.m_btPreviousLayer->setEnabled(activeLayer > 0); - m_Controls.m_btNextLayer->setEnabled(activeLayer != numberOfLayers - 1); + mitk::LabelSetImage* workingImage = dynamic_cast(workingNode->GetData()); + if (!workingImage) + { + QMessageBox::information( + m_Parent, "New Segmentation Session", "Please load and select a patient image before starting some action."); + return; + } - m_Controls.m_btLockExterior->setChecked(workingImage->GetLabel(0, activeLayer)->GetLocked()); - m_Controls.m_pbShowLabelTable->setChecked(workingImage->GetNumberOfLabels() > 1 /*1st is exterior*/); + QmitkNewSegmentationDialog* dialog = new QmitkNewSegmentationDialog(m_Parent); + dialog->SetSuggestionList(mitk::OrganNamesHandling::GetDefaultOrganColorString()); + dialog->setWindowTitle("New Label"); - // MLI TODO - // m_Controls.m_ManualToolSelectionBox2D->SetEnabledMode(QmitkToolSelectionBox::EnabledWithWorkingDataVisible); - } + int dialogReturnValue = dialog->exec(); + if (dialogReturnValue == QDialog::Rejected) + { + return; } - if (hasValidWorkingNode && hasReferenceNode) + QString segName = dialog->GetSegmentationName(); + if (segName.isEmpty()) { - int layer = -1; - referenceNode->GetIntProperty("layer", layer); - workingNode->SetIntProperty("layer", layer + 1); + segName = "Unnamed"; } + workingImage->GetActiveLabelSet()->AddLabel(segName.toStdString(), dialog->GetColor()); + // Set specific DICOM SEG properties for the label + mitk::DICOMSegmentationPropertyHandler::GetDICOMSegmentProperties( + workingImage->GetActiveLabel(workingImage->GetActiveLayer())); - this->RequestRenderWindowUpdate(mitk::RenderingManager::REQUEST_UPDATE_ALL); + UpdateControls(); + m_Controls.m_LabelSetWidget->ResetAllTableWidgetItems(); + + mitk::RenderingManager::GetInstance()->InitializeViews(workingNode->GetData()->GetTimeGeometry(), mitk::RenderingManager::REQUEST_UPDATE_ALL, true); +} + +void QmitkMultiLabelSegmentationView::OnShowLabelTable(bool value) +{ + if (value) + m_Controls.m_LabelSetWidget->show(); + else + m_Controls.m_LabelSetWidget->hide(); } void QmitkMultiLabelSegmentationView::OnNewSegmentationSession() { mitk::DataNode *referenceNode = m_Controls.m_cbReferenceNodeSelector->GetSelectedNode(); if (!referenceNode) { QMessageBox::information( m_Parent, "New Segmentation Session", "Please load and select a patient image before starting some action."); return; } m_ToolManager->ActivateTool(-1); - mitk::Image *referenceImage = dynamic_cast(referenceNode->GetData()); + mitk::Image* referenceImage = dynamic_cast(referenceNode->GetData()); assert(referenceImage); QString newName = QString::fromStdString(referenceNode->GetName()); newName.append("-labels"); bool ok = false; newName = QInputDialog::getText(m_Parent, "New Segmentation Session", "New name:", QLineEdit::Normal, newName, &ok); if (!ok) + { return; - + } this->WaitCursorOn(); mitk::LabelSetImage::Pointer workingImage = mitk::LabelSetImage::New(); - try { workingImage->Initialize(referenceImage); } - catch (mitk::Exception &e) + catch (mitk::Exception& e) { this->WaitCursorOff(); MITK_ERROR << "Exception caught: " << e.GetDescription(); QMessageBox::information(m_Parent, "New Segmentation Session", "Could not create a new segmentation session.\n"); return; } this->WaitCursorOff(); mitk::DataNode::Pointer workingNode = mitk::DataNode::New(); workingNode->SetData(workingImage); workingNode->SetName(newName.toStdString()); workingImage->GetExteriorLabel()->SetProperty("name.parent", mitk::StringProperty::New(referenceNode->GetName().c_str())); workingImage->GetExteriorLabel()->SetProperty("name.image", mitk::StringProperty::New(newName.toStdString().c_str())); // Set DICOM SEG properties for segmentation session mitk::PropertyList::Pointer dicomSegPropertyList = mitk::DICOMSegmentationPropertyHandler::GetDICOMSegmentationProperties(referenceImage->GetPropertyList()); workingImage->GetPropertyList()->ConcatenatePropertyList(dicomSegPropertyList); if (!GetDataStorage()->Exists(workingNode)) { GetDataStorage()->Add(workingNode, referenceNode); } OnNewLabel(); } -void QmitkMultiLabelSegmentationView::OnNewLabel() +void QmitkMultiLabelSegmentationView::OnGoToLabel(const mitk::Point3D& pos) +{ + if (m_IRenderWindowPart) + m_IRenderWindowPart->SetSelectedPosition(pos); +} + +void QmitkMultiLabelSegmentationView::OnResetView() +{ + if (m_IRenderWindowPart) + m_IRenderWindowPart->ForceImmediateUpdate(); +} + +void QmitkMultiLabelSegmentationView::OnAddLayer() { m_ToolManager->ActivateTool(-1); - mitk::DataNode *workingNode = m_ToolManager->GetWorkingData(0); - if (!workingNode) + mitk::DataNode* workingNode = m_ToolManager->GetWorkingData(0); + assert(workingNode); + + mitk::LabelSetImage* workingImage = dynamic_cast(workingNode->GetData()); + assert(workingImage); + + QString question = "Do you really want to add a layer to the current segmentation session?"; + QMessageBox::StandardButton answerButton = QMessageBox::question( + m_Controls.m_LabelSetWidget, "Add layer", question, QMessageBox::Yes | QMessageBox::Cancel, QMessageBox::Yes); + + if (answerButton != QMessageBox::Yes) return; + + int newLabelSetId = -1; + try { - QMessageBox::information( - m_Parent, "New Segmentation Session", "Please load and select a patient image before starting some action."); - return; + WaitCursorOn(); + newLabelSetId = workingImage->AddLayer(); + WaitCursorOff(); } - - mitk::LabelSetImage *workingImage = dynamic_cast(workingNode->GetData()); - if (!workingImage) + catch ( mitk::Exception& e ) { + WaitCursorOff(); + MITK_ERROR << "Exception caught: " << e.GetDescription(); QMessageBox::information( - m_Parent, "New Segmentation Session", "Please load and select a patient image before starting some action."); + m_Controls.m_LabelSetWidget, "Add Layer", "Could not add a new layer. See error log for details.\n"); return; } - QmitkNewSegmentationDialog* dialog = new QmitkNewSegmentationDialog(m_Parent); - dialog->SetSuggestionList(mitk::OrganNamesHandling::GetDefaultOrganColorString()); - dialog->setWindowTitle("New Label"); + OnNewLabel(); +} - int dialogReturnValue = dialog->exec(); - if (dialogReturnValue == QDialog::Rejected) +void QmitkMultiLabelSegmentationView::OnDeleteLayer() +{ + m_ToolManager->ActivateTool(-1); + + mitk::DataNode* workingNode = m_ToolManager->GetWorkingData(0); + assert(workingNode); + + mitk::LabelSetImage* workingImage = dynamic_cast(workingNode->GetData()); + assert(workingImage); + + if (workingImage->GetNumberOfLayers() < 2) + return; + + QString question = "Do you really want to delete the current layer?"; + + QMessageBox::StandardButton answerButton = QMessageBox::question( + m_Controls.m_LabelSetWidget, "Delete layer", question, QMessageBox::Yes | QMessageBox::Cancel, QMessageBox::Yes); + + if (answerButton != QMessageBox::Yes) { return; } - QString segName = dialog->GetSegmentationName(); - if (segName.isEmpty()) + try { - segName = "Unnamed"; + this->WaitCursorOn(); + workingImage->RemoveLayer(); + this->WaitCursorOff(); + } + catch (mitk::Exception& e) + { + this->WaitCursorOff(); + MITK_ERROR << "Exception caught: " << e.GetDescription(); + QMessageBox::information(m_Controls.m_LabelSetWidget, "Delete Layer", + "Could not delete the currently active layer. See error log for details.\n"); + return; } - - workingImage->GetActiveLabelSet()->AddLabel(segName.toStdString(), dialog->GetColor()); - // Set specific DICOM SEG properties for the label - mitk::DICOMSegmentationPropertyHandler::GetDICOMSegmentProperties( - workingImage->GetActiveLabel(workingImage->GetActiveLayer())); UpdateControls(); m_Controls.m_LabelSetWidget->ResetAllTableWidgetItems(); - - mitk::RenderingManager::GetInstance()->InitializeViews(workingNode->GetData()->GetTimeGeometry(), mitk::RenderingManager::REQUEST_UPDATE_ALL, true); } -void QmitkMultiLabelSegmentationView::OnShowLabelTable(bool value) -{ - if (value) - m_Controls.m_LabelSetWidget->show(); - else - m_Controls.m_LabelSetWidget->hide(); -} - -void QmitkMultiLabelSegmentationView::OnNextLayer() +void QmitkMultiLabelSegmentationView::OnPreviousLayer() { m_ToolManager->ActivateTool(-1); mitk::DataNode *workingNode = m_ToolManager->GetWorkingData(0); assert(workingNode); mitk::LabelSetImage *workingImage = dynamic_cast(workingNode->GetData()); assert(workingImage); - OnChangeLayer(workingImage->GetActiveLayer() + 1); + OnChangeLayer(workingImage->GetActiveLayer() - 1); } -void QmitkMultiLabelSegmentationView::OnPreviousLayer() +void QmitkMultiLabelSegmentationView::OnNextLayer() { m_ToolManager->ActivateTool(-1); mitk::DataNode *workingNode = m_ToolManager->GetWorkingData(0); assert(workingNode); mitk::LabelSetImage *workingImage = dynamic_cast(workingNode->GetData()); assert(workingImage); - OnChangeLayer(workingImage->GetActiveLayer() - 1); + OnChangeLayer(workingImage->GetActiveLayer() + 1); } void QmitkMultiLabelSegmentationView::OnChangeLayer(int layer) { m_ToolManager->ActivateTool(-1); mitk::DataNode *workingNode = m_ToolManager->GetWorkingData(0); assert(workingNode); mitk::LabelSetImage *workingImage = dynamic_cast(workingNode->GetData()); assert(workingImage); this->WaitCursorOn(); workingImage->SetActiveLayer(layer); this->WaitCursorOff(); UpdateControls(); m_Controls.m_LabelSetWidget->ResetAllTableWidgetItems(); } -void QmitkMultiLabelSegmentationView::OnDeleteLayer() +void QmitkMultiLabelSegmentationView::OnDeactivateActiveTool() { m_ToolManager->ActivateTool(-1); +} - mitk::DataNode *workingNode = m_ToolManager->GetWorkingData(0); +void QmitkMultiLabelSegmentationView::OnLockExteriorToggled(bool checked) +{ + mitk::DataNode* workingNode = m_ToolManager->GetWorkingData(0); assert(workingNode); - mitk::LabelSetImage *workingImage = dynamic_cast(workingNode->GetData()); + mitk::LabelSetImage* workingImage = dynamic_cast(workingNode->GetData()); assert(workingImage); - if (workingImage->GetNumberOfLayers() < 2) - return; - - QString question = "Do you really want to delete the current layer?"; + workingImage->GetLabel(0)->SetLocked(checked); +} - QMessageBox::StandardButton answerButton = QMessageBox::question( - m_Controls.m_LabelSetWidget, "Delete layer", question, QMessageBox::Yes | QMessageBox::Cancel, QMessageBox::Yes); +void QmitkMultiLabelSegmentationView::OnReferenceSelectionChanged(const mitk::DataNode* node) +{ + m_ToolManager->ActivateTool(-1); - if (answerButton != QMessageBox::Yes) - return; + m_ReferenceNode = const_cast(node); + m_ToolManager->SetReferenceData(m_ReferenceNode); - try + if (m_ReferenceNode.IsNotNull()) { - this->WaitCursorOn(); - workingImage->RemoveLayer(); - this->WaitCursorOff(); - } - catch (mitk::Exception& e) - { - this->WaitCursorOff(); - MITK_ERROR << "Exception caught: " << e.GetDescription(); - QMessageBox::information(m_Controls.m_LabelSetWidget, - "Delete Layer", - "Could not delete the currently active layer. See error log for details.\n"); - return; + if (m_AutoSelectionEnabled) + { + // if an image is selected find a possible working / segmentation image + mitk::DataStorage::SetOfObjects::ConstPointer derivations = this->GetDataStorage()->GetDerivations(m_ReferenceNode, m_SegmentationPredicate); + if (derivations->Size() != 0) + { + // use the first segmentation child node + m_WorkingNode = derivations->ElementAt(0); + m_ToolManager->SetWorkingData(m_WorkingNode); + + m_Controls.m_cbWorkingNodeSelector->blockSignals(true); + m_Controls.m_cbWorkingNodeSelector->SetSelectedNode(m_WorkingNode); + m_Controls.m_cbWorkingNodeSelector->blockSignals(false); + } + else if (derivations->size() == 0) + { + m_Controls.m_cbWorkingNodeSelector->setCurrentIndex(-1); + } + + // hide all image and segmentation nodes to later show only the automatically selected ones + mitk::DataStorage::SetOfObjects::ConstPointer patientNodes = GetDataStorage()->GetSubset(m_ReferencePredicate); + for (mitk::DataStorage::SetOfObjects::const_iterator iter = patientNodes->begin(); iter != patientNodes->end(); ++iter) + { + (*iter)->SetVisibility(false); + } + + mitk::DataStorage::SetOfObjects::ConstPointer segmentationNodes = GetDataStorage()->GetSubset(m_SegmentationPredicate); + for (mitk::DataStorage::SetOfObjects::const_iterator iter = segmentationNodes->begin(); iter != segmentationNodes->end(); ++iter) + { + (*iter)->SetVisibility(false); + } + } + m_ReferenceNode->SetVisibility(true); + + // check match of segmentation and reference image geometries + if (m_WorkingNode.IsNotNull()) + { + mitk::Image* workingImage = dynamic_cast(m_WorkingNode->GetData()); + assert(workingImage); + + mitk::Image* referenceImage = dynamic_cast(node->GetData()); + assert(referenceImage); + + if (!this->CheckForSameGeometry(referenceImage, workingImage)) + { + return; + } + m_WorkingNode->SetVisibility(true); + } } UpdateControls(); - m_Controls.m_LabelSetWidget->ResetAllTableWidgetItems(); + if (m_WorkingNode.IsNotNull()) + { + m_Controls.m_LabelSetWidget->ResetAllTableWidgetItems(); + mitk::RenderingManager::GetInstance()->InitializeViews(m_WorkingNode->GetData()->GetTimeGeometry(), mitk::RenderingManager::REQUEST_UPDATE_ALL, true); + } } -void QmitkMultiLabelSegmentationView::OnAddLayer() +void QmitkMultiLabelSegmentationView::OnSegmentationSelectionChanged(const mitk::DataNode* node) { m_ToolManager->ActivateTool(-1); - mitk::DataNode *workingNode = m_ToolManager->GetWorkingData(0); - assert(workingNode); + if (m_WorkingNode.IsNotNull()) + { + mitk::LabelSetImage* workingImage = dynamic_cast(m_WorkingNode->GetData()); + assert(workingImage); + OnLooseLabelSetConnection(); + } - mitk::LabelSetImage *workingImage = dynamic_cast(workingNode->GetData()); - assert(workingImage); + m_WorkingNode = const_cast(node); + m_ToolManager->SetWorkingData(m_WorkingNode); + if (m_WorkingNode.IsNotNull()) + { + mitk::LabelSetImage* workingImage = dynamic_cast(m_WorkingNode->GetData()); + assert(workingImage); + OnEstablishLabelSetConnection(); - QString question = "Do you really want to add a layer to the current segmentation session?"; - QMessageBox::StandardButton answerButton = QMessageBox::question( - m_Controls.m_LabelSetWidget, "Add layer", question, QMessageBox::Yes | QMessageBox::Cancel, QMessageBox::Yes); + if (m_AutoSelectionEnabled) + { + // if a segmentation is selected find a possible reference image + mitk::DataStorage::SetOfObjects::ConstPointer sources = this->GetDataStorage()->GetSources(m_WorkingNode, m_ReferencePredicate); + if (sources->Size() != 0) + { + m_ReferenceNode = sources->ElementAt(0); + m_ToolManager->SetReferenceData(m_ReferenceNode); - if (answerButton != QMessageBox::Yes) - return; + m_Controls.m_cbReferenceNodeSelector->blockSignals(true); + m_Controls.m_cbReferenceNodeSelector->SetSelectedNode(m_ReferenceNode); + m_Controls.m_cbReferenceNodeSelector->blockSignals(false); + } + else if(sources->size() == 0) + { + m_Controls.m_cbReferenceNodeSelector->setCurrentIndex(-1); + } - int newLabelSetId = -1; - try + // hide all image and segmentation nodes to later show only the automatically selected ones + mitk::DataStorage::SetOfObjects::ConstPointer patientNodes = GetDataStorage()->GetSubset(m_ReferencePredicate); + for (mitk::DataStorage::SetOfObjects::const_iterator iter = patientNodes->begin(); iter != patientNodes->end(); ++iter) + { + (*iter)->SetVisibility(false); + } + + mitk::DataStorage::SetOfObjects::ConstPointer segmentationNodes = GetDataStorage()->GetSubset(m_SegmentationPredicate); + for (mitk::DataStorage::SetOfObjects::const_iterator iter = segmentationNodes->begin(); iter != segmentationNodes->end(); ++iter) + { + (*iter)->SetVisibility(false); + } + } + m_WorkingNode->SetVisibility(true); + + // check match of segmentation and reference image geometries + if (m_ReferenceNode.IsNotNull()) + { + mitk::Image* referenceImage = dynamic_cast(m_ReferenceNode->GetData()); + assert(referenceImage); + + mitk::Image* workingImage = dynamic_cast(m_WorkingNode->GetData()); + assert(workingImage); + + if (!this->CheckForSameGeometry(referenceImage, workingImage)) + { + return; + } + m_ReferenceNode->SetVisibility(true); + } + } + + UpdateControls(); + if (m_WorkingNode.IsNotNull()) { - WaitCursorOn(); - newLabelSetId = workingImage->AddLayer(); - WaitCursorOff(); + m_Controls.m_LabelSetWidget->ResetAllTableWidgetItems(); + mitk::RenderingManager::GetInstance()->InitializeViews(m_WorkingNode->GetData()->GetTimeGeometry(), mitk::RenderingManager::REQUEST_UPDATE_ALL, true); } - catch (mitk::Exception &e) +} + +void QmitkMultiLabelSegmentationView::OnInterpolationSelectionChanged(int index) +{ + if (index == 1) { - WaitCursorOff(); - MITK_ERROR << "Exception caught: " << e.GetDescription(); - QMessageBox::information( - m_Controls.m_LabelSetWidget, "Add Layer", "Could not add a new layer. See error log for details.\n"); - return; + m_Controls.m_SurfaceBasedInterpolatorWidget->m_Controls.m_btStart->setChecked(false);//OnToggleWidgetActivation(false); + m_Controls.m_swInterpolation->setCurrentIndex(0); + m_Controls.m_swInterpolation->show(); + } + else if (index == 2) + { + m_Controls.m_SliceBasedInterpolatorWidget->m_Controls.m_btStart->setChecked(false); + m_Controls.m_swInterpolation->setCurrentIndex(1); + m_Controls.m_swInterpolation->show(); + } + else + { + m_Controls.m_SurfaceBasedInterpolatorWidget->m_Controls.m_btStart->setChecked(false); + m_Controls.m_SliceBasedInterpolatorWidget->m_Controls.m_btStart->setChecked(false); + m_Controls.m_swInterpolation->setCurrentIndex(2); + m_Controls.m_swInterpolation->hide(); + } +} + +/************************************************************************/ +/* protected */ +/************************************************************************/ +void QmitkMultiLabelSegmentationView::OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList &nodes) +{ + if (m_AutoSelectionEnabled) + { + // automatically set the reference node and the working node of the multi label plugin + if (1 == nodes.size()) + { + mitk::DataNode::Pointer selectedNode = nodes.at(0); + if (selectedNode.IsNull()) + { + return; + } + + // check selected node + mitk::LabelSetImage::Pointer labelSetImage = dynamic_cast(selectedNode->GetData()); + if (labelSetImage.IsNotNull()) + { + // reset the image / reference node selector in case the current selected segmentation has no image parent + m_Controls.m_cbReferenceNodeSelector->setCurrentIndex(-1); + // selected a label set image (a segmentation ( working node) + m_Controls.m_cbWorkingNodeSelector->SetSelectedNode(selectedNode); + return; + } + + mitk::Image::Pointer selectedImage = dynamic_cast(selectedNode->GetData()); + if (selectedImage.IsNotNull()) + { + // reset the segmentation / working node selector in case the current selected image has no segmentation child + m_Controls.m_cbWorkingNodeSelector->setCurrentIndex(-1); + // selected an image (a reference node) + m_Controls.m_cbReferenceNodeSelector->SetSelectedNode(selectedNode); + return; + } + } + } +} + +void QmitkMultiLabelSegmentationView::OnPreferencesChanged(const berry::IBerryPreferences* prefs) +{ + if (m_Parent && m_WorkingNode.IsNotNull()) + { + m_AutoSelectionEnabled = prefs->GetBool("auto selection", false); + + mitk::BoolProperty::Pointer drawOutline = mitk::BoolProperty::New(prefs->GetBool("draw outline", true)); + mitk::BoolProperty::Pointer volumeRendering = mitk::BoolProperty::New(prefs->GetBool("volume rendering", false)); + mitk::LabelSetImage* labelSetImage; + mitk::DataNode* segmentation; + + // iterate all segmentations (binary (single label) and LabelSetImages) + mitk::NodePredicateProperty::Pointer isBinaryPredicate = mitk::NodePredicateProperty::New("binary", mitk::BoolProperty::New(true)); + mitk::NodePredicateOr::Pointer allSegmentationsPredicate = mitk::NodePredicateOr::New(isBinaryPredicate, m_SegmentationPredicate); + mitk::DataStorage::SetOfObjects::ConstPointer allSegmentations = GetDataStorage()->GetSubset(allSegmentationsPredicate); + + for (mitk::DataStorage::SetOfObjects::const_iterator it = allSegmentations->begin(); it != allSegmentations->end(); ++it) + { + segmentation = *it; + labelSetImage = dynamic_cast(segmentation->GetData()); + if (nullptr != labelSetImage) + { + // segmentation node is a multi label segmentation + segmentation->SetProperty("labelset.contour.active", drawOutline); + segmentation->SetProperty("opacity", mitk::FloatProperty::New(drawOutline->GetValue() ? 1.0f : 0.3f)); + segmentation->SetProperty("volumerendering", volumeRendering); + // force render window update to show outline + segmentation->GetData()->Modified(); + } + else + { + // node is actually a 'single label' segmentation, + // but its outline property can be set in the 'multi label' segmentation preference page as well + bool isBinary = false; + segmentation->GetBoolProperty("binary", isBinary); + if (isBinary) + { + segmentation->SetProperty("outline binary", drawOutline); + segmentation->SetProperty("outline width", mitk::FloatProperty::New(2.0)); + segmentation->SetProperty("opacity", mitk::FloatProperty::New(drawOutline->GetValue() ? 1.0f : 0.3f)); + segmentation->SetProperty("volumerendering", volumeRendering); + // force render window update to show outline + segmentation->GetData()->Modified(); + } + } + } } - - OnNewLabel(); -} - -void QmitkMultiLabelSegmentationView::OnDeactivateActiveTool() -{ - m_ToolManager->ActivateTool(-1); -} - -void QmitkMultiLabelSegmentationView::OnLockExteriorToggled(bool checked) -{ - mitk::DataNode *workingNode = m_ToolManager->GetWorkingData(0); - assert(workingNode); - - mitk::LabelSetImage *workingImage = dynamic_cast(workingNode->GetData()); - assert(workingImage); - - workingImage->GetLabel(0)->SetLocked(checked); } void QmitkMultiLabelSegmentationView::NodeAdded(const mitk::DataNode *) { /* bool isHelperObject(false); node->GetBoolProperty("helper object", isHelperObject); if (isHelperObject) return; if (m_ReferenceNode.IsNotNull() && dynamic_cast(node->GetData())) { mitk::LabelSetImage* workingImage = dynamic_cast(node->GetData()); if (workingImage->GetNumberOfLabels() > 2) m_Controls.m_LabelSetWidget->show(); else m_Controls.m_LabelSetWidget->hide(); } */ } void QmitkMultiLabelSegmentationView::NodeRemoved(const mitk::DataNode *node) { bool isHelperObject(false); node->GetBoolProperty("helper object", isHelperObject); if (isHelperObject) + { return; + } if (m_ReferenceNode.IsNotNull() && dynamic_cast(node->GetData())) { // remove all possible contour markers of the segmentation mitk::DataStorage::SetOfObjects::ConstPointer allContourMarkers = this->GetDataStorage()->GetDerivations( node, mitk::NodePredicateProperty::New("isContourMarker", mitk::BoolProperty::New(true))); ctkPluginContext *context = mitk::PluginActivator::getContext(); ctkServiceReference ppmRef = context->getServiceReference(); mitk::PlanePositionManagerService *service = context->getService(ppmRef); - for (mitk::DataStorage::SetOfObjects::ConstIterator it = allContourMarkers->Begin(); it != allContourMarkers->End(); - ++it) + for (mitk::DataStorage::SetOfObjects::ConstIterator it = allContourMarkers->Begin(); it != allContourMarkers->End(); ++it) { std::string nodeName = node->GetName(); unsigned int t = nodeName.find_last_of(" "); unsigned int id = atof(nodeName.substr(t + 1).c_str()) - 1; service->RemovePlanePosition(id); this->GetDataStorage()->Remove(it->Value()); } context->ungetService(ppmRef); service = NULL; } } -void QmitkMultiLabelSegmentationView::OnInterpolationSelectionChanged(int index) -{ - if (index == 1) - { - m_Controls.m_SurfaceBasedInterpolatorWidget->m_Controls.m_btStart->setChecked( - false); // OnToggleWidgetActivation(false); - m_Controls.m_swInterpolation->setCurrentIndex(0); - m_Controls.m_swInterpolation->show(); - } - else if (index == 2) - { - m_Controls.m_SliceBasedInterpolatorWidget->m_Controls.m_btStart->setChecked(false); - m_Controls.m_swInterpolation->setCurrentIndex(1); - m_Controls.m_swInterpolation->show(); - } - else - { - m_Controls.m_SurfaceBasedInterpolatorWidget->m_Controls.m_btStart->setChecked(false); - m_Controls.m_SliceBasedInterpolatorWidget->m_Controls.m_btStart->setChecked(false); - m_Controls.m_swInterpolation->setCurrentIndex(2); - m_Controls.m_swInterpolation->hide(); - } -} - -void QmitkMultiLabelSegmentationView::OnReferenceSelectionChanged(const mitk::DataNode *node) -{ - m_ToolManager->ActivateTool(-1); - - m_ReferenceNode = const_cast(node); - - m_ToolManager->SetReferenceData(m_ReferenceNode); - - // check match of segmentation and reference image geometries - if (node && m_WorkingNode.IsNotNull()) - { - mitk::Image *workingImage = dynamic_cast(m_WorkingNode->GetData()); - assert(workingImage); - - mitk::Image *refImage = dynamic_cast(node->GetData()); - assert(refImage); - - if (!this->CheckForSameGeometry(refImage, workingImage)) - return; - } - - this->UpdateControls(); - // m_Controls.m_LabelSetWidget->ResetAllTableWidgetItems(); -} - void QmitkMultiLabelSegmentationView::OnEstablishLabelSetConnection() { MITK_INFO << "Connection Established"; if (m_WorkingNode.IsNull()) { return; } mitk::LabelSetImage *workingImage = dynamic_cast(m_WorkingNode->GetData()); assert(workingImage); workingImage->GetActiveLabelSet()->AddLabelEvent += mitk::MessageDelegate( m_Controls.m_LabelSetWidget, &QmitkLabelSetWidget::ResetAllTableWidgetItems); workingImage->GetActiveLabelSet()->RemoveLabelEvent += mitk::MessageDelegate( m_Controls.m_LabelSetWidget, &QmitkLabelSetWidget::ResetAllTableWidgetItems); workingImage->GetActiveLabelSet()->ModifyLabelEvent += mitk::MessageDelegate( m_Controls.m_LabelSetWidget, &QmitkLabelSetWidget::UpdateAllTableWidgetItems); workingImage->GetActiveLabelSet()->AllLabelsModifiedEvent += mitk::MessageDelegate( m_Controls.m_LabelSetWidget, &QmitkLabelSetWidget::UpdateAllTableWidgetItems); workingImage->GetActiveLabelSet()->ActiveLabelEvent += mitk::MessageDelegate1(m_Controls.m_LabelSetWidget, &QmitkLabelSetWidget::SelectLabelByPixelValue); workingImage->BeforeChangeLayerEvent += mitk::MessageDelegate( this, &QmitkMultiLabelSegmentationView::OnLooseLabelSetConnection); } void QmitkMultiLabelSegmentationView::OnLooseLabelSetConnection() { MITK_INFO << "Connection Lost"; if (m_WorkingNode.IsNull()) { return; } mitk::LabelSetImage *workingImage = dynamic_cast(m_WorkingNode->GetData()); assert(workingImage); // Reset LabelSetWidget Events workingImage->GetActiveLabelSet()->AddLabelEvent -= mitk::MessageDelegate( m_Controls.m_LabelSetWidget, &QmitkLabelSetWidget::ResetAllTableWidgetItems); workingImage->GetActiveLabelSet()->RemoveLabelEvent -= mitk::MessageDelegate( m_Controls.m_LabelSetWidget, &QmitkLabelSetWidget::ResetAllTableWidgetItems); workingImage->GetActiveLabelSet()->ModifyLabelEvent -= mitk::MessageDelegate( m_Controls.m_LabelSetWidget, &QmitkLabelSetWidget::UpdateAllTableWidgetItems); workingImage->GetActiveLabelSet()->AllLabelsModifiedEvent -= mitk::MessageDelegate( m_Controls.m_LabelSetWidget, &QmitkLabelSetWidget::UpdateAllTableWidgetItems); workingImage->GetActiveLabelSet()->ActiveLabelEvent -= mitk::MessageDelegate1(m_Controls.m_LabelSetWidget, &QmitkLabelSetWidget::SelectLabelByPixelValue); workingImage->BeforeChangeLayerEvent -= mitk::MessageDelegate( this, &QmitkMultiLabelSegmentationView::OnLooseLabelSetConnection); } -void QmitkMultiLabelSegmentationView::OnSegmentationSelectionChanged(const mitk::DataNode *node) +void QmitkMultiLabelSegmentationView::SetFocus() { - m_ToolManager->ActivateTool(-1); +} - if (m_WorkingNode.IsNotNull()) - { - mitk::LabelSetImage *workingImage = dynamic_cast(m_WorkingNode->GetData()); - assert(workingImage); +void QmitkMultiLabelSegmentationView::UpdateControls() +{ + mitk::DataNode* referenceNode = m_ToolManager->GetReferenceData(0); + bool hasReferenceNode = referenceNode != NULL; - // Loose LabelSetConnections - OnLooseLabelSetConnection(); - } + mitk::DataNode* workingNode = m_ToolManager->GetWorkingData(0); + bool hasValidWorkingNode = workingNode != NULL; - m_WorkingNode = const_cast(node); + m_Controls.m_pbNewLabel->setEnabled(false); + m_Controls.m_gbInterpolation->setEnabled(false); + m_Controls.m_SliceBasedInterpolatorWidget->setEnabled(false); + m_Controls.m_SurfaceBasedInterpolatorWidget->setEnabled(false); + m_Controls.m_LabelSetWidget->setEnabled(false); + m_Controls.m_btAddLayer->setEnabled(false); + m_Controls.m_btDeleteLayer->setEnabled(false); + m_Controls.m_cbActiveLayer->setEnabled(false); + m_Controls.m_btPreviousLayer->setEnabled(false); + m_Controls.m_btNextLayer->setEnabled(false); + m_Controls.m_btLockExterior->setChecked(false); + m_Controls.m_btLockExterior->setEnabled(false); + m_Controls.m_pbShowLabelTable->setChecked(false); + m_Controls.m_pbShowLabelTable->setEnabled(false); - if (m_WorkingNode.IsNotNull()) - { - mitk::LabelSetImage *workingImage = dynamic_cast(m_WorkingNode->GetData()); - assert(workingImage); + m_Controls.m_ManualToolSelectionBox3D->SetEnabledMode(QmitkToolSelectionBox::EnabledWithReferenceAndWorkingDataVisible); + m_Controls.m_ManualToolSelectionBox2D->SetEnabledMode(QmitkToolSelectionBox::EnabledWithReferenceAndWorkingDataVisible); - // Establish LabelSetConnection - OnEstablishLabelSetConnection(); - } + if (hasValidWorkingNode) + { + // TODO adapt tool manager so that this check is done there, e.g. convenience function + mitk::LabelSetImage* workingImage = dynamic_cast(workingNode->GetData()); + hasValidWorkingNode = workingImage != nullptr; + if (hasValidWorkingNode) + { + m_Controls.m_pbNewLabel->setEnabled(true); + m_Controls.m_btLockExterior->setEnabled(true); + m_Controls.m_pbShowLabelTable->setEnabled(true); + m_Controls.m_gbInterpolation->setEnabled(true); + m_Controls.m_SliceBasedInterpolatorWidget->setEnabled(true); + m_Controls.m_SurfaceBasedInterpolatorWidget->setEnabled(true); + m_Controls.m_LabelSetWidget->setEnabled(true); + m_Controls.m_btAddLayer->setEnabled(true); - m_ToolManager->SetWorkingData(m_WorkingNode); + int activeLayer = workingImage->GetActiveLayer(); + int numberOfLayers = workingImage->GetNumberOfLayers(); - // check match of segmentation and reference image geometries - if (node && m_ReferenceNode.IsNotNull()) - { - mitk::Image *refImage = dynamic_cast(m_ReferenceNode->GetData()); - assert(refImage); + m_Controls.m_cbActiveLayer->blockSignals(true); + m_Controls.m_cbActiveLayer->clear(); + for (unsigned int lidx = 0; lidx < workingImage->GetNumberOfLayers(); ++lidx) + { + m_Controls.m_cbActiveLayer->addItem(QString::number(lidx)); + } + m_Controls.m_cbActiveLayer->setCurrentIndex(activeLayer); + m_Controls.m_cbActiveLayer->blockSignals(false); - mitk::Image *workingImage = dynamic_cast(node->GetData()); - assert(workingImage); + m_Controls.m_cbActiveLayer->setEnabled(numberOfLayers > 1); + m_Controls.m_btDeleteLayer->setEnabled(numberOfLayers > 1); + m_Controls.m_btPreviousLayer->setEnabled(activeLayer > 0); + m_Controls.m_btNextLayer->setEnabled(activeLayer != numberOfLayers - 1); - if (!this->CheckForSameGeometry(refImage, workingImage)) - return; - } + m_Controls.m_btLockExterior->setChecked(workingImage->GetLabel(0, activeLayer)->GetLocked()); + m_Controls.m_pbShowLabelTable->setChecked(workingImage->GetNumberOfLabels() > 1 /*1st is exterior*/); - if (m_WorkingNode.IsNotNull()) - { - mitk::DataStorage::SetOfObjects::ConstPointer segNodes = this->GetDataStorage()->GetSubset(m_SegmentationPredicate); - for (mitk::DataStorage::SetOfObjects::const_iterator iter = segNodes->begin(); iter != segNodes->end(); ++iter) - { - mitk::DataNode *_segNode = *iter; - _segNode->SetVisibility(false); + //MLI TODO + //m_Controls.m_ManualToolSelectionBox2D->SetEnabledMode(QmitkToolSelectionBox::EnabledWithWorkingDataVisible); } - - m_WorkingNode->SetVisibility(true); } - this->UpdateControls(); - - if (m_WorkingNode.IsNotNull()) + if (hasValidWorkingNode && hasReferenceNode) { - m_Controls.m_LabelSetWidget->ResetAllTableWidgetItems(); + int layer = -1; + referenceNode->GetIntProperty("layer", layer); + workingNode->SetIntProperty("layer", layer + 1); } + + this->RequestRenderWindowUpdate(mitk::RenderingManager::REQUEST_UPDATE_ALL); } -void QmitkMultiLabelSegmentationView::OnManualTool2DSelected(int id) +void QmitkMultiLabelSegmentationView::RenderWindowPartActivated(mitk::IRenderWindowPart* renderWindowPart) { - this->ResetMouseCursor(); - mitk::StatusBar::GetInstance()->DisplayText(""); - - if (id >= 0) + if (m_IRenderWindowPart != renderWindowPart) { - std::string text = "Active Tool: \""; - text += m_ToolManager->GetToolById(id)->GetName(); - text += "\""; - mitk::StatusBar::GetInstance()->DisplayText(text.c_str()); + m_IRenderWindowPart = renderWindowPart; + m_Parent->setEnabled(true); - us::ModuleResource resource = m_ToolManager->GetToolById(id)->GetCursorIconResource(); - if (resource.IsValid()) - this->SetMouseCursor(resource, 0, 0); + QList controllers; + controllers.push_back(m_IRenderWindowPart->GetQmitkRenderWindow("axial")->GetSliceNavigationController()); + controllers.push_back(m_IRenderWindowPart->GetQmitkRenderWindow("sagittal")->GetSliceNavigationController()); + controllers.push_back(m_IRenderWindowPart->GetQmitkRenderWindow("coronal")->GetSliceNavigationController()); + m_Controls.m_SliceBasedInterpolatorWidget->SetSliceNavigationControllers(controllers); } } -void QmitkMultiLabelSegmentationView::OnPreferencesChanged(const berry::IBerryPreferences *prefs) +void QmitkMultiLabelSegmentationView::RenderWindowPartDeactivated(mitk::IRenderWindowPart* /*renderWindowPart*/) { - if (m_Parent && m_WorkingNode.IsNotNull()) - { - mitk::BoolProperty::Pointer drawOutline = mitk::BoolProperty::New(prefs->GetBool("draw outline", true)); - mitk::BoolProperty::Pointer volumeRendering = mitk::BoolProperty::New(prefs->GetBool("volume rendering", false)); - mitk::LabelSetImage *labelSetImage; - mitk::DataNode *segmentation; - - // iterate all segmentations (binary (single label) and LabelSetImages) - mitk::NodePredicateProperty::Pointer isBinaryPredicate = - mitk::NodePredicateProperty::New("binary", mitk::BoolProperty::New(true)); - mitk::NodePredicateOr::Pointer allSegmentationsPredicate = - mitk::NodePredicateOr::New(isBinaryPredicate, m_SegmentationPredicate); - mitk::DataStorage::SetOfObjects::ConstPointer allSegmentations = - GetDataStorage()->GetSubset(allSegmentationsPredicate); - - for (mitk::DataStorage::SetOfObjects::const_iterator it = allSegmentations->begin(); it != allSegmentations->end(); - ++it) - { - segmentation = *it; - labelSetImage = dynamic_cast(segmentation->GetData()); - if (nullptr != labelSetImage) - { - // segmentation node is a multi label segmentation - segmentation->SetProperty("labelset.contour.active", drawOutline); - segmentation->SetProperty("opacity", mitk::FloatProperty::New(drawOutline->GetValue() ? 1.0f : 0.3f)); - segmentation->SetProperty("volumerendering", volumeRendering); - // force render window update to show outline - segmentation->GetData()->Modified(); - } - else - { - // node is actually a 'single label' segmentation, - // but its outline property can be set in the 'multi label' segmentation preference page as well - bool isBinary = false; - segmentation->GetBoolProperty("binary", isBinary); - if (isBinary) - { - segmentation->SetProperty("outline binary", drawOutline); - segmentation->SetProperty("outline width", mitk::FloatProperty::New(2.0)); - segmentation->SetProperty("opacity", mitk::FloatProperty::New(drawOutline->GetValue() ? 1.0f : 0.3f)); - segmentation->SetProperty("volumerendering", volumeRendering); - // force render window update to show outline - segmentation->GetData()->Modified(); - } - } - } - } + m_ToolManager->ActivateTool(-1); + m_IRenderWindowPart = 0; + m_Parent->setEnabled(false); } void QmitkMultiLabelSegmentationView::ResetMouseCursor() { if (m_MouseCursorSet) { mitk::ApplicationCursor::GetInstance()->PopCursor(); m_MouseCursorSet = false; } } void QmitkMultiLabelSegmentationView::SetMouseCursor(const us::ModuleResource resource, int hotspotX, int hotspotY) { // Remove previously set mouse cursor if (m_MouseCursorSet) { mitk::ApplicationCursor::GetInstance()->PopCursor(); } us::ModuleResourceStream cursor(resource, std::ios::binary); mitk::ApplicationCursor::GetInstance()->PushCursor(cursor, hotspotX, hotspotY); m_MouseCursorSet = true; } -void QmitkMultiLabelSegmentationView::OnGoToLabel(const mitk::Point3D &pos) +void QmitkMultiLabelSegmentationView::InitializeListeners() { - if (m_IRenderWindowPart) - m_IRenderWindowPart->SetSelectedPosition(pos); + if (m_Interactor.IsNull()) + { + us::Module* module = us::GetModuleContext()->GetModule(); + std::vector resources = module->FindResources("/", "*", true); + for (std::vector::iterator iter = resources.begin(); iter != resources.end(); ++iter) + { + MITK_INFO << iter->GetResourcePath(); + } + + m_Interactor = mitk::SegmentationInteractor::New(); + if (!m_Interactor->LoadStateMachine("SegmentationInteraction.xml", module)) + { + MITK_WARN << "Error loading state machine"; + } + + if (!m_Interactor->SetEventConfig("ConfigSegmentation.xml", module)) + { + MITK_WARN << "Error loading state machine configuration"; + } + + // Register as listener via micro services + us::ServiceProperties props; + props["name"] = std::string("SegmentationInteraction"); + m_ServiceRegistration = + us::GetModuleContext()->RegisterService(m_Interactor.GetPointer(), props); + } } -void QmitkMultiLabelSegmentationView::OnResetView() +bool QmitkMultiLabelSegmentationView::CheckForSameGeometry(const mitk::Image *image1, const mitk::Image *image2) const { - if (m_IRenderWindowPart) - m_IRenderWindowPart->ForceImmediateUpdate(); + bool isSameGeometry(true); + + if (image1 && image2) + { + mitk::BaseGeometry::Pointer geo1 = image1->GetGeometry(); + mitk::BaseGeometry::Pointer geo2 = image2->GetGeometry(); + + isSameGeometry = isSameGeometry && mitk::Equal(geo1->GetOrigin(), geo2->GetOrigin()); + isSameGeometry = isSameGeometry && mitk::Equal(geo1->GetExtent(0), geo2->GetExtent(0)); + isSameGeometry = isSameGeometry && mitk::Equal(geo1->GetExtent(1), geo2->GetExtent(1)); + isSameGeometry = isSameGeometry && mitk::Equal(geo1->GetExtent(2), geo2->GetExtent(2)); + isSameGeometry = isSameGeometry && mitk::Equal(geo1->GetSpacing(), geo2->GetSpacing()); + isSameGeometry = isSameGeometry && mitk::MatrixEqualElementWise(geo1->GetIndexToWorldTransform()->GetMatrix(), + geo2->GetIndexToWorldTransform()->GetMatrix()); + + return isSameGeometry; + } + else + { + return false; + } } QString QmitkMultiLabelSegmentationView::GetLastFileOpenPath() { return this->GetPreferences()->Get("LastFileOpenPath", ""); } void QmitkMultiLabelSegmentationView::SetLastFileOpenPath(const QString &path) { this->GetPreferences()->Put("LastFileOpenPath", path); this->GetPreferences()->Flush(); } diff --git a/Plugins/org.mitk.gui.qt.multilabelsegmentation/src/internal/QmitkMultiLabelSegmentationView.h b/Plugins/org.mitk.gui.qt.multilabelsegmentation/src/internal/QmitkMultiLabelSegmentationView.h index 15882360f5..52247314a7 100644 --- a/Plugins/org.mitk.gui.qt.multilabelsegmentation/src/internal/QmitkMultiLabelSegmentationView.h +++ b/Plugins/org.mitk.gui.qt.multilabelsegmentation/src/internal/QmitkMultiLabelSegmentationView.h @@ -1,174 +1,180 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef QmitkMultiLabelSegmentationView_h #define QmitkMultiLabelSegmentationView_h #include #include "mitkSegmentationInteractor.h" #include #include "ui_QmitkMultiLabelSegmentationControls.h" // berry #include class QmitkRenderWindow; /** * \ingroup ToolManagerEtAl * \ingroup org_mitk_gui_qt_multilabelsegmentation_internal */ class QmitkMultiLabelSegmentationView : public QmitkAbstractView, public mitk::ILifecycleAwarePart { Q_OBJECT public: static const std::string VIEW_ID; QmitkMultiLabelSegmentationView(); virtual ~QmitkMultiLabelSegmentationView(); typedef std::map NodeTagMapType; // GUI setup void CreateQtPartControl(QWidget *parent); // ILifecycleAwarePart interface public: void Activated(); void Deactivated(); void Visible(); void Hidden(); virtual int GetSizeFlags(bool width); virtual int ComputePreferredSize(bool width, int /*availableParallel*/, int /*availablePerpendicular*/, int preferredResult); protected slots: - /// \brief reaction to the selection of a new patient (reference) image in the DataStorage combobox - void OnReferenceSelectionChanged(const mitk::DataNode *node); - - /// \brief reaction to the selection of a new Segmentation (working) image in the DataStorage combobox - void OnSegmentationSelectionChanged(const mitk::DataNode *node); - - /// \brief reaction to ... - void OnInterpolationSelectionChanged(int); - /// \brief reaction to the selection of any 2D segmentation tool void OnManualTool2DSelected(int id); /// \brief reaction to button "New Label" void OnNewLabel(); /// \brief reaction to button "Show Label Table" void OnShowLabelTable(bool value); /// \brief reaction to button "New Segmentation Session" void OnNewSegmentationSession(); /// \brief reaction to signal "goToLabel" from labelset widget void OnGoToLabel(const mitk::Point3D &pos); void OnResetView(); // reaction to the button "Add Layer" void OnAddLayer(); // reaction to the button "Delete Layer" void OnDeleteLayer(); // reaction to the button "Previous Layer" void OnPreviousLayer(); // reaction to the button "Next Layer" void OnNextLayer(); // reaction to the combobox change "Change Layer" void OnChangeLayer(int); // reaction to the button "Deactive Active Tool" void OnDeactivateActiveTool(); // reaction to the button "Lock exterior" void OnLockExteriorToggled(bool); + /// \brief reaction to the selection of a new patient (reference) image in the DataStorage combobox + void OnReferenceSelectionChanged(const mitk::DataNode* node); + + /// \brief reaction to the selection of a new Segmentation (working) image in the DataStorage combobox + void OnSegmentationSelectionChanged(const mitk::DataNode* node); + + /// \brief reaction to ... + void OnInterpolationSelectionChanged(int); + protected: - // invoked when the preferences were changed - void OnPreferencesChanged(const berry::IBerryPreferences *prefs) override; + + // reimplemented from QmitkAbstractView + void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList &nodes) override; + + // reimplemented from QmitkAbstractView + void OnPreferencesChanged(const berry::IBerryPreferences* prefs) override; + + // reimplemented from QmitkAbstractView + void NodeAdded(const mitk::DataNode* node) override; + + // reimplemented from QmitkAbstractView + void NodeRemoved(const mitk::DataNode* node) override; void OnEstablishLabelSetConnection(); + void OnLooseLabelSetConnection(); void SetFocus(); void UpdateControls(); void RenderWindowPartActivated(mitk::IRenderWindowPart *renderWindowPart); void RenderWindowPartDeactivated(mitk::IRenderWindowPart *renderWindowPart); void ResetMouseCursor(); void SetMouseCursor(const us::ModuleResource, int hotspotX, int hotspotY); void InitializeListeners(); /// \brief Checks if two images have the same size and geometry bool CheckForSameGeometry(const mitk::Image *image1, const mitk::Image *image2) const; - /// \brief Reimplemented from QmitkAbstractView - virtual void NodeAdded(const mitk::DataNode *node); - - /// \brief Reimplemented from QmitkAbstractView - virtual void NodeRemoved(const mitk::DataNode *node); - QString GetLastFileOpenPath(); void SetLastFileOpenPath(const QString &path); /// \brief the Qt parent of our GUI (NOT of this object) QWidget *m_Parent; /// \brief Qt GUI file Ui::QmitkMultiLabelSegmentationControls m_Controls; mitk::IRenderWindowPart *m_IRenderWindowPart; mitk::ToolManager *m_ToolManager; mitk::DataNode::Pointer m_ReferenceNode; mitk::DataNode::Pointer m_WorkingNode; mitk::NodePredicateAnd::Pointer m_ReferencePredicate; mitk::NodePredicateAnd::Pointer m_SegmentationPredicate; bool m_MouseCursorSet; + bool m_AutoSelectionEnabled; mitk::SegmentationInteractor::Pointer m_Interactor; /** * Reference to the service registration of the observer, * it is needed to unregister the observer on unload. */ us::ServiceRegistration m_ServiceRegistration; }; #endif // QmitkMultiLabelSegmentationView_h