]> Creatis software - creaVtk.git/blob - lib/creaVtk/vtkTensorsVisu.cpp
#2506 creaVtk Bug New Normal - Color Tensors
[creaVtk.git] / lib / creaVtk / vtkTensorsVisu.cpp
1 /*
2 # ---------------------------------------------------------------------
3 #
4 # Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image
5 #                        pour la Sante)
6 # Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton
7 # Previous Authors : Laurent Guigues, Jean-Pierre Roux
8 # CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil
9 #
10 #  This software is governed by the CeCILL-B license under French law and
11 #  abiding by the rules of distribution of free software. You can  use,
12 #  modify and/ or redistribute the software under the terms of the CeCILL-B
13 #  license as circulated by CEA, CNRS and INRIA at the following URL
14 #  http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
15 #  or in the file LICENSE.txt.
16 #
17 #  As a counterpart to the access to the source code and  rights to copy,
18 #  modify and redistribute granted by the license, users are provided only
19 #  with a limited warranty  and the software's author,  the holder of the
20 #  economic rights,  and the successive licensors  have only  limited
21 #  liability.
22 #
23 #  The fact that you are presently reading this means that you have had
24 #  knowledge of the CeCILL-B license and that you accept its terms.
25 # ------------------------------------------------------------------------
26 */
27
28 #include "vtkTensorsVisu.h"
29
30 #include "vtkProperty.h"
31 #include "vtkFloatArray.h"
32
33
34 //------------------------------------------------------------------------
35 vtkTensorsVisu::vtkTensorsVisu() : vtkVectorsTensorsVisuBase()
36 {
37         ss                                      = vtkSphereSource::New();
38         superquadratic  = vtkSuperquadricSource::New();
39         cs                                      = vtkCubeSource::New(); 
40         tg                                      = vtkTensorGlyph::New();
41         pdn                                     = vtkPolyDataNormals::New();
42         pd                                      = vtkPolyData::New();
43         pod                                     = vtkPointData::New();
44 }
45
46 //------------------------------------------------------------------------
47 vtkTensorsVisu::~vtkTensorsVisu()
48 {
49 }
50
51
52 //------------------------------------------------------------------------
53 void vtkTensorsVisu::Process()
54 {
55 printf("EED vtkTensorsVisu::Process Start\n");
56
57   if (_active==true)
58   {
59         if(GetTypeForm()==2)                                                            // source superquadratic
60         {
61                 superquadratic->SetThetaResolution(20);
62                 superquadratic->SetPhiResolution(20);
63                 tg->SetSource(superquadratic->GetOutput());
64 superquadratic->Print( std::cout );
65
66         } else if(GetTypeForm()==1) {                                   // source sphere
67                 tg->SetSource(ss->GetOutput());
68 ss->Print( std::cout );
69         } else {                                                                                                // source cube
70                 tg->SetSource(cs->GetOutput());         
71 cs->Print( std::cout );
72         }
73
74
75 //GetDataObject()->Print( std::cout );
76
77
78         tg->SetInput( GetDataObject() );
79         //              tg->ScalingOn();
80         //              tg->SetScaling(25);
81         //if(isfromcal)
82         tg->SetScaleFactor( GetScaleFactor() );
83 //EED04
84 //      tg->ScalingOn(  );      
85
86         //else
87         //      //tg->SetScaleFactor(2);
88         //      tg->SetScaleFactor(scale_factor);
89 //EED   tg->Update();
90
91         //The normals are needed to generate the right colors and if
92         // not used some of the glyphs are black.
93         pdn->SetInput(tg->GetOutput());
94 //EED   pdn->Update();
95
96
97         //EED================================
98         //pdm->SetInput( tg->GetOutput());
99         //pdm->SetScalarRange( range );
100
101         //vtkPolyData           *pd                     = tg->GetOutput();
102         //vtkPointData  *pointdata      = pd->GetPointData();
103         //vtkDataArray  *da                     = pointdata->GetVectors();
104
105         //vtkDataArray *nda = vtkFloatArray::New();
106         //nda->DeepCopy(da);
107
108         //pointdata->AddArray( nda );
109         //reader->GetOutput()->GetPointData()->AddArray( nda );
110
111         //pdm->SetInput(pdn->GetOutput());
112         //pdm->ScalarVisibilityOn();
113         //pdm->SetLookupTable(vLutEED);
114         //pdm->SetColorModeToMapScalars();
115         //pdm->SelectColorArray("color");
116         //pdm->SetScalarModeToUsePointFieldData();
117         //pdm->ImmediateModeRenderingOn();
118         //=====================================
119
120         _pdm->SetInput( pdn->GetOutput() );
121
122 //EED04
123 //      _pdm->ImmediateModeRenderingOn();
124 //   _pdm->ScalarVisibilityOn();
125 //   _pdm->SetScalarModeToUsePointFieldData();
126
127
128
129 //   _pdm->SetScalarModeToUseFieldData();
130 //   _pdm->SetScalarModeToUseCellFieldData();
131 //   _pdm->SetScalarModeToUsePointFieldData();
132 //   _pdm->SetScalarModeToUseCellData();
133 //   _pdm->SetScalarModeToUsePointData();
134 //   _pdm->SetScalarModeToDefault();
135
136
137
138 //EED   _pdm->Update();
139
140         _actor->SetMapper( _pdm );
141    _actor->GetProperty()->SetOpacity( GetOpacity() );
142
143 //EED04.1
144 //   tg->ColorGlyphsOff();
145 //   tg->Update();
146 //        vtkDataArray* s = tg->GetOutput()->GetPointData()->GetScalars();
147 //   if (s) _pdm->SetScalarRange( s->GetRange() );
148
149
150 //EED04.2
151 //   tg->ExtractEigenvaluesOff();
152 //   tg->Update();
153 //        vtkDataArray* s = tg->GetOutput()->GetPointData()->GetScalars();
154 //   if (s) _pdm->SetScalarRange( s->GetRange() );
155
156 //EED04.3
157 //   tg->SetColorModeToEigenvalues();
158 //        tg->ThreeGlyphsOn();
159 //   tg->Update();
160 //        vtkDataArray* s = tg->GetOutput()->GetPointData()->GetScalars();
161 //   if (s) _pdm->SetScalarRange( s->GetRange() );
162
163 //EED04.4
164    tg->SetColorModeToEigenvalues();
165 //   tg->SetColorModeToScalars();
166 //      tg->ThreeGlyphsOn();
167 //      tg->SymmetricOn();
168    tg->Update();
169 //        vtkDataArray* s = tg->GetOutput()->GetPointData()->GetScalars();
170 //   if (s) _pdm->SetScalarRange( s->GetRange() );
171
172
173 //EED03
174 //      tg->ColorGlyphsOn();
175 //      tg->ExtractEigenvaluesOn();
176 //      tg->SetColorModeToEigenvalues();
177
178
179 //EED02
180 //    tg->ColorGlyphsOff();
181 //    tg->ThreeGlyphsOff();
182 //    tg->ExtractEigenvaluesOff();
183 //    tg->Update();
184
185 //EED01
186 //      _pdm->SetLookupTable( _LutEED );
187 //   _pdm->SelectColorArray( "Normals" );
188
189
190         //int tcg = tg->GetColorGlyphs();
191 //      tg->SetColorGlyphs(10);
192 //      tg->SetColorModeToScalars();
193         //tg->ThreeGlyphsOn();
194
195
196         //vtkDataArray* da = vtkDataArray::New();
197         pd = tg->GetOutput();
198         pd->Update();
199         pod = pd->GetPointData();
200         pod->Update();
201 //EED1  if(pod->GetScalars())
202 //EED1  {
203 //EED1          _pdm->SetScalarRange(pod->GetScalars()->GetRange());
204 //EED1  }
205         //pdm->SelectColorArray("GlyphVector");
206
207 //EED   _pdm->Update(); 
208
209
210 //EED1                  tg->Print( std::cout );
211 //EED1          printf("EED vtkTensorsVisu::Process  ------------------------------------------\n");
212 //EED1                  pd->Print( std::cout );
213
214
215                         tg->Update();
216                         vtkPolyData             *pd_pdn                         = pdn->GetOutput();
217                         vtkPointData    *pointdata_pdn          = pd_pdn->GetPointData();
218
219                         vtkPolyData             *pd_tg                          = tg->GetOutput();
220                         vtkPointData    *pointdata_tg           = pd_tg->GetPointData();
221
222                         vtkPolyData             *pd_do                          = (vtkPolyData*)GetDataObject();
223                         vtkPointData    *pointdata_do           = pd_do->GetPointData();
224
225
226 //EED1          printf("EED vtkTensorsVisu::Process  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx\n");
227 //EED1                  pointdata->Print( std::cout );
228                         
229 /*
230                         int aa = pd_tg->GetNumberOfPieces ();
231                         int bb = pd_tg->GetNumberOfVerts ();
232                         int cc = pd_tg->GetNumberOfLines ();
233                         int dd = pd_tg->GetNumberOfPolys ();
234                         int ee = pd_tg->GetNumberOfStrips ();
235                         int ff = pd_tg->GetNumberOfCells();
236
237                 printf("EED vtkTensorsVisu::Process  pd_tg  %d %d %d %d %d %d \n", aa,bb,cc,dd,ee,ff);
238
239
240                         aa = pd_pdn->GetNumberOfPieces ();
241                         bb = pd_pdn->GetNumberOfVerts ();
242                         cc = pd_pdn->GetNumberOfLines ();
243                         dd = pd_pdn->GetNumberOfPolys ();
244                         ee = pd_pdn->GetNumberOfStrips ();
245                         ff = pd_pdn->GetNumberOfCells();
246
247 //              printf("EED vtkTensorsVisu::Process  pd_pdn  %d %d %d %d %d %d \n", aa,bb,cc,dd,ee,ff);
248 */
249
250                         vtkPolyData *ttt = (vtkPolyData *)GetDataObject();
251                         int numPnts = ttt->GetNumberOfPoints();
252 //                      printf("EED vtkTensorsVisu::Process  numPnts %d \n", numPnts );
253
254                         vtkIdType numSourcePts, numSourceCells;
255                         vtkPoints *sourcePts;
256                         sourcePts = tg->GetSource()->GetPoints();
257                         numSourcePts = sourcePts->GetNumberOfPoints();
258                         numSourceCells = tg->GetSource()->GetNumberOfCells();
259 //                      printf("EED vtkTensorsVisu::Process  numSourcePts %d   numSourceCells %d\n", numSourcePts, numSourceCells);
260
261                         vtkDataArray *tensorsArray = pointdata_do->GetArray("tensors");
262                         if (tensorsArray)
263          {
264                       vtkFloatArray     *newScalarArray                         = vtkFloatArray::New();
265                                 newScalarArray->SetName( "NormalsEED" );
266                                 newScalarArray->SetNumberOfComponents(3); 
267                                 int             iNumPts,iNumSourcePts;
268                                 int             iNormalsEED=0;
269                                 double  *normalValue;
270                            double   sumEigenvalue,sumEigenvalue1,sumEigenvalue2,sumEigenvalue3;
271                                 double   dirx,diry,dirz;
272                                 int      idEigen;
273                                 for (iNumPts=0;iNumPts<numPnts;iNumPts++)
274                                 {
275                                         normalValue     = tensorsArray->GetTuple9(iNumPts);
276                 sumEigenvalue1 = sqrt (normalValue[0]*normalValue[0] + normalValue[1]*normalValue[1] + normalValue[2]*normalValue[2]);
277                 sumEigenvalue2 = sqrt (normalValue[3]*normalValue[3] + normalValue[4]*normalValue[4] + normalValue[5]*normalValue[5]);
278                 sumEigenvalue3 = sqrt (normalValue[6]*normalValue[6] + normalValue[7]*normalValue[7] + normalValue[8]*normalValue[8]);
279
280                                         if ((sumEigenvalue1>=sumEigenvalue2) && (sumEigenvalue1>=sumEigenvalue3))
281                                         {
282                                                 sumEigenvalue=sumEigenvalue1;
283                                                 idEigen=0;
284                                         }
285                                         if ((sumEigenvalue2>sumEigenvalue1) && (sumEigenvalue2>=sumEigenvalue3))
286                                         {
287                                                 sumEigenvalue=sumEigenvalue2;
288                                                 idEigen=3;
289                                         }
290                                         if ((sumEigenvalue3>=sumEigenvalue1) && (sumEigenvalue3>=sumEigenvalue2))
291                                         {
292                                                 sumEigenvalue=sumEigenvalue3;
293                                                 idEigen=6;
294                                         }
295
296                                                 dirx = fabs(normalValue[idEigen+0]/sumEigenvalue);
297                                                 diry = fabs(normalValue[idEigen+1]/sumEigenvalue);
298                                                 dirz = fabs(normalValue[idEigen+2]/sumEigenvalue);
299 //printf("%f %f %f\n",dirx, diry,dirz );
300 //printf("%f %f %f\n",sumEigenvalue1, sumEigenvalue2, sumEigenvalue3 );
301 //printf("%f %f %f\n", normalValue[0], normalValue[1], normalValue[2] );
302
303
304                                         for (iNumSourcePts=0;iNumSourcePts<numSourcePts;iNumSourcePts++)
305                                         {
306                                                 newScalarArray->InsertTuple3( iNormalsEED, dirx,diry,dirz );
307                                                 iNormalsEED++;
308                                         } // for iNumSourcePts
309
310                                 } 
311                            pointdata_tg->RemoveArray( "NormalsEED" );
312                                 pointdata_tg->AddArray( newScalarArray );
313                                 pointdata_pdn->Update();
314                                 tg->Update();
315                         }
316
317
318
319                 _LutEED->SetVectorModeToRGBColors();
320                         _pdm->SetLookupTable( _LutEED );
321                    _pdm->SelectColorArray( "NormalsEED" );
322
323
324
325 _pdm->ScalarVisibilityOn();
326 _pdm->SetColorModeToMapScalars();
327 // _pdm->SetColorModeToDirectScalars();  // NOT compile
328 _pdm->SetScalarModeToUsePointFieldData();
329 _pdm->ImmediateModeRenderingOn();
330
331 /*
332                         int i,sizeDa = pointdata_tg->GetNumberOfArrays();
333                         printf("EED vtkTensorsVisu::Process  sizeDa %d \n", sizeDa );
334                         for (i=0;i<sizeDa;i++)
335                         {
336                                 int faces = pointdata_tg->GetArray(i)->GetSize() / numPnts;
337 //pointdata_pdn->GetArray(i)->Print( std::cout );
338                                 printf("EED vtkTensorsVisu::Process-name %d, %s, size=%d   %d \n", i, pointdata_tg->GetArrayName(i) , pointdata_tg->GetArray(i)->GetSize(), faces );
339
340                         }
341 */
342
343
344
345
346   } // _active
347
348     VisibilityActor(); 
349
350 printf("EED vtkTensorsVisu::Process End.\n");
351 }
352