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
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