1 /*=========================================================================
2 Program: vv http://www.creatis.insa-lyon.fr/rio/vv
5 - University of LYON http://www.universite-lyon.fr/
6 - Léon Bérard cancer center http://www.centreleonberard.fr
7 - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr
9 This software is distributed WITHOUT ANY WARRANTY; without even
10 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11 PURPOSE. See the copyright notices for more information.
13 It is distributed under dual licence
15 - BSD See included LICENSE.txt file
16 - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17 ===========================================================================**/
20 #include "vvWipeImage.h"
24 #include "clitkCropImage_ggo.h"
25 #include "clitkCropImageGenericFilter.h"
26 #include "clitkExceptionObject.h"
31 #include <QApplication>
32 #include <QMessageBox>
33 #include <QSignalMapper>
36 #include <vtkVersion.h>
37 #include <vtkStreamingDemandDrivenPipeline.h>
38 #include <vtkInformation.h>
39 #include <vtkImageData.h>
40 #include <vtkSmartPointer.h>
42 //------------------------------------------------------------------------------
43 // Create the tool and automagically (I like this word) insert it in
44 // the main window menu.
45 ADD_TOOL(vvWipeImage);
46 //------------------------------------------------------------------------------
48 //------------------------------------------------------------------------------
49 vvWipeImage::vvWipeImage(vvMainWindowBase * parent, Qt::WindowFlags f):
50 vvToolWidgetBase(parent, f),
51 vvToolBase<vvWipeImage>(parent),
54 vtkSmartPointer<vtkImageRectilinearWipe> mWipe = vtkSmartPointer<vtkImageRectilinearWipe>::New();
56 mWipe->SetPosition(256,256);
58 //------------------------------------------------------------------------------
61 //------------------------------------------------------------------------------
62 vvWipeImage::~vvWipeImage()
65 //------------------------------------------------------------------------------
67 //------------------------------------------------------------------------------
68 void vvWipeImage::setInput(int number, vvImage::Pointer image)
70 if (image->GetVTKImages().size()) {
72 mWipe->SetInputData(number, mImage->GetVTKImages()[0]); //[0] pour du 4D ?
75 //------------------------------------------------------------------------------
77 //------------------------------------------------------------------------------
78 void vvWipeImage::closeEvent(QCloseEvent *event)
80 mCurrentSlicerManager->GetImage()->GetTransform()[0]->SetMatrix(mConcatenedTransform);
81 for (int i=0; i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
82 mCurrentSlicerManager->GetSlicer(i)->ResetCamera();
83 mCurrentSlicerManager->GetSlicer(i)->Render();
84 mCurrentSlicerManager->UpdateLinkedNavigation( mCurrentSlicerManager->GetSlicer(i) );
86 vvToolWidgetBase::closeEvent(event);
88 //------------------------------------------------------------------------------
91 //------------------------------------------------------------------------------
92 bool vvWipeImage::close()
94 return vvToolWidgetBase::close();
96 //------------------------------------------------------------------------------
99 //------------------------------------------------------------------------------
100 void vvWipeImage::reject()
102 return vvToolWidgetBase::reject();
104 //------------------------------------------------------------------------------
107 //------------------------------------------------------------------------------
108 void vvWipeImage::crossPointerChanged()
110 mWipe->SetPosition(256,256);
113 //------------------------------------------------------------------------------
116 //------------------------------------------------------------------------------
117 void vvWipeImage::UpdateWipe()
119 for(int i=0; i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
120 //mCurrentSlicerManager->GetSlicer(i)->SetReducedExtent(mReducedExtent);
121 mCurrentSlicerManager->GetSlicer(i)->ForceUpdateDisplayExtent();
122 mCurrentSlicerManager->GetSlicer(i)->Render();
125 //------------------------------------------------------------------------------
128 //------------------------------------------------------------------------------
129 void vvWipeImage::InputIsSelected(vvSlicerManager * slicer)
131 //Save the current transformation
132 mConcatenedTransform = vtkSmartPointer<vtkMatrix4x4>::New();
133 mConcatenedTransform->DeepCopy(slicer->GetSlicer(0)->GetConcatenatedTransform()->GetMatrix());
134 vtkSmartPointer<vtkMatrix4x4> matrix = vtkSmartPointer<vtkMatrix4x4>::New();
136 mCurrentSlicerManager->GetImage()->GetTransform()[0]->SetMatrix(matrix);
137 for (int i=0; i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
138 mCurrentSlicerManager->GetSlicer(i)->ResetCamera();
139 mCurrentSlicerManager->GetSlicer(i)->Render();
140 mCurrentSlicerManager->UpdateLinkedNavigation( mCurrentSlicerManager->GetSlicer(i) );
143 // Change interface according to number of dimension
144 #if VTK_MAJOR_VERSION <= 5
145 int *a = mCurrentImage->GetFirstVTKImageData()->GetWholeExtent();
147 int *a = mCurrentImage->GetFirstVTKImageData()->GetInformation()->Get(vtkDataObject::DATA_EXTENT());
150 // Set initial sliders values
151 int w_ext[6], imsize[3];
152 mCurrentSlicerManager->GetSlicer(0)->GetRegisterExtent(w_ext);
154 QSignalMapper* signalMapper = new QSignalMapper(this);
155 connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(sliderValueChanged(int)));
157 //------------------------------------------------------------------------------
160 //------------------------------------------------------------------------------
161 void vvWipeImage::apply()
163 if (!mCurrentSlicerManager) close();
164 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
167 typedef args_info_clitkCropImage ArgsInfoType;
168 typedef clitk::CropImageGenericFilter CropFilterType;
171 ArgsInfoType mArgsInfo;
172 cmdline_parser_clitkCropImage_init(&mArgsInfo); // Initialisation to default
173 int n = mCurrentSlicerManager->GetDimension()*2; // 2D and 3D only
174 mArgsInfo.boundingBox_given = n;
175 mArgsInfo.boundingBox_arg = new int[n];
177 // We MUST reset initial extend to input image before using the
178 // filter to retrieve the correct image size ;
180 CropFilterType::Pointer filter = CropFilterType::New();
181 filter->SetInputVVImage(mCurrentImage);
182 filter->SetArgsInfo(mArgsInfo);
184 // Go ! (not threaded)
188 catch(clitk::ExceptionObject & e) {
190 QApplication::restoreOverrideCursor();
191 delete [] mArgsInfo.boundingBox_arg;
194 std::ostringstream croppedImageName;
195 croppedImageName << "Cropped_" << mCurrentSlicerManager->GetSlicer(0)->GetFileName() << ".mhd";
196 // Retrieve result and display it
197 vvImage::Pointer output = filter->GetOutputVVImage();
199 output->GetTransform()[0]->SetMatrix(mConcatenedTransform);
201 AddImage(output,croppedImageName.str());
204 QApplication::restoreOverrideCursor();
205 delete [] mArgsInfo.boundingBox_arg;
208 //------------------------------------------------------------------------------