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//------------------------------------------------------------------------------------
84//------------------------------------------------------------------------------------
85#define _ML_IMPLEMENT_ALL_ITK_CASES(INFO_STRING, USER_CODE, CLASS_NAME, DATATYPE_ENUM, DIM, DIM_INST)\
86 switch(DATATYPE_ENUM){ \
87 case MLint8Type: DIM_INST(MLint8 , MLint8 , MLint8 , MLint8 , USER_CODE, CLASS_NAME, DIM); break; \
88 case MLuint8Type: DIM_INST(MLuint8 , MLuint8 , MLuint8 , MLuint8 , USER_CODE, CLASS_NAME, DIM); break; \
89 case MLint16Type: DIM_INST(MLint16 , MLint16 , MLint16 , MLint16 , USER_CODE, CLASS_NAME, DIM); break; \
90 case MLuint16Type: DIM_INST(MLuint16 , MLuint16 , MLuint16 , MLuint16 , USER_CODE, CLASS_NAME, DIM); break; \
91 case MLint32Type: DIM_INST(MLint32 , MLint32 , MLint32 , MLint32 , USER_CODE, CLASS_NAME, DIM); break; \
92 case MLuint32Type: DIM_INST(MLuint32 , MLuint32 , MLuint32 , MLuint32 , USER_CODE, CLASS_NAME, DIM); break; \
93 case MLfloatType: DIM_INST(MLfloat , MLfloat , MLfloat , MLfloat , USER_CODE, CLASS_NAME, DIM); break; \
94 case MLdoubleType: DIM_INST(MLdouble , MLdouble , MLdouble , MLdouble , USER_CODE, CLASS_NAME, DIM); break; \
95 /* case MLldoubleType: DIM_INST(MLldouble , MLldouble , MLldouble , MLldouble, USER_CODE, CLASS_NAME, DIM); break; */ \
96 /* case MLint64Type: DIM_INST(MLint64 , MLint64 , MLint64 , MLint64 , USER_CODE, CLASS_NAME, DIM); break; */ \
97 /* case MLuint64Type: DIM_INST(MLuint64 , MLuint64 , MLuint64 , MLuint64 , USER_CODE, CLASS_NAME, DIM); break; */ \
98 default: { \
99 ML_ITK_ML_PRINT_ERROR(#CLASS_NAME, ML_BAD_DATA_TYPE, \
100 "Type case not executed(_ML_IMPLEMENT_ALL_ITK_CASES).", \
101 "DATATYPE_ENUM=", DATATYPE_ENUM, \
102 "DIM=", DIM); \
103 break; \
104 } \
105 } \
106
107//------------------------------------------------------------------------------------
109//------------------------------------------------------------------------------------
110#define ML_IMPLEMENT_ALL_ITK_2D_CASES(INFO_STRING, USER_CODE, CLASS_NAME, DATATYPE_ENUM, DIM)\
111 _ML_IMPLEMENT_ALL_ITK_CASES(INFO_STRING, USER_CODE, CLASS_NAME, DATATYPE_ENUM, DIM, _ML_INSTANTIATE_2D_CODE)
112
113//------------------------------------------------------------------------------------
115//------------------------------------------------------------------------------------
116#define ML_IMPLEMENT_ALL_ITK_3D_CASES(INFO_STRING, USER_CODE, CLASS_NAME, DATATYPE_ENUM, DIM)\
117 _ML_IMPLEMENT_ALL_ITK_CASES(INFO_STRING, USER_CODE, CLASS_NAME, DATATYPE_ENUM, DIM, _ML_INSTANTIATE_3D_CODE)
118
119//------------------------------------------------------------------------------------
121//------------------------------------------------------------------------------------
122#define ML_IMPLEMENT_ALL_ITK_2D3D_CASES(INFO_STRING, USER_CODE, CLASS_NAME, DATATYPE_ENUM, DIM)\
123 _ML_IMPLEMENT_ALL_ITK_CASES(INFO_STRING, USER_CODE, CLASS_NAME, DATATYPE_ENUM, DIM, _ML_INSTANTIATE_2D3D_CODE)
124
125//------------------------------------------------------------------------------------
127//------------------------------------------------------------------------------------
128#define ML_IMPLEMENT_ALL_ITK_6D_CASES(INFO_STRING, USER_CODE, CLASS_NAME, DATATYPE_ENUM, DIM)\
129 _ML_IMPLEMENT_ALL_ITK_CASES(INFO_STRING, USER_CODE, CLASS_NAME, DATATYPE_ENUM, DIM, _ML_INSTANTIATE_6D_CODE)
130
131
132//---------------------------------------------------------------------------
134//---------------------------------------------------------------------------
135#define _TEMPLATE_INPUTS0 OutImageType
136#define _TEMPLATE_INPUTS1 InImageType,OutImageType
137#define _TEMPLATE_INPUTS2 InImageType,InImageType,OutImageType
138#define _TEMPLATE_INPUTS3 InImageType,InImageType,InImageType,OutImageType
139#define _TEMPLATE_INPUTS4 InImageType,InImageType,InImageType,InImageType,OutImageType
140#define _TEMPLATE_INPUTS5 InImageType,InImageType,InImageType,InImageType,InImageType,OutImageType
142
143
144//---------------------------------------------------------------------------
148//---------------------------------------------------------------------------
149#define _WRAPPER_DETERMINE_IN_REGION1_CPP(CLASS_NAME) \
150
151
152
153//---------------------------------------------------------------------------
156//---------------------------------------------------------------------------
157#define _ML_CALL_CALCOUTSUBIMAGE(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM, CLASS_NAME) \
158 { \
159 reinterpret_cast<CLASS_NAME##Wrapper<MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM>*>(this) \
160 ->calcOutSubImageT(*outSubImg, outIndex, inSubImgs); \
161 }
162
163//---------------------------------------------------------------------------
176//---------------------------------------------------------------------------
177#define _ML_CREATE_ITK_FILTER(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM, CLASS_NAME) \
178 reinterpret_cast<CLASS_NAME##Wrapper<MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM>*>(this) \
179 ->_createITKFilterT();
180
181//---------------------------------------------------------------------------
192//---------------------------------------------------------------------------
193#define _ML_DESTROY_ITK_FILTER(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM, CLASS_NAME) \
194 reinterpret_cast<CLASS_NAME##Wrapper<MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM>*>(this) \
195 ->_destroyITKFilterT();
196
197//---------------------------------------------------------------------------
208//---------------------------------------------------------------------------
209#define _ML_DETERMINE_ITK_IN_REGION(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, _DIM, CLASS_NAME) \
210 return reinterpret_cast<CLASS_NAME##Wrapper<MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, _DIM>*>(this) \
211 ->_determineInRegionT(inIndex, outBox, outIndex, numActiveInputs);
212
213
214//---------------------------------------------------------------------------
225//---------------------------------------------------------------------------
226#define _ML_DETERMINE_ITK_OUT_IMAGE_REGION(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM, CLASS_NAME) \
227 return reinterpret_cast<CLASS_NAME##Wrapper<MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM>*>(this) \
228 ->_getOutImageRegionT(numImageInputs);
229
230//---------------------------------------------------------------------------
241//---------------------------------------------------------------------------
242#define _ML_SET_FILTER_PARAMETERS(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM, CLASS_NAME) \
243 return reinterpret_cast<CLASS_NAME##Wrapper<MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM>*>(this) \
244 ->_setFilterParametersT();
245
246//---------------------------------------------------------------------------
257//---------------------------------------------------------------------------
258#define _ML_GET_FILTER_PARAMETERS(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM, CLASS_NAME) \
259 return reinterpret_cast<CLASS_NAME##Wrapper<MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM>*>(this) \
260 ->_getFilterParametersT();
261
262
263//----------------------------------------------------------------------------
266//----------------------------------------------------------------------------
267#define _ML_ITK_DETERMINE_IN_REGION_0(CLASS_NAME, NAMESPACE) \
268 SubImageBox _determineInRegionT(MLint /*inIndex*/, const SubImageBox &/*outBox*/, MLint /*outIndex*/, MLint /*numActiveInputs*/) \
269 { \
270 return SubImageBox(); \
271 }
272
273//----------------------------------------------------------------------------
278//----------------------------------------------------------------------------
279#define _ML_ITK_DETERMINE_IN_REGION_N(CLASS_NAME, NAMESPACE) \
280 SubImageBox _determineInRegionT(MLint inIndex, const SubImageBox &outBox, MLint outIndex, MLint numActiveInputs) \
281 { \
282 typename FilterType::Pointer filter = static_cast<FilterType*>(_itkObj->voidFilterPtr()); \
283 return determineImageFilterInRegionTN<FilterType, InImageType> \
284 (filter, *this, inIndex, outBox, outIndex, numActiveInputs); \
285 } \
286
287
288
289//----------------------------------------------------------------------------
292//----------------------------------------------------------------------------
293#define _ML_ITK_DETERMINE_OUT_REGION_0(CLASS_NAME, NAMESPACE) \
294 SubImageBox _getOutImageRegionT(int /*numImageInputs*/) \
295 { \
296 typename FilterType::Pointer filter = static_cast<FilterType*>(_itkObj->voidFilterPtr());\
297 return determineImageFilterOutImageRegionT0<FilterType, OutImageType> \
298 (filter, *this); \
299 } \
300
301//----------------------------------------------------------------------------
304//----------------------------------------------------------------------------
305#define _ML_ITK_DETERMINE_OUT_REGION_N(CLASS_NAME, NAMESPACE) \
306 SubImageBox _getOutImageRegionT(int numImageInputs) \
307 { \
308 typename FilterType::Pointer filter = static_cast<FilterType*>(_itkObj->voidFilterPtr());\
309 return determineImageFilterOutImageRegionTN<FilterType, OutImageType, InImageType> \
310 (filter, *this, numImageInputs); \
311 } \
312
313
314
315//--------------------------------------------------------------------------------
320//--------------------------------------------------------------------------------
322#define ML_ITK_DEFAULT_WRAPPER_TYPEDEFS_0(CLASS_NAME, NAMESPACE) \
323 typedef NAMESPACE::CLASS_NAME<_TEMPLATE_INPUTS0> FilterType; \
324
326#define ML_ITK_DEFAULT_WRAPPER_TYPEDEFS_1(CLASS_NAME, NAMESPACE) \
327 typedef NAMESPACE::CLASS_NAME<_TEMPLATE_INPUTS1> FilterType; \
328
330#define ML_ITK_DEFAULT_WRAPPER_TYPEDEFS_2(CLASS_NAME, NAMESPACE) \
331 typedef NAMESPACE::CLASS_NAME<_TEMPLATE_INPUTS2> FilterType; \
332
334#define ML_ITK_DEFAULT_WRAPPER_TYPEDEFS_3(CLASS_NAME, NAMESPACE) \
335 typedef NAMESPACE::CLASS_NAME<_TEMPLATE_INPUTS3> FilterType; \
336
338
339//----------------------------------------------------------------------------------
344// <typename DATATYPE, unsigned int DIM>
348// TSubImage<DATATYPE> *outSubImg, int outIndex SUB_IMGS)
351//----------------------------------------------------------------------------------
352#define _ML_ITK_WRAPPER(PROJECT_PREFIX, CLASS_NAME, NAMESPACE, DET_IN_REGION, WRAPPER_TYPEDEFS, CREATOR_SWITCH, DET_OUT_REGION) \
353 \
354 \
355 template <typename ML_OUTDATATYPE, typename ITK_OUTDATATYPE, \
356 typename ML_INDATATYPE, typename ITK_INDATATYPE, unsigned int DIM> \
357 class CLASS_NAME##Wrapper : public PROJECT_PREFIX##CLASS_NAME \
358 { \
359 friend class PROJECT_PREFIX##CLASS_NAME; \
360 \
361 /*--------------------------------------------------------------------*/ \
362 \
363 /*--------------------------------------------------------------------*/ \
364 typedef itk::Image<ITK_INDATATYPE,DIM> InImageType; \
365 \
366 /*--------------------------------------------------------------------*/ \
367 \
368 /*--------------------------------------------------------------------*/ \
369 typedef ITK_INDATATYPE InPixelType; \
370 \
371 /*--------------------------------------------------------------------*/ \
372 \
373 /*--------------------------------------------------------------------*/ \
374 typedef itk::Image<ITK_OUTDATATYPE,DIM> OutImageType; \
375 \
376 /*--------------------------------------------------------------------*/ \
377 \
378 /*--------------------------------------------------------------------*/ \
379 typedef ITK_OUTDATATYPE OutPixelType; \
380 \
381 /*--------------------------------------------------------------------*/ \
382 \
383 /*--------------------------------------------------------------------*/ \
384 WRAPPER_TYPEDEFS(CLASS_NAME, NAMESPACE) \
385 \
386 /*--------------------------------------------------------------------*/ \
387 \
388 /*--------------------------------------------------------------------*/ \
389 void _createITKFilterT() \
390 { \
391 /* Create and store the typed object wrapper in */ \
392 /* untyped base class pointer. */ \
393 _itkObj = new TypedObjectHolderT<FilterType>(); \
394 } \
395 \
396 /*--------------------------------------------------------------------*/ \
397 \
398 \
399 /*--------------------------------------------------------------------*/ \
400 void _destroyITKFilterT() \
401 { \
402 delete _itkObj; _itkObj = nullptr; \
403 } \
404 \
405 /*------------------------------------------------------------------------*/ \
406 \
407 \
408 /*------------------------------------------------------------------------*/ \
409 DET_IN_REGION(CLASS_NAME, NAMESPACE) \
410 \
411 /*------------------------------------------------------------------------*/ \
412 \
413 /*------------------------------------------------------------------------*/ \
414 DET_OUT_REGION(CLASS_NAME, NAMESPACE) \
415 \
416 /*------------------------------------------------------------------------*/ \
417 \
418 /*------------------------------------------------------------------------*/ \
419 MLErrorCode _setFilterParametersT(); \
420 \
421 /*------------------------------------------------------------------------*/ \
422 \
423 /*------------------------------------------------------------------------*/ \
424 MLErrorCode _getFilterParametersT(); \
425 \
426 /*------------------------------------------------------------------------*/ \
427 \
428 /*------------------------------------------------------------------------*/ \
429 void calcOutSubImageT(SubImage &outSubImg, \
430 int outIndex, \
431 SubImage *inSubImgs); \
432 \
433 \
434 private: \
435 /*--- DO NOT IMPLEMENT MEMBERS IN THIS CLASS --- */ \
436 /*--- IT MUST BE LEGAL TO CAST IT TO ITS --- */ \
437 /*--- BASE CLASS AND BACK! --- */ \
438 \
439 \
440 CLASS_NAME##Wrapper(); \
441 \
442 ~CLASS_NAME##Wrapper(); \
443 \
444 CLASS_NAME##Wrapper(const CLASS_NAME##Wrapper &); \
445 \
446 CLASS_NAME##Wrapper operator=(const CLASS_NAME##Wrapper &); \
447 \
448 }; \
449 \
450 /*---------------------------------------------------------------------------*/ \
451 /*--- Implement virtual calculateOutputSubImage method to call correctly ---*/ \
452 /*--- typed calcOutSubImageT method of template wrapper ---*/ \
453 /*---------------------------------------------------------------------------*/ \
454 void PROJECT_PREFIX##CLASS_NAME::calculateOutputSubImage(SubImage *outSubImg, \
455 int outIndex, \
456 SubImage *inSubImgs) \
457 { \
458 /* Call correct template version of calcOutSubImageT for all types and dims.*/ \
459 CREATOR_SWITCH("calculateOutputSubImage()", \
460 _ML_CALL_CALCOUTSUBIMAGE, \
461 CLASS_NAME, _m_PixelType, _m_Dimension); \
462 } \
463 \
464 /*---------------------------------------------------------------------------*/ \
465 \
466 \
467 \
468 \
469 \
470 \
471 \
472 \
473 /*---------------------------------------------------------------------------*/ \
474 void PROJECT_PREFIX##CLASS_NAME::_createITKFilter(MLDataType dataType, MLint dim)\
475 { \
476 /* Clean up an eventually existing filter. */ \
477 _destroyITKFilter(); \
478 \
479 /* Set data type and dimension of the filter to be created. */ \
480 _m_PixelType = dataType; \
481 _m_Dimension = dim; \
482 \
483 ML_TRY \
484 { \
485 /* Implement ITKImage creation for all data types and all dimensions. */ \
486 CREATOR_SWITCH("_createITKFilter()", \
487 _ML_CREATE_ITK_FILTER, \
488 CLASS_NAME, _m_PixelType, _m_Dimension); \
489 } \
490 ML_CATCH_BLOCK(...) \
491 { \
492 ML_ITK_ML_PRINT_ERROR("_createITKFilter()", \
493 ML_UNKNOWN_EXCEPTION, "Filter not created.", \
494 "_m_PixelType=", _m_PixelType, \
495 "_m_Dimension=", _m_Dimension); \
496 } \
497 } \
498 \
499 \
500 /*---------------------------------------------------------------------------*/ \
501 \
502 \
503 \
504 \
505 \
506 \
507 \
508 \
509 \
510 \
511 /*---------------------------------------------------------------------------*/ \
512 void PROJECT_PREFIX##CLASS_NAME::_destroyITKFilter() \
513 { \
514 /* Destroy only valid objects */ \
515 if (!_itkObj || (_m_Dimension < 1) || \
516 (ML_INVALID_DATA_TYPE == _m_PixelType)){ return; } \
517 ML_TRY \
518 { \
519 /* Implement ITKImage creation for all data types and all dimensions. */ \
520 CREATOR_SWITCH("_destroyITKFilter()", \
521 _ML_DESTROY_ITK_FILTER, \
522 CLASS_NAME, _m_PixelType, _m_Dimension); \
523 } \
524 ML_CATCH_BLOCK(...) \
525 { \
526 ML_ITK_ML_PRINT_ERROR("_destroyITKFilter()", \
527 ML_UNKNOWN_EXCEPTION, "Filter destruction failed.", \
528 "_m_PixelType=", _m_PixelType, \
529 "_m_Dimension=", _m_Dimension); \
530 } \
531 _itkObj = nullptr; \
532 } \
533 \
534 \
535 /*----------------------------------------------------------------------------*/ \
536 \
537 \
538 \
539 \
540 \
541 \
542 \
543 \
544 \
545 \
546 \
547 \
548 /*----------------------------------------------------------------------------*/ \
549 SubImageBox PROJECT_PREFIX##CLASS_NAME::_determineInRegion(MLint inIndex, \
550 const SubImageBox &outBox,\
551 MLint outIndex, \
552 MLint numActiveInputs) \
553 { \
554 ML_TRY \
555 { \
556 /* Implement ITKImage creation for all data types and all dimensions. */ \
557 CREATOR_SWITCH("_determineInRegion()", \
558 _ML_DETERMINE_ITK_IN_REGION, \
559 CLASS_NAME, _m_PixelType, _m_Dimension); \
560 } \
561 ML_CATCH_BLOCK(...) \
562 { \
563 ML_ITK_ML_PRINT_ERROR("_determineInRegion()", \
564 ML_UNKNOWN_EXCEPTION, "InRegion calculation failed.", \
565 "inIndex=", inIndex, \
566 "outIndex=", outIndex, \
567 "_m_PixelType=", _m_PixelType, \
568 "_m_Dimension=", _m_Dimension); \
569 } \
570 return SubImageBox(); /* Return empty box in case of error */ \
571 } \
572 \
573 \
574 /*----------------------------------------------------------------------------*/ \
575 \
576 \
577 \
578 \
579 \
580 \
581 \
582 /*----------------------------------------------------------------------------*/ \
583 SubImageBox PROJECT_PREFIX##CLASS_NAME::_getOutImageRegion(int numImageInputs) \
584 { \
585 ML_TRY \
586 { \
587 /* Implement ITKImage creation for all data types and all dimensions. */ \
588 CREATOR_SWITCH("_getOutImageRegion()", \
589 _ML_DETERMINE_ITK_OUT_IMAGE_REGION, \
590 CLASS_NAME, _m_PixelType, _m_Dimension); \
591 } \
592 ML_CATCH_BLOCK(...) \
593 { \
594 ML_ITK_ML_PRINT_ERROR("_getOutImageRegion()", \
595 ML_UNKNOWN_EXCEPTION, "OutRegion calculation failed.", \
596 "numImageInputs=", numImageInputs, \
597 "_m_PixelType=", _m_PixelType, \
598 "_m_Dimension=", _m_Dimension); \
599 } \
600 return SubImageBox(); /* Return empty box in case of error */ \
601 } \
602 \
603 \
604 /*----------------------------------------------------------------------------*/ \
605 \
606 /*----------------------------------------------------------------------------*/ \
607 MLErrorCode PROJECT_PREFIX##CLASS_NAME::_setFilterParameters() \
608 { \
609 MLErrorCode retCode = ML_RESULT_OK; \
610 \
611 ML_TRY \
612 { \
613 /* Implement ITKImage creation for all data types and all dimensions. */ \
614 CREATOR_SWITCH("_setFilterParameters()", \
615 _ML_SET_FILTER_PARAMETERS, \
616 CLASS_NAME, _m_PixelType, _m_Dimension); \
617 } \
618 ML_CATCH_BLOCK(...) \
619 { \
620 ML_PRINT_ERROR("_setFilterParameters())", \
621 ML_UNKNOWN_EXCEPTION, "Returning empty box."); \
622 retCode = ML_UNKNOWN_EXCEPTION; \
623 } \
624 \
625 return retCode; \
626 } \
627 \
628 \
629 /*----------------------------------------------------------------------------*/ \
630 \
631 /*----------------------------------------------------------------------------*/ \
632 MLErrorCode PROJECT_PREFIX##CLASS_NAME::_getFilterParameters() \
633 { \
634 MLErrorCode retCode = ML_RESULT_OK; \
635 \
636 ML_TRY \
637 { \
638 /* Call the correct template version of get filter function. */ \
639 CREATOR_SWITCH("_getFilterParameters()", \
640 _ML_GET_FILTER_PARAMETERS, \
641 CLASS_NAME, _m_PixelType, _m_Dimension); \
642 } \
643 ML_CATCH_BLOCK(...) \
644 { \
645 ML_PRINT_ERROR("_getFilterParameters())", \
646 ML_UNKNOWN_EXCEPTION, "Parameter no or only partially read.");\
647 retCode = ML_UNKNOWN_EXCEPTION; \
648 } \
649 \
650 return retCode; \
651 } \
652 \
653