diff --git a/.github/workflows/build-test-package.yml b/.github/workflows/build-test-package.yml index 7a8e4a12..7cef0fd3 100644 --- a/.github/workflows/build-test-package.yml +++ b/.github/workflows/build-test-package.yml @@ -11,14 +11,23 @@ on: - main jobs: - cxx-build-workflow: - uses: InsightSoftwareConsortium/ITKRemoteModuleBuildTestPackageAction/.github/workflows/build-test-cxx.yml@v5.4.4 + cxx-build-workflow-itk5: + uses: InsightSoftwareConsortium/ITKRemoteModuleBuildTestPackageAction/.github/workflows/build-test-cxx.yml@v5.4.6 - python-build-workflow: - uses: InsightSoftwareConsortium/ITKRemoteModuleBuildTestPackageAction/.github/workflows/build-test-package-python.yml@v5.4.4 + cxx-build-workflow-itk6: + uses: InsightSoftwareConsortium/ITKRemoteModuleBuildTestPackageAction/.github/workflows/build-test-cxx.yml@v6.0b02 + with: + # ITK main as of 2026-10-01; the action's own default predates v6.0b02. Replace with v6.0.0 once released. + itk-git-tag: '5d31af3cfdf2071d14dfc331d169111487b80597' + + python-build-workflow-itk5: + uses: InsightSoftwareConsortium/ITKRemoteModuleBuildTestPackageAction/.github/workflows/build-test-package-python.yml@v5.4.6 + with: + test-notebooks: false + + python-build-workflow-itk6: + uses: InsightSoftwareConsortium/ITKRemoteModuleBuildTestPackageAction/.github/workflows/build-test-package-python.yml@v6.0b02 with: - itk-wheel-tag: 'v5.4.5' - itk-python-package-tag: 'v5.4.5' test-notebooks: false secrets: pypi_password: ${{ secrets.pypi_password }} diff --git a/CMakeLists.txt b/CMakeLists.txt index ef2ae9ae..a27deba3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,7 +3,6 @@ project(LesionSizingToolkit) if(NOT ITK_SOURCE_DIR) find_package(ITK REQUIRED) - include(${ITK_USE_FILE}) list(APPEND CMAKE_MODULE_PATH ${ITK_CMAKE_DIR}) include(ITKModuleExternal) else() diff --git a/include/itkRegionCompetitionImageFilter.hxx b/include/itkRegionCompetitionImageFilter.hxx index bf5338c6..53087691 100644 --- a/include/itkRegionCompetitionImageFilter.hxx +++ b/include/itkRegionCompetitionImageFilter.hxx @@ -24,6 +24,8 @@ #include "itkNeighborhoodAlgorithm.h" #include "itkOffset.h" +#include + namespace itk { @@ -459,9 +461,7 @@ RegionCompetitionImageFilter::ComputeArrayOfNeighborh // Copy the offsets from the Input image. // We assume that they are the same for the output image. // - const size_t sizeOfOffsetTableInBytes = (InputImageDimension + 1) * sizeof(unsigned long); - - memcpy(this->m_OffsetTable, this->m_OutputImage->GetOffsetTable(), sizeOfOffsetTableInBytes); + std::copy_n(this->m_OutputImage->GetOffsetTable(), InputImageDimension + 1, this->m_OffsetTable); // @@ -482,7 +482,7 @@ RegionCompetitionImageFilter::ComputeArrayOfNeighborh { NeighborOffsetType offset = this->m_Neighborhood.GetOffset(i); - signed int bufferOffset = 0; // must be a signed number + OffsetValueType bufferOffset = 0; for (unsigned int d = 0; d < InputImageDimension; d++) { diff --git a/include/itkVotingBinaryHoleFillFloodingImageFilter.hxx b/include/itkVotingBinaryHoleFillFloodingImageFilter.hxx index 760112d7..6863d916 100644 --- a/include/itkVotingBinaryHoleFillFloodingImageFilter.hxx +++ b/include/itkVotingBinaryHoleFillFloodingImageFilter.hxx @@ -25,6 +25,8 @@ #include "itkOffset.h" #include "itkProgressReporter.h" +#include + namespace itk { @@ -414,9 +416,7 @@ VotingBinaryHoleFillFloodingImageFilter::ComputeArray // Copy the offsets from the Input image. // We assume that they are the same for the output image. // - const size_t sizeOfOffsetTableInBytes = (InputImageDimension + 1) * sizeof(unsigned long); - - memcpy(this->m_OffsetTable, this->m_OutputImage->GetOffsetTable(), sizeOfOffsetTableInBytes); + std::copy_n(this->m_OutputImage->GetOffsetTable(), InputImageDimension + 1, this->m_OffsetTable); // @@ -437,7 +437,7 @@ VotingBinaryHoleFillFloodingImageFilter::ComputeArray { NeighborOffsetType offset = this->m_Neighborhood.GetOffset(i); - signed int bufferOffset = 0; // must be a signed number + OffsetValueType bufferOffset = 0; for (unsigned int d = 0; d < InputImageDimension; d++) { diff --git a/pyproject.toml b/pyproject.toml index 48f114bd..ef26862d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ requires = ["scikit-build-core"] build-backend = "scikit_build_core.build" [project] -name = "lesionsizingtoolkit" +name = "itk-lesionsizingtoolkit" version = "1.0.1" description = "A generic and extensible ITK module for lesion segmentation" readme = "README.rst" diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 3de6d09e..9a976e31 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,31 +1,39 @@ include_directories("${LesionSizingToolkit_SOURCE_DIR}/src") # to include itkIncludeRequiredIOFactories.h include_directories("${LesionSizingToolkit_SOURCE_DIR}/include") +# ITK 6 exports one interface library per module; ITK 5.4 provides only the list variable. +if(TARGET ITK::LesionSizingToolkitModule) + set(_lstk_libraries ITK::LesionSizingToolkitModule) +elseif(TARGET LesionSizingToolkitModule) + set(_lstk_libraries LesionSizingToolkitModule) +else() + set(_lstk_libraries ${LesionSizingToolkit_LIBRARIES}) +endif() add_executable(itkCannyEdgeDetectionImageFilter1 itkCannyEdgeDetectionImageFilter1.cxx ) -target_link_libraries(itkCannyEdgeDetectionImageFilter1 ITK::LesionSizingToolkitModule ${ITK_LIBRARIES}) +target_link_libraries(itkCannyEdgeDetectionImageFilter1 ${_lstk_libraries} ${ITK_LIBRARIES}) add_executable(itkCannyEdgeDetectionImageFilter2 itkCannyEdgeDetectionImageFilter2.cxx ) -target_link_libraries(itkCannyEdgeDetectionImageFilter2 ITK::LesionSizingToolkitModule ${ITK_LIBRARIES}) +target_link_libraries(itkCannyEdgeDetectionImageFilter2 ${_lstk_libraries} ${ITK_LIBRARIES}) add_executable(itkDicomSeriesReadImageWrite itkDicomSeriesReadImageWrite.cxx) -target_link_libraries(itkDicomSeriesReadImageWrite ITK::LesionSizingToolkitModule ${ITK_LIBRARIES}) +target_link_libraries(itkDicomSeriesReadImageWrite ${_lstk_libraries} ${ITK_LIBRARIES}) add_executable(itkGradientMagnitudeImageFilter itkGradientMagnitudeImageFilter.cxx) -target_link_libraries(itkGradientMagnitudeImageFilter ITK::LesionSizingToolkitModule ${ITK_LIBRARIES}) +target_link_libraries(itkGradientMagnitudeImageFilter ${_lstk_libraries} ${ITK_LIBRARIES}) add_executable(itkGradientMagnitudeRecursiveGaussianImageFilter itkGradientMagnitudeRecursiveGaussianImageFilter.cxx) -target_link_libraries(itkGradientMagnitudeRecursiveGaussianImageFilter ITK::LesionSizingToolkitModule ${ITK_LIBRARIES}) +target_link_libraries(itkGradientMagnitudeRecursiveGaussianImageFilter ${_lstk_libraries} ${ITK_LIBRARIES}) add_executable(itkImageReadRegionOfInterestAroundSeedWrite itkImageReadRegionOfInterestAroundSeedWrite.cxx) -target_link_libraries(itkImageReadRegionOfInterestAroundSeedWrite ITK::LesionSizingToolkitModule ${ITK_LIBRARIES}) +target_link_libraries(itkImageReadRegionOfInterestAroundSeedWrite ${_lstk_libraries} ${ITK_LIBRARIES}) add_executable(itkImageReadRegionOfInterestWrite itkImageReadRegionOfInterestWrite.cxx) -target_link_libraries(itkImageReadRegionOfInterestWrite ITK::LesionSizingToolkitModule ${ITK_LIBRARIES}) +target_link_libraries(itkImageReadRegionOfInterestWrite ${_lstk_libraries} ${ITK_LIBRARIES}) add_executable(itkImageReadWrite itkImageReadWrite.cxx) -target_link_libraries(itkImageReadWrite ITK::LesionSizingToolkitModule ${ITK_LIBRARIES}) +target_link_libraries(itkImageReadWrite ${_lstk_libraries} ${ITK_LIBRARIES}) add_executable(itkLaplacianRecursiveGaussianImageFilter itkLaplacianRecursiveGaussianImageFilter.cxx) -target_link_libraries(itkLaplacianRecursiveGaussianImageFilter ITK::LesionSizingToolkitModule ${ITK_LIBRARIES}) +target_link_libraries(itkLaplacianRecursiveGaussianImageFilter ${_lstk_libraries} ${ITK_LIBRARIES}) add_executable(itkResampleVolumeToBeIsotropic itkResampleVolumeToBeIsotropic.cxx) -target_link_libraries(itkResampleVolumeToBeIsotropic ITK::LesionSizingToolkitModule ${ITK_LIBRARIES}) +target_link_libraries(itkResampleVolumeToBeIsotropic ${_lstk_libraries} ${ITK_LIBRARIES}) diff --git a/test/itkDescoteauxSheetnessFeatureGeneratorMultiScaleTest1.cxx b/test/itkDescoteauxSheetnessFeatureGeneratorMultiScaleTest1.cxx index 5edf5fef..62278003 100644 --- a/test/itkDescoteauxSheetnessFeatureGeneratorMultiScaleTest1.cxx +++ b/test/itkDescoteauxSheetnessFeatureGeneratorMultiScaleTest1.cxx @@ -60,7 +60,7 @@ itkDescoteauxSheetnessFeatureGeneratorMultiScaleTest1(int argc, char * argv[]) AggregatorType::Pointer featureAggregator = AggregatorType::New(); - ITK_EXERCISE_BASIC_OBJECT_METHODS(featureAggregator, MaximumFeatureAggregator, UnaryFunctorImageFilter); + ITK_EXERCISE_BASIC_OBJECT_METHODS(featureAggregator, MaximumFeatureAggregator, FeatureAggregator); using DescoteauxSheetnessFeatureGeneratorType = itk::DescoteauxSheetnessFeatureGenerator; using SpatialObjectType = DescoteauxSheetnessFeatureGeneratorType::SpatialObjectType; diff --git a/test/itkFeatureAggregatorTest1.cxx b/test/itkFeatureAggregatorTest1.cxx index a341466b..207a1138 100644 --- a/test/itkFeatureAggregatorTest1.cxx +++ b/test/itkFeatureAggregatorTest1.cxx @@ -158,18 +158,19 @@ itkFeatureAggregatorTest1(int argc, char * argv[]) using VesselnessGeneratorType = itk::SatoVesselnessSigmoidFeatureGenerator; VesselnessGeneratorType::Pointer vesselnessGenerator = VesselnessGeneratorType::New(); - ITK_EXERCISE_BASIC_OBJECT_METHODS(vesselnessGenerator, SatoVesselnessSigmoidFeatureGenerator, FeatureAggregator); + ITK_EXERCISE_BASIC_OBJECT_METHODS( + vesselnessGenerator, SatoVesselnessSigmoidFeatureGenerator, SatoVesselnessFeatureGenerator); using LungWallGeneratorType = itk::LungWallFeatureGenerator; LungWallGeneratorType::Pointer lungWallGenerator = LungWallGeneratorType::New(); - ITK_EXERCISE_BASIC_OBJECT_METHODS(lungWallGenerator, LungWallFeatureGenerator, FeatureAggregator); + ITK_EXERCISE_BASIC_OBJECT_METHODS(lungWallGenerator, LungWallFeatureGenerator, FeatureGenerator); using SigmoidFeatureGeneratorType = itk::SigmoidFeatureGenerator; SigmoidFeatureGeneratorType::Pointer sigmoidGenerator = SigmoidFeatureGeneratorType::New(); - ITK_EXERCISE_BASIC_OBJECT_METHODS(sigmoidGenerator, SigmoidFeatureGenerator, FeatureAggregator); + ITK_EXERCISE_BASIC_OBJECT_METHODS(sigmoidGenerator, SigmoidFeatureGenerator, FeatureGenerator); featureAggregator->AddFeatureGenerator(lungWallGenerator); featureAggregator->AddFeatureGenerator(vesselnessGenerator); diff --git a/test/itkLesionSegmentationMethodTest10.cxx b/test/itkLesionSegmentationMethodTest10.cxx index 48e506b5..f12fa341 100644 --- a/test/itkLesionSegmentationMethodTest10.cxx +++ b/test/itkLesionSegmentationMethodTest10.cxx @@ -73,7 +73,7 @@ itkLesionSegmentationMethodTest10(int argc, char * argv[]) MethodType::Pointer lesionSegmentationMethod = MethodType::New(); - ITK_EXERCISE_BASIC_OBJECT_METHODS(lesionSegmentationMethod, LesionSegmentationMethod, LightObject); + ITK_EXERCISE_BASIC_OBJECT_METHODS(lesionSegmentationMethod, LesionSegmentationMethod, ProcessObject); using ImageMaskSpatialObjectType = itk::ImageMaskSpatialObject; diff --git a/test/itkSatoVesselnessSigmoidFeatureGeneratorMultiScaleTest1.cxx b/test/itkSatoVesselnessSigmoidFeatureGeneratorMultiScaleTest1.cxx index 206214c6..ada025e8 100644 --- a/test/itkSatoVesselnessSigmoidFeatureGeneratorMultiScaleTest1.cxx +++ b/test/itkSatoVesselnessSigmoidFeatureGeneratorMultiScaleTest1.cxx @@ -57,19 +57,23 @@ itkSatoVesselnessSigmoidFeatureGeneratorMultiScaleTest1(int argc, char * argv[]) FeatureGeneratorType::Pointer featureGenerator1 = FeatureGeneratorType::New(); - ITK_EXERCISE_BASIC_OBJECT_METHODS(featureGenerator1, SatoVesselnessSigmoidFeatureGenerator, FeatureGenerator); + ITK_EXERCISE_BASIC_OBJECT_METHODS( + featureGenerator1, SatoVesselnessSigmoidFeatureGenerator, SatoVesselnessFeatureGenerator); FeatureGeneratorType::Pointer featureGenerator2 = FeatureGeneratorType::New(); - ITK_EXERCISE_BASIC_OBJECT_METHODS(featureGenerator2, SatoVesselnessSigmoidFeatureGenerator, FeatureGenerator); + ITK_EXERCISE_BASIC_OBJECT_METHODS( + featureGenerator2, SatoVesselnessSigmoidFeatureGenerator, SatoVesselnessFeatureGenerator); FeatureGeneratorType::Pointer featureGenerator3 = FeatureGeneratorType::New(); - ITK_EXERCISE_BASIC_OBJECT_METHODS(featureGenerator3, SatoVesselnessSigmoidFeatureGenerator, FeatureGenerator); + ITK_EXERCISE_BASIC_OBJECT_METHODS( + featureGenerator3, SatoVesselnessSigmoidFeatureGenerator, SatoVesselnessFeatureGenerator); FeatureGeneratorType::Pointer featureGenerator4 = FeatureGeneratorType::New(); - ITK_EXERCISE_BASIC_OBJECT_METHODS(featureGenerator4, SatoVesselnessSigmoidFeatureGenerator, FeatureGenerator); + ITK_EXERCISE_BASIC_OBJECT_METHODS( + featureGenerator4, SatoVesselnessSigmoidFeatureGenerator, SatoVesselnessFeatureGenerator); double smallestSigma = 1.0; diff --git a/wrapping/itkCannyEdgeDetectionRecursiveGaussianImageFilter.wrap b/wrapping/itkCannyEdgeDetectionRecursiveGaussianImageFilter.wrap index 299a54bb..c88f5a5d 100644 --- a/wrapping/itkCannyEdgeDetectionRecursiveGaussianImageFilter.wrap +++ b/wrapping/itkCannyEdgeDetectionRecursiveGaussianImageFilter.wrap @@ -1,3 +1,3 @@ itk_wrap_class("itk::CannyEdgeDetectionRecursiveGaussianImageFilter" POINTER) - itk_wrap_image_filter("${WRAP_ITK_SCALAR}" 2+) + itk_wrap_image_filter("${WRAP_ITK_REAL}" 2+) itk_end_wrap_class() diff --git a/wrapping/itkLesionSegmentationImageFilter8.wrap b/wrapping/itkLesionSegmentationImageFilter8.wrap index b0f8f8c6..e6161cf0 100644 --- a/wrapping/itkLesionSegmentationImageFilter8.wrap +++ b/wrapping/itkLesionSegmentationImageFilter8.wrap @@ -1,3 +1,3 @@ itk_wrap_class("itk::LesionSegmentationImageFilter8" POINTER) - itk_wrap_image_filter_combinations("${WRAP_ITK_SCALAR}" "${WRAP_ITK_REAL}" 3) + itk_wrap_image_filter_combinations("${WRAP_ITK_SCALAR}" "F" 3) itk_end_wrap_class()