]> Creatis software - creaImageIO.git/blob - bbtk/src/bbcreaImageIOItkImagesChooserDialogBox.cxx
#3123creaImageIO Bug New Normal - branch changestoITK3and4
[creaImageIO.git] / bbtk / src / bbcreaImageIOItkImagesChooserDialogBox.cxx
1 /*
2   # ---------------------------------------------------------------------
3   #
4   # Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image 
5   #                        pour la Santé)
6   # Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton
7   # Previous Authors : Laurent Guigues, Jean-Pierre Roux
8   # CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil
9   #
10   #  This software is governed by the CeCILL-B license under French law and 
11   #  abiding by the rules of distribution of free software. You can  use, 
12   #  modify and/ or redistribute the software under the terms of the CeCILL-B 
13   #  license as circulated by CEA, CNRS and INRIA at the following URL 
14   #  http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html 
15   #  or in the file LICENSE.txt.
16   #
17   #  As a counterpart to the access to the source code and  rights to copy,
18   #  modify and redistribute granted by the license, users are provided only
19   #  with a limited warranty  and the software's author,  the holder of the
20   #  economic rights,  and the successive licensors  have only  limited
21   #  liability. 
22   #
23   #  The fact that you are presently reading this means that you have had
24   #  knowledge of the CeCILL-B license and that you accept its terms.
25   # ------------------------------------------------------------------------
26 */
27 //===== 
28 // Before editing this file, make sure it's a file of your own (i.e.: it wasn't generated from xml description; if so : your modifications will be lost)
29 //===== 
30
31 #include "bbcreaImageIOItkImagesChooserDialogBox.h"
32 #include "bbcreaImageIOPackage.h"
33
34 #include "itkImage.h"
35 #include "itkImportImageFilter.h"
36
37 /*
38 // -------------------------------------------------------------------------
39 // LFV: avoid itk::Concept check on 4d or superior images
40 #define BBCREAIMAGEIO_ChooserDlg_Template( t, ty, di )            \
41   if( t == typeid( itk::Image< ty, di >* ) )                       \
42   {                                                               \
43     this->Export< itk::Image< ty, di > >( );                      \
44     this->ExportVTK< itk::Image< ty, di > >( );                   \
45   }
46 */
47
48 // -------------------------------------------------------------------------
49 // LFV: avoid itk::Concept check on 4d or superior images
50 #define BBCREAIMAGEIO_ChooserDlg_Template( t, ty, di )            \
51   if( t == typeid( itk::Image< ty, di >* ) )                      \
52   {                                                               \
53     this->Export< ty , di  >( );                      \
54     this->ExportVTK< itk::Image< ty, di > >( );                   \
55   }
56
57
58 // -------------------------------------------------------------------------
59
60 namespace bbcreaImageIO
61 {
62
63 BBTK_ADD_BLACK_BOX_TO_PACKAGE(creaImageIO,ItkImagesChooserDialogBox)
64 BBTK_BLACK_BOX_IMPLEMENTATION(ItkImagesChooserDialogBox,bbtk::AtomicBlackBox);
65 //===== 
66 // Before editing this file, make sure it's a file of your own (i.e.: it wasn't generated from xml description; if so : your modifications will be lost)
67 //===== 
68 void ItkImagesChooserDialogBox::Process()
69 {
70  
71     dlg = new creaImageIO::WxAnySimpleDlg(0,crea::std2wx(bbGetInputTitle()),"localdatabase_Descriptor.dscp","Local Database"); 
72     dlg->ShowModal(); 
73
74     bbtk::TypeInfo typ = bbitk::GetITKImagePtrTypeInfoFromPixelTypeInfoAndDimension(*dlg->getTypes().front(), dlg->getDims().front());
75
76     BBCREAIMAGEIO_ChooserDlg_Template( typ, char, 1 )
77     else BBCREAIMAGEIO_ChooserDlg_Template( typ, short, 1 )
78     else BBCREAIMAGEIO_ChooserDlg_Template( typ, int, 1 )
79     else BBCREAIMAGEIO_ChooserDlg_Template( typ, long, 1 )
80     else BBCREAIMAGEIO_ChooserDlg_Template( typ, float, 1 )
81     else BBCREAIMAGEIO_ChooserDlg_Template( typ, double, 1 )
82     else BBCREAIMAGEIO_ChooserDlg_Template( typ, unsigned char, 1 )
83     else BBCREAIMAGEIO_ChooserDlg_Template( typ, unsigned short, 1 )
84     else BBCREAIMAGEIO_ChooserDlg_Template( typ, unsigned int, 1 )
85     else BBCREAIMAGEIO_ChooserDlg_Template( typ, unsigned long, 1 )
86     else BBCREAIMAGEIO_ChooserDlg_Template( typ, char, 2 )
87     else BBCREAIMAGEIO_ChooserDlg_Template( typ, short, 2 )
88     else BBCREAIMAGEIO_ChooserDlg_Template( typ, int, 2 )
89     else BBCREAIMAGEIO_ChooserDlg_Template( typ, long, 2 )
90     else BBCREAIMAGEIO_ChooserDlg_Template( typ, float, 2 )
91     else BBCREAIMAGEIO_ChooserDlg_Template( typ, double, 2 )
92     else BBCREAIMAGEIO_ChooserDlg_Template( typ, unsigned char, 2 )
93     else BBCREAIMAGEIO_ChooserDlg_Template( typ, unsigned short, 2 )
94     else BBCREAIMAGEIO_ChooserDlg_Template( typ, unsigned int, 2 )
95     else BBCREAIMAGEIO_ChooserDlg_Template( typ, unsigned long, 2 )
96     else BBCREAIMAGEIO_ChooserDlg_Template( typ, char, 3 )
97     else BBCREAIMAGEIO_ChooserDlg_Template( typ, short, 3 )
98     else BBCREAIMAGEIO_ChooserDlg_Template( typ, int, 3 )
99     else BBCREAIMAGEIO_ChooserDlg_Template( typ, long, 3 )
100     else BBCREAIMAGEIO_ChooserDlg_Template( typ, float, 3 )
101     else BBCREAIMAGEIO_ChooserDlg_Template( typ, double, 3 )
102     else BBCREAIMAGEIO_ChooserDlg_Template( typ, unsigned char, 3 )
103     else BBCREAIMAGEIO_ChooserDlg_Template( typ, unsigned short, 3 )
104     else BBCREAIMAGEIO_ChooserDlg_Template( typ, unsigned int, 3 )
105     else BBCREAIMAGEIO_ChooserDlg_Template( typ, unsigned long, 3 );
106
107
108     /* Deprecated
109        BBTK_TEMPLATE_ITK_IMAGE_SWITCH(typ, Export);
110        BBTK_TEMPLATE_ITK_IMAGE_SWITCH(typ, ExportVTK);
111     */
112
113     delete dlg;
114 }
115
116
117 //template <class TImage>
118 template <typename  ty, size_t di>
119 void ItkImagesChooserDialogBox::Export()
120 {
121         typedef itk::Image<ty,di> TImage;
122         if (dlg->getImagesSelected().size() == 1)
123         { 
124                 bbSetOutputOut( dlg->getTemplatedImagesSelected<TImage>().front().GetPointer() ); 
125         } else if (dlg->getImagesSelected().size() > 1){ 
126                 OutputImagesITKType outVect;
127                 typename  std::vector<typename TImage::Pointer> tempImgs= dlg->getTemplatedImagesSelected<TImage>();
128                 typename std::vector<typename TImage::Pointer>::iterator it = tempImgs.begin();
129                 for(;it != tempImgs.end(); ++it)
130                 {
131                         outVect.push_back( (*it).GetPointer() );
132                 } // for
133                 bbSetOutputOutIImages( outVect); 
134
135                 typedef  ty RGBPixelType;
136                 typedef itk::ImportImageFilter< ty , di > ImportFilterType;
137                 typename ImportFilterType::Pointer importFilter = ImportFilterType::New();
138
139                 typename TImage::SizeType imsize;
140                 imsize[0] = tempImgs[0].GetPointer()->GetLargestPossibleRegion().GetSize()[0];
141                 imsize[1] = tempImgs[0].GetPointer()->GetLargestPossibleRegion().GetSize()[1];
142                 imsize[2] = tempImgs.size();
143
144                 typename ImportFilterType::IndexType start;
145                 start.Fill( 0 );
146                 typename ImportFilterType::RegionType region;
147                 region.SetIndex( start );
148                 region.SetSize( imsize );
149                 importFilter->SetRegion( region );
150
151                 const itk::SpacePrecisionType origin[ 3 ] = { 0.0, 0.0, 0.0 };
152                 importFilter->SetOrigin( origin );
153
154                 const itk::SpacePrecisionType spacing[ 3 ] = { 1.0, 1.0, 1.0 };
155                 importFilter->SetSpacing( spacing );
156                 const unsigned long int numberOfPixels2D                = imsize[0]*imsize[1];
157                 const unsigned long int numberOfPixels2DInBytes = imsize[0]*imsize[1]*sizeof(ty);
158                 const unsigned long int numberOfPixels3D                = imsize[0]*imsize[1]*imsize[2]*sizeof(ty);
159
160                 RGBPixelType * localBuffer              = new RGBPixelType[ numberOfPixels3D ];
161                 RGBPixelType * tmpLocalBuffer   = localBuffer;
162
163                 it = tempImgs.begin();
164                 for(;it != tempImgs.end(); ++it)
165                 {               
166                         memcpy(tmpLocalBuffer, (*it).GetPointer()->GetBufferPointer(), numberOfPixels2DInBytes);
167                         tmpLocalBuffer = tmpLocalBuffer + numberOfPixels2D;
168                 } // for
169
170                 const bool importImageFilterWillOwnTheBuffer = true;
171                 importFilter->SetImportPointer( localBuffer , numberOfPixels3D , importImageFilterWillOwnTheBuffer );
172                 importFilter->Update();
173                 importFilter->Register();
174             bbSetOutputOut( importFilter->GetOutput() ); 
175
176    } else {
177       // warning: passing NULL to non-pointer 
178       //bbSetOutputOut( NULL);
179       bbSetOutputOut(0); // JPR
180    }
181 }
182
183
184 template <class TImage>
185 void ItkImagesChooserDialogBox::ExportVTK()
186 {
187         // BBTK can support only a vector with same dimensions image.
188          if (dlg->getDims().front() < 4)
189          { 
190                   typename std::vector<typename TImage::Pointer> tempImgs= dlg->getTemplatedImagesSelected<TImage>();
191                   typename std::vector<typename TImage::Pointer>::iterator it = tempImgs.begin();
192                   for(;it != tempImgs.end(); ++it)
193                   {
194                         dlg->split3Din3Dvtk<TImage>( (*it) );
195                   }
196                   bbSetOutputOutVImages( dlg->getVtkImagesSelected() ); 
197          } else if (dlg->getDims().front() == 4) { 
198                 // To Test
199                  //  dlg->split4Din3Dvtk("d:/temp2");
200                  // bbSetOutputOutVImages( dlg->getVtkImagesSelected()); 
201          } else {
202                   // NOT IMPLEMENTED YET FOR DIMENSIONS > 4     
203          } // if dlg
204 }
205
206 //===== 
207 // Before editing this file, make sure it's a file of your own (i.e.: it wasn't generated from xml description; if so : your modifications will be lost)
208 //===== 
209 void ItkImagesChooserDialogBox::bbUserSetDefaultValues()
210
211 }
212
213 //===== 
214 // Before editing this file, make sure it's a file of your own (i.e.: it wasn't generated from xml description; if so : your modifications will be lost)
215 //===== 
216 void ItkImagesChooserDialogBox::bbUserInitializeProcessing()
217 {
218 }
219
220 //===== 
221 // Before editing this file, make sure it's a file of your own (i.e.: it wasn't generated from xml description; if so : your modifications will be lost)
222 //===== 
223 void ItkImagesChooserDialogBox::bbUserFinalizeProcessing()
224 {
225 }
226
227 } // EO namespace bbcreaImageIO