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