]> Creatis software - clitk.git/blob - vv/vvToolCropImage.cxx
Debug RTStruct conversion with empty struc
[clitk.git] / vv / vvToolCropImage.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 "vvToolCropImage.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 <vtkImageClip.h>
40 #include <vtkImageTranslateExtent.h>
41 #include <vtkImageData.h>
42 #include <vtkSmartPointer.h>
43
44 //------------------------------------------------------------------------------
45 // Create the tool and automagically (I like this word) insert it in
46 // the main window menu.
47 ADD_TOOL(vvToolCropImage);
48 //------------------------------------------------------------------------------
49
50 //same order of int* returned by VtkImageData::WholeExtent
51 enum sliderId {xmin, xmax, ymin, ymax, zmin, zmax, tmin, tmax};
52 //------------------------------------------------------------------------------
53 vvToolCropImage::vvToolCropImage(vvMainWindowBase * parent, Qt::WindowFlags f):
54   vvToolWidgetBase(parent, f),
55   vvToolBase<vvToolCropImage>(parent),
56   Ui::vvToolCropImage(),mSliders(8)
57 {
58
59   // GUI Initialization
60   Ui_vvToolCropImage::setupUi(mToolWidget);
61   mTLabel1->setHidden(true);
62   mTLabel2->setHidden(true);
63   tminSlider->setHidden(true);
64   tmaxSlider->setHidden(true);
65   spin_tmin->setHidden(true);
66   spin_tmax->setHidden(true);
67   mLabelTimeCropping->setHidden(true);
68
69   // Set how many inputs are needed for this tool
70   AddInputSelector("Select one image");
71   
72   mSliders[xmin]=xminSlider;
73   mSliders[xmax]=xmaxSlider;
74   mSliders[ymin]=yminSlider;
75   mSliders[ymax]=ymaxSlider;
76   mSliders[zmin]=zminSlider;
77   mSliders[zmax]=zmaxSlider;
78   mSliders[tmin]=tminSlider;
79   mSliders[tmax]=tmaxSlider;
80   
81   // Record initial extend
82   mReducedExtent = new int[6];
83   mInitialExtent = new int[6];
84 }
85 //------------------------------------------------------------------------------
86
87
88 //------------------------------------------------------------------------------
89 vvToolCropImage::~vvToolCropImage()
90 {
91   delete [] mReducedExtent;
92   delete [] mInitialExtent;
93 }
94 //------------------------------------------------------------------------------
95
96
97 //------------------------------------------------------------------------------
98 void vvToolCropImage::closeEvent(QCloseEvent *event)
99 {
100   if(mCurrentSlicerManager){
101 //     Reset extends
102     for(int i=0; i<6; i++){
103       mReducedExtent[i] = mInitialExtent[i];
104     }
105     for(int i=0; i<mCurrentSlicerManager->GetNumberOfSlicers(); i++)
106       mCurrentSlicerManager->GetSlicer(i)->EnableReducedExtent(false);
107     UpdateExtent();
108
109     mCurrentSlicerManager->GetImage()->GetTransform()[0]->SetMatrix(mConcatenedTransform);
110     for (int i=0; i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
111       mCurrentSlicerManager->GetSlicer(i)->ResetCamera();
112       mCurrentSlicerManager->GetSlicer(i)->Render();
113       mCurrentSlicerManager->UpdateLinkedNavigation( mCurrentSlicerManager->GetSlicer(i) );
114     }
115   }
116   vvToolWidgetBase::closeEvent(event);
117 }
118 //------------------------------------------------------------------------------
119
120
121 //------------------------------------------------------------------------------
122 bool vvToolCropImage::close()
123 {
124   return vvToolWidgetBase::close();
125 }
126 //------------------------------------------------------------------------------
127
128
129 //------------------------------------------------------------------------------
130 void vvToolCropImage::reject()
131 {
132   for(int i=0; i<mExtentSize; i++)
133     mReducedExtent[i] = mInitialExtent[i];
134   for(int i=0; i<mCurrentSlicerManager->GetNumberOfSlicers(); i++)
135     mCurrentSlicerManager->GetSlicer(i)->EnableReducedExtent(false);
136   UpdateExtent();
137   return vvToolWidgetBase::reject();
138 }
139 //------------------------------------------------------------------------------
140
141
142 //------------------------------------------------------------------------------
143 void vvToolCropImage::sliderValueChanged(int dim)
144 {
145   int dimMin = dim;
146   if(dim%2==0){//case we are minimum
147     mSliders[dim+1]->setMinimum(mSliders[dim]->value());
148   }else {
149     mSliders[--dimMin]->setMaximum(mSliders[dim]->value());
150   }
151   mReducedExtent[dim] = mSliders[dim]->value() + mInitialExtent[dimMin];
152   UpdateExtent();
153 }
154 //------------------------------------------------------------------------------
155
156
157 //------------------------------------------------------------------------------
158 void vvToolCropImage::UpdateExtent()
159 {
160   for(int i=0; i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
161     mCurrentSlicerManager->GetSlicer(i)->SetReducedExtent(mReducedExtent);
162     mCurrentSlicerManager->GetSlicer(i)->ForceUpdateDisplayExtent();
163     mCurrentSlicerManager->GetSlicer(i)->Render();
164   }
165 }
166 //------------------------------------------------------------------------------
167
168
169 //------------------------------------------------------------------------------
170 void vvToolCropImage::InputIsSelected(vvSlicerManager * slicer)
171 {
172   //Save the current transformation
173   mConcatenedTransform = vtkSmartPointer<vtkMatrix4x4>::New();
174   mConcatenedTransform->DeepCopy(slicer->GetSlicer(0)->GetConcatenatedTransform()->GetMatrix());
175   vtkSmartPointer<vtkMatrix4x4> matrix = vtkSmartPointer<vtkMatrix4x4>::New();
176   matrix->Identity();
177   mCurrentSlicerManager->GetImage()->GetTransform()[0]->SetMatrix(matrix);
178   for (int i=0; i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
179     mCurrentSlicerManager->GetSlicer(i)->ResetCamera();
180     mCurrentSlicerManager->GetSlicer(i)->Render();
181     mCurrentSlicerManager->UpdateLinkedNavigation( mCurrentSlicerManager->GetSlicer(i) );
182   }
183
184   // Change interface according to number of dimension
185   mExtentSize = 2*slicer->GetDimension();
186    if (slicer->GetDimension()<4) {
187      mTLabel1->setHidden(true);
188      mTLabel2->setHidden(true);
189      tminSlider->setHidden(true);
190      tmaxSlider->setHidden(true);
191      spin_tmin->setHidden(true);
192      spin_tmax->setHidden(true);
193      mLabelTimeCropping->setHidden(true);
194    }
195   if (slicer->GetDimension()<3) {
196     mZLabel1->setHidden(true);
197     mZLabel2->setHidden(true);
198     zminSlider->setHidden(true);
199     zmaxSlider->setHidden(true);
200     spin_zmin->setHidden(true);
201     spin_zmax->setHidden(true);
202   }
203 #if VTK_MAJOR_VERSION <= 5
204   int *a = mCurrentImage->GetFirstVTKImageData()->GetWholeExtent();
205 #else
206   int *a = mCurrentImage->GetFirstVTKImageData()->GetInformation()->Get(vtkDataObject::DATA_EXTENT());
207 #endif
208   for(int i=0; i<6; i++){
209     mInitialExtent[i] = a[i];
210     mReducedExtent[i] = a[i];
211   }
212   for(int i=0; i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
213     mCurrentSlicerManager->GetSlicer(i)->EnableReducedExtent(true);
214     mCurrentSlicerManager->GetSlicer(i)->SetReducedExtent(mInitialExtent);
215   }
216
217 //   Set initial sliders values
218   int w_ext[6], imsize[4];
219   mCurrentSlicerManager->GetSlicer(0)->GetRegisterExtent(w_ext);
220   for(int dim=0; dim<slicer->GetDimension() && dim<3; ++dim){
221     imsize[dim] = w_ext[2*dim+1] - w_ext[2*dim] +1;
222     mSliders[dim*2]->setMaximum(imsize[dim]-1);
223     mSliders[dim*2+1]->setMaximum(imsize[dim]-1);
224     mSliders[dim*2+1]->setValue(imsize[dim]-1);
225   }
226   spin_xmin->setMaximum(imsize[0]-1);
227   spin_xmax->setMaximum(imsize[0]-1);
228   spin_xmax->setValue(imsize[0]-1);
229
230   spin_ymin->setMaximum(imsize[1]-1);
231   spin_ymax->setMaximum(imsize[1]-1);
232   spin_ymax->setValue(imsize[1]-1);
233
234   if (slicer->GetDimension() >2) {
235     spin_zmin->setMaximum(imsize[2]-1);
236     spin_zmax->setMaximum(imsize[2]-1);
237     spin_zmax->setValue(imsize[2]-1);
238   }
239
240   if (slicer->GetDimension() >3) {
241     spin_tmin->setMaximum(imsize[3]-1);
242     spin_tmax->setMaximum(imsize[3]-1);
243     spin_tmax->setValue(imsize[3]-1);
244   }
245
246   QSignalMapper* signalMapper = new QSignalMapper(this);
247   connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(sliderValueChanged(int)));
248   for(unsigned int i=0; i<mSliders.size(); ++i){
249     signalMapper->setMapping(mSliders[i], i);
250     connect(mSliders[i], SIGNAL(valueChanged(int)), signalMapper, SLOT(map()));
251   }
252   UpdateExtent();
253 }
254 //------------------------------------------------------------------------------
255
256
257 //------------------------------------------------------------------------------
258 void vvToolCropImage::autoCropValueChanged(double v)
259 {
260   //TODO
261 }
262 //------------------------------------------------------------------------------
263
264
265 //------------------------------------------------------------------------------
266 void vvToolCropImage::apply()
267 {
268   if (!mCurrentSlicerManager) close();
269   QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
270
271   // Typedef 
272   typedef args_info_clitkCropImage ArgsInfoType;
273   typedef clitk::CropImageGenericFilter CropFilterType;
274   
275   // Get options
276   ArgsInfoType mArgsInfo;
277   cmdline_parser_clitkCropImage_init(&mArgsInfo); // Initialisation to default
278   int n = mCurrentSlicerManager->GetDimension()*2;  // 2D and 3D only
279   mArgsInfo.boundingBox_given = n;
280   mArgsInfo.boundingBox_arg = new int[n];
281   
282   for(int dim=0; dim<mCurrentSlicerManager->GetDimension() && dim<3; ++dim){
283     mArgsInfo.boundingBox_arg[dim*2] = mSliders[dim*2]->value();
284     mArgsInfo.boundingBox_arg[dim*2+1] = mSliders[dim*2+1]->value();
285   }
286   if (n>6) { // 4D
287     mArgsInfo.boundingBox_arg[6] = 0;
288     mArgsInfo.boundingBox_arg[7] = mCurrentImage->GetSize()[3]-1;
289   }
290   // We MUST reset initial extend to input image before using the
291   // filter to retrieve the correct image size
292   for(int i=0; i<6; i++) {
293     mReducedExtent[i] = mInitialExtent[i];
294   }
295   
296   UpdateExtent();
297   // Main filter
298   CropFilterType::Pointer filter = CropFilterType::New();
299   filter->SetInputVVImage(mCurrentImage);
300   filter->SetArgsInfo(mArgsInfo);
301
302   // Go ! (not threaded) 
303   try{
304     filter->Update();
305   }
306   catch(clitk::ExceptionObject & e) {
307     DD(e.what());
308     QApplication::restoreOverrideCursor();
309     delete [] mArgsInfo.boundingBox_arg;
310     close();
311   }
312   std::ostringstream croppedImageName;
313   croppedImageName << "Cropped_" << mCurrentSlicerManager->GetSlicer(0)->GetFileName() << ".mhd";
314   // Retrieve result and display it
315   vvImage::Pointer output = filter->GetOutputVVImage();
316   
317   output->GetTransform()[0]->SetMatrix(mConcatenedTransform);
318
319   AddImage(output,croppedImageName.str());
320   
321   // End
322   QApplication::restoreOverrideCursor();
323   delete [] mArgsInfo.boundingBox_arg;
324   close();
325 }
326 //------------------------------------------------------------------------------
327