MeVisLab Toolbox Reference
mlITKSupportMacrosP.h
Go to the documentation of this file.
1 /*************************************************************************************
2 **
3 ** Copyright 2007, MeVis Medical Solutions AG
4 **
5 ** The user may use this file in accordance with the license agreement provided with
6 ** the Software or, alternatively, in accordance with the terms contained in a
7 ** written agreement between the user and MeVis Medical Solutions AG.
8 **
9 ** For further information use the contact form at https://www.mevislab.de/contact
10 **
11 **************************************************************************************/
12 
13 #pragma once
14 
16 #include "mlInitSystemITKSupport.h"
17 
19 #include "mlModuleIncludes.h"
20 
22 #include <itkImage.h>
23 
24 //---------------------------------------------------------------------------
27 //---------------------------------------------------------------------------
28 #define _ML_INSTANTIATE_2D_CODE(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, USER_CODE2, CLASS_NAME, DIM) \
29  { \
30  switch (DIM){ \
31  case 2: USER_CODE2(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, 2, CLASS_NAME); break; \
32  default: \
33  ML_ITK_ML_PRINT_ERROR(#CLASS_NAME, ML_BAD_DIMENSION, "Ignoring case(_ML_INSTANTIATE_2D_CODE).", "DIM=", DIM); \
34  } \
35  }
36 
37 //---------------------------------------------------------------------------
40 //---------------------------------------------------------------------------
41 #define _ML_INSTANTIATE_3D_CODE(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, USER_CODE2, CLASS_NAME, DIM) \
42  { \
43  switch (DIM){ \
44  case 3: USER_CODE2(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, 3, CLASS_NAME); break; \
45  default: \
46  ML_ITK_ML_PRINT_ERROR(#CLASS_NAME, ML_BAD_DIMENSION, "Ignoring case(_ML_INSTANTIATE_3D_CODE).", "DIM=", DIM); \
47  } \
48  }
49 
50 //---------------------------------------------------------------------------
53 //---------------------------------------------------------------------------
54 #define _ML_INSTANTIATE_2D3D_CODE(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, USER_CODE2, CLASS_NAME, DIM) \
55  { \
56  switch (DIM){ \
57  case 2: USER_CODE2(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, 2, CLASS_NAME); break; \
58  case 3: USER_CODE2(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, 3, CLASS_NAME); break; \
59  default: \
60  ML_ITK_ML_PRINT_ERROR(#CLASS_NAME, ML_BAD_DIMENSION, "Ignoring case(_ML_INSTANTIATE_3D_CODE).", "DIM=", DIM); \
61  } \
62  }
63 
64 //---------------------------------------------------------------------------
67 //---------------------------------------------------------------------------
68 #define _ML_INSTANTIATE_6D_CODE(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, USER_CODE2, CLASS_NAME, DIM) \
69  { \
70  switch (DIM){ \
71  /* case 1: USER_CODE2(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, 1, CLASS_NAME); break;*/ \
72  case 2: USER_CODE2(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, 2, CLASS_NAME); break; \
73  case 3: USER_CODE2(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, 3, CLASS_NAME); break; \
74  /* case 4: USER_CODE2(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, 4, CLASS_NAME); break; */ \
75  /* case 5: USER_CODE2(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, 5, CLASS_NAME); break; */ \
76  case 6: USER_CODE2(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, 6, CLASS_NAME); break; \
77  default: \
78  ML_ITK_ML_PRINT_ERROR(#CLASS_NAME, ML_BAD_DIMENSION, "Ignoring case(_ML_INSTANTIATE_6D_CODE).", "DIM=", DIM); \
79  } \
80  }
81 
82 //---------------------------------------------------------------------------
85 //---------------------------------------------------------------------------
86 #define _ML_INSTANTIATE_6D_SAME_DIM_CODE(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, USER_CODE2, \
87  CLASS_NAME, DIM) \
88  { \
89  switch (DIM) { \
90  /* case 1: USER_CODE2(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, 1, CLASS_NAME); break;*/ \
91  case 2: \
92  if constexpr (MLINDATATYPE::Size == 2) { \
93  USER_CODE2(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, 2, CLASS_NAME); \
94  } else \
95  ML_ITK_ML_PRINT_ERROR(#CLASS_NAME, ML_BAD_DATA_TYPE, "Voxel type dimension must match image dimension"); \
96  break; \
97  case 3: \
98  if constexpr (MLINDATATYPE::Size == 3) { \
99  USER_CODE2(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, 3, CLASS_NAME); \
100  } else \
101  ML_ITK_ML_PRINT_ERROR(#CLASS_NAME, ML_BAD_DATA_TYPE, "Voxel type dimension must match image dimension"); \
102  break; \
103  /* case 4: USER_CODE2(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, 4, CLASS_NAME); break; */ \
104  /* case 5: USER_CODE2(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, 5, CLASS_NAME); break; */ \
105  case 6: \
106  if constexpr (MLINDATATYPE::Size == 6) { \
107  USER_CODE2(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, 6, CLASS_NAME); \
108  } else \
109  ML_ITK_ML_PRINT_ERROR(#CLASS_NAME, ML_BAD_DATA_TYPE, "Voxel type dimension must match image dimension"); \
110  break; \
111  default: \
112  ML_ITK_ML_PRINT_ERROR(#CLASS_NAME, ML_BAD_DIMENSION, "Ignoring case(_ML_INSTANTIATE_6D_SAME_DIM_CODE).", "DIM=", DIM); \
113  } \
114  }
115 
116 //------------------------------------------------------------------------------------
118 //------------------------------------------------------------------------------------
119 #define _ML_IMPLEMENT_ALL_ITK_CASES(INFO_STRING, USER_CODE, CLASS_NAME, DATATYPE_ENUM, DIM, DIM_INST)\
120  switch(DATATYPE_ENUM){ \
121  case MLint8Type: DIM_INST(MLint8 , MLint8 , MLint8 , MLint8 , USER_CODE, CLASS_NAME, DIM); break; \
122  case MLuint8Type: DIM_INST(MLuint8 , MLuint8 , MLuint8 , MLuint8 , USER_CODE, CLASS_NAME, DIM); break; \
123  case MLint16Type: DIM_INST(MLint16 , MLint16 , MLint16 , MLint16 , USER_CODE, CLASS_NAME, DIM); break; \
124  case MLuint16Type: DIM_INST(MLuint16 , MLuint16 , MLuint16 , MLuint16 , USER_CODE, CLASS_NAME, DIM); break; \
125  case MLint32Type: DIM_INST(MLint32 , MLint32 , MLint32 , MLint32 , USER_CODE, CLASS_NAME, DIM); break; \
126  case MLuint32Type: DIM_INST(MLuint32 , MLuint32 , MLuint32 , MLuint32 , USER_CODE, CLASS_NAME, DIM); break; \
127  case MLfloatType: DIM_INST(MLfloat , MLfloat , MLfloat , MLfloat , USER_CODE, CLASS_NAME, DIM); break; \
128  case MLdoubleType: DIM_INST(MLdouble , MLdouble , MLdouble , MLdouble , USER_CODE, CLASS_NAME, DIM); break; \
129  /* case MLldoubleType: DIM_INST(MLldouble , MLldouble , MLldouble , MLldouble, USER_CODE, CLASS_NAME, DIM); break; */ \
130  /* case MLint64Type: DIM_INST(MLint64 , MLint64 , MLint64 , MLint64 , USER_CODE, CLASS_NAME, DIM); break; */ \
131  /* case MLuint64Type: DIM_INST(MLuint64 , MLuint64 , MLuint64 , MLuint64 , USER_CODE, CLASS_NAME, DIM); break; */ \
132  default: { \
133  ML_ITK_ML_PRINT_ERROR(#CLASS_NAME, ML_BAD_DATA_TYPE, \
134  "Type case not executed(_ML_IMPLEMENT_ALL_ITK_CASES).", \
135  "DATATYPE_ENUM=", DATATYPE_ENUM, \
136  "DIM=", DIM); \
137  break; \
138  } \
139  } \
140 
141 //------------------------------------------------------------------------------------
143 //------------------------------------------------------------------------------------
144 #define ML_IMPLEMENT_ALL_ITK_2D_CASES(INFO_STRING, USER_CODE, CLASS_NAME, DATATYPE_ENUM, DIM)\
145  _ML_IMPLEMENT_ALL_ITK_CASES(INFO_STRING, USER_CODE, CLASS_NAME, DATATYPE_ENUM, DIM, _ML_INSTANTIATE_2D_CODE)
146 
147 //------------------------------------------------------------------------------------
149 //------------------------------------------------------------------------------------
150 #define ML_IMPLEMENT_ALL_ITK_3D_CASES(INFO_STRING, USER_CODE, CLASS_NAME, DATATYPE_ENUM, DIM)\
151  _ML_IMPLEMENT_ALL_ITK_CASES(INFO_STRING, USER_CODE, CLASS_NAME, DATATYPE_ENUM, DIM, _ML_INSTANTIATE_3D_CODE)
152 
153 //------------------------------------------------------------------------------------
155 //------------------------------------------------------------------------------------
156 #define ML_IMPLEMENT_ALL_ITK_2D3D_CASES(INFO_STRING, USER_CODE, CLASS_NAME, DATATYPE_ENUM, DIM)\
157  _ML_IMPLEMENT_ALL_ITK_CASES(INFO_STRING, USER_CODE, CLASS_NAME, DATATYPE_ENUM, DIM, _ML_INSTANTIATE_2D3D_CODE)
158 
159 //------------------------------------------------------------------------------------
161 //------------------------------------------------------------------------------------
162 #define ML_IMPLEMENT_ALL_ITK_6D_CASES(INFO_STRING, USER_CODE, CLASS_NAME, DATATYPE_ENUM, DIM)\
163  _ML_IMPLEMENT_ALL_ITK_CASES(INFO_STRING, USER_CODE, CLASS_NAME, DATATYPE_ENUM, DIM, _ML_INSTANTIATE_6D_CODE)
164 
165 //------------------------------------------------------------------------------------
167 //------------------------------------------------------------------------------------
168 #define ML_IMPLEMENT_ALL_ITK_6D_SAME_DIM_CASES(INFO_STRING, USER_CODE, CLASS_NAME, DATATYPE_ENUM, DIM) \
169  _ML_IMPLEMENT_ALL_ITK_CASES(INFO_STRING, USER_CODE, CLASS_NAME, DATATYPE_ENUM, DIM, _ML_INSTANTIATE_6D_SAME_DIM_CODE)
170 
171 
172 //---------------------------------------------------------------------------
174 //---------------------------------------------------------------------------
175 #define _TEMPLATE_INPUTS0 OutImageType
176 #define _TEMPLATE_INPUTS1 InImageType,OutImageType
177 #define _TEMPLATE_INPUTS2 InImageType,InImageType,OutImageType
178 #define _TEMPLATE_INPUTS3 InImageType,InImageType,InImageType,OutImageType
179 #define _TEMPLATE_INPUTS4 InImageType,InImageType,InImageType,InImageType,OutImageType
180 #define _TEMPLATE_INPUTS5 InImageType,InImageType,InImageType,InImageType,InImageType,OutImageType
182 
183 
184 //---------------------------------------------------------------------------
188 //---------------------------------------------------------------------------
189 #define _WRAPPER_DETERMINE_IN_REGION1_CPP(CLASS_NAME) \
190 
191 
192 
193 //---------------------------------------------------------------------------
196 //---------------------------------------------------------------------------
197 #define _ML_CALL_CALCOUTSUBIMAGE(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM, CLASS_NAME) \
198  { \
199  reinterpret_cast<CLASS_NAME##Wrapper<MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM>*>(this) \
200  ->calcOutSubImageT(*outSubImg, outIndex, inSubImgs); \
201  }
202 
203 //---------------------------------------------------------------------------
216 //---------------------------------------------------------------------------
217 #define _ML_CREATE_ITK_FILTER(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM, CLASS_NAME) \
218  reinterpret_cast<CLASS_NAME##Wrapper<MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM>*>(this) \
219  ->_createITKFilterT();
220 
221 //---------------------------------------------------------------------------
232 //---------------------------------------------------------------------------
233 #define _ML_DESTROY_ITK_FILTER(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM, CLASS_NAME) \
234  reinterpret_cast<CLASS_NAME##Wrapper<MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM>*>(this) \
235  ->_destroyITKFilterT();
236 
237 //---------------------------------------------------------------------------
248 //---------------------------------------------------------------------------
249 #define _ML_DETERMINE_ITK_IN_REGION(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, _DIM, CLASS_NAME) \
250  return reinterpret_cast<CLASS_NAME##Wrapper<MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, _DIM>*>(this) \
251  ->_determineInRegionT(inIndex, outBox, outIndex, numActiveInputs);
252 
253 
254 //---------------------------------------------------------------------------
265 //---------------------------------------------------------------------------
266 #define _ML_DETERMINE_ITK_OUT_IMAGE_REGION(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM, CLASS_NAME) \
267  return reinterpret_cast<CLASS_NAME##Wrapper<MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM>*>(this) \
268  ->_getOutImageRegionT(numImageInputs);
269 
270 //---------------------------------------------------------------------------
281 //---------------------------------------------------------------------------
282 #define _ML_SET_FILTER_PARAMETERS(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM, CLASS_NAME) \
283  return reinterpret_cast<CLASS_NAME##Wrapper<MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM>*>(this) \
284  ->_setFilterParametersT();
285 
286 //---------------------------------------------------------------------------
297 //---------------------------------------------------------------------------
298 #define _ML_GET_FILTER_PARAMETERS(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM, CLASS_NAME) \
299  return reinterpret_cast<CLASS_NAME##Wrapper<MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM>*>(this) \
300  ->_getFilterParametersT();
301 
302 
303 //----------------------------------------------------------------------------
306 //----------------------------------------------------------------------------
307 #define _ML_ITK_DETERMINE_IN_REGION_0(CLASS_NAME, NAMESPACE) \
308  SubImageBox _determineInRegionT(MLint /*inIndex*/, const SubImageBox &/*outBox*/, MLint /*outIndex*/, MLint /*numActiveInputs*/) \
309  { \
310  return SubImageBox(); \
311  }
312 
313 //----------------------------------------------------------------------------
318 //----------------------------------------------------------------------------
319 #define _ML_ITK_DETERMINE_IN_REGION_N(CLASS_NAME, NAMESPACE) \
320  SubImageBox _determineInRegionT(MLint inIndex, const SubImageBox &outBox, MLint outIndex, MLint numActiveInputs) \
321  { \
322  typename FilterType::Pointer filter = static_cast<FilterType*>(_itkObj->voidFilterPtr()); \
323  return determineImageFilterInRegionTN<FilterType, InImageType> \
324  (filter, *this, inIndex, outBox, outIndex, numActiveInputs); \
325  } \
326 
327 
328 
329 //----------------------------------------------------------------------------
332 //----------------------------------------------------------------------------
333 #define _ML_ITK_DETERMINE_OUT_REGION_0(CLASS_NAME, NAMESPACE) \
334  SubImageBox _getOutImageRegionT(int /*numImageInputs*/) \
335  { \
336  typename FilterType::Pointer filter = static_cast<FilterType*>(_itkObj->voidFilterPtr());\
337  return determineImageFilterOutImageRegionT0<FilterType, OutImageType> \
338  (filter, *this); \
339  } \
340 
341 //----------------------------------------------------------------------------
344 //----------------------------------------------------------------------------
345 #define _ML_ITK_DETERMINE_OUT_REGION_N(CLASS_NAME, NAMESPACE) \
346  SubImageBox _getOutImageRegionT(int numImageInputs) \
347  { \
348  typename FilterType::Pointer filter = static_cast<FilterType*>(_itkObj->voidFilterPtr());\
349  return determineImageFilterOutImageRegionTN<FilterType, OutImageType, InImageType> \
350  (filter, *this, numImageInputs); \
351  } \
352 
353 
354 
355 //--------------------------------------------------------------------------------
360 //--------------------------------------------------------------------------------
362 #define ML_ITK_DEFAULT_WRAPPER_TYPEDEFS_0(CLASS_NAME, NAMESPACE) \
363  typedef NAMESPACE::CLASS_NAME<_TEMPLATE_INPUTS0> FilterType; \
364 
366 #define ML_ITK_DEFAULT_WRAPPER_TYPEDEFS_1(CLASS_NAME, NAMESPACE) \
367  typedef NAMESPACE::CLASS_NAME<_TEMPLATE_INPUTS1> FilterType; \
368 
370 #define ML_ITK_DEFAULT_WRAPPER_TYPEDEFS_2(CLASS_NAME, NAMESPACE) \
371  typedef NAMESPACE::CLASS_NAME<_TEMPLATE_INPUTS2> FilterType; \
372 
374 #define ML_ITK_DEFAULT_WRAPPER_TYPEDEFS_3(CLASS_NAME, NAMESPACE) \
375  typedef NAMESPACE::CLASS_NAME<_TEMPLATE_INPUTS3> FilterType; \
376 
378 
379 //----------------------------------------------------------------------------------
384 // <typename DATATYPE, unsigned int DIM>
388 // TSubImage<DATATYPE> *outSubImg, int outIndex SUB_IMGS)
391 //----------------------------------------------------------------------------------
392 #define _ML_ITK_WRAPPER(PROJECT_PREFIX, CLASS_NAME, NAMESPACE, DET_IN_REGION, WRAPPER_TYPEDEFS, CREATOR_SWITCH, DET_OUT_REGION) \
393  \
394  \
395  template <typename ML_OUTDATATYPE, typename ITK_OUTDATATYPE, \
396  typename ML_INDATATYPE, typename ITK_INDATATYPE, unsigned int DIM> \
397  class CLASS_NAME##Wrapper : public PROJECT_PREFIX##CLASS_NAME \
398  { \
399  friend class PROJECT_PREFIX##CLASS_NAME; \
400  \
401  /*--------------------------------------------------------------------*/ \
402  \
403  /*--------------------------------------------------------------------*/ \
404  typedef itk::Image<ITK_INDATATYPE,DIM> InImageType; \
405  \
406  /*--------------------------------------------------------------------*/ \
407  \
408  /*--------------------------------------------------------------------*/ \
409  typedef ITK_INDATATYPE InPixelType; \
410  \
411  /*--------------------------------------------------------------------*/ \
412  \
413  /*--------------------------------------------------------------------*/ \
414  typedef itk::Image<ITK_OUTDATATYPE,DIM> OutImageType; \
415  \
416  /*--------------------------------------------------------------------*/ \
417  \
418  /*--------------------------------------------------------------------*/ \
419  typedef ITK_OUTDATATYPE OutPixelType; \
420  \
421  /*--------------------------------------------------------------------*/ \
422  \
423  /*--------------------------------------------------------------------*/ \
424  WRAPPER_TYPEDEFS(CLASS_NAME, NAMESPACE) \
425  \
426  /*--------------------------------------------------------------------*/ \
427  \
428  /*--------------------------------------------------------------------*/ \
429  void _createITKFilterT() \
430  { \
431  /* Create and store the typed object wrapper in */ \
432  /* untyped base class pointer. */ \
433  _itkObj = new TypedObjectHolderT<FilterType>(); \
434  } \
435  \
436  /*--------------------------------------------------------------------*/ \
437  \
438  \
439  /*--------------------------------------------------------------------*/ \
440  void _destroyITKFilterT() \
441  { \
442  delete _itkObj; _itkObj = nullptr; \
443  } \
444  \
445  /*------------------------------------------------------------------------*/ \
446  \
447  \
448  /*------------------------------------------------------------------------*/ \
449  DET_IN_REGION(CLASS_NAME, NAMESPACE) \
450  \
451  /*------------------------------------------------------------------------*/ \
452  \
453  /*------------------------------------------------------------------------*/ \
454  DET_OUT_REGION(CLASS_NAME, NAMESPACE) \
455  \
456  /*------------------------------------------------------------------------*/ \
457  \
458  /*------------------------------------------------------------------------*/ \
459  MLErrorCode _setFilterParametersT(); \
460  \
461  /*------------------------------------------------------------------------*/ \
462  \
463  /*------------------------------------------------------------------------*/ \
464  MLErrorCode _getFilterParametersT(); \
465  \
466  /*------------------------------------------------------------------------*/ \
467  \
468  /*------------------------------------------------------------------------*/ \
469  void calcOutSubImageT(SubImage &outSubImg, \
470  int outIndex, \
471  SubImage *inSubImgs); \
472  \
473  \
474  private: \
475  /*--- DO NOT IMPLEMENT MEMBERS IN THIS CLASS --- */ \
476  /*--- IT MUST BE LEGAL TO CAST IT TO ITS --- */ \
477  /*--- BASE CLASS AND BACK! --- */ \
478  \
479  \
480  CLASS_NAME##Wrapper(); \
481  \
482  ~CLASS_NAME##Wrapper(); \
483  \
484  CLASS_NAME##Wrapper(const CLASS_NAME##Wrapper &); \
485  \
486  CLASS_NAME##Wrapper operator=(const CLASS_NAME##Wrapper &); \
487  \
488  }; \
489  \
490  /*---------------------------------------------------------------------------*/ \
491  /*--- Implement virtual calculateOutputSubImage method to call correctly ---*/ \
492  /*--- typed calcOutSubImageT method of template wrapper ---*/ \
493  /*---------------------------------------------------------------------------*/ \
494  void PROJECT_PREFIX##CLASS_NAME::calculateOutputSubImage(SubImage *outSubImg, \
495  int outIndex, \
496  SubImage *inSubImgs) \
497  { \
498  /* Call correct template version of calcOutSubImageT for all types and dims.*/ \
499  CREATOR_SWITCH("calculateOutputSubImage()", \
500  _ML_CALL_CALCOUTSUBIMAGE, \
501  CLASS_NAME, _m_PixelType, _m_Dimension); \
502  } \
503  \
504  /*---------------------------------------------------------------------------*/ \
505  \
506  \
507  \
508  \
509  \
510  \
511  \
512  \
513  /*---------------------------------------------------------------------------*/ \
514  void PROJECT_PREFIX##CLASS_NAME::_createITKFilter(MLDataType dataType, MLint dim)\
515  { \
516  /* Clean up an eventually existing filter. */ \
517  _destroyITKFilter(); \
518  \
519  /* Set data type and dimension of the filter to be created. */ \
520  _m_PixelType = dataType; \
521  _m_Dimension = dim; \
522  \
523  ML_TRY \
524  { \
525  /* Implement ITKImage creation for all data types and all dimensions. */ \
526  CREATOR_SWITCH("_createITKFilter()", \
527  _ML_CREATE_ITK_FILTER, \
528  CLASS_NAME, _m_PixelType, _m_Dimension); \
529  } \
530  ML_CATCH_BLOCK(...) \
531  { \
532  ML_ITK_ML_PRINT_ERROR("_createITKFilter()", \
533  ML_UNKNOWN_EXCEPTION, "Filter not created.", \
534  "_m_PixelType=", _m_PixelType, \
535  "_m_Dimension=", _m_Dimension); \
536  } \
537  } \
538  \
539  \
540  /*---------------------------------------------------------------------------*/ \
541  \
542  \
543  \
544  \
545  \
546  \
547  \
548  \
549  \
550  \
551  /*---------------------------------------------------------------------------*/ \
552  void PROJECT_PREFIX##CLASS_NAME::_destroyITKFilter() \
553  { \
554  /* Destroy only valid objects */ \
555  if (!_itkObj || (_m_Dimension < 1) || \
556  (ML_INVALID_DATA_TYPE == _m_PixelType)){ return; } \
557  ML_TRY \
558  { \
559  /* Implement ITKImage creation for all data types and all dimensions. */ \
560  CREATOR_SWITCH("_destroyITKFilter()", \
561  _ML_DESTROY_ITK_FILTER, \
562  CLASS_NAME, _m_PixelType, _m_Dimension); \
563  } \
564  ML_CATCH_BLOCK(...) \
565  { \
566  ML_ITK_ML_PRINT_ERROR("_destroyITKFilter()", \
567  ML_UNKNOWN_EXCEPTION, "Filter destruction failed.", \
568  "_m_PixelType=", _m_PixelType, \
569  "_m_Dimension=", _m_Dimension); \
570  } \
571  _itkObj = nullptr; \
572  } \
573  \
574  \
575  /*----------------------------------------------------------------------------*/ \
576  \
577  \
578  \
579  \
580  \
581  \
582  \
583  \
584  \
585  \
586  \
587  \
588  /*----------------------------------------------------------------------------*/ \
589  SubImageBox PROJECT_PREFIX##CLASS_NAME::_determineInRegion(MLint inIndex, \
590  const SubImageBox &outBox,\
591  MLint outIndex, \
592  MLint numActiveInputs) \
593  { \
594  ML_TRY \
595  { \
596  /* Implement ITKImage creation for all data types and all dimensions. */ \
597  CREATOR_SWITCH("_determineInRegion()", \
598  _ML_DETERMINE_ITK_IN_REGION, \
599  CLASS_NAME, _m_PixelType, _m_Dimension); \
600  } \
601  ML_CATCH_BLOCK(...) \
602  { \
603  ML_ITK_ML_PRINT_ERROR("_determineInRegion()", \
604  ML_UNKNOWN_EXCEPTION, "InRegion calculation failed.", \
605  "inIndex=", inIndex, \
606  "outIndex=", outIndex, \
607  "_m_PixelType=", _m_PixelType, \
608  "_m_Dimension=", _m_Dimension); \
609  } \
610  return SubImageBox(); /* Return empty box in case of error */ \
611  } \
612  \
613  \
614  /*----------------------------------------------------------------------------*/ \
615  \
616  \
617  \
618  \
619  \
620  \
621  \
622  /*----------------------------------------------------------------------------*/ \
623  SubImageBox PROJECT_PREFIX##CLASS_NAME::_getOutImageRegion(int numImageInputs) \
624  { \
625  ML_TRY \
626  { \
627  /* Implement ITKImage creation for all data types and all dimensions. */ \
628  CREATOR_SWITCH("_getOutImageRegion()", \
629  _ML_DETERMINE_ITK_OUT_IMAGE_REGION, \
630  CLASS_NAME, _m_PixelType, _m_Dimension); \
631  } \
632  ML_CATCH_BLOCK(...) \
633  { \
634  ML_ITK_ML_PRINT_ERROR("_getOutImageRegion()", \
635  ML_UNKNOWN_EXCEPTION, "OutRegion calculation failed.", \
636  "numImageInputs=", numImageInputs, \
637  "_m_PixelType=", _m_PixelType, \
638  "_m_Dimension=", _m_Dimension); \
639  } \
640  return SubImageBox(); /* Return empty box in case of error */ \
641  } \
642  \
643  \
644  /*----------------------------------------------------------------------------*/ \
645  \
646  /*----------------------------------------------------------------------------*/ \
647  MLErrorCode PROJECT_PREFIX##CLASS_NAME::_setFilterParameters() \
648  { \
649  MLErrorCode retCode = ML_RESULT_OK; \
650  \
651  ML_TRY \
652  { \
653  /* Implement ITKImage creation for all data types and all dimensions. */ \
654  CREATOR_SWITCH("_setFilterParameters()", \
655  _ML_SET_FILTER_PARAMETERS, \
656  CLASS_NAME, _m_PixelType, _m_Dimension); \
657  } \
658  ML_CATCH_BLOCK(...) \
659  { \
660  ML_PRINT_ERROR("_setFilterParameters())", \
661  ML_UNKNOWN_EXCEPTION, "Returning empty box."); \
662  retCode = ML_UNKNOWN_EXCEPTION; \
663  } \
664  \
665  return retCode; \
666  } \
667  \
668  \
669  /*----------------------------------------------------------------------------*/ \
670  \
671  /*----------------------------------------------------------------------------*/ \
672  MLErrorCode PROJECT_PREFIX##CLASS_NAME::_getFilterParameters() \
673  { \
674  MLErrorCode retCode = ML_RESULT_OK; \
675  \
676  ML_TRY \
677  { \
678  /* Call the correct template version of get filter function. */ \
679  CREATOR_SWITCH("_getFilterParameters()", \
680  _ML_GET_FILTER_PARAMETERS, \
681  CLASS_NAME, _m_PixelType, _m_Dimension); \
682  } \
683  ML_CATCH_BLOCK(...) \
684  { \
685  ML_PRINT_ERROR("_getFilterParameters())", \
686  ML_UNKNOWN_EXCEPTION, "Parameter no or only partially read.");\
687  retCode = ML_UNKNOWN_EXCEPTION; \
688  } \
689  \
690  return retCode; \
691  } \
692  \
693