]> Creatis software - clitk.git/blob - vv/vvToolBinarize.cxx
*** empty log message ***
[clitk.git] / vv / vvToolBinarize.cxx
1 /*=========================================================================
2
3   Program:   vv
4   Module:    $RCSfile: vvToolBinarize.cxx,v $
5   Language:  C++
6   Date:      $Date: 2010/02/01 15:54: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 "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   if (inverseBGandFG) {
273     mArgsInfo.fg_arg = mBGSlider->GetValue();
274     mArgsInfo.bg_arg = mFGSlider->GetValue();
275   }
276   mArgsInfo.fg_given = 1;
277   mArgsInfo.bg_given = 1;
278
279   mArgsInfo.setBG_flag = true;
280
281   mArgsInfo.verbose_flag = true;
282
283   // Required (even if not used)
284   mArgsInfo.input_given = 0;
285   mArgsInfo.output_given = 0;
286   
287   mArgsInfo.input_arg = new char;
288   mArgsInfo.output_arg = new char;
289 }
290 //------------------------------------------------------------------------------
291
292
293 //------------------------------------------------------------------------------
294 void vvToolBinarize::apply() {
295   DD("Apply");
296
297   GetArgsInfoFromGUI();
298
299   DD(mArgsInfo.lower_arg);
300   // cmdline_parser2(argc, argv, &args_info, 1, 1, 0);                  
301   //   if (args_info.config_given)      
302   // cmdline_parser_configfile ("toto.config", &args_info, 0, 0, 1);
303   //   else cmdline_parser(argc, argv, &args_info);
304
305   // Main filter
306   clitk::BinarizeImageGenericFilter<args_info_clitkBinarizeImage>::Pointer filter = 
307     clitk::BinarizeImageGenericFilter<args_info_clitkBinarizeImage>::New();
308   filter->SetArgsInfo(mArgsInfo);
309   filter->SetInputVVImage(mCurrentImage);
310   filter->Update();
311
312   // Output ???
313   vvImage::Pointer output = filter->GetOutputVVImage();
314   DD(output->GetScalarTypeAsString());
315   CREATOR(vvToolBinarize)->mMainWindow->AddImage(output,"toto.mhd"); 
316   close();
317 }
318 //------------------------------------------------------------------------------
319
320
321 //------------------------------------------------------------------------------
322 void vvToolBinarize::valueChangedT2(double v) {
323   if (mRadioButtonLowerThan->isChecked()) mThresholdSlider1->SetMaximum(v);
324 }
325 //------------------------------------------------------------------------------
326
327
328 //------------------------------------------------------------------------------
329 void vvToolBinarize::valueChangedT1(double v) {
330   mThresholdSlider2->SetMinimum(v);
331   DD(v);
332   int m1 = (int)lrint(v);
333   DD(m1);  
334   int* extent = mCurrentSliceManager->GetSlicer(0)->GetImageActor()->GetDisplayExtent();
335   mClipper->SetOutputWholeExtent(extent[0],extent[1],extent[2],extent[3],extent[4],extent[5]);
336
337
338 int slice = mCurrentSliceManager->GetSlicer(0)->GetSlice();
339
340  int i;
341 for (i = 0; i < 6;i = i+2)
342     {
343         if (extent[i] == extent[i+1])
344         {
345             break;
346         }
347     }
348
349     switch (i)
350     {
351     case 0:
352         if (mCurrentSliceManager->GetSlicer(0)->GetRenderer()->GetActiveCamera()->GetPosition()[0] > slice)
353         {
354             mSquaresActor1->SetPosition(1,0,0);
355             // mSquaresActor2->SetPosition(1,0,0);
356         }
357         else
358         {
359             mSquaresActor1->SetPosition(-1,0,0);
360             // mSquaresActor2->SetPosition(-1,0,0);
361         }
362         break;
363     case 2:
364         if (mCurrentSliceManager->GetSlicer(0)->GetRenderer()->GetActiveCamera()->GetPosition()[1] > slice)
365         {
366             mSquaresActor1->SetPosition(0,1,0);
367            //  mSquaresActor2->SetPosition(0,1,0);
368         }
369         else
370         {
371             mSquaresActor1->SetPosition(0,-1,0);
372             // mSquaresActor2->SetPosition(0,-1,0);
373         }
374         break;
375     case 4:
376         if (mCurrentSliceManager->GetSlicer(0)->GetRenderer()->GetActiveCamera()->GetPosition()[2] > slice)
377         {
378             mSquaresActor1->SetPosition(0,0,1);
379             // mSquaresActor2->SetPosition(0,0,1);
380         }
381         else
382         {
383             mSquaresActor1->SetPosition(0,0,-1);
384             // mSquaresActor2->SetPosition(0,0,-1);
385         }
386         break;
387     }
388
389
390
391
392   mSquares1->SetValue(0,m1);
393   mSquares1->Update();
394   mCurrentSliceManager->Render();
395 }
396 //------------------------------------------------------------------------------