diff --git a/Modules/Bundles/org.mitk.gui.qt.diffusionimaging/files.cmake b/Modules/Bundles/org.mitk.gui.qt.diffusionimaging/files.cmake index ee77a40cef..525cd9521b 100644 --- a/Modules/Bundles/org.mitk.gui.qt.diffusionimaging/files.cmake +++ b/Modules/Bundles/org.mitk.gui.qt.diffusionimaging/files.cmake @@ -1,102 +1,102 @@ SET(SRC_CPP_FILES QmitkODFDetailsWidget.cpp QmitkODFRenderWidget.cpp QmitkPartialVolumeAnalysisWidget.cpp QmitkIVIMWidget.cpp ) SET(INTERNAL_CPP_FILES mitkPluginActivator.cpp QmitkQBallReconstructionView.cpp QmitkPreprocessingView.cpp QmitkDiffusionDicomImportView.cpp QmitkDiffusionQuantificationView.cpp QmitkTensorReconstructionView.cpp QmitkDiffusionImagingPublicPerspective.cpp QmitkControlVisualizationPropertiesView.cpp QmitkODFDetailsView.cpp QmitkGibbsTrackingView.cpp QmitkStochasticFiberTrackingView.cpp - QmitkFiberBundleOperationsView.cpp + QmitkFiberProcessingView.cpp QmitkFiberBundleDeveloperView.cpp QmitkPartialVolumeAnalysisView.cpp QmitkIVIMView.cpp QmitkScreenshotMaker.cpp ) SET(UI_FILES src/internal/QmitkQBallReconstructionViewControls.ui src/internal/QmitkPreprocessingViewControls.ui src/internal/QmitkDiffusionDicomImportViewControls.ui src/internal/QmitkDiffusionQuantificationViewControls.ui src/internal/QmitkTensorReconstructionViewControls.ui src/internal/QmitkControlVisualizationPropertiesViewControls.ui src/internal/QmitkODFDetailsViewControls.ui src/internal/QmitkGibbsTrackingViewControls.ui src/internal/QmitkStochasticFiberTrackingViewControls.ui - src/internal/QmitkFiberBundleOperationsViewControls.ui + src/internal/QmitkFiberProcessingViewControls.ui src/internal/QmitkFiberBundleDeveloperViewControls.ui src/internal/QmitkPartialVolumeAnalysisViewControls.ui src/internal/QmitkIVIMViewControls.ui src/internal/QmitkScreenshotMakerControls.ui ) SET(MOC_H_FILES src/internal/mitkPluginActivator.h src/internal/QmitkQBallReconstructionView.h src/internal/QmitkPreprocessingView.h src/internal/QmitkDiffusionDicomImportView.h src/internal/QmitkDiffusionImagingPublicPerspective.h src/internal/QmitkDiffusionQuantificationView.h src/internal/QmitkTensorReconstructionView.h src/internal/QmitkControlVisualizationPropertiesView.h src/internal/QmitkODFDetailsView.h src/QmitkODFRenderWidget.h src/QmitkODFDetailsWidget.h src/internal/QmitkGibbsTrackingView.h src/internal/QmitkStochasticFiberTrackingView.h - src/internal/QmitkFiberBundleOperationsView.h + src/internal/QmitkFiberProcessingView.h src/internal/QmitkFiberBundleDeveloperView.h src/internal/QmitkPartialVolumeAnalysisView.h src/QmitkPartialVolumeAnalysisWidget.h src/internal/QmitkIVIMView.h src/internal/QmitkScreenshotMaker.h ) SET(CACHED_RESOURCE_FILES # list of resource files which can be used by the plug-in # system without loading the plug-ins shared library, # for example the icon used in the menu and tabs for the # plug-in views in the workbench plugin.xml resources/preprocessing.png resources/dwiimport.png resources/quantification.png resources/reconodf.png resources/recontensor.png resources/vizControls.png resources/OdfDetails.png resources/GibbsTracking.png resources/FiberBundleOperations.png resources/PartialVolumeAnalysis_24.png resources/IVIM_48.png resources/screenshot_maker.png resources/stochFB.png ) SET(QRC_FILES # uncomment the following line if you want to use Qt resources resources/QmitkDiffusionImaging.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/Modules/Bundles/org.mitk.gui.qt.diffusionimaging/plugin.xml b/Modules/Bundles/org.mitk.gui.qt.diffusionimaging/plugin.xml index 40aead2ee8..cc0063c353 100644 --- a/Modules/Bundles/org.mitk.gui.qt.diffusionimaging/plugin.xml +++ b/Modules/Bundles/org.mitk.gui.qt.diffusionimaging/plugin.xml @@ -1,110 +1,110 @@ - diff --git a/Modules/Bundles/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkFiberBundleOperationsView.cpp b/Modules/Bundles/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkFiberBundleOperationsView.cpp deleted file mode 100644 index 0eb2acf5aa..0000000000 --- a/Modules/Bundles/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkFiberBundleOperationsView.cpp +++ /dev/null @@ -1,1801 +0,0 @@ -/*========================================================================= - - Program: Medical Imaging & Interaction Toolkit - Language: C++ - Date: $Date: 2010-03-31 16:40:27 +0200 (Mi, 31 Mrz 2010) $ - Version: $Revision: 21975 $ - - Copyright (c) German Cancer Research Center, Division of Medical and - Biological Informatics. All rights reserved. - See MITKCopyright.txt or http://www.mitk.org/copyright.html for details. - - This software is distributed WITHOUT ANY WARRANTY; without even - the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - PURPOSE. See the above copyright notices for more information. - - =========================================================================*/ - - -// Blueberry -#include -#include - - - -// Qmitk -#include "QmitkFiberBundleOperationsView.h" -#include "QmitkStdMultiWidget.h" - -// Qt -#include - -//MITK -#include "mitkNodePredicateProperty.h" -//#include "mitkNodePredicateAND.h" -#include "mitkImageCast.h" - -#include "mitkPointSet.h" - - -#include "mitkPlanarCircle.h" -#include "mitkPlanarPolygon.h" -#include -#include "mitkPlanarFigureInteractor.h" -#include "mitkGlobalInteraction.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -const std::string QmitkFiberBundleOperationsView::VIEW_ID = "org.mitk.views.fiberbundleoperations"; -const std::string id_DataManager = "org.mitk.views.datamanager"; -using namespace berry; -using namespace mitk; - -struct FboSelListener : ISelectionListener -{ - - berryObjectMacro(FboSelListener); - - FboSelListener(QmitkFiberBundleOperationsView* view) - { - m_View = view; - } - - void DoSelectionChanged(ISelection::ConstPointer selection) - { - // save current selection in member variable - m_View->m_CurrentSelection = selection.Cast(); - - // do something with the selected items - if(m_View->m_CurrentSelection) - { - bool foundFiberBundle = false; - std::string classname = "FiberBundle"; - - // iterate selection - for (IStructuredSelection::iterator i = m_View->m_CurrentSelection->Begin(); - i != m_View->m_CurrentSelection->End(); ++i) - { - - // extract datatree node - if (mitk::DataNodeObject::Pointer nodeObj = i->Cast()) - { - mitk::DataNode::Pointer node = nodeObj->GetDataNode(); - std::string fname = node->GetData()->GetNameOfClass(); - if(node->GetData() && classname.compare(node->GetData()->GetNameOfClass())==0) - { - foundFiberBundle = true; - } - } - } - - if(foundFiberBundle) - { - m_View->m_Controls->m_CircleButton->setEnabled(true); - m_View->m_Controls->m_PolygonButton->setEnabled(true); - m_View->m_Controls->m_RectangleButton->setEnabled(true); - } - else{ - m_View->m_Controls->m_CircleButton->setEnabled(false); - m_View->m_Controls->m_PolygonButton->setEnabled(false); - m_View->m_Controls->m_RectangleButton->setEnabled(false); - } - } - } - - void SelectionChanged(IWorkbenchPart::Pointer part, ISelection::ConstPointer selection) - { - // check, if selection comes from datamanager - if (part) - { - QString partname(part->GetPartName().c_str()); - if(partname.compare("Datamanager")==0) - { - - // apply selection - DoSelectionChanged(selection); - - } - } - } - - QmitkFiberBundleOperationsView* m_View; -}; - - - -QmitkFiberBundleOperationsView::QmitkFiberBundleOperationsView() -: QmitkFunctionality() -, m_Controls( 0 ) -, m_MultiWidget( NULL ) -, m_EllipseCounter(0) -, m_PolygonCounter(0) -//, m_SelectedFBNodes( NULL ) -//, m_SelectedPFNodes(0) -, m_UpsamplingFactor(5) -{ - -} - -// Destructor -QmitkFiberBundleOperationsView::~QmitkFiberBundleOperationsView() -{ - -} - - -void QmitkFiberBundleOperationsView::CreateQtPartControl( QWidget *parent ) -{ - // build up qt view, unless already done - if ( !m_Controls ) - { - // create GUI widgets from the Qt Designer's .ui file - m_Controls = new Ui::QmitkFiberBundleOperationsViewControls; - m_Controls->setupUi( parent ); - m_Controls->doExtractFibersButton->setDisabled(true); - m_Controls->PFCompoANDButton->setDisabled(true); - m_Controls->PFCompoORButton->setDisabled(true); - m_Controls->PFCompoNOTButton->setDisabled(true); - m_Controls->m_CircleButton->setEnabled(false); - m_Controls->m_PolygonButton->setEnabled(false); - m_Controls->m_RectangleButton->setEnabled(false); - m_Controls->m_RectangleButton->setVisible(false); - - connect( m_Controls->doExtractFibersButton, SIGNAL(clicked()), this, SLOT(DoFiberExtraction()) ); - //connect( m_Controls->comboBox_fiberAlgo, SIGNAL(selected()), this, SLOT(handleAlgoSelection() ); - connect( m_Controls->m_CircleButton, SIGNAL( clicked() ), this, SLOT( ActionDrawEllipseTriggered() ) ); - connect( m_Controls->m_PolygonButton, SIGNAL( clicked() ), this, SLOT( ActionDrawPolygonTriggered() ) ); - connect(m_Controls->PFCompoANDButton, SIGNAL(clicked()), this, SLOT(generatePFCompo_AND()) ); - connect(m_Controls->PFCompoORButton, SIGNAL(clicked()), this, SLOT(generatePFCompo_OR()) ); - connect(m_Controls->PFCompoNOTButton, SIGNAL(clicked()), this, SLOT(generatePFCompo_NOT()) ); - - connect(m_Controls->m_JoinBundles, SIGNAL(clicked()), this, SLOT(JoinBundles()) ); - connect(m_Controls->m_SubstractBundles, SIGNAL(clicked()), this, SLOT(SubstractBundles()) ); - connect(m_Controls->m_GenerateROIImage, SIGNAL(clicked()), this, SLOT(GenerateROIImage()) ); - - connect( m_Controls->m_GenerationStartButton, SIGNAL(clicked()), this, SLOT(GenerationStart()) ); - } - - m_SelListener = berry::ISelectionListener::Pointer(new FboSelListener(this)); - this->GetSite()->GetWorkbenchWindow()->GetSelectionService()->AddPostSelectionListener(/*"org.mitk.views.datamanager",*/ m_SelListener); - berry::ISelection::ConstPointer sel( - this->GetSite()->GetWorkbenchWindow()->GetSelectionService()->GetSelection("org.mitk.views.datamanager")); - m_CurrentSelection = sel.Cast(); - m_SelListener.Cast()->DoSelectionChanged(sel); -} - -void QmitkFiberBundleOperationsView::GenerateROIImage(){ - - if (m_Image.IsNull() || m_SelectedPF.empty()) - return; - - mitk::Image* image = const_cast(m_Image.GetPointer()); - - MaskImage3DType::Pointer temp = MaskImage3DType::New(); - mitk::CastToItkImage(m_Image, temp); - - m_PlanarFigureImage = MaskImage3DType::New(); - m_PlanarFigureImage->SetSpacing( temp->GetSpacing() ); // Set the image spacing - m_PlanarFigureImage->SetOrigin( temp->GetOrigin() ); // Set the image origin - m_PlanarFigureImage->SetDirection( temp->GetDirection() ); // Set the image direction - m_PlanarFigureImage->SetRegions( temp->GetLargestPossibleRegion() ); - m_PlanarFigureImage->Allocate(); - m_PlanarFigureImage->FillBuffer( 0 ); - - - for (int i=0; iInitializeByItk(m_PlanarFigureImage.GetPointer()); - tmpImage->SetVolume(m_PlanarFigureImage->GetBufferPointer()); - node->SetData(tmpImage); - node->SetName("ROI Image"); - this->GetDefaultDataStorage()->Add(node); -} - -void QmitkFiberBundleOperationsView::CompositeExtraction(mitk::DataNode::Pointer node, mitk::Image* image) -{ - if (dynamic_cast(node.GetPointer()->GetData()) && !dynamic_cast(node.GetPointer()->GetData())) - { - m_PlanarFigure = dynamic_cast(node.GetPointer()->GetData()); - AccessFixedDimensionByItk_2( - image, - InternalReorientImagePlane, 3, - m_PlanarFigure->GetGeometry(), -1); - -// itk::Image< unsigned char, 3 >::Pointer outimage = itk::Image< unsigned char, 3 >::New(); - -// outimage->SetSpacing( m_PlanarFigure->GetGeometry()->GetSpacing()/m_UpsamplingFactor ); // Set the image spacing - -// mitk::Point3D origin = m_PlanarFigure->GetGeometry()->GetOrigin(); -// mitk::Point3D indexOrigin; -// m_PlanarFigure->GetGeometry()->WorldToIndex(origin, indexOrigin); -// indexOrigin[0] = indexOrigin[0] - .5 * (1.0-1.0/m_UpsamplingFactor); -// indexOrigin[1] = indexOrigin[1] - .5 * (1.0-1.0/m_UpsamplingFactor); -// indexOrigin[2] = indexOrigin[2] - .5 * (1.0-1.0/m_UpsamplingFactor); -// mitk::Point3D newOrigin; -// m_PlanarFigure->GetGeometry()->IndexToWorld(indexOrigin, newOrigin); - -// outimage->SetOrigin( newOrigin ); // Set the image origin -// itk::Matrix matrix; -// for (int i=0; i<3; i++) -// for (int j=0; j<3; j++) -// matrix[j][i] = m_PlanarFigure->GetGeometry()->GetMatrixColumn(i)[j]/m_PlanarFigure->GetGeometry()->GetSpacing().GetElement(i); -// outimage->SetDirection( matrix ); // Set the image direction - -// itk::ImageRegion<3> upsampledRegion; -// upsampledRegion.SetSize(0, m_PlanarFigure->GetGeometry()->GetParametricExtentInMM(0)/m_PlanarFigure->GetGeometry()->GetSpacing()[0]); -// upsampledRegion.SetSize(1, m_PlanarFigure->GetGeometry()->GetParametricExtentInMM(1)/m_PlanarFigure->GetGeometry()->GetSpacing()[1]); -// upsampledRegion.SetSize(2, 1); - -// typename itk::Image< unsigned char, 3 >::RegionType::SizeType upsampledSize = upsampledRegion.GetSize(); -// for (unsigned int n = 0; n < 2; n++) -// { -// upsampledSize[n] = upsampledSize[n] * m_UpsamplingFactor; -// } -// upsampledRegion.SetSize( upsampledSize ); -// outimage->SetRegions( upsampledRegion ); - -// outimage->Allocate(); - -// this->m_InternalImage = mitk::Image::New(); -// this->m_InternalImage->InitializeByItk( outimage.GetPointer() ); -// this->m_InternalImage->SetVolume( outimage->GetBufferPointer() ); - - AccessFixedDimensionByItk_2( - m_InternalImage, - InternalCalculateMaskFromPlanarFigure, - 3, 2, node->GetName() ); - } -} - -template < typename TPixel, unsigned int VImageDimension > - void QmitkFiberBundleOperationsView::InternalReorientImagePlane( - const itk::Image< TPixel, VImageDimension > *image, mitk::Geometry3D* planegeo3D, int additionalIndex ) -{ - - MITK_INFO << "InternalReorientImagePlane() start"; - - typedef itk::Image< TPixel, VImageDimension > ImageType; - typedef itk::Image< float, VImageDimension > FloatImageType; - - typedef itk::ResampleImageFilter ResamplerType; - typename ResamplerType::Pointer resampler = ResamplerType::New(); - - mitk::PlaneGeometry* planegeo = dynamic_cast(planegeo3D); - - float upsamp = m_UpsamplingFactor; - float gausssigma = 0.5; - - // Spacing - typename ResamplerType::SpacingType spacing = planegeo->GetSpacing(); - spacing[0] = image->GetSpacing()[0] / upsamp; - spacing[1] = image->GetSpacing()[1] / upsamp; - spacing[2] = image->GetSpacing()[2]; - resampler->SetOutputSpacing( spacing ); - - // Size - typename ResamplerType::SizeType size; - size[0] = planegeo->GetParametricExtentInMM(0) / spacing[0]; - size[1] = planegeo->GetParametricExtentInMM(1) / spacing[1]; - size[2] = 1; - resampler->SetSize( size ); - - // Origin - typename mitk::Point3D orig = planegeo->GetOrigin(); - typename mitk::Point3D corrorig; - planegeo3D->WorldToIndex(orig,corrorig); - corrorig[0] += 0.5/upsamp; - corrorig[1] += 0.5/upsamp; - corrorig[2] += 0; - planegeo3D->IndexToWorld(corrorig,corrorig); - resampler->SetOutputOrigin(corrorig ); - - // Direction - typename ResamplerType::DirectionType direction; - typename mitk::AffineTransform3D::MatrixType matrix = planegeo->GetIndexToWorldTransform()->GetMatrix(); - for(int c=0; cSetOutputDirection( direction ); - - // Gaussian interpolation - if(gausssigma != 0) - { - double sigma[3]; - for( unsigned int d = 0; d < 3; d++ ) - { - sigma[d] = gausssigma * image->GetSpacing()[d]; - } - double alpha = 2.0; - - typedef itk::GaussianInterpolateImageFunction - GaussianInterpolatorType; - - typename GaussianInterpolatorType::Pointer interpolator - = GaussianInterpolatorType::New(); - - interpolator->SetInputImage( image ); - interpolator->SetParameters( sigma, alpha ); - - resampler->SetInterpolator( interpolator ); - } - else - { - // typedef typename itk::BSplineInterpolateImageFunction - // InterpolatorType; - typedef typename itk::LinearInterpolateImageFunction InterpolatorType; - - typename InterpolatorType::Pointer interpolator - = InterpolatorType::New(); - - interpolator->SetInputImage( image ); - - resampler->SetInterpolator( interpolator ); - - } - - // Other resampling options - resampler->SetInput( image ); - resampler->SetDefaultPixelValue(0); - - MITK_INFO << "Resampling requested image plane ... "; - resampler->Update(); - MITK_INFO << " ... done"; - - if(additionalIndex < 0) - { - this->m_InternalImage = mitk::Image::New(); - this->m_InternalImage->InitializeByItk( resampler->GetOutput() ); - this->m_InternalImage->SetVolume( resampler->GetOutput()->GetBufferPointer() ); - } -} - -template < typename TPixel, unsigned int VImageDimension > - void QmitkFiberBundleOperationsView::InternalCalculateMaskFromPlanarFigure( - itk::Image< TPixel, VImageDimension > *image, unsigned int axis, std::string nodeName ) -{ - - MITK_INFO << "InternalCalculateMaskFromPlanarFigure() start"; - - typedef itk::Image< TPixel, VImageDimension > ImageType; - typedef itk::CastImageFilter< ImageType, MaskImage3DType > CastFilterType; - - // Generate mask image as new image with same header as input image and - // initialize with "1". - MaskImage3DType::Pointer newMaskImage = MaskImage3DType::New(); - newMaskImage->SetSpacing( image->GetSpacing() ); // Set the image spacing - newMaskImage->SetOrigin( image->GetOrigin() ); // Set the image origin - newMaskImage->SetDirection( image->GetDirection() ); // Set the image direction - newMaskImage->SetRegions( image->GetLargestPossibleRegion() ); - newMaskImage->Allocate(); - newMaskImage->FillBuffer( 1 ); - - // Generate VTK polygon from (closed) PlanarFigure polyline - // (The polyline points are shifted by -0.5 in z-direction to make sure - // that the extrusion filter, which afterwards elevates all points by +0.5 - // in z-direction, creates a 3D object which is cut by the the plane z=0) - const Geometry2D *planarFigureGeometry2D = m_PlanarFigure->GetGeometry2D(); - const PlanarFigure::PolyLineType planarFigurePolyline = m_PlanarFigure->GetPolyLine( 0 ); - const Geometry3D *imageGeometry3D = m_InternalImage->GetGeometry( 0 ); - - vtkPolyData *polyline = vtkPolyData::New(); - polyline->Allocate( 1, 1 ); - - // Determine x- and y-dimensions depending on principal axis - int i0, i1; - switch ( axis ) - { - case 0: - i0 = 1; - i1 = 2; - break; - - case 1: - i0 = 0; - i1 = 2; - break; - - case 2: - default: - i0 = 0; - i1 = 1; - break; - } - - // Create VTK polydata object of polyline contour - vtkPoints *points = vtkPoints::New(); - PlanarFigure::PolyLineType::const_iterator it; - std::vector indices; - - unsigned int numberOfPoints = 0; - - for ( it = planarFigurePolyline.begin(); - it != planarFigurePolyline.end(); - ++it ) - { - Point3D point3D; - - // Convert 2D point back to the local index coordinates of the selected - // image - Point2D point2D = it->Point; - planarFigureGeometry2D->WorldToIndex(point2D, point2D); - point2D[0] -= 0.5/m_UpsamplingFactor; - point2D[1] -= 0.5/m_UpsamplingFactor; - planarFigureGeometry2D->IndexToWorld(point2D, point2D); - planarFigureGeometry2D->Map( point2D, point3D ); - - // Polygons (partially) outside of the image bounds can not be processed - // further due to a bug in vtkPolyDataToImageStencil - if ( !imageGeometry3D->IsInside( point3D ) ) - { - float bounds[2] = {0,0}; - bounds[0] = - this->m_InternalImage->GetLargestPossibleRegion().GetSize().GetElement(i0); - bounds[1] = - this->m_InternalImage->GetLargestPossibleRegion().GetSize().GetElement(i1); - - imageGeometry3D->WorldToIndex( point3D, point3D ); - -// if (point3D[i0]<0) -// point3D[i0] = 0.5; -// else if (point3D[i0]>bounds[0]) -// point3D[i0] = bounds[0]-0.5; - -// if (point3D[i1]<0) -// point3D[i1] = 0.5; -// else if (point3D[i1]>bounds[1]) -// point3D[i1] = bounds[1]-0.5; - - if (point3D[i0]<0) - point3D[i0] = 0.0; - else if (point3D[i0]>bounds[0]) - point3D[i0] = bounds[0]-0.001; - - if (point3D[i1]<0) - point3D[i1] = 0.0; - else if (point3D[i1]>bounds[1]) - point3D[i1] = bounds[1]-0.001; - - points->InsertNextPoint( point3D[i0], point3D[i1], -0.5 ); - numberOfPoints++; - } - else - { - imageGeometry3D->WorldToIndex( point3D, point3D ); - - // Add point to polyline array - points->InsertNextPoint( point3D[i0], point3D[i1], -0.5 ); - numberOfPoints++; - } - } - polyline->SetPoints( points ); - points->Delete(); - - vtkIdType *ptIds = new vtkIdType[numberOfPoints]; - for ( vtkIdType i = 0; i < numberOfPoints; ++i ) - { - ptIds[i] = i; - } - polyline->InsertNextCell( VTK_POLY_LINE, numberOfPoints, ptIds ); - - - // Extrude the generated contour polygon - vtkLinearExtrusionFilter *extrudeFilter = vtkLinearExtrusionFilter::New(); - extrudeFilter->SetInput( polyline ); - extrudeFilter->SetScaleFactor( 1 ); - extrudeFilter->SetExtrusionTypeToNormalExtrusion(); - extrudeFilter->SetVector( 0.0, 0.0, 1.0 ); - - // Make a stencil from the extruded polygon - vtkPolyDataToImageStencil *polyDataToImageStencil = vtkPolyDataToImageStencil::New(); - polyDataToImageStencil->SetInput( extrudeFilter->GetOutput() ); - - - - // Export from ITK to VTK (to use a VTK filter) - typedef itk::VTKImageImport< MaskImage3DType > ImageImportType; - typedef itk::VTKImageExport< MaskImage3DType > ImageExportType; - - typename ImageExportType::Pointer itkExporter = ImageExportType::New(); - itkExporter->SetInput( newMaskImage ); - - vtkImageImport *vtkImporter = vtkImageImport::New(); - this->ConnectPipelines( itkExporter, vtkImporter ); - vtkImporter->Update(); - - - // Apply the generated image stencil to the input image - vtkImageStencil *imageStencilFilter = vtkImageStencil::New(); - imageStencilFilter->SetInputConnection( vtkImporter->GetOutputPort() ); - imageStencilFilter->SetStencil( polyDataToImageStencil->GetOutput() ); - imageStencilFilter->ReverseStencilOff(); - imageStencilFilter->SetBackgroundValue( 0 ); - imageStencilFilter->Update(); - - - // Export from VTK back to ITK - vtkImageExport *vtkExporter = vtkImageExport::New(); - vtkExporter->SetInputConnection( imageStencilFilter->GetOutputPort() ); - vtkExporter->Update(); - - typename ImageImportType::Pointer itkImporter = ImageImportType::New(); - this->ConnectPipelines( vtkExporter, itkImporter ); - itkImporter->Update(); - - // calculate cropping bounding box - m_InternalImageMask3D = itkImporter->GetOutput(); - m_InternalImageMask3D->SetDirection(image->GetDirection()); - - itk::ImageRegionConstIterator - itmask(m_InternalImageMask3D, m_InternalImageMask3D->GetLargestPossibleRegion()); - itk::ImageRegionIterator - itimage(image, image->GetLargestPossibleRegion()); - - itmask = itmask.Begin(); - itimage = itimage.Begin(); - - typename ImageType::SizeType lowersize = {{9999999999,9999999999,9999999999}}; - typename ImageType::SizeType uppersize = {{0,0,0}}; - while( !itmask.IsAtEnd() ) - { - if(itmask.Get() == 0) - { - itimage.Set(0); - } - else - { - typename ImageType::IndexType index = itimage.GetIndex(); - typename ImageType::SizeType signedindex; - signedindex[0] = index[0]; - signedindex[1] = index[1]; - signedindex[2] = index[2]; - - lowersize[0] = signedindex[0] < lowersize[0] ? signedindex[0] : lowersize[0]; - lowersize[1] = signedindex[1] < lowersize[1] ? signedindex[1] : lowersize[1]; - lowersize[2] = signedindex[2] < lowersize[2] ? signedindex[2] : lowersize[2]; - - uppersize[0] = signedindex[0] > uppersize[0] ? signedindex[0] : uppersize[0]; - uppersize[1] = signedindex[1] > uppersize[1] ? signedindex[1] : uppersize[1]; - uppersize[2] = signedindex[2] > uppersize[2] ? signedindex[2] : uppersize[2]; - } - - ++itmask; - ++itimage; - } - - typename ImageType::IndexType index; - index[0] = lowersize[0]; - index[1] = lowersize[1]; - index[2] = lowersize[2]; - - typename ImageType::SizeType size; - size[0] = uppersize[0] - lowersize[0] + 1; - size[1] = uppersize[1] - lowersize[1] + 1; - size[2] = uppersize[2] - lowersize[2] + 1; - - itk::ImageRegion<3> cropRegion = itk::ImageRegion<3>(index, size); - - // crop internal mask - typedef itk::RegionOfInterestImageFilter< MaskImage3DType, MaskImage3DType > ROIMaskFilterType; - typename ROIMaskFilterType::Pointer roi2 = ROIMaskFilterType::New(); - roi2->SetRegionOfInterest(cropRegion); - roi2->SetInput(m_InternalImageMask3D); - roi2->Update(); - m_InternalImageMask3D = roi2->GetOutput(); - - Image::Pointer tmpImage = Image::New(); - tmpImage->InitializeByItk(m_InternalImageMask3D.GetPointer()); - tmpImage->SetVolume(m_InternalImageMask3D->GetBufferPointer()); - - Image::Pointer tmpImage2 = Image::New(); - tmpImage2->InitializeByItk(m_PlanarFigureImage.GetPointer()); - const Geometry3D *pfImageGeometry3D = tmpImage2->GetGeometry( 0 ); - - const Geometry3D *intImageGeometry3D = tmpImage->GetGeometry( 0 ); - - typedef itk::ImageRegionIteratorWithIndex IteratorType; - IteratorType imageIterator (m_InternalImageMask3D, m_InternalImageMask3D->GetRequestedRegion()); - imageIterator.GoToBegin(); - while ( !imageIterator.IsAtEnd() ) - { - unsigned char val = imageIterator.Value(); - if (val>0) - { - itk::Index<3> index = imageIterator.GetIndex(); - Point3D point; - point[0] = index[0]; - point[1] = index[1]; - point[2] = index[2]; - - intImageGeometry3D->IndexToWorld(point, point); - pfImageGeometry3D->WorldToIndex(point, point); - - point[i0] += 0.5; - point[i1] += 0.5; - - index[0] = point[0]; - index[1] = point[1]; - index[2] = point[2]; - - m_PlanarFigureImage->SetPixel(index, 1); - } - ++imageIterator; - } - - // Clean up VTK objects - polyline->Delete(); - extrudeFilter->Delete(); - polyDataToImageStencil->Delete(); - vtkImporter->Delete(); - imageStencilFilter->Delete(); - //vtkExporter->Delete(); // TODO: crashes when outcommented; memory leak?? - delete[] ptIds; - -} - -void QmitkFiberBundleOperationsView::StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) -{ - m_MultiWidget = &stdMultiWidget; -} - - -void QmitkFiberBundleOperationsView::StdMultiWidgetNotAvailable() -{ - m_MultiWidget = NULL; -} - -/* OnSelectionChanged is registered to SelectionService, therefore no need to - implement SelectionService Listener explicitly */ - -void QmitkFiberBundleOperationsView::OnSelectionChanged( std::vector nodes ) -{ - if ( !this->IsVisible() ) - return; - - if (nodes.empty()) - { - m_Controls->doExtractFibersButton->setDisabled(true); - m_Controls->PFCompoANDButton->setDisabled(true); - m_Controls->PFCompoORButton->setDisabled(true); - m_Controls->PFCompoNOTButton->setDisabled(true); - m_Controls->m_JoinBundles->setEnabled(false); - m_Controls->m_SubstractBundles->setEnabled(false); - m_Controls->m_GenerationStartButton->setEnabled(false); - } - - //reset existing Vectors containing FiberBundles and PlanarFigures from a previous selection - m_SelectedFB.clear(); - m_SelectedPF.clear(); - m_Image = NULL; - - for( std::vector::iterator it = nodes.begin(); it != nodes.end(); ++it ) - { - mitk::DataNode::Pointer node = *it; - if ( dynamic_cast(node->GetData()) ) - { - m_SelectedFB.push_back(node); - mitk::FiberBundle::Pointer bundle = dynamic_cast(node->GetData()); - QString numFibers; - this->m_Controls->m_NumFibersLabel->setText(numFibers.setNum(bundle->GetNumTracts())); - } - else if (dynamic_cast(node->GetData())) - m_SelectedPF.push_back(node); - else if (dynamic_cast(node->GetData())) - m_Image = dynamic_cast(node->GetData()); - } - - if (m_SelectedPF.size() >= 1 && m_Image.IsNotNull()) - m_Controls->m_GenerateROIImage->setEnabled(true); - else - m_Controls->m_GenerateROIImage->setEnabled(false); - - if (m_SelectedPF.size() == 1) - { - m_Controls->PFCompoANDButton->setDisabled(true); - m_Controls->PFCompoORButton->setDisabled(true); - m_Controls->PFCompoNOTButton->setEnabled(true); - } - else if (m_SelectedPF.size() > 1) - { - m_Controls->PFCompoANDButton->setEnabled(true); - m_Controls->PFCompoORButton->setEnabled(true); - m_Controls->PFCompoNOTButton->setDisabled(true); - } - - if (m_SelectedFB.size() == 1 && m_SelectedPF.size() == 1) - m_Controls->doExtractFibersButton->setEnabled(true); - - if (m_SelectedFB.size() == 2) - { - m_Controls->m_JoinBundles->setEnabled(true); - m_Controls->m_SubstractBundles->setEnabled(true); - } - else - { - m_Controls->m_JoinBundles->setEnabled(false); - m_Controls->m_SubstractBundles->setEnabled(false); - } - - if (m_SelectedFB.size()>0) - m_Controls->m_GenerationStartButton->setEnabled(true); - else - m_Controls->m_GenerationStartButton->setEnabled(false); -} - - -void QmitkFiberBundleOperationsView::ActionDrawPolygonTriggered() -{ - // bool checked = m_Controls->m_PolygonButton->isChecked(); - // if(!this->AssertDrawingIsPossible(checked)) - // return; - - mitk::PlanarPolygon::Pointer figure = mitk::PlanarPolygon::New(); - figure->ClosedOn(); - this->AddFigureToDataStorage(figure, QString("Polygon%1").arg(++m_PolygonCounter)); - - MITK_INFO << "PlanarPolygon created ..."; - - mitk::DataStorage::SetOfObjects::ConstPointer _NodeSet = this->GetDefaultDataStorage()->GetAll(); - mitk::DataNode* node = 0; - mitk::PlanarFigureInteractor::Pointer figureInteractor = 0; - mitk::PlanarFigure* figureP = 0; - - for(mitk::DataStorage::SetOfObjects::ConstIterator it=_NodeSet->Begin(); it!=_NodeSet->End() - ; it++) - { - node = const_cast(it->Value().GetPointer()); - figureP = dynamic_cast(node->GetData()); - - if(figureP) - { - figureInteractor = dynamic_cast(node->GetInteractor()); - - if(figureInteractor.IsNull()) - figureInteractor = mitk::PlanarFigureInteractor::New("PlanarFigureInteractor", node); - - mitk::GlobalInteraction::GetInstance()->AddInteractor(figureInteractor); - } - } - -} - - -void QmitkFiberBundleOperationsView::ActionDrawEllipseTriggered() -{ - //bool checked = m_Controls->m_CircleButton->isChecked(); - //if(!this->AssertDrawingIsPossible(checked)) - // return; - - mitk::PlanarCircle::Pointer figure = mitk::PlanarCircle::New(); - this->AddFigureToDataStorage(figure, QString("Circle%1").arg(++m_EllipseCounter)); - - this->GetDataStorage()->Modified(); - MITK_INFO << "PlanarCircle created ..."; - - //call - - mitk::DataStorage::SetOfObjects::ConstPointer _NodeSet = this->GetDefaultDataStorage()->GetAll(); - mitk::DataNode* node = 0; - mitk::PlanarFigureInteractor::Pointer figureInteractor = 0; - mitk::PlanarFigure* figureP = 0; - - for(mitk::DataStorage::SetOfObjects::ConstIterator it=_NodeSet->Begin(); it!=_NodeSet->End() - ; it++) - { - node = const_cast(it->Value().GetPointer()); - figureP = dynamic_cast(node->GetData()); - - if(figureP) - { - figureInteractor = dynamic_cast(node->GetInteractor()); - - if(figureInteractor.IsNull()) - figureInteractor = mitk::PlanarFigureInteractor::New("PlanarFigureInteractor", node); - - mitk::GlobalInteraction::GetInstance()->AddInteractor(figureInteractor); - } - } - - - -} - -void QmitkFiberBundleOperationsView::Activated() -{ - - MITK_INFO << "FB OPerations ACTIVATED()"; - /* - - mitk::DataStorage::SetOfObjects::ConstPointer _NodeSet = this->GetDefaultDataStorage()->GetAll(); - mitk::DataNode* node = 0; - mitk::PlanarFigureInteractor::Pointer figureInteractor = 0; - mitk::PlanarFigure* figure = 0; - - for(mitk::DataStorage::SetOfObjects::ConstIterator it=_NodeSet->Begin(); it!=_NodeSet->End() - ; it++) - { - node = const_cast(it->Value().GetPointer()); - figure = dynamic_cast(node->GetData()); - - if(figure) - { - figureInteractor = dynamic_cast(node->GetInteractor()); - - if(figureInteractor.IsNull()) - figureInteractor = mitk::PlanarFigureInteractor::New("PlanarFigureInteractor", node); - - mitk::GlobalInteraction::GetInstance()->AddInteractor(figureInteractor); - } - } - - */ - - -} - -void QmitkFiberBundleOperationsView::AddFigureToDataStorage(mitk::PlanarFigure* figure, const QString& name, - const char *propertyKey, mitk::BaseProperty *property ) -{ - // initialize figure's geometry with empty geometry - mitk::PlaneGeometry::Pointer emptygeometry = mitk::PlaneGeometry::New(); - figure->SetGeometry2D( emptygeometry ); - - //set desired data to DataNode where Planarfigure is stored - mitk::DataNode::Pointer newNode = mitk::DataNode::New(); - newNode->SetName(name.toStdString()); - newNode->SetData(figure); - - newNode->AddProperty( "planarfigure.default.line.color", mitk::ColorProperty::New(1.0,0.0,0.0)); - newNode->AddProperty( "planarfigure.line.width", mitk::FloatProperty::New(2.0)); - newNode->AddProperty( "planarfigure.drawshadow", mitk::BoolProperty::New(true)); - - - - - - - newNode->AddProperty( "selected", mitk::BoolProperty::New(true) ); - newNode->AddProperty( "planarfigure.ishovering", mitk::BoolProperty::New(true) ); - newNode->AddProperty( "planarfigure.drawoutline", mitk::BoolProperty::New(true) ); - newNode->AddProperty( "planarfigure.drawquantities", mitk::BoolProperty::New(false) ); - newNode->AddProperty( "planarfigure.drawshadow", mitk::BoolProperty::New(true) ); - - newNode->AddProperty( "planarfigure.line.width", mitk::FloatProperty::New(3.0) ); - newNode->AddProperty( "planarfigure.shadow.widthmodifier", mitk::FloatProperty::New(2.0) ); - newNode->AddProperty( "planarfigure.outline.width", mitk::FloatProperty::New(2.0) ); - newNode->AddProperty( "planarfigure.helperline.width", mitk::FloatProperty::New(2.0) ); - -// PlanarFigureControlPointStyleProperty::Pointer styleProperty = -// dynamic_cast< PlanarFigureControlPointStyleProperty* >( node->GetProperty( "planarfigure.controlpointshape" ) ); -// if ( styleProperty.IsNotNull() ) -// { -// m_ControlPointShape = styleProperty->GetShape(); -// } - - newNode->AddProperty( "planarfigure.default.line.color", mitk::ColorProperty::New(1.0,1.0,1.0) ); - newNode->AddProperty( "planarfigure.default.line.opacity", mitk::FloatProperty::New(2.0) ); - newNode->AddProperty( "planarfigure.default.outline.color", mitk::ColorProperty::New(1.0,0.0,0.0) ); - newNode->AddProperty( "planarfigure.default.outline.opacity", mitk::FloatProperty::New(2.0) ); - newNode->AddProperty( "planarfigure.default.helperline.color", mitk::ColorProperty::New(1.0,0.0,0.0) ); - newNode->AddProperty( "planarfigure.default.helperline.opacity", mitk::FloatProperty::New(2.0) ); - newNode->AddProperty( "planarfigure.default.markerline.color", mitk::ColorProperty::New(0.0,0.0,0.0) ); - newNode->AddProperty( "planarfigure.default.markerline.opacity", mitk::FloatProperty::New(2.0) ); - newNode->AddProperty( "planarfigure.default.marker.color", mitk::ColorProperty::New(1.0,1.0,1.0) ); - newNode->AddProperty( "planarfigure.default.marker.opacity",mitk::FloatProperty::New(2.0) ); - - newNode->AddProperty( "planarfigure.hover.line.color", mitk::ColorProperty::New(1.0,0.0,0.0) ); - newNode->AddProperty( "planarfigure.hover.line.opacity", mitk::FloatProperty::New(2.0) ); - newNode->AddProperty( "planarfigure.hover.outline.color", mitk::ColorProperty::New(1.0,0.0,0.0) ); - newNode->AddProperty( "planarfigure.hover.outline.opacity", mitk::FloatProperty::New(2.0) ); - newNode->AddProperty( "planarfigure.hover.helperline.color", mitk::ColorProperty::New(1.0,0.0,0.0) ); - newNode->AddProperty( "planarfigure.hover.helperline.opacity", mitk::FloatProperty::New(2.0) ); - newNode->AddProperty( "planarfigure.hover.markerline.color", mitk::ColorProperty::New(1.0,0.0,0.0) ); - newNode->AddProperty( "planarfigure.hover.markerline.opacity", mitk::FloatProperty::New(2.0) ); - newNode->AddProperty( "planarfigure.hover.marker.color", mitk::ColorProperty::New(1.0,0.0,0.0) ); - newNode->AddProperty( "planarfigure.hover.marker.opacity", mitk::FloatProperty::New(2.0) ); - - newNode->AddProperty( "planarfigure.selected.line.color", mitk::ColorProperty::New(1.0,0.0,0.0) ); - newNode->AddProperty( "planarfigure.selected.line.opacity",mitk::FloatProperty::New(2.0) ); - newNode->AddProperty( "planarfigure.selected.outline.color", mitk::ColorProperty::New(1.0,0.0,0.0) ); - newNode->AddProperty( "planarfigure.selected.outline.opacity", mitk::FloatProperty::New(2.0)); - newNode->AddProperty( "planarfigure.selected.helperline.color", mitk::ColorProperty::New(1.0,0.0,0.0) ); - newNode->AddProperty( "planarfigure.selected.helperline.opacity",mitk::FloatProperty::New(2.0) ); - newNode->AddProperty( "planarfigure.selected.markerline.color", mitk::ColorProperty::New(1.0,0.0,0.0) ); - newNode->AddProperty( "planarfigure.selected.markerline.opacity", mitk::FloatProperty::New(2.0) ); - newNode->AddProperty( "planarfigure.selected.marker.color", mitk::ColorProperty::New(1.0,0.0,0.0) ); - newNode->AddProperty( "planarfigure.selected.marker.opacity",mitk::FloatProperty::New(2.0)); - - - - - - - - - - - - - - - - // Add custom property, if available - //if ( (propertyKey != NULL) && (property != NULL) ) - //{ - // newNode->AddProperty( propertyKey, property ); - //} - - //get current selected DataNode -which should be a FiberBundle- and set PlanarFigure as child - - //this->GetDataStorage()->GetNodes() - - - - // mitk::FiberBundle::Pointer selectedFBNode = m_SelectedFBNodes.at(0); - - // figure drawn on the topmost layer / image - this->GetDataStorage()->Add(newNode ); - - std::vector selectedNodes = GetDataManagerSelection(); - for(unsigned int i = 0; i < selectedNodes.size(); i++) - { - selectedNodes[i]->SetSelected(false); - } - //selectedNodes = m_SelectedPlanarFigureNodes->GetNodes(); - /*for(unsigned int i = 0; i < selectedNodes.size(); i++) - { - selectedNodes[i]->SetSelected(false); - } - */ - newNode->SetSelected(true); - - //Select(newNode); -} - -void QmitkFiberBundleOperationsView::DoFiberExtraction() -{ - mitk::FiberBundle::Pointer selFB = dynamic_cast(m_SelectedFB.at(0)->GetData()); - mitk::PlanarFigure::Pointer selPF = dynamic_cast (m_SelectedPF.at(0)->GetData()); - - - std::vector extFBset = selFB->extractFibersByPF(selPF); - - - //MITK_INFO << "returned vector in FBOperationsView: " << extFBset.size(); - // for(std::vector::iterator dispIt = extFBset.begin(); dispIt != extFBset.end(); dispIt++) - // { - // MITK_INFO << "vector DTI ID: " << *dispIt; - // - // } - - - mitk::FiberBundle::Pointer extFB = selFB->extractFibersById(extFBset); - MITK_INFO << " Number Of Tracts in sourceFiberBundle: " << selFB->GetNumTracts(); - MITK_INFO << " Number Of Tracts in extractedFiberBundle: " << extFB->GetNumTracts(); - - mitk::DataNode::Pointer fbNode; - fbNode = mitk::DataNode::New(); - fbNode->SetData(extFB); - fbNode->SetName("extGroupFinberBundle"); - fbNode->SetVisibility(true); - GetDataStorage()->Add(fbNode); - - - -} - -void QmitkFiberBundleOperationsView::generatePFCompo_AND() -{ - mitk::PlanarFigureComposite::Pointer PFCAnd = mitk::PlanarFigureComposite::New(); - - mitk::PlaneGeometry* currentGeometry2D = dynamic_cast( const_cast(GetActiveStdMultiWidget()->GetRenderWindow1()->GetRenderer()->GetCurrentWorldGeometry2D())); - PFCAnd->SetGeometry2D(currentGeometry2D); - - PFCAnd->setOperationType(mitk::PFCOMPOSITION_AND_OPERATION); - - - for( std::vector::iterator it = m_SelectedPF.begin(); - it != m_SelectedPF.end(); ++it ) - { - - mitk::DataNode::Pointer nodePF = *it; - mitk::PlanarFigure::Pointer tmpPF = dynamic_cast( nodePF->GetData() ); - PFCAnd->addPlanarFigure( tmpPF ); - PFCAnd->addDataNode( nodePF ); - PFCAnd->setDisplayName("AND_COMPO"); - // MITK_INFO << "PFCAND(): added to AND PF" << nodePF->GetName(); - - } - - debugPFComposition(PFCAnd, 0); - - - this->addPFCompositionToDataStorage(PFCAnd, NULL /*parent*/); - -} - - -void QmitkFiberBundleOperationsView::debugPFComposition(mitk::PlanarFigureComposite::Pointer pfc, int itLevelStatus) -{ - int myLevel = itLevelStatus; - if (myLevel == 0) - { - MITK_INFO << "############################################## " ; - MITK_INFO << "######### DEBUG START ############## " ; - MITK_INFO << "############################################## " ; - } - MITK_INFO << "############################################## " ; - MITK_INFO << "Name: " << pfc->getDisplayName(); - MITK_INFO << "iterationLevel: " << myLevel; - MITK_INFO << "CompositionType: " << pfc->getOperationType(); - MITK_INFO << "Number of children: " << pfc->getNumberOfChildren(); - - - //iterate through pfcs children - for(int i=0; igetNumberOfChildren(); ++i) - { - - mitk::PlanarFigure::Pointer tmpPFchild = pfc->getChildAt(i); - mitk::DataNode::Pointer savedPFchildNode = pfc->getDataNodeAt(i); - - if (tmpPFchild == savedPFchildNode->GetData()) - { - MITK_INFO << "[OK] Pointers point to same Data..."; - - }else{ - MITK_INFO << "Pointers differ in equation"; - } - - MITK_INFO << "Level: " << myLevel << " ChildNr.: " << i ; - - mitk::PlanarFigureComposite::Pointer pfcompcastNode= dynamic_cast(savedPFchildNode->GetData()); - mitk::PlanarFigureComposite::Pointer pfcompcast= dynamic_cast(tmpPFchild.GetPointer()); - if( !pfcompcast.IsNull() ) - { // we have a composite as child - - if ( pfcompcastNode.IsNull() ) - { - MITK_INFO << "************** NODE DIFFER FROM PFC...ERROR! ***************"; - } else { - MITK_INFO << "[OK]...node contains right type "; - } - - - - itLevelStatus++; - MITK_INFO << "child is PFC...debug this PFC"; - debugPFComposition(pfcompcast, itLevelStatus); - - } else { - - - // we have a planarFigure as child - // figure out which type - mitk::PlanarCircle::Pointer circleName = mitk::PlanarCircle::New(); - mitk::PlanarRectangle::Pointer rectName = mitk::PlanarRectangle::New(); - mitk::PlanarPolygon::Pointer polyName = mitk::PlanarPolygon::New(); - - - if (tmpPFchild->GetNameOfClass() == circleName->GetNameOfClass() ) - { - MITK_INFO << "a circle child of " << pfc->getDisplayName() ; - - } else if (tmpPFchild->GetNameOfClass() == rectName->GetNameOfClass() ){ - - MITK_INFO << "a rectangle child of " << pfc->getDisplayName() ; - - } else if (tmpPFchild->GetNameOfClass() == polyName->GetNameOfClass() ) { - - MITK_INFO << "a polygon child of " << pfc->getDisplayName() ; - } - - MITK_INFO << "....................................................... " ; - - - - - } - - } //end for - if (myLevel == 0) - { - MITK_INFO << "############################################## " ; - MITK_INFO << "######### DEBUG END ############## " ; - MITK_INFO << "############################################## " ; - } - - - -} - -void QmitkFiberBundleOperationsView::generatePFCompo_OR() -{ - mitk::PlanarFigureComposite::Pointer PFCOr = mitk::PlanarFigureComposite::New(); - mitk::PlaneGeometry* currentGeometry2D = dynamic_cast( const_cast(GetActiveStdMultiWidget()->GetRenderWindow1()->GetRenderer()->GetCurrentWorldGeometry2D())); - PFCOr->SetGeometry2D(currentGeometry2D); - PFCOr->setOperationType(mitk::PFCOMPOSITION_OR_OPERATION); - - - for( std::vector::iterator it = m_SelectedPF.begin(); - it != m_SelectedPF.end(); ++it ) - { - - mitk::DataNode::Pointer nodePF = *it; - mitk::PlanarFigure::Pointer tmpPF = dynamic_cast( nodePF->GetData() ); - PFCOr->addPlanarFigure( tmpPF ); - PFCOr->addDataNode( nodePF ); - PFCOr->setDisplayName("OR_COMPO"); - // MITK_INFO << "PFCAND(): added to AND PF" << nodePF->GetName(); - - } - - debugPFComposition(PFCOr, 0); - - - this->addPFCompositionToDataStorage(PFCOr, NULL /*parent*/); - -} - -void QmitkFiberBundleOperationsView::generatePFCompo_NOT() -{ - mitk::PlanarFigureComposite::Pointer PFCNot = mitk::PlanarFigureComposite::New(); - mitk::PlaneGeometry* currentGeometry2D = dynamic_cast( const_cast(GetActiveStdMultiWidget()->GetRenderWindow1()->GetRenderer()->GetCurrentWorldGeometry2D())); - PFCNot->SetGeometry2D(currentGeometry2D); - PFCNot->setOperationType(mitk::PFCOMPOSITION_NOT_OPERATION); - - - for( std::vector::iterator it = m_SelectedPF.begin(); - it != m_SelectedPF.end(); ++it ) - { - - mitk::DataNode::Pointer nodePF = *it; - mitk::PlanarFigure::Pointer tmpPF = dynamic_cast( nodePF->GetData() ); - PFCNot->addPlanarFigure( tmpPF ); - PFCNot->addDataNode( nodePF ); - PFCNot->setDisplayName("NOT_COMPO"); - // MITK_INFO << "PFCAND(): added to AND PF" << nodePF->GetName(); - - } - - debugPFComposition(PFCNot, 0); - - - this->addPFCompositionToDataStorage(PFCNot, NULL /*parent*/); - -} - -void QmitkFiberBundleOperationsView::addPFCompositionToDataStorage(mitk::PlanarFigureComposite::Pointer pfcomp, mitk::DataNode::Pointer parentDataNode ) -{ - - //a new planarFigureComposition arrived - //convert it into a dataNode - mitk::DataNode::Pointer newPFCNode; - newPFCNode = mitk::DataNode::New(); - newPFCNode->SetName( pfcomp->getDisplayName() ); - //MITK_INFO << "PFComp Name: " << pfcomp->getDisplayName() << " newPFCNodeName: " << newPFCNode->GetName(); - newPFCNode->SetData(pfcomp); - newPFCNode->SetVisibility(true); - - switch (pfcomp->getOperationType()) { - case 0: - { - // AND PLANARFIGURECOMPOSITE - // newPFCNode->SetName("AND_PFCombo"); - - if (!parentDataNode.IsNull()) { - MITK_INFO << "adding " << newPFCNode->GetName() << " to " << parentDataNode->GetName() ; - GetDataStorage()->Add(newPFCNode, parentDataNode); - - } else { - MITK_INFO << "adding " << newPFCNode->GetName(); - GetDataStorage()->Add(newPFCNode); - - } - - - //iterate through its childs - - for(int i=0; igetNumberOfChildren(); ++i) - { - mitk::PlanarFigure::Pointer tmpPFchild = pfcomp->getChildAt(i); - mitk::DataNode::Pointer savedPFchildNode = pfcomp->getDataNodeAt(i); - - mitk::PlanarFigureComposite::Pointer pfcompcast= dynamic_cast(tmpPFchild.GetPointer()); - if ( !pfcompcast.IsNull() ) - { // child is of type planar Figure composite - // make new node of the child, cuz later the child has to be removed of its old position in datamanager - // feed new dataNode with information of the savedDataNode, which is gonna be removed soon - mitk::DataNode::Pointer newChildPFCNode; - newChildPFCNode = mitk::DataNode::New(); - newChildPFCNode->SetData(tmpPFchild); - newChildPFCNode->SetName( savedPFchildNode->GetName() ); - pfcompcast->setDisplayName( savedPFchildNode->GetName() ); //name might be changed in DataManager by user - - //update inside vector the dataNodePointer - pfcomp->replaceDataNodeAt(i, newChildPFCNode); - - addPFCompositionToDataStorage(pfcompcast, newPFCNode); //the current PFCNode becomes the childs parent - - - // remove savedNode here, cuz otherwise its children will change their position in the dataNodeManager - // without having its parent anymore - //GetDataStorage()->Remove(savedPFchildNode); - - if ( GetDataStorage()->Exists(savedPFchildNode)) { - MITK_INFO << savedPFchildNode->GetName() << " exists in DS...trying to remove it"; - - }else{ - MITK_INFO << "[ERROR] does NOT exist, but can I read its Name? " << savedPFchildNode->GetName(); - - } - // remove old child position in dataStorage - GetDataStorage()->Remove(savedPFchildNode); - - - if ( GetDataStorage()->Exists(savedPFchildNode)) { - MITK_INFO << savedPFchildNode->GetName() << " still exists"; - } - - - } else { - - // child is not of type PlanarFigureComposite, so its one of the planarFigures - // create new dataNode containing the data of the old dataNode, but position in dataManager will be - // modified cuz we re setting a (new) parent. - mitk::DataNode::Pointer newPFchildNode = mitk::DataNode::New(); - newPFchildNode->SetName(savedPFchildNode->GetName() ); - newPFchildNode->SetData(tmpPFchild); - newPFchildNode->SetVisibility(true); - - // replace the dataNode in PFComp DataNodeVector - pfcomp->replaceDataNodeAt(i, newPFchildNode); - - - if ( GetDataStorage()->Exists(savedPFchildNode)) { - MITK_INFO << savedPFchildNode->GetName() << " exists in DS...trying to remove it"; - - }else{ - MITK_INFO << "[ERROR] does NOT exist, but can I read its Name? " << savedPFchildNode->GetName(); - - } - // remove old child position in dataStorage - GetDataStorage()->Remove(savedPFchildNode); - - - if ( GetDataStorage()->Exists(savedPFchildNode)) { - MITK_INFO << savedPFchildNode->GetName() << " still exists"; - } - - MITK_INFO << "adding " << newPFchildNode->GetName() << " to " << newPFCNode->GetName(); - //add new child to datamanager with its new position as child of newPFCNode parent - GetDataStorage()->Add(newPFchildNode, newPFCNode); - - } - - - - - } - GetDataStorage()->Modified(); - - - - - break; - } - case 1: - { - // AND PLANARFIGURECOMPOSITE - // newPFCNode->SetName("AND_PFCombo"); - - if (!parentDataNode.IsNull()) { - MITK_INFO << "adding " << newPFCNode->GetName() << " to " << parentDataNode->GetName() ; - GetDataStorage()->Add(newPFCNode, parentDataNode); - - } else { - MITK_INFO << "adding " << newPFCNode->GetName(); - GetDataStorage()->Add(newPFCNode); - - } - - - //iterate through its childs - - for(int i=0; igetNumberOfChildren(); ++i) - { - mitk::PlanarFigure::Pointer tmpPFchild = pfcomp->getChildAt(i); - mitk::DataNode::Pointer savedPFchildNode = pfcomp->getDataNodeAt(i); - - mitk::PlanarFigureComposite::Pointer pfcompcast= dynamic_cast(tmpPFchild.GetPointer()); - if ( !pfcompcast.IsNull() ) - { // child is of type planar Figure composite - // make new node of the child, cuz later the child has to be removed of its old position in datamanager - // feed new dataNode with information of the savedDataNode, which is gonna be removed soon - mitk::DataNode::Pointer newChildPFCNode; - newChildPFCNode = mitk::DataNode::New(); - newChildPFCNode->SetData(tmpPFchild); - newChildPFCNode->SetName( savedPFchildNode->GetName() ); - pfcompcast->setDisplayName( savedPFchildNode->GetName() ); //name might be changed in DataManager by user - - //update inside vector the dataNodePointer - pfcomp->replaceDataNodeAt(i, newChildPFCNode); - - addPFCompositionToDataStorage(pfcompcast, newPFCNode); //the current PFCNode becomes the childs parent - - - // remove savedNode here, cuz otherwise its children will change their position in the dataNodeManager - // without having its parent anymore - //GetDataStorage()->Remove(savedPFchildNode); - - if ( GetDataStorage()->Exists(savedPFchildNode)) { - MITK_INFO << savedPFchildNode->GetName() << " exists in DS...trying to remove it"; - - }else{ - MITK_INFO << "[ERROR] does NOT exist, but can I read its Name? " << savedPFchildNode->GetName(); - - } - // remove old child position in dataStorage - GetDataStorage()->Remove(savedPFchildNode); - - - if ( GetDataStorage()->Exists(savedPFchildNode)) { - MITK_INFO << savedPFchildNode->GetName() << " still exists"; - } - - - } else { - - // child is not of type PlanarFigureComposite, so its one of the planarFigures - // create new dataNode containing the data of the old dataNode, but position in dataManager will be - // modified cuz we re setting a (new) parent. - mitk::DataNode::Pointer newPFchildNode = mitk::DataNode::New(); - newPFchildNode->SetName(savedPFchildNode->GetName() ); - newPFchildNode->SetData(tmpPFchild); - newPFchildNode->SetVisibility(true); - - // replace the dataNode in PFComp DataNodeVector - pfcomp->replaceDataNodeAt(i, newPFchildNode); - - - if ( GetDataStorage()->Exists(savedPFchildNode)) { - MITK_INFO << savedPFchildNode->GetName() << " exists in DS...trying to remove it"; - - }else{ - MITK_INFO << "[ERROR] does NOT exist, but can I read its Name? " << savedPFchildNode->GetName(); - - } - // remove old child position in dataStorage - GetDataStorage()->Remove(savedPFchildNode); - - - if ( GetDataStorage()->Exists(savedPFchildNode)) { - MITK_INFO << savedPFchildNode->GetName() << " still exists"; - } - - MITK_INFO << "adding " << newPFchildNode->GetName() << " to " << newPFCNode->GetName(); - //add new child to datamanager with its new position as child of newPFCNode parent - GetDataStorage()->Add(newPFchildNode, newPFCNode); - - } - - - - - } - GetDataStorage()->Modified(); - - - - - break; - - } - case 2: - { - // AND PLANARFIGURECOMPOSITE - // newPFCNode->SetName("AND_PFCombo"); - - if (!parentDataNode.IsNull()) { - MITK_INFO << "adding " << newPFCNode->GetName() << " to " << parentDataNode->GetName() ; - GetDataStorage()->Add(newPFCNode, parentDataNode); - - } else { - MITK_INFO << "adding " << newPFCNode->GetName(); - GetDataStorage()->Add(newPFCNode); - - } - - - //iterate through its childs - - for(int i=0; igetNumberOfChildren(); ++i) - { - mitk::PlanarFigure::Pointer tmpPFchild = pfcomp->getChildAt(i); - mitk::DataNode::Pointer savedPFchildNode = pfcomp->getDataNodeAt(i); - - mitk::PlanarFigureComposite::Pointer pfcompcast= dynamic_cast(tmpPFchild.GetPointer()); - if ( !pfcompcast.IsNull() ) - { // child is of type planar Figure composite - // makeRemoveBundle new node of the child, cuz later the child has to be removed of its old position in datamanager - // feed new dataNode with information of the savedDataNode, which is gonna be removed soon - mitk::DataNode::Pointer newChildPFCNode; - newChildPFCNode = mitk::DataNode::New(); - newChildPFCNode->SetData(tmpPFchild); - newChildPFCNode->SetName( savedPFchildNode->GetName() ); - pfcompcast->setDisplayName( savedPFchildNode->GetName() ); //name might be changed in DataManager by user - - //update inside vector the dataNodePointer - pfcomp->replaceDataNodeAt(i, newChildPFCNode); - - addPFCompositionToDataStorage(pfcompcast, newPFCNode); //the current PFCNode becomes the childs parent - - - // remove savedNode here, cuz otherwise its children will change their position in the dataNodeManager - // without having its parent anymore - //GetDataStorage()->Remove(savedPFchildNode); - - if ( GetDataStorage()->Exists(savedPFchildNode)) { - MITK_INFO << savedPFchildNode->GetName() << " exists in DS...trying to remove it"; - - }else{ - MITK_INFO << "[ERROR] does NOT exist, but can I read its Name? " << savedPFchildNode->GetName(); - } - // remove old child position in dataStorage - GetDataStorage()->Remove(savedPFchildNode); - - - if ( GetDataStorage()->Exists(savedPFchildNode)) { - MITK_INFO << savedPFchildNode->GetName() << " still exists"; - } - - - } else { - - // child is not of type PlanarFigureComposite, so its one of the planarFigures - // create new dataNode containing the data of the old dataNode, but position in dataManager will be - // modified cuz we re setting a (new) parent. - mitk::DataNode::Pointer newPFchildNode = mitk::DataNode::New(); - newPFchildNode->SetName(savedPFchildNode->GetName() ); - newPFchildNode->SetData(tmpPFchild); - newPFchildNode->SetVisibility(true); - - // replace the dataNode in PFComp DataNodeVector - pfcomp->replaceDataNodeAt(i, newPFchildNode); - - - if ( GetDataStorage()->Exists(savedPFchildNode)) { - MITK_INFO << savedPFchildNode->GetName() << " exists in DS...trying to remove it"; - - }else{ - MITK_INFO << "[ERROR] does NOT exist, but can I read its Name? " << savedPFchildNode->GetName(); - - } - // remove old child position in dataStorage - GetDataStorage()->Remove(savedPFchildNode); - - - if ( GetDataStorage()->Exists(savedPFchildNode)) { - MITK_INFO << savedPFchildNode->GetName() << " still exists"; - } - - MITK_INFO << "adding " << newPFchildNode->GetName() << " to " << newPFCNode->GetName(); - //add new child to datamanager with its new position as child of newPFCNode parent - GetDataStorage()->Add(newPFchildNode, newPFCNode); - - } - - - - - } - GetDataStorage()->Modified(); - - - - - break; - } - default: - MITK_INFO << "we have an UNDEFINED composition... ERROR" ; - break; - } - - - - - - -} - - -void QmitkFiberBundleOperationsView::JoinBundles() -{ - mitk::FiberBundle::Pointer bundle1 = dynamic_cast(m_SelectedFB.at(0)->GetData()); - mitk::FiberBundle::Pointer bundle2 = dynamic_cast(m_SelectedFB.at(1)->GetData()); - - mitk::FiberBundle::Pointer newBundle = bundle1->JoinBundle(bundle2); - mitk::DataNode::Pointer fbNode = mitk::DataNode::New(); - fbNode->SetData(newBundle); - fbNode->SetName(m_SelectedFB.at(0)->GetName()+"+"+m_SelectedFB.at(1)->GetName()); - fbNode->SetVisibility(true); - GetDataStorage()->Add(fbNode); -} - -void QmitkFiberBundleOperationsView::SubstractBundles() -{ - mitk::FiberBundle::Pointer bundle1 = dynamic_cast(m_SelectedFB.at(0)->GetData()); - mitk::FiberBundle::Pointer bundle2 = dynamic_cast(m_SelectedFB.at(1)->GetData()); - - mitk::FiberBundle::Pointer newBundle = bundle1->SubstractBundle(bundle2); - mitk::DataNode::Pointer fbNode = mitk::DataNode::New(); - fbNode->SetData(newBundle); - fbNode->SetName(m_SelectedFB.at(0)->GetName()+"-"+m_SelectedFB.at(1)->GetName()); - fbNode->SetVisibility(true); - GetDataStorage()->Add(fbNode); -} - -void QmitkFiberBundleOperationsView::GenerationStart() -{ - int generationMethod = m_Controls->m_GenerationBox->currentIndex(); - - std::vector nodes = GetDataManagerSelection(); - if (nodes.empty()){ - QMessageBox::information( NULL, "Warning", "No data object selected!"); - MITK_WARN("QmitkFiberBundleOperationsView") << "no data object selected"; - return; - } - - for( std::vector::iterator it = nodes.begin(); it != nodes.end(); ++it ) - { - mitk::DataNode::Pointer node = *it; - - if (node.IsNotNull() && dynamic_cast(node->GetData())) - { - m_FiberBundle = dynamic_cast(node->GetData()); - m_FiberBundleNode = node; - switch(generationMethod){ - case 0: - GenerateTractDensityImage(true); - break; - case 1: - GenerateTractDensityImage(false); - break; - case 2: - GenerateColorHeatmap(); - break; - case 3: - GenerateFiberEndingsImage(); - break; - case 4: - GenerateFiberEndingsPointSet(); - break; - } - } - } -} - -// generate pointset displaying the fiber endings -void QmitkFiberBundleOperationsView::GenerateFiberEndingsPointSet() -{ - if(m_FiberBundle.IsNull()){ - QMessageBox::information( NULL, "Warning", "No fiber bundle selected!"); - MITK_WARN("QmitkGlobalFiberTrackingView") << "no fiber bundle selected"; - return; - } - - mitk::Geometry3D::Pointer geometry = m_FiberBundle->GetGeometry(); - - mitk::PointSet::Pointer pointSet = mitk::PointSet::New(); - - int numTracts = m_FiberBundle->GetNumTracts(); - int count = 0; - for( int i=0; iGetNumPoints(i); - itk::Point start = m_FiberBundle->GetPoint(i,0); - itk::Point world1; - geometry->IndexToWorld(start, world1); - pointSet->InsertPoint(count, world1); - count++; - // get fiber end point - if(numVertices>1) - { - itk::Point end = m_FiberBundle->GetPoint(i,numVertices-1); - itk::Point world; - geometry->IndexToWorld(end, world); - pointSet->InsertPoint(count, world); - count++; - } - } - - mitk::DataNode::Pointer pointSetNode = mitk::DataNode::New(); - pointSetNode->SetData( pointSet ); - QString name(m_FiberBundleNode->GetName().c_str()); - name += "_fiber_endings"; - pointSetNode->SetName(name.toStdString()); - pointSetNode->SetProperty( "opacity", mitk::FloatProperty::New( 1 ) ); - pointSetNode->SetProperty( "pointsize", mitk::FloatProperty::New( 0.1*m_Controls->m_UpsamplingSpinBox->value()) ); - pointSetNode->SetColor( 1.0, 1.0, 1.0 ); - - GetDefaultDataStorage()->Add(pointSetNode); -} - -// generate image displaying the fiber endings -void QmitkFiberBundleOperationsView::GenerateFiberEndingsImage() -{ - if(m_FiberBundle.IsNull()){ - QMessageBox::information( NULL, "Warning", "No fiber bundle selected!"); - MITK_WARN("QmitkGlobalFiberTrackingView") << "no fiber bundle selected"; - return; - } - - typedef unsigned char OutPixType; - - // run generator - typedef itk::TractsToFiberEndingsImageFilter ImageGeneratorType; - ImageGeneratorType::Pointer generator = ImageGeneratorType::New(); - generator->SetFiberBundle(m_FiberBundle); - - generator->SetUpsamplingFactor(m_Controls->m_UpsamplingSpinBox->value()); - generator->Update(); - - // get result - typedef itk::Image OutType; - OutType::Pointer outImg = generator->GetOutput(); - - mitk::Image::Pointer img = mitk::Image::New(); - img->InitializeByItk(outImg.GetPointer()); - img->SetVolume(outImg->GetBufferPointer()); - - // to datastorage - mitk::DataNode::Pointer node = mitk::DataNode::New(); - node->SetData(img); - QString name(m_FiberBundleNode->GetName().c_str()); - name += "_fiber_endings"; - node->SetName(name.toStdString()); - node->SetVisibility(true); - - GetDataStorage()->Add(node); -} - -// generate rgba heatmap from fiber bundle -void QmitkFiberBundleOperationsView::GenerateColorHeatmap() -{ - if(m_FiberBundle.IsNull() || m_FiberBundleNode.IsNull()) - { - QMessageBox::information( NULL, "Warning", "No fiber bundle selected!"); - MITK_WARN("QmitkGlobalFiberTrackingView") << "no fiber bundle selected"; - return; - } - - typedef itk::RGBAPixel OutPixType; - - // run generator - typedef itk::TractsToProbabilityImageFilter - ImageGeneratorType; - ImageGeneratorType::Pointer generator = ImageGeneratorType::New(); - //generator->SetInput(NULL); - generator->SetFiberBundle(m_FiberBundle); - - generator->SetUpsamplingFactor(m_Controls->m_UpsamplingSpinBox->value()); - generator->Update(); - - // get result - typedef itk::Image OutType; - OutType::Pointer outImg = generator->GetOutput(); - - mitk::Image::Pointer img = mitk::Image::New(); - img->InitializeByItk(outImg.GetPointer()); - img->SetVolume(outImg->GetBufferPointer()); - - // to datastorage - mitk::DataNode::Pointer node = mitk::DataNode::New(); - node->SetData(img); - QString name(m_FiberBundleNode->GetName().c_str()); - node->SetName(name.toStdString()); - node->SetVisibility(true); - - mitk::LevelWindow opaclevwin; - opaclevwin.SetRangeMinMax(0,255); - opaclevwin.SetWindowBounds(0,0); - mitk::LevelWindowProperty::Pointer prop = - mitk::LevelWindowProperty::New(opaclevwin); - node->AddProperty( "opaclevelwindow", prop ); - - GetDataStorage()->Add(node); -} - -// generate greyscale heatmap from fiber bundle -void QmitkFiberBundleOperationsView::GenerateTractDensityImage(bool binary) -{ - if(m_FiberBundle.IsNull() || m_FiberBundleNode.IsNull()) - { - QMessageBox::information( NULL, "Warning", "No fiber bundle selected!"); - MITK_WARN("QmitkGlobalFiberTrackingView") << "no fiber bundle selected"; - return; - } - - typedef unsigned char OutPixType; - - // run generator - typedef itk::TractsToProbabilityImageFilter ImageGeneratorType; - ImageGeneratorType::Pointer generator = ImageGeneratorType::New(); - generator->SetFiberBundle(m_FiberBundle); - generator->SetInvertImage(m_Controls->m_InvertCheckbox->isChecked()); - generator->SetUpsamplingFactor(m_Controls->m_UpsamplingSpinBox->value()); - if (binary) - generator->SetBinaryEnvelope(true); - else - generator->SetBinaryEnvelope(false); - generator->Update(); - - // get result - typedef itk::Image OutType; - OutType::Pointer outImg = generator->GetOutput(); - - mitk::Image::Pointer img = mitk::Image::New(); - img->InitializeByItk(outImg.GetPointer()); - img->SetVolume(outImg->GetBufferPointer()); - - // to datastorage - mitk::DataNode::Pointer node = mitk::DataNode::New(); - node->SetData(img); - QString name(m_FiberBundleNode->GetName().c_str()); - if(binary) - name += "_envelope"; - else - name += "_tdi"; - node->SetName(name.toStdString()); - node->SetVisibility(true); - - mitk::LevelWindow opaclevwin2; - opaclevwin2.SetRangeMinMax(0,255); - opaclevwin2.SetWindowBounds(0,0); - mitk::LevelWindowProperty::Pointer prop2 = - mitk::LevelWindowProperty::New(opaclevwin2); - node->AddProperty( "opaclevelwindow", prop2 ); - - GetDataStorage()->Add(node); -} - diff --git a/Modules/Bundles/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkFiberBundleOperationsView.h b/Modules/Bundles/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkFiberBundleOperationsView.h deleted file mode 100644 index 3adf3899e3..0000000000 --- a/Modules/Bundles/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkFiberBundleOperationsView.h +++ /dev/null @@ -1,198 +0,0 @@ -/*========================================================================= - -Program: Medical Imaging & Interaction Toolkit -Language: C++ -Date: $Date: 2010-03-31 16:40:27 +0200 (Mi, 31 Mrz 2010) $ -Version: $Revision: 21975 $ - -Copyright (c) German Cancer Research Center, Division of Medical and -Biological Informatics. All rights reserved. -See MITKCopyright.txt or http://www.mitk.org/copyright.html for details. - -This software is distributed WITHOUT ANY WARRANTY; without even -the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the above copyright notices for more information. - -=========================================================================*/ - -#ifndef QmitkFiberBundleOperationsView_h -#define QmitkFiberBundleOperationsView_h - -#include -#include - -#include -#include "ui_QmitkFiberBundleOperationsViewControls.h" - -#include "mitkDataStorage.h" -#include "mitkDataStorageSelection.h" - -#include "mitkPlanarFigure.h" -#include "mitkFiberBundle.h" -#include "mitkPlanarFigureComposite.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -struct FboSelListener; - -/*! -\brief QmitkFiberBundleView - -\warning This application module is not yet documented. Use "svn blame/praise/annotate" and ask the author to provide basic documentation. - -\sa QmitkFunctionality -\ingroup Functionalities -*/ -class QmitkFiberBundleOperationsView : public QmitkFunctionality -{ - - - friend struct FboSelListener; - - // this is needed for all Qt objects that should have a Qt meta-object - // (everything that derives from QObject and wants to have signal/slots) - Q_OBJECT - -public: - - typedef itk::Image< unsigned char, 3 > MaskImage3DType; - typedef itk::Image< float, 3 > FloatImageType; - - static const std::string VIEW_ID; - - QmitkFiberBundleOperationsView(); - virtual ~QmitkFiberBundleOperationsView(); - - virtual void CreateQtPartControl(QWidget *parent); - - virtual void StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget); - virtual void StdMultiWidgetNotAvailable(); - virtual void Activated(); - - protected slots: - - /// \brief Called when the user clicks the GUI button - void ActionDrawEllipseTriggered(); - void ActionDrawPolygonTriggered(); - void DoFiberExtraction(); - void generatePFCompo_AND(); - void generatePFCompo_OR(); - void generatePFCompo_NOT(); - - void JoinBundles(); - void SubstractBundles(); - void GenerateROIImage(); - void GenerationStart(); - - virtual void AddFigureToDataStorage(mitk::PlanarFigure* figure, const QString& name, - const char *propertyKey = NULL, mitk::BaseProperty *property = NULL ); - - -protected: - - /// \brief called by QmitkFunctionality when DataManager's selection has changed - virtual void OnSelectionChanged( std::vector nodes ); - - Ui::QmitkFiberBundleOperationsViewControls* m_Controls; - - QmitkStdMultiWidget* m_MultiWidget; - - //void Select( mitk::DataNode::Pointer node, bool clearMaskOnFirstArgNULL=false, bool clearImageOnFirstArgNULL=false ); - - /** Connection from VTK to ITK */ - template - void ConnectPipelines(VTK_Exporter* exporter, ITK_Importer importer) - { - importer->SetUpdateInformationCallback(exporter->GetUpdateInformationCallback()); - - importer->SetPipelineModifiedCallback(exporter->GetPipelineModifiedCallback()); - importer->SetWholeExtentCallback(exporter->GetWholeExtentCallback()); - importer->SetSpacingCallback(exporter->GetSpacingCallback()); - importer->SetOriginCallback(exporter->GetOriginCallback()); - importer->SetScalarTypeCallback(exporter->GetScalarTypeCallback()); - - importer->SetNumberOfComponentsCallback(exporter->GetNumberOfComponentsCallback()); - - importer->SetPropagateUpdateExtentCallback(exporter->GetPropagateUpdateExtentCallback()); - importer->SetUpdateDataCallback(exporter->GetUpdateDataCallback()); - importer->SetDataExtentCallback(exporter->GetDataExtentCallback()); - importer->SetBufferPointerCallback(exporter->GetBufferPointerCallback()); - importer->SetCallbackUserData(exporter->GetCallbackUserData()); - } - - template - void ConnectPipelines(ITK_Exporter exporter, VTK_Importer* importer) - { - importer->SetUpdateInformationCallback(exporter->GetUpdateInformationCallback()); - - importer->SetPipelineModifiedCallback(exporter->GetPipelineModifiedCallback()); - importer->SetWholeExtentCallback(exporter->GetWholeExtentCallback()); - importer->SetSpacingCallback(exporter->GetSpacingCallback()); - importer->SetOriginCallback(exporter->GetOriginCallback()); - importer->SetScalarTypeCallback(exporter->GetScalarTypeCallback()); - - importer->SetNumberOfComponentsCallback(exporter->GetNumberOfComponentsCallback()); - - importer->SetPropagateUpdateExtentCallback(exporter->GetPropagateUpdateExtentCallback()); - importer->SetUpdateDataCallback(exporter->GetUpdateDataCallback()); - importer->SetDataExtentCallback(exporter->GetDataExtentCallback()); - importer->SetBufferPointerCallback(exporter->GetBufferPointerCallback()); - importer->SetCallbackUserData(exporter->GetCallbackUserData()); - } - - template < typename TPixel, unsigned int VImageDimension > - void InternalCalculateMaskFromPlanarFigure( - itk::Image< TPixel, VImageDimension > *image, unsigned int axis, std::string nodeName ); - - template < typename TPixel, unsigned int VImageDimension > - void InternalReorientImagePlane( - const itk::Image< TPixel, VImageDimension > *image, mitk::Geometry3D* planegeo3D, int additionalIndex ); - - berry::ISelectionListener::Pointer m_SelListener; - berry::IStructuredSelection::ConstPointer m_CurrentSelection; - -private: - - int m_EllipseCounter; - int m_PolygonCounter; - //contains the selected FiberBundles - std::vector m_SelectedFB; - - //contains the selected PlanarFigures - std::vector m_SelectedPF; - - mitk::Image::ConstPointer m_Image; - mitk::Image::Pointer m_InternalImage; - mitk::PlanarFigure::Pointer m_PlanarFigure; - float m_UpsamplingFactor; - MaskImage3DType::Pointer m_InternalImageMask3D; - MaskImage3DType::Pointer m_PlanarFigureImage; - mitk::FiberBundle::Pointer m_FiberBundle; - mitk::DataNode::Pointer m_FiberBundleNode; - - void addPFCompositionToDataStorage(mitk::PlanarFigureComposite::Pointer, mitk::DataNode::Pointer); - void debugPFComposition(mitk::PlanarFigureComposite::Pointer , int ); - void CompositeExtraction(mitk::DataNode::Pointer node, mitk::Image* image); - void GenerateTractDensityImage(bool binary); - void GenerateColorHeatmap(); - void GenerateFiberEndingsImage(); - void GenerateFiberEndingsPointSet(); - void DWIGenerationStart(); -}; - - - -#endif // _QMITKFIBERTRACKINGVIEW_H_INCLUDED - diff --git a/Modules/Bundles/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkFiberBundleOperationsViewControls.ui b/Modules/Bundles/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkFiberBundleOperationsViewControls.ui deleted file mode 100644 index 0027cd1109..0000000000 --- a/Modules/Bundles/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkFiberBundleOperationsViewControls.ui +++ /dev/null @@ -1,535 +0,0 @@ - - - QmitkFiberBundleOperationsViewControls - - - - 0 - 0 - 665 - 587 - - - - Form - - - - 0 - - - - - - 0 - 0 - - - - - 200 - 50 - - - - - 300 - 60 - - - - QFrame::NoFrame - - - QFrame::Raised - - - - 12 - - - 0 - - - - - - 30 - 30 - - - - Draw circular ROI - - - - - - - :/QmitkDiffusionImaging/circle.png:/QmitkDiffusionImaging/circle.png - - - - 32 - 32 - - - - false - - - true - - - - - - - - 30 - 30 - - - - Draw rectangular ROI - - - - - - - :/QmitkDiffusionImaging/rectangle.png:/QmitkDiffusionImaging/rectangle.png - - - - 32 - 32 - - - - true - - - true - - - - - - - - 30 - 30 - - - - Draw polygonal ROI - - - - - - - :/QmitkDiffusionImaging/polygon.png:/QmitkDiffusionImaging/polygon.png - - - - 32 - 32 - - - - true - - - true - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - 16777215 - 16777215 - - - - QFrame::NoFrame - - - QFrame::Raised - - - - 0 - - - 0 - - - - - false - - - - 60 - 16777215 - - - - Create AND composition with selected ROIs - - - AND - - - - - - - false - - - - 60 - 16777215 - - - - Create OR composition with selected ROIs - - - OR - - - - - - - false - - - - 60 - 16777215 - - - - Create NOT composition from selected ROI - - - NOT - - - - - - - - - - QFrame::NoFrame - - - QFrame::Raised - - - - 0 - - - - - false - - - - 0 - 0 - - - - - 200 - 16777215 - - - - - 11 - - - - Extract fibers passing through selected ROI or composite ROI - - - Extract from ROIs - - - - - - - false - - - - 0 - 0 - - - - - 200 - 16777215 - - - - - 11 - - - - Merge two fiber bundles - - - Join Bundles - - - - - - - false - - - - 0 - 0 - - - - - 300 - 16777215 - - - - - 11 - - - - Generate a binary image containing all selected ROIs - - - Generate ROI Image - - - - - - - false - - - - 0 - 0 - - - - - 200 - 16777215 - - - - - 11 - - - - Returns fiber bundle containing all fibers the two selected bundles dont't have in common - - - Substract Bundles - - - - - - - - - - - 0 - 0 - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - Fibers in Selected Bundle: - - - - - - - 0 - - - - - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - - 0 - 0 - - - - - Binary Envelope - - - - - Tract Density Image (TDI) - - - - - Fiber Bundle Image - - - - - Fiber Endings Image - - - - - Fiber Endings Pointset - - - - - - - - Upsampling Factor - - - 1 - - - 10 - - - 4 - - - - - - - false - - - - 0 - 0 - - - - - 200 - 16777215 - - - - - 11 - - - - Perform selected operation on fiber bundle - - - Generate - - - - - - - If selected operation generates an image, the inverse image is returned - - - Invert - - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - diff --git a/Modules/Bundles/org.mitk.gui.qt.diffusionimaging/src/internal/mitkPluginActivator.cpp b/Modules/Bundles/org.mitk.gui.qt.diffusionimaging/src/internal/mitkPluginActivator.cpp index 97a8407366..5ff89f0889 100644 --- a/Modules/Bundles/org.mitk.gui.qt.diffusionimaging/src/internal/mitkPluginActivator.cpp +++ b/Modules/Bundles/org.mitk.gui.qt.diffusionimaging/src/internal/mitkPluginActivator.cpp @@ -1,52 +1,52 @@ #include "mitkPluginActivator.h" #include #include "src/internal/QmitkDiffusionImagingPublicPerspective.h" #include "src/internal/QmitkQBallReconstructionView.h" #include "src/internal/QmitkPreprocessingView.h" #include "src/internal/QmitkDiffusionDicomImportView.h" #include "src/internal/QmitkDiffusionQuantificationView.h" #include "src/internal/QmitkTensorReconstructionView.h" #include "src/internal/QmitkControlVisualizationPropertiesView.h" #include "src/internal/QmitkODFDetailsView.h" #include "src/internal/QmitkGibbsTrackingView.h" #include "src/internal/QmitkStochasticFiberTrackingView.h" -#include "src/internal/QmitkFiberBundleOperationsView.h" +#include "src/internal/QmitkFiberProcessingView.h" #include "src/internal/QmitkFiberBundleDeveloperView.h" #include "src/internal/QmitkPartialVolumeAnalysisView.h" #include "src/internal/QmitkIVIMView.h" #include "src/internal/QmitkScreenshotMaker.h" namespace mitk { void PluginActivator::start(ctkPluginContext* context) { BERRY_REGISTER_EXTENSION_CLASS(QmitkDiffusionImagingPublicPerspective, context) BERRY_REGISTER_EXTENSION_CLASS(QmitkQBallReconstructionView, context) BERRY_REGISTER_EXTENSION_CLASS(QmitkPreprocessingView, context) BERRY_REGISTER_EXTENSION_CLASS(QmitkDiffusionDicomImport, context) BERRY_REGISTER_EXTENSION_CLASS(QmitkDiffusionQuantificationView, context) BERRY_REGISTER_EXTENSION_CLASS(QmitkTensorReconstructionView, context) BERRY_REGISTER_EXTENSION_CLASS(QmitkControlVisualizationPropertiesView, context) BERRY_REGISTER_EXTENSION_CLASS(QmitkODFDetailsView, context) BERRY_REGISTER_EXTENSION_CLASS(QmitkGibbsTrackingView, context) BERRY_REGISTER_EXTENSION_CLASS(QmitkStochasticFiberTrackingView, context) - BERRY_REGISTER_EXTENSION_CLASS(QmitkFiberBundleOperationsView, context) + BERRY_REGISTER_EXTENSION_CLASS(QmitkFiberProcessingView, context) BERRY_REGISTER_EXTENSION_CLASS(QmitkFiberBundleDeveloperView, context) BERRY_REGISTER_EXTENSION_CLASS(QmitkPartialVolumeAnalysisView, context) BERRY_REGISTER_EXTENSION_CLASS(QmitkIVIMView, context) BERRY_REGISTER_EXTENSION_CLASS(QmitkScreenshotMaker, context) } void PluginActivator::stop(ctkPluginContext* context) { Q_UNUSED(context) } } Q_EXPORT_PLUGIN2(org_mitk_gui_qt_diffusionimaging, mitk::PluginActivator) diff --git a/Modules/Bundles/org.mitk.gui.qt.diffusionimagingapp/src/QmitkDiffusionImagingAppWorkbenchAdvisor.cpp b/Modules/Bundles/org.mitk.gui.qt.diffusionimagingapp/src/QmitkDiffusionImagingAppWorkbenchAdvisor.cpp index e1807f72b2..fa72429d37 100644 --- a/Modules/Bundles/org.mitk.gui.qt.diffusionimagingapp/src/QmitkDiffusionImagingAppWorkbenchAdvisor.cpp +++ b/Modules/Bundles/org.mitk.gui.qt.diffusionimagingapp/src/QmitkDiffusionImagingAppWorkbenchAdvisor.cpp @@ -1,116 +1,116 @@ /*========================================================================= Program: BlueBerry Platform Language: C++ Date: $Date: 2009-10-23 02:59:36 +0200 (Fri, 23 Oct 2009) $ Version: $Revision$ Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. See MITKCopyright.txt or http://www.mitk.org/copyright.html for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notices for more information. =========================================================================*/ #include "QmitkDiffusionImagingAppWorkbenchAdvisor.h" #include "internal/mitkPluginActivator.h" #include #include #include #include #include #include const std::string QmitkDiffusionImagingAppWorkbenchAdvisor::WELCOME_PERSPECTIVE_ID = "org.mitk.diffusionimagingapp.perspectives.welcome"; void QmitkDiffusionImagingAppWorkbenchAdvisor::Initialize(berry::IWorkbenchConfigurer::Pointer configurer) { berry::QtWorkbenchAdvisor::Initialize(configurer); configurer->SetSaveAndRestore(true); // TODO This should go into the products plugin_customization.ini file (when // the product and branding support is finished, see bug 2146). // This will not work anymore, if bug 2822 is fixed. berry::IPreferencesService::Pointer prefService = berry::Platform::GetServiceRegistry().GetServiceById(berry::IPreferencesService::ID); prefService->GetSystemPreferences()->Put(berry::WorkbenchPreferenceConstants::PREFERRED_SASH_LAYOUT, berry::WorkbenchPreferenceConstants::RIGHT); QString collectionFile = mitkPluginActivator::GetDefault()->GetQtHelpCollectionFile(); if (!collectionFile.isEmpty()) { // berry::QtAssistantUtil::SetHelpCollectionFile(collectionFile); // berry::QtAssistantUtil::SetDefaultHelpUrl("qthelp://org.mitk.gui.qt.diffusionimagingapp/bundle/index.html"); typedef std::vector BundleContainer; BundleContainer bundles = berry::Platform::GetBundles(); berry::QtAssistantUtil::RegisterQCHFiles(bundles); } } berry::WorkbenchWindowAdvisor* QmitkDiffusionImagingAppWorkbenchAdvisor::CreateWorkbenchWindowAdvisor( berry::IWorkbenchWindowConfigurer::Pointer configurer) { std::vector perspExcludeList; perspExcludeList.push_back( std::string("org.blueberry.uitest.util.EmptyPerspective") ); perspExcludeList.push_back( std::string("org.blueberry.uitest.util.EmptyPerspective2") ); perspExcludeList.push_back( std::string("org.mitk.coreapp.defaultperspective") ); perspExcludeList.push_back( std::string("org.mitk.extapp.defaultperspective") ); perspExcludeList.push_back( std::string("org.mitk.perspectives.publicdiffusionimaging") ); perspExcludeList.push_back( std::string("org.mitk.perspectives.diffusionimaginginternal") ); std::vector viewExcludeList; // viewExcludeList.push_back( std::string("org.mitk.views.partialvolumeanalysis") ); // viewExcludeList.push_back( std::string("org.mitk.views.globalfibertracking") ); // viewExcludeList.push_back( std::string("org.mitk.views.tractbasedspatialstatistics") ); // viewExcludeList.push_back( std::string("org.mitk.views.fibertracking") ); // viewExcludeList.push_back( std::string("org.mitk.views.ivim") ); // viewExcludeList.push_back( std::string("org.mitk.views.qballreconstruction") ); // viewExcludeList.push_back( std::string("org.mitk.views.diffusiondicomimport") ); // viewExcludeList.push_back( std::string("org.mitk.views.diffusionpreprocessing") ); // viewExcludeList.push_back( std::string("org.mitk.views.diffusionquantification") ); // viewExcludeList.push_back( std::string("org.mitk.views.tensorreconstruction") ); // viewExcludeList.push_back( std::string("org.mitk.views.perspectiveswitcher") ); // viewExcludeList.push_back( std::string("org.mitk.views.basicimageprocessing") ); -// viewExcludeList.push_back( std::string("org.mitk.views.fiberbundleoperations") ); +// viewExcludeList.push_back( std::string("org.mitk.views.fiberprocessing") ); // viewExcludeList.push_back( std::string("org.mitk.views.measurement") ); // viewExcludeList.push_back( std::string("org.mitk.views.moviemaker") ); // viewExcludeList.push_back( std::string("org.mitk.views.odfdetails") ); // viewExcludeList.push_back( std::string("org.mitk.views.propertylistview") ); // viewExcludeList.push_back( std::string("org.mitk.views.screenshotmaker") ); // viewExcludeList.push_back( std::string("org.mitk.views.segmentation") ); // viewExcludeList.push_back( std::string("org.mitk.views.imagestatistics") ); // viewExcludeList.push_back( std::string("org.mitk.views.controlvisualizationpropertiesview") ); // viewExcludeList.push_back( std::string("org.mitk.views.volumevisualization") ); // viewExcludeList.push_back( std::string("org.mitk.views.simplemeasurement") ); configurer->SetInitialSize(berry::Point(1000,770)); QmitkExtWorkbenchWindowAdvisor* advisor = new QmitkExtWorkbenchWindowAdvisor(this, configurer); advisor->ShowViewMenuItem(false); advisor->ShowNewWindowMenuItem(false); advisor->ShowClosePerspectiveMenuItem(false); advisor->SetPerspectiveExcludeList(perspExcludeList); advisor->SetViewExcludeList(viewExcludeList); advisor->ShowViewToolbar(false); advisor->ShowPerspectiveToolbar(true); advisor->ShowVersionInfo(false); advisor->ShowMitkVersionInfo(false); advisor->SetProductName("MITK Diffusion"); advisor->SetWindowIcon(":/org.mitk.gui.qt.diffusionimagingapp/app-icon.png"); return advisor; } std::string QmitkDiffusionImagingAppWorkbenchAdvisor::GetInitialWindowPerspectiveId() { return WELCOME_PERSPECTIVE_ID; } diff --git a/Modules/Bundles/org.mitk.gui.qt.diffusionimagingapp/src/internal/QmitkDIAppFiberTractographyPerspective.cpp b/Modules/Bundles/org.mitk.gui.qt.diffusionimagingapp/src/internal/QmitkDIAppFiberTractographyPerspective.cpp index 60834cff22..98e3dcafe8 100644 --- a/Modules/Bundles/org.mitk.gui.qt.diffusionimagingapp/src/internal/QmitkDIAppFiberTractographyPerspective.cpp +++ b/Modules/Bundles/org.mitk.gui.qt.diffusionimagingapp/src/internal/QmitkDIAppFiberTractographyPerspective.cpp @@ -1,57 +1,57 @@ /*========================================================================= Program: BlueBerry Platform Language: C++ Date: $Date: 2009-10-23 02:59:36 +0200 (Fr, 23 Okt 2009) $ Version: $Revision: 19652 $ Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. See MITKCopyright.txt or http://www.mitk.org/copyright.html for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notices for more information. =========================================================================*/ #include "QmitkDIAppFiberTractographyPerspective.h" #include "berryIViewLayout.h" void QmitkDIAppFiberTractographyPerspective::CreateInitialLayout(berry::IPageLayout::Pointer layout) { ///////////////////////////////////////////////////// // all di-app perspectives should have the following: ///////////////////////////////////////////////////// std::string editorArea = layout->GetEditorArea(); layout->AddStandaloneView("org.mitk.views.datamanager", false, berry::IPageLayout::LEFT, 0.3f, editorArea); layout->AddStandaloneView("org.mitk.views.controlvisualizationpropertiesview", false, berry::IPageLayout::BOTTOM, .2f, "org.mitk.views.datamanager"); berry::IFolderLayout::Pointer left = layout->CreateFolder("org.mitk.diffusionimaginginternal.leftcontrols", berry::IPageLayout::BOTTOM, 0.15f, "org.mitk.views.controlvisualizationpropertiesview"); layout->AddStandaloneView("org.mitk.views.imagenavigator", false, berry::IPageLayout::BOTTOM, .4f, "org.mitk.diffusionimaginginternal.leftcontrols"); ///////////////////////////////////////////// // here goes the perspective specific stuff ///////////////////////////////////////////// left->AddView("org.mitk.views.gibbstracking"); berry::IViewLayout::Pointer lo = layout->GetViewLayout("org.mitk.views.gibbstracking"); lo->SetCloseable(false); left->AddView("org.mitk.views.fibertracking"); lo = layout->GetViewLayout("org.mitk.views.fibertracking"); lo->SetCloseable(false); - left->AddView("org.mitk.views.fiberbundleoperations"); - lo = layout->GetViewLayout("org.mitk.views.fiberbundleoperations"); + left->AddView("org.mitk.views.fiberprocessing"); + lo = layout->GetViewLayout("org.mitk.views.fiberprocessing"); lo->SetCloseable(false); }