]> Creatis software - bbtk.git/blobdiff - packages/vtk/src/bbvtkRescaleSlopeIntercept.cxx
#2981 BBTK Feature New Normal - FormatOutput of filters in string
[bbtk.git] / packages / vtk / src / bbvtkRescaleSlopeIntercept.cxx
index 3fcedd1ac572875ee6bf147429ffd897a85b1479..117b97931a3c68e7634a99f9cb074b2d4e5ceb6b 100644 (file)
@@ -1,8 +1,38 @@
-//===== 
+/*
+ # ---------------------------------------------------------------------
+ #
+ # Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image
+ #                        pour la SantÈ)
+ # Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton
+ # Previous Authors : Laurent Guigues, Jean-Pierre Roux
+ # CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil
+ #
+ #  This software is governed by the CeCILL-B license under French law and
+ #  abiding by the rules of distribution of free software. You can  use,
+ #  modify and/ or redistribute the software under the terms of the CeCILL-B
+ #  license as circulated by CEA, CNRS and INRIA at the following URL
+ #  http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+ #  or in the file LICENSE.txt.
+ #
+ #  As a counterpart to the access to the source code and  rights to copy,
+ #  modify and redistribute granted by the license, users are provided only
+ #  with a limited warranty  and the software's author,  the holder of the
+ #  economic rights,  and the successive licensors  have only  limited
+ #  liability.
+ #
+ #  The fact that you are presently reading this means that you have had
+ #  knowledge of the CeCILL-B license and that you accept its terms.
+ # ------------------------------------------------------------------------ */
+
+
+//=====
 // Don't edit this file. This file is generated from xml description.. 
 //===== 
 #include "bbvtkRescaleSlopeIntercept.h"
 #include "bbvtkPackage.h"
+
+#include "bbtkStaticLecture.h"
+
 namespace bbvtk
 {
 
@@ -28,85 +58,80 @@ void RescaleSlopeIntercept::Process()
 //    bbSetOutputOut( bbGetInputIn() );
 //    std::cout << "Output value = " <<bbGetOutputOut() << std::endl;
   
-
        double range[2];
-       double spc[6];
-       int dim[3];
+       double spc[3];
        int ext[6];
-       double value;
-       double newValue;
        double A=bbGetInputA();
        double B=bbGetInputB();
        
        if (bbGetInputIn()!=0)
        {
-               if (bbGetInputOutputFormat()=="SAME")                                   outputformat = bbGetInputIn()->GetScalarType();
-               else if (bbGetInputOutputFormat()=="VTK_BIT")                   outputformat = VTK_BIT;
-               else if (bbGetInputOutputFormat()=="VTK_CHAR")                  outputformat = VTK_CHAR;
-               else if (bbGetInputOutputFormat()=="VTK_SIGNED_CHAR")   outputformat = VTK_SIGNED_CHAR;
-               else if (bbGetInputOutputFormat()=="VTK_UNSIGNED_CHAR") outputformat = VTK_UNSIGNED_CHAR;
-               else if (bbGetInputOutputFormat()=="VTK_UNSIGNED_SHORT") outputformat = VTK_UNSIGNED_SHORT;
-               else if (bbGetInputOutputFormat()=="VTK_INT")                   outputformat = VTK_INT;
-               else if (bbGetInputOutputFormat()=="VTK_UNSIGNED_INT")  outputformat = VTK_UNSIGNED_INT;
-               else if (bbGetInputOutputFormat()=="VTK_LONG")                  outputformat = VTK_LONG;
-               else if (bbGetInputOutputFormat()=="VTK_UNSIGNED_LONG") outputformat = VTK_UNSIGNED_LONG;
-               else if (bbGetInputOutputFormat()=="VTK_FLOAT")                 outputformat = VTK_FLOAT;
-               else if (bbGetInputOutputFormat()=="VTK_DOUBLE")                outputformat = VTK_DOUBLE;
+
+
+               int outputformat = bbtkStaticLecture::GetTypeFormat( bbGetInputOutputFormat() , bbGetInputIn() );
+               
                
-               imageoutput->Initialize();
-               imageoutput->SetScalarType( outputformat );     
                bbGetInputIn()->GetScalarRange(range);
                bbGetInputIn()->GetSpacing(spc);
-               imageoutput->SetSpacing( spc );
-               bbGetInputIn()->GetWholeExtent(ext);
-               dim[0]=ext[1]-ext[0]+1;
-               dim[1]=ext[3]-ext[2]+1;
-               dim[2]=ext[5]-ext[4]+1;
-               imageoutput->SetDimensions( dim[0] , dim[1], dim[2] );
-               imageoutput->AllocateScalars();
-
+               bbGetInputIn()->GetExtent( ext );                               
+               
                double range0plusrange1 = range[0]+range[1];
-               double difrange = range[1]-range[0];
-               double newdifrange = B-A;
+               double difrange                 = range[1]-range[0];
+               double newdifrange              = B-A;
+               
+               double shift;
+               double scale;
                
-               int i,j,k;
-               for (i=0; i<dim[0]; i++)
-               {
-                       for (j=0; j<dim[1]; j++)
-                       {
-                               for (k=0; k<dim[2]; k++)
-                               {
-                                       value = bbGetInputIn()->GetScalarComponentAsDouble(i,j,k,0);
-
-                                       if (bbGetInputType()==0) // Rescale Slope/Intercept
-                                       { 
-                                               newValue = value*A+B;
-                                       } // if type 0
-
-                                       if (bbGetInputType()==1) // Invert
-                                       { 
-                                               newValue = value*(-1) + (range0plusrange1);
-                                       } // if type 1
-                                       
-                                       if (bbGetInputType()==2) // Redimension
-                                       { 
-                                               newValue = ((value-range[0])/difrange)*newdifrange + A;
-                                       } // if type 2
-
-                                       if (bbGetInputType()==3) // Invert redimension
-                                       { 
-                                               newValue = ((value*(-1)+range[1])/difrange)*newdifrange + A;
-                                       } // if type 3
-                                       
-                                       imageoutput->SetScalarComponentFromDouble (i,j,k, 0, newValue);
-                               } // for k
-                       } // for j
-               } // for i
-                       
-               bbSetOutputOut(imageoutput);
-       } // if
+               if (bbGetInputType()==0) // Rescale Slope/Intercept
+               { 
+                       //                      newValue = value*A+B;
+                       scale = A;
+                       shift = B;
+               } // if type 0
+               
+               if (bbGetInputType()==1) // Invert
+               { 
+                       //                      newValue = value*(-1) + (range0plusrange1);
+                       scale=-1;
+                       shift=range0plusrange1;
+               } // if type 1
+               
+               if (bbGetInputType()==2) // Redimension
+               { 
+                       //                      newValue = ((value-range[0])/difrange)*newdifrange + A;
+                       scale=newdifrange/difrange;
+                       shift= A - (range[0]*newdifrange/difrange);
+               } // if type 2
+               
+               if (bbGetInputType()==3) // Invert redimension
+               { 
+                       //                      newValue = ((value*(-1)+range[1])/difrange)*newdifrange + A;
+                       scale=-newdifrange/difrange;
+                       shift= A + (range[1]*newdifrange/difrange);
+               } // if type 3
+               
+               filter1->SetInput( bbGetInputIn() );
+               filter1->SetOutputScalarType( VTK_DOUBLE );
+               filter1->SetShift( 0 );
+               filter1->SetScale( scale );
+               
+               filter2->SetInput( filter1->GetOutput() );
+               filter2->SetOutputScalarType( outputformat );
+               filter2->SetShift( shift );
+               filter2->SetScale( 1 );
+               
+               mchange->SetInput( filter2->GetOutput() );
+               mchange->SetExtentTranslation( -ext[0], -ext[2], -ext[4] );
+               mchange->SetOutputSpacing (spc);
+               mchange->Update();    //important
+               bbSetOutputOut( mchange->GetOutput() );
+               
+       } else  {
+               bbSetOutputOut( NULL );
+       }               // if bbGetInputIn      
 }
        
+       
 //===== 
 // Don't edit this file. This file is generated from xml description.. 
 //===== 
@@ -120,7 +145,10 @@ void RescaleSlopeIntercept::bbUserSetDefaultValues()
        bbSetInputA(1);
        bbSetInputB(0);
        bbSetInputOutputFormat("SAME");
-       imageoutput=NULL;
+
+       filter1 = NULL;
+       filter2 = NULL;
+       mchange = NULL;
 }
 //===== 
 // Don't edit this file. This file is generated from xml description.. 
@@ -133,7 +161,10 @@ void RescaleSlopeIntercept::bbUserInitializeProcessing()
 //    but this is where you should allocate the internal/output pointers 
 //    if any 
 
-       imageoutput = vtkImageData::New();
+       filter1 = vtkImageShiftScale::New();
+       filter2 = vtkImageShiftScale::New();
+       mchange = vtkImageChangeInformation::New();
+
   
 }
 //===== 
@@ -146,8 +177,11 @@ void RescaleSlopeIntercept::bbUserFinalizeProcessing()
 //    Here does nothing 
 //    but this is where you should desallocate the internal/output pointers 
 //    if any
-  
+       mchange->Delete();              
+       filter1->Delete();
+       filter2->Delete();
 }
+       
 }
 // EO namespace bbvtk