diff --git a/Modules/Segmentation/Algorithms/mitkContourModelSetToImageFilter.cpp b/Modules/Segmentation/Algorithms/mitkContourModelSetToImageFilter.cpp new file mode 100644 index 0000000000..9d93762602 --- /dev/null +++ b/Modules/Segmentation/Algorithms/mitkContourModelSetToImageFilter.cpp @@ -0,0 +1,275 @@ +/*=================================================================== + +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 "mitkContourModelSetToImageFilter.h" + +#include +#include +#include +#include +#include +#include + +// TODO Move this one to Core so that this Filter can be in the ContourModel Module! +#include +// TODO + + +mitk::ContourModelSetToImageFilter::ContourModelSetToImageFilter() + : m_MakeOutputBinary( true ), + m_TimeStep( 0 ) +{ + // Create the output. + itk::DataObject::Pointer output = this->MakeOutput(0); + Superclass::SetNumberOfRequiredInputs(1); + Superclass::SetNumberOfRequiredOutputs(1); + Superclass::SetNthOutput(0, output); +} + +mitk::ContourModelSetToImageFilter::~ContourModelSetToImageFilter() +{ +} + +void mitk::ContourModelSetToImageFilter::GenerateInputRequestedRegion() +{ + mitk::Image* output = this->GetOutput(); + if((output->IsInitialized()==false) ) + return; + + GenerateTimeInInputRegion(output, const_cast< mitk::Image * > ( this->GetImage() )); +} + +void mitk::ContourModelSetToImageFilter::GenerateOutputInformation() +{ + mitk::Image *inputImage = (mitk::Image*)this->GetImage(); + mitk::Image::Pointer output = this->GetOutput(); + + itkDebugMacro(<<"GenerateOutputInformation()"); + + if((inputImage == NULL) || + (inputImage->IsInitialized() == false) || + (inputImage->GetTimeGeometry() == NULL)) return; + + if (m_MakeOutputBinary) + { + output->Initialize(mitk::MakeScalarPixelType() , *inputImage->GetTimeGeometry(),1,1); + } + else + { + output->Initialize(inputImage->GetPixelType(), *inputImage->GetTimeGeometry()); + } + + output->SetPropertyList(inputImage->GetPropertyList()->Clone()); +} + +itk::DataObject::Pointer mitk::ContourModelSetToImageFilter::MakeOutput ( DataObjectPointerArraySizeType /*idx*/ ) +{ + return OutputType::New().GetPointer(); +} + +itk::DataObject::Pointer mitk::ContourModelSetToImageFilter::MakeOutput( const DataObjectIdentifierType & name ) +{ + itkDebugMacro("MakeOutput(" << name << ")"); + if( this->IsIndexedOutputName(name) ) + { + return this->MakeOutput( this->MakeIndexFromOutputName(name) ); + } + return OutputType::New().GetPointer(); +} + +const mitk::ContourModelSet* mitk::ContourModelSetToImageFilter::GetInput(void) +{ + if (this->GetNumberOfInputs() < 1) + { + return 0; + } + + return static_cast< const mitk::ContourModelSet* > + ( this->ProcessObject::GetInput(0) ); +} + +void mitk::ContourModelSetToImageFilter::SetInput(const ContourModelSet *input) +{ + // Process object is not const-correct so the const_cast is required here + this->ProcessObject::SetNthInput(0, + const_cast< mitk::ContourModelSet* >( input ) ); +} + +void mitk::ContourModelSetToImageFilter::SetImage(const mitk::Image *refImage) +{ + this->ProcessObject::SetNthInput( 1, const_cast< mitk::Image * >( refImage ) ); +} + +const mitk::Image* mitk::ContourModelSetToImageFilter::GetImage(void) +{ + return static_cast< const mitk::Image * >(this->ProcessObject::GetInput(1)); +} + +void mitk::ContourModelSetToImageFilter::GenerateData() +{ + mitk::ContourModelSet* contourSet = const_cast(this->GetInput()); + + // Assure that the volume data of the output is set (fill volume with zeros) + this->InitializeOutputEmpty(); + + mitk::Image::Pointer outputImage = const_cast(this->GetOutput()); + + + if(outputImage.IsNull() || outputImage->IsInitialized() == false || !outputImage->IsVolumeSet(m_TimeStep)) + { + MITK_ERROR<<"Error creating output for specified image!"; + return; + } + + if (!contourSet || contourSet->GetContourModelList()->size() == 0) + { + MITK_ERROR<<"No contours specified!"; + return; + } + + mitk::Geometry3D* outputImageGeo = outputImage->GetGeometry(m_TimeStep); + + // Create mitkVtkImageOverwrite which is needed to write the slice back into the volume + vtkSmartPointer reslice = vtkSmartPointer::New(); + + // Create ExtractSliceFilter for extracting the corresponding slices from the volume + mitk::ExtractSliceFilter::Pointer extractor = mitk::ExtractSliceFilter::New(reslice); + extractor->SetInput( outputImage ); + extractor->SetTimeStep( m_TimeStep ); + extractor->SetResliceTransformByGeometry( outputImageGeo ); + + // Fill each contour of the contourmodelset into the image + mitk::ContourModelSet::ContourModelSetIterator it = contourSet->Begin(); + mitk::ContourModelSet::ContourModelSetIterator end = contourSet->End(); + while (it != end) + { + mitk::ContourModel* contour = it->GetPointer(); + + // 1. Create slice geometry using the contour points + mitk::PlaneGeometry::Pointer plane = mitk::PlaneGeometry::New(); + mitk::Point3D point3D, tempPoint; + mitk::Vector3D normal; + + mitk::Image::Pointer slice; + + int sliceIndex; + bool isFrontside = true; + bool isRotated = false; + + // Determine plane orientation + point3D = contour->GetVertexAt(0)->Coordinates; + tempPoint = contour->GetVertexAt(contour->GetNumberOfVertices()*0.5)->Coordinates; + mitk::Vector3D vec = point3D - tempPoint; + vec.Normalize(); + outputImageGeo->WorldToIndex(point3D, point3D); + + mitk::PlaneGeometry::PlaneOrientation orientation; + if (mitk::Equal(vec[0], 0)) + { + orientation = mitk::PlaneGeometry::Sagittal; + sliceIndex = point3D[0]; + } + else if (mitk::Equal(vec[1], 0)) + { + orientation = mitk::PlaneGeometry::Frontal; + sliceIndex = point3D[1]; + } + else if (mitk::Equal(vec[2], 0)) + { + orientation = mitk::PlaneGeometry::Axial; + sliceIndex = point3D[2]; + } + else + { + // TODO Maybe rotate geometry to extract slice? + MITK_ERROR<<"Cannot detect correct slice number! Only axial, sagittal and frontal oriented contours are supported!"; + return; + } + + // Initialize plane using the detected orientation + plane->InitializeStandardPlane(outputImageGeo, orientation, sliceIndex, isFrontside, isRotated); + point3D = plane->GetOrigin(); + normal = plane->GetNormal(); + normal.Normalize(); + point3D += normal * 0.5;//pixelspacing is 1, so half the spacing is 0.5 + plane->SetOrigin(point3D); + + // 2. Extract slice at the given position + extractor->SetWorldGeometry( plane ); + extractor->SetVtkOutputRequest(false); + reslice->SetOverwriteMode(false); + + extractor->Modified(); + extractor->Update(); + + slice = extractor->GetOutput(); + + // 3. Fill contour into slice + mitk::ContourModel::Pointer projectedContour = mitk::ContourModelUtils::ProjectContourTo2DSlice(slice, contour, true, false); + mitk::ContourModelUtils::FillContourInSlice(projectedContour, slice); + + // 4. Write slice back into image volume + reslice->SetInputSlice(slice->GetVtkImageData()); + + //set overwrite mode to true to write back to the image volume + reslice->SetOverwriteMode(true); + reslice->Modified(); + + extractor->SetVtkOutputRequest(true); + extractor->Modified(); + extractor->Update(); + + mitk::ProgressBar::GetInstance()->Progress(); + ++it; + } + + outputImage->Modified(); + outputImage->GetVtkImageData()->Modified(); +} + +void mitk::ContourModelSetToImageFilter::InitializeOutputEmpty() +{ + // Initialize the output's volume with zeros + mitk::Image* output = this->GetOutput(); + unsigned int byteSize = output->GetPixelType().GetSize(); + + if(output->GetDimension() < 4) + { + for (unsigned int dim = 0; dim < output->GetDimension(); ++dim) + { + byteSize *= output->GetDimension(dim); + } + + mitk::ImageWriteAccessor writeAccess(output, output->GetVolumeData(0)); + + memset( writeAccess.GetData(), 0, byteSize ); + } + else + { + //if we have a time-resolved image we need to set memory to 0 for each time step + for (unsigned int dim = 0; dim < 3; ++dim) + { + byteSize *= output->GetDimension(dim); + } + + for( unsigned int volumeNumber = 0; volumeNumber < output->GetDimension(3); volumeNumber++) + { + mitk::ImageWriteAccessor writeAccess(output, output->GetVolumeData(volumeNumber)); + + memset( writeAccess.GetData(), 0, byteSize ); + } + } +} diff --git a/Modules/Segmentation/Algorithms/mitkContourModelSetToImageFilter.h b/Modules/Segmentation/Algorithms/mitkContourModelSetToImageFilter.h new file mode 100644 index 0000000000..f28e3bbdf9 --- /dev/null +++ b/Modules/Segmentation/Algorithms/mitkContourModelSetToImageFilter.h @@ -0,0 +1,98 @@ +/*=================================================================== + +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 _MITK_CONTOURMODEL_SOURCE_H +#define _MITK_CONTOURMODEL_SOURCE_H + +#include +#include + +namespace mitk +{ + +class ContourModelSet; + +/** + * @brief Fills a given mitk::ContourModelSet into a given mitk::Image + * @ingroup Process + */ +class MitkSegmentation_EXPORT ContourModelSetToImageFilter : public ImageSource +{ +public: + + mitkClassMacro( ContourModelSetToImageFilter, ImageSource ) + itkFactorylessNewMacro(Self) + itkCloneMacro(Self) + + itkSetMacro(MakeOutputBinary, bool); + itkGetMacro(MakeOutputBinary, bool); + itkBooleanMacro(MakeOutputBinary); + + itkSetMacro(TimeStep, unsigned int); + + /** + * Allocates a new output object and returns it. Currently the + * index idx is not evaluated. + * @param idx the index of the output for which an object should be created + * @returns the new object + */ + virtual itk::DataObject::Pointer MakeOutput ( DataObjectPointerArraySizeType idx ); + + /** + * This is a default implementation to make sure we have something. + * Once all the subclasses of ProcessObject provide an appopriate + * MakeOutput(), then ProcessObject::MakeOutput() can be made pure + * virtual. + */ + virtual itk::DataObject::Pointer MakeOutput(const DataObjectIdentifierType &name); + + virtual void GenerateInputRequestedRegion(); + + virtual void GenerateOutputInformation(); + + virtual void GenerateData(); + + const mitk::ContourModelSet* GetInput(void); + + using itk::ProcessObject::SetInput; + virtual void SetInput(const mitk::ContourModelSet* input); + + /** + * @brief Set the image which will be used to initialize the output of this filter. + * @param refImage the image used to initialize the output image + */ + void SetImage(const mitk::Image *refImage); + + const mitk::Image *GetImage(void); + +protected: + + ContourModelSetToImageFilter(); + + virtual ~ContourModelSetToImageFilter(); + + /** + * @brief Initializes the volume of the output image with zeros + */ + void InitializeOutputEmpty(); + + bool m_MakeOutputBinary; + + unsigned int m_TimeStep; +}; + +} +#endif // #_MITK_CONTOURMODEL_SOURCE_H diff --git a/Modules/Segmentation/files.cmake b/Modules/Segmentation/files.cmake index 59d2b99d96..b29502db2a 100644 --- a/Modules/Segmentation/files.cmake +++ b/Modules/Segmentation/files.cmake @@ -1,122 +1,119 @@ set(CPP_FILES Algorithms/mitkCalculateSegmentationVolume.cpp - #Algorithms/mitkContourModelSource.cpp - #Algorithms/mitkContourModelSubDivisionFilter.cpp - #Algorithms/mitkContourModelToPointSetFilter.cpp - #Algorithms/mitkContourModelToSurfaceFilter.cpp + Algorithms/mitkContourModelSetToImageFilter.cpp Algorithms/mitkContourSetToPointSetFilter.cpp Algorithms/mitkContourUtils.cpp Algorithms/mitkCorrectorAlgorithm.cpp Algorithms/mitkDiffImageApplier.cpp Algorithms/mitkDiffSliceOperation.cpp Algorithms/mitkDiffSliceOperationApplier.cpp Algorithms/mitkImageLiveWireContourModelFilter.cpp Algorithms/mitkImageToContourFilter.cpp #Algorithms/mitkImageToContourModelFilter.cpp Algorithms/mitkImageToLiveWireContourFilter.cpp Algorithms/mitkManualSegmentationToSurfaceFilter.cpp Algorithms/mitkOtsuSegmentationFilter.cpp Algorithms/mitkOverwriteDirectedPlaneImageFilter.cpp Algorithms/mitkOverwriteSliceImageFilter.cpp Algorithms/mitkSegmentationObjectFactory.cpp Algorithms/mitkSegmentationSink.cpp Algorithms/mitkShapeBasedInterpolationAlgorithm.cpp Algorithms/mitkShowSegmentationAsSmoothedSurface.cpp Algorithms/mitkShowSegmentationAsSurface.cpp Algorithms/mitkVtkImageOverwrite.cpp Controllers/mitkSegmentationInterpolationController.cpp Controllers/mitkToolManager.cpp Controllers/mitkSegmentationModuleActivator.cpp Controllers/mitkToolManagerProvider.cpp DataManagement/mitkContour.cpp #DataManagement/mitkContourElement.cpp #DataManagement/mitkContourModel.cpp DataManagement/mitkContourSet.cpp DataManagement/mitkExtrudedContour.cpp Interactions/mitkAdaptiveRegionGrowingTool.cpp Interactions/mitkAddContourTool.cpp Interactions/mitkAutoCropTool.cpp Interactions/mitkAutoSegmentationTool.cpp Interactions/mitkBinaryThresholdTool.cpp Interactions/mitkBinaryThresholdULTool.cpp Interactions/mitkCalculateGrayValueStatisticsTool.cpp Interactions/mitkCalculateVolumetryTool.cpp Interactions/mitkContourInteractor.cpp Interactions/mitkContourModelInteractor.cpp Interactions/mitkContourModelLiveWireInteractor.cpp Interactions/mitkContourTool.cpp Interactions/mitkCorrectorTool2D.cpp Interactions/mitkCreateSurfaceTool.cpp Interactions/mitkDrawPaintbrushTool.cpp Interactions/mitkErasePaintbrushTool.cpp Interactions/mitkEraseRegionTool.cpp Interactions/mitkExtrudedContourInteractor.cpp Interactions/mitkFastMarchingTool.cpp Interactions/mitkFastMarchingTool3D.cpp Interactions/mitkFeedbackContourTool.cpp Interactions/mitkFillRegionTool.cpp Interactions/mitkLiveWireTool2D.cpp Interactions/mitkOtsuTool3D.cpp Interactions/mitkPaintbrushTool.cpp Interactions/mitkPixelManipulationTool.cpp Interactions/mitkRegionGrow3DTool.cpp Interactions/mitkRegionGrowingTool.cpp Interactions/mitkSegmentationsProcessingTool.cpp Interactions/mitkSetRegionTool.cpp Interactions/mitkSegTool2D.cpp Interactions/mitkSubtractContourTool.cpp Interactions/mitkTool.cpp Interactions/mitkToolCommand.cpp Interactions/mitkWatershedTool.cpp Interactions/mitkPickingTool.cpp #IO/mitkContourModelIOFactory.cpp #IO/mitkContourModelReader.cpp #IO/mitkContourModelWriter.cpp #IO/mitkContourModelWriterFactory.cpp Rendering/mitkContourMapper2D.cpp #Rendering/mitkContourModelGLMapper2D.cpp #Rendering/mitkContourModelMapper2D.cpp #Rendering/mitkContourModelMapper3D.cpp Rendering/mitkContourSetMapper2D.cpp Rendering/mitkContourSetVtkMapper3D.cpp Rendering/mitkContourVtkMapper3D.cpp SegmentationUtilities/BooleanOperations/mitkBooleanOperation.cpp SegmentationUtilities/MorphologicalOperations/mitkMorphologicalOperations.cpp ) set(RESOURCE_FILES Add_48x48.png Add_Cursor_32x32.png Correction_48x48.png Correction_Cursor_32x32.png Erase_48x48.png Erase_Cursor_32x32.png FastMarching_48x48.png FastMarching_Cursor_32x32.png Fill_48x48.png Fill_Cursor_32x32.png LiveWire_48x48.png LiveWire_Cursor_32x32.png Otsu_48x48.png Paint_48x48.png Paint_Cursor_32x32.png Pick_48x48.png RegionGrowing_48x48.png RegionGrowing_Cursor_32x32.png Subtract_48x48.png Subtract_Cursor_32x32.png Threshold_48x48.png TwoThresholds_48x48.png Watershed_48x48.png Watershed_Cursor_32x32.png Wipe_48x48.png Wipe_Cursor_32x32.png Interactions/dummy.xml Interactions/LiveWireTool.xml Interactions/PressMoveRelease.xml Interactions/PressMoveReleaseAndPointSetting.xml Interactions/PressMoveReleaseWithCTRLInversion.xml Interactions/PressMoveReleaseWithCTRLInversionAllMouseMoves.xml Interactions/SegmentationToolsConfig.xml ) diff --git a/Plugins/org.mitk.gui.qt.segmentation/files.cmake b/Plugins/org.mitk.gui.qt.segmentation/files.cmake index 24a87be816..cde1e33fb3 100644 --- a/Plugins/org.mitk.gui.qt.segmentation/files.cmake +++ b/Plugins/org.mitk.gui.qt.segmentation/files.cmake @@ -1,78 +1,81 @@ set(SRC_CPP_FILES QmitkSegmentationPreferencePage.cpp ) set(INTERNAL_CPP_FILES mitkPluginActivator.cpp QmitkSegmentationView.cpp QmitkThresholdAction.cpp QmitkCreatePolygonModelAction.cpp #QmitkStatisticsAction.cpp QmitkAutocropAction.cpp QmitkDeformableClippingPlaneView.cpp Common/QmitkDataSelectionWidget.cpp SegmentationUtilities/QmitkSegmentationUtilitiesView.cpp SegmentationUtilities/QmitkSegmentationUtilityWidget.cpp SegmentationUtilities/BooleanOperations/QmitkBooleanOperationsWidget.cpp SegmentationUtilities/ImageMasking/QmitkImageMaskingWidget.cpp + SegmentationUtilities/ContourModelToImage/QmitkContourModelToImageWidget.cpp SegmentationUtilities/MorphologicalOperations/QmitkMorphologicalOperationsWidget.cpp SegmentationUtilities/SurfaceToImage/QmitkSurfaceToImageWidget.cpp SegmentationUtilities/CTKWidgets/QmitkCTKWidgetsWidget.cpp ) set(UI_FILES src/internal/QmitkSegmentationControls.ui src/internal/QmitkDeformableClippingPlaneViewControls.ui src/internal/Common/QmitkDataSelectionWidgetControls.ui src/internal/SegmentationUtilities/QmitkSegmentationUtilitiesViewControls.ui src/internal/SegmentationUtilities/BooleanOperations/QmitkBooleanOperationsWidgetControls.ui src/internal/SegmentationUtilities/ImageMasking/QmitkImageMaskingWidgetControls.ui + src/internal/SegmentationUtilities/ContourModelToImage/QmitkContourModelToImageWidgetControls.ui src/internal/SegmentationUtilities/MorphologicalOperations/QmitkMorphologicalOperationsWidgetControls.ui src/internal/SegmentationUtilities/SurfaceToImage/QmitkSurfaceToImageWidgetControls.ui ) set(MOC_H_FILES src/QmitkSegmentationPreferencePage.h src/internal/mitkPluginActivator.h src/internal/QmitkSegmentationView.h src/internal/QmitkThresholdAction.h src/internal/QmitkCreatePolygonModelAction.h #src/internal/QmitkStatisticsAction.h src/internal/QmitkAutocropAction.h src/internal/QmitkDeformableClippingPlaneView.h src/internal/Common/QmitkDataSelectionWidget.h src/internal/SegmentationUtilities/QmitkSegmentationUtilitiesView.h src/internal/SegmentationUtilities/QmitkSegmentationUtilityWidget.h src/internal/SegmentationUtilities/BooleanOperations/QmitkBooleanOperationsWidget.h src/internal/SegmentationUtilities/ImageMasking/QmitkImageMaskingWidget.h + src/internal/SegmentationUtilities/ContourModelToImage/QmitkContourModelToImageWidget.h src/internal/SegmentationUtilities/MorphologicalOperations/QmitkMorphologicalOperationsWidget.h src/internal/SegmentationUtilities/SurfaceToImage/QmitkSurfaceToImageWidget.h src/internal/SegmentationUtilities/CTKWidgets/QmitkCTKWidgetsWidget.h ) set(CACHED_RESOURCE_FILES resources/segmentation.png resources/deformablePlane.png resources/clipping_plane_translate_48x48.png resources/clipping_plane_rotate48x48.png resources/clipping_plane_deform48x48.png resources/SegmentationUtilities_48x48.png plugin.xml ) set(QRC_FILES resources/segmentation.qrc resources/SegmentationUtilities.qrc resources/BooleanOperationsWidget.qrc resources/MorphologicalOperationsWidget.qrc ) set(CPP_FILES) foreach(file ${SRC_CPP_FILES}) set(CPP_FILES ${CPP_FILES} src/${file}) endforeach(file ${SRC_CPP_FILES}) foreach(file ${INTERNAL_CPP_FILES}) set(CPP_FILES ${CPP_FILES} src/internal/${file}) endforeach(file ${INTERNAL_CPP_FILES}) diff --git a/Plugins/org.mitk.gui.qt.segmentation/resources/ContourModelSetToImage_48x48.png b/Plugins/org.mitk.gui.qt.segmentation/resources/ContourModelSetToImage_48x48.png new file mode 100644 index 0000000000..3610f19435 Binary files /dev/null and b/Plugins/org.mitk.gui.qt.segmentation/resources/ContourModelSetToImage_48x48.png differ diff --git a/Plugins/org.mitk.gui.qt.segmentation/resources/SegmentationUtilities.qrc b/Plugins/org.mitk.gui.qt.segmentation/resources/SegmentationUtilities.qrc index d070baaf05..5b257c350f 100644 --- a/Plugins/org.mitk.gui.qt.segmentation/resources/SegmentationUtilities.qrc +++ b/Plugins/org.mitk.gui.qt.segmentation/resources/SegmentationUtilities.qrc @@ -1,10 +1,11 @@ BooleanOperations_48x48.png + ContourModelSetToImage_48x48.png ImageMasking_48x48.png MorphologicalOperations_48x48.png SurfaceToImage_48x48.png SegmentationUtilities_48x48.png CTKWidgets_48x48.png diff --git a/Plugins/org.mitk.gui.qt.segmentation/src/internal/Common/QmitkDataSelectionWidget.cpp b/Plugins/org.mitk.gui.qt.segmentation/src/internal/Common/QmitkDataSelectionWidget.cpp index 1df4b355ce..231887ec1c 100644 --- a/Plugins/org.mitk.gui.qt.segmentation/src/internal/Common/QmitkDataSelectionWidget.cpp +++ b/Plugins/org.mitk.gui.qt.segmentation/src/internal/Common/QmitkDataSelectionWidget.cpp @@ -1,158 +1,165 @@ /*=================================================================== 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 "QmitkDataSelectionWidget.h" #include +#include +#include #include #include #include #include #include +#include #include #include #include #include #include #include #include #include static mitk::NodePredicateBase::Pointer CreatePredicate(QmitkDataSelectionWidget::Predicate predicate) { switch(predicate) { case QmitkDataSelectionWidget::ImagePredicate: return mitk::NodePredicateAnd::New( mitk::TNodePredicateDataType::New(), mitk::NodePredicateNot::New(mitk::NodePredicateProperty::New("binary", mitk::BoolProperty::New(true))), mitk::NodePredicateNot::New(mitk::NodePredicateProperty::New("helper object"))).GetPointer(); case QmitkDataSelectionWidget::SegmentationPredicate: return mitk::NodePredicateAnd::New( mitk::TNodePredicateDataType::New(), mitk::NodePredicateProperty::New("binary", mitk::BoolProperty::New(true)), mitk::NodePredicateNot::New(mitk::NodePredicateProperty::New("helper object"))).GetPointer(); case QmitkDataSelectionWidget::SurfacePredicate: return mitk::NodePredicateAnd::New( mitk::TNodePredicateDataType::New(), mitk::NodePredicateNot::New(mitk::NodePredicateProperty::New("helper object"))).GetPointer(); case QmitkDataSelectionWidget::ImageAndSegmentationPredicate: return mitk::NodePredicateAnd::New( mitk::TNodePredicateDataType::New(), mitk::NodePredicateNot::New(mitk::NodePredicateProperty::New("helper object"))).GetPointer(); - + case QmitkDataSelectionWidget::ContourModelPredicate: + return mitk::NodePredicateAnd::New( + mitk::NodePredicateOr::New( mitk::TNodePredicateDataType::New(), + mitk::TNodePredicateDataType::New()), + mitk::NodePredicateNot::New(mitk::NodePredicateProperty::New("helper object"))).GetPointer(); default: assert(false && "Unknown predefined predicate!"); return NULL; } } QmitkDataSelectionWidget::QmitkDataSelectionWidget(QWidget* parent) : QWidget(parent) { m_Controls.setupUi(this); m_Controls.helpLabel->hide(); } QmitkDataSelectionWidget::~QmitkDataSelectionWidget() { } unsigned int QmitkDataSelectionWidget::AddDataStorageComboBox(QmitkDataSelectionWidget::Predicate predicate) { return this->AddDataStorageComboBox("", predicate); } unsigned int QmitkDataSelectionWidget::AddDataStorageComboBox(mitk::NodePredicateBase* predicate) { return this->AddDataStorageComboBox("", predicate); } unsigned int QmitkDataSelectionWidget::AddDataStorageComboBox(const QString &labelText, QmitkDataSelectionWidget::Predicate predicate) { return this->AddDataStorageComboBox(labelText, CreatePredicate(predicate)); } unsigned int QmitkDataSelectionWidget::AddDataStorageComboBox(const QString &labelText, mitk::NodePredicateBase* predicate) { int row = m_Controls.gridLayout->rowCount(); if (!labelText.isEmpty()) { QLabel* label = new QLabel(labelText, m_Controls.dataSelectionWidget); label->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred); m_Controls.gridLayout->addWidget(label, row, 0); } QmitkDataStorageComboBox* comboBox = new QmitkDataStorageComboBox(this->GetDataStorage(), predicate, m_Controls.dataSelectionWidget); connect(comboBox, SIGNAL(OnSelectionChanged(const mitk::DataNode *)), this, SLOT(OnSelectionChanged(const mitk::DataNode *))); m_Controls.gridLayout->addWidget(comboBox, row, 1); m_DataStorageComboBoxes.push_back(comboBox); return static_cast(m_DataStorageComboBoxes.size() - 1); } mitk::DataStorage::Pointer QmitkDataSelectionWidget::GetDataStorage() const { mitk::IDataStorageService::Pointer service = berry::Platform::GetServiceRegistry().GetServiceById(mitk::IDataStorageService::ID); assert(service.IsNotNull()); return service->GetDefaultDataStorage()->GetDataStorage(); } mitk::DataNode::Pointer QmitkDataSelectionWidget::GetSelection(unsigned int index) { assert(index < m_DataStorageComboBoxes.size()); return m_DataStorageComboBoxes[index]->GetSelectedNode(); } void QmitkDataSelectionWidget::SetPredicate(unsigned int index, Predicate predicate) { this->SetPredicate(index, CreatePredicate(predicate)); } void QmitkDataSelectionWidget::SetPredicate(unsigned int index, mitk::NodePredicateBase* predicate) { assert(index < m_DataStorageComboBoxes.size()); m_DataStorageComboBoxes[index]->SetPredicate(predicate); } void QmitkDataSelectionWidget::SetHelpText(const QString& text) { if (!text.isEmpty()) { m_Controls.helpLabel->setText(text); if (!m_Controls.helpLabel->isVisible()) m_Controls.helpLabel->show(); } else { m_Controls.helpLabel->hide(); } } void QmitkDataSelectionWidget::OnSelectionChanged(const mitk::DataNode* selection) { std::vector::iterator it = std::find(m_DataStorageComboBoxes.begin(), m_DataStorageComboBoxes.end(), sender()); assert(it != m_DataStorageComboBoxes.end()); emit SelectionChanged(std::distance(m_DataStorageComboBoxes.begin(), it), selection); } diff --git a/Plugins/org.mitk.gui.qt.segmentation/src/internal/Common/QmitkDataSelectionWidget.h b/Plugins/org.mitk.gui.qt.segmentation/src/internal/Common/QmitkDataSelectionWidget.h index 8b0f44b17f..b0eaaf78bd 100644 --- a/Plugins/org.mitk.gui.qt.segmentation/src/internal/Common/QmitkDataSelectionWidget.h +++ b/Plugins/org.mitk.gui.qt.segmentation/src/internal/Common/QmitkDataSelectionWidget.h @@ -1,70 +1,71 @@ /*=================================================================== 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 QmitkDataSelectionWidget_h #define QmitkDataSelectionWidget_h #include #include #include #include namespace mitk { class NodePredicateBase; } class QmitkDataStorageComboBox; class QmitkDataSelectionWidget : public QWidget { Q_OBJECT public: enum Predicate { ImagePredicate, SegmentationPredicate, SurfacePredicate, - ImageAndSegmentationPredicate + ImageAndSegmentationPredicate, + ContourModelPredicate }; explicit QmitkDataSelectionWidget(QWidget* parent = NULL); ~QmitkDataSelectionWidget(); unsigned int AddDataStorageComboBox(Predicate predicate); unsigned int AddDataStorageComboBox(mitk::NodePredicateBase* predicate = NULL); unsigned int AddDataStorageComboBox(const QString &labelText, Predicate predicate); unsigned int AddDataStorageComboBox(const QString &labelText, mitk::NodePredicateBase* predicate = NULL); mitk::DataStorage::Pointer GetDataStorage() const; mitk::DataNode::Pointer GetSelection(unsigned int index); void SetPredicate(unsigned int index, Predicate predicate); void SetPredicate(unsigned int index, mitk::NodePredicateBase* predicate); void SetHelpText(const QString& text); signals: void SelectionChanged(unsigned int index, const mitk::DataNode* selection); private slots: void OnSelectionChanged(const mitk::DataNode* selection); private: Ui::QmitkDataSelectionWidgetControls m_Controls; std::vector m_DataStorageComboBoxes; }; #endif diff --git a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/ContourModelToImage/QmitkContourModelToImageWidget.cpp b/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/ContourModelToImage/QmitkContourModelToImageWidget.cpp new file mode 100644 index 0000000000..24ec826e15 --- /dev/null +++ b/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/ContourModelToImage/QmitkContourModelToImageWidget.cpp @@ -0,0 +1,172 @@ +/*=================================================================== + +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 "QmitkContourModelToImageWidget.h" +#include "mitkImage.h" +#include "../../Common/QmitkDataSelectionWidget.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +static const char* const HelpText = "Select a image and a contour(set)"; + +QmitkContourModelToImageWidget::QmitkContourModelToImageWidget(mitk::SliceNavigationController* timeNavigationController, QWidget* parent) + : QmitkSegmentationUtilityWidget(timeNavigationController, parent) +{ + m_Controls.setupUi(this); + + m_Controls.dataSelectionWidget->AddDataStorageComboBox(QmitkDataSelectionWidget::ImageAndSegmentationPredicate); + m_Controls.dataSelectionWidget->AddDataStorageComboBox(QmitkDataSelectionWidget::ContourModelPredicate); + m_Controls.dataSelectionWidget->SetHelpText(HelpText); + + this->EnableButtons(false); + + connect (m_Controls.btnProcess, SIGNAL(pressed()), this, SLOT(OnProcessPressed())); + + connect(m_Controls.dataSelectionWidget, SIGNAL(SelectionChanged(unsigned int, const mitk::DataNode*)), + this, SLOT(OnSelectionChanged(unsigned int, const mitk::DataNode*))); + + if( m_Controls.dataSelectionWidget->GetSelection(0).IsNotNull() && + m_Controls.dataSelectionWidget->GetSelection(1).IsNotNull() ) + { + this->OnSelectionChanged( 0, m_Controls.dataSelectionWidget->GetSelection(0)); + } +} + +QmitkContourModelToImageWidget::~QmitkContourModelToImageWidget() +{ +} + +void QmitkContourModelToImageWidget::OnSelectionChanged(unsigned int index, const mitk::DataNode* selection) +{ + QmitkDataSelectionWidget* dataSelectionWidget = m_Controls.dataSelectionWidget; + mitk::DataNode::Pointer node0 = dataSelectionWidget->GetSelection(0); + mitk::DataNode::Pointer node1 = dataSelectionWidget->GetSelection(1); + + if (node0.IsNull() || node1.IsNull() ) + { + this->EnableButtons(false); + dataSelectionWidget->SetHelpText(HelpText); + } + else + { + this->SelectionControl(index, selection); + } +} + +void QmitkContourModelToImageWidget::SelectionControl(unsigned int index, const mitk::DataNode* /*selection*/) +{ + QmitkDataSelectionWidget* dataSelectionWidget = m_Controls.dataSelectionWidget; + mitk::DataNode::Pointer node = dataSelectionWidget->GetSelection(index); + + dataSelectionWidget->SetHelpText(""); + this->EnableButtons(); +} + +void QmitkContourModelToImageWidget::EnableButtons(bool enable) +{ + m_Controls.btnProcess->setEnabled(enable); +} + +void QmitkContourModelToImageWidget::OnProcessPressed() +{ + QmitkDataSelectionWidget* dataSelectionWidget = m_Controls.dataSelectionWidget; + + mitk::DataNode::Pointer imageNode = dataSelectionWidget->GetSelection(0); + mitk::DataNode::Pointer contourNode = dataSelectionWidget->GetSelection(1); + + if(imageNode.IsNull() || contourNode.IsNull() ) + { + MITK_ERROR << "Selection does not contain valid data"; + QMessageBox::information( this, "Contour To Image", + "Selection does not contain valid data, please select a binary image and a contour(set)", QMessageBox::Ok ); + m_Controls.btnProcess->setEnabled(false); + return; + } + + mitk::Image::Pointer image = static_cast(imageNode->GetData()); + + if (image.IsNull()) + { + MITK_ERROR<<"Error writing contours into image! Invalid image data selected!"; + return; + } + + unsigned int timeStep = this->GetTimeNavigationController()->GetTime()->GetPos(); + + mitk::ContourModelSet::Pointer contourSet; + mitk::ContourModel::Pointer contour = dynamic_cast(contourNode->GetData()); + if (contour.IsNotNull()) + { + contourSet = mitk::ContourModelSet::New(); + contourSet->AddContourModel(contour); + } + else + { + contourSet = static_cast(contourNode->GetData()); + if (contourSet.IsNull()) + { + MITK_ERROR<<"Error writing contours into binary image! Invalid contour data selected!"; + return; + } + } + + //Disable Buttons during calculation and initialize Progressbar + this->EnableButtons(false); + unsigned int num_contours = contourSet->GetContourModelList()->size(); + mitk::ProgressBar::GetInstance()->AddStepsToDo(num_contours); + mitk::ProgressBar::GetInstance()->Progress(); + + // Use mitk::ContourModelSetToImageFilter to fill the ContourModelSet into the image + mitk::ContourModelSetToImageFilter::Pointer contourFiller = mitk::ContourModelSetToImageFilter::New(); + contourFiller->SetTimeStep(timeStep); + contourFiller->SetImage(image); + contourFiller->SetInput(contourSet); + contourFiller->MakeOutputBinaryOn(); + contourFiller->Update(); + + // Add result to data storage + mitk::Image::Pointer result = contourFiller->GetOutput(); + if (result.IsNull()) + { + MITK_ERROR<<"Could not write the selected contours into the image!"; + return; + } + + result->DisconnectPipeline(); + mitk::DataNode::Pointer filled = mitk::DataNode::New(); + std::stringstream stream; + stream << imageNode->GetName(); + stream << "_"; + stream << contourNode->GetName(); + filled->SetName(stream.str()); + filled->SetData(result); + dataSelectionWidget->GetDataStorage()->Add(filled, imageNode); + + this->EnableButtons(); + + mitk::RenderingManager::GetInstance()->RequestUpdateAll(); +} diff --git a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/ContourModelToImage/QmitkContourModelToImageWidget.h b/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/ContourModelToImage/QmitkContourModelToImageWidget.h new file mode 100644 index 0000000000..52750f08f6 --- /dev/null +++ b/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/ContourModelToImage/QmitkContourModelToImageWidget.h @@ -0,0 +1,76 @@ +/*=================================================================== + +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 QmitkContourModelToImageWidget_h +#define QmitkContourModelToImageWidget_h + +#include "../QmitkSegmentationUtilityWidget.h" +#include + +namespace mitk { + class Image; + class ContourModelSet; + class ContourModel; + class Geometry3D; + class PlaneGeometry; +} + +/*! + \brief QmitkContourModelToImageWidget + + Tool masks an image with a binary image or a surface. The Method requires + an image and a binary image mask or a surface. The input image and the binary + image mask must be of the same size. Masking with a surface creates first a + binary image of the surface and then use this for the masking of the input image. +*/ +class QmitkContourModelToImageWidget : public QmitkSegmentationUtilityWidget +{ + Q_OBJECT + +public: + + /** @brief Default constructor, including creation of GUI elements and signals/slots connections. */ + explicit QmitkContourModelToImageWidget(mitk::SliceNavigationController* timeNavigationController, QWidget* parent = NULL); + + /** @brief Defaul destructor. */ + ~QmitkContourModelToImageWidget(); + +private slots: + + /** @brief This slot is called if the selection in the workbench is changed. */ + void OnSelectionChanged(unsigned int index, const mitk::DataNode* selection); + + /** @brief This slot is called if user activates the button to mask an image. */ + void OnProcessPressed(); + +private: + + /** @brief Check if selections is valid. */ + void SelectionControl( unsigned int index, const mitk::DataNode* selection); + + /** @brief Enable buttons if data selction is valid. */ + void EnableButtons(bool enable = true); + + /** @brief Fills a mitk::ContourModel into a given segmentation image */ + itk::SmartPointer ContourModelToImage(itk::SmartPointer segmenationImage, itk::SmartPointer contour ); + + /** @brief Fills a whole ContourModelSet into a given segmentation image */ + itk::SmartPointer ContourModelSetToImage( itk::SmartPointer segmenationImage, itk::SmartPointer contourSet ); + + Ui::QmitkContourModelToImageWidgetControls m_Controls; +}; + +#endif diff --git a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/ContourModelToImage/QmitkContourModelToImageWidgetControls.ui b/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/ContourModelToImage/QmitkContourModelToImageWidgetControls.ui new file mode 100644 index 0000000000..d69bca34b7 --- /dev/null +++ b/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/ContourModelToImage/QmitkContourModelToImageWidgetControls.ui @@ -0,0 +1,48 @@ + + + QmitkContourModelToImageWidgetControls + + + + 0 + 0 + 180 + 154 + + + + + + + + + + Process + + + + + + + Qt::Vertical + + + + 20 + 273 + + + + + + + + + QmitkDataSelectionWidget + QWidget +
internal/Common/QmitkDataSelectionWidget.h
+
+
+ + +
diff --git a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/QmitkSegmentationUtilitiesView.cpp b/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/QmitkSegmentationUtilitiesView.cpp index 0c62bdb2c1..2a052fa130 100644 --- a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/QmitkSegmentationUtilitiesView.cpp +++ b/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/QmitkSegmentationUtilitiesView.cpp @@ -1,99 +1,105 @@ /*=================================================================== 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. ===================================================================*/ // #define ENABLE_CTK_WIDGETS_WIDGET #include "QmitkSegmentationUtilitiesView.h" #include "BooleanOperations/QmitkBooleanOperationsWidget.h" +#include "ContourModelToImage/QmitkContourModelToImageWidget.h" #include "ImageMasking/QmitkImageMaskingWidget.h" #include "MorphologicalOperations/QmitkMorphologicalOperationsWidget.h" #include "SurfaceToImage/QmitkSurfaceToImageWidget.h" #include "CTKWidgets/QmitkCTKWidgetsWidget.h" QmitkSegmentationUtilitiesView::QmitkSegmentationUtilitiesView() : m_BooleanOperationsWidget(NULL), + m_ContourModelToImageWidget(NULL), m_ImageMaskingWidget(NULL), m_MorphologicalOperationsWidget(NULL), m_SurfaceToImageWidget(NULL), m_CTKWidgetsWidget(NULL) { } QmitkSegmentationUtilitiesView::~QmitkSegmentationUtilitiesView() { } void QmitkSegmentationUtilitiesView::CreateQtPartControl(QWidget* parent) { m_Controls.setupUi(parent); mitk::IRenderWindowPart* renderWindowPart = this->GetRenderWindowPart(); mitk::SliceNavigationController* timeNavigationController = renderWindowPart != NULL ? renderWindowPart->GetTimeNavigationController() : NULL; m_BooleanOperationsWidget = new QmitkBooleanOperationsWidget(timeNavigationController, parent); + m_ContourModelToImageWidget = new QmitkContourModelToImageWidget(timeNavigationController, parent); m_ImageMaskingWidget = new QmitkImageMaskingWidget(timeNavigationController, parent); m_MorphologicalOperationsWidget = new QmitkMorphologicalOperationsWidget(timeNavigationController, parent); m_SurfaceToImageWidget = new QmitkSurfaceToImageWidget(timeNavigationController, parent); this->AddUtilityWidget(m_BooleanOperationsWidget, QIcon(":/SegmentationUtilities/BooleanOperations_48x48.png"), "Boolean Operations"); + this->AddUtilityWidget(m_ContourModelToImageWidget, QIcon(":/SegmentationUtilities/ContourModelSetToImage_48x48.png"), "Contour To Image"); this->AddUtilityWidget(m_ImageMaskingWidget, QIcon(":/SegmentationUtilities/ImageMasking_48x48.png"), "Image Masking"); this->AddUtilityWidget(m_MorphologicalOperationsWidget, QIcon(":/SegmentationUtilities/MorphologicalOperations_48x48.png"), "Morphological Operations"); this->AddUtilityWidget(m_SurfaceToImageWidget, QIcon(":/SegmentationUtilities/SurfaceToImage_48x48.png"), "Surface To Image"); #ifdef ENABLE_CTK_WIDGETS_WIDGET m_CTKWidgetsWidget = new QmitkCTKWidgetsWidget(timeNavigationController, parent); this->AddUtilityWidget(m_CTKWidgetsWidget, QIcon(":/SegmentationUtilities/CTKWidgets_48x48.png"), "CTK Widgets"); #endif } void QmitkSegmentationUtilitiesView::AddUtilityWidget(QWidget* widget, const QIcon& icon, const QString& text) { m_Controls.toolBox->addItem(widget, icon, text); } void QmitkSegmentationUtilitiesView::SetFocus() { m_Controls.toolBox->setFocus(); } void QmitkSegmentationUtilitiesView::RenderWindowPartActivated(mitk::IRenderWindowPart* renderWindowPart) { mitk::SliceNavigationController* timeNavigationController = renderWindowPart->GetTimeNavigationController(); m_BooleanOperationsWidget->SetTimeNavigationController(timeNavigationController); + m_ContourModelToImageWidget->SetTimeNavigationController(timeNavigationController); m_ImageMaskingWidget->SetTimeNavigationController(timeNavigationController); m_MorphologicalOperationsWidget->SetTimeNavigationController(timeNavigationController); m_SurfaceToImageWidget->SetTimeNavigationController(timeNavigationController); #ifdef ENABLE_CTK_WIDGETS_WIDGET m_CTKWidgetsWidget->SetTimeNavigationController(timeNavigationController); #endif } void QmitkSegmentationUtilitiesView::RenderWindowPartDeactivated(mitk::IRenderWindowPart*) { m_BooleanOperationsWidget->SetTimeNavigationController(NULL); + m_ContourModelToImageWidget->SetTimeNavigationController(NULL); m_ImageMaskingWidget->SetTimeNavigationController(NULL); m_MorphologicalOperationsWidget->SetTimeNavigationController(NULL); m_SurfaceToImageWidget->SetTimeNavigationController(NULL); #ifdef ENABLE_CTK_WIDGETS_WIDGET m_CTKWidgetsWidget->SetTimeNavigationController(NULL); #endif } diff --git a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/QmitkSegmentationUtilitiesView.h b/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/QmitkSegmentationUtilitiesView.h index ef82651dad..ebd991eabd 100644 --- a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/QmitkSegmentationUtilitiesView.h +++ b/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/QmitkSegmentationUtilitiesView.h @@ -1,55 +1,57 @@ /*=================================================================== 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 QmitkSegmentationUtilitiesView_h #define QmitkSegmentationUtilitiesView_h #include #include #include class QmitkBooleanOperationsWidget; +class QmitkContourModelToImageWidget; class QmitkImageMaskingWidget; class QmitkMorphologicalOperationsWidget; class QmitkSurfaceToImageWidget; class QmitkCTKWidgetsWidget; class QmitkSegmentationUtilitiesView : public QmitkAbstractView, public mitk::IRenderWindowPartListener { Q_OBJECT public: QmitkSegmentationUtilitiesView(); ~QmitkSegmentationUtilitiesView(); void CreateQtPartControl(QWidget* parent); void SetFocus(); void RenderWindowPartActivated(mitk::IRenderWindowPart* renderWindowPart); void RenderWindowPartDeactivated(mitk::IRenderWindowPart* renderWindowPart); private: void AddUtilityWidget(QWidget* widget, const QIcon& icon, const QString& text); Ui::QmitkSegmentationUtilitiesViewControls m_Controls; QmitkBooleanOperationsWidget* m_BooleanOperationsWidget; + QmitkContourModelToImageWidget* m_ContourModelToImageWidget; QmitkImageMaskingWidget* m_ImageMaskingWidget; QmitkMorphologicalOperationsWidget* m_MorphologicalOperationsWidget; QmitkSurfaceToImageWidget* m_SurfaceToImageWidget; QmitkCTKWidgetsWidget* m_CTKWidgetsWidget; }; #endif