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