]> Creatis software - clitk.git/blob - vv/vvToolCropImage.cxx
- correct bug: string pixeltype is different in ITK and VTK
[clitk.git] / vv / vvToolCropImage.cxx
1 /*=========================================================================
2
3   Program:   vv
4   Module:    $RCSfile: vvToolCropImage.cxx,v $
5   Language:  C++
6   Date:      $Date: 2010/03/24 20:35:13 $
7   Version:   $Revision: 1.6 $
8   Author :   David Sarrut (david.sarrut@creatis.insa-lyon.fr)
9
10   Copyright (C) 2008
11   Léon Bérard cancer center http://oncora1.lyon.fnclcc.fr
12   CREATIS-LRMN http://www.creatis.insa-lyon.fr
13
14   This program is free software: you can redistribute it and/or modify
15   it under the terms of the GNU General Public License as published by
16   the Free Software Foundation, version 3 of the License.
17
18   This program is distributed in the hope that it will be useful,
19   but WITHOUT ANY WARRANTY; without even the implied warranty of
20   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21   GNU General Public License for more details.
22
23   You should have received a copy of the GNU General Public License
24   along with this program.  If not, see <http://www.gnu.org/licenses/>.
25
26   =========================================================================*/
27
28 #include "vvToolCropImage.h"
29 #include <QComboBox>
30 #include <QCursor>
31 #include <QApplication>
32 #include <vtkImageClip.h>
33 #include <vtkImageTranslateExtent.h>
34 #include <vtkImageData.h>
35 #include <vtkSmartPointer.h>
36 #include "vvSlicer.h"
37
38 //------------------------------------------------------------------------------
39 // Create the tool and automagically (I like this word) insert it in
40 // the main window menu.
41 ADD_TOOL(vvToolCropImage);
42 //------------------------------------------------------------------------------
43
44
45 //------------------------------------------------------------------------------
46 vvToolCropImage::vvToolCropImage(vvMainWindowBase * parent, Qt::WindowFlags f):
47   vvToolWidgetBase(parent, f), 
48   vvToolBase<vvToolCropImage>(parent), 
49   Ui::vvToolCropImage() {
50
51   // GUI Initialization
52   Ui_vvToolCropImage::setupUi(mToolWidget);
53
54   // Set how many inputs are needed for this tool
55   AddInputSelector("Select one image");
56 }
57 //------------------------------------------------------------------------------
58
59
60 //------------------------------------------------------------------------------
61 vvToolCropImage::~vvToolCropImage() {
62
63 }
64 //------------------------------------------------------------------------------
65
66
67 //------------------------------------------------------------------------------
68 bool vvToolCropImage::close() { 
69   for(int i=0; i<6; i++) mReducedExtent[i] = mInitialExtent[i];
70   UpdateExtent();
71   return vvToolWidgetBase::close(); 
72 }
73 //------------------------------------------------------------------------------
74
75
76 //------------------------------------------------------------------------------
77 void vvToolCropImage::reject() { 
78   for(int i=0; i<6; i++) mReducedExtent[i] = mInitialExtent[i];
79   UpdateExtent();
80   return vvToolWidgetBase::reject(); 
81 }
82 //------------------------------------------------------------------------------
83
84
85 //------------------------------------------------------------------------------
86 void vvToolCropImage::sliderXMinValueChanged(int s) {
87   xmaxSlider->setMinimum(xminSlider->value());
88   mReducedExtent[0] = xminSlider->value();
89   UpdateExtent();
90 }
91 //------------------------------------------------------------------------------
92
93
94 //------------------------------------------------------------------------------
95 void vvToolCropImage::sliderXMaxValueChanged(int s) {
96   xminSlider->setMaximum(xmaxSlider->value());
97   mReducedExtent[1] = xmaxSlider->value();
98   UpdateExtent();
99 }
100 //------------------------------------------------------------------------------
101
102
103 //------------------------------------------------------------------------------
104 void vvToolCropImage::sliderYMinValueChanged(int s) {
105   ymaxSlider->setMinimum(yminSlider->value());
106   mReducedExtent[2] = yminSlider->value();
107   UpdateExtent();
108 }
109 //------------------------------------------------------------------------------
110
111
112 //------------------------------------------------------------------------------
113 void vvToolCropImage::sliderYMaxValueChanged(int s) {
114   yminSlider->setMaximum(ymaxSlider->value());
115   mReducedExtent[3] = ymaxSlider->value();
116   UpdateExtent();
117 }
118 //------------------------------------------------------------------------------
119
120
121 //------------------------------------------------------------------------------
122 void vvToolCropImage::sliderZMinValueChanged(int s) {
123   zmaxSlider->setMinimum(zminSlider->value());
124   mReducedExtent[4] = zminSlider->value();
125   UpdateExtent();
126 }
127 //------------------------------------------------------------------------------
128
129
130 //------------------------------------------------------------------------------
131 void vvToolCropImage::sliderZMaxValueChanged(int s) {
132   zminSlider->setMaximum(zmaxSlider->value());
133   mReducedExtent[5] = zmaxSlider->value();
134   UpdateExtent();
135 }
136 //------------------------------------------------------------------------------
137
138
139 //------------------------------------------------------------------------------
140 // void vvToolCropImage::sliderTMinValueChanged(int s) {
141 //   tmaxSlider->setMinimum(tminSlider->value());
142 //   mReducedExtent[6] = tminSlider->value();
143 //   UpdateExtent();
144 // }
145 //------------------------------------------------------------------------------
146
147
148 //------------------------------------------------------------------------------
149 // void vvToolCropImage::sliderTMaxValueChanged(int s) {
150 //   tminSlider->setMaximum(tmaxSlider->value());
151 //   mReducedExtent[7] = tmaxSlider->value();
152 //   UpdateExtent();
153 // }
154 //------------------------------------------------------------------------------
155
156
157 //------------------------------------------------------------------------------
158 void vvToolCropImage::UpdateExtent() {
159   for(int i=0; i<mCurrentSlicerManager->NumberOfSlicers(); i++) {
160     mCurrentSlicerManager->GetSlicer(i)->SetReducedExtent(mReducedExtent);
161     mCurrentSlicerManager->GetSlicer(i)->ForceUpdateDisplayExtent();    
162     mCurrentSlicerManager->GetSlicer(i)->Render();    
163   }
164 }
165 //------------------------------------------------------------------------------
166
167
168 //------------------------------------------------------------------------------
169 void vvToolCropImage::InputIsSelected(vvSlicerManager * slicer) {
170
171   // Change interface according to number of dimension
172   mExtentSize = 2*slicer->GetDimension();
173   // if (slicer->GetDimension()<4) {
174   //   mTLabel1->setHidden(true);
175   //   mTLabel2->setHidden(true);
176   //   tminSlider->setHidden(true);
177   //   tmaxSlider->setHidden(true);
178   //   spin_tmin->setHidden(true);
179   //   spin_tmax->setHidden(true);
180   // }
181   if (slicer->GetDimension()<3) {
182     mZLabel1->setHidden(true);
183     mZLabel2->setHidden(true);
184     zminSlider->setHidden(true);
185     zmaxSlider->setHidden(true);
186     spin_zmin->setHidden(true);
187     spin_zmax->setHidden(true);
188   }
189   
190   // Record initial extend
191   mReducedExtent = new int[mExtentSize];
192   mInitialExtent = new int[mExtentSize];
193   mReducedExtent = mCurrentSlicerManager->GetImage()->GetFirstVTKImageData()->GetWholeExtent();
194   for(int i=0; i<6; i++) mInitialExtent[i] = mReducedExtent[i];
195   for(int i=0; i<mCurrentSlicerManager->NumberOfSlicers(); i++) {
196     //DD(i);
197     //DD(mReducedExtent[i]);
198     //DD(mInitialExtent[i]);
199     mCurrentSlicerManager->GetSlicer(i)->EnableReducedExtent(true);
200   }
201   
202   // Not now ....
203   //  mIntensitySlider->SetImage(mCurrentImage);
204   //mIntensitySlider->setEnabled(false);
205
206   // Set initial sliders values
207   std::vector<int> imsize = mCurrentSlicerManager->GetImage()->GetSize();
208   xminSlider->setMaximum(imsize[0]-1);
209   xmaxSlider->setMaximum(imsize[0]-1);
210   xmaxSlider->setValue(imsize[0]-1);
211
212   yminSlider->setMaximum(imsize[1]-1);
213   ymaxSlider->setMaximum(imsize[1]-1);
214   ymaxSlider->setValue(imsize[1]-1);
215
216   if (slicer->GetDimension() >2) {
217     zminSlider->setMaximum(imsize[2]-1);
218     zmaxSlider->setMaximum(imsize[2]-1);
219     zmaxSlider->setValue(imsize[2]-1);
220   }
221
222   // if (slicer->GetDimension() >3) {
223   //   tminSlider->setMaximum(imsize[3]-1);
224   //   tmaxSlider->setMaximum(imsize[3]-1);
225   //   tmaxSlider->setValue(imsize[3]-1);
226   // }
227
228   spin_xmin->setMaximum(imsize[0]-1);
229   spin_xmax->setMaximum(imsize[0]-1);
230   spin_xmax->setValue(imsize[0]-1);
231
232   spin_ymin->setMaximum(imsize[1]-1);
233   spin_ymax->setMaximum(imsize[1]-1);
234   spin_ymax->setValue(imsize[1]-1);
235
236   if (slicer->GetDimension() >2) {
237     spin_zmin->setMaximum(imsize[2]-1);
238     spin_zmax->setMaximum(imsize[2]-1);
239     spin_zmax->setValue(imsize[2]-1);
240   }
241   
242   // if (slicer->GetDimension() >3) {
243   //   spin_tmin->setMaximum(imsize[3]-1);
244   //   spin_tmax->setMaximum(imsize[3]-1);
245   //   spin_tmax->setValue(imsize[3]-1);
246   // }  
247   
248   // Connect
249   connect(xminSlider, SIGNAL(valueChanged(int)), this, SLOT(sliderXMinValueChanged(int)));
250   connect(xmaxSlider, SIGNAL(valueChanged(int)), this, SLOT(sliderXMaxValueChanged(int)));
251   connect(yminSlider, SIGNAL(valueChanged(int)), this, SLOT(sliderYMinValueChanged(int)));
252   connect(ymaxSlider, SIGNAL(valueChanged(int)), this, SLOT(sliderYMaxValueChanged(int)));
253   connect(zminSlider, SIGNAL(valueChanged(int)), this, SLOT(sliderZMinValueChanged(int)));
254   connect(zmaxSlider, SIGNAL(valueChanged(int)), this, SLOT(sliderZMaxValueChanged(int)));
255   // connect(tminSlider, SIGNAL(valueChanged(int)), this, SLOT(sliderTMinValueChanged(int)));
256   // connect(tmaxSlider, SIGNAL(valueChanged(int)), this, SLOT(sliderTMaxValueChanged(int)));
257   
258   //  connect(mIntensitySlider, SIGNAL(valueChanged(double)), this, SLOT(autoCropValueChanged(double)));
259   UpdateExtent();
260 }
261 //------------------------------------------------------------------------------
262
263
264 //------------------------------------------------------------------------------
265 void vvToolCropImage::autoCropValueChanged(double v) {
266   // DD(v);
267   //  vvImageToITKImageVector -> TODO a generic method
268   // then sliceriterator on each dimension from in to max
269   // ==> make a clitkGenericFilter even for the regular apply ...
270 }
271 //------------------------------------------------------------------------------
272
273
274 //------------------------------------------------------------------------------
275 void vvToolCropImage::apply() {
276
277   QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
278   vvImage::Pointer mResult=vvImage::New();
279   vvImage::Pointer image= mCurrentSlicerManager->GetImage();
280   for (std::vector<vtkImageData*>::const_iterator i=image->GetVTKImages().begin();
281        i!=image->GetVTKImages().end();i++)
282     {
283       vtkSmartPointer<vtkImageClip> filter=vtkSmartPointer<vtkImageClip>::New();
284       ///Vtk is very weird, you need to "translate the extent" to get the correct origin
285       //http://markmail.org/message/vndc2tr6kcabiakp#query:vtkImageClip%20origin+page:1+mid:6na7y57floutklvz+state:results
286       vtkSmartPointer<vtkImageTranslateExtent> translate=vtkSmartPointer<vtkImageTranslateExtent>::New();
287       filter->SetInput(*i);
288       filter->SetOutputWholeExtent(xminSlider->value(),xmaxSlider->value(),
289                                    yminSlider->value(),ymaxSlider->value(),
290                                    zminSlider->value(),zmaxSlider->value());
291       translate->SetTranslation(-xminSlider->value(),-yminSlider->value(),-zminSlider->value());
292       translate->SetInput(filter->GetOutput());
293       filter->ClipDataOn(); //Really create a cropped copy of the image
294       translate->Update();
295       vtkImageData* output=vtkImageData::New();
296       output->ShallowCopy(translate->GetOutput());
297       mResult->AddImage(output);
298     }
299   QApplication::restoreOverrideCursor();
300   std::ostringstream osstream;
301   osstream << "Crop_" << mCurrentSlicerManager->GetSlicer(0)->GetFileName() << ".mhd";
302   AddImage(mResult, osstream.str()); 
303   close();
304 }
305 //------------------------------------------------------------------------------
306