]> Creatis software - clitk.git/blob - vv/vvToolCropImage.cxx
- toolbase + binarize
[clitk.git] / vv / vvToolCropImage.cxx
1 /*=========================================================================
2
3   Program:   vv
4   Module:    $RCSfile: vvToolCropImage.cxx,v $
5   Language:  C++
6   Date:      $Date: 2010/03/01 07:37:25 $
7   Version:   $Revision: 1.2 $
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   mReducedExtent = new int[6]; // TO CHANGE !! nb dim
54
55   // Connect
56   connect(xminSlider, SIGNAL(sliderMoved(int)), this, SLOT(sliderMoved(int)));
57 }
58 //------------------------------------------------------------------------------
59
60
61 //------------------------------------------------------------------------------
62 vvToolCropImage::~vvToolCropImage() {
63
64 }
65 //------------------------------------------------------------------------------
66
67
68 //------------------------------------------------------------------------------
69 void vvToolCropImage::sliderMoved(int s) {
70   DD(s);
71   mReducedExtent[0] = xminSlider->value();
72   for(int i=0; i<mCurrentSlicerManager->NumberOfSlicers(); i++) {
73     mCurrentSlicerManager->GetSlicer(i)->SetReducedExtent(mReducedExtent);
74   }
75 }
76 //------------------------------------------------------------------------------
77
78
79 //------------------------------------------------------------------------------
80 void vvToolCropImage::InputIsSelected(vvSlicerManager * slicer) {
81   DD("InputIsSelected"); 
82
83   mReducedExtent = mCurrentSlicerManager->GetImage()->GetFirstVTKImageData()->GetWholeExtent();
84   DD(mReducedExtent[0]);
85   DD(mReducedExtent[1]);
86
87   
88   // TODO : set min/max
89     std::vector<int> imsize = mCurrentSlicerManager->GetImage()->GetSize();
90     xminSlider->setMaximum(imsize[0]-1);
91     xmaxSlider->setMaximum(imsize[0]-1);
92     xmaxSlider->setValue(imsize[0]-1);
93     yminSlider->setMaximum(imsize[1]-1);
94     ymaxSlider->setMaximum(imsize[1]-1);
95     ymaxSlider->setValue(imsize[1]-1);
96     zminSlider->setMaximum(imsize[2]-1);
97     zmaxSlider->setMaximum(imsize[2]-1);
98     zmaxSlider->setValue(imsize[2]-1);
99     spin_xmin->setMaximum(imsize[0]-1);
100     spin_xmax->setMaximum(imsize[0]-1);
101     spin_xmax->setValue(imsize[0]-1);
102     spin_ymin->setMaximum(imsize[1]-1);
103     spin_ymax->setMaximum(imsize[1]-1);
104     spin_ymax->setValue(imsize[1]-1);
105     spin_zmin->setMaximum(imsize[2]-1);
106     spin_zmax->setMaximum(imsize[2]-1);
107     spin_zmax->setValue(imsize[2]-1);
108 }
109 //------------------------------------------------------------------------------
110
111
112 //------------------------------------------------------------------------------
113 void vvToolCropImage::apply() {
114   DD("apply");
115
116     QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
117     vvImage::Pointer mResult=vvImage::New();
118     //vvSlicerManager * current=mSlicerManagers[inputSequenceBox->currentIndex()];
119     vvImage::Pointer image= mCurrentSlicerManager->GetImage();
120     for (std::vector<vtkImageData*>::const_iterator i=image->GetVTKImages().begin();
121             i!=image->GetVTKImages().end();i++)
122     {
123         vtkSmartPointer<vtkImageClip> filter=vtkSmartPointer<vtkImageClip>::New();
124         ///Vtk is very weird, you need to "translate the extent" to get the correct origin
125         //http://markmail.org/message/vndc2tr6kcabiakp#query:vtkImageClip%20origin+page:1+mid:6na7y57floutklvz+state:results
126         vtkSmartPointer<vtkImageTranslateExtent> translate=vtkSmartPointer<vtkImageTranslateExtent>::New();
127         filter->SetInput(*i);
128         filter->SetOutputWholeExtent(xminSlider->value(),xmaxSlider->value(),
129                 yminSlider->value(),ymaxSlider->value(),
130                 zminSlider->value(),zmaxSlider->value());
131         translate->SetTranslation(-xminSlider->value(),-yminSlider->value(),-zminSlider->value());
132         translate->SetInput(filter->GetOutput());
133         filter->ClipDataOn(); //Really create a cropped copy of the image
134         translate->Update();
135         vtkImageData* output=vtkImageData::New();
136         output->ShallowCopy(translate->GetOutput());
137         mResult->AddImage(output);
138     }
139     QApplication::restoreOverrideCursor();
140
141   AddImage(mResult,"crop.mhd"); 
142
143   close();
144 }
145 //------------------------------------------------------------------------------
146