]> Creatis software - clitk.git/blob - vv/vvWipeImage.cxx
967c3015a14bca405552587b17d8868f586f8605
[clitk.git] / vv / vvWipeImage.cxx
1 /*=========================================================================
2   Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv
3
4   Authors belong to:
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
8
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.
12
13   It is distributed under dual licence
14
15   - BSD        See included LICENSE.txt file
16   - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17 ===========================================================================**/
18
19 // vv
20 #include "vvWipeImage.h"
21 #include "vvSlicer.h"
22
23 // clitk
24 #include "clitkCropImage_ggo.h"
25 #include "clitkCropImageGenericFilter.h"
26 #include "clitkExceptionObject.h"
27
28 // qt
29 #include <QComboBox>
30 #include <QCursor>
31 #include <QApplication>
32 #include <QMessageBox>
33 #include <QSignalMapper>
34
35 // vtk
36 #include <vtkVersion.h>
37 #include <vtkStreamingDemandDrivenPipeline.h>
38 #include <vtkInformation.h>
39 #include <vtkImageData.h>
40 #include <vtkSmartPointer.h>
41 #include <vtkImageRectilinearWipe.h>
42
43 //------------------------------------------------------------------------------
44 // Create the tool and automagically (I like this word) insert it in
45 // the main window menu.
46 ADD_TOOL(vvWipeImage);
47 //------------------------------------------------------------------------------
48
49 //------------------------------------------------------------------------------
50 vvWipeImage::vvWipeImage(vvMainWindowBase * parent, Qt::WindowFlags f):
51   vvToolWidgetBase(parent, f),
52   vvToolBase<vvWipeImage>(parent),
53   Ui::vvWipeImage()
54 {
55     vtkSmartPointer<vtkImageRectilinearWipe> mWipe = vtkSmartPointer<vtkImageRectilinearWipe>::New();
56 }
57 //------------------------------------------------------------------------------
58
59
60 //------------------------------------------------------------------------------
61 vvWipeImage::~vvWipeImage()
62 {
63   delete [] mReducedExtent;
64   delete [] mInitialExtent;
65 }
66 //------------------------------------------------------------------------------
67
68 void vvWipeImage::setInput(int number, )
69 {
70   mWipe->SetInputConnection(0,reader1->GetOutputPort());
71 }
72   wipe->SetInputConnection(0,reader1->GetOutputPort());
73   wipe->SetInputConnection(1,reader2->GetOutputPort());
74 //------------------------------------------------------------------------------
75 void vvWipeImage::closeEvent(QCloseEvent *event)
76 {
77   if(mCurrentSlicerManager){
78 //     Reset extends
79     for(int i=0; i<6; i++){
80       mReducedExtent[i] = mInitialExtent[i];
81     }
82     for(int i=0; i<mCurrentSlicerManager->GetNumberOfSlicers(); i++)
83       mCurrentSlicerManager->GetSlicer(i)->EnableReducedExtent(false);
84     UpdateExtent();
85   }
86   mCurrentSlicerManager->GetImage()->GetTransform()[0]->SetMatrix(mConcatenedTransform);
87   for (int i=0; i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
88     mCurrentSlicerManager->GetSlicer(i)->ResetCamera();
89     mCurrentSlicerManager->GetSlicer(i)->Render();
90     mCurrentSlicerManager->UpdateLinkedNavigation( mCurrentSlicerManager->GetSlicer(i) );
91   }
92   vvToolWidgetBase::closeEvent(event);
93 }
94 //------------------------------------------------------------------------------
95
96
97 //------------------------------------------------------------------------------
98 bool vvWipeImage::close()
99 {
100   return vvToolWidgetBase::close();
101 }
102 //------------------------------------------------------------------------------
103
104
105 //------------------------------------------------------------------------------
106 void vvWipeImage::reject()
107 {
108   for(int i=0; i<mExtentSize; i++)
109     mReducedExtent[i] = mInitialExtent[i];
110   for(int i=0; i<mCurrentSlicerManager->GetNumberOfSlicers(); i++)
111     mCurrentSlicerManager->GetSlicer(i)->EnableReducedExtent(false);
112   UpdateExtent();
113   return vvToolWidgetBase::reject();
114 }
115 //------------------------------------------------------------------------------
116
117
118 //------------------------------------------------------------------------------
119 void vvWipeImage::crossPointerChanged()
120 {
121   int dimMin = dim;
122   if(dim%2==0){//case we are minimum
123     mSliders[dim+1]->setMinimum(mSliders[dim]->value());
124   }else {
125     mSliders[--dimMin]->setMaximum(mSliders[dim]->value());
126   }
127   mReducedExtent[dim] = mSliders[dim]->value() + mInitialExtent[dimMin];
128   UpdateWipe();
129 }
130 //------------------------------------------------------------------------------
131
132
133 //------------------------------------------------------------------------------
134 void vvWipeImage::UpdateWipe()
135 {
136   for(int i=0; i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
137     mCurrentSlicerManager->GetSlicer(i)->SetReducedExtent(mReducedExtent);
138     mCurrentSlicerManager->GetSlicer(i)->ForceUpdateDisplayExtent();
139     mCurrentSlicerManager->GetSlicer(i)->Render();
140   }
141 }
142 //------------------------------------------------------------------------------
143
144
145 //------------------------------------------------------------------------------
146 void vvWipeImage::InputIsSelected(vvSlicerManager * slicer)
147 {
148   //Save the current transformation
149   mConcatenedTransform = vtkSmartPointer<vtkMatrix4x4>::New();
150   mConcatenedTransform->DeepCopy(slicer->GetSlicer(0)->GetConcatenatedTransform()->GetMatrix());
151   vtkSmartPointer<vtkMatrix4x4> matrix = vtkSmartPointer<vtkMatrix4x4>::New();
152   matrix->Identity();
153   mCurrentSlicerManager->GetImage()->GetTransform()[0]->SetMatrix(matrix);
154   for (int i=0; i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
155     mCurrentSlicerManager->GetSlicer(i)->ResetCamera();
156     mCurrentSlicerManager->GetSlicer(i)->Render();
157     mCurrentSlicerManager->UpdateLinkedNavigation( mCurrentSlicerManager->GetSlicer(i) );
158   }
159
160   // Change interface according to number of dimension
161   mExtentSize = 2*slicer->GetDimension();
162    if (slicer->GetDimension()<4) {
163      mTLabel1->setHidden(true);
164      mTLabel2->setHidden(true);
165      tminSlider->setHidden(true);
166      tmaxSlider->setHidden(true);
167      spin_tmin->setHidden(true);
168      spin_tmax->setHidden(true);
169      mLabelTimeCropping->setHidden(true);
170    }
171   if (slicer->GetDimension()<3) {
172     mZLabel1->setHidden(true);
173     mZLabel2->setHidden(true);
174     zminSlider->setHidden(true);
175     zmaxSlider->setHidden(true);
176     spin_zmin->setHidden(true);
177     spin_zmax->setHidden(true);
178   }
179 #if VTK_MAJOR_VERSION <= 5
180   int *a = mCurrentImage->GetFirstVTKImageData()->GetWholeExtent();
181 #else
182   int *a = mCurrentImage->GetFirstVTKImageData()->GetInformation()->Get(vtkDataObject::DATA_EXTENT());
183 #endif
184   for(int i=0; i<6; i++){
185     mInitialExtent[i] = a[i];
186     mReducedExtent[i] = a[i];
187   }
188   for(int i=0; i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
189     mCurrentSlicerManager->GetSlicer(i)->EnableReducedExtent(true);
190     mCurrentSlicerManager->GetSlicer(i)->SetReducedExtent(mInitialExtent);
191   }
192
193 //   Set initial sliders values
194   int w_ext[6], imsize[3];
195   mCurrentSlicerManager->GetSlicer(0)->GetRegisterExtent(w_ext);
196   for(int dim=0; dim<slicer->GetDimension() && dim<3; ++dim){
197     imsize[dim] = w_ext[2*dim+1] - w_ext[2*dim] +1;
198     mSliders[dim*2]->setMaximum(imsize[dim]-1);
199     mSliders[dim*2+1]->setMaximum(imsize[dim]-1);
200     mSliders[dim*2+1]->setValue(imsize[dim]-1);
201   }
202   spin_xmin->setMaximum(imsize[0]-1);
203   spin_xmax->setMaximum(imsize[0]-1);
204   spin_xmax->setValue(imsize[0]-1);
205
206   spin_ymin->setMaximum(imsize[1]-1);
207   spin_ymax->setMaximum(imsize[1]-1);
208   spin_ymax->setValue(imsize[1]-1);
209
210   if (slicer->GetDimension() >2) {
211     spin_zmin->setMaximum(imsize[2]-1);
212     spin_zmax->setMaximum(imsize[2]-1);
213     spin_zmax->setValue(imsize[2]-1);
214   }
215
216   if (slicer->GetDimension() >3) {
217     spin_tmin->setMaximum(imsize[3]-1);
218     spin_tmax->setMaximum(imsize[3]-1);
219     spin_tmax->setValue(imsize[3]-1);
220   }
221
222   QSignalMapper* signalMapper = new QSignalMapper(this);
223   connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(sliderValueChanged(int)));
224   for(unsigned int i=0; i<mSliders.size(); ++i){
225     signalMapper->setMapping(mSliders[i], i);
226     connect(mSliders[i], SIGNAL(valueChanged(int)), signalMapper, SLOT(map()));
227   }
228   UpdateExtent();
229 }
230 //------------------------------------------------------------------------------
231
232
233 //------------------------------------------------------------------------------
234 void vvWipeImage::apply()
235 {
236   if (!mCurrentSlicerManager) close();
237   QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
238
239   // Typedef 
240   typedef args_info_clitkCropImage ArgsInfoType;
241   typedef clitk::CropImageGenericFilter CropFilterType;
242   
243   // Get options
244   ArgsInfoType mArgsInfo;
245   cmdline_parser_clitkCropImage_init(&mArgsInfo); // Initialisation to default
246   int n = mCurrentSlicerManager->GetDimension()*2;  // 2D and 3D only
247   mArgsInfo.boundingBox_given = n;
248   mArgsInfo.boundingBox_arg = new int[n];
249   
250   for(int dim=0; dim<mCurrentSlicerManager->GetDimension() && dim<3; ++dim){
251     mArgsInfo.boundingBox_arg[dim*2] = mSliders[dim*2]->value();
252     mArgsInfo.boundingBox_arg[dim*2+1] = mSliders[dim*2+1]->value();
253   }
254   if (n>6) { // 4D
255     mArgsInfo.boundingBox_arg[6] = 0;
256     mArgsInfo.boundingBox_arg[7] = mCurrentImage->GetSize()[3]-1;
257   }
258   // We MUST reset initial extend to input image before using the
259   // filter to retrieve the correct image size
260   for(int i=0; i<6; i++) {
261     mReducedExtent[i] = mInitialExtent[i];
262   }
263   
264   UpdateExtent();
265   // Main filter
266   CropFilterType::Pointer filter = CropFilterType::New();
267   filter->SetInputVVImage(mCurrentImage);
268   filter->SetArgsInfo(mArgsInfo);
269
270   // Go ! (not threaded) 
271   try{
272     filter->Update();
273   }
274   catch(clitk::ExceptionObject & e) {
275     DD(e.what());
276     QApplication::restoreOverrideCursor();
277     delete [] mArgsInfo.boundingBox_arg;
278     close();
279   }
280   std::ostringstream croppedImageName;
281   croppedImageName << "Cropped_" << mCurrentSlicerManager->GetSlicer(0)->GetFileName() << ".mhd";
282   // Retrieve result and display it
283   vvImage::Pointer output = filter->GetOutputVVImage();
284   
285   output->GetTransform()[0]->SetMatrix(mConcatenedTransform);
286
287   AddImage(output,croppedImageName.str());
288   
289   // End
290   QApplication::restoreOverrideCursor();
291   delete [] mArgsInfo.boundingBox_arg;
292   close();
293 }
294 //------------------------------------------------------------------------------
295