]> Creatis software - creaVtk.git/blobdiff - bbtk_creaVtk_PKG/src/bbcreaVtkScalarsToColors.cxx
#3464 Aboce Below Range color in ScalarsToColors box
[creaVtk.git] / bbtk_creaVtk_PKG / src / bbcreaVtkScalarsToColors.cxx
index e4524c6514a703f050415dbd438abc87b7e151f4..50c2cbc2e8532df3618d09af7bf6955a5390e5ec 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,45 +226,127 @@ void ScalarsToColors::Process()
 //    bbSetOutputOut( bbGetInputIn() );
 //    std::cout << "Output value = " <<bbGetOutputOut() << std::endl;
   
-   if (firsttime==true)
-       {
-               firsttime=false;
 
+//     if (firsttime==true)
+//     {
+//             firsttime=false;
                // Create the color map
-               if (bbGetInputType()==0)
+               if ((bbGetInputType()==0) || (bbGetInputType()==100) )
                {
-                       _colorLookupTable = vtkLookupTable::New();
-               _colorLookupTable->Build();
-                  double rgba1[4];
-                  double rgba2[4];
-                  for (int iLookTable = 0; iLookTable<128; iLookTable++)
-                  {
-                               _colorLookupTable->GetTableValue(      iLookTable, rgba1);
-                               _colorLookupTable->GetTableValue(256-1-iLookTable, rgba2);
-
-                               _colorLookupTable->SetTableValue(256-1-iLookTable , rgba1[0],rgba1[1],rgba1[2],rgba1[3]);
-                               _colorLookupTable->SetTableValue(      iLookTable , rgba2[0],rgba2[1],rgba2[2],rgba2[3]);
+                       vtkLookupTable *colorLookupTable = vtkLookupTable::New();
+                       if (bbGetInputRange().size()==2)
+                       {
+                               colorLookupTable->SetRange( bbGetInputRange()[0],bbGetInputRange()[1]);
+//                             colorLookupTable->SetTableRange( bbGetInputRange()[0],bbGetInputRange()[1]);
+                               colorLookupTable->SetBelowRangeColor(1,1,1,0);  // White transparent 
+                               colorLookupTable->SetAboveRangeColor(1,1,1,0);  // White transparent 
+                               colorLookupTable->UseBelowRangeColorOn();
+                               colorLookupTable->UseAboveRangeColorOn();
+                       } else {
+                               colorLookupTable->SetRange(0,255);
+                       }
+                       int NumberOfColors=1000;
+                       int NumberOfColorsHalf=NumberOfColors/2;
+                       colorLookupTable->SetNumberOfTableValues( NumberOfColors );
+                       colorLookupTable->Build();
+                       double rgba1[4];
+                       double rgba2[4];
+                       int iLookTable;
+                       for (iLookTable = 0; iLookTable<NumberOfColorsHalf; iLookTable++)
+                       {
+                               colorLookupTable->GetTableValue(                         iLookTable, rgba1      );
+                               colorLookupTable->GetTableValue(NumberOfColors-1-iLookTable, rgba2      );
+                               colorLookupTable->SetTableValue(NumberOfColors-1-iLookTable, rgba1[0],rgba1[1],rgba1[2],rgba1[3]        );
+                               colorLookupTable->SetTableValue(                         iLookTable, rgba2[0],rgba2[1],rgba2[2],rgba2[3]        );
                        } // for iLookTable     
-               } // if
-  } // firsttime
-
-  if (bbGetInputRange().size()==2)
-  {
-    _colorLookupTable->SetTableRange( bbGetInputRange()[0],bbGetInputRange()[1]);
-  } else {
-    _colorLookupTable->SetTableRange( 0,1 );
-  }
-  
-  double rgb[3];
-  _colorLookupTable->GetColor( bbGetInputScalarValue() , rgb );
-  std::vector<double>colorRGB;
-  colorRGB.push_back( rgb[0] );
-  colorRGB.push_back( rgb[1] );
-  colorRGB.push_back( rgb[2] );
-
-  bbSetOutputColor( colorRGB );
-  bbSetOutputLookupTable(_colorLookupTable);
-  
+                       
+                       // Transparency
+                       if (bbGetInputType()==0)   
+                       {
+                               // First Element
+                               double rgba[4];
+                               colorLookupTable->GetTableValue(0,rgba);
+                               rgba[3]=0;
+                               colorLookupTable->SetTableValue(0,rgba);
+                               
+                               // Middle  range
+                               int i,iMax=(NumberOfColors/16)*4;
+                               for (i=0;i<iMax;i++)
+                               {
+                                       colorLookupTable->GetTableValue(NumberOfColorsHalf+i, rgba);
+                                       rgba[3]=(double)i/(double)iMax;
+                                       colorLookupTable->SetTableValue(NumberOfColorsHalf+i,rgba);
+                                       colorLookupTable->GetTableValue(NumberOfColorsHalf-i, rgba);
+                                       rgba[3]=(double)i/(double)iMax;
+                                       colorLookupTable->SetTableValue(NumberOfColorsHalf-i,rgba);
+                               } // for
+                       } //if Type 0                   
+                       
+                       colorLookupTable->Modified();
+                       _scalarstocolors = colorLookupTable;
+               } // if Type 0 || 100 
+
+//EED 2018-06-8 ***********************ARDS Projet***********************************************
+               if ((bbGetInputType()==1) || (bbGetInputType()==101) )
+               {
+                       vtkLookupTable *colorLookupTable = vtkLookupTable::New();
+                       if (bbGetInputRange().size()==2)
+                       {
+                               colorLookupTable->SetRange( bbGetInputRange()[0],bbGetInputRange()[1]);
+//                             colorLookupTable->SetTableRange( bbGetInputRange()[0],bbGetInputRange()[1]);
+                               colorLookupTable->SetBelowRangeColor(1,1,1,0);  // White transparent 
+                               colorLookupTable->SetAboveRangeColor(1,1,1,0);  // White transparent 
+                               colorLookupTable->UseBelowRangeColorOn();
+                               colorLookupTable->UseAboveRangeColorOn();
+
+                       } else {
+                               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();
+                       // Transparency
+                       if (bbGetInputType()==1) 
+                       {
+                               // First Element
+                               double rgba[4];
+                               colorLookupTable->GetTableValue(0,rgba);
+                               rgba[3]=0;
+                               colorLookupTable->SetTableValue(0,rgba);
+                       } // if Type 1
+                       _scalarstocolors = colorLookupTable;
+               } // If Type 1 || 101
+
+
+               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
+       double rgb[3];
+       std::vector<double>colorRGB;
+       _scalarstocolors->GetColor( bbGetInputScalarValue() , rgb );
+       colorRGB.push_back( rgb[0] );
+       colorRGB.push_back( rgb[1] );
+       colorRGB.push_back( rgb[2] );
+       bbSetOutputColor( colorRGB );
+       bbSetOutputLookupTable( _scalarstocolors );
+
+
 }
 //===== 
 // 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)
@@ -84,9 +362,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)