]> Creatis software - creaVtk.git/blobdiff - bbtk_creaVtk_PKG/src/bbcreaVtkScalarsToColors.cxx
#3370 creaVtk Feature New Normal - Compare Images with RGB
[creaVtk.git] / bbtk_creaVtk_PKG / src / bbcreaVtkScalarsToColors.cxx
index f3c8c99a6970658ca415372ebb89ab2528107d33..871319a1f1b6ecc7e1121cee11612110a26cc9eb 100644 (file)
@@ -4,9 +4,205 @@
 #include "bbcreaVtkScalarsToColors.h"
 #include "bbcreaVtkPackage.h"
 
+#include "vtkLookupTable.h"
+#include "vtkObjectFactory.h"
+
 namespace bbcreaVtk
 {
 
+class /*VTK_COMMON_EXPORT*/ vtkLookupTableDirectionVector2 : public vtkScalarsToColors
+{
+public:
+       // Description:
+       // Construct with range=[0,1]; and hsv ranges set up for rainbow color table 
+       // (from red to blue).
+       static vtkLookupTableDirectionVector2 *New();
+       vtkTypeMacro(vtkLookupTableDirectionVector2,vtkScalarsToColors);
+       void PrintSelf(ostream& os, vtkIndent indent);
+       double *GetRange() { return this->GetTableRange(); };
+       void SetRange(double min, double max) { this->SetTableRange(min, max); };
+       void SetRange(double rng[2]) { this->SetRange(rng[0], rng[1]); };
+       void SetTableRange(double r[2]); 
+       virtual void SetTableRange(double min, double max);
+       vtkGetVectorMacro(TableRange,double,2);
+       unsigned char *MapValue(double v);
+       void GetColor(double x, double rgb[3]);
+       void MapScalarsThroughTable2(void *input, unsigned char *output,
+                                                                int inputDataType, int numberOfValues,
+                                                                int inputIncrement, int outputIncrement);
+       void SetTypeTable( int typetable );
+protected:
+       double TableRange[2];
+       vtkLookupTableDirectionVector2(int sze=256, int ext=256);
+       ~vtkLookupTableDirectionVector2();
+private:
+       int TypeTable;                                                                                                                  //EED
+       vtkLookupTableDirectionVector2(const vtkLookupTableDirectionVector2&);  // Not implemented.
+       void operator=(const vtkLookupTableDirectionVector2&);                                  // Not implemented.
+};
+
+
+
+
+vtkStandardNewMacro(vtkLookupTableDirectionVector2);
+
+// Construct with range=(0,1); and hsv ranges set up for rainbow color table 
+// (from red to blue).
+vtkLookupTableDirectionVector2::vtkLookupTableDirectionVector2(int sze, int ext)
+{
+       this->TableRange[0] = 0.0;
+       this->TableRange[1] = 1.0;
+       TypeTable=0;
+}
+
+//----------------------------------------------------------------------------
+vtkLookupTableDirectionVector2::~vtkLookupTableDirectionVector2()
+{
+}
+
+unsigned char *vtkLookupTableDirectionVector2::MapValue(double v)
+{
+       
+       //int idx = this->GetIndex(v);
+       //return (this->Table->GetPointer(0) + 4*idx);  
+       return 0;
+}
+
+void vtkLookupTableDirectionVector2::GetColor(double v, double rgb[3])
+{
+//     unsigned char *rgb8 = this->MapValue(v);
+//     rgb[0] = rgb8[0]/255.0;
+//     rgb[1] = rgb8[1]/255.0;
+//     rgb[2] = rgb8[2]/255.0;
+
+       rgb[0] = 1;
+       rgb[1] = 1;
+       rgb[2] = 0;
+}
+
+
+void vtkLookupTableDirectionVector2::SetTableRange(double r[2])
+{
+       this->SetTableRange(r[0],r[1]);
+}
+
+void vtkLookupTableDirectionVector2::SetTypeTable( int typetable )
+{
+       TypeTable=typetable;
+}
+
+//----------------------------------------------------------------------------
+// Set the minimum/maximum scalar values for scalar mapping. Scalar values
+// less than minimum range value are clamped to minimum range value.
+// Scalar values greater than maximum range value are clamped to maximum
+// range value.
+void vtkLookupTableDirectionVector2::SetTableRange(double rmin, double rmax)
+{
+       if (rmax < rmin)
+    {
+               vtkErrorMacro("Bad table range: ["<<rmin<<", "<<rmax<<"]");
+               return;
+    }
+       
+       if (this->TableRange[0] == rmin && this->TableRange[1] == rmax)
+    {
+               return;
+    }
+       
+       this->TableRange[0] = rmin;
+       this->TableRange[1] = rmax;
+       
+       this->Modified();
+}
+
+
+
+//----------------------------------------------------------------------------
+// Although this is a relatively expensive calculation,
+// it is only done on the first render. Colors are cached
+// for subsequent renders.
+template<class T>
+void vtkLookupTableMapDirVectorEED2(vtkLookupTableDirectionVector2 *self, T *input, 
+                          unsigned char *output, int length, 
+                          int inIncr, int outFormat,int TypeTable)
+{
+
+       if (TypeTable==0)
+       {
+               double sum;
+               int i;
+               double dirx,diry,dirz;
+               for (i = 0; i < length; ++i)
+               {
+                               dirx    = static_cast<T>(input[0]);
+                               diry    = static_cast<T>(input[1]);
+                               dirz    = static_cast<T>(input[2]);
+                               input   = input+inIncr;
+                               sum             = sqrt( dirx*dirx + diry*diry + dirz*dirz );
+                               *output++ = (unsigned char) abs( (255*dirx/sum) );
+                               *output++ = (unsigned char) abs( (255*diry/sum) );
+                               *output++ = (unsigned char) abs( (255*dirz/sum) );
+                               *output++ = 255;
+               //              printf("%d %d %d   ",(int)(255*dirx/sum),(int)(255*diry/sum),(int)(255*dirz/sum));
+               //              printf(" C     %d        %f %f %f   \n",inIncr,dirx,diry,dirz);
+
+               } // for
+       } // typeTable == 0
+
+       if (TypeTable==1)
+       {
+               int i;
+               for (i = 0; i < length; ++i)
+               {
+                               *output++ = static_cast<T>(input[0]);  // red
+                               *output++ = static_cast<T>(input[1]);  // green
+                               *output++ = static_cast<T>(input[2]);  // blue
+//                             *output++ = 255;
+                               input   = input+inIncr;
+               } // for
+       } // typeTable == 1
+
+
+}
+
+
+//----------------------------------------------------------------------------
+void vtkLookupTableDirectionVector2::MapScalarsThroughTable2(void *input, 
+                                             unsigned char *output,
+                                             int inputDataType, 
+                                             int numberOfValues,
+                                             int inputIncrement,
+                                             int outputFormat)
+{
+// if (this->UseMagnitude && inputIncrement > 1)
+// {
+     switch (inputDataType)
+     {
+       vtkTemplateMacro( vtkLookupTableMapDirVectorEED2(this,static_cast<VTK_TT*>(input),output,
+                        numberOfValues,inputIncrement,outputFormat,TypeTable);
+                        return 
+                        );
+        case VTK_BIT:
+           vtkErrorMacro("Cannot comput magnitude of bit array.");
+           break;
+        default:
+           vtkErrorMacro(<< "MapImageThroughTable: Unknown input ScalarType");
+     } /// switch
+// } //if
+}  
+
+
+//----------------------------------------------------------------------------
+void vtkLookupTableDirectionVector2::PrintSelf(ostream& os, vtkIndent indent)
+{
+       this->Superclass::PrintSelf(os,indent); 
+}
+
+
+
+
+
+
 BBTK_ADD_BLACK_BOX_TO_PACKAGE(creaVtk,ScalarsToColors)
 BBTK_BLACK_BOX_IMPLEMENTATION(ScalarsToColors,bbtk::AtomicBlackBox);
 //===== 
@@ -30,54 +226,50 @@ void ScalarsToColors::Process()
 //    bbSetOutputOut( bbGetInputIn() );
 //    std::cout << "Output value = " <<bbGetOutputOut() << std::endl;
   
-printf("EED ScalarsToColors::Process Start\n");
+
+printf("EED ScalarsToColors::Process  Start\n");
+
        if (firsttime==true)
        {
                firsttime=false;
                // Create the color map
                if (bbGetInputType()==0)
                {
-                       _colorLookupTable = vtkLookupTable::New();
+                       vtkLookupTable *colorLookupTable = vtkLookupTable::New();
                        if (bbGetInputRange().size()==2)
                        {
-                               _colorLookupTable->SetRange( bbGetInputRange()[0],bbGetInputRange()[1]);
-//                             _colorLookupTable->SetTableRange( bbGetInputRange()[0],bbGetInputRange()[1]);
+                               colorLookupTable->SetRange( bbGetInputRange()[0],bbGetInputRange()[1]);
+//                             colorLookupTable->SetTableRange( bbGetInputRange()[0],bbGetInputRange()[1]);
                        } else {
-                               _colorLookupTable->SetRange(0,255);
+                               colorLookupTable->SetRange(0,255);
                        }
-                       _colorLookupTable->SetNumberOfTableValues(1000);
-                       _colorLookupTable->Build();
+                       colorLookupTable->SetNumberOfTableValues(1000);
+                       colorLookupTable->Build();
                        double rgba1[4];
                        double rgba2[4];
                        int iLookTable;
                        for (iLookTable = 0; iLookTable<500; iLookTable++)
                        {
-                               _colorLookupTable->GetTableValue(      iLookTable, rgba1);
-                               _colorLookupTable->GetTableValue(1000-1-iLookTable, rgba2);
-                               _colorLookupTable->SetTableValue(1000-1-iLookTable , rgba1[0],rgba1[1],rgba1[2],rgba1[3]);
-                               _colorLookupTable->SetTableValue(      iLookTable , rgba2[0],rgba2[1],rgba2[2],rgba2[3]);
+                               colorLookupTable->GetTableValue(      iLookTable, rgba1);
+                               colorLookupTable->GetTableValue(1000-1-iLookTable, rgba2);
+                               colorLookupTable->SetTableValue(1000-1-iLookTable , rgba1[0],rgba1[1],rgba1[2],rgba1[3]);
+                               colorLookupTable->SetTableValue(      iLookTable , rgba2[0],rgba2[1],rgba2[2],rgba2[3]);
                        } // for iLookTable     
                        double rgba[4];
-                       _colorLookupTable->GetTableValue(0,rgba);
+                       colorLookupTable->GetTableValue(0,rgba);
                        rgba[3]=0;
-                       _colorLookupTable->SetTableValue(0,rgba);
-
+                       colorLookupTable->SetTableValue(0,rgba);
                        int i,iMax;
-
                        iMax=(1000/16)*4;
                        for (i=0;i<iMax;i++)
                        {
-
-                               _colorLookupTable->GetTableValue(500+i, rgba);
+                               colorLookupTable->GetTableValue(500+i, rgba);
                                rgba[3]=(double)i/(double)iMax;
-                               _colorLookupTable->SetTableValue(500+i,rgba);
-                               _colorLookupTable->GetTableValue(500-i, rgba);
+                               colorLookupTable->SetTableValue(500+i,rgba);
+                               colorLookupTable->GetTableValue(500-i, rgba);
                                rgba[3]=(double)i/(double)iMax;
-                               _colorLookupTable->SetTableValue(500-i,rgba);
-
+                               colorLookupTable->SetTableValue(500-i,rgba);
                        } // for
-
-
 /*
                        iMax=100;
                        for (i=0;i<iMax;i++)
@@ -103,47 +295,61 @@ printf("EED ScalarsToColors::Process Start\n");
                                _colorLookupTable->SetTableValue(500-i,rgba);
                        } // for
 */
-
-
-
+                       _scalarstocolors = colorLookupTable;
                } // if Type 0
 
 //EED 2018-06-8 ***********************ARDS Projet***********************************************
                if (bbGetInputType()==1)
                {
-                       _colorLookupTable = vtkLookupTable::New();
+                       vtkLookupTable *colorLookupTable = vtkLookupTable::New();
                        if (bbGetInputRange().size()==2)
                        {
-                               _colorLookupTable->SetRange( bbGetInputRange()[0],bbGetInputRange()[1]);
-//                             _colorLookupTable->SetTableRange( bbGetInputRange()[0],bbGetInputRange()[1]);
+                               colorLookupTable->SetRange( bbGetInputRange()[0],bbGetInputRange()[1]);
+//                             colorLookupTable->SetTableRange( bbGetInputRange()[0],bbGetInputRange()[1]);
                        } else {
-                               _colorLookupTable->SetRange(0,255);
+                               colorLookupTable->SetRange(0,255);
                        }
-                       _colorLookupTable->SetValueRange(0.0, 1.0); // from black to white
-                       _colorLookupTable->SetSaturationRange(0.0, 0.0); // no color saturation
-                       _colorLookupTable->SetRampToLinear();
-                       _colorLookupTable->Build();
+                       colorLookupTable->SetValueRange(0.0, 1.0); // from black to white
+                       colorLookupTable->SetSaturationRange(0.0, 0.0); // no color saturation
+                       colorLookupTable->SetRampToLinear();
+                       colorLookupTable->Build();
                        double rgba[4];
-                       _colorLookupTable->GetTableValue(0,rgba);
+                       colorLookupTable->GetTableValue(0,rgba);
                        rgba[3]=0;
-                       _colorLookupTable->SetTableValue(0,rgba);
-               } // IF 
+                       colorLookupTable->SetTableValue(0,rgba);
+                       _scalarstocolors = colorLookupTable;
+               } // If Type 1
 
 
+               if (bbGetInputType()==2)  // Direction Color Vector
+               {
+                       vtkLookupTableDirectionVector2 *_LutEED = vtkLookupTableDirectionVector2::New();
+                       _LutEED->SetVectorModeToRGBColors();
+                       _LutEED->SetTypeTable(0);
+                       _scalarstocolors = _LutEED;
+               } // If Type 2
 
+               if (bbGetInputType()==3)  // Componets image rgb [0 255]
+               {
+                       vtkLookupTableDirectionVector2 *_LutEED = vtkLookupTableDirectionVector2::New();
+                       _LutEED->SetVectorModeToRGBColors();
+                       _LutEED->SetTypeTable(1);                                // for components image
+                       _scalarstocolors = _LutEED;
+               } // If Type 3
 
-       } // firsttime
 
+       } // firsttime
        double rgb[3];
        std::vector<double>colorRGB;
-        _colorLookupTable->GetColor( bbGetInputScalarValue() , rgb );
+       _scalarstocolors->GetColor( bbGetInputScalarValue() , rgb );
        colorRGB.push_back( rgb[0] );
        colorRGB.push_back( rgb[1] );
        colorRGB.push_back( rgb[2] );
        bbSetOutputColor( colorRGB );
-       bbSetOutputLookupTable(_colorLookupTable);
+       bbSetOutputLookupTable( _scalarstocolors );
+
+printf("EED ScalarsToColors::Process  End\n");
 
-printf("EED ScalarsToColors::Process End\n");
 
 }
 //===== 
@@ -160,9 +366,8 @@ void ScalarsToColors::bbUserSetDefaultValues()
    range.push_back( 1 );
        bbSetInputRange(range);
    bbSetInputScalarValue(0);
-   firsttime=true;
-  
-   _colorLookupTable=NULL;
+   firsttime           = true;
+   _scalarstocolors    = NULL;
 }
 //===== 
 // 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)