]> Creatis software - clitk.git/blob - vv/vvToolBinarize.cxx
remove MACRO for vvTool and others minors stuffs
[clitk.git] / vv / vvToolBinarize.cxx
1 /*=========================================================================
2
3   Program:   vv
4   Module:    $RCSfile: vvToolBinarize.cxx,v $
5   Language:  C++
6   Date:      $Date: 2010/02/03 10:54:08 $
7   Version:   $Revision: 1.3 $
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 "vvToolBinarize.h"
29 #include "vvSlicerManager.h"
30 #include "vvSlicer.h"
31 #include "vvToolInputSelectorWidget.h"
32
33 #include "clitkBinarizeImageGenericFilter.h"
34
35 #include "vtkImageActor.h"
36 #include "vtkCamera.h"
37
38 //------------------------------------------------------------------------------
39 // Create the tool and automagically (I like this word) insert it in
40 // the main window menu.
41 ADD_TOOL(vvToolBinarize);
42 //------------------------------------------------------------------------------
43
44
45 //------------------------------------------------------------------------------
46 vvToolBinarize::vvToolBinarize(QWidget * parent, Qt::WindowFlags f)
47   :QDialog(parent,f), vvToolBase<vvToolBinarize>(), Ui::vvToolBinarize() 
48 {
49   // Set Modality : dialog is not modal but stay always on top because
50   // parent is set at construction
51   setModal(false);
52   setAttribute(Qt::WA_DeleteOnClose);
53
54   // GUI Initialization
55   setupUi(this);
56
57   // Connect signals & slots  
58   connect(mToolInputSelectionWidget, SIGNAL(accepted()), this, SLOT(InputIsSelected()));
59   connect(mToolInputSelectionWidget, SIGNAL(rejected()), this, SLOT(close()));
60   connect(buttonBox, SIGNAL(accepted()), this, SLOT(apply()));
61   connect(buttonBox, SIGNAL(rejected()), this, SLOT(close()));
62   connect(mThresholdSlider1, SIGNAL(valueChanged(double)), this, SLOT(valueChangedT1(double)));
63   connect(mThresholdSlider2, SIGNAL(valueChanged(double)), this, SLOT(valueChangedT2(double)));
64
65   connect(mRadioButtonLowerThan, SIGNAL(toggled(bool)), this, SLOT(enableLowerThan(bool)));
66
67   // VTK objects
68   mClipper = vtkImageClip::New();
69   mSquares1 = vtkMarchingSquares::New();
70   mSquaresMapper1 = vtkPolyDataMapper::New();
71   mSquaresActor1 = vtkActor::New();
72
73   // Initialize some widget
74   mThresholdSlider1->SetText("");
75   mThresholdSlider2->SetText("");
76   mFGSlider->SetText("Foreground value");
77   mBGSlider->SetText("Background value");
78
79   // Disable main widget while input image is not selected
80   toolMainWidget->setEnabled(false);
81
82   // Main filter 
83   mFilter = new clitk::BinarizeImageGenericFilter<args_info_clitkBinarizeImage>; //DS PUT IN BASECLASS ?
84
85   // Initialize the input selection (mFilter should be create before !)
86   InitializeListOfInputImages(mToolInputSelectionWidget, mFilter);
87 }
88 //------------------------------------------------------------------------------
89
90
91 //------------------------------------------------------------------------------
92 vvToolBinarize::~vvToolBinarize() {
93 }
94 //------------------------------------------------------------------------------
95
96
97 //------------------------------------------------------------------------------
98 void vvToolBinarize::enableLowerThan(bool b) {
99   if (!b) {
100     mThresholdSlider1->resetMaximum();
101   }
102   else {
103     valueChangedT1(mThresholdSlider1->GetValue());
104   }
105 }
106 //------------------------------------------------------------------------------
107
108
109 //------------------------------------------------------------------------------
110 void vvToolBinarize::InputIsSelected() {
111
112   // Common
113   int index = mToolInputSelectionWidget->GetSelectedInputIndex();
114   mCurrentSliceManager = mSlicerManagersCompatible[index];
115   mCurrentImage = mCurrentSliceManager->GetImage();
116   toolMainWidget->setEnabled(true);
117
118   // Specific for this gui
119   mThresholdSlider1->SetImage(mCurrentImage);
120   mThresholdSlider2->SetImage(mCurrentImage);
121   mFGSlider->SetImage(mCurrentImage);
122   mBGSlider->SetImage(mCurrentImage);
123   mFGSlider->SetValue(1);
124   mBGSlider->SetValue(0);
125   DD(mCurrentSliceManager->GetFileName().c_str());
126   
127   DD("VTK");
128   DD(mCurrentSliceManager->NumberOfSlicers());
129   //    mClipper->SetInput(mCurrentSliceManager->GetSlicer(0)->GetInput());
130   DD(mCurrentImage->GetFirstVTKImageData());
131   DD(mClipper);
132   DD(mCurrentSliceManager->GetSlicer(0));
133   mClipper->SetInput(mCurrentImage->GetFirstVTKImageData());
134   
135   mSquares1->SetInput(mClipper->GetOutput());
136   mSquaresMapper1->SetInput(mSquares1->GetOutput());
137   mSquaresActor1->SetMapper(mSquaresMapper1);
138   mSquaresActor1->GetProperty()->SetColor(1.0,0,0);
139   mSquaresActor1->SetPickable(0);
140   mCurrentSliceManager->GetSlicer(0)->GetRenderer()->AddActor(mSquaresActor1);
141   mSquares1->Update();
142   
143   
144   DD("VTK end");
145   
146   //    connect(mCurrentSliceManager,SIGNAL(UpdateTSlice(int,int)),this,SLOT(UpdateSlice(int, int)));
147   connect(mCurrentSliceManager,SIGNAL(UpdateSlice(int,int)),this,SLOT(UpdateSlice(int, int)));
148   //connect(mCurrentSliceManager,SIGNAL(UpdateSliceRange(int,int,int,int,int)),this,SLOT(UpdateSlice(int, int)));
149   //    connect(mCurrentSliceManager,SIGNAL(LandmarkAdded()),this,SLOT(InsertSeed()));
150   
151 }
152 //------------------------------------------------------------------------------
153
154
155 //------------------------------------------------------------------------------
156 void vvToolBinarize::UpdateSlice(int slicer,int slices) {
157  
158   // A METTRE SUR TOUT LES SLICES ! PAS QUE 0
159
160   // !! signal update slice pas tjs quand move slicer ???
161
162
163    int slice = mCurrentSliceManager->GetSlicer(0)->GetSlice();
164     int tslice = mCurrentSliceManager->GetSlicer(0)->GetTSlice();
165     mClipper->SetInput(mCurrentSliceManager->GetSlicer(0)->GetInput());
166     int* extent = mCurrentSliceManager->GetSlicer(0)->GetImageActor()->GetDisplayExtent();
167     mClipper->SetOutputWholeExtent(extent[0],extent[1],extent[2],extent[3],extent[4],extent[5]);
168     int i;
169     for (i = 0; i < 6;i = i+2)
170     {
171         if (extent[i] == extent[i+1])
172         {
173             break;
174         }
175     }
176
177     switch (i)
178     {
179     case 0:
180         if (mCurrentSliceManager->GetSlicer(0)->GetRenderer()->GetActiveCamera()->GetPosition()[0] > slice)
181         {
182             mSquaresActor1->SetPosition(1,0,0);
183             // mSquaresActor2->SetPosition(1,0,0);
184         }
185         else
186         {
187             mSquaresActor1->SetPosition(-1,0,0);
188             // mSquaresActor2->SetPosition(-1,0,0);
189         }
190         break;
191     case 2:
192         if (mCurrentSliceManager->GetSlicer(0)->GetRenderer()->GetActiveCamera()->GetPosition()[1] > slice)
193         {
194             mSquaresActor1->SetPosition(0,1,0);
195           //   mSquaresActor2->SetPosition(0,1,0);
196         }
197         else
198         {
199             mSquaresActor1->SetPosition(0,-1,0);
200             // mSquaresActor2->SetPosition(0,-1,0);
201         }
202         break;
203     case 4:
204         if (mCurrentSliceManager->GetSlicer(0)->GetRenderer()->GetActiveCamera()->GetPosition()[2] > slice)
205         {
206             mSquaresActor1->SetPosition(0,0,1);
207             // mSquaresActor2->SetPosition(0,0,1);
208         }
209         else
210         {
211             mSquaresActor1->SetPosition(0,0,-1);
212             // mSquaresActor2->SetPosition(0,0,-1);
213         }
214         break;
215     }
216     mSquares1->Update();
217    //  mSquares2->Update();
218
219     mCurrentSliceManager->Render(); 
220 }
221 //------------------------------------------------------------------------------
222
223 //------------------------------------------------------------------------------
224 void vvToolBinarize::GetArgsInfoFromGUI() {
225
226   /* //KEEP THIS FOR READING GGO FROM FILE
227     int argc=1;
228     std::string a = "toto";
229     char * const* argv = new char*;
230     //a.c_str();
231     struct cmdline_parser_params p;
232     p.check_required = 0;
233     int good = cmdline_parser_ext(argc, argv, &args_info, &p);
234   DD(good);
235   */
236
237   mArgsInfo.upper_given = 0;
238   mArgsInfo.lower_given = 0;
239   bool inverseBGandFG = false;
240
241   if (mRadioButtonGreaterThan->isChecked()) { // Greater Than (and Lower Than)
242     mArgsInfo.lower_given = 1;
243     mArgsInfo.lower_arg = mThresholdSlider1->GetValue();
244     DD(mArgsInfo.lower_arg);
245     if (mRadioButtonLowerThan->isChecked()) {
246       mArgsInfo.upper_given = 1;
247       mArgsInfo.upper_arg = mThresholdSlider2->GetValue();
248       if (mArgsInfo.upper_arg<mArgsInfo.lower_arg) {
249         mArgsInfo.upper_given = 0;
250         DD("TODO : lower thres greater than greater thres ! Ignoring ");
251       }
252     }
253   }
254   else {
255     if (mRadioButtonEqualThan->isChecked()) {
256       mArgsInfo.lower_given = 1;
257       mArgsInfo.upper_given = 1;
258       mArgsInfo.lower_arg = mThresholdSlider1->GetValue();
259       mArgsInfo.upper_arg = mThresholdSlider1->GetValue();
260     }
261     else {
262       mArgsInfo.lower_given = 1;
263       mArgsInfo.upper_given = 1;
264       mArgsInfo.lower_arg = mThresholdSlider1->GetValue();
265       mArgsInfo.upper_arg = mThresholdSlider1->GetValue();
266       inverseBGandFG = true;
267     }
268   }
269
270   mArgsInfo.fg_arg = mFGSlider->GetValue();
271   mArgsInfo.bg_arg = mBGSlider->GetValue();
272
273   DD(inverseBGandFG);
274   if (inverseBGandFG) {
275     mArgsInfo.fg_arg = mFGSlider->GetValue();
276     mArgsInfo.bg_arg = mBGSlider->GetValue();
277   }
278   mArgsInfo.fg_given = 1;
279   mArgsInfo.bg_given = 1;
280
281   mArgsInfo.useBG_flag = mCheckBoxUseBG->isChecked();
282   mArgsInfo.useFG_flag = mCheckBoxUseFG->isChecked();
283
284   DD(mArgsInfo.useBG_flag);
285   DD(mArgsInfo.useFG_flag);
286
287   mArgsInfo.verbose_flag = true;
288
289   // Required (even if not used)
290   mArgsInfo.input_given = 0;
291   mArgsInfo.output_given = 0;
292   
293   mArgsInfo.input_arg = new char;
294   mArgsInfo.output_arg = new char;
295 }
296 //------------------------------------------------------------------------------
297
298
299 //------------------------------------------------------------------------------
300 void vvToolBinarize::apply() {
301   DD("Apply");
302
303   GetArgsInfoFromGUI();
304
305   DD(mArgsInfo.lower_arg);
306   // cmdline_parser2(argc, argv, &args_info, 1, 1, 0);                  
307   //   if (args_info.config_given)      
308   // cmdline_parser_configfile ("toto.config", &args_info, 0, 0, 1);
309   //   else cmdline_parser(argc, argv, &args_info);
310
311   // Main filter
312   clitk::BinarizeImageGenericFilter<args_info_clitkBinarizeImage>::Pointer filter = 
313     clitk::BinarizeImageGenericFilter<args_info_clitkBinarizeImage>::New();
314   filter->SetArgsInfo(mArgsInfo);
315   filter->SetInputVVImage(mCurrentImage);
316   filter->Update();
317
318   // Output ???
319   vvImage::Pointer output = filter->GetOutputVVImage();
320   DD(output->GetScalarTypeAsString());
321   CREATOR(vvToolBinarize)->mMainWindow->AddImage(output,"toto.mhd"); 
322   close();
323 }
324 //------------------------------------------------------------------------------
325
326
327 //------------------------------------------------------------------------------
328 void vvToolBinarize::valueChangedT2(double v) {
329   if (mRadioButtonLowerThan->isChecked()) mThresholdSlider1->SetMaximum(v);
330 }
331 //------------------------------------------------------------------------------
332
333
334 //------------------------------------------------------------------------------
335 void vvToolBinarize::valueChangedT1(double v) {
336   mThresholdSlider2->SetMinimum(v);
337   DD(v);
338   int m1 = (int)lrint(v);
339   DD(m1);  
340   int* extent = mCurrentSliceManager->GetSlicer(0)->GetImageActor()->GetDisplayExtent();
341   mClipper->SetOutputWholeExtent(extent[0],extent[1],extent[2],extent[3],extent[4],extent[5]);
342
343
344 int slice = mCurrentSliceManager->GetSlicer(0)->GetSlice();
345
346  int i;
347 for (i = 0; i < 6;i = i+2)
348     {
349         if (extent[i] == extent[i+1])
350         {
351             break;
352         }
353     }
354
355     switch (i)
356     {
357     case 0:
358         if (mCurrentSliceManager->GetSlicer(0)->GetRenderer()->GetActiveCamera()->GetPosition()[0] > slice)
359         {
360             mSquaresActor1->SetPosition(1,0,0);
361             // mSquaresActor2->SetPosition(1,0,0);
362         }
363         else
364         {
365             mSquaresActor1->SetPosition(-1,0,0);
366             // mSquaresActor2->SetPosition(-1,0,0);
367         }
368         break;
369     case 2:
370         if (mCurrentSliceManager->GetSlicer(0)->GetRenderer()->GetActiveCamera()->GetPosition()[1] > slice)
371         {
372             mSquaresActor1->SetPosition(0,1,0);
373            //  mSquaresActor2->SetPosition(0,1,0);
374         }
375         else
376         {
377             mSquaresActor1->SetPosition(0,-1,0);
378             // mSquaresActor2->SetPosition(0,-1,0);
379         }
380         break;
381     case 4:
382         if (mCurrentSliceManager->GetSlicer(0)->GetRenderer()->GetActiveCamera()->GetPosition()[2] > slice)
383         {
384             mSquaresActor1->SetPosition(0,0,1);
385             // mSquaresActor2->SetPosition(0,0,1);
386         }
387         else
388         {
389             mSquaresActor1->SetPosition(0,0,-1);
390             // mSquaresActor2->SetPosition(0,0,-1);
391         }
392         break;
393     }
394
395
396
397
398   mSquares1->SetValue(0,m1);
399   mSquares1->Update();
400   mCurrentSliceManager->Render();
401 }
402 //------------------------------------------------------------------------------