diff --git a/Applications/Util/otbConcatenateImages.cxx b/Applications/Util/otbConcatenateImages.cxx index d0c8ba937eb74de1c04a8b97330a002873b0172b..161cc756dae8161f703e0eed1f691dcef7d256bb 100644 --- a/Applications/Util/otbConcatenateImages.cxx +++ b/Applications/Util/otbConcatenateImages.cxx @@ -88,12 +88,25 @@ private: // Get the input image list FloatVectorImageListType::Pointer inList = this->GetParameterImageList("il"); + if( inList->Size() == 0 ) + { + itkExceptionMacro("No input Image set..."); + } + + inList->GetNthElement(0)->UpdateOutputInformation(); + FloatVectorImageType::SizeType size = inList->GetNthElement(0)->GetLargestPossibleRegion().GetSize(); + // Split each input vector image into image // and generate an mono channel image list for( unsigned int i=0; i<inList->Size(); i++ ) { FloatVectorImageType::Pointer vectIm = inList->GetNthElement(i); vectIm->UpdateOutputInformation(); + if( size != vectIm->GetLargestPossibleRegion().GetSize() ) + { + itkExceptionMacro("Input Image size mismatch..."); + } + for( unsigned int j=0; j<vectIm->GetNumberOfComponentsPerPixel(); j++) { ExtractROIFilterType::Pointer extractor = ExtractROIFilterType::New(); @@ -105,6 +118,8 @@ private: } } + + m_Concatener->SetInput( m_ImageList ); SetParameterOutputImage("out", m_Concatener->GetOutput()); diff --git a/Code/ApplicationEngine/otbWrapperApplication.cxx b/Code/ApplicationEngine/otbWrapperApplication.cxx index bc4dd6c54450331053566416c3c889f54065c699..6343a27253dcdcab6966f173c864b7ffec08e4a8 100644 --- a/Code/ApplicationEngine/otbWrapperApplication.cxx +++ b/Code/ApplicationEngine/otbWrapperApplication.cxx @@ -623,7 +623,7 @@ FloatVectorImageListType* Application::GetParameterImageList(std::string paramet Parameter* param = GetParameterByKey(parameter); if (dynamic_cast<InputImageListParameter*>(param)) - { + { InputImageListParameter* paramDown = dynamic_cast<InputImageListParameter*>(param); ret = paramDown->GetImageList(); } diff --git a/Code/ApplicationEngine/otbWrapperInputImageListParameter.cxx b/Code/ApplicationEngine/otbWrapperInputImageListParameter.cxx index a410d92494b966fe66611977585f678dae1786b3..495933315abec524e4db10b4e2a4a945a642cb64 100644 --- a/Code/ApplicationEngine/otbWrapperInputImageListParameter.cxx +++ b/Code/ApplicationEngine/otbWrapperInputImageListParameter.cxx @@ -38,33 +38,79 @@ InputImageListParameter::~InputImageListParameter() void InputImageListParameter::SetListFromFileName(const std::vector<std::string> & filenames) { + // First clear previous file choosen + this->ClearValue(); + + bool isOk = false; for(unsigned int i=0; i<filenames.size(); i++) { - ImageFileReaderType::Pointer reader = ImageFileReaderType::New(); - reader->SetFileName(filenames[i]); - reader->UpdateOutputInformation(); - - // everything went fine, store the object references - m_ReaderList->PushBack(reader); - m_ImageList->PushBack(reader->GetOutput()); + const std::string filename = filenames[i]; + // TODO : when the logger will be available, redirect the exception + // in the logger (like what is done in MsgReporter) + if (!filename.empty() + && itksys::SystemTools::FileExists(filename.c_str())) + { + ImageFileReaderType::Pointer reader = ImageFileReaderType::New(); + reader->SetFileName(filename); + try + { + reader->UpdateOutputInformation(); + } + catch(itk::ExceptionObject & err) + { + this->ClearValue(); + isOk = false; + break; + } + + // everything went fine, store the object references + m_ReaderList->PushBack(reader); + m_ImageList->PushBack(reader->GetOutput()); + } } - SetActive(true); - this->Modified(); + if( isOk == true ) + { + SetActive(true); + this->Modified(); + } +} + + +void +InputImageListParameter::AddNullElement() +{ + m_ReaderList->PushBack(NULL); + m_ImageList->PushBack(NULL); + SetActive(false); + this->Modified(); } void InputImageListParameter::AddFromFileName(const std::string & filename) { - ImageFileReaderType::Pointer reader = ImageFileReaderType::New(); - reader->SetFileName(filename); - reader->UpdateOutputInformation(); + // TODO : when the logger will be available, redirect the exception + // in the logger (like what is done in MsgReporter) + if (!filename.empty() + && itksys::SystemTools::FileExists(filename.c_str())) + { + ImageFileReaderType::Pointer reader = ImageFileReaderType::New(); + reader->SetFileName(filename); + try + { + reader->UpdateOutputInformation(); + } + catch(itk::ExceptionObject & err) + { + this->ClearValue(); + } - // everything went fine, store the object references - m_ReaderList->PushBack(reader); - m_ImageList->PushBack(reader->GetOutput()); - SetActive(true); - this->Modified(); + // everything went fine, store the object references + m_ReaderList->PushBack(reader); + m_ImageList->PushBack(reader->GetOutput()); + SetActive(true); + this->Modified(); + } } void @@ -74,12 +120,27 @@ InputImageListParameter::SetNthFileName( const unsigned int id, const std::strin { itkExceptionMacro(<< "No image "<<id<<". Only "<<m_ReaderList->Size()<<" images available."); } - - ImageFileReaderType::Pointer reader = ImageFileReaderType::New(); - reader->SetFileName(filename); - reader->UpdateOutputInformation(); - m_ReaderList->SetNthElement(id, reader); - m_ImageList->SetNthElement(id, reader->GetOutput()); + + // TODO : when the logger will be available, redirect the exception + // in the logger (like what is done in MsgReporter) + if (!filename.empty() + && itksys::SystemTools::FileExists(filename.c_str())) + { + ImageFileReaderType::Pointer reader = ImageFileReaderType::New(); + reader->SetFileName(filename); + try + { + reader->UpdateOutputInformation(); + } + catch(itk::ExceptionObject & err) + { + this->ClearValue(); + } + m_ReaderList->SetNthElement(id, reader); + m_ImageList->SetNthElement(id, reader->GetOutput()); + + this->Modified(); + } } @@ -136,21 +197,51 @@ InputImageListParameter::GetNthImage(unsigned int i) const void InputImageListParameter::SetImageList(FloatVectorImageListType* imList) { + // Check input availability + // TODO : when the logger will be available, redirect the exception + // in the logger (like what is done in MsgReporter) + try + { + for(unsigned int i=0; i<imList->Size(); i++) + { + imList->GetNthElement( i )->UpdateOutputInformation(); + } + } + catch(itk::ExceptionObject & err) + { + return; + } + m_ImageList = imList; m_ReaderList = ImageFileReaderListType::Pointer(); for(unsigned int i=0; i<m_ImageList->Size(); i++) { m_ReaderList->PushBack( ImageFileReaderType::Pointer() ); } - + + SetActive(true); this->Modified(); } void InputImageListParameter::AddImage(FloatVectorImageType* image) { + // Check input availability + // TODO : when the logger will be available, redirect the exception + // in the logger (like what is done in MsgReporter) + try + { + image->UpdateOutputInformation(); + } + catch(itk::ExceptionObject & err) + { + return; + } + m_ImageList->PushBack( image ); m_ReaderList->PushBack( ImageFileReaderType::Pointer() ); + + this->Modified(); } bool @@ -161,7 +252,16 @@ InputImageListParameter::HasValue() const return false; } - return m_ImageList->GetNthElement(0).IsNotNull(); + + bool res(true); + unsigned int i(0); + while(i<m_ImageList->Size() && res==true) + { + res = m_ImageList->GetNthElement(i).IsNotNull(); + i++; + } + + return res; } @@ -175,13 +275,18 @@ InputImageListParameter::Erase( unsigned int id ) m_ImageList->Erase( id ); m_ReaderList->Erase( id ); + + this->Modified(); } void -InputImageListParameter::Clear() +InputImageListParameter::ClearValue() { m_ImageList->Clear(); m_ReaderList->Clear(); + + SetActive(false); + this->Modified(); } diff --git a/Code/ApplicationEngine/otbWrapperInputImageListParameter.h b/Code/ApplicationEngine/otbWrapperInputImageListParameter.h index 5168fb2a976e74779142e4f89f41a003a4cab79f..b212f6dc5683af6c067547e2f6acb899b0ae585f 100644 --- a/Code/ApplicationEngine/otbWrapperInputImageListParameter.h +++ b/Code/ApplicationEngine/otbWrapperInputImageListParameter.h @@ -52,11 +52,13 @@ public: /** Set image form a list of filename */ void SetListFromFileName(const std::vector<std::string> & filenames); + /** Add null element to lists. */ + void AddNullElement(); /** Add an image from a filename */ void AddFromFileName(const std::string & filename); - /** Set one specific stored image filename. */ + /** Set one specific stored image filename. */ void SetNthFileName( const unsigned int id, const std::string & filename ); @@ -85,7 +87,7 @@ public: void Erase( unsigned int id ); /** Clear all the list. */ - void Clear(); + virtual void ClearValue(); protected: diff --git a/Code/Wrappers/QtWidget/otbQtFileSelectionWidget.cxx b/Code/Wrappers/QtWidget/otbQtFileSelectionWidget.cxx index 4abfcda962f23fcb6ad4a19fa945b9abb72cd6d7..cfa3177e21c9cad04d78a169f13ccd607d7909c3 100644 --- a/Code/Wrappers/QtWidget/otbQtFileSelectionWidget.cxx +++ b/Code/Wrappers/QtWidget/otbQtFileSelectionWidget.cxx @@ -23,16 +23,8 @@ namespace Wrapper { QtFileSelectionWidget::QtFileSelectionWidget() - : QWidget() /*, m_Index(0), m_AsValue(false)*/ + : QWidget() { - //m_InputList = InputImageListParameter::New(); - this->DoCreateWidget(); -} - -QtFileSelectionWidget::QtFileSelectionWidget( InputImageListParameter * il ) - : QWidget()/*, m_Index(0), m_AsValue(false)*/ -{ - //m_InputList = il; this->DoCreateWidget(); } @@ -66,7 +58,6 @@ void QtFileSelectionWidget::DoCreateWidget() m_Button->setToolTip("Select file..."); m_Button->setFixedWidth(30); - //m_Button->setMaximumWidth(m_Button->width()); connect( m_Button, SIGNAL(clicked()), this, SLOT(SelectFile()) ); m_HLayout->addWidget(m_Button); @@ -82,21 +73,8 @@ void QtFileSelectionWidget::SelectFile() if (fileDialog.exec()) { - //this->SetFileName(fileDialog.selectedFiles().at(0)); QString filemane(fileDialog.selectedFiles().at(0)); m_Input->setText(filemane); -/* - if( m_AsValue == false ) - { - m_InputList->AddFromFileName(filemane.toStdString()); - m_Index = m_InputList->GetImageList()->Size()-1; - m_AsValue = true; - } - else - { - m_InputList->SetNthFileName( m_Index, filemane.toStdString()); - } -*/ } } diff --git a/Code/Wrappers/QtWidget/otbQtFileSelectionWidget.h b/Code/Wrappers/QtWidget/otbQtFileSelectionWidget.h index ed6f77d9cbc937284af770e253c9f5c3be3ea409..b83f14e18987979a6c986c024ab9e41b02f07f80 100644 --- a/Code/Wrappers/QtWidget/otbQtFileSelectionWidget.h +++ b/Code/Wrappers/QtWidget/otbQtFileSelectionWidget.h @@ -36,33 +36,8 @@ class QtFileSelectionWidget : public QWidget Q_OBJECT public: QtFileSelectionWidget(); - QtFileSelectionWidget( InputImageListParameter * il ); virtual ~QtFileSelectionWidget(); -/* - InputImageListParameter * GetInputList() - { - return m_InputList; - } - - void SetInputList(InputImageListParameter * il) - { - m_InputList = il; - } -*/ - -/* - unsigned int GetIndex() - { - return m_Index; - } - - unsigned int SetIndex( unsigned int id ) - { - m_Index = id; - } -*/ - bool IsChecked() { return m_Checkbox->isChecked(); @@ -78,9 +53,12 @@ public: return m_Input->text().toStdString(); } + QLineEdit* GetInput() + { + return m_Input; + } protected slots: - //void SetFileName( const QString& value ); void SelectFile(); private: @@ -96,9 +74,6 @@ private: QLineEdit* m_Input; QPushButton * m_Button; QCheckBox * m_Checkbox; - //InputImageListParameter::Pointer m_InputList; - //unsigned int m_Index; - //bool m_AsValue; }; diff --git a/Code/Wrappers/QtWidget/otbWrapperQtWidgetInputImageListParameter.cxx b/Code/Wrappers/QtWidget/otbWrapperQtWidgetInputImageListParameter.cxx index b33088e0ab4905f72473d154ded6402e51ea30df..58eecf0e451d877fc6868402465f4e789cefe6e7 100644 --- a/Code/Wrappers/QtWidget/otbWrapperQtWidgetInputImageListParameter.cxx +++ b/Code/Wrappers/QtWidget/otbWrapperQtWidgetInputImageListParameter.cxx @@ -26,6 +26,7 @@ QtWidgetInputImageListParameter::QtWidgetInputImageListParameter(InputImageListP : QtWidgetParameterBase(param, m), m_InputImageListParam(param) { + connect( this, SIGNAL(Change()), GetModel(), SLOT(NotifyUpdate()) ); } QtWidgetInputImageListParameter::~QtWidgetInputImageListParameter() @@ -66,7 +67,6 @@ void QtWidgetInputImageListParameter::DoCreateWidget() addButton->setText("+"); addButton->setFixedWidth(buttonSize); addButton->setToolTip("Add a file selector..."); - //addButton->setMaximumWidth(addButton->width()); connect( addButton, SIGNAL(clicked()), this, SLOT(AddFile()) ); addSupLayout->addWidget(addButton); @@ -107,9 +107,12 @@ void QtWidgetInputImageListParameter::DoCreateWidget() QVBoxLayout * fileLayout = new QVBoxLayout(); fileLayout->setSpacing(0); - QtFileSelectionWidget * fileSelection = new QtFileSelectionWidget(m_InputImageListParam); - fileSelection->setFixedHeight(40); + QtFileSelectionWidget * fileSelection = new QtFileSelectionWidget(); + fileSelection->setFixedHeight(30); fileLayout->addWidget( fileSelection ); + m_InputImageListParam->AddNullElement(); + connect( fileSelection->GetInput(), SIGNAL(textChanged(const QString&)), this, SLOT(UpdateImageList()) ); + m_FileSelectionList.push_back(fileSelection); QGroupBox *mainGroup = new QGroupBox(); @@ -131,6 +134,18 @@ void QtWidgetInputImageListParameter::DoCreateWidget() } +void +QtWidgetInputImageListParameter::UpdateImageList() +{ + // save value + for(unsigned int j=0; j<m_InputImageListParam->GetImageList()->Size(); j++ ) + { + m_InputImageListParam->SetNthFileName(j, m_FileSelectionList[j]->GetFilename()); + } + + emit Change(); +} + void QtWidgetInputImageListParameter::UpFile() @@ -244,6 +259,10 @@ QtWidgetInputImageListParameter::UpdateFileList( std::map<unsigned int, unsigned m_Scroll->setWidget(mainGroup); this->update(); + + // notify of value change + QString key( QString::fromStdString(m_InputImageListParam->GetKey()) ); + emit ParameterChanged(key); } @@ -262,13 +281,15 @@ QtWidgetInputImageListParameter::AddFile() fileSelection->setFixedHeight( 30 ); m_FileLayout->addWidget( fileSelection ); m_FileSelectionList.push_back(fileSelection); + m_InputImageListParam->AddNullElement(); + connect( fileSelection->GetInput(), SIGNAL(textChanged(const QString&)), this, SLOT(UpdateImageList()) ); QGroupBox *mainGroup = new QGroupBox(); mainGroup->setLayout(m_FileLayout); m_Scroll->setWidget(mainGroup); + this->update(); - this->RecreateImageList(); } void @@ -305,9 +326,11 @@ QtWidgetInputImageListParameter::EraseFile() m_FileLayout = new QVBoxLayout(); QtFileSelectionWidget * fileSelection = new QtFileSelectionWidget(); - fileSelection->setFixedHeight( 40 ); + fileSelection->setFixedHeight( 30 ); m_FileLayout->addWidget( fileSelection ); m_FileSelectionList.push_back(fileSelection); + m_InputImageListParam->AddNullElement(); + connect( fileSelection->GetInput(), SIGNAL(textChanged(const QString&)), this, SLOT(UpdateImageList()) ); QGroupBox *mainGroup = new QGroupBox(); mainGroup->setLayout(m_FileLayout); @@ -321,13 +344,14 @@ QtWidgetInputImageListParameter::EraseFile() void QtWidgetInputImageListParameter::RecreateImageList() { // save value - m_InputImageListParam->Clear(); + m_InputImageListParam->ClearValue(); for(unsigned int j=0; j<m_FileSelectionList.size(); j++ ) { - if( m_FileSelectionList[j]->GetFilename() != "" ) - m_InputImageListParam->AddFromFileName(m_FileSelectionList[j]->GetFilename()); + m_InputImageListParam->AddFromFileName(m_FileSelectionList[j]->GetFilename()); + connect( m_FileSelectionList[j]->GetInput(), SIGNAL(textChanged(const QString&)), this, SLOT(UpdateImageList()) ); } + emit Change(); // notify of value change QString key( QString::fromStdString(m_InputImageListParam->GetKey()) ); emit ParameterChanged(key); diff --git a/Code/Wrappers/QtWidget/otbWrapperQtWidgetInputImageListParameter.h b/Code/Wrappers/QtWidget/otbWrapperQtWidgetInputImageListParameter.h index 28fb500f23b868cf58b5222d985b48c1b4e62a42..6bc10934228b606cbfc41f5900cbb6d1c128594b 100644 --- a/Code/Wrappers/QtWidget/otbWrapperQtWidgetInputImageListParameter.h +++ b/Code/Wrappers/QtWidget/otbWrapperQtWidgetInputImageListParameter.h @@ -38,6 +38,10 @@ public: QtWidgetInputImageListParameter(InputImageListParameter*, QtWidgetModel*); virtual ~QtWidgetInputImageListParameter(); + +signals: + void Change(); + protected slots: //void SetFileName( const QString& value ); //virtual void SelectFile(); @@ -46,7 +50,7 @@ protected slots: virtual void AddFile(); virtual void SupressFile(); virtual void EraseFile(); - + virtual void UpdateImageList(); private: QtWidgetInputImageListParameter(const QtWidgetInputImageListParameter&); //purposely not implemented @@ -63,14 +67,6 @@ private: QHBoxLayout * m_HLayout; QVBoxLayout * m_FileLayout; - //QVBoxLayout * m_ButtonLayout; - //QHBoxLayout * m_AddSupLayout; - //QHBoxLayout * m_UpDownLayout; - //QPushButton * m_SupButton; - //QPushButton * m_AddButton; - //QPushButton * m_EraseButton; - //QPushButton * m_UpButton; - //QPushButton * m_DownButton; QScrollArea * m_Scroll; std::vector<QtFileSelectionWidget *> m_FileSelectionList; };