diff --git a/.github/workflows/musicardio-macos.yml b/.github/workflows/musicardio-macos.yml new file mode 100644 index 0000000000..66e838c31a --- /dev/null +++ b/.github/workflows/musicardio-macos.yml @@ -0,0 +1,134 @@ +# This starter workflow is for a CMake project running on a single platform. There is a different starter workflow if you need cross-platform coverage. +# See: https://github.com/actions/starter-workflows/blob/main/ci/cmake-multi-platform.yml +name: MUSICardio on macOS + +on: + push: + branches: [ "4.1" ] + pull_request: + branches: [ "4.1" ] + workflow_dispatch: + inputs: + EXPIRATION_TIME: + description: 'Expiration time in month' + required: true + default: '12' + type: string + #schedule: + # - cron: '0 0 * * 1' # Each monday at 0h00, MIN HOUR DAY_IN_MONTH MONTH WEEK_DAY + +env: + BUILD_TYPE: Release + QT5_DIR: "/usr/local/opt/qt@5/lib/cmake/Qt5" + MSC_SSH_PLUGINS: ${{ secrets.MSC_SSH_PLUGINS }} + MSC_TOKEN: ${{ secrets.MSC_TOKEN }} + +jobs: + build: + # https://docs.github.com/en/actions/using-jobs/choosing-the-runner-for-a-job#standard-github-hosted-runners-for-public-repositories + runs-on: macos-13 + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + ref: 4.1 + + - name: Set up SSH + run: | + mkdir -p ~/.ssh + echo "$MSC_SSH_PLUGINS" > ~/.ssh/id_rsa + chmod 600 ~/.ssh/id_rsa + ssh-keyscan github.com >> ~/.ssh/known_hosts + + - name: Install dependencies + run: | + brew install qt@5 + brew install boost + brew install swig + brew install libomp + echo "OpenMP_ROOT=$(brew --prefix libomp)" >> $GITHUB_ENV + pip3 install dmgbuild + # brew info cmake + + - name: Set default EXPIRATION_TIME if not provided (with non manual workflow) + run: echo "EXPIRATION_TIME=${{ inputs.EXPIRATION_TIME || '12' }}" >> $GITHUB_ENV + + - name: Configure CMake + run: | + cmake -B ${{github.workspace}}/build \ + -DUSE_GITHUB_SSH:BOOL=TRUE \ + -DmedInria_BUILD_TYPE:STRING=$BUILD_TYPE \ + -Dmusic-plugins_BUILD_TYPE:STRING=$BUILD_TYPE \ + -DEP_CHECKBOX_CUSTOM_DIRS:BOOL=ON \ + -DEP_CHECKBOX_ON_TOP_LEVEL:BOOL=OFF \ + -DEP_CHECKBOX_SIDE_BY_SIDE:BOOL=OFF \ + -DQt5_DIR=$QT5_DIR \ + -DOpenMP_ROOT=$OpenMP_ROOT \ + -DUSE_FFmpeg=ON \ + -DEXPIRATION_TIME:STRING=$EXPIRATION_TIME \ + -DUSE_RealTimeWorkspace=OFF + + - name: Build + run: | + CORES_TO_USE=$(($(sysctl -n hw.ncpu) - 1)) # Limit the number of used core otherwise the compilation crashes sometimes + echo "Using $CORES_TO_USE cores for the build" + cmake --build ${{github.workspace}}/build --config $BUILD_TYPE --parallel $CORES_TO_USE + + - name: Package + run: | + cd ${{github.workspace}}/build + cpack -C $BUILD_TYPE + + - name: Prepare DMG and update design + run: | + cd ${{github.workspace}}/build + dmg=$(ls *.dmg) + echo "The current package to adapt: $dmg" + + if [ -n "$dmg" ]; then + # Attach to read-write format and retrieve mount path + path=$(hdiutil attach -owners on $dmg -shadow | grep -i 'Volumes' | cut -f 3) + echo "The current path: $path" + + # Navigate to correct directory + cd "$path/MUSICardio.app/Contents/" + + pathPluginsLegacy="${{github.workspace}}/build/medInria-build/bin/plugins_legacy" + + # Change library paths for plugins + for f in PlugIns/*.dylib; do + install_name_tool -change $pathPluginsLegacy/libAAMeshInteractorPlugin.dylib @executable_path/../PlugIns/libAAMeshInteractorPlugin.dylib $f + install_name_tool -change $pathPluginsLegacy/libAAAMeshUtilityPlugin.dylib @executable_path/../PlugIns/libAAAMeshUtilityPlugin.dylib $f + install_name_tool -change $pathPluginsLegacy/libAAAmedPipelinePlugin.dylib @executable_path/../PlugIns/libAAAmedPipelinePlugin.dylib $f + install_name_tool -change $pathPluginsLegacy/libmscPipelinesPlugin.dylib @executable_path/../PlugIns/libmscPipelinesPlugin.dylib $f + install_name_tool -change $pathPluginsLegacy/libAAAEPMapPlugin.dylib @executable_path/../PlugIns/libAAAEPMapPlugin.dylib $f + install_name_tool -change $pathPluginsLegacy/libAAMFSSimulationPlugin.dylib @executable_path/../PlugIns/libAAMFSSimulationPlugin.dylib $f + install_name_tool -change $pathPluginsLegacy/libFEMForwardProblemPlugin.dylib @executable_path/../PlugIns/libFEMForwardProblemPlugin.dylib $f + done + + # Go back to original path + cd "${{github.workspace}}/build" + + # Update dmg design + echo "### Now we are going to update the dmg design" + volumeName=$(basename "$path") + dmgbuild -s ../packaging/apple/settings.json "$volumeName" MUSICardio.dmg + + echo "End of the processes" + else + echo "A problem happened in MSC compilation, no dmg is built" + fi + + - name: Upload binaries to release + uses: svenstaro/upload-release-action@v2 + with: + repo_name: Inria-Asclepios/msc_binaries + # A personal access token for the GitHub repository in which the release will be created and edited. + # It is recommended to create the access token with the following scopes: `repo, user, admin:repo_hook`. + repo_token: ${{ secrets.MSC_TOKEN }} + file: ${{github.workspace}}/build/MUSICardio.dmg + asset_name: MUSICardio.dmg + tag: latest + overwrite: true + body: "MUSICardio binaries" diff --git a/CMakeLists.txt b/CMakeLists.txt index 32025e72f3..e861d4e0c3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,7 +20,7 @@ endif() cmake_policy(SET CMP0074 NEW) if(NOT DEFINED ${MEDINRIA_SUPERBUILD_VERSION}) - set(MEDINRIA_SUPERBUILD_VERSION 4.0.2) + set(MEDINRIA_SUPERBUILD_VERSION 4.0.7) endif() SET(CMAKE_CXX_STANDARD 17) diff --git a/RELEASE_NOTES.txt b/RELEASE_NOTES.txt index 7325be46ac..1441272690 100644 --- a/RELEASE_NOTES.txt +++ b/RELEASE_NOTES.txt @@ -1,3 +1,33 @@ +MUSICardio 4.0.7: +- PolygonROI: + * fix drawing a contour with shift-click to be able to change zoom/contrast with click. + * fix removing a last contour/node which reset the label tool and allow to draw again. +- Registration step in pipelines allows to use Mouse Interaction Toolbox. +- VOICutterToolBox fix a crash with metadata in pipelines sometimes if a cut has been made. + +MUSICardio 4.0.6: +- Debug import of Carto .zip archives and .mesh files. +- PolygonROI: remove shift-click to draw, fix contrast after deactivation of repulsor and hide deactivated widgets. +- Pipelines: + * put back the possibility of closing layers at result steps, + * fix VOICutter if no segmentation is done, + * fix Histogram Analysis non manual algorithms. + * fix pipeline crash when saving data. + +MUSICardio 4.0.5: +- Allow to use data with different size or spacing in LCCLogDemons and DiffeomorphicDemons. +- Manual Registration: enhance landmark numbers for better user understanding. +- Fix Histogram Analysis width problem displaying multi-results. + +MUSICardio 4.0.4: +- Fix some plugins wrongly loaded on Windows. + +MUSICardio 4.0.3: +- Switch to Ubuntu 22. +- PolygonROI: update icons, fix a glitch when users change ROI label, hide label panel in pipelines. +- Histogram Analysis: enhance memory management and remove useless computation. +- Pipelines: correct arithmetic filters computation. + MUSICardio 4.0.2: - Fix drawing problem in pipelines with custom step of PolygonROI. diff --git a/packaging/apple/settings.json b/packaging/apple/settings.json index 15f0d3c863..4d5203c3a8 100644 --- a/packaging/apple/settings.json +++ b/packaging/apple/settings.json @@ -7,7 +7,7 @@ "window": { "position": { "x": 100, "y": 100 }, "size": { "width": 640, "height": 300 } }, "contents": [ - { "x": 140, "y": 165, "type": "file", "path": "/Volumes/MUSICardio 4.0.2/MUSICardio.app" }, + { "x": 140, "y": 165, "type": "file", "path": "/Volumes/MUSICardio 4.0.7/MUSICardio.app" }, { "x": 480, "y": 165, "type": "link", "path": "/Applications" } ] } diff --git a/packaging/windows/WindowsPackaging.cmake b/packaging/windows/WindowsPackaging.cmake index fba1809b0a..9989550ca1 100644 --- a/packaging/windows/WindowsPackaging.cmake +++ b/packaging/windows/WindowsPackaging.cmake @@ -104,7 +104,7 @@ list(APPEND ${DCMTK_ROOT}/bin/Release ${VTK_ROOT}/bin/Release ${QtDCM_ROOT}/bin/Release - ${TTK_ROOT}/bin/Release + ${TTK_ROOT}/bin ${dtk_ROOT}/bin/Release ${RPI_ROOT}/bin/Release ${ZLIB_ROOT}/Release @@ -121,12 +121,14 @@ file(GLOB_RECURSE itk_files LIST_DIRECTORIES true \"${ITK_ROOT}/bin/*.dll\") file(GLOB_RECURSE vtk_files LIST_DIRECTORIES true \"${VTK_ROOT}/bin/*.dll\") file(GLOB_RECURSE dtk_files LIST_DIRECTORIES true \"${dtk_ROOT}/bin/*.dll\") file(GLOB_RECURSE dcm_files LIST_DIRECTORIES true \"${QtDCM_ROOT}/bin/*.dll\") +file(GLOB_RECURSE ttk_files LIST_DIRECTORIES true \"${TTK_DIR}/bin/*.dll\") file(GLOB_RECURSE qt5_files LIST_DIRECTORIES true \"${QT_BINARY_DIR}/*.dll\") file(GLOB_RECURSE zlib_files LIST_DIRECTORIES true \"${ZLIB_ROOT}/*.dll\") list(APPEND files \${itk_files}) list(APPEND files \${vtk_files}) list(APPEND files \${dtk_files}) list(APPEND files \${dcm_files}) +list(APPEND files \${ttk_files}) list(APPEND files \${qt5_files}) list(APPEND files \${zlib_files}) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 41f5a93f67..a7da209862 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -16,7 +16,7 @@ cmake_minimum_required(VERSION 3.19) if(NOT DEFINED ${medInria_VERSION}) - set(medInria_VERSION 4.0.2) + set(medInria_VERSION 4.0.7) endif() project(medInria VERSION ${medInria_VERSION}) diff --git a/src/app/medInria/resources/medInria.qrc b/src/app/medInria/resources/medInria.qrc index 3c959b2647..98ebfc770c 100644 --- a/src/app/medInria/resources/medInria.qrc +++ b/src/app/medInria/resources/medInria.qrc @@ -146,8 +146,10 @@ <file>pixmaps/radio-disabled.png</file> <file>pixmaps/radio-checked-disabled.png</file> <file>pixmaps/plus-button.png</file> - <file>pixmaps/plus.png</file> - <file>pixmaps/minus.png</file> + <file>pixmaps/plus_white.png</file> + <file>pixmaps/minus_white.png</file> + <file>pixmaps/plus_black.png</file> + <file>pixmaps/minus_black.png</file> <file>pixmaps/checkbox-disabled.png</file> <file>pixmaps/checkbox-checked-disabled.png</file> <file>pixmaps/arrow-top-disabled.png</file> diff --git a/src/app/medInria/resources/pixmaps/minus.png b/src/app/medInria/resources/pixmaps/minus_black.png similarity index 100% rename from src/app/medInria/resources/pixmaps/minus.png rename to src/app/medInria/resources/pixmaps/minus_black.png diff --git a/src/app/medInria/resources/pixmaps/minus_white.png b/src/app/medInria/resources/pixmaps/minus_white.png new file mode 100644 index 0000000000..e36cdc667b Binary files /dev/null and b/src/app/medInria/resources/pixmaps/minus_white.png differ diff --git a/src/app/medInria/resources/pixmaps/plus.png b/src/app/medInria/resources/pixmaps/plus_black.png similarity index 100% rename from src/app/medInria/resources/pixmaps/plus.png rename to src/app/medInria/resources/pixmaps/plus_black.png diff --git a/src/app/medInria/resources/pixmaps/plus_white.png b/src/app/medInria/resources/pixmaps/plus_white.png new file mode 100644 index 0000000000..c3de70501e Binary files /dev/null and b/src/app/medInria/resources/pixmaps/plus_white.png differ diff --git a/src/layers/legacy/medCoreLegacy/database/medAbstractDatabaseImporter.cpp b/src/layers/legacy/medCoreLegacy/database/medAbstractDatabaseImporter.cpp index 6712c9e2cf..61828b0a10 100644 --- a/src/layers/legacy/medCoreLegacy/database/medAbstractDatabaseImporter.cpp +++ b/src/layers/legacy/medCoreLegacy/database/medAbstractDatabaseImporter.cpp @@ -514,6 +514,7 @@ void medAbstractDatabaseImporter::importData() // Now, populate the database medDataIndex index = this->populateDatabaseAndGenerateThumbnails ( d->data, thumb_dir ); + d->index = index; if (d->data->hasMetaData(medMetaDataKeys::Toolbox.key()) && d->data->metadata(medMetaDataKeys::Toolbox.key())=="PolygonROI" && diff --git a/src/layers/legacy/medCoreLegacy/database/medAbstractDatabaseImporter.h b/src/layers/legacy/medCoreLegacy/database/medAbstractDatabaseImporter.h index 2e62e7cd4a..e8ee9f87f8 100644 --- a/src/layers/legacy/medCoreLegacy/database/medAbstractDatabaseImporter.h +++ b/src/layers/legacy/medCoreLegacy/database/medAbstractDatabaseImporter.h @@ -48,6 +48,8 @@ class MEDCORELEGACY_EXPORT medAbstractDatabaseImporter : public medJobItemL const QUuid &uuid); ~medAbstractDatabaseImporter() override; + medDataIndex index(void) const; + signals: /** * This signal is emitted after a successful import/index. @@ -74,7 +76,6 @@ public slots: bool indexWithoutImporting ( void ); QMap<int, QString> volumeIdToImageFile ( void ); QString callerUuid ( void ); - medDataIndex index(void) const; void populateMissingMetadata ( medAbstractData* medData, const QString seriesDescription ); void addAdditionalMetaData ( medAbstractData* imData, QString aggregatedFileName, QStringList aggregatedFilesPaths ); diff --git a/src/layers/legacy/medCoreLegacy/database/medDatabasePersistentController.cpp b/src/layers/legacy/medCoreLegacy/database/medDatabasePersistentController.cpp index 45772ed64f..30577712c2 100644 --- a/src/layers/legacy/medCoreLegacy/database/medDatabasePersistentController.cpp +++ b/src/layers/legacy/medCoreLegacy/database/medDatabasePersistentController.cpp @@ -80,6 +80,8 @@ void medDatabasePersistentControllerPrivate::buildMetaDataLookup() metaDataLookup.insert(medMetaDataKeys::StudyDate.key(), TableEntryList() << TableEntry(T_study, "date")); // Series Data + metaDataLookup.insert(medMetaDataKeys::FilePaths.key(), + TableEntryList() << TableEntry(T_series, "path")); metaDataLookup.insert(medMetaDataKeys::Size.key(), TableEntryList() << TableEntry(T_series, "size")); metaDataLookup.insert(medMetaDataKeys::SeriesDescription.key(), diff --git a/src/layers/legacy/medCoreLegacy/database/medDatabaseReader.cpp b/src/layers/legacy/medCoreLegacy/database/medDatabaseReader.cpp index 39f970efa8..3903c5cea4 100644 --- a/src/layers/legacy/medCoreLegacy/database/medDatabaseReader.cpp +++ b/src/layers/legacy/medCoreLegacy/database/medDatabaseReader.cpp @@ -203,6 +203,7 @@ medAbstractData* medDatabaseReader::run() QFileInfo fullThumbnailPathInfo(fullThumbnailPath); medMetaDataKeys::SeriesThumbnail.add (medData, fullThumbnailPath); + medMetaDataKeys::FilePaths.set ( medData, seriesPath ); medMetaDataKeys::PatientID.set ( medData, patientId ); medMetaDataKeys::PatientName.set ( medData, patientName ); medMetaDataKeys::BirthDate.set ( medData, birthdate ); diff --git a/src/layers/legacy/medImageIO/itkDCMTKImageIO.cpp b/src/layers/legacy/medImageIO/itkDCMTKImageIO.cpp index d19b2a48d0..a0dbaf35bc 100644 --- a/src/layers/legacy/medImageIO/itkDCMTKImageIO.cpp +++ b/src/layers/legacy/medImageIO/itkDCMTKImageIO.cpp @@ -54,8 +54,8 @@ DCMTKImageIO::DCMTKImageIO() { this->SetNumberOfDimensions(3); this->SetNumberOfComponents(1); - this->SetPixelType(SCALAR); - this->SetComponentType(CHAR); + this->SetPixelType(IOPixelEnum::SCALAR); + this->SetComponentType(itk::IOComponentEnum::CHAR); DcmRLEDecoderRegistration::registerCodecs(); DJDecoderRegistration::registerCodecs(); @@ -356,11 +356,11 @@ void DCMTKImageIO::DetermineNumberOfPixelComponents() if( samplesPerPixel==1 ) { - this->SetPixelType ( SCALAR ); + this->SetPixelType (itk::IOPixelEnum::SCALAR ); } else { - this->SetPixelType ( RGB ); + this->SetPixelType ( itk::IOPixelEnum::RGB ); } } @@ -373,7 +373,7 @@ void DCMTKImageIO::DeterminePixelType() if (condition.bad()) { - this->SetComponentType(UNKNOWNCOMPONENTTYPE); + this->SetComponentType(itk::IOComponentEnum::UNKNOWNCOMPONENTTYPE); return; } @@ -387,36 +387,36 @@ void DCMTKImageIO::DeterminePixelType() switch( dmp->getRepresentation() ) { case EPR_Uint8: - this->SetComponentType ( UCHAR ); + this->SetComponentType (itk::IOComponentEnum::UCHAR ); break; case EPR_Sint8: - this->SetComponentType ( CHAR ); + this->SetComponentType (itk::IOComponentEnum::CHAR ); break; case EPR_Uint16: - this->SetComponentType ( USHORT ); + this->SetComponentType (itk::IOComponentEnum::USHORT ); break; case EPR_Sint16: - this->SetComponentType ( SHORT ); + this->SetComponentType (itk::IOComponentEnum::SHORT ); break; case EPR_Uint32: - this->SetComponentType ( UINT ); + this->SetComponentType (itk::IOComponentEnum::UINT ); break; case EPR_Sint32: - this->SetComponentType ( INT ); + this->SetComponentType (itk::IOComponentEnum::INT ); break; default: - this->SetComponentType (UNKNOWNCOMPONENTTYPE); + this->SetComponentType (itk::IOComponentEnum::UNKNOWNCOMPONENTTYPE); } } else { - this->SetComponentType (UNKNOWNCOMPONENTTYPE); + this->SetComponentType (itk::IOComponentEnum::UNKNOWNCOMPONENTTYPE); } } } @@ -770,31 +770,31 @@ void DCMTKImageIO::InternalRead (void* buffer, int slice, unsigned long pixelCou size_t length = pixelCount * GetNumberOfComponents(); switch( this->GetComponentType() ) { - case CHAR: + case itk::IOComponentEnum::CHAR: length *= sizeof(char); break; - case UCHAR: + case itk::IOComponentEnum::UCHAR: length *= sizeof(Uint8); break; - case SHORT: + case itk::IOComponentEnum::SHORT: length *= sizeof(Sint16); break; - case USHORT: + case itk::IOComponentEnum::USHORT: length *= sizeof(Uint16); break; - case INT: + case itk::IOComponentEnum::INT: length *= sizeof(Sint32); break; - case UINT: + case itk::IOComponentEnum::UINT: length *= sizeof(Uint32); break; - case DOUBLE: + case itk::IOComponentEnum::DOUBLE: length *= sizeof(Float64); break; diff --git a/src/layers/legacy/medImageIO/itkDataImageReaderBase.cpp b/src/layers/legacy/medImageIO/itkDataImageReaderBase.cpp index 132415e8d2..cc977605a0 100644 --- a/src/layers/legacy/medImageIO/itkDataImageReaderBase.cpp +++ b/src/layers/legacy/medImageIO/itkDataImageReaderBase.cpp @@ -71,7 +71,7 @@ bool itkDataImageReaderBase::canRead (const QString& path) return false; } - if (this->io->GetPixelType() == itk::ImageIOBase::VECTOR) + if (this->io->GetPixelType() == itk::IOPixelEnum::VECTOR) { return this->io->GetNumberOfComponents() <= 4 ; } @@ -106,7 +106,7 @@ bool itkDataImageReaderBase::readInformation (const QString& path) } medAbstractData *medData = nullptr; - if (this->io->GetPixelType()==itk::ImageIOBase::SCALAR ) + if (this->io->GetPixelType()==itk::IOPixelEnum::SCALAR ) { const int dim = this->io->GetNumberOfDimensions(); if (!(dim>0 && dim<=4)) @@ -119,43 +119,43 @@ bool itkDataImageReaderBase::readInformation (const QString& path) switch (this->io->GetComponentType()) { - case itk::ImageIOBase::UCHAR: + case itk::IOComponentEnum::UCHAR: medData = medAbstractDataFactory::instance()->create(QString("itkDataImageUChar").append(cdim)); break; - case itk::ImageIOBase::CHAR: + case itk::IOComponentEnum::CHAR: medData = medAbstractDataFactory::instance()->create (QString("itkDataImageChar").append(cdim)); break; - case itk::ImageIOBase::USHORT: + case itk::IOComponentEnum::USHORT: medData = medAbstractDataFactory::instance()->create (QString("itkDataImageUShort").append(cdim)); break; - case itk::ImageIOBase::SHORT: + case itk::IOComponentEnum::SHORT: medData = medAbstractDataFactory::instance()->create (QString("itkDataImageShort").append(cdim)); break; - case itk::ImageIOBase::UINT: + case itk::IOComponentEnum::UINT: medData = medAbstractDataFactory::instance()->create (QString("itkDataImageUInt").append(cdim)); break; - case itk::ImageIOBase::INT: + case itk::IOComponentEnum::INT: medData = medAbstractDataFactory::instance()->create (QString("itkDataImageInt").append(cdim)); break; - case itk::ImageIOBase::ULONG: + case itk::IOComponentEnum::ULONG: medData = medAbstractDataFactory::instance()->create (QString("itkDataImageULong").append(cdim)); break; - case itk::ImageIOBase::LONG: + case itk::IOComponentEnum::LONG: medData = medAbstractDataFactory::instance()->create (QString("itkDataImageLong").append(cdim)); break; - case itk::ImageIOBase::FLOAT: + case itk::IOComponentEnum::FLOAT: medData = medAbstractDataFactory::instance()->create (QString("itkDataImageDouble").append(cdim)); // Bug ??? break; - case itk::ImageIOBase::DOUBLE: + case itk::IOComponentEnum::DOUBLE: medData = medAbstractDataFactory::instance()->create (QString("itkDataImageDouble").append(cdim)); // Bug (added 4 which was not existing) ?? break; @@ -164,13 +164,13 @@ bool itkDataImageReaderBase::readInformation (const QString& path) return false; } } - else if (this->io->GetPixelType()==itk::ImageIOBase::RGB) + else if (this->io->GetPixelType()==itk::IOPixelEnum::RGB) { switch (this->io->GetComponentType()) { - case itk::ImageIOBase::UCHAR: + case itk::IOComponentEnum::UCHAR: medData = medAbstractDataFactory::instance()->create ("itkDataImageRGB3"); break; @@ -179,18 +179,18 @@ bool itkDataImageReaderBase::readInformation (const QString& path) return false; } } - else if (this->io->GetPixelType()==itk::ImageIOBase::VECTOR) + else if (this->io->GetPixelType()==itk::IOPixelEnum::VECTOR) { // Added by Theo. switch (this->io->GetComponentType()) { - case itk::ImageIOBase::UCHAR: + case itk::IOComponentEnum::UCHAR: medData = medAbstractDataFactory::instance()->create ("itkDataImageVectorUChar3"); break; - case itk::ImageIOBase::FLOAT: + case itk::IOComponentEnum::FLOAT: medData = medAbstractDataFactory::instance()->create ("itkDataImageVectorFloat3"); break; - case itk::ImageIOBase::DOUBLE: + case itk::IOComponentEnum::DOUBLE: medData = medAbstractDataFactory::instance()->create ("itkDataImageVectorDouble3"); break; default: @@ -198,13 +198,13 @@ bool itkDataImageReaderBase::readInformation (const QString& path) return false; } } - else if ( this->io->GetPixelType()==itk::ImageIOBase::RGBA ) + else if ( this->io->GetPixelType()==itk::IOPixelEnum::RGBA ) { switch (this->io->GetComponentType()) { - case itk::ImageIOBase::UCHAR: + case itk::IOComponentEnum::UCHAR: medData = medAbstractDataFactory::instance()->create ("itkDataImageRGBA3"); break; @@ -240,10 +240,6 @@ bool itkDataImageReaderBase::readInformation (const QString& path) { medData->setMetaData(metaDataKey, QString(value.c_str())); } - else - { - qDebug() << metaObject()->className() << ":: found unknown key:" << QString::fromStdString(key); - } } // [END OF HACK] @@ -326,10 +322,6 @@ void itkDataImageReaderBase::extractMetaData() { data()->setMetaData(metaDataKey, QString(value.c_str())); } - else - { - qDebug() << metaObject()->className() << ":: found unknown key:" << QString::fromStdString(key); - } } } diff --git a/src/layers/legacy/medImageIO/itkGISImageIO.cpp b/src/layers/legacy/medImageIO/itkGISImageIO.cpp index 38c46badb2..c33fe306a4 100644 --- a/src/layers/legacy/medImageIO/itkGISImageIO.cpp +++ b/src/layers/legacy/medImageIO/itkGISImageIO.cpp @@ -29,16 +29,16 @@ namespace itk { m_IsBinary = true; this->SetNumberOfDimensions(3); - m_PixelType = SCALAR; - m_ComponentType = UCHAR; + m_PixelType = itk::IOPixelEnum::SCALAR; + m_ComponentType = itk::IOComponentEnum::UCHAR; if (ByteSwapper<int>::SystemIsBigEndian()) { - m_ByteOrder = BigEndian; + m_ByteOrder = itk::IOByteOrderEnum::BigEndian; } else { - m_ByteOrder = LittleEndian; + m_ByteOrder = itk::IOByteOrderEnum::LittleEndian; } } @@ -137,13 +137,13 @@ namespace itk //this->SetNumberOfComponents( dims[3] ); this->SetNumberOfComponents( 1 ); //this->SetPixelType (VECTOR); - this->SetPixelType (SCALAR); + this->SetPixelType (itk::IOPixelEnum::SCALAR); } else { this->SetNumberOfDimensions(3); this->SetNumberOfComponents(1); - this->SetPixelType (SCALAR); + this->SetPixelType (itk::IOPixelEnum::SCALAR); } ifs >> junk; @@ -154,7 +154,7 @@ namespace itk dims[3] = 1; this->SetNumberOfDimensions(3); this->SetNumberOfComponents(1); - this->SetPixelType (SCALAR); + this->SetPixelType (itk::IOPixelEnum::SCALAR); } for( unsigned int i=0; i<this->GetNumberOfDimensions(); i++ ) @@ -174,35 +174,35 @@ namespace itk // parse the type if( s_type== "S8" ) { - m_ComponentType = CHAR; + m_ComponentType = itk::IOComponentEnum::CHAR; } else if( s_type== "U8" ) { - m_ComponentType = UCHAR; + m_ComponentType = itk::IOComponentEnum::UCHAR; } else if( s_type== "S16" ) { - m_ComponentType = SHORT; + m_ComponentType = itk::IOComponentEnum::SHORT; } else if( s_type== "U16" ) { - m_ComponentType = USHORT; + m_ComponentType = itk::IOComponentEnum::USHORT; } else if( s_type== "S32" ) { - m_ComponentType = INT; + m_ComponentType = itk::IOComponentEnum::INT; } else if( s_type== "U32" ) { - m_ComponentType = UINT; + m_ComponentType = itk::IOComponentEnum::UINT; } else if( s_type== "F32" || s_type=="FLOAT") { - m_ComponentType = FLOAT; + m_ComponentType = itk::IOComponentEnum::FLOAT; } else if( s_type== "F64" || s_type=="DOUBLE") { - m_ComponentType = DOUBLE; + m_ComponentType = itk::IOComponentEnum::DOUBLE; } else { @@ -261,7 +261,7 @@ namespace itk { // assuming it's LittleEndian //throw itk::ExceptionObject(__FILE__,__LINE__,"Error: Cannot find keyword \"-bo\"."); - m_ByteOrder = LittleEndian; + m_ByteOrder = itk::IOByteOrderEnum::LittleEndian; } else { @@ -269,11 +269,11 @@ namespace itk ifs >> s_byteorder; if( s_byteorder == "DCBA" ) { - m_ByteOrder = LittleEndian; + m_ByteOrder = itk::IOByteOrderEnum::LittleEndian; } else { - m_ByteOrder = BigEndian; + m_ByteOrder = itk::IOByteOrderEnum::BigEndian; } ifs >> junk; } @@ -412,7 +412,7 @@ namespace itk } - if( this->GetNumberOfDimensions()==3 && this->GetPixelType()==SCALAR) + if( this->GetNumberOfDimensions()==3 && this->GetPixelType()== itk::IOPixelEnum::SCALAR) { for( int i=0; i<3; i++ ) { @@ -420,7 +420,7 @@ namespace itk } ofs << "1\n"; } - else if (this->GetNumberOfDimensions()==3 && this->GetPixelType()==VECTOR ) + else if (this->GetNumberOfDimensions()==3 && this->GetPixelType()== itk::IOPixelEnum::VECTOR ) { for( int i=0; i<3; i++ ) { @@ -447,28 +447,28 @@ namespace itk ofs << "-type "; switch (m_ComponentType ) { - case CHAR: + case itk::IOComponentEnum::CHAR: ofs << "S8\n"; break; - case UCHAR: + case itk::IOComponentEnum::UCHAR: ofs << "U8\n"; break; - case SHORT: + case itk::IOComponentEnum::SHORT: ofs << "S16\n"; break; - case USHORT: + case itk::IOComponentEnum::USHORT: ofs << "U16\n"; break; - case INT: + case itk::IOComponentEnum::INT: ofs << "S32\n"; break; - case UINT: + case itk::IOComponentEnum::UINT: ofs << "U32\n"; break; - case FLOAT: + case itk::IOComponentEnum::FLOAT: ofs << "FLOAT\n"; break; - case DOUBLE: + case itk::IOComponentEnum::DOUBLE: ofs << "DOUBLE\n"; break; default: @@ -492,7 +492,7 @@ namespace itk // byte order - if( m_ByteOrder == LittleEndian ) + if( m_ByteOrder == itk::IOByteOrderEnum::LittleEndian ) { ofs << "-bo DCBA\n"; } @@ -519,19 +519,19 @@ namespace itk } - if ( m_PixelType != SCALAR && m_PixelType != VECTOR) + if ( m_PixelType != itk::IOPixelEnum::SCALAR && m_PixelType != itk::IOPixelEnum::VECTOR) { throw ExceptionObject (__FILE__,__LINE__,"Error: GIS only supports SCALAR and VECTOR images."); } - if (m_ComponentType != CHAR && - m_ComponentType != UCHAR && - m_ComponentType != SHORT && - m_ComponentType != USHORT && - m_ComponentType != INT && - m_ComponentType != UINT && - m_ComponentType != FLOAT && - m_ComponentType != DOUBLE) + if (m_ComponentType != itk::IOComponentEnum::CHAR && + m_ComponentType != itk::IOComponentEnum::UCHAR && + m_ComponentType != itk::IOComponentEnum::SHORT && + m_ComponentType != itk::IOComponentEnum::USHORT && + m_ComponentType != itk::IOComponentEnum::INT && + m_ComponentType != itk::IOComponentEnum::UINT && + m_ComponentType != itk::IOComponentEnum::FLOAT && + m_ComponentType != itk::IOComponentEnum::DOUBLE) { throw ExceptionObject (__FILE__,__LINE__,"Error: Pixel type is not supported by GIS format yet."); } @@ -565,7 +565,7 @@ namespace itk const unsigned long numberOfComponents = static_cast<unsigned long>( this->GetImageSizeInComponents() ); // Swap bytes if necessary - if ( m_ByteOrder == LittleEndian ) + if ( m_ByteOrder == itk::IOByteOrderEnum::LittleEndian ) { char * tempBuffer = new char[ numberOfBytes ]; memcpy( tempBuffer, buffer , numberOfBytes ); @@ -593,82 +593,82 @@ namespace itk { switch(m_ComponentType) { - case CHAR: + case itk::IOComponentEnum::CHAR: { - if ( m_ByteOrder == LittleEndian ) + if ( m_ByteOrder == itk::IOByteOrderEnum::LittleEndian ) { ByteSwapper<char>::SwapRangeFromSystemToLittleEndian((char*)buffer, numberOfPixels ); } - else if ( m_ByteOrder == BigEndian ) + else if ( m_ByteOrder == itk::IOByteOrderEnum::BigEndian ) { ByteSwapper<char>::SwapRangeFromSystemToBigEndian((char *)buffer, numberOfPixels ); } break; } - case UCHAR: + case itk::IOComponentEnum::UCHAR: { - if ( m_ByteOrder == LittleEndian ) + if ( m_ByteOrder == itk::IOByteOrderEnum::LittleEndian ) { ByteSwapper<unsigned char>::SwapRangeFromSystemToLittleEndian( (unsigned char*)buffer, numberOfPixels ); } - else if ( m_ByteOrder == BigEndian ) + else if ( m_ByteOrder == itk::IOByteOrderEnum::BigEndian ) { ByteSwapper<unsigned char>::SwapRangeFromSystemToBigEndian( (unsigned char *)buffer, numberOfPixels ); } break; } - case SHORT: + case itk::IOComponentEnum::SHORT: { - if ( m_ByteOrder == LittleEndian ) + if ( m_ByteOrder == itk::IOByteOrderEnum::LittleEndian ) { ByteSwapper<short>::SwapRangeFromSystemToLittleEndian( (short*)buffer, numberOfPixels ); } - else if ( m_ByteOrder == BigEndian ) + else if ( m_ByteOrder == itk::IOByteOrderEnum::BigEndian ) { ByteSwapper<short>::SwapRangeFromSystemToBigEndian( (short *)buffer, numberOfPixels ); } break; } - case USHORT: + case itk::IOComponentEnum::USHORT: { - if ( m_ByteOrder == LittleEndian ) + if ( m_ByteOrder == itk::IOByteOrderEnum::LittleEndian ) { ByteSwapper<unsigned short>::SwapRangeFromSystemToLittleEndian( (unsigned short*)buffer, numberOfPixels ); } - else if ( m_ByteOrder == BigEndian ) + else if ( m_ByteOrder == itk::IOByteOrderEnum::BigEndian ) { ByteSwapper<unsigned short>::SwapRangeFromSystemToBigEndian( (unsigned short *)buffer, numberOfPixels ); } break; } - case INT: + case itk::IOComponentEnum::INT: { - if ( m_ByteOrder == LittleEndian ) + if ( m_ByteOrder == itk::IOByteOrderEnum::LittleEndian ) { ByteSwapper<int>::SwapRangeFromSystemToLittleEndian( (int*)buffer, numberOfPixels ); } - else if ( m_ByteOrder == BigEndian ) + else if ( m_ByteOrder == itk::IOByteOrderEnum::BigEndian ) { ByteSwapper<int>::SwapRangeFromSystemToBigEndian( (int*)buffer, numberOfPixels ); } break; } - case UINT: + case itk::IOComponentEnum::UINT: { - if ( m_ByteOrder == LittleEndian ) + if ( m_ByteOrder == itk::IOByteOrderEnum::LittleEndian ) { ByteSwapper<unsigned int>::SwapRangeFromSystemToLittleEndian( (unsigned int*)buffer, numberOfPixels ); } - else if ( m_ByteOrder == BigEndian ) + else if ( m_ByteOrder == itk::IOByteOrderEnum::BigEndian ) { ByteSwapper<unsigned int>::SwapRangeFromSystemToBigEndian( (unsigned int *)buffer, numberOfPixels ); @@ -676,28 +676,28 @@ namespace itk break; } - case FLOAT: + case itk::IOComponentEnum::FLOAT: { - if ( m_ByteOrder == LittleEndian ) + if ( m_ByteOrder == itk::IOByteOrderEnum::LittleEndian ) { ByteSwapper<float>::SwapRangeFromSystemToLittleEndian( (float*)buffer, numberOfPixels ); } - else if ( m_ByteOrder == BigEndian ) + else if ( m_ByteOrder == itk::IOByteOrderEnum::BigEndian ) { ByteSwapper<float>::SwapRangeFromSystemToBigEndian( (float *)buffer, numberOfPixels ); } break; } - case DOUBLE: + case itk::IOComponentEnum::DOUBLE: { - if ( m_ByteOrder == LittleEndian ) + if ( m_ByteOrder == itk::IOByteOrderEnum::LittleEndian ) { ByteSwapper<double>::SwapRangeFromSystemToLittleEndian( (double*)buffer, numberOfPixels ); } - else if ( m_ByteOrder == BigEndian ) + else if ( m_ByteOrder == itk::IOByteOrderEnum::BigEndian ) { ByteSwapper<double>::SwapRangeFromSystemToBigEndian( (double *)buffer, numberOfPixels ); diff --git a/src/layers/legacy/medImageIO/itkMultiThreadedImageIOBase.cpp b/src/layers/legacy/medImageIO/itkMultiThreadedImageIOBase.cpp index 37e278c109..7fb5735011 100644 --- a/src/layers/legacy/medImageIO/itkMultiThreadedImageIOBase.cpp +++ b/src/layers/legacy/medImageIO/itkMultiThreadedImageIOBase.cpp @@ -18,7 +18,8 @@ namespace itk { - + itkEventMacroDefinition(SliceReadEvent, itk::AnyEvent); + MultiThreadedImageIOBase::MultiThreadedImageIOBase() : m_NumberOfThreads(0) { diff --git a/src/layers/legacy/medImageIO/itkMultiThreadedImageIOBase.h b/src/layers/legacy/medImageIO/itkMultiThreadedImageIOBase.h index 2b67e700b6..c2be7ffb9e 100644 --- a/src/layers/legacy/medImageIO/itkMultiThreadedImageIOBase.h +++ b/src/layers/legacy/medImageIO/itkMultiThreadedImageIOBase.h @@ -78,5 +78,5 @@ namespace itk }; - itkEventMacro (SliceReadEvent, AnyEvent) + itkEventMacroDeclaration(SliceReadEvent, itk::AnyEvent); } // end of namespace diff --git a/src/layers/legacy/medImageIO/medInrimageImageIO.cpp b/src/layers/legacy/medImageIO/medInrimageImageIO.cpp index ad332e19f9..e8f433d8d4 100644 --- a/src/layers/legacy/medImageIO/medInrimageImageIO.cpp +++ b/src/layers/legacy/medImageIO/medInrimageImageIO.cpp @@ -13,7 +13,7 @@ =========================================================================*/ #include "medInrimageImageIO.h" -#include <itkExceptionObject.h> +#include <itkMacro.h> #include <itkByteSwapper.h> #include <itkImageIOBase.h> @@ -136,13 +136,13 @@ InrimageImageIO::InrimageImageIO() // pixel type is UCHAR // m_PixelType is a protected member of ImageIOBase (IODataType itk::ImageIOBase::m_PixelType) - this->SetPixelType(SCALAR); + this->SetPixelType(itk::IOPixelEnum::SCALAR); this->SetNumberOfComponents(1); - this->SetComponentType(DOUBLE); + this->SetComponentType(itk::IOComponentEnum::DOUBLE); // Byte order - this->SetByteOrder((itk::ByteSwapper<int>::SystemIsBigEndian() == true) ? BigEndian : LittleEndian); + this->SetByteOrder((itk::ByteSwapper<int>::SystemIsBigEndian() == true) ? itk::IOByteOrderEnum::BigEndian : itk::IOByteOrderEnum::LittleEndian); // additionnal information // (inrimage only) @@ -171,30 +171,30 @@ void InrimageImageIO::PrintSelf(std::ostream& os, itk::Indent indent) const os << indent << "PixelType " << m_PixelType << std::endl; } -const std::type_info& InrimageImageIO::ConvertToTypeInfo(IOPixelType t) const +const std::type_info& InrimageImageIO::ConvertToTypeInfo(itk::IOComponentEnum t) const { switch (t) { - case UCHAR: + case itk::IOComponentEnum::UCHAR: return typeid(unsigned char); - case CHAR: + case itk::IOComponentEnum::CHAR: return typeid(char); - case USHORT: + case itk::IOComponentEnum::USHORT: return typeid(unsigned short); - case SHORT: + case itk::IOComponentEnum::SHORT: return typeid(short); - case UINT: + case itk::IOComponentEnum::UINT: return typeid(unsigned int); - case INT: + case itk::IOComponentEnum::INT: return typeid(int); - case ULONG: + case itk::IOComponentEnum::ULONG: return typeid(unsigned long); - case LONG: + case itk::IOComponentEnum::LONG: return typeid(long); - case FLOAT: + case itk::IOComponentEnum::FLOAT: return typeid(float); - case DOUBLE: + case itk::IOComponentEnum::DOUBLE: return typeid(double); /*case RGB: return typeid(RGBPixel<unsigned char>); @@ -204,7 +204,7 @@ const std::type_info& InrimageImageIO::ConvertToTypeInfo(IOPixelType t) const default: itkExceptionMacro("Invalid type: " << m_PixelType); } - return typeid(ImageIOBase::UNKNOWNPIXELTYPE); + return typeid(itk::IOComponentEnum::UNKNOWNCOMPONENTTYPE); } @@ -653,10 +653,10 @@ void InrimageImageIO::ReadImageInformation() } if (std::string(type, 0, strlen("unsigned")).compare("unsigned") == 0) { - if (pixsize == 8) this->SetComponentType(UCHAR); - else if (pixsize == 16) this->SetComponentType(USHORT); - else if (pixsize == 32) this->SetComponentType(UINT); - else if (pixsize == 64) this->SetComponentType(ULONG); + if (pixsize == 8) this->SetComponentType(itk::IOComponentEnum::UCHAR); + else if (pixsize == 16) this->SetComponentType(itk::IOComponentEnum::USHORT); + else if (pixsize == 32) this->SetComponentType(itk::IOComponentEnum::UINT); + else if (pixsize == 64) this->SetComponentType(itk::IOComponentEnum::ULONG); else { itk::ExceptionObject exception(__FILE__, __LINE__); exception.SetDescription("Pixel Size Not Recognized"); @@ -664,10 +664,10 @@ void InrimageImageIO::ReadImageInformation() } } else if (std::string(type, 0, strlen("signed")).compare("signed") == 0) { - if (pixsize == 8) this->SetComponentType(CHAR); - else if (pixsize == 16) this->SetComponentType(SHORT); - else if (pixsize == 32) this->SetComponentType(INT); - else if (pixsize == 64) this->SetComponentType(LONG); + if (pixsize == 8) this->SetComponentType(itk::IOComponentEnum::CHAR); + else if (pixsize == 16) this->SetComponentType(itk::IOComponentEnum::SHORT); + else if (pixsize == 32) this->SetComponentType(itk::IOComponentEnum::INT); + else if (pixsize == 64) this->SetComponentType(itk::IOComponentEnum::LONG); else { itk::ExceptionObject exception(__FILE__, __LINE__); exception.SetDescription("Pixel Size Not Recognized"); @@ -675,8 +675,8 @@ void InrimageImageIO::ReadImageInformation() } } else if (std::string(type, 0, strlen("float")).compare("float") == 0) { - if (pixsize == 32) this->SetComponentType(FLOAT); - else if (pixsize == 64) this->SetComponentType(DOUBLE); + if (pixsize == 32) this->SetComponentType(itk::IOComponentEnum::FLOAT); + else if (pixsize == 64) this->SetComponentType(itk::IOComponentEnum::DOUBLE); else { itk::ExceptionObject exception(__FILE__, __LINE__); exception.SetDescription("Pixel Size Not Recognized"); @@ -684,7 +684,7 @@ void InrimageImageIO::ReadImageInformation() } } - this->SetPixelType(SCALAR); + this->SetPixelType(itk::IOPixelEnum::SCALAR); if (0) { std::cout << "type " << type << std::endl; @@ -712,8 +712,8 @@ void InrimageImageIO::ReadImageInformation() switch (this->GetComponentType()) { default: break; - case UCHAR: - this->SetPixelType(RGB); + case itk::IOComponentEnum::UCHAR: + this->SetPixelType(itk::IOPixelEnum::RGB); this->SetNumberOfComponents(1); break; } @@ -722,8 +722,8 @@ void InrimageImageIO::ReadImageInformation() switch (this->GetComponentType()) { default: break; - case UCHAR: - this->SetPixelType(RGBA); + case itk::IOComponentEnum::UCHAR: + this->SetPixelType(itk::IOPixelEnum::RGBA); this->SetNumberOfComponents(1); break; } @@ -839,24 +839,24 @@ ::Write(const void* buffer) char scale[20]; switch (this->GetComponentType()) { - case UCHAR: - case USHORT: - case UINT: - case ULONG: + case itk::IOComponentEnum::UCHAR: + case itk::IOComponentEnum::USHORT: + case itk::IOComponentEnum::UINT: + case itk::IOComponentEnum::ULONG: type = "unsigned fixed"; sprintf(scale, "SCALE=2**0\n"); break; - case CHAR: - case SHORT: - case INT: - case LONG: + case itk::IOComponentEnum::CHAR: + case itk::IOComponentEnum::SHORT: + case itk::IOComponentEnum::INT: + case itk::IOComponentEnum::LONG: type = "signed fixed"; sprintf(scale, "SCALE=2**0\n"); break; - case FLOAT: - case DOUBLE: + case itk::IOComponentEnum::FLOAT: + case itk::IOComponentEnum::DOUBLE: type = "float"; scale[0] = '\0'; break; @@ -869,25 +869,25 @@ ::Write(const void* buffer) int pixsize = 8; switch (this->GetComponentType()) { - case UCHAR: - case CHAR: + case itk::IOComponentEnum::UCHAR: + case itk::IOComponentEnum::CHAR: pixsize = 8; break; - case USHORT: - case SHORT: + case itk::IOComponentEnum::USHORT: + case itk::IOComponentEnum::SHORT: pixsize = 16; break; - case UINT: - case INT: - case FLOAT: + case itk::IOComponentEnum::UINT: + case itk::IOComponentEnum::INT: + case itk::IOComponentEnum::FLOAT: pixsize = 32; break; - case ULONG: - case LONG: - case DOUBLE: + case itk::IOComponentEnum::ULONG: + case itk::IOComponentEnum::LONG: + case itk::IOComponentEnum::DOUBLE: pixsize = 64; break; @@ -897,7 +897,7 @@ ::Write(const void* buffer) } std::string endianness; - if (this->GetByteOrder() == LittleEndian) + if (this->GetByteOrder() == itk::IOByteOrderEnum::LittleEndian) endianness = "decm"; else endianness = "sun"; @@ -1043,47 +1043,47 @@ ::Write(const void* buffer) void InrimageImageIO::SwapBytesIfNecessary(void* buffer, unsigned long numberOfPixels) { - if (ImageIOBase::GetByteOrder() == LittleEndian) + if (ImageIOBase::GetByteOrder() == itk::IOByteOrderEnum::LittleEndian) { - switch (m_PixelType) + switch (m_ComponentType) { - case CHAR: + case itk::IOComponentEnum::CHAR: itk::ByteSwapper<char>::SwapRangeFromSystemToLittleEndian((char*)buffer, numberOfPixels); break; - case UCHAR: + case itk::IOComponentEnum::UCHAR: itk::ByteSwapper<unsigned char>::SwapRangeFromSystemToLittleEndian ((unsigned char*)buffer, numberOfPixels); break; - case SHORT: + case itk::IOComponentEnum::SHORT: itk::ByteSwapper<short>::SwapRangeFromSystemToLittleEndian ((short*)buffer, numberOfPixels); break; - case USHORT: + case itk::IOComponentEnum::USHORT: itk::ByteSwapper<unsigned short>::SwapRangeFromSystemToLittleEndian ((unsigned short*)buffer, numberOfPixels); break; - case INT: + case itk::IOComponentEnum::INT: itk::ByteSwapper<int>::SwapRangeFromSystemToLittleEndian ((int*)buffer, numberOfPixels); break; - case UINT: + case itk::IOComponentEnum::UINT: itk::ByteSwapper<unsigned int>::SwapRangeFromSystemToLittleEndian ((unsigned int*)buffer, numberOfPixels); break; - case LONG: + case itk::IOComponentEnum::LONG: itk::ByteSwapper<long>::SwapRangeFromSystemToLittleEndian ((long*)buffer, numberOfPixels); break; - case ULONG: + case itk::IOComponentEnum::ULONG: itk::ByteSwapper<unsigned long>::SwapRangeFromSystemToLittleEndian ((unsigned long*)buffer, numberOfPixels); break; - case FLOAT: + case itk::IOComponentEnum::FLOAT: itk::ByteSwapper<float>::SwapRangeFromSystemToLittleEndian((float*)buffer, numberOfPixels); break; - case DOUBLE: + case itk::IOComponentEnum::DOUBLE: itk::ByteSwapper<double>::SwapRangeFromSystemToLittleEndian ((double*)buffer, numberOfPixels); break; @@ -1095,45 +1095,45 @@ void InrimageImageIO::SwapBytesIfNecessary(void* buffer, unsigned long numberOfP } else { - switch (m_PixelType) + switch (m_ComponentType) { - case CHAR: + case itk::IOComponentEnum::CHAR: itk::ByteSwapper<char>::SwapRangeFromSystemToBigEndian((char *)buffer, numberOfPixels); break; - case UCHAR: + case itk::IOComponentEnum::UCHAR: itk::ByteSwapper<unsigned char>::SwapRangeFromSystemToBigEndian ((unsigned char *)buffer, numberOfPixels); break; - case SHORT: + case itk::IOComponentEnum::SHORT: itk::ByteSwapper<short>::SwapRangeFromSystemToBigEndian ((short *)buffer, numberOfPixels); break; - case USHORT: + case itk::IOComponentEnum::USHORT: itk::ByteSwapper<unsigned short>::SwapRangeFromSystemToBigEndian ((unsigned short *)buffer, numberOfPixels); break; - case INT: + case itk::IOComponentEnum::INT: itk::ByteSwapper<int>::SwapRangeFromSystemToBigEndian ((int *)buffer, numberOfPixels); break; - case UINT: + case itk::IOComponentEnum::UINT: itk::ByteSwapper<unsigned int>::SwapRangeFromSystemToBigEndian ((unsigned int *)buffer, numberOfPixels); break; - case LONG: + case itk::IOComponentEnum::LONG: itk::ByteSwapper<long>::SwapRangeFromSystemToBigEndian ((long *)buffer, numberOfPixels); break; - case ULONG: + case itk::IOComponentEnum::ULONG: itk::ByteSwapper<unsigned long>::SwapRangeFromSystemToBigEndian ((unsigned long *)buffer, numberOfPixels); break; - case FLOAT: + case itk::IOComponentEnum::FLOAT: itk::ByteSwapper<float>::SwapRangeFromSystemToBigEndian ((float *)buffer, numberOfPixels); break; - case DOUBLE: + case itk::IOComponentEnum::DOUBLE: itk::ByteSwapper<double>::SwapRangeFromSystemToBigEndian ((double *)buffer, numberOfPixels); break; diff --git a/src/layers/legacy/medImageIO/medInrimageImageIO.h b/src/layers/legacy/medImageIO/medInrimageImageIO.h index 58eddcc08c..f6d3e2965a 100644 --- a/src/layers/legacy/medImageIO/medInrimageImageIO.h +++ b/src/layers/legacy/medImageIO/medInrimageImageIO.h @@ -71,7 +71,7 @@ class MEDIMAGEIO_EXPORT InrimageImageIO : public itk::ImageIOBase virtual void ReadImageInformation(); /** Convert to type_info */ - const std::type_info& ConvertToTypeInfo(IOPixelType) const; + const std::type_info& ConvertToTypeInfo(itk::IOComponentEnum) const; /** Reads the data from disk into the memory buffer provided. */ virtual void Read(void* buffer); diff --git a/src/layers/legacy/medUtilities/CMakeLists.txt b/src/layers/legacy/medUtilities/CMakeLists.txt index 854243aad9..61d4ee6bb7 100644 --- a/src/layers/legacy/medUtilities/CMakeLists.txt +++ b/src/layers/legacy/medUtilities/CMakeLists.txt @@ -25,7 +25,7 @@ include_directories(${dtk_INCLUDE_DIRS}) find_package(VTK REQUIRED COMPONENTS vtkInteractionWidgets ) include(${VTK_USE_FILE}) -find_package(ITK REQUIRED COMPONENTS ITKCommon ITKIOGDCM ITKThresholding) +find_package(ITK REQUIRED COMPONENTS ITKCommon ITKGDCM ITKIOGDCM ITKThresholding) include(${ITK_USE_FILE}) if (ITK_USE_SYSTEM_GDCM) diff --git a/src/plugins/legacy/LCCLogDemons/CMakeLists.txt b/src/plugins/legacy/LCCLogDemons/CMakeLists.txt index f9fda1b3ea..59c8a0373d 100644 --- a/src/plugins/legacy/LCCLogDemons/CMakeLists.txt +++ b/src/plugins/legacy/LCCLogDemons/CMakeLists.txt @@ -98,6 +98,7 @@ SET(ITKIO_LIBRARIES target_link_libraries(${TARGET_NAME} ${ITKIO_LIBRARIES} + ITKPDEDeformableRegistration Qt5::Core dtkLog dtkCoreSupport diff --git a/src/plugins/legacy/LCCLogDemons/LCCLogDemons.cpp b/src/plugins/legacy/LCCLogDemons/LCCLogDemons.cpp index cf065add03..713e642cc9 100644 --- a/src/plugins/legacy/LCCLogDemons/LCCLogDemons.cpp +++ b/src/plugins/legacy/LCCLogDemons/LCCLogDemons.cpp @@ -19,7 +19,6 @@ // ///////////////////////////////////////////////////////////////// #include <itkImageRegistrationMethod.h> - #include <itkImage.h> #include <itkResampleImageFilter.h> #include <itkCastImageFilter.h> @@ -167,17 +166,24 @@ QString LCCLogDemons::description() const template <typename PixelType> int LCCLogDemonsPrivate::update() { - int testResult = proc->testInputs(); - if (testResult != medAbstractProcessLegacy::SUCCESS) - { - return testResult; - } - + RegImageType *inputFixed = static_cast<RegImageType*>(proc->fixedImage().GetPointer()); + RegImageType *inputMoving = static_cast<RegImageType*>(proc->movingImages()[0].GetPointer()); + + // Cast spacing, origin, direction and size from the moving data to the fixed one + typedef itk::ResampleImageFilter<RegImageType, RegImageType> ResampleFilterType; + typename ResampleFilterType::Pointer resampleFilter = ResampleFilterType::New(); + resampleFilter->SetOutputSpacing(inputFixed->GetSpacing()); + resampleFilter->SetOutputOrigin(inputFixed->GetOrigin()); + resampleFilter->SetOutputDirection(inputFixed->GetDirection()); + resampleFilter->SetSize(inputFixed->GetLargestPossibleRegion().GetSize()); + resampleFilter->SetInput(inputMoving); + resampleFilter->Update(); + inputMoving = resampleFilter->GetOutput(); + + // Register the fixed and moving data registrationMethod = new rpi::LCClogDemons<RegImageType,RegImageType,double> (); - - registrationMethod->SetFixedImage((const RegImageType*) proc->fixedImage().GetPointer()); - registrationMethod->SetMovingImage((const RegImageType*) proc->movingImages()[0].GetPointer()); - + registrationMethod->SetFixedImage(inputFixed); + registrationMethod->SetMovingImage(inputMoving); registrationMethod->SetUpdateRule(updateRule); registrationMethod->SetVerbosity(verbose); @@ -219,12 +225,8 @@ int LCCLogDemonsPrivate::update() typedef itk::ResampleImageFilter< RegImageType,RegImageType, double> ResampleFilterType; typename ResampleFilterType::Pointer resampler = ResampleFilterType::New(); resampler->SetTransform(registrationMethod->GetDisplacementFieldTransformation()); - resampler->SetInput((const RegImageType*)proc->movingImages()[0].GetPointer()); - resampler->SetSize( proc->fixedImage()->GetLargestPossibleRegion().GetSize() ); - resampler->SetOutputOrigin( proc->fixedImage()->GetOrigin() ); - resampler->SetOutputSpacing( proc->fixedImage()->GetSpacing() ); - resampler->SetOutputDirection( proc->fixedImage()->GetDirection() ); - resampler->SetDefaultPixelValue( 0 ); + resampler->SetInput(inputMoving); + resampler->SetDefaultPixelValue(0); // Set the image interpolator switch(interpolatorType) @@ -266,31 +268,11 @@ int LCCLogDemonsPrivate::update() qDebug() << "ExceptionObject caught (resampler): " << err.GetDescription(); return medAbstractProcessLegacy::FAILURE; } - - itk::ImageBase<3>::Pointer result = resampler->GetOutput(); - result->DisconnectPipeline(); - - if (proc->output()) - { - proc->output()->setData (result); - } - return medAbstractProcessLegacy::SUCCESS; -} -medAbstractProcessLegacy::DataError LCCLogDemons::testInputs() -{ - if (d->proc->fixedImage()->GetLargestPossibleRegion().GetSize() - != d->proc->movingImages()[0]->GetLargestPossibleRegion().GetSize()) - { - return medAbstractProcessLegacy::MISMATCHED_DATA_SIZE; - } - - if (d->proc->fixedImage()->GetSpacing() - != d->proc->movingImages()[0]->GetSpacing()) + if (proc->output()) { - return medAbstractProcessLegacy::MISMATCHED_DATA_SPACING; + proc->output()->setData(resampler->GetOutput()); } - return medAbstractProcessLegacy::SUCCESS; } diff --git a/src/plugins/legacy/LCCLogDemons/LCCLogDemons.h b/src/plugins/legacy/LCCLogDemons/LCCLogDemons.h index 67314feae1..e608a34504 100644 --- a/src/plugins/legacy/LCCLogDemons/LCCLogDemons.h +++ b/src/plugins/legacy/LCCLogDemons/LCCLogDemons.h @@ -69,11 +69,6 @@ class LCCLogDemonsPLUGIN_EXPORT LCCLogDemons : public itkProcessRegistration */ virtual QString getTitleAndParameters(); - /** - * @brief testInputs() tests origin, dimension and spacing of the input - * @return medAbstractProcess::DataError according to the test result - */ - medAbstractProcessLegacy::DataError testInputs(); protected : /** * @brief diff --git a/src/plugins/legacy/LCCLogDemons/LCCLogDemonsToolBox.cpp b/src/plugins/legacy/LCCLogDemons/LCCLogDemonsToolBox.cpp index d0494cbff1..882178bc04 100644 --- a/src/plugins/legacy/LCCLogDemons/LCCLogDemonsToolBox.cpp +++ b/src/plugins/legacy/LCCLogDemons/LCCLogDemonsToolBox.cpp @@ -53,15 +53,8 @@ class LCCLogDemonsToolBoxPrivate LCCLogDemonsToolBox::LCCLogDemonsToolBox(QWidget *parent) : medAbstractSelectableToolBox(parent), d(new LCCLogDemonsToolBoxPrivate) { QWidget *widget = new QWidget(this); - QVBoxLayout * layout = new QVBoxLayout(); - QLabel *explanation = new QLabel("Drop 2 datasets with same size and spacing.\n"); - explanation->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Preferred); - explanation->setWordWrap(true); - explanation->setStyleSheet("font: italic"); - layout->addWidget(explanation); - // Standard parameters d->iterationsLine = new QLineEdit(); d->iterationsLine->setText("15x10x5"); diff --git a/src/plugins/legacy/diffeomorphicDemons/CMakeLists.txt b/src/plugins/legacy/diffeomorphicDemons/CMakeLists.txt index cb9ca6a237..698e4c4598 100644 --- a/src/plugins/legacy/diffeomorphicDemons/CMakeLists.txt +++ b/src/plugins/legacy/diffeomorphicDemons/CMakeLists.txt @@ -88,6 +88,7 @@ target_link_libraries(${TARGET_NAME} dtkCore dtkLog ITKCommon + ITKPDEDeformableRegistration medCore medRegistration ) diff --git a/src/plugins/legacy/diffeomorphicDemons/diffeomorphicDemons.cpp b/src/plugins/legacy/diffeomorphicDemons/diffeomorphicDemons.cpp index 953315b849..756df42df1 100644 --- a/src/plugins/legacy/diffeomorphicDemons/diffeomorphicDemons.cpp +++ b/src/plugins/legacy/diffeomorphicDemons/diffeomorphicDemons.cpp @@ -15,7 +15,7 @@ #include <dtkCoreSupport/dtkAbstractProcessFactory.h> #include <DiffeomorphicDemons/rpiDiffeomorphicDemons.hxx> -#include <itkChangeInformationImageFilter.h> +#include <itkResampleImageFilter.h> #include <rpiCommonTools.hxx> // ///////////////////////////////////////////////////////////////// @@ -93,33 +93,29 @@ int diffeomorphicDemonsPrivate::update() { typedef itk::Image< PixelType, 3 > FixedImageType; typedef itk::Image< PixelType, 3 > MovingImageType; - typedef itk::Image< float, 3 > RegImageType; typedef double TransformScalarType; - int testResult = proc->testInputs(); - if (testResult != medAbstractProcessLegacy::SUCCESS) - { - return testResult; - } - - FixedImageType *inputFixed = (FixedImageType*) proc->fixedImage().GetPointer(); - MovingImageType *inputMoving = (MovingImageType*) proc->movingImages()[0].GetPointer(); - - // The output volume is going to located at the origin/direction of the fixed input. Needed for rpi::DiffeomorphicDemons - typedef itk::ChangeInformationImageFilter< FixedImageType > FilterType; - typename FilterType::Pointer filter = FilterType::New(); - filter->SetOutputOrigin(inputFixed->GetOrigin()); - filter->ChangeOriginOn(); - filter->SetOutputDirection(inputFixed->GetDirection()); - filter->ChangeDirectionOn(); - filter->SetInput(inputMoving); - + FixedImageType *inputFixed = static_cast<FixedImageType*>(proc->fixedImage().GetPointer()); + MovingImageType *inputMoving = static_cast<MovingImageType*>(proc->movingImages()[0].GetPointer()); + + // Cast spacing, origin, direction and size from the moving data to the fixed one + typedef itk::ResampleImageFilter<MovingImageType, MovingImageType> ResampleFilterType; + typename ResampleFilterType::Pointer resampleFilter = ResampleFilterType::New(); + resampleFilter->SetOutputSpacing(inputFixed->GetSpacing()); + resampleFilter->SetOutputOrigin(inputFixed->GetOrigin()); + resampleFilter->SetOutputDirection(inputFixed->GetDirection()); + resampleFilter->SetSize(inputFixed->GetLargestPossibleRegion().GetSize()); + resampleFilter->SetInput(inputMoving); + resampleFilter->Update(); + inputMoving = resampleFilter->GetOutput(); + + // Register the fixed and moving data typedef rpi::DiffeomorphicDemons< RegImageType, RegImageType, TransformScalarType > RegistrationType; RegistrationType *registration = new RegistrationType; registrationMethod = registration; registration->SetFixedImage(inputFixed); - registration->SetMovingImage(filter->GetOutput()); + registration->SetMovingImage(inputMoving); registration->SetNumberOfIterations(iterations); registration->SetMaximumUpdateStepLength(maximumUpdateStepLength); registration->SetUpdateFieldStandardDeviation(updateFieldStandardDeviation); @@ -160,7 +156,6 @@ int diffeomorphicDemonsPrivate::update() // Print method parameters QString methodParameters = proc->getTitleAndParameters(); - qDebug() << "METHOD PARAMETERS"; qDebug() << methodParameters; @@ -181,19 +176,15 @@ int diffeomorphicDemonsPrivate::update() emit proc->progressed(80); - typedef itk::ResampleImageFilter< MovingImageType,MovingImageType,TransformScalarType > ResampleFilterType; - typename ResampleFilterType::Pointer resampler = ResampleFilterType::New(); - resampler->SetTransform(registration->GetTransformation()); - resampler->SetInput((const MovingImageType*) inputMoving); - resampler->SetSize( proc->fixedImage()->GetLargestPossibleRegion().GetSize() ); - resampler->SetOutputOrigin( proc->fixedImage()->GetOrigin() ); - resampler->SetOutputSpacing( proc->fixedImage()->GetSpacing() ); - resampler->SetOutputDirection( proc->fixedImage()->GetDirection() ); - resampler->SetDefaultPixelValue( 0 ); - + // Cast new transformation + typedef itk::ResampleImageFilter< MovingImageType,MovingImageType,TransformScalarType > ResampleTransformation; + typename ResampleTransformation::Pointer resampleTransformation = ResampleTransformation::New(); + resampleTransformation->SetTransform(registration->GetTransformation()); + resampleTransformation->SetInput(inputMoving); + resampleTransformation->SetDefaultPixelValue(0); try { - resampler->Update(); + resampleTransformation->Update(); } catch (itk::ExceptionObject & err) { @@ -201,33 +192,13 @@ int diffeomorphicDemonsPrivate::update() return medAbstractProcessLegacy::FAILURE; } - itk::ImageBase<3>::Pointer result = resampler->GetOutput(); - result->DisconnectPipeline(); - if (proc->output()) { - proc->output()->setData (result); + proc->output()->setData(resampleTransformation->GetOutput()); } return medAbstractProcessLegacy::SUCCESS; } -medAbstractProcessLegacy::DataError diffeomorphicDemons::testInputs() -{ - if (d->proc->fixedImage()->GetLargestPossibleRegion().GetSize() - != d->proc->movingImages()[0]->GetLargestPossibleRegion().GetSize()) - { - return medAbstractProcessLegacy::MISMATCHED_DATA_SIZE; - } - - if (d->proc->fixedImage()->GetSpacing() - != d->proc->movingImages()[0]->GetSpacing()) - { - return medAbstractProcessLegacy::MISMATCHED_DATA_SPACING; - } - - return medAbstractProcessLegacy::SUCCESS; -} - int diffeomorphicDemons::update(itkProcessRegistration::ImageType imgType) { // Cast has been done in itkProcessRegistration diff --git a/src/plugins/legacy/diffeomorphicDemons/diffeomorphicDemons.h b/src/plugins/legacy/diffeomorphicDemons/diffeomorphicDemons.h index 14da0f132f..79f44ae1f6 100644 --- a/src/plugins/legacy/diffeomorphicDemons/diffeomorphicDemons.h +++ b/src/plugins/legacy/diffeomorphicDemons/diffeomorphicDemons.h @@ -138,12 +138,6 @@ class DIFFEOMORPHICDEMONSPLUGIN_EXPORT diffeomorphicDemons : public itkProcessRe */ virtual QString getTitleAndParameters(); - /** - * @brief testInputs() tests origin, dimension and spacing of the input - * @return medAbstractProcess::DataError according to the test result - */ - medAbstractProcessLegacy::DataError testInputs(); - protected : /** * @brief Writes the transformation, in this case the displacement field, diff --git a/src/plugins/legacy/diffeomorphicDemons/diffeomorphicDemonsToolBox.cpp b/src/plugins/legacy/diffeomorphicDemons/diffeomorphicDemonsToolBox.cpp index 041bfeaa41..4739021f18 100644 --- a/src/plugins/legacy/diffeomorphicDemons/diffeomorphicDemonsToolBox.cpp +++ b/src/plugins/legacy/diffeomorphicDemons/diffeomorphicDemonsToolBox.cpp @@ -42,15 +42,8 @@ diffeomorphicDemonsToolBox::diffeomorphicDemonsToolBox(QWidget *parent) : medAbstractSelectableToolBox(parent), d(new diffeomorphicDemonsToolBoxPrivate) { QWidget *widget = new QWidget(this); - QVBoxLayout *layout = new QVBoxLayout(); - QLabel *explanation = new QLabel("Drop 2 datasets with same size and spacing.\n"); - explanation->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Preferred); - explanation->setWordWrap(true); - explanation->setStyleSheet("font: italic"); - layout->addWidget(explanation); - d->iterationsBox = new QLineEdit(); d->iterationsBox->setText("15x10x5"); d->iterationsBox->setToolTip(tr("Each number of iteration per level must be separated by \"x\". From coarser to finest levels")); diff --git a/src/plugins/legacy/itkDataDiffusionGradientList/CMakeLists.txt b/src/plugins/legacy/itkDataDiffusionGradientList/CMakeLists.txt index 6ce7e70c57..c68bc0fcaf 100644 --- a/src/plugins/legacy/itkDataDiffusionGradientList/CMakeLists.txt +++ b/src/plugins/legacy/itkDataDiffusionGradientList/CMakeLists.txt @@ -35,9 +35,7 @@ include_directories(${dtk_INCLUDE_DIRS}) find_package(ITK REQUIRED COMPONENTS ITKCommon) include(${ITK_USE_FILE}) -find_package(TTK REQUIRED) -include(${TTK_USE_FILE}) - +find_package(TTK REQUIRED COMPONENTS ITKTensor) ## ############################################################################# ## List Sources @@ -91,7 +89,7 @@ target_link_libraries(${TARGET_NAME} ${QT_LIBRARIES} dtkLog dtkCore - ITKTensor + TTK::ITKTensor medCore medLog ) diff --git a/src/plugins/legacy/itkDataImage/CMakeLists.txt b/src/plugins/legacy/itkDataImage/CMakeLists.txt index d40884c0a0..b89ba131a9 100644 --- a/src/plugins/legacy/itkDataImage/CMakeLists.txt +++ b/src/plugins/legacy/itkDataImage/CMakeLists.txt @@ -50,7 +50,7 @@ set(ITK_IMAGES_DEPENDENCIES ITKIOPhilipsREC ) -find_package(ITK REQUIRED COMPONENTS ITKIOImageBase ITKIOGDCM ITKIOVTK ITKVtkGlue ${ITK_IMAGES_DEPENDENCIES}) +find_package(ITK REQUIRED COMPONENTS ITKIOImageBase ITKGDCM ITKIOGDCM ITKIOVTK ITKVtkGlue ${ITK_IMAGES_DEPENDENCIES}) include(${ITK_USE_FILE}) # itkLogForwarder used through medLog @@ -137,7 +137,8 @@ target_link_libraries(${TARGET_NAME} Qt5::Widgets dtkCore dtkLog - ITKStatistics + gdcmCommon + ${ITK_LIBRARIES} medCore medImageIO medLog diff --git a/src/plugins/legacy/itkDataImage/readers/itkDCMTKDataImageReader.cpp b/src/plugins/legacy/itkDataImage/readers/itkDCMTKDataImageReader.cpp index f68f5b4143..2f7cf197e0 100644 --- a/src/plugins/legacy/itkDataImage/readers/itkDCMTKDataImageReader.cpp +++ b/src/plugins/legacy/itkDataImage/readers/itkDCMTKDataImageReader.cpp @@ -19,6 +19,8 @@ #include <itkDCMTKImageIO.h> +#include <itkCommonEnums.h> +#include <itkImageIOBase.h> #include <itkImageFileReader.h> #include <itkRGBPixel.h> #include <itkMetaDataDictionary.h> @@ -301,42 +303,42 @@ bool itkDCMTKDataImageReader::readInformation(const QStringList& paths) std::ostringstream imagetypestring; imagetypestring << "itkDataImage"; - if (d->io->GetPixelType() == itk::ImageIOBase::SCALAR) + if (d->io->GetPixelType() == itk::IOPixelEnum::SCALAR) { switch (d->io->GetComponentType()) { - case itk::ImageIOBase::UCHAR: + case itk::IOComponentEnum::UCHAR: imagetypestring << "UChar"; break; - case itk::ImageIOBase::CHAR: + case itk::IOComponentEnum::CHAR: imagetypestring << "Char"; break; - case itk::ImageIOBase::USHORT: + case itk::IOComponentEnum::USHORT: imagetypestring << "UShort"; break; - case itk::ImageIOBase::SHORT: + case itk::IOComponentEnum::SHORT: imagetypestring << "Short"; break; - case itk::ImageIOBase::UINT: + case itk::IOComponentEnum::UINT: imagetypestring << "UInt"; break; - case itk::ImageIOBase::INT: + case itk::IOComponentEnum::INT: imagetypestring << "Int"; break; - case itk::ImageIOBase::ULONG: + case itk::IOComponentEnum::ULONG: imagetypestring << "ULong"; break; - case itk::ImageIOBase::LONG: + case itk::IOComponentEnum::LONG: imagetypestring << "Long"; break; - case itk::ImageIOBase::FLOAT: + case itk::IOComponentEnum::FLOAT: imagetypestring << "Float"; break; - case itk::ImageIOBase::DOUBLE: + case itk::IOComponentEnum::DOUBLE: imagetypestring << "Double"; break; default: - qDebug() << "Unrecognized component type: " << d->io->GetComponentType(); + qDebug() << "Unrecognized component type: " << static_cast<int>(d->io->GetComponentType()); return false; } @@ -345,12 +347,12 @@ bool itkDCMTKDataImageReader::readInformation(const QStringList& paths) if (medData) this->setData(medData); } - else if (d->io->GetPixelType() == itk::ImageIOBase::RGB) + else if (d->io->GetPixelType() == itk::IOPixelEnum::RGB) { switch (d->io->GetComponentType()) { - case itk::ImageIOBase::UCHAR: + case itk::IOComponentEnum::UCHAR: medData = medAbstractDataFactory::instance()->create("itkDataImageRGB3"); if (medData) diff --git a/src/plugins/legacy/itkDataImage/readers/itkGDCMDataImageReader.cpp b/src/plugins/legacy/itkDataImage/readers/itkGDCMDataImageReader.cpp index f3231825e9..984be7b43d 100644 --- a/src/plugins/legacy/itkDataImage/readers/itkGDCMDataImageReader.cpp +++ b/src/plugins/legacy/itkDataImage/readers/itkGDCMDataImageReader.cpp @@ -31,6 +31,8 @@ #include <medMetaDataKeys.h> +#include <QDebug> + #include <map> const char itkGDCMDataImageReader::ID[] = "itkGDCMDataImageReader"; @@ -279,7 +281,7 @@ bool itkGDCMDataImageReader::readInformation(const QStringList &paths) std::ostringstream imagetypestring; imagetypestring << "itkDataImage"; - if (d->io->GetPixelType() != itk::ImageIOBase::SCALAR) + if (d->io->GetPixelType() != itk::IOPixelEnum::SCALAR) { dtkDebug() << "Unsupported pixel type"; return false; @@ -287,34 +289,34 @@ bool itkGDCMDataImageReader::readInformation(const QStringList &paths) switch (d->io->GetComponentType()) { - case itk::ImageIOBase::UCHAR: + case itk::IOComponentEnum::UCHAR: imagetypestring << "UChar"; break; - case itk::ImageIOBase::CHAR: + case itk::IOComponentEnum::CHAR: imagetypestring << "Char"; break; - case itk::ImageIOBase::USHORT: + case itk::IOComponentEnum::USHORT: imagetypestring << "UShort"; break; - case itk::ImageIOBase::SHORT: + case itk::IOComponentEnum::SHORT: imagetypestring << "Short"; break; - case itk::ImageIOBase::UINT: + case itk::IOComponentEnum::UINT: imagetypestring << "UInt"; break; - case itk::ImageIOBase::INT: + case itk::IOComponentEnum::INT: imagetypestring << "Int"; break; - case itk::ImageIOBase::ULONG: + case itk::IOComponentEnum::ULONG: imagetypestring << "ULong"; break; - case itk::ImageIOBase::LONG: + case itk::IOComponentEnum::LONG: imagetypestring << "Long"; break; - case itk::ImageIOBase::FLOAT: + case itk::IOComponentEnum::FLOAT: imagetypestring << "Float"; break; - case itk::ImageIOBase::DOUBLE: + case itk::IOComponentEnum::DOUBLE: /** @todo Handle properly double pixel values. For the moment it is only handled in 3D, not in 4D, and it is very @@ -328,14 +330,14 @@ bool itkGDCMDataImageReader::readInformation(const QStringList &paths) imagetypestring << "Double"; break; default: - dtkDebug() << "Unrecognized component type:\t " << d->io->GetComponentType(); + qDebug() << "Unrecognized component type:\t " << static_cast<int>(d->io->GetComponentType()); return false; } imagetypestring << imagedimension; if (imagedimension == 4) { - dtkDebug() << "image type given :\t" << imagetypestring.str().c_str(); + qDebug() << "image type given :\t" << imagetypestring.str().c_str(); } medData = medAbstractDataFactory::instance()->createSmartPointer(imagetypestring.str().c_str()); diff --git a/src/plugins/legacy/itkDataSHImage/readers/itkDataSHImageReader.cpp b/src/plugins/legacy/itkDataSHImage/readers/itkDataSHImageReader.cpp index e37fd99789..c47c08cecf 100644 --- a/src/plugins/legacy/itkDataSHImage/readers/itkDataSHImageReader.cpp +++ b/src/plugins/legacy/itkDataSHImage/readers/itkDataSHImageReader.cpp @@ -70,8 +70,7 @@ bool itkDataSHImageReader::canRead (const QStringList &paths) bool itkDataSHImageReader::canRead (const QString &path) { - itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(path.toUtf8().constData(), - itk::ImageIOFactory::ReadMode); + itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(path.toLatin1().constData(), itk::IOFileModeEnum::ReadMode); if (!imageIO.IsNull()) { @@ -114,8 +113,7 @@ bool itkDataSHImageReader::readInformation (const QStringList &paths) bool itkDataSHImageReader::readInformation (const QString &path) { - itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(path.toUtf8().constData(), - itk::ImageIOFactory::ReadMode); + itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(path.toLatin1().constData(), itk::IOFileModeEnum::ReadMode); imageIO->SetFileName ( path.toUtf8().constData() ); try @@ -133,13 +131,13 @@ bool itkDataSHImageReader::readInformation (const QString &path) if (!medData) { switch (imageIO->GetComponentType()) { - case itk::ImageIOBase::FLOAT: + case itk::IOComponentEnum::FLOAT: medData = medAbstractDataFactory::instance()->create ("itkDataSHImageFloat3"); if (medData) this->setData ( medData ); break; - case itk::ImageIOBase::DOUBLE: + case itk::IOComponentEnum::DOUBLE: medData = medAbstractDataFactory::instance()->create ("itkDataSHImageDouble3"); if (medData) this->setData ( medData ); diff --git a/src/plugins/legacy/itkDataTensorImage/CMakeLists.txt b/src/plugins/legacy/itkDataTensorImage/CMakeLists.txt index 19e6f0e6e0..33ae107785 100644 --- a/src/plugins/legacy/itkDataTensorImage/CMakeLists.txt +++ b/src/plugins/legacy/itkDataTensorImage/CMakeLists.txt @@ -38,9 +38,7 @@ include(${ITK_USE_FILE}) find_package(VTK REQUIRED COMPONENTS vtkCommonCore vtkCommonExecutionModel vtkRenderingCore vtkImagingCore vtkInteractionStyle vtkInteractionWidgets) include(${VTK_USE_FILE}) -find_package(TTK REQUIRED) -include(${TTK_USE_FILE}) - +find_package(TTK REQUIRED COMPONENTS ITKTensor ttkAlgorithms) ## ############################################################################# ## List Sources @@ -118,7 +116,8 @@ target_link_libraries(${TARGET_NAME} ITKIOPNG ITKIOStimulate ITKIOVTK - ITKTensor + TTK::ITKTensor + TTK::ttkAlgorithms medCore medLog medVtkInria diff --git a/src/plugins/legacy/itkDataTensorImage/readers/itkDataTensorImageReaderBase.cpp b/src/plugins/legacy/itkDataTensorImage/readers/itkDataTensorImageReaderBase.cpp index d7f60cded2..b5e74d0c2b 100644 --- a/src/plugins/legacy/itkDataTensorImage/readers/itkDataTensorImageReaderBase.cpp +++ b/src/plugins/legacy/itkDataTensorImage/readers/itkDataTensorImageReaderBase.cpp @@ -109,13 +109,13 @@ bool itkDataTensorImageReaderBase::readInformation (const QString &path) switch (this->io->GetComponentType()) { - case itk::ImageIOBase::FLOAT: + case itk::IOComponentEnum::FLOAT: medData = medAbstractDataFactory::instance()->create ("itkDataTensorImageFloat3"); if (medData) this->setData ( medData ); break; - case itk::ImageIOBase::DOUBLE: + case itk::IOComponentEnum::DOUBLE: medData = medAbstractDataFactory::instance()->create ("itkDataTensorImageDouble3"); if (medData) this->setData ( medData ); diff --git a/src/plugins/legacy/itkFilters/CMakeLists.txt b/src/plugins/legacy/itkFilters/CMakeLists.txt index e6f29f527f..63503dbda8 100644 --- a/src/plugins/legacy/itkFilters/CMakeLists.txt +++ b/src/plugins/legacy/itkFilters/CMakeLists.txt @@ -34,7 +34,7 @@ find_package(dtk REQUIRED) include_directories(${dtk_INCLUDE_DIRS}) find_package(ITK REQUIRED COMPONENTS ITKCommon ITKThresholding ITKConnectedComponents - ITKSmoothing ITKBinaryMathematicalMorphology) + ITKSmoothing ITKBinaryMathematicalMorphology ITKMathematicalMorphology) include(${ITK_USE_FILE}) ## ############################################################################# @@ -75,6 +75,8 @@ target_link_libraries(${TARGET_NAME} dtkCore dtkLog ITKCommon + ITKSmoothing + ITKMathematicalMorphology medCore medUtilities ) diff --git a/src/plugins/legacy/itkProcessRegistrationOptimus/CMakeLists.txt b/src/plugins/legacy/itkProcessRegistrationOptimus/CMakeLists.txt index 82546fbdcf..399c1daa17 100644 --- a/src/plugins/legacy/itkProcessRegistrationOptimus/CMakeLists.txt +++ b/src/plugins/legacy/itkProcessRegistrationOptimus/CMakeLists.txt @@ -98,6 +98,7 @@ target_link_libraries(${TARGET_NAME} medCoreLegacy ${ITKIO_LIBRARIES} ITKOptimizers + ITKSmoothing medRegistration ) diff --git a/src/plugins/legacy/manualRegistration/manualRegistration.cpp b/src/plugins/legacy/manualRegistration/manualRegistration.cpp index 04ba54193e..01fd43c7ad 100644 --- a/src/plugins/legacy/manualRegistration/manualRegistration.cpp +++ b/src/plugins/legacy/manualRegistration/manualRegistration.cpp @@ -160,12 +160,12 @@ template <typename PixelType, typename TransformType> int manualRegistrationPriv typedef itk::ResampleImageFilter< MovingImageType,MovingImageType,TransformScalarType > ResampleFilterType; typename ResampleFilterType::Pointer resampler = ResampleFilterType::New(); resampler->SetTransform(transform); - resampler->SetInput((const MovingImageType*)proc->movingImages()[0].GetPointer()); - resampler->SetSize( proc->fixedImage()->GetLargestPossibleRegion().GetSize() ); + resampler->SetInput(static_cast<const MovingImageType*>(proc->movingImages()[0].GetPointer())); + resampler->SetSize(proc->fixedImage()->GetLargestPossibleRegion().GetSize()); resampler->SetOutputOrigin( proc->fixedImage()->GetOrigin() ); resampler->SetOutputSpacing( proc->fixedImage()->GetSpacing() ); resampler->SetOutputDirection( proc->fixedImage()->GetDirection() ); - resampler->SetDefaultPixelValue( 0 ); + resampler->SetDefaultPixelValue(0); try { diff --git a/src/plugins/legacy/manualRegistration/manualRegistrationToolBox.cpp b/src/plugins/legacy/manualRegistration/manualRegistrationToolBox.cpp index db9a4614b5..b5b1013f74 100644 --- a/src/plugins/legacy/manualRegistration/manualRegistrationToolBox.cpp +++ b/src/plugins/legacy/manualRegistration/manualRegistrationToolBox.cpp @@ -70,9 +70,10 @@ manualRegistrationToolBox::manualRegistrationToolBox(QWidget *parent) d->b_startManualRegistration->setObjectName("startManualRegistrationButton"); d->explanation = new QLabel("To add a landmark: \n\tShift + left mouse button\nTo remove a pair of landmarks: \n\tBackspace + left mouse button", widget); + d->explanation->setStyleSheet("font: italic"); - d->numberOfLdInLeftContainer = new QLabel("Number of landmarks in left container: 0", widget); - d->numberOfLdInRightContainer = new QLabel("Number of landmarks in right container: 0", widget); + d->numberOfLdInLeftContainer = new QLabel("Number of landmarks in left container: <b>0</b>", widget); + d->numberOfLdInRightContainer = new QLabel("Number of landmarks in right container: <b>0</b>", widget); // Choice between transformations QHBoxLayout* transformationLayout = new QHBoxLayout; @@ -564,8 +565,8 @@ void manualRegistrationToolBox::displayButtons(bool show) void manualRegistrationToolBox::updateGUI(int left, int right) { - d->numberOfLdInLeftContainer->setText( "Number of landmarks in left container: " + QString::number(left)); - d->numberOfLdInRightContainer->setText("Number of landmarks in right container: " + QString::number(right)); + d->numberOfLdInLeftContainer->setText(QString("Number of landmarks in left container: <b>%1</b>").arg(left)); + d->numberOfLdInRightContainer->setText(QString("Number of landmarks in right container: <b>%1</b>").arg(right)); if (left == right) { diff --git a/src/plugins/legacy/medAlgorithmPaint/CMakeLists.txt b/src/plugins/legacy/medAlgorithmPaint/CMakeLists.txt index 62865cfb72..2628424008 100644 --- a/src/plugins/legacy/medAlgorithmPaint/CMakeLists.txt +++ b/src/plugins/legacy/medAlgorithmPaint/CMakeLists.txt @@ -72,6 +72,7 @@ add_library(${TARGET_NAME} SHARED target_link_libraries(${TARGET_NAME} ${QT_LIBRARIES} ITKCommon + ITKRegionGrowing medCore medUtilities ) diff --git a/src/plugins/legacy/medAlgorithmPaint/medAlgorithmPaintToolBox.cpp b/src/plugins/legacy/medAlgorithmPaint/medAlgorithmPaintToolBox.cpp index 9fbfd66239..f57c765cbc 100644 --- a/src/plugins/legacy/medAlgorithmPaint/medAlgorithmPaintToolBox.cpp +++ b/src/plugins/legacy/medAlgorithmPaint/medAlgorithmPaintToolBox.cpp @@ -15,7 +15,7 @@ #include <itkConnectedThresholdImageFilter.h> #include <itkDanielssonDistanceMapImageFilter.h> -#include <itkExceptionObject.h> +#include <itkMacro.h> #include <itkExtractImageFilter.h> #include <itkImageLinearIteratorWithIndex.h> #include <itkImageSliceIteratorWithIndex.h> @@ -519,8 +519,6 @@ medAbstractData* AlgorithmPaintToolBox::processOutput() // Check if painted data on the volume if (!m_undoStacks->empty() && !m_undoStacks->value(currentView)->isEmpty()) { - updateMaskWithMasterLabel(); - copyMetaData(m_maskData, m_imageData); return m_maskData; // return output data } else @@ -928,6 +926,7 @@ void AlgorithmPaintToolBox::setData( medAbstractData *medData ) else { m_maskData = medAbstractDataFactory::instance()->createSmartPointer( "itkDataImageUChar3" ); + medUtilities::setDerivedMetaData(m_maskData, m_imageData, ""); if ( !m_maskData ) { diff --git a/src/plugins/legacy/medCompositeDataSets/CMakeLists.txt b/src/plugins/legacy/medCompositeDataSets/CMakeLists.txt index 50e950063e..97705b5018 100644 --- a/src/plugins/legacy/medCompositeDataSets/CMakeLists.txt +++ b/src/plugins/legacy/medCompositeDataSets/CMakeLists.txt @@ -35,8 +35,7 @@ find_package(dtk REQUIRED) include(${dtk_USE_FILE}) include(dtkPlugin) -find_package(TTK REQUIRED) -include(${TTK_USE_FILE}) +find_package(TTK REQUIRED COMPONENTS ITKTensor) ## ################################################################# ## Input @@ -71,7 +70,7 @@ target_link_libraries(${PROJECT_NAME} dtkCore dtkLog dtkZip - ITKTensor + TTK::ITKTensor ITKCommon medCore medGui diff --git a/src/plugins/legacy/medSegmentation/CMakeLists.txt b/src/plugins/legacy/medSegmentation/CMakeLists.txt index 6b82ec3cad..61759885c4 100644 --- a/src/plugins/legacy/medSegmentation/CMakeLists.txt +++ b/src/plugins/legacy/medSegmentation/CMakeLists.txt @@ -92,8 +92,8 @@ add_library(${TARGET_NAME} SHARED target_link_libraries(${TARGET_NAME} ${QT_LIBRARIES} dtkCore - dtkLog - ITKCommon + dtkLog + ${ITK_LIBRARIES} medCore medVtkInria medImageIO diff --git a/src/plugins/legacy/medVtkFibersData/CMakeLists.txt b/src/plugins/legacy/medVtkFibersData/CMakeLists.txt index a826a7f5af..216b17baf7 100644 --- a/src/plugins/legacy/medVtkFibersData/CMakeLists.txt +++ b/src/plugins/legacy/medVtkFibersData/CMakeLists.txt @@ -38,8 +38,7 @@ include(${VTK_USE_FILE}) find_package(ITK REQUIRED COMPONENTS ITKCommon ITKVtkGlue) include(${ITK_USE_FILE}) -find_package(TTK REQUIRED) -include(${TTK_USE_FILE}) +find_package(TTK REQUIRED COMPONENTS ttkAlgorithms ITKTensor) ## ############################################################################# ## List Sources @@ -106,7 +105,8 @@ target_link_libraries(${TARGET_NAME} medCore medLog medVtkInria - ttkAlgorithms + TTK::ttkAlgorithms + TTK::ITKTensor ITKCommon ITKVtkGlue ) diff --git a/src/plugins/legacy/polygonRoi/toolboxes/defaultLabelToolBox.cpp b/src/plugins/legacy/polygonRoi/toolboxes/defaultLabelToolBox.cpp index 2875f91def..20f98cbc69 100644 --- a/src/plugins/legacy/polygonRoi/toolboxes/defaultLabelToolBox.cpp +++ b/src/plugins/legacy/polygonRoi/toolboxes/defaultLabelToolBox.cpp @@ -1,6 +1,7 @@ #include "defaultLabelToolBox.h" #include <medDataManager.h> +#include <medSettingsManager.h> #include <medTabbedViewContainers.h> #include <medToolBoxFactory.h> #include <medUtilities.h> @@ -23,6 +24,7 @@ defaultLabelToolBox::defaultLabelToolBox(QWidget *parent): auto widget = new QWidget(); auto layout = new QVBoxLayout; + layout->setContentsMargins(0, 0, 0, 0); widget->setLayout(layout); dataName = new QLabel("No Data"); @@ -34,11 +36,36 @@ defaultLabelToolBox::defaultLabelToolBox(QWidget *parent): labels->setContentsMargins(0,0,0,0); labels->setObjectName("labels"); - plusButton = new QPushButton(QIcon(":/pixmaps/plus.png"), ""); + // Themes + QVariant themeChosen = medSettingsManager::instance().value("startup","theme"); + int themeIndex = themeChosen.toInt(); + QIcon labelIconPlus; + QIcon labelIconMinus; + switch (themeIndex) + { + case 0: + case 1: + case 2: + case 4: + default: + { + labelIconPlus = QIcon(":/pixmaps/plus_white.png"); + labelIconMinus = QIcon(":/pixmaps/minus_white.png"); + break; + } + case 3: + { + labelIconPlus = QIcon(":/pixmaps/plus_black.png"); + labelIconMinus = QIcon(":/pixmaps/minus_black.png"); + break; + } + } + + plusButton = new QPushButton(labelIconPlus, ""); plusButton->setMaximumSize(QSize(20,20)); plusButton->setObjectName("plusBttn"); - minusButton = new QPushButton(QIcon(":/pixmaps/minus.png"), ""); + minusButton = new QPushButton(labelIconMinus, ""); minusButton->setMaximumSize(QSize(20,20)); minusButton->setObjectName("minBttn"); diff --git a/src/plugins/legacy/polygonRoi/toolboxes/polygonRoiToolBox.cpp b/src/plugins/legacy/polygonRoi/toolboxes/polygonRoiToolBox.cpp index df94bf46c7..dccbed3fe4 100644 --- a/src/plugins/legacy/polygonRoi/toolboxes/polygonRoiToolBox.cpp +++ b/src/plugins/legacy/polygonRoi/toolboxes/polygonRoiToolBox.cpp @@ -55,13 +55,28 @@ polygonRoiToolBox::polygonRoiToolBox(QWidget *parent ) : explanation->setStyleSheet("font: italic"); layout->addWidget(explanation ); + // Activation button activateTBButton = new QPushButton(tr("Activate Toolbox")); activateTBButton->setToolTip(tr("Activate closed polygon mode. You should only have one view.")); activateTBButton->setCheckable(true); activateTBButton->setObjectName("closedPolygonButton"); connect(activateTBButton,SIGNAL(toggled(bool)),this,SLOT(clickClosePolygon(bool))); connect(activateTBButton, &QAbstractButton::toggled, [=] (bool state) { explanation->setVisible(!state); }); + auto activateTBLayout = new QHBoxLayout(); + layout->addLayout(activateTBLayout); + activateTBLayout->addWidget(activateTBButton); + // Add label management tool + QString identifier = speciality.toLower() + QString("LabelToolBox"); + pMedToolBox = medToolBoxFactory::instance()->createToolBox(identifier); + pMedToolBox->header()->hide(); + pMedToolBox->hide(); + pMedToolBox->setObjectName("labelTool"); + layout->addWidget(pMedToolBox); + connect(activateTBButton, SIGNAL(toggled(bool)), pMedToolBox, SLOT(setEnabled(bool)), Qt::UniqueConnection); + connect(activateTBButton, SIGNAL(toggled(bool)), pMedToolBox, SLOT(setVisible(bool)), Qt::UniqueConnection); + + // Actions on contours interpolate = new QCheckBox(tr("Interpolate between contours")); interpolate->setToolTip("Interpolate between master ROIs"); interpolate->setObjectName("interpolateButton"); @@ -69,7 +84,7 @@ polygonRoiToolBox::polygonRoiToolBox(QWidget *parent ) : connect(interpolate,SIGNAL(clicked(bool)) ,this,SLOT(interpolateCurve(bool))); auto repulsorLayout = new QHBoxLayout(); - repulsorLabel = new QLabel("Correct contours"); + repulsorLabel = new QLabel("Correct contours:"); repulsorLayout->addWidget(repulsorLabel); repulsorTool = new QPushButton(tr("Repulsor")); @@ -79,23 +94,12 @@ polygonRoiToolBox::polygonRoiToolBox(QWidget *parent ) : connect(repulsorTool,SIGNAL(clicked(bool)),this,SLOT(activateRepulsor(bool))); repulsorLayout->addWidget(repulsorTool); - auto activateTBLayout = new QHBoxLayout(); - layout->addLayout(activateTBLayout ); - activateTBLayout->addWidget(activateTBButton); - - // Add Contour Management Toolbox - QString identifier = speciality.toLower() + QString("LabelToolBox"); - pMedToolBox = medToolBoxFactory::instance()->createToolBox(identifier); - pMedToolBox->header()->hide(); - pMedToolBox->hide(); - layout->addWidget(pMedToolBox); - connect(activateTBButton, SIGNAL(toggled(bool)), pMedToolBox, SLOT(setEnabled(bool)), Qt::UniqueConnection); - auto contoursActionLayout = new QVBoxLayout(); layout->addLayout(contoursActionLayout ); contoursActionLayout->addWidget(interpolate); contoursActionLayout->addLayout(repulsorLayout); + // Export widgets saveLabel = new QLabel("Save segmentations as:"); saveLabel->setObjectName("saveLabel"); auto saveButtonsLayout = new QHBoxLayout(); @@ -393,6 +397,7 @@ void polygonRoiToolBox::clickClosePolygon(bool state) } else { + activateTBButton->setText("Deactivate Toolbox"); pMedToolBox->show(); for (baseViewEvent *event : viewEventHash.values()) { @@ -410,12 +415,8 @@ void polygonRoiToolBox::clickClosePolygon(bool state) { viewEventHash.values().first()->getCurrentView()->selectedRequest(true); } - saveBinaryMaskButton->setEnabled(state); - saveContourButton->setEnabled(state); - saveLabel->setEnabled(state); - interpolate->setEnabled(state); - repulsorTool->setEnabled(state); - repulsorLabel->setEnabled(state); + + enableInnerWidgets(state); } } @@ -448,14 +449,27 @@ void polygonRoiToolBox::disableButtons() { activateTBButton->setEnabled(false); activateTBButton->setChecked(false); - repulsorTool->setEnabled(false); - repulsorTool->setChecked(false); - repulsorLabel->setEnabled(false); - saveBinaryMaskButton->setEnabled(false); - saveContourButton->setEnabled(false); - saveLabel->setEnabled(false); - interpolate->setEnabled(false); + + enableInnerWidgets(false); interpolate->setChecked(true); + repulsorTool->setChecked(false); +} + +void polygonRoiToolBox::enableInnerWidgets(bool state) +{ + repulsorTool->setEnabled(state); + repulsorTool->setVisible(state); + repulsorLabel->setEnabled(state); + repulsorLabel->setVisible(state); + saveBinaryMaskButton->setEnabled(state); + saveBinaryMaskButton->setVisible(state); + saveContourButton->setEnabled(state); + saveContourButton->setVisible(state); + saveLabel->setEnabled(state); + saveLabel->setVisible(state); + interpolate->setEnabled(state); + interpolate->setVisible(state); + helpButton->setVisible(state); } void polygonRoiToolBox::saveContours() @@ -597,8 +611,8 @@ void polygonRoiToolBox::showHelp() const + QString("<li><b>Draw a contour</b>: shift+click on the data to create a contour</li>") + QString("<li><b>Add a new label</b>: click on '+' button in the label list</li>") + QString("<li><b>Remove a label</b>: click on '-' button in the label list</li>") - + QString("<li><b>Use a new label</b>: select a label in the list, then shift+click on the data</li>") - + QString("<li><b>Alt+click</b>: draw a landmark at that position in all views</li>") + + QString("<li><b>Use a new label</b>: select a label in the list, then click on the data</li>") + + QString("<li><b>Alt+click</b>: draw a landmark at that position in all slices</li>") + QString("</ul>"); QString shortcut = QString("<h3>Shortcuts</h3>") diff --git a/src/plugins/legacy/polygonRoi/toolboxes/polygonRoiToolBox.h b/src/plugins/legacy/polygonRoi/toolboxes/polygonRoiToolBox.h index 3e6caebb08..e79f547157 100644 --- a/src/plugins/legacy/polygonRoi/toolboxes/polygonRoiToolBox.h +++ b/src/plugins/legacy/polygonRoi/toolboxes/polygonRoiToolBox.h @@ -71,6 +71,7 @@ public slots: private slots: void disableButtons(); + void enableInnerWidgets(bool state); void saveContours(); void saveBinaryImage(); diff --git a/src/plugins/legacy/polygonRoi/viewevent/baseViewEvent.cpp b/src/plugins/legacy/polygonRoi/viewevent/baseViewEvent.cpp index e45a6e55d2..9df003938d 100644 --- a/src/plugins/legacy/polygonRoi/viewevent/baseViewEvent.cpp +++ b/src/plugins/legacy/polygonRoi/viewevent/baseViewEvent.cpp @@ -392,6 +392,9 @@ QMenu *baseViewEvent::changeLabelActions(polygonLabel* closestLabel) roiToAdd->pasteContour(nodes); setLabelActivationState(); deleteContour(closestLabel); + // Re-render the ROI + roiToAdd->Off(); + roiToAdd->On(); }); changeMenu->addAction(action); } @@ -407,7 +410,6 @@ void baseViewEvent::setLabelActivationState() } } - bool baseViewEvent::rightButtonBehaviour(medAbstractView *view, QMouseEvent *mouseEvent) { if (!view) @@ -703,7 +705,6 @@ void baseViewEvent::activateRepulsor(bool state) cursorState = CURSORSTATE::CS_DEFAULT; vtkInteractorStyleImageView2D *interactorStyle2D = vtkInteractorStyleImageView2D::New(); globalVtkLeftButtonBehaviour = view2d->GetLeftButtonInteractionStyle(); - interactorStyle2D->SetLeftButtonInteraction(vtkInteractorStyleImageView2D::InteractionTypeNull); view2d->SetInteractorStyle(interactorStyle2D); view2d->SetupInteractor(originalInteractor); interactorStyle2D->Delete(); diff --git a/src/plugins/legacy/polygonRoi/viewevent/baseViewEvent.h b/src/plugins/legacy/polygonRoi/viewevent/baseViewEvent.h index df75fff95b..f35a9ed0bb 100644 --- a/src/plugins/legacy/polygonRoi/viewevent/baseViewEvent.h +++ b/src/plugins/legacy/polygonRoi/viewevent/baseViewEvent.h @@ -19,6 +19,7 @@ #include <QLineEdit> #include <QListWidget> #include <QWidgetAction> + #include <medLabelProperty.h> #include <medDisplayPosContours.h> #include <medTagContours.h> @@ -120,7 +121,7 @@ private slots: QList<medDisplayPosContours> copyNodesList; double savedMousePosition[2]; dtkSmartPointer<medAbstractData> contourOutput; - vtkRenderWindowInteractor* originalInteractor; + vtkRenderWindowInteractor *originalInteractor; void leftButtonBehaviour(medAbstractView *view); bool rightButtonBehaviour(medAbstractView *view, QMouseEvent *mouseEvent); diff --git a/src/plugins/legacy/polygonRoi/viewevent/defaultViewEvent.cpp b/src/plugins/legacy/polygonRoi/viewevent/defaultViewEvent.cpp index 9d72485260..c3601433cc 100644 --- a/src/plugins/legacy/polygonRoi/viewevent/defaultViewEvent.cpp +++ b/src/plugins/legacy/polygonRoi/viewevent/defaultViewEvent.cpp @@ -62,7 +62,9 @@ void defaultViewEvent::deleteLabel(polygonLabel *manager) int position = deleteLabelBase(manager); if (position==-1) { - dLabelToolBox->unselectAll(); + // The last contour/node of the data has been removed, we need to reset + dLabelToolBox->selectRow(0); + dLabelToolBox->forceItemSelection(); } else { diff --git a/src/plugins/legacy/voiCutter/voiCutterToolBox.cpp b/src/plugins/legacy/voiCutter/voiCutterToolBox.cpp index 36710a3643..42712511df 100644 --- a/src/plugins/legacy/voiCutter/voiCutterToolBox.cpp +++ b/src/plugins/legacy/voiCutter/voiCutterToolBox.cpp @@ -280,13 +280,21 @@ dtkPlugin* voiCutterToolBox::plugin() return medPluginManager::instance().plugin("VOI Cutter"); } +/** + * @brief Return cropped data if VOI Cutter has been used or initial data, or nullptr if no data is found. + * + * @return medAbstractData* + */ medAbstractData *voiCutterToolBox::processOutput() { if (d->resultData) { - fillOutputMetaData(); return d->resultData; } + else if (d->currentView) + { + return d->currentView->layerData(d->currentView->currentLayer()); + } return nullptr; } diff --git a/src/plugins/process/itkDWIBrainMaskCalculatorProcess/CMakeLists.txt b/src/plugins/process/itkDWIBrainMaskCalculatorProcess/CMakeLists.txt index a72fae01da..0ae2ae70dd 100644 --- a/src/plugins/process/itkDWIBrainMaskCalculatorProcess/CMakeLists.txt +++ b/src/plugins/process/itkDWIBrainMaskCalculatorProcess/CMakeLists.txt @@ -19,8 +19,7 @@ set(TARGET_NAME itkDWIBrainMaskCalculatorProcessPlugin) ## Resolve dependencies ## ############################################################################# -find_package(TTK REQUIRED) -include(${TTK_USE_FILE}) +find_package(TTK REQUIRED COMPONENTS Registration ttkAlgorithms) find_package(ITK REQUIRED COMPONENTS ITKCommon ITKImageStatistics ITKImageIntensity ITKSmoothing ITKThresholding ITKMathematicalMorphology ITKBinaryMathematicalMorphology ITKLabelVoting) include(${ITK_USE_FILE}) @@ -62,6 +61,9 @@ target_include_directories(${TARGET_NAME} target_link_libraries(${TARGET_NAME} ITKCommon ITKStatistics + ITKSmoothing + TTK::Registration + TTK::ttkAlgorithms Qt5::Core dtkCore dtkCoreSupport diff --git a/src/plugins/process/morphomath_operation/CMakeLists.txt b/src/plugins/process/morphomath_operation/CMakeLists.txt index 144ee92abd..1defd700fa 100644 --- a/src/plugins/process/morphomath_operation/CMakeLists.txt +++ b/src/plugins/process/morphomath_operation/CMakeLists.txt @@ -61,6 +61,7 @@ target_include_directories(${TARGET_NAME} target_link_libraries(${TARGET_NAME} ITKCommon + ITKMathematicalMorphology Qt5::Core dtkCore dtkLog diff --git a/src/plugins/process/single_filter/CMakeLists.txt b/src/plugins/process/single_filter/CMakeLists.txt index 051bb41707..9ef60d576f 100644 --- a/src/plugins/process/single_filter/CMakeLists.txt +++ b/src/plugins/process/single_filter/CMakeLists.txt @@ -61,6 +61,7 @@ target_include_directories(${TARGET_NAME} target_link_libraries(${TARGET_NAME} ITKCommon + ITKSmoothing Qt5::Core dtkCore dtkLog diff --git a/src/plugins/process/ttkTensorEstimationProcess/CMakeLists.txt b/src/plugins/process/ttkTensorEstimationProcess/CMakeLists.txt index abaaae627f..118f3386e9 100644 --- a/src/plugins/process/ttkTensorEstimationProcess/CMakeLists.txt +++ b/src/plugins/process/ttkTensorEstimationProcess/CMakeLists.txt @@ -7,8 +7,7 @@ set(TARGET_NAME ttkTensorEstimationProcessPlugin) find_package(ITK REQUIRED COMPONENTS ITKCommon ITKFiniteDifference) include(${ITK_USE_FILE}) -find_package(TTK REQUIRED) -include(${TTK_USE_FILE}) +find_package(TTK REQUIRED COMPONENTS ITKTensor ttkAlgorithms) ## ############################################################################# ## List Sources @@ -50,7 +49,8 @@ target_link_libraries(${TARGET_NAME} dtkCore dtkCoreSupport dtkLog - ITKTensor + TTK::ITKTensor + TTK::ttkAlgorithms medCoreLegacy medCore medWidgets diff --git a/src/plugins/process/ttkTensorScalarMapsProcess/CMakeLists.txt b/src/plugins/process/ttkTensorScalarMapsProcess/CMakeLists.txt index 9da93b1afd..35ace7785b 100644 --- a/src/plugins/process/ttkTensorScalarMapsProcess/CMakeLists.txt +++ b/src/plugins/process/ttkTensorScalarMapsProcess/CMakeLists.txt @@ -4,8 +4,7 @@ set(TARGET_NAME ttkTensorScalarMapsProcessPlugin) ## Resolve dependencies ## ############################################################################# -find_package(TTK REQUIRED) -include(${TTK_USE_FILE}) +find_package(TTK REQUIRED COMPONENTS ITKTensor ttkAlgorithms) find_package(VTK REQUIRED COMPONENTS vtkRenderingCore) include(${VTK_USE_FILE}) @@ -53,7 +52,8 @@ target_link_libraries(${TARGET_NAME} dtkCore dtkCoreSupport dtkLog - ITKTensor + TTK::ITKTensor + TTK::ttkAlgorithms medCore medCoreLegacy medVtkInria diff --git a/src/plugins/process/ttkTensorTractographyProcess/CMakeLists.txt b/src/plugins/process/ttkTensorTractographyProcess/CMakeLists.txt index ee5f444e11..13314d64e2 100644 --- a/src/plugins/process/ttkTensorTractographyProcess/CMakeLists.txt +++ b/src/plugins/process/ttkTensorTractographyProcess/CMakeLists.txt @@ -32,8 +32,7 @@ include(${VTK_USE_FILE}) find_package(ITK REQUIRED ITKCommon ITKTransform ITKImageFunction) include(${ITK_USE_FILE}) -find_package(TTK REQUIRED) -include(${TTK_USE_FILE}) +find_package(TTK REQUIRED COMPONENTS ITKTensor ttkAlgorithms) ## ############################################################################# ## List Sources ## ############################################################################# @@ -74,7 +73,8 @@ target_link_libraries(${TARGET_NAME} dtkCore dtkCoreSupport dtkLog - ITKTensor + TTK::ITKTensor + TTK::ttkAlgorithms ITKIOTransformBase medCore medCoreLegacy diff --git a/superbuild/projects_modules/ITK.cmake b/superbuild/projects_modules/ITK.cmake index dfacc24435..9cf28d26e0 100644 --- a/superbuild/projects_modules/ITK.cmake +++ b/superbuild/projects_modules/ITK.cmake @@ -40,7 +40,7 @@ if (NOT USE_SYSTEM_${ep}) set(git_url ${GITHUB_PREFIX}InsightSoftwareConsortium/ITK.git) -set(git_tag v5.0.0) +set(git_tag v5.2.1) ## ############################################################################# diff --git a/superbuild/projects_modules/LogDemons.cmake b/superbuild/projects_modules/LogDemons.cmake index 8670dfd4d2..e65ecc9301 100644 --- a/superbuild/projects_modules/LogDemons.cmake +++ b/superbuild/projects_modules/LogDemons.cmake @@ -39,8 +39,8 @@ if (NOT USE_SYSTEM_${ep}) ## Set up versioning control ## ############################################################################# - set(git_url ${GITHUB_PREFIX}Inria-Asclepios/LCC-LogDemons.git) - set(git_tag master) +set(git_url ${GITHUB_PREFIX}Inria-Asclepios/LCC-LogDemons.git) +set(git_tag ITK5.1.1) ## ############################################################################# ## Add specific cmake arguments for configuration step of the project diff --git a/superbuild/projects_modules/RPI.cmake b/superbuild/projects_modules/RPI.cmake index 2d95479073..25833c8221 100644 --- a/superbuild/projects_modules/RPI.cmake +++ b/superbuild/projects_modules/RPI.cmake @@ -40,8 +40,8 @@ if (NOT USE_SYSTEM_${ep}) ## Set up versioning control ## ############################################################################# -set(git_url ${GITHUB_PREFIX}Inria-Asclepios/RPI.git) -set(git_tag ITK5.0) +set(git_url ${GITHUB_PREFIX}medInria/RPI.git) +set(git_tag ITK5.1.1) ## ############################################################################# ## Add specific cmake arguments for configuration step of the project diff --git a/superbuild/projects_modules/TTK.cmake b/superbuild/projects_modules/TTK.cmake index f35768b003..9b46d4aaae 100644 --- a/superbuild/projects_modules/TTK.cmake +++ b/superbuild/projects_modules/TTK.cmake @@ -40,8 +40,8 @@ if (NOT USE_SYSTEM_${ep}) ## Set up versioning control ## ############################################################################# -set(git_url ${GITHUB_PREFIX}Inria-Asclepios/TTK-Public.git) -set(git_tag master) +set(git_url ${GITHUB_PREFIX}medInria/TTK.git) +set(git_tag ITK5.2.1) ## ############################################################################# ## Add specific cmake arguments for configuration step of the project diff --git a/superbuild/projects_modules/VTK.cmake b/superbuild/projects_modules/VTK.cmake index 26eda47885..72d34cd3cd 100644 --- a/superbuild/projects_modules/VTK.cmake +++ b/superbuild/projects_modules/VTK.cmake @@ -132,6 +132,8 @@ if(USE_Python) endif() list(APPEND cmake_args -DVTK_WRAP_PYTHON:BOOL=ON + -DModule_vtkPython:BOOL=ON + -DModule_vtkWrappingTools:BOOL=ON -DVTK_PYTHON_VERSION:STRING=${python_version} -DPYTHON_EXECUTABLE:PATH=${python_executable} -DPYTHON_INCLUDE_DIR:PATH=${python_include} diff --git a/superbuild/projects_modules/medInria.cmake b/superbuild/projects_modules/medInria.cmake index 00b49f51c7..9c2c1d64ad 100644 --- a/superbuild/projects_modules/medInria.cmake +++ b/superbuild/projects_modules/medInria.cmake @@ -141,8 +141,10 @@ ExternalProject_Add(${ep} ## ############################################################################# if (WIN32) + file(REAL_PATH ${TTK_DIR}/../../../ _TTK_DIR) file(TO_NATIVE_PATH ${ITK_ROOT} ITK_BIN_BASE) file(TO_NATIVE_PATH ${VTK_ROOT} VTK_BIN_BASE) + file(TO_NATIVE_PATH ${_TTK_DIR} TTK_BIN_BASE) file(TO_NATIVE_PATH ${dtk_ROOT} DTK_BIN_BASE) file(TO_NATIVE_PATH ${QtDCM_ROOT} DCM_BIN_BASE) file(TO_NATIVE_PATH ${_qt5Core_install_prefix} QT5_BIN_BASE) @@ -159,7 +161,8 @@ if (WIN32) COMMAND for %%I in ( ${VTK_BIN_BASE}\\bin\\${CONFIG_MODE}\\*.dll ) do (if EXIST ${MED_BIN_BASE}\\%%~nxI (del /S ${MED_BIN_BASE}\\%%~nxI & mklink /H ${MED_BIN_BASE}\\%%~nxI %%~fI) else mklink /H ${MED_BIN_BASE}\\%%~nxI %%~fI) COMMAND for %%I in ( ${DTK_BIN_BASE}\\bin\\${CONFIG_MODE}\\*.dll ) do (if EXIST ${MED_BIN_BASE}\\%%~nxI (del /S ${MED_BIN_BASE}\\%%~nxI & mklink /H ${MED_BIN_BASE}\\%%~nxI %%~fI) else mklink /H ${MED_BIN_BASE}\\%%~nxI %%~fI) COMMAND for %%I in ( ${DCM_BIN_BASE}\\bin\\${CONFIG_MODE}\\*.dll ) do (if EXIST ${MED_BIN_BASE}\\%%~nxI (del /S ${MED_BIN_BASE}\\%%~nxI & mklink /H ${MED_BIN_BASE}\\%%~nxI %%~fI) else mklink /H ${MED_BIN_BASE}\\%%~nxI %%~fI) - COMMAND for %%I in ( ${QT5_BIN_BASE}\\bin\\*.dll ) do (if EXIST ${MED_BIN_BASE}\\%%~nxI (del /S ${MED_BIN_BASE}\\%%~nxI & mklink /H ${MED_BIN_BASE}\\%%~nxI %%~fI) else mklink /H ${MED_BIN_BASE}\\%%~nxI %%~fI) + COMMAND for %%I in ( ${TTK_BIN_BASE}\\bin\\*.dll ) do (if EXIST ${MED_BIN_BASE}\\%%~nxI (del /S ${MED_BIN_BASE}\\%%~nxI & mklink /H ${MED_BIN_BASE}\\%%~nxI %%~fI) else mklink /H ${MED_BIN_BASE}\\%%~nxI %%~fI) + COMMAND for %%I in ( ${QT5_BIN_BASE}\\bin\\*.dll ) do (if EXIST ${MED_BIN_BASE}\\%%~nxI (del /S ${MED_BIN_BASE}\\%%~nxI & mklink /H ${MED_BIN_BASE}\\%%~nxI %%~fI) else mklink /H ${MED_BIN_BASE}\\%%~nxI %%~fI) COMMAND for %%I in ( ${PYNCPP_BIN_BASE}\\bin\\*.dll ) do (if EXIST ${MED_BIN_BASE}\\%%~nxI (del /S ${MED_BIN_BASE}\\%%~nxI & mklink /H ${MED_BIN_BASE}\\%%~nxI %%~fI) else mklink /H ${MED_BIN_BASE}\\%%~nxI %%~fI) ) endif()