]> Creatis software - clitk.git/blob - vv/vvWipeImage.cxx
Add wipe tools (1)
[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
42 //------------------------------------------------------------------------------
43 // Create the tool and automagically (I like this word) insert it in
44 // the main window menu.
45 ADD_TOOL(vvWipeImage);
46 //------------------------------------------------------------------------------
47
48 //------------------------------------------------------------------------------
49 vvWipeImage::vvWipeImage(vvMainWindowBase * parent, Qt::WindowFlags f):
50   vvToolWidgetBase(parent, f),
51   vvToolBase<vvWipeImage>(parent),
52   Ui::vvWipeImage()
53 {
54     vtkSmartPointer<vtkImageRectilinearWipe> mWipe = vtkSmartPointer<vtkImageRectilinearWipe>::New();
55     mWipe->SetWipe(0);
56     mWipe->SetPosition(256,256);
57 }
58 //------------------------------------------------------------------------------
59
60
61 //------------------------------------------------------------------------------
62 vvWipeImage::~vvWipeImage()
63 {
64 }
65 //------------------------------------------------------------------------------
66
67 //------------------------------------------------------------------------------
68 void vvWipeImage::setInput(int number, vvImage::Pointer image)
69 {
70   if (image->GetVTKImages().size()) {
71     mImage = image;
72     mWipe->SetInputData(number, mImage->GetVTKImages()[0]); //[0] pour du 4D ?
73   }
74 }
75 //------------------------------------------------------------------------------
76
77 //------------------------------------------------------------------------------
78 void vvWipeImage::closeEvent(QCloseEvent *event)
79 {
80   mCurrentSlicerManager->GetImage()->GetTransform()[0]->SetMatrix(mConcatenedTransform);
81   for (int i=0; i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
82     mCurrentSlicerManager->GetSlicer(i)->ResetCamera();
83     mCurrentSlicerManager->GetSlicer(i)->Render();
84     mCurrentSlicerManager->UpdateLinkedNavigation( mCurrentSlicerManager->GetSlicer(i) );
85   }
86   vvToolWidgetBase::closeEvent(event);
87 }
88 //------------------------------------------------------------------------------
89
90
91 //------------------------------------------------------------------------------
92 bool vvWipeImage::close()
93 {
94   return vvToolWidgetBase::close();
95 }
96 //------------------------------------------------------------------------------
97
98
99 //------------------------------------------------------------------------------
100 void vvWipeImage::reject()
101 {
102   return vvToolWidgetBase::reject();
103 }
104 //------------------------------------------------------------------------------
105
106
107 //------------------------------------------------------------------------------
108 void vvWipeImage::crossPointerChanged()
109 {
110   mWipe->SetPosition(256,256);
111   UpdateWipe();
112 }
113 //------------------------------------------------------------------------------
114
115
116 //------------------------------------------------------------------------------
117 void vvWipeImage::UpdateWipe()
118 {
119   for(int i=0; i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
120     //mCurrentSlicerManager->GetSlicer(i)->SetReducedExtent(mReducedExtent);
121     mCurrentSlicerManager->GetSlicer(i)->ForceUpdateDisplayExtent();
122     mCurrentSlicerManager->GetSlicer(i)->Render();
123   }
124 }
125 //------------------------------------------------------------------------------
126
127
128 //------------------------------------------------------------------------------
129 void vvWipeImage::InputIsSelected(vvSlicerManager * slicer)
130 {
131   //Save the current transformation
132   mConcatenedTransform = vtkSmartPointer<vtkMatrix4x4>::New();
133   mConcatenedTransform->DeepCopy(slicer->GetSlicer(0)->GetConcatenatedTransform()->GetMatrix());
134   vtkSmartPointer<vtkMatrix4x4> matrix = vtkSmartPointer<vtkMatrix4x4>::New();
135   matrix->Identity();
136   mCurrentSlicerManager->GetImage()->GetTransform()[0]->SetMatrix(matrix);
137   for (int i=0; i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
138     mCurrentSlicerManager->GetSlicer(i)->ResetCamera();
139     mCurrentSlicerManager->GetSlicer(i)->Render();
140     mCurrentSlicerManager->UpdateLinkedNavigation( mCurrentSlicerManager->GetSlicer(i) );
141   }
142
143   // Change interface according to number of dimension
144 #if VTK_MAJOR_VERSION <= 5
145   int *a = mCurrentImage->GetFirstVTKImageData()->GetWholeExtent();
146 #else
147   int *a = mCurrentImage->GetFirstVTKImageData()->GetInformation()->Get(vtkDataObject::DATA_EXTENT());
148 #endif
149
150 //   Set initial sliders values
151   int w_ext[6], imsize[3];
152   mCurrentSlicerManager->GetSlicer(0)->GetRegisterExtent(w_ext);
153
154   QSignalMapper* signalMapper = new QSignalMapper(this);
155   connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(sliderValueChanged(int)));
156 }
157 //------------------------------------------------------------------------------
158
159
160 //------------------------------------------------------------------------------
161 void vvWipeImage::apply()
162 {
163   if (!mCurrentSlicerManager) close();
164   QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
165
166   // Typedef 
167   typedef args_info_clitkCropImage ArgsInfoType;
168   typedef clitk::CropImageGenericFilter CropFilterType;
169   
170   // Get options
171   ArgsInfoType mArgsInfo;
172   cmdline_parser_clitkCropImage_init(&mArgsInfo); // Initialisation to default
173   int n = mCurrentSlicerManager->GetDimension()*2;  // 2D and 3D only
174   mArgsInfo.boundingBox_given = n;
175   mArgsInfo.boundingBox_arg = new int[n];
176   
177   // We MUST reset initial extend to input image before using the
178   // filter to retrieve the correct image size  ;
179   // Main filter
180   CropFilterType::Pointer filter = CropFilterType::New();
181   filter->SetInputVVImage(mCurrentImage);
182   filter->SetArgsInfo(mArgsInfo);
183
184   // Go ! (not threaded) 
185   try{
186     filter->Update();
187   }
188   catch(clitk::ExceptionObject & e) {
189     DD(e.what());
190     QApplication::restoreOverrideCursor();
191     delete [] mArgsInfo.boundingBox_arg;
192     close();
193   }
194   std::ostringstream croppedImageName;
195   croppedImageName << "Cropped_" << mCurrentSlicerManager->GetSlicer(0)->GetFileName() << ".mhd";
196   // Retrieve result and display it
197   vvImage::Pointer output = filter->GetOutputVVImage();
198   
199   output->GetTransform()[0]->SetMatrix(mConcatenedTransform);
200
201   AddImage(output,croppedImageName.str());
202   
203   // End
204   QApplication::restoreOverrideCursor();
205   delete [] mArgsInfo.boundingBox_arg;
206   close();
207 }
208 //------------------------------------------------------------------------------
209