1 /*=========================================================================
2 Program: vv http://www.creatis.insa-lyon.fr/rio/vv
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
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.
13 It is distributed under dual licence
15 - BSD See included LICENSE.txt file
16 - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17 ======================================================================-====*/
20 #include "vvToolExtractLung.h"
21 #include "vvToolStructureSetManager.h"
23 #include "vvImageReader.h"
24 #include "vvImageWriter.h"
25 #include "vvLabelImageLoaderWidget.h"
26 #include "vvThreadedFilter.h"
29 #include <QMessageBox>
31 //------------------------------------------------------------------------------
32 // Create the tool and automagically (I like this word) insert it in
33 // the main window menu.
34 ADD_TOOL(vvToolExtractLung);
35 //------------------------------------------------------------------------------
38 //------------------------------------------------------------------------------
39 vvToolExtractLung::vvToolExtractLung(vvMainWindowBase * parent, Qt::WindowFlags f):
40 vvToolWidgetBase(parent,f),
41 vvToolBase<vvToolExtractLung>(parent),
42 Ui::vvToolExtractLung()
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()));
52 cmdline_parser_clitkExtractLung_init(&mArgsInfo);
54 // Create a new ExtractLung filter
55 mFilter = FilterType::New();
58 AddInputSelector("Select CT thorax image", mFilter);
60 //------------------------------------------------------------------------------
63 //------------------------------------------------------------------------------
64 vvToolExtractLung::~vvToolExtractLung()
67 //------------------------------------------------------------------------------
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);
78 //------------------------------------------------------------------------------
81 //------------------------------------------------------------------------------
82 void vvToolExtractLung::InputIsSelected(vvSlicerManager *m)
84 DD("InputIsSelected");
86 HideInputSelector(); // splitter
87 mToolInputSelectionWidget->hide();
88 mCurrentSlicerManager = m;
89 mCurrentImage = m->GetImage();
90 mMaskLoaderBox->setEnabled(true);
91 mLabelInput->setText(m->GetFileName().c_str());
93 //------------------------------------------------------------------------------
96 //------------------------------------------------------------------------------
97 void vvToolExtractLung::PatientMaskInputIsSelected()
99 DD("PatientMaskInputIsSelected");
100 mMaskLoaderBox->setEnabled(false);
101 mOptionsBox->setEnabled(true);
103 // Get Patient mask and BG value
104 mPatient = mPatientMaskInputWidget->GetImage();
105 mPatientBackgroundValue = mPatientMaskInputWidget->GetBackgroundValue();
107 //------------------------------------------------------------------------------
110 //------------------------------------------------------------------------------
111 void vvToolExtractLung::GetArgsInfoFromGUI()
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;
124 //------------------------------------------------------------------------------
127 //------------------------------------------------------------------------------
128 void vvToolExtractLung::apply()
131 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
133 GetArgsInfoFromGUI();
135 mFilter->SetIOVerbose(true);
136 mFilter->AddInputVVImage(mCurrentImage); // CT
137 mFilter->AddInputVVImage(mPatient); // patient mask
138 mFilter->SetArgsInfo(mArgsInfo);
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()));
147 // if (a->HasError()) { DD(a->GetError()); return; }
148 // mFilter->Update();
152 if (mFilter->HasError()) {
153 QMessageBox::information(this,tr("*Error* while finding lung"), mFilter->GetLastError().c_str());
159 std::vector<vvImage::Pointer> output = mFilter->GetOutputVVImages();
162 if (output.size() == 0) {
163 std::cerr << "Error : no output ?" << std::endl;
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());
175 vvToolStructureSetManager::AddImage(mCurrentSlicerManager, "Right lung", lung, 1, false); // Right is greater than Left
176 vvToolStructureSetManager::AddImage(mCurrentSlicerManager, "Left lung", lung, 2, false);
178 // Set trachea into VV
179 if (output.size() == 2) {
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());
186 vvToolStructureSetManager::AddImage(mCurrentSlicerManager, "Trachea", trachea, 0);
190 QApplication::restoreOverrideCursor();
193 //------------------------------------------------------------------------------
196 //------------------------------------------------------------------------------
197 bool vvToolExtractLung::close()
199 return vvToolWidgetBase::close();
201 //------------------------------------------------------------------------------