13 #ifndef mitkImageAccessByItk_h
14 #define mitkImageAccessByItk_h
16 #include <itkCastImageFilter.h>
19 #include <boost/preprocessor/expand.hpp>
20 #include <boost/preprocessor/seq/for_each.hpp>
21 #include <boost/preprocessor/seq/for_each_product.hpp>
22 #include <boost/preprocessor/seq/to_tuple.hpp>
23 #include <boost/preprocessor/stringize.hpp>
24 #include <boost/preprocessor/tuple/rem.hpp>
48 #define _accessByItkPixelTypeException(pixelType, pixelTypeSeq) \
50 std::string msg("Pixel type "); \
51 msg.append(pixelType.GetPixelTypeAsString()); \
52 msg.append(" is not in " BOOST_PP_STRINGIZE(pixelTypeSeq)); \
53 throw mitk::AccessByItkException(msg); \
56 #define _accessByItkDimensionException(dim, validDims) \
58 std::stringstream msg; \
59 msg << "Dimension " << (dim) << " is not in " << validDims; \
60 throw mitk::AccessByItkException(msg.str()); \
63 #define _checkSpecificDimensionIter(r, mitkImage, dim) \
64 if (mitkImage->GetDimension() == dim) \
68 #define _checkSpecificDimension(mitkImage, dimSeq) \
69 BOOST_PP_SEQ_FOR_EACH(_checkSpecificDimensionIter, mitkImage, dimSeq) \
70 _accessByItkDimensionException(mitkImage->GetDimension(), BOOST_PP_STRINGIZE(dimSeq))
72 #define _msvc_expand_bug(macro, arg) BOOST_PP_EXPAND(macro arg)
76 #define _accessByItk(itkImageTypeFunctionAndImageSeq, pixeltype, dimension) \
77 if (pixelType == mitk::MakePixelType<pixeltype, dimension>(pixelType.GetNumberOfComponents()) && \
78 BOOST_PP_SEQ_TAIL(itkImageTypeFunctionAndImageSeq)->GetDimension() == dimension) \
80 BOOST_PP_SEQ_HEAD(itkImageTypeFunctionAndImageSeq) \
81 (mitk::ImageToItkImage<pixeltype, dimension>(BOOST_PP_SEQ_TAIL(itkImageTypeFunctionAndImageSeq)).GetPointer()); \
85 #define _accessByItkArgs(itkImageTypeFunction, type) (itkImageTypeFunction, BOOST_PP_TUPLE_REM(2) type)
89 #define _accessByItkProductIter(r, product) \
92 _msvc_expand_bug(_accessByItkArgs, (BOOST_PP_SEQ_HEAD(product), BOOST_PP_SEQ_TO_TUPLE(BOOST_PP_SEQ_TAIL(product)))))
94 #define _accessByItkProductIter(r, product) \
96 _accessByItk _accessByItkArgs(BOOST_PP_SEQ_HEAD(product), BOOST_PP_SEQ_TO_TUPLE(BOOST_PP_SEQ_TAIL(product))))
99 #define _accessFixedTypeByItk(itkImageTypeFunction, mitkImage, pixelTypeSeq, dimSeq) \
100 BOOST_PP_SEQ_FOR_EACH_PRODUCT(_accessByItkProductIter, (((itkImageTypeFunction)(mitkImage)))(pixelTypeSeq)(dimSeq))
104 #define _accessByItk_n(itkImageTypeFunctionAndImageSeq, pixeltype, dimension, args) \
105 if (pixelType == mitk::MakePixelType<pixeltype, dimension>(pixelType.GetNumberOfComponents()) && \
106 BOOST_PP_SEQ_TAIL(itkImageTypeFunctionAndImageSeq)->GetDimension() == dimension) \
108 BOOST_PP_SEQ_HEAD(itkImageTypeFunctionAndImageSeq) \
109 (mitk::ImageToItkImage<pixeltype, dimension>(BOOST_PP_SEQ_TAIL(itkImageTypeFunctionAndImageSeq)).GetPointer(), \
110 BOOST_PP_TUPLE_REM(BOOST_PP_SEQ_HEAD(args)) BOOST_PP_SEQ_TAIL(args)); \
114 #define _accessByItkArgs_n(itkImageTypeFunction, type, args) (itkImageTypeFunction, BOOST_PP_TUPLE_REM(2) type, args)
119 #define _accessByItkProductIter_n(r, product) \
120 _msvc_expand_bug(_accessByItk_n, \
121 _msvc_expand_bug(_accessByItkArgs_n, \
122 (BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_HEAD(product)), \
123 BOOST_PP_SEQ_TO_TUPLE(BOOST_PP_SEQ_TAIL(product)), \
124 BOOST_PP_SEQ_TAIL(BOOST_PP_SEQ_HEAD(product)))))
126 #define _accessByItkProductIter_n(r, product) \
127 BOOST_PP_EXPAND(_accessByItk_n _accessByItkArgs_n(BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_HEAD(product)), \
128 BOOST_PP_SEQ_TO_TUPLE(BOOST_PP_SEQ_TAIL(product)), \
129 BOOST_PP_SEQ_TAIL(BOOST_PP_SEQ_HEAD(product))))
132 #define _accessFixedTypeByItk_n(itkImageTypeFunction, mitkImage, pixelTypeSeq, dimSeq, va_tuple) \
133 BOOST_PP_SEQ_FOR_EACH_PRODUCT( \
134 _accessByItkProductIter_n, \
135 ((((itkImageTypeFunction)(mitkImage))(MITK_PP_ARG_COUNT va_tuple)va_tuple))(pixelTypeSeq)(dimSeq))
188 #define AccessByItk(mitkImage, itkImageTypeFunction) \
189 AccessFixedTypeByItk( \
190 mitkImage, itkImageTypeFunction, MITK_ACCESSBYITK_PIXEL_TYPES_SEQ, MITK_ACCESSBYITK_DIMENSIONS_SEQ)
213 #define AccessFixedPixelTypeByItk(mitkImage, itkImageTypeFunction, pixelTypeSeq) \
214 AccessFixedTypeByItk(mitkImage, itkImageTypeFunction, pixelTypeSeq, MITK_ACCESSBYITK_DIMENSIONS_SEQ)
230 #define AccessIntegralPixelTypeByItk(mitkImage, itkImageTypeFunction) \
231 AccessFixedTypeByItk( \
232 mitkImage, itkImageTypeFunction, MITK_ACCESSBYITK_INTEGRAL_PIXEL_TYPES_SEQ, MITK_ACCESSBYITK_DIMENSIONS_SEQ)
248 #define AccessFloatingPixelTypeByItk(mitkImage, itkImageTypeFunction) \
249 AccessFixedTypeByItk( \
250 mitkImage, itkImageTypeFunction, MITK_ACCESSBYITK_FLOATING_PIXEL_TYPES_SEQ, MITK_ACCESSBYITK_DIMENSIONS_SEQ)
252 #define AccessVectorPixelTypeByItk(mitkImage, itkImageTypeFunction) \
253 AccessFixedTypeByItk( \
254 mitkImage, itkImageTypeFunction, MITK_ACCESSBYITK_VECTOR_PIXEL_TYPES_SEQ, MITK_ACCESSBYITK_DIMENSIONS_SEQ)
277 #define AccessFixedDimensionByItk(mitkImage, itkImageTypeFunction, dimension) \
278 AccessFixedTypeByItk(mitkImage, itkImageTypeFunction, MITK_ACCESSBYITK_PIXEL_TYPES_SEQ, (dimension))
280 #define AccessVectorFixedDimensionByItk(mitkImage, itkImageTypeFunction, dimension) \
281 AccessFixedTypeByItk(mitkImage, itkImageTypeFunction, MITK_ACCESSBYITK_VECTOR_PIXEL_TYPES_SEQ, (dimension))
314 #define AccessFixedTypeByItk(mitkImage, itkImageTypeFunction, pixelTypeSeq, dimSeq) \
317 const mitk::PixelType &pixelType = mitkImage->GetPixelType(); \
318 _checkSpecificDimension(mitkImage, dimSeq); \
319 _accessFixedTypeByItk(itkImageTypeFunction, mitkImage, pixelTypeSeq, dimSeq) \
320 _accessByItkPixelTypeException(mitkImage->GetPixelType(), pixelTypeSeq) \
372 #define AccessByItk_n(mitkImage, itkImageTypeFunction, va_tuple) \
373 AccessFixedTypeByItk_n( \
374 mitkImage, itkImageTypeFunction, MITK_ACCESSBYITK_PIXEL_TYPES_SEQ, MITK_ACCESSBYITK_DIMENSIONS_SEQ, va_tuple)
400 #define AccessFixedPixelTypeByItk_n(mitkImage, itkImageTypeFunction, pixelTypeSeq, va_tuple) \
401 AccessFixedTypeByItk_n(mitkImage, itkImageTypeFunction, pixelTypeSeq, MITK_ACCESSBYITK_DIMENSIONS_SEQ, va_tuple)
420 #define AccessIntegralPixelTypeByItk_n(mitkImage, itkImageTypeFunction, va_tuple) \
421 AccessFixedTypeByItk_n(mitkImage, \
422 itkImageTypeFunction, \
423 MITK_ACCESSBYITK_INTEGRAL_PIXEL_TYPES_SEQ, \
424 MITK_ACCESSBYITK_DIMENSIONS_SEQ, \
444 #define AccessFloatingPixelTypeByItk_n(mitkImage, itkImageTypeFunction, va_tuple) \
445 AccessFixedTypeByItk_n(mitkImage, \
446 itkImageTypeFunction, \
447 MITK_ACCESSBYITK_FLOATING_PIXEL_TYPES_SEQ, \
448 MITK_ACCESSBYITK_DIMENSIONS_SEQ, \
466 #define AccessVectorPixelTypeByItk_n(mitkImage, itkImageTypeFunction, va_tuple) \
467 AccessFixedTypeByItk_n(mitkImage, \
468 itkImageTypeFunction, \
469 MITK_ACCESSBYITK_VECTOR_PIXEL_TYPES_SEQ, \
470 MITK_ACCESSBYITK_DIMENSIONS_SEQ, \
497 #define AccessFixedDimensionByItk_n(mitkImage, itkImageTypeFunction, dimension, va_tuple) \
498 AccessFixedTypeByItk_n(mitkImage, itkImageTypeFunction, MITK_ACCESSBYITK_PIXEL_TYPES_SEQ, (dimension), va_tuple)
523 #define AccessVectorFixedDimensionByItk_n(mitkImage, itkImageTypeFunction, dimension, va_tuple) \
524 AccessFixedTypeByItk_n( \
525 mitkImage, itkImageTypeFunction, MITK_ACCESSBYITK_VECTOR_PIXEL_TYPES_SEQ, (dimension), va_tuple)
554 #define AccessFixedTypeByItk_n(mitkImage, itkImageTypeFunction, pixelTypeSeq, dimSeq, va_tuple) \
557 const mitk::PixelType &pixelType = mitkImage->GetPixelType(); \
558 _checkSpecificDimension(mitkImage, dimSeq); \
559 _accessFixedTypeByItk_n(itkImageTypeFunction, mitkImage, pixelTypeSeq, dimSeq, va_tuple) \
560 _accessByItkPixelTypeException(mitkImage->GetPixelType(), pixelTypeSeq) \
565 #define AccessByItk_1(mitkImage, itkImageTypeFunction, arg1) AccessByItk_n(mitkImage, itkImageTypeFunction, (arg1))
566 #define AccessFixedPixelTypeByItk_1(mitkImage, itkImageTypeFunction, pixelTypeSeq, arg1) \
567 AccessFixedPixelTypeByItk_n(mitkImage, itkImageTypeFunction, pixelTypeSeq, (arg1))
568 #define AccessFixedDimensionByItk_1(mitkImage, itkImageTypeFunction, dimension, arg1) \
569 AccessFixedDimensionByItk_n(mitkImage, itkImageTypeFunction, dimension, (arg1))
570 #define AccessFixedTypeByItk_1(mitkImage, itkImageTypeFunction, pixelTypeSeq, dimSeq, arg1) \
571 AccessFixedTypeByItk_n(mitkImage, itkImageTypeFunction, pixelTypeSeq, dimSeq, (arg1))
573 #define AccessByItk_2(mitkImage, itkImageTypeFunction, arg1, arg2) \
574 AccessByItk_n(mitkImage, itkImageTypeFunction, (arg1, arg2))
575 #define AccessFixedPixelTypeByItk_2(mitkImage, itkImageTypeFunction, pixelTypeSeq, arg1, arg2) \
576 AccessFixedPixelTypeByItk_n(mitkImage, itkImageTypeFunction, pixelTypeSeq, (arg1, arg2))
577 #define AccessFixedDimensionByItk_2(mitkImage, itkImageTypeFunction, dimension, arg1, arg2) \
578 AccessFixedDimensionByItk_n(mitkImage, itkImageTypeFunction, dimension, (arg1, arg2))
579 #define AccessFixedTypeByItk_2(mitkImage, itkImageTypeFunction, pixelTypeSeq, dimSeq, arg1, arg2) \
580 AccessFixedTypeByItk_n(mitkImage, itkImageTypeFunction, pixelTypeSeq, dimSeq, (arg1, arg2))
582 #define AccessByItk_3(mitkImage, itkImageTypeFunction, arg1, arg2, arg3) \
583 AccessByItk_n(mitkImage, itkImageTypeFunction, (arg1, arg2, arg3))
584 #define AccessFixedPixelTypeByItk_3(mitkImage, itkImageTypeFunction, pixelTypeSeq, arg1, arg2, arg3) \
585 AccessFixedPixelTypeByItk_n(mitkImage, itkImageTypeFunction, pixelTypeSeq, (arg1, arg2, arg3))
586 #define AccessFixedDimensionByItk_3(mitkImage, itkImageTypeFunction, dimension, arg1, arg2, arg3) \
587 AccessFixedDimensionByItk_n(mitkImage, itkImageTypeFunction, dimension, (arg1, arg2, arg3))
588 #define AccessFixedTypeByItk_3(mitkImage, itkImageTypeFunction, pixelTypeSeq, dimSeq, arg1, arg2, arg3) \
589 AccessFixedTypeByItk_n(mitkImage, itkImageTypeFunction, pixelTypeSeq, dimSeq, (arg1, arg2, arg3))
595 #define _accessTwoImagesByItk(itkImageTypeFunction, pixeltype1, dim1, pixeltype2, dim2) \
596 if (pixelType1 == mitk::MakePixelType<itk::Image<pixeltype1, dim1>>() && \
597 pixelType2 == mitk::MakePixelType<itk::Image<pixeltype2, dim2>>() && constImage1->GetDimension() == dim1 && \
598 constImage2->GetDimension() == dim2) \
600 typedef itk::Image<pixeltype1, dim1> ImageType1; \
601 typedef itk::Image<pixeltype2, dim2> ImageType2; \
602 typedef mitk::ImageToItk<ImageType1> ImageToItkType1; \
603 typedef mitk::ImageToItk<ImageType2> ImageToItkType2; \
604 itk::SmartPointer<ImageToItkType1> imagetoitk1 = ImageToItkType1::New(); \
605 imagetoitk1->SetInput(nonConstImage1); \
606 imagetoitk1->Update(); \
607 itk::SmartPointer<ImageToItkType2> imagetoitk2 = ImageToItkType2::New(); \
608 imagetoitk2->SetInput(nonConstImage2); \
609 imagetoitk2->Update(); \
610 itkImageTypeFunction(imagetoitk1->GetOutput(), imagetoitk2->GetOutput()); \
614 #define _accessTwoImagesByItkArgs2(itkImageTypeFunction, type1, type2) \
615 (itkImageTypeFunction, BOOST_PP_TUPLE_REM(2) type1, BOOST_PP_TUPLE_REM(2) type2)
617 #define _accessTwoImagesByItkArgs(product) \
618 BOOST_PP_EXPAND(_accessTwoImagesByItkArgs2 BOOST_PP_EXPAND( \
619 (BOOST_PP_SEQ_HEAD(product), BOOST_PP_TUPLE_REM(2) BOOST_PP_SEQ_TO_TUPLE(BOOST_PP_SEQ_TAIL(product)))))
623 #define _accessTwoImagesByItkIter(r, product) \
624 BOOST_PP_EXPAND(_accessTwoImagesByItk _msvc_expand_bug( \
625 _accessTwoImagesByItkArgs2, \
626 (BOOST_PP_SEQ_HEAD(product), \
627 _msvc_expand_bug(BOOST_PP_TUPLE_REM(2), BOOST_PP_EXPAND(BOOST_PP_SEQ_TO_TUPLE(BOOST_PP_SEQ_TAIL(product)))))))
629 #define _accessTwoImagesByItkIter(r, product) BOOST_PP_EXPAND(_accessTwoImagesByItk _accessTwoImagesByItkArgs(product))
632 #define _accessTwoImagesByItkForEach(itkImageTypeFunction, tseq1, tseq2) \
633 BOOST_PP_SEQ_FOR_EACH_PRODUCT(_accessTwoImagesByItkIter, ((itkImageTypeFunction))(tseq1)(tseq2))
681 #define AccessTwoImagesFixedDimensionByItk(mitkImage1, mitkImage2, itkImageTypeFunction, dimension) \
684 const mitk::PixelType &pixelType1 = mitkImage1->GetPixelType(); \
685 const mitk::PixelType &pixelType2 = mitkImage2->GetPixelType(); \
686 const mitk::Image *constImage1 = mitkImage1; \
687 const mitk::Image *constImage2 = mitkImage2; \
688 mitk::Image *nonConstImage1 = const_cast<mitk::Image *>(constImage1); \
689 mitk::Image *nonConstImage2 = const_cast<mitk::Image *>(constImage2); \
690 nonConstImage1->Update(); \
691 nonConstImage2->Update(); \
692 _checkSpecificDimension(mitkImage1, (dimension)); \
693 _checkSpecificDimension(mitkImage2, (dimension)); \
694 _accessTwoImagesByItkForEach( \
695 itkImageTypeFunction, MITK_ACCESSBYITK_TYPES_DIMN_SEQ(dimension), MITK_ACCESSBYITK_TYPES_DIMN_SEQ(dimension)) \
697 std::string msg("Pixel type "); \
698 msg.append(pixelType1.GetComponentTypeAsString()); \
699 msg.append(" or pixel type "); \
700 msg.append(pixelType2.GetComponentTypeAsString()); \
701 msg.append(" is not in " BOOST_PP_STRINGIZE(MITK_ACCESSBYITK_TYPES_DIMN_SEQ(dimension))); \
702 throw mitk::AccessByItkException(msg); \
Exception class thrown in AccessByItk macros.
AccessByItkException(const std::string &msg)
~AccessByItkException() override
Find image slices visible on a given plane.