]> Creatis software - creaMaracasVisu.git/blob - lib/maracasVisuLib/src/kernel/marDynData.cpp
*** empty log message ***
[creaMaracasVisu.git] / lib / maracasVisuLib / src / kernel / marDynData.cpp
1 /*=========================================================================
2
3   Program:   wxMaracas
4   Module:    $RCSfile: marDynData.cpp,v $
5   Language:  C++
6   Date:      $Date: 2009/05/14 13:54:43 $
7   Version:   $Revision: 1.2 $
8
9   Copyright: (c) 2002, 2003
10   License:
11   
12      This software is distributed WITHOUT ANY WARRANTY; without even 
13      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
14      PURPOSE.  See the above copyright notice for more information.
15
16 =========================================================================*/
17
18 #include <vtkImageResample.h>
19 #include <vtkExtractVOI.h>
20 #include <vtkImageData.h>
21 #include <vtkImageChangeInformation.h>
22 #include <vtkImageShiftScale.h> 
23 #include <vtkImageThreshold.h> 
24 #include "marDynData.h"
25
26 // -------------------------------------------------------------------------
27 marDynData::marDynData( marParameters* p ) : marObject( p ), _volume( NULL )
28 {
29         _marimagedata = new marImageData(NULL); 
30 }
31
32 // -------------------------------------------------------------------------
33 marDynData::~marDynData() 
34 {
35 //      _marimagedata->SetImageData(NULL);
36         delete _marimagedata;
37         reset( );
38 }
39 // -------------------------------------------------------------------------
40
41 void marDynData::loadData( kVolume* vol, int* voi )
42  {
43    int ext[6];
44    reset( );
45  
46    vtkExtractVOI *crop = vtkExtractVOI::New();
47    crop->SetInput( vol->castVtk( ) );
48
49    crop->SetVOI( voi );
50    //crop->SetSampleRate( getParameters( )->getVoxelSize( ), getParameters( )->getVoxelSize( ), getParameters( )->getVoxelSize( ));
51    
52    float RescalaSlope           =  getParameters()->getRescaleSlope();
53    float RescalaIntercept       =  getParameters()->getRescaleIntercept();
54
55 //EED
56 //      RescalaSlope            = 1;
57 //      RescalaIntercept        = 0;
58
59    vtkImageShiftScale *scale = vtkImageShiftScale::New();
60    scale->SetInput( crop->GetOutput( ) );
61    scale->SetScale(RescalaSlope);
62    scale->SetShift(0);
63    scale->SetOutputScalarTypeToShort();
64    scale->Update();
65    vtkImageShiftScale *shift = vtkImageShiftScale::New();
66    shift->SetInput( scale->GetOutput( ) );
67    shift->SetScale(1); 
68    shift->SetShift(RescalaIntercept);
69    shift->SetOutputScalarTypeToShort();
70    shift->Update();
71
72
73    vtkImageThreshold *threshold = vtkImageThreshold::New();
74    threshold->SetInput( shift->GetOutput( ) );
75    threshold->ThresholdByUpper (-10000); 
76    threshold->ThresholdByLower (-1); 
77    threshold->SetInValue(0);   
78    threshold->ReplaceOutOff ();
79    threshold->ReplaceInOn ();
80    threshold->SetOutputScalarTypeToUnsignedShort();
81    
82    vtkImageResample* ir = vtkImageResample::New( );
83    ir->SetInput( threshold->GetOutput( ) );
84    ir->SetDimensionality( 3 );
85    double voxelSize= getParameters( )->getVoxelSize( );
86    ir->SetAxisOutputSpacing( 0, voxelSize );
87    ir->SetAxisOutputSpacing( 1, voxelSize );
88    ir->SetAxisOutputSpacing( 2, voxelSize );
89
90
91 //      ir->SetAxisMagnificationFactor(0,1/getParameters( )->getVoxelSize( )); 
92
93 //EEDx1
94    ir->InterpolateOn( );
95 //   ir->InterpolateOff( );
96
97
98    ir->Update( );    //important
99    ir->GetOutput()->GetExtent( ext );
100  
101   /**
102    * Before we were using kgfoCrop which assume extent start at 0,0,0
103    */
104    vtkImageChangeInformation* change = vtkImageChangeInformation::New();
105    change->SetInput( ir->GetOutput() );
106    change->SetExtentTranslation( -ext[0], -ext[2], -ext[4] );
107    change->SetOutputSpacing ( voxelSize , voxelSize , voxelSize );
108    change->Update();    //important
109  
110    _volume = new kVolume( change->GetOutput( ) );
111
112         _marimagedata->AddImageData( _volume->castVtk() );
113         double spc[3];
114         vol->castVtk()->GetSpacing(spc);
115         _marimagedata->SetSpcOriginal( spc );
116         _marimagedata->SetVoiOriginal(voi);
117
118
119    crop         -> Delete();
120    ir           -> Delete();
121    change       -> Delete();
122    shift        -> Delete();
123    scale        -> Delete();
124    threshold-> Delete();
125  }
126
127
128 // -------------------------------------------------------------------------
129 void marDynData::reset( )
130 {
131   //Efface car _volume est juste un pointeur ver _volume de marGdcmDicom qui
132   //est detruit par le reset correspondant
133 // PS ->   #ifndef DXMM
134 // PS ->   if( _volume ) delete _volume;
135 // PS ->   #endif
136   _volume = NULL;
137 }
138
139 // -------------------------------------------------------------------------
140 void marDynData::copyFrom( const marObject& from )
141 {
142   reset( );
143   _volume = new kVolume( *( ( ( marDynData& )from )._volume ) );
144 }
145
146 // -------------------------------------------------------------------------
147 bool marDynData::save( std::ofstream& os )
148 {
149     void* data = _volume->getData1D( );
150     uint dims[ 3 ];
151     ulong dSize = _volume->getRawSizeInBytes( );
152     double sizes[ 3 ];
153     kVolume::Type type = _volume->getType( );
154
155     dims[ 0 ] = _volume->getXdim( );
156     dims[ 1 ] = _volume->getYdim( );
157     dims[ 2 ] = _volume->getZdim( );
158     sizes[ 0 ] = _volume->getXsize( );
159     sizes[ 1 ] = _volume->getYsize( );
160     sizes[ 2 ] = _volume->getZsize( );
161
162     os.write( ( const char* )dims, 3 * sizeof( uint ) );
163     os.write( ( const char* )sizes, 3 * sizeof( double ) );
164     os.write( ( const char* )&type, sizeof( kVolume::Type ) );
165     os.write( ( const char* )&dSize, sizeof( ulong ) );
166     os.write( ( const char* )data, dSize );
167
168     return( true );
169 }
170
171 // -------------------------------------------------------------------------
172 bool marDynData::load( std::ifstream& is )
173 {
174     uchar* data;
175     uint dims[ 3 ];
176     ulong dSize;
177     double sizes[ 3 ];
178     kVolume::Type type;
179
180     reset( );
181
182     is.read( ( char* )dims, 3 * sizeof( uint ) );
183     is.read( ( char* )sizes, 3 * sizeof( double ) );
184     is.read( ( char* )&type, sizeof( kVolume::Type ) );
185     is.read( ( char* )&dSize, sizeof( ulong ) );
186     data = new uchar[ dSize ];
187     is.read( ( char* )data, dSize );
188         
189     _volume = new kVolume( type, dims, sizes, ( void* )data );
190         
191     //cleaning
192     delete[] data;
193
194     return( true );
195 }
196
197 // ----------------------------------------------------------------------------------------------
198 marImageData *marDynData::GetMarImageData()
199 {
200         return _marimagedata;
201 }
202 // ----------------------------------------------------------------------------------------------
203
204 // eof - dynData.cxx