X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=bbtk_creaVtk_PKG%2Fsrc%2FbbcreaVtkScalarsToColors.cxx;h=50c2cbc2e8532df3618d09af7bf6955a5390e5ec;hb=2e8c7cadbf9be911a9621142f95d81807d6c0402;hp=e4524c6514a703f050415dbd438abc87b7e151f4;hpb=3731e458fae455b3e0dfe05e56fd96d1f59140a3;p=creaVtk.git diff --git a/bbtk_creaVtk_PKG/src/bbcreaVtkScalarsToColors.cxx b/bbtk_creaVtk_PKG/src/bbcreaVtkScalarsToColors.cxx index e4524c6..50c2cbc 100644 --- a/bbtk_creaVtk_PKG/src/bbcreaVtkScalarsToColors.cxx +++ b/bbtk_creaVtk_PKG/src/bbcreaVtkScalarsToColors.cxx @@ -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: ["<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 +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(input[0]); + diry = static_cast(input[1]); + dirz = static_cast(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(input[0]); // red + *output++ = static_cast(input[1]); // green + *output++ = static_cast(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(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 = " <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; iLookTableGetTableValue( 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::vectorcolorRGB; - 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;iGetTableValue(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::vectorcolorRGB; + _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)