X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=vv%2FvvToolExtractLung.cxx;h=59b41331472a7798dea91d9bb3e80c1e0aaa54ed;hb=6612a70a1a2056589f70f57bf6b81269be1c645f;hp=7c78a0aecba73e5d352460843cf13fc01f1dad36;hpb=3e8098373d82c788bd7ca72fe270a6374728e074;p=clitk.git diff --git a/vv/vvToolExtractLung.cxx b/vv/vvToolExtractLung.cxx index 7c78a0a..59b4133 100644 --- a/vv/vvToolExtractLung.cxx +++ b/vv/vvToolExtractLung.cxx @@ -3,7 +3,7 @@ Authors belong to: - University of LYON http://www.universite-lyon.fr/ - - Léon Bérard cancer center http://oncora1.lyon.fnclcc.fr + - Léon Bérard cancer center http://www.centreleonberard.fr - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr This software is distributed WITHOUT ANY WARRANTY; without even @@ -14,7 +14,7 @@ - BSD See included LICENSE.txt file - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html - ======================================================================-====*/ + ===========================================================================**/ // vv #include "vvToolExtractLung.h" @@ -23,7 +23,7 @@ #include "vvImageReader.h" #include "vvImageWriter.h" #include "vvLabelImageLoaderWidget.h" -#include "vvProgressDialog.h" +#include "vvThreadedFilter.h" // Qt #include @@ -45,16 +45,20 @@ vvToolExtractLung::vvToolExtractLung(vvMainWindowBase * parent, Qt::WindowFlags Ui_vvToolExtractLung::setupUi(mToolWidget); mMaskLoaderBox->setEnabled(false); mOptionsBox->setEnabled(false); + mPatientMaskInputWidget->SetText("Patient mask"); connect(mPatientMaskInputWidget, SIGNAL(accepted()), this, SLOT(PatientMaskInputIsSelected())); // Default values - cmdline_parser_clitkExtractLung_init(&mArgsInfo); + mArgsInfo = new ArgsInfoType; + cmdline_parser_clitkExtractLung_init(mArgsInfo); + SetGUIFromArgsInfo(); + m_IsThreadInterrupted = false; // Create a new ExtractLung filter - mFilter = FilterType::New(); + mFilter = new FilterType; // used in AddInputSelector // Add input selector - AddInputSelector("Select image", mFilter); + AddInputSelector("Select CT thorax image", mFilter); } //------------------------------------------------------------------------------ @@ -73,6 +77,7 @@ void vvToolExtractLung::Initialize() { SetToolIconFilename(":/common/icons/lung-overlay.png"); SetToolTip("Extract lung mask from thorax CT."); SetToolExperimental(true); + // SetToolInMenu("Segmentation"); } //------------------------------------------------------------------------------ @@ -80,7 +85,6 @@ void vvToolExtractLung::Initialize() { //------------------------------------------------------------------------------ void vvToolExtractLung::InputIsSelected(vvSlicerManager *m) { - DD("InputIsSelected"); // Hide selector HideInputSelector(); // splitter mToolInputSelectionWidget->hide(); @@ -95,13 +99,36 @@ void vvToolExtractLung::InputIsSelected(vvSlicerManager *m) //------------------------------------------------------------------------------ void vvToolExtractLung::PatientMaskInputIsSelected() { - DD("PatientMaskInputIsSelected"); - mMaskLoaderBox->setEnabled(false); - mOptionsBox->setEnabled(true); - // Get Patient mask and BG value mPatient = mPatientMaskInputWidget->GetImage(); mPatientBackgroundValue = mPatientMaskInputWidget->GetBackgroundValue(); + + // Check patient dimension + if (mPatient->GetNumberOfDimensions() != 3) { + QMessageBox::information(this,tr("*Error*"), "Mask image must be 3D"); + return; + } + + mMaskLoaderBox->setEnabled(false); + mOptionsBox->setEnabled(true); +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvToolExtractLung::SetGUIFromArgsInfo() +{ + mAirUpperThresholdSlider->SetText("Upper threshold for air"); + mAirUpperThresholdSlider->SetMinimum(-1200); + mAirUpperThresholdSlider->SetMaximum(2000); + DD(mArgsInfo->upper_arg); + mAirUpperThresholdSlider->SetValue(mArgsInfo->upper_arg); + + mAirLowerThresholdSlider->SetText("Lower threshold for air"); + mAirLowerThresholdSlider->SetMinimum(-1200); + mAirLowerThresholdSlider->SetMaximum(2000); + mAirLowerThresholdSlider->SetValue(mArgsInfo->lower_arg); + } //------------------------------------------------------------------------------ @@ -109,16 +136,19 @@ void vvToolExtractLung::PatientMaskInputIsSelected() //------------------------------------------------------------------------------ void vvToolExtractLung::GetArgsInfoFromGUI() { - DD("GetArgsInfoFromGUI"); - mArgsInfo.patientBG_arg = 0; //mPatientBackgroundValueSpinBox->value(); - mArgsInfo.verboseOption_flag = true; - mArgsInfo.verboseStep_flag = true; - mArgsInfo.writeStep_flag = false; - mArgsInfo.input_given = 0; - mArgsInfo.patient_given = 0; - mArgsInfo.output_given = 0; - mArgsInfo.outputTrachea_given = 0; - mArgsInfo.remove1_given = 0; + // mArgsInfo->patientBG_arg = mPatientMaskInputWidget->GetBackgroundValue(); + mArgsInfo->verboseOption_flag = true; // DEBUG. TO CHANGE + mArgsInfo->verboseStep_flag = true; // DEBUG. TO CHANGE + mArgsInfo->writeStep_flag = false; + mArgsInfo->input_given = 0; + // mArgsInfo->patient_given = 0; + mArgsInfo->output_given = 0; + mArgsInfo->outputTrachea_given = 0; + // mArgsInfo->remove1_given = 0; + + mArgsInfo->upper_arg = mAirUpperThresholdSlider->GetValue(); + mArgsInfo->lower_arg = mAirLowerThresholdSlider->GetValue(); + if (mRadioButtonLowerThan->isChecked()) mArgsInfo->lower_given = 1; } //------------------------------------------------------------------------------ @@ -126,37 +156,67 @@ void vvToolExtractLung::GetArgsInfoFromGUI() //------------------------------------------------------------------------------ void vvToolExtractLung::apply() { - DD("apply"); + // Change cursor to wait QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); + // Read options from GUI and put it in the ArgsInfo struct GetArgsInfoFromGUI(); + + // Check options + if (mArgsInfo->lower_given) { + if (mArgsInfo->lower_arg > mArgsInfo->upper_arg) { + QApplication::restoreOverrideCursor(); + QMessageBox::information(this,tr("Error"), "Lower threshold cannot be greater than upper threshold."); + return; + } + } - mFilter->SetIOVerbose(true); + // Create new filter + if (mFilter) delete mFilter; + mFilter = new FilterType; // needed when thread cancel the filter + // mFilter->StopOnErrorOff(); + // mFilter->SetIOVerbose(true); mFilter->AddInputVVImage(mCurrentImage); // CT mFilter->AddInputVVImage(mPatient); // patient mask - mFilter->SetArgsInfo(mArgsInfo); - - DD("mfilter->Update"); - // vvThreadedFilter a; - // a->SetFilter(mFilter) - // connect(a, SIGNAL(rejected()), this, SLOT(FilterHasBeenCanceled())); - // a->Update(); - // if (a->HasError()) { DD(a->GetError()); return; } - mFilter->Update(); - - // Check error - if (mFilter->HasError()) { - QMessageBox::information(this,tr("*Error* while finding lung"), mFilter->GetLastError().c_str()); - reject(); + mFilter->SetArgsInfo(*mArgsInfo); + + // Created threaded execution + vvThreadedFilter thread; + connect(&thread, SIGNAL(ThreadInterrupted()), this, SLOT(ThreadInterrupted())); + thread.SetFilter(mFilter); + + try { + thread.Update(); + } + catch(std::runtime_error e) { + DD("Error exception handling"); + DD(m_IsThreadInterrupted); + // Check if the thread has been canceled. In this case, return + if (m_IsThreadInterrupted) { + m_IsThreadInterrupted = false; + QApplication::restoreOverrideCursor(); return; } + disconnect(&thread, SIGNAL(ThreadInterrupted()), this, SLOT(ThreadInterrupted())); + + // Check error during filter + // if (mFilter->HasError()) { + QApplication::restoreOverrideCursor(); + QMessageBox::information(this,tr("Error"), e.what());//mFilter->GetLastError().c_str()); + return; + // } + } // end exception // Get output std::vector output = mFilter->GetOutputVVImages(); - DD(output.size()); + if (output.size() == 0) { + std::cerr << "Error : no output ?" << std::endl; + QApplication::restoreOverrideCursor(); + close(); + return; + } // Set Lung into VV - DD("lung"); vvImage::Pointer lung = output[0]; std::ostringstream osstream; osstream << "Lung_" << mCurrentSlicerManager->GetSlicer(0)->GetFileName() << ".mhd"; @@ -167,7 +227,6 @@ void vvToolExtractLung::apply() // Set trachea into VV if (output.size() == 2) { - DD("trachea"); vvImage::Pointer trachea = output[1]; std::ostringstream osstream; osstream << "Trachea_" << mCurrentSlicerManager->GetSlicer(0)->GetFileName() << ".mhd"; @@ -191,3 +250,10 @@ bool vvToolExtractLung::close() //------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +void vvToolExtractLung::ThreadInterrupted() +{ + m_IsThreadInterrupted = true; +} +//------------------------------------------------------------------------------ +