]> Creatis software - clitk.git/blob - vv/vvToolExtractPatient.cxx
Merge branch 'master' of git://git.creatis.insa-lyon.fr/clitk
[clitk.git] / vv / vvToolExtractPatient.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 "vvToolExtractPatient.h"
21 #include "vvToolStructureSetManager.h"
22 #include "vvSlicer.h"
23 #include "vvImageReader.h"
24 #include "vvImageWriter.h"
25 #include "vvLabelImageLoaderWidget.h"
26 #include "vvThreadedFilter.h"
27
28 // Qt
29 #include <QMessageBox>
30
31 //------------------------------------------------------------------------------
32 // Create the tool and automagically (I like this word) insert it in
33 // the main window menu.
34 ADD_TOOL(vvToolExtractPatient);
35 //------------------------------------------------------------------------------
36
37
38 //------------------------------------------------------------------------------
39 vvToolExtractPatient::vvToolExtractPatient(vvMainWindowBase * parent, Qt::WindowFlags f):
40   vvToolWidgetBase(parent,f),
41   vvToolBase<vvToolExtractPatient>(parent),
42   Ui::vvToolExtractPatient()
43 {
44   // GUI
45   Ui_vvToolExtractPatient::setupUi(mToolWidget);
46   mOptionsBox->setEnabled(true);
47   //connect(mPatientMaskInputWidget, SIGNAL(accepted()), this, SLOT(PatientMaskInputIsSelected()));
48
49   // Default values
50   mArgsInfo = new ArgsInfoType;
51   cmdline_parser_clitkExtractPatient_init(mArgsInfo);
52   SetGUIFromArgsInfo();
53   m_IsThreadInterrupted = false;
54
55   // Create a new ExtractPatient filter
56   mFilter = new FilterType;  // used in AddInputSelector
57
58   // Add input selector
59   AddInputSelector("Select CT thorax image", mFilter);
60 }
61 //------------------------------------------------------------------------------
62
63
64 //------------------------------------------------------------------------------
65 vvToolExtractPatient::~vvToolExtractPatient()
66 {
67 }
68 //------------------------------------------------------------------------------
69
70
71 //------------------------------------------------------------------------------
72 void vvToolExtractPatient::Initialize() {
73   SetToolName("ExtractPatient");
74   SetToolMenuName("Extract Patient");
75   SetToolIconFilename(":/common/icons/Patient-overlay.png");
76   SetToolTip("Extract Patient mask from thorax CT.");
77   SetToolExperimental(true);
78   //  SetToolInMenu("Segmentation");
79 }
80 //------------------------------------------------------------------------------
81
82
83 //------------------------------------------------------------------------------
84 void vvToolExtractPatient::InputIsSelected(vvSlicerManager *m)
85 {
86   // Hide selector
87   HideInputSelector(); // splitter
88   mToolInputSelectionWidget->hide();
89   mCurrentSlicerManager = m;
90   mCurrentImage = m->GetImage();
91   mLabelInput->setText(m->GetFileName().c_str());
92 }
93 //------------------------------------------------------------------------------
94
95
96 //------------------------------------------------------------------------------
97 // void vvToolExtractPatient::PatientMaskInputIsSelected()
98 // {
99 //   // Get Patient mask and BG value
100 //   mPatient = mPatientMaskInputWidget->GetImage();  
101 //   mPatientBackgroundValue = mPatientMaskInputWidget->GetBackgroundValue();
102   
103 //   // Check patient dimension
104 //   if (mPatient->GetNumberOfDimensions() != 3) {
105 //     QMessageBox::information(this,tr("*Error*"), "Mask image must be 3D");
106 //     return;
107 //   }
108    
109 //   mMaskLoaderBox->setEnabled(false);
110 //   mOptionsBox->setEnabled(true);
111 // }
112 //------------------------------------------------------------------------------
113
114
115 //------------------------------------------------------------------------------
116 void vvToolExtractPatient::SetGUIFromArgsInfo() 
117 {
118   /*
119   mAirUpperThresholdSlider->SetText("Upper threshold for air");
120   mAirUpperThresholdSlider->SetMinimum(-1200);
121   mAirUpperThresholdSlider->SetMaximum(2000);
122   DD(mArgsInfo->upper_arg);
123   mAirUpperThresholdSlider->SetValue(mArgsInfo->upper_arg);
124
125   mAirLowerThresholdSlider->SetText("Lower threshold for air");
126   mAirLowerThresholdSlider->SetMinimum(-1200);
127   mAirLowerThresholdSlider->SetMaximum(2000);
128   mAirLowerThresholdSlider->SetValue(mArgsInfo->lower_arg);
129   */
130
131 }
132 //------------------------------------------------------------------------------
133
134
135 //------------------------------------------------------------------------------
136 void vvToolExtractPatient::GetArgsInfoFromGUI() 
137 {
138   //mArgsInfo->patientBG_arg = mPatientMaskInputWidget->GetBackgroundValue();
139   mArgsInfo->verboseOption_flag = true; // DEBUG. TO CHANGE
140   mArgsInfo->verboseStep_flag = true; // DEBUG. TO CHANGE
141   mArgsInfo->writeStep_flag = false;
142   mArgsInfo->input_given = 0;
143   //mArgsInfo->patient_given = 0;
144   mArgsInfo->output_given = 0;
145   //mArgsInfo->outputTrachea_given = 0;
146   //mArgsInfo->remove1_given = 0;
147   
148  //  mArgsInfo->upper_arg = mAirUpperThresholdSlider->GetValue();
149 //   mArgsInfo->lower_arg = mAirLowerThresholdSlider->GetValue();
150 //   if (mRadioButtonLowerThan->isChecked()) mArgsInfo->lower_given = 1;
151 }
152 //------------------------------------------------------------------------------
153
154
155 //------------------------------------------------------------------------------
156 void vvToolExtractPatient::apply() 
157 {
158   // Change cursor to wait
159   QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
160   
161   // Read options from GUI and put it in the ArgsInfo struct
162   GetArgsInfoFromGUI();
163   
164   // Check options
165   // if (mArgsInfo->lower_given) {
166 //     if (mArgsInfo->lower_arg > mArgsInfo->upper_arg) {    
167 //       QApplication::restoreOverrideCursor(); 
168 //       QMessageBox::information(this,tr("Error"), "Lower threshold cannot be greater than upper threshold.");
169 //       return;
170 //     }
171 //   }
172
173   // Create new filter
174   //if (mFilter) delete mFilter;
175   DD("new filter");
176   mFilter = new FilterType;  // needed when thread cancel the filter
177   // mFilter->StopOnErrorOff();
178   //  mFilter->SetIOVerbose(true);
179   mFilter->AddInputVVImage(mCurrentImage); // CT
180 //   mFilter->AddInputVVImage(mPatient); // patient mask
181   mFilter->SetArgsInfo(*mArgsInfo);
182
183   // Created threaded execution
184   DD("thread");
185   vvThreadedFilter thread;
186   connect(&thread, SIGNAL(ThreadInterrupted()), this, SLOT(ThreadInterrupted()));
187   thread.SetFilter(mFilter);
188
189   try {
190   thread.Update();
191   }
192   catch(std::runtime_error e) {
193
194   // Check if the thread has been canceled. In this case, return
195   if (m_IsThreadInterrupted) {
196     m_IsThreadInterrupted = false;
197     QApplication::restoreOverrideCursor(); 
198     return;
199   }
200   disconnect(&thread, SIGNAL(ThreadInterrupted()), this, SLOT(ThreadInterrupted()));
201     
202   // Check error during filter
203   // if (mFilter->HasError()) {
204     QApplication::restoreOverrideCursor();
205     QMessageBox::information(this,tr("Error"), e.what());//mFilter->GetLastError().c_str());
206     return;
207   // }
208
209   }
210   
211   // Get output
212   std::vector<vvImage::Pointer> output = mFilter->GetOutputVVImages();
213   if (output.size() == 0) {
214     std::cerr << "Error : no output ?" << std::endl;
215     QApplication::restoreOverrideCursor();
216     close();
217     return;
218   }
219   
220   // Set Patient into VV
221   vvImage::Pointer Patient = output[0];
222   std::ostringstream osstream;
223   osstream << "Patient_" << mCurrentSlicerManager->GetSlicer(0)->GetFileName() << ".mhd";
224   vvSlicerManager * v = AddImage(Patient,osstream.str());
225   v->SetPreset(5);
226   vvToolStructureSetManager::AddImage(mCurrentSlicerManager, "Right Patient", Patient, 1, false); // Right is greater than Left
227 //   vvToolStructureSetManager::AddImage(mCurrentSlicerManager, "Left Patient", Patient, 2, false);  
228
229  //  // Set trachea into VV
230 //   if (output.size() == 2) {
231 //     vvImage::Pointer trachea = output[1];
232 //     std::ostringstream osstream;
233 //     osstream << "Trachea_" << mCurrentSlicerManager->GetSlicer(0)->GetFileName() << ".mhd";
234 //     vvSlicerManager * v = AddImage(trachea,osstream.str());
235 //     v->SetPreset(5);
236 //     vvToolStructureSetManager::AddImage(mCurrentSlicerManager, "Trachea", trachea, 0);
237 //   }
238
239   // End
240   QApplication::restoreOverrideCursor();
241   close();
242 }
243 //------------------------------------------------------------------------------
244
245
246 //------------------------------------------------------------------------------
247 bool vvToolExtractPatient::close()
248 {
249   return vvToolWidgetBase::close();
250 }
251 //------------------------------------------------------------------------------
252
253
254 //------------------------------------------------------------------------------
255 void vvToolExtractPatient::ThreadInterrupted() 
256
257   m_IsThreadInterrupted = true; 
258 }
259 //------------------------------------------------------------------------------
260