From 2873923458309014563d46763e0155c08e3985c1 Mon Sep 17 00:00:00 2001 From: tbaudier Date: Fri, 22 Jul 2016 13:33:54 +0200 Subject: [PATCH] Add wipe tool --- vv/vvWipeImage.cxx | 295 +++++++++++++++++++++++++++++++++++++++++++++ vv/vvWipeImage.h | 71 +++++++++++ 2 files changed, 366 insertions(+) create mode 100644 vv/vvWipeImage.cxx create mode 100644 vv/vvWipeImage.h diff --git a/vv/vvWipeImage.cxx b/vv/vvWipeImage.cxx new file mode 100644 index 0000000..967c301 --- /dev/null +++ b/vv/vvWipeImage.cxx @@ -0,0 +1,295 @@ +/*========================================================================= + Program: vv http://www.creatis.insa-lyon.fr/rio/vv + + Authors belong to: + - University of LYON http://www.universite-lyon.fr/ + - Léon Bérard cancer center http://www.centreleonberard.fr + - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the copyright notices for more information. + + It is distributed under dual licence + + - BSD See included LICENSE.txt file + - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html +===========================================================================**/ + +// vv +#include "vvWipeImage.h" +#include "vvSlicer.h" + +// clitk +#include "clitkCropImage_ggo.h" +#include "clitkCropImageGenericFilter.h" +#include "clitkExceptionObject.h" + +// qt +#include +#include +#include +#include +#include + +// vtk +#include +#include +#include +#include +#include +#include + +//------------------------------------------------------------------------------ +// Create the tool and automagically (I like this word) insert it in +// the main window menu. +ADD_TOOL(vvWipeImage); +//------------------------------------------------------------------------------ + +//------------------------------------------------------------------------------ +vvWipeImage::vvWipeImage(vvMainWindowBase * parent, Qt::WindowFlags f): + vvToolWidgetBase(parent, f), + vvToolBase(parent), + Ui::vvWipeImage() +{ + vtkSmartPointer mWipe = vtkSmartPointer::New(); +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +vvWipeImage::~vvWipeImage() +{ + delete [] mReducedExtent; + delete [] mInitialExtent; +} +//------------------------------------------------------------------------------ + +void vvWipeImage::setInput(int number, ) +{ + mWipe->SetInputConnection(0,reader1->GetOutputPort()); +} + wipe->SetInputConnection(0,reader1->GetOutputPort()); + wipe->SetInputConnection(1,reader2->GetOutputPort()); +//------------------------------------------------------------------------------ +void vvWipeImage::closeEvent(QCloseEvent *event) +{ + if(mCurrentSlicerManager){ +// Reset extends + for(int i=0; i<6; i++){ + mReducedExtent[i] = mInitialExtent[i]; + } + for(int i=0; iGetNumberOfSlicers(); i++) + mCurrentSlicerManager->GetSlicer(i)->EnableReducedExtent(false); + UpdateExtent(); + } + mCurrentSlicerManager->GetImage()->GetTransform()[0]->SetMatrix(mConcatenedTransform); + for (int i=0; iGetNumberOfSlicers(); i++) { + mCurrentSlicerManager->GetSlicer(i)->ResetCamera(); + mCurrentSlicerManager->GetSlicer(i)->Render(); + mCurrentSlicerManager->UpdateLinkedNavigation( mCurrentSlicerManager->GetSlicer(i) ); + } + vvToolWidgetBase::closeEvent(event); +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +bool vvWipeImage::close() +{ + return vvToolWidgetBase::close(); +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvWipeImage::reject() +{ + for(int i=0; iGetNumberOfSlicers(); i++) + mCurrentSlicerManager->GetSlicer(i)->EnableReducedExtent(false); + UpdateExtent(); + return vvToolWidgetBase::reject(); +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvWipeImage::crossPointerChanged() +{ + int dimMin = dim; + if(dim%2==0){//case we are minimum + mSliders[dim+1]->setMinimum(mSliders[dim]->value()); + }else { + mSliders[--dimMin]->setMaximum(mSliders[dim]->value()); + } + mReducedExtent[dim] = mSliders[dim]->value() + mInitialExtent[dimMin]; + UpdateWipe(); +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvWipeImage::UpdateWipe() +{ + for(int i=0; iGetNumberOfSlicers(); i++) { + mCurrentSlicerManager->GetSlicer(i)->SetReducedExtent(mReducedExtent); + mCurrentSlicerManager->GetSlicer(i)->ForceUpdateDisplayExtent(); + mCurrentSlicerManager->GetSlicer(i)->Render(); + } +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvWipeImage::InputIsSelected(vvSlicerManager * slicer) +{ + //Save the current transformation + mConcatenedTransform = vtkSmartPointer::New(); + mConcatenedTransform->DeepCopy(slicer->GetSlicer(0)->GetConcatenatedTransform()->GetMatrix()); + vtkSmartPointer matrix = vtkSmartPointer::New(); + matrix->Identity(); + mCurrentSlicerManager->GetImage()->GetTransform()[0]->SetMatrix(matrix); + for (int i=0; iGetNumberOfSlicers(); i++) { + mCurrentSlicerManager->GetSlicer(i)->ResetCamera(); + mCurrentSlicerManager->GetSlicer(i)->Render(); + mCurrentSlicerManager->UpdateLinkedNavigation( mCurrentSlicerManager->GetSlicer(i) ); + } + + // Change interface according to number of dimension + mExtentSize = 2*slicer->GetDimension(); + if (slicer->GetDimension()<4) { + mTLabel1->setHidden(true); + mTLabel2->setHidden(true); + tminSlider->setHidden(true); + tmaxSlider->setHidden(true); + spin_tmin->setHidden(true); + spin_tmax->setHidden(true); + mLabelTimeCropping->setHidden(true); + } + if (slicer->GetDimension()<3) { + mZLabel1->setHidden(true); + mZLabel2->setHidden(true); + zminSlider->setHidden(true); + zmaxSlider->setHidden(true); + spin_zmin->setHidden(true); + spin_zmax->setHidden(true); + } +#if VTK_MAJOR_VERSION <= 5 + int *a = mCurrentImage->GetFirstVTKImageData()->GetWholeExtent(); +#else + int *a = mCurrentImage->GetFirstVTKImageData()->GetInformation()->Get(vtkDataObject::DATA_EXTENT()); +#endif + for(int i=0; i<6; i++){ + mInitialExtent[i] = a[i]; + mReducedExtent[i] = a[i]; + } + for(int i=0; iGetNumberOfSlicers(); i++) { + mCurrentSlicerManager->GetSlicer(i)->EnableReducedExtent(true); + mCurrentSlicerManager->GetSlicer(i)->SetReducedExtent(mInitialExtent); + } + +// Set initial sliders values + int w_ext[6], imsize[3]; + mCurrentSlicerManager->GetSlicer(0)->GetRegisterExtent(w_ext); + for(int dim=0; dimGetDimension() && dim<3; ++dim){ + imsize[dim] = w_ext[2*dim+1] - w_ext[2*dim] +1; + mSliders[dim*2]->setMaximum(imsize[dim]-1); + mSliders[dim*2+1]->setMaximum(imsize[dim]-1); + mSliders[dim*2+1]->setValue(imsize[dim]-1); + } + spin_xmin->setMaximum(imsize[0]-1); + spin_xmax->setMaximum(imsize[0]-1); + spin_xmax->setValue(imsize[0]-1); + + spin_ymin->setMaximum(imsize[1]-1); + spin_ymax->setMaximum(imsize[1]-1); + spin_ymax->setValue(imsize[1]-1); + + if (slicer->GetDimension() >2) { + spin_zmin->setMaximum(imsize[2]-1); + spin_zmax->setMaximum(imsize[2]-1); + spin_zmax->setValue(imsize[2]-1); + } + + if (slicer->GetDimension() >3) { + spin_tmin->setMaximum(imsize[3]-1); + spin_tmax->setMaximum(imsize[3]-1); + spin_tmax->setValue(imsize[3]-1); + } + + QSignalMapper* signalMapper = new QSignalMapper(this); + connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(sliderValueChanged(int))); + for(unsigned int i=0; isetMapping(mSliders[i], i); + connect(mSliders[i], SIGNAL(valueChanged(int)), signalMapper, SLOT(map())); + } + UpdateExtent(); +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvWipeImage::apply() +{ + if (!mCurrentSlicerManager) close(); + QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); + + // Typedef + typedef args_info_clitkCropImage ArgsInfoType; + typedef clitk::CropImageGenericFilter CropFilterType; + + // Get options + ArgsInfoType mArgsInfo; + cmdline_parser_clitkCropImage_init(&mArgsInfo); // Initialisation to default + int n = mCurrentSlicerManager->GetDimension()*2; // 2D and 3D only + mArgsInfo.boundingBox_given = n; + mArgsInfo.boundingBox_arg = new int[n]; + + for(int dim=0; dimGetDimension() && dim<3; ++dim){ + mArgsInfo.boundingBox_arg[dim*2] = mSliders[dim*2]->value(); + mArgsInfo.boundingBox_arg[dim*2+1] = mSliders[dim*2+1]->value(); + } + if (n>6) { // 4D + mArgsInfo.boundingBox_arg[6] = 0; + mArgsInfo.boundingBox_arg[7] = mCurrentImage->GetSize()[3]-1; + } + // We MUST reset initial extend to input image before using the + // filter to retrieve the correct image size + for(int i=0; i<6; i++) { + mReducedExtent[i] = mInitialExtent[i]; + } + + UpdateExtent(); + // Main filter + CropFilterType::Pointer filter = CropFilterType::New(); + filter->SetInputVVImage(mCurrentImage); + filter->SetArgsInfo(mArgsInfo); + + // Go ! (not threaded) + try{ + filter->Update(); + } + catch(clitk::ExceptionObject & e) { + DD(e.what()); + QApplication::restoreOverrideCursor(); + delete [] mArgsInfo.boundingBox_arg; + close(); + } + std::ostringstream croppedImageName; + croppedImageName << "Cropped_" << mCurrentSlicerManager->GetSlicer(0)->GetFileName() << ".mhd"; + // Retrieve result and display it + vvImage::Pointer output = filter->GetOutputVVImage(); + + output->GetTransform()[0]->SetMatrix(mConcatenedTransform); + + AddImage(output,croppedImageName.str()); + + // End + QApplication::restoreOverrideCursor(); + delete [] mArgsInfo.boundingBox_arg; + close(); +} +//------------------------------------------------------------------------------ + diff --git a/vv/vvWipeImage.h b/vv/vvWipeImage.h new file mode 100644 index 0000000..f44de56 --- /dev/null +++ b/vv/vvWipeImage.h @@ -0,0 +1,71 @@ +/*========================================================================= + Program: vv http://www.creatis.insa-lyon.fr/rio/vv + + Authors belong to: + - University of LYON http://www.universite-lyon.fr/ + - Léon Bérard cancer center http://www.centreleonberard.fr + - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the copyright notices for more information. + + It is distributed under dual licence + + - BSD See included LICENSE.txt file + - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html +===========================================================================**/ +#ifndef VVWIPEIMAGE_H +#define VVWIPEIMAGE_H + +//qt +#include +#include +#include +#include +// vv +#include "vvToolBase.h" +#include "vvToolWidgetBase.h" +#include "vvMainWindowBase.h" +//#include "ui_vvWipeImage.h" +//vtk +#include + +//------------------------------------------------------------------------------ +class vvWipeImage: + public vvToolWidgetBase, + public vvToolBase, + private Ui::vvWipeImage +{ + Q_OBJECT + public: + vvWipeImage(vvMainWindowBase * parent=0, Qt::WindowFlags f=0); + ~vvWipeImage(); + + virtual void InputIsSelected(vvSlicerManager *m); + +public slots: + virtual void apply(); + virtual bool close(); + virtual void reject(); + void crossPointerChanged(); + + + //----------------------------------------------------- + static void Initialize() { + SetToolName("Wipe"); + SetToolMenuName("Wipe"); + SetToolIconFilename(":/common/icons/crop.png"); + SetToolTip("Wipe 2 images."); + } + + protected: + vtkSmartPointer mWipe; + void UpdateWipe(); + virtual void closeEvent(QCloseEvent *event); + +}; // end class vvWipeImage +//------------------------------------------------------------------------------ + +#endif + -- 2.45.1