]> Creatis software - clitk.git/blob - vv/vvToolExtractLung.cxx
some small correction
[clitk.git] / vv / vvToolExtractLung.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://oncora1.lyon.fnclcc.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 "vvToolExtractLung.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(vvToolExtractLung);
35 //------------------------------------------------------------------------------
36
37
38 //------------------------------------------------------------------------------
39 vvToolExtractLung::vvToolExtractLung(vvMainWindowBase * parent, Qt::WindowFlags f):
40   vvToolWidgetBase(parent,f),
41   vvToolBase<vvToolExtractLung>(parent),
42   Ui::vvToolExtractLung()
43 {
44   // GUI
45   Ui_vvToolExtractLung::setupUi(mToolWidget);
46   mMaskLoaderBox->setEnabled(false);
47   mOptionsBox->setEnabled(false);
48   mPatientMaskInputWidget->SetText("Patient mask");
49   connect(mPatientMaskInputWidget, SIGNAL(accepted()), this, SLOT(PatientMaskInputIsSelected()));
50
51   // Default values
52   cmdline_parser_clitkExtractLung_init(&mArgsInfo);
53
54   // Create a new ExtractLung filter
55   mFilter = FilterType::New();  
56
57   // Add input selector
58   AddInputSelector("Select CT thorax image", mFilter);
59 }
60 //------------------------------------------------------------------------------
61
62
63 //------------------------------------------------------------------------------
64 vvToolExtractLung::~vvToolExtractLung()
65 {
66 }
67 //------------------------------------------------------------------------------
68
69
70 //------------------------------------------------------------------------------
71 void vvToolExtractLung::Initialize() {
72   SetToolName("ExtractLung");
73   SetToolMenuName("Extract lungs");
74   SetToolIconFilename(":/common/icons/lung-overlay.png");
75   SetToolTip("Extract lung mask from thorax CT.");
76   SetToolExperimental(true);
77 }
78 //------------------------------------------------------------------------------
79
80
81 //------------------------------------------------------------------------------
82 void vvToolExtractLung::InputIsSelected(vvSlicerManager *m)
83 {
84   DD("InputIsSelected");
85   // Hide selector
86   HideInputSelector(); // splitter
87   mToolInputSelectionWidget->hide();
88   mCurrentSlicerManager = m;
89   mCurrentImage = m->GetImage();
90   mMaskLoaderBox->setEnabled(true);
91   mLabelInput->setText(m->GetFileName().c_str());
92 }
93 //------------------------------------------------------------------------------
94
95
96 //------------------------------------------------------------------------------
97 void vvToolExtractLung::PatientMaskInputIsSelected()
98 {
99   DD("PatientMaskInputIsSelected");
100   mMaskLoaderBox->setEnabled(false);
101   mOptionsBox->setEnabled(true);
102
103   // Get Patient mask and BG value
104   mPatient = mPatientMaskInputWidget->GetImage();  
105   mPatientBackgroundValue = mPatientMaskInputWidget->GetBackgroundValue();
106 }
107 //------------------------------------------------------------------------------
108
109
110 //------------------------------------------------------------------------------
111 void vvToolExtractLung::GetArgsInfoFromGUI() 
112 {
113   DD("GetArgsInfoFromGUI");
114   mArgsInfo.patientBG_arg = 0; //mPatientBackgroundValueSpinBox->value();
115   mArgsInfo.verboseOption_flag = true;
116   mArgsInfo.verboseStep_flag = true;
117   mArgsInfo.writeStep_flag = false;
118   mArgsInfo.input_given = 0;
119   mArgsInfo.patient_given = 0;
120   mArgsInfo.output_given = 0;
121   mArgsInfo.outputTrachea_given = 0;
122   mArgsInfo.remove1_given = 0;
123 }
124 //------------------------------------------------------------------------------
125
126
127 //------------------------------------------------------------------------------
128 void vvToolExtractLung::apply() 
129 {
130   DD("apply");
131   QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
132   
133   GetArgsInfoFromGUI();
134
135   mFilter->SetIOVerbose(true);  
136   mFilter->AddInputVVImage(mCurrentImage); // CT
137   mFilter->AddInputVVImage(mPatient); // patient mask
138   mFilter->SetArgsInfo(mArgsInfo);
139
140   DD("mfilter->Update");
141   vvThreadedFilter thread;
142   //  thread.SetFilter((clitk::FilterBase*)&(*mFilter));
143   //  thread.SetFilter((clitk::FilterBase*)&(*mFilter));
144   thread.SetFilter(&(*mFilter));
145   // connect(a, SIGNAL(rejected()), this, SLOT(FilterHasBeenCanceled()));
146   thread.Update();
147   // if (a->HasError()) { DD(a->GetError()); return; }
148   //  mFilter->Update();
149   DD("after thread");
150
151   // Check error
152   if (mFilter->HasError()) {
153     QMessageBox::information(this,tr("*Error* while finding lung"), mFilter->GetLastError().c_str());
154     reject();
155     return;
156   }
157   
158   // Get output
159   std::vector<vvImage::Pointer> output = mFilter->GetOutputVVImages();
160   DD(output.size());
161   
162   if (output.size() == 0) {
163     std::cerr << "Error : no output ?" << std::endl;
164     close();
165     return;
166   }
167   
168   // Set Lung into VV
169   DD("lung");
170   vvImage::Pointer lung = output[0];
171   std::ostringstream osstream;
172   osstream << "Lung_" << mCurrentSlicerManager->GetSlicer(0)->GetFileName() << ".mhd";
173   vvSlicerManager * v = AddImage(lung,osstream.str());
174   v->SetPreset(5);
175   vvToolStructureSetManager::AddImage(mCurrentSlicerManager, "Right lung", lung, 1, false); // Right is greater than Left
176   vvToolStructureSetManager::AddImage(mCurrentSlicerManager, "Left lung", lung, 2, false);  
177
178   // Set trachea into VV
179   if (output.size() == 2) {
180     DD("trachea");
181     vvImage::Pointer trachea = output[1];
182     std::ostringstream osstream;
183     osstream << "Trachea_" << mCurrentSlicerManager->GetSlicer(0)->GetFileName() << ".mhd";
184     vvSlicerManager * v = AddImage(trachea,osstream.str());
185     v->SetPreset(5);
186     vvToolStructureSetManager::AddImage(mCurrentSlicerManager, "Trachea", trachea, 0);
187   }
188
189   // End
190   QApplication::restoreOverrideCursor();
191   close();
192 }
193 //------------------------------------------------------------------------------
194
195
196 //------------------------------------------------------------------------------
197 bool vvToolExtractLung::close()
198 {
199   return vvToolWidgetBase::close();
200 }
201 //------------------------------------------------------------------------------
202
203