Developer documentation | Axl-2.5.1

axlActorFieldParametric.cpp
Go to the documentation of this file.
1 /* axlActorFieldParametric.cpp ---
2  *
3  * Author: Anais Ducoffe
4  * Copyright (C) 20013- Anais Ducoffe, Inria.
5  */
6 
7 /* Commentary:
8  *
9  */
10 
11 /* Change log:
12  *
13  */
14 
17 #include "axlActor.h"
18 #include "axlActorDataDynamic.h"
27 #include <axlCore/axlMesh.h>
28 
31 
32 #include <dtkCoreSupport/dtkGlobal.h>
33 
34 #include <vtkActor.h>
35 #include <vtkArrowSource.h>
36 #include <vtkCommand.h>
37 #include <vtkContourFilter.h>
38 #include <vtkDataSetMapper.h>
39 #include <vtkCellData.h>
40 #include <vtkGlyph3D.h>
41 #include <vtkHedgeHog.h>
42 #include <vtkObjectFactory.h>
43 #include <vtkPointData.h>
44 #include <vtkPolyDataMapper.h>
45 #include <vtkRenderWindowInteractor.h>
46 #include <vtkSmartPointer.h>
47 #include <vtkSphere.h>
48 #include <vtkSphereRepresentation.h>
49 #include <vtkSphereSource.h>
50 #include <vtkSphereWidget2.h>
51 #include <vtkStreamTracer.h>
52 #include <vtkTubeFilter.h>
53 #include <vtkPolyData.h>
54 #include <vtkUnstructuredGrid.h>
55 
56 #include <vtkDataArray.h>
57 #include <vtkFloatArray.h>
58 #include <vtkIntArray.h>
59 #include <vtkDoubleArray.h>
60 
61 #include <vtkExtractUnstructuredGrid.h>
62 
63 // /////////////////////////////////////////////////////////////////
64 // axlActorFieldParametricStreamObserver
65 // /////////////////////////////////////////////////////////////////
66 
67 class axlActorFieldParametricStreamObserver : public vtkCommand
68 {
69 public:
71  {
73  }
74 
75  virtual void Execute(vtkObject *caller, unsigned long event, void *)
76  {
77 // if(event == vtkCommand::InteractionEvent) {
78 
79 // vector_stream_widget_representation->GetPolyData(vector_stream_widget_data);
80 //#if (VTK_MAJOR_VERSION <= 5)
81 // vector_stream_tracer->SetSource(vector_stream_widget_data);
82 //#else
83 // vector_stream_tracer->SetSourceData(vector_stream_widget_data);
84 //#endif
85 // vector_stream_tracer->Update();
86 // }
87  }
88 
89  vtkSmartPointer<vtkSphereRepresentation> vector_stream_widget_representation;
90  vtkSmartPointer<vtkPolyData> vector_stream_widget_data;
91  vtkSmartPointer<vtkStreamTracer> vector_stream_tracer;
92 };
93 
94 // /////////////////////////////////////////////////////////////////
95 // axlActorFieldParametricPrivate
96 // /////////////////////////////////////////////////////////////////
97 
98 class axlActorFieldParametricPrivate
99 {
100 public:
102  axlActor *mesh;
103  vtkDataArray *array;
104 
105 public:
106  bool scalar_display_as_iso;
107  int scalar_iso_count;
108  double scalar_iso_range[2];
109  vtkSmartPointer<vtkTubeFilter> scalar_iso_tube_filter;
110  double isoRadius;
111  vtkSmartPointer<vtkContourFilter> scalar_iso;
112  vtkSmartPointer<vtkPolyDataMapper> scalar_iso_mapper;
113  vtkSmartPointer<vtkActor> scalar_iso_actor;
114 
115  vtkSmartPointer<vtkPolyDataMapper> scalar_iso_color_mapper;
116  vtkSmartPointer<vtkActor> scalar_iso_color_actor;
117 
118  vtkSmartPointer<vtkScalarBarActor> scalar_bar_actor;
119 
120  double scalar_color_range[2];
121  vtkSmartPointer<vtkDataSetMapper> scalar_color_mapper;
122  vtkSmartPointer<vtkActor> scalar_color_actor;
123 
124  vtkSmartPointer<vtkHedgeHog> vector_hedgehog;
125  vtkSmartPointer<vtkPolyDataMapper> vector_hedgehog_mapper;
126  vtkSmartPointer<vtkActor> vector_hedgehog_actor;
127 
128  vtkSmartPointer<vtkArrowSource> vector_glyph_source;
129  vtkSmartPointer<vtkGlyph3D> vector_glyph;
130  vtkSmartPointer<vtkPolyDataMapper> vector_glyph_mapper;
131  vtkSmartPointer<vtkActor> vector_glyph_actor;
132 
133  vtkSmartPointer<vtkSphereWidget2> vector_stream_widget;
134  vtkSmartPointer<vtkSphereRepresentation> vector_stream_widget_representation;
135  vtkSmartPointer<vtkPolyData> vector_stream_widget_data;
136  vtkSmartPointer<vtkStreamTracer> vector_stream_tracer;
137  vtkSmartPointer<vtkTubeFilter> vector_stream_filter;
138  vtkSmartPointer<vtkPolyDataMapper> vector_stream_mapper;
139  vtkSmartPointer<vtkActor> vector_stream_actor;
140  vtkSmartPointer<axlActorFieldParametricStreamObserver> vector_stream_observer;
141 
142  vtkSmartPointer<vtkRenderWindowInteractor> interactor;
143 };
144 
145 // /////////////////////////////////////////////////////////////////
146 // axlActorFieldParametric
147 // /////////////////////////////////////////////////////////////////
148 
149 #if (VTK_MAJOR_VERSION <= 5)
150 vtkCxxRevisionMacro(axlActorFieldParametric, "$Revision: 0.0.1 $");
151 #endif
152 
154 
155 dtkAbstractData *axlActorFieldParametric::data(void)
156 {
157  return NULL;
158 }
159 
161 {
162  if(d->field){
163  return d->field;
164  }
165  return NULL;
166 }
167 
169 {
170  if(d->mesh->fields().contains(QString("%1 magnitude").arg(d->field->objectName())))
171  return NULL;
172 
173  QString field_magnitude_name = QString("%1 magnitude").arg(d->field->objectName());
174 
175 
176 
177  double size = d->field->size();
178  // TO DO
179  // double *tuple;
180  axlFieldDiscrete *field_magnitude = new axlFieldDiscrete(field_magnitude_name, d->field->type(), axlFieldDiscrete::Scalar, d->field->support(), size);
181 
182  // utiliser les parametres pour evaluer.
183  // double u = d->field->start_u();
184  // double v = d->field->start_v();
185  // double w = d->field->start_w();
186 
187  // double step_u = (d->field->end_u() - d->field->start_u())/(d->field->numbersample_u());
188  // double step_v = (d->field->end_v() - d->field->start_v())/(d->field->numbersample_v());
189  // double step_w = (d->field->end_w() - d->field->start_w())/(d->field->numbersample_w());
190  for(int i = 0; i < size; i++){
191  // tuple = d->field->vector(u, v, w);
192  // field_magnitude->setScalar(i, qSqrt(tuple[0]*tuple[0]+tuple[0]*tuple[0]+tuple[0]*tuple[0]));
193  }
194  return field_magnitude;
195 }
196 
197 
198 
200 {
201  return d->mesh;
202 }
203 
204 vtkScalarBarActor *axlActorFieldParametric::scalarBar(void){
205  return d->scalar_bar_actor;
206 }
207 
208 
210 {
211  return d->scalar_color_range[0];
212 }
213 
215 {
216  return d->scalar_color_range[1];
217 }
218 
220 {
221  return d->scalar_iso->GetNumberOfContours();
222 }
223 
225 {
226  return d->scalar_iso_range[0];
227 }
228 
230 {
231  return d->scalar_iso_range[1];
232 }
233 
235 {
236  return d->vector_glyph->GetScaleFactor();
237 }
238 
240 {
241  return d->vector_stream_filter->GetRadius();
242 }
243 
245 {
246  d->interactor = static_cast<vtkRenderWindowInteractor *>(interactor);
247 
248  this->setup();
249 }
250 
252  int size = 0;
253  size = d->field->size();
254  //qDebug() << Q_FUNC_INFO << 1 << size;
255  d->array->SetNumberOfTuples(size);
256 
257  if(!d->mesh->getUnstructuredGrid() && !d->mesh->getPolyData()){
258  if(dynamic_cast<axlActorDataDynamic *>(d->mesh)){
259  axlActorDataDynamic *actorDD = dynamic_cast<axlActorDataDynamic *>(d->mesh);
260  d->mesh->setPolyData(dynamic_cast<axlActor *>(actorDD->outputActor())->getMapper()->GetInput());
261  }else{
262  d->mesh->setPolyData(d->mesh->getMapper()->GetInput());
263  }
264  }
265 
266  //fill array according to the field support is a curve, a surface or a volume.
267 
268 
269  //curve
270  if(dynamic_cast<axlAbstractFieldParametricCurve *>(d->field)){
271 
272  axlAbstractFieldParametricCurve *fieldSurface = dynamic_cast<axlAbstractFieldParametricCurve *>(d->field);
273 
274  double start_u = fieldSurface->start_u();
275  double end_u = fieldSurface->end_u();
276 
277  double u = start_u;
278 
279  int n_u = fieldSurface->numbersample_u();
280 
281  double step_u = (end_u - start_u)/(n_u);
282 
283 
284 
285 
286  for(int i = 0; i < n_u - 1; i++)
287  {
288 
289  if(d->field->kind()==axlAbstractFieldParametric::Scalar){
290  d->array->SetTuple1( i, fieldSurface->scalar(u));
291  d->array->Modified();
292  }else if(d->field->kind()==axlAbstractFieldParametric::Vector){
293  d->array->SetTuple( i, fieldSurface->vector(u));
294  d->array->Modified();
295  }else if(d->field->kind()==axlAbstractFieldParametric::Tensor){
296  d->array->SetTuple( i, fieldSurface->tensor(u));
297  d->array->Modified();
298  }
299 
300  u += step_u;
301 
302  }
303 
304  }
305 
306  //surface
307  else if(dynamic_cast<axlAbstractFieldParametricSurface *>(d->field)){
308 
309  axlAbstractFieldParametricSurface *fieldSurface = dynamic_cast<axlAbstractFieldParametricSurface *>(d->field);
310 
311  double start_u = fieldSurface->start_u();
312  double start_v = fieldSurface->start_v();
313  double end_u = fieldSurface->end_u();
314  double end_v = fieldSurface->end_v();
315 
316  double u = start_u;
317  double v = start_v;
318 
319  int n_u = fieldSurface->numbersample_u();
320  int n_v = fieldSurface->numbersample_v();
321 
322  double step_u = (end_u - start_u)/(n_u);
323  double step_v = (end_v - start_v)/(n_v);
324 
325 
326 
327  for(int j = 0; j < n_v - 1; j++)
328  {
329  for(int i = 0; i < n_u - 1; i++)
330  {
331 
332  if(d->field->kind()==axlAbstractFieldParametric::Scalar){
333  d->array->SetTuple1(j * n_u + i, fieldSurface->scalar(u,v));
334  d->array->Modified();
335  }else if(d->field->kind()==axlAbstractFieldParametric::Vector){
336  d->array->SetTuple(j * n_u + i, fieldSurface->vector(u,v) );
337  d->array->Modified();
338  }else if(d->field->kind()==axlAbstractFieldParametric::Tensor){
339  d->array->SetTuple(j * n_u + i, fieldSurface->tensor(u,v));
340  d->array->Modified();
341  }
342 
343  u += step_u;
344 
345  }
346 
347  if(d->field->kind()==axlAbstractFieldParametric::Scalar){
348  d->array->SetTuple1(j * n_u + n_u - 1 , fieldSurface->scalar(end_u,v));
349  d->array->Modified();
350  }else if(d->field->kind()==axlAbstractFieldParametric::Vector){
351  d->array->SetTuple(j * n_u + n_u - 1 , fieldSurface->vector(end_u,v));
352  d->array->Modified();
353  }else if(d->field->kind()==axlAbstractFieldParametric::Tensor){
354  d->array->SetTuple(j * n_u + n_u - 1 , fieldSurface->tensor(end_u,v));
355  d->array->Modified();
356  }
357 
358  u = start_u;
359  v += step_v;
360  }
361 
362  for(int i = 0; i < n_u - 1; i++)
363  {
364  if(d->field->kind()== axlAbstractFieldParametric::Scalar){
365  d->array->SetTuple1((n_v - 1) * n_u + i, fieldSurface->scalar(u,end_v));
366  d->array->Modified();
367  }else if(d->field->kind()== axlAbstractFieldParametric::Vector){
368  d->array->SetTuple((n_v - 1) * n_u + i, fieldSurface->vector(u,end_v));
369  d->array->Modified();
370  }else if(d->field->kind()== axlAbstractFieldParametric::Tensor){
371  d->array->SetTuple((n_v - 1) * n_u + i, fieldSurface->tensor(u,end_v));
372  d->array->Modified();
373  }
374 
375  u += step_u;
376  }
377 
378  if(d->field->kind()== axlAbstractFieldParametric::Scalar){
379  d->array->SetTuple1(n_v * n_u - 1,fieldSurface->scalar(end_u,end_v));
380  d->array->Modified();
381  }else if(d->field->kind()== axlAbstractFieldParametric::Vector){
382  d->array->SetTuple(n_v * n_u - 1,fieldSurface->vector(end_u,end_v));
383  d->array->Modified();
384  }else if(d->field->kind()== axlAbstractFieldParametric::Tensor){
385  d->array->SetTuple(n_v * n_u - 1,fieldSurface->tensor(end_u,end_v));
386  d->array->Modified();
387  }
388 
389 
390  }//volume
391  else if(dynamic_cast<axlAbstractFieldParametricVolume *>(d->field)){
392 
393  axlAbstractFieldParametricVolume *fieldVolume = dynamic_cast<axlAbstractFieldParametricVolume *>(d->field);
394  double start_u = fieldVolume->start_u();
395  double start_v = fieldVolume->start_v();
396  double start_w = fieldVolume->start_w();
397  double end_u = fieldVolume->end_u();
398  double end_v = fieldVolume->end_v();
399  double end_w = fieldVolume->end_w();
400 
401  double u = start_u;
402  double v = start_v;
403  double w = start_w;
404 
405  int n_u = fieldVolume->numbersample_u();
406  int n_v = fieldVolume->numbersample_v();
407  int n_w = fieldVolume->numbersample_w();
408 
409  double step_u = (end_u - start_u)/(n_u);
410  double step_v = (end_v - start_v)/(n_v);
411  double step_w = (end_w - start_w)/(n_w);
412 
413  int ind1 = 0;
414  int ind2 = 0;
415  int ind3 = 0;
416  for(int k = 0; k < n_w - 1; k++)
417  {
418  ind1 = k * n_u * n_v;
419  for(int i = 0; i < n_v - 1; i++)
420  {
421  ind2 = i * n_u;
422  for(int j = 0; j < n_u - 1; j++)
423  {
424  ind3 = ind1 + ind2 +j;
425  if(d->field->kind()== axlAbstractFieldParametric::Scalar){
426  d->array->SetTuple1(ind3,fieldVolume->scalar(u, v,w));
427  d->array->Modified();
428  }else if(d->field->kind()== axlAbstractFieldParametric::Vector){
429  //qDebug() << Q_FUNC_INFO << 2;
430  // double *tab = fieldVolume->vector(u, v,w);
431  d->array->Modified();
432  //qDebug() << Q_FUNC_INFO << 3 << " " << tab[0] << " "<< tab[1]<< " " << tab[2] ;
433  d->array->SetTuple(ind3,fieldVolume->vector(u, v,w));
434  }else if(d->field->kind()== axlAbstractFieldParametric::Tensor){
435  d->array->SetTuple(ind3,fieldVolume->tensor(u, v,w));
436  d->array->Modified();
437  }
438  u += step_u;
439  }
440  ind3 = ind1 + ind2 + (n_u - 1);
441  if(d->field->kind()== axlAbstractFieldParametric::Scalar){
442  d->array->SetTuple1(ind3,fieldVolume->scalar(end_u, v, w));
443  d->array->Modified();
444  }else if(d->field->kind()== axlAbstractFieldParametric::Vector){
445  d->array->SetTuple(ind3,fieldVolume->vector(end_u, v, w));
446  d->array->Modified();
447  }else if(d->field->kind()== axlAbstractFieldParametric::Tensor){
448  d->array->SetTuple(ind3,fieldVolume->tensor(end_u, v, w));
449  d->array->Modified();
450  }
451 
452  u = start_u;
453  v += step_v;
454  }
455  ind3 = ind1 + (n_v -1)* n_u + (n_u - 1);
456  if(d->field->kind()== axlAbstractFieldParametric::Scalar){
457  d->array->SetTuple1(ind3,fieldVolume->scalar(end_u, end_v, w));
458  d->array->Modified();
459  }else if(d->field->kind()== axlAbstractFieldParametric::Vector){
460  d->array->SetTuple(ind3,fieldVolume->vector(end_u, end_v, w));
461  d->array->Modified();
462  } else if(d->field->kind()== axlAbstractFieldParametric::Tensor){
463  d->array->SetTuple(ind3,fieldVolume->tensor(end_u, end_v, w));
464  d->array->Modified();
465  }
466 
467 
468  u = start_u;
469  v = start_v;
470  w += step_w;
471  }
472 
473 
474  ind1 = n_u * n_v * (n_w - 1);
475  for(int j = 0; j < n_v - 1; j++)
476  {
477  ind2 = j * n_u;
478  for(int i = 0; i < n_u - 1; i++)
479  {
480  ind3 = ind1 + ind2 + i;
481  if(d->field->kind()== axlAbstractFieldParametric::Scalar){
482  d->array->SetTuple1(ind3, fieldVolume->scalar(u, v, end_w));
483  d->array->Modified();
484  }else if(d->field->kind()== axlAbstractFieldParametric::Vector){
485  d->array->SetTuple(ind3, fieldVolume->vector(u, v, end_w));
486  d->array->Modified();
487  }else if(d->field->kind()== axlAbstractFieldParametric::Tensor){
488  d->array->SetTuple(ind3, fieldVolume->tensor(u, v, end_w));
489  d->array->Modified();
490  }
491  u+=step_u;
492 
493  }
494  ind3 = ind1 + ind2 + (n_u -1);
495  if(d->field->kind()== axlAbstractFieldParametric::Scalar){
496  d->array->SetTuple1(ind3,fieldVolume->scalar(end_u, v, end_w));
497  d->array->Modified();
498  }else if(d->field->kind()== axlAbstractFieldParametric::Vector){
499  d->array->SetTuple(ind3,fieldVolume->vector(end_u, v, end_w));
500  d->array->Modified();
501  }else if(d->field->kind()== axlAbstractFieldParametric::Tensor){
502  d->array->SetTuple(ind3,fieldVolume->tensor(end_u, v, end_w));
503  d->array->Modified();
504  }
505 
506  u=start_u;
507  v+=step_v;
508  }
509 
510  w=start_w;
511  ind2 = (n_v-1) * n_u;
512 
513  for(int k = 0; k < n_w ; k++)
514  {
515  ind1 = n_u * n_v * k;
516  for(int i = 0; i < n_u - 1; i++)
517  {
518  ind3 = ind1 + ind2 + i;
519  if(d->field->kind()== axlAbstractFieldParametric::Scalar){
520  d->array->SetTuple1(ind3,fieldVolume->scalar(u, end_v, w));
521  d->array->Modified();
522  }else if(d->field->kind()== axlAbstractFieldParametric::Vector){
523  d->array->SetTuple(ind3,fieldVolume->vector(u, end_v, w));
524  d->array->Modified();
525  }else if(d->field->kind()== axlAbstractFieldParametric::Tensor){
526  d->array->SetTuple(ind3,fieldVolume->tensor(u, end_v, w));
527  d->array->Modified();
528  }
529 
530  u+=step_u;
531 
532  }
533  ind3 = ind2 + ind1 + (n_u-1);
534  u=start_u;
535  w+=step_w;
536  }
537 
538  if(d->field->kind()== axlAbstractFieldParametric::Scalar){
539  d->array->SetTuple1(n_u * n_v * n_w -1,fieldVolume->scalar(end_u, end_v, end_w));
540  d->array->Modified();
541  }else if(d->field->kind()== axlAbstractFieldParametric::Vector){
542  d->array->SetTuple(n_u * n_v * n_w -1,fieldVolume->vector(end_u, end_v, end_w));
543  d->array->Modified();
544  }else if(d->field->kind()== axlAbstractFieldParametric::Tensor){
545  d->array->SetTuple(n_u * n_v * n_w -1,fieldVolume->tensor(end_u, end_v, end_w));
546  d->array->Modified();
547  }
548  }
549 
550  //sets the minimum and maximum values of the field.
551  d->field->setMin(this->minValue());
552  d->field->setMax(this->maxValue());
553 
554  //setRange
555  if(d->scalar_color_range && d->scalar_color_mapper){
556  this->setColRangeMin(d->field->minValue());
557  this->setColRangeMax(d->field->maxValue());
558  }
559 }
560 
561 
562 void axlActorFieldParametric::setData(dtkAbstractData *field)
563 {
564  d->field = dynamic_cast<axlAbstractFieldParametric *>(field);
565 
566  if(d->field){
567  //fill array
568  axlAbstractData * parentData = dynamic_cast<axlAbstractData *>(d->field->parent());
569  if(parentData){
570  connect(parentData, SIGNAL(modifiedGeometry()), this, SLOT(update()));
571  }
572  axlAbstractData *axlData = dynamic_cast<axlAbstractData *>(d->mesh->data());
573  connect(axlData, SIGNAL(modifiedGeometry()), this, SLOT(update()));
574 
575  if(d->field->type() == axlAbstractFieldParametric::Int){
576  d->array = vtkIntArray::New();
577  }else if(d->field->type() == axlAbstractFieldParametric::Float){
578  d->array = vtkFloatArray::New();
579  }else if(d->field->type() == axlAbstractFieldParametric::Double){
580  d->array = vtkDoubleArray::New();
581  }
582 
583  axlAbstractFieldParametric::Kind kind = d->field->kind();
584 
585  switch(kind) {
587  d->array->SetNumberOfComponents(1);
588  break;
590  d->array->SetNumberOfComponents(3);
591  break;
593  d->array->SetNumberOfComponents(9);
594  break;
595  default:
596  qDebug() << "Unsupported field kind";
597  };
598 
599  QString name = d->field->objectName();
600  d->array->SetName(qPrintable(name));
601 
602  this->updateArray();
603  this->setup();
604  }
605 
606 }
607 
609 {
610  d->mesh = dynamic_cast<axlActor *>(actorfield);
611 
612  this->setup();
613 }
614 
616 {
617  d->scalar_color_range[0] = min;
618  d->scalar_color_mapper->SetScalarRange(d->scalar_color_range);
619  d->scalar_color_mapper->Update();
620 }
621 
623 {
624  d->scalar_color_range[1] = max;
625  d->scalar_color_mapper->SetScalarRange(d->scalar_color_range);
626  d->scalar_color_mapper->Update();
627 }
628 
630 {
631  d->scalar_iso_count = count;
632  d->scalar_iso->GenerateValues(d->scalar_iso_count, d->scalar_iso_range[0], d->scalar_iso_range[1]);
633  d->scalar_iso->Update();
634 }
635 
637 {
638  d->scalar_iso_range[0] = min;
639  d->scalar_iso->GenerateValues(d->scalar_iso_count, d->scalar_iso_range[0], d->scalar_iso_range[1]);
640  d->scalar_iso->Update();
641  d->scalar_iso_color_mapper->SetScalarRange(d->scalar_iso_range);
642  d->scalar_iso_color_mapper->Update();
643 }
644 
646 {
647  d->scalar_iso_range[1] = max;
648  d->scalar_iso->GenerateValues(d->scalar_iso_count, d->scalar_iso_range[0], d->scalar_iso_range[1]);
649  d->scalar_iso->Update();
650  d->scalar_iso_color_mapper->SetScalarRange(d->scalar_iso_range);
651  d->scalar_iso_color_mapper->Update();
652 }
653 
655 {
656  //compute size of controlPoints
657  double bounds[6]; d->mesh->GetBounds(bounds);
658  double side = qAbs(bounds[1]-bounds[0]);
659  side += qAbs(bounds[3]-bounds[2]);
660  side += qAbs(bounds[5]-bounds[4]);
661 
662  side /= 30;
663  //d->vector_glyph_source->SetShaftRadius(scale * side);
664  //d->vector_glyph_source->SetTipLength(200 *3 * 3.5 * scale * side);
665  //d->vector_glyph_source->SetTipRadius(3 * scale * side);
666  d->vector_glyph->SetScaleFactor(scale * side);
667  d->vector_hedgehog->SetScaleFactor(scale * side * 0.1);
668 }
669 
671 {
672  d->vector_stream_tracer->SetMaximumPropagation(propagation);
673  d->vector_stream_tracer->Update();
674 }
675 
677 {
678  d->vector_stream_filter->SetRadius(radius);
679  d->vector_stream_filter->Update();
680 }
681 
683 {
684  switch (direction) {
685  case 0:
686  d->vector_stream_tracer->SetIntegrationDirectionToForward();
687  break;
688  case 1:
689  d->vector_stream_tracer->SetIntegrationDirectionToBackward();
690  break;
691  case 2:
692  d->vector_stream_tracer->SetIntegrationDirectionToBoth();
693  break;
694  default:
695  break;
696  }
697 
698  d->vector_stream_tracer->Update();
699 }
700 
702 {
703  if (d->mesh->getUnstructuredGrid()) {
704  d->mesh->getDataSetMapper()->ScalarVisibilityOn();
705  } else{
706  d->mesh->getMapper()->ScalarVisibilityOn();
707  }
708 
709  if (d->field->kind() != axlAbstractFieldParametric::Scalar)
710  return;
711 
712  if (d->field->support() == axlAbstractFieldParametric::Point) {
713  if(d->mesh->getUnstructuredGrid()){
714  static_cast<vtkUnstructuredGrid *>(d->mesh->getUnstructuredGrid())->GetPointData()->SetActiveScalars(qPrintable(d->field->objectName()));
715  } else {
716  static_cast<vtkPolyData *>(d->mesh->getPolyData())->GetPointData()->SetActiveScalars(qPrintable(d->field->objectName()));
717  }
718  }
719  if (d->field->support() == axlAbstractFieldParametric::Cell) {
720  if(d->mesh->getUnstructuredGrid()){
721  static_cast<vtkUnstructuredGrid *>(d->mesh->getUnstructuredGrid())->GetCellData()->SetActiveScalars(qPrintable(d->field->objectName()));
722  } else {
723  static_cast<vtkPolyData *>(d->mesh->getPolyData())->GetCellData()->SetActiveScalars(qPrintable(d->field->objectName()));
724  }
725  }
726 
727  d->scalar_color_actor->SetVisibility(1);
728  d->scalar_iso_actor->SetVisibility(0);
729  d->scalar_iso_color_actor->SetVisibility(0);
730  d->scalar_display_as_iso = false;
731  d->scalar_bar_actor->SetVisibility(1);
732 
733 }
734 
736 {
737  if(d->scalar_color_actor)
738  {
739  d->scalar_color_actor->SetVisibility(0);
740  d->scalar_iso_actor->SetVisibility(0);
741  d->scalar_iso_color_actor->SetVisibility(0);
742  d->scalar_display_as_iso = false;
743  d->scalar_bar_actor->SetVisibility(0);
744  }
745  if(d->mesh->getUnstructuredGrid()){
746  d->mesh->getDataSetMapper()->ScalarVisibilityOn();
747  }
748  else{
749  d->mesh->getMapper()->ScalarVisibilityOn();
750  }
751  if(d->field->support() == axlAbstractFieldParametric::Point) {
752  if(d->mesh->getUnstructuredGrid()){
753  static_cast<vtkUnstructuredGrid *>(d->mesh->getUnstructuredGrid())->GetPointData()->SetActiveScalars("mapperCollorArrayDefaultField");
754  }else{
755  static_cast<vtkPolyData *>(d->mesh->getPolyData())->GetPointData()->SetActiveScalars("mapperCollorArrayDefaultField");
756  }
757  }
758 }
759 
761 {
762  if (d->field->kind() != axlAbstractFieldParametric::Scalar)
763  return;
764 
765  if(d->field->support() == axlAbstractFieldParametric::Point) {
766  if (d->mesh->getUnstructuredGrid()) {
767  static_cast<vtkUnstructuredGrid *>(d->mesh->getUnstructuredGrid())->GetPointData()->SetActiveScalars(qPrintable(d->field->objectName()));
768  } else {
769  static_cast<vtkPolyData *>(d->mesh->getPolyData())->GetPointData()->SetActiveScalars(qPrintable(d->field->objectName()));
770  }
771  }
772 
773  if(d->field->support() == axlAbstractFieldParametric::Cell) {
774  if(d->mesh->getUnstructuredGrid()){
775  static_cast<vtkUnstructuredGrid *>(d->mesh->getUnstructuredGrid())->GetCellData()->SetActiveScalars(qPrintable(d->field->objectName()));
776  }
777  else{
778  static_cast<vtkPolyData *>(d->mesh->getPolyData())->GetCellData()->SetActiveScalars(qPrintable(d->field->objectName()));
779  }
780  }
781 
782  if(d->field->support() == axlAbstractFieldParametric::Point) {
783  if(d->mesh->getUnstructuredGrid()){
784  d->mesh->getDataSetMapper()->ScalarVisibilityOff();
785  }
786  else{
787  d->mesh->getMapper()->ScalarVisibilityOff();
788  }
789  }
790 
791  d->scalar_color_actor->SetVisibility(0);
792  d->scalar_iso_actor->SetVisibility(1);
793  d->scalar_iso_color_actor->SetVisibility(0);
794  d->scalar_display_as_iso = true;
795  d->scalar_bar_actor->SetVisibility(0);
796 }
797 
799 {
800  if (d->field->kind() == axlAbstractFieldParametric::Vector ) {
801 
802  d->vector_hedgehog_actor->SetVisibility(0);
803  d->vector_glyph_actor->SetVisibility(0);
804  d->vector_stream_actor->SetVisibility(0);
805  d->vector_stream_widget->Off();
806  }
807 }
808 
810 {
811  if (d->field->kind() == axlAbstractFieldParametric::Vector ) {
812 
813  d->vector_hedgehog_actor->SetVisibility(1);
814  d->vector_glyph_actor->SetVisibility(0);
815  d->vector_stream_actor->SetVisibility(0);
816  d->vector_stream_widget->Off();
817  }
818 }
819 
821 {
822  if (d->field->kind() == axlAbstractFieldParametric::Vector) {
823 
824  d->vector_hedgehog_actor->SetVisibility(0);
825  d->vector_glyph_actor->SetVisibility(1);
826  d->vector_stream_actor->SetVisibility(0);
827  d->vector_stream_widget->Off();
828  }
829 }
830 
832 {
833  if (d->field->kind() == axlAbstractFieldParametric::Vector) {
834 
835  d->vector_hedgehog_actor->SetVisibility(0);
836  d->vector_glyph_actor->SetVisibility(0);
837  d->vector_stream_actor->SetVisibility(1);
838  d->vector_stream_widget->On();
839  }
840 }
841 
843 
845 {
846  if(!d->mesh)
847  return;
848 
849  if(d->mesh->getUnstructuredGrid()){
850  d->mesh->getUnstructuredGrid()->Modified();
851 #if (VTK_MAJOR_VERSION <= 5)
852  d->mesh->getUnstructuredGrid()->Update();
853 #endif
854  }else{
855  d->mesh->getPolyData()->Modified();
856 #if (VTK_MAJOR_VERSION <= 5)
857  d->mesh->getPolyData()->Update();
858 #endif
859  }
860 
861  if(!d->field )
862  return;
863 
864  this->updateArray();
865 
866  if(d->field->support() == axlAbstractFieldParametric::Point) {
867  if(d->mesh->getUnstructuredGrid()){
868  static_cast<vtkUnstructuredGrid *>(d->mesh->getUnstructuredGrid())->GetPointData()->RemoveArray(d->array->GetName());
869  static_cast<vtkUnstructuredGrid *>(d->mesh->getUnstructuredGrid())->GetPointData()->AddArray(d->array);
870  }else{
871  static_cast<vtkPolyData *>(d->mesh->getPolyData())->GetPointData()->RemoveArray(d->array->GetName());
872  static_cast<vtkPolyData *>(d->mesh->getPolyData())->GetPointData()->AddArray(d->array);
873  }
874  if(d->field->kind() == axlAbstractFieldParametric::Scalar){
875  //update field vtkActor(s)
876  d->scalar_iso_actor->SetOrientation(d->mesh->getActor()->GetOrientation());
877  d->scalar_iso_actor->SetPosition(d->mesh->getActor()->GetPosition());
878  d->scalar_iso_color_actor->SetOrientation(d->mesh->getActor()->GetOrientation());
879  d->scalar_iso_color_actor->SetPosition(d->mesh->getActor()->GetPosition());
880  d->scalar_color_actor->SetOrientation(d->mesh->getActor()->GetOrientation());
881  d->scalar_color_actor->SetPosition(d->mesh->getActor()->GetPosition());
882 
883  if(d->mesh->getUnstructuredGrid()){
884  static_cast<vtkUnstructuredGrid *>(d->mesh->getUnstructuredGrid())->GetPointData()->SetActiveScalars(d->array->GetName());
885  }else{
886  static_cast<vtkPolyData *>(d->mesh->getPolyData())->GetPointData()->SetActiveScalars(d->array->GetName());
887  }
888  }else if (d->field->kind() == axlAbstractFieldParametric::Vector){
889  //update field vtkActor(s)
890  d->vector_glyph_actor->SetOrientation(d->mesh->getActor()->GetOrientation());
891  d->vector_glyph_actor->SetPosition(d->mesh->getActor()->GetPosition());
892  d->vector_hedgehog_actor->SetOrientation(d->mesh->getActor()->GetOrientation());
893  d->vector_hedgehog_actor->SetPosition(d->mesh->getActor()->GetPosition());
894  d->vector_stream_actor->SetOrientation(d->mesh->getActor()->GetOrientation());
895  d->vector_stream_actor->SetPosition(d->mesh->getActor()->GetPosition());
896 
897  if(d->mesh->getUnstructuredGrid()){
898  static_cast<vtkUnstructuredGrid *>(d->mesh->getUnstructuredGrid())->GetPointData()->SetActiveVectors(d->array->GetName());
899  }else{
900  static_cast<vtkPolyData *>(d->mesh->getPolyData())->GetPointData()->SetActiveVectors(d->array->GetName());
901  }
902  }else if (d->field->kind() == axlAbstractFieldParametric::Tensor){
903  if(d->mesh->getUnstructuredGrid()){
904  static_cast<vtkUnstructuredGrid *>(d->mesh->getUnstructuredGrid())->GetPointData()->SetActiveTensors(d->array->GetName());
905  }else{
906  static_cast<vtkPolyData *>(d->mesh->getPolyData())->GetPointData()->SetActiveTensors(d->array->GetName());
907  }
908  }
909 
910 
911  }
912 
913 
914 
915  if(d->field->support() == axlAbstractFieldParametric::Cell) {
916  static_cast<vtkPolyData *>(d->mesh->getPolyData())->GetCellData()->RemoveArray(d->array->GetName());
917  static_cast<vtkPolyData *>(d->mesh->getPolyData())->GetCellData()->AddArray(d->array);
918  if(d->field->kind() == axlAbstractFieldParametric::Scalar)
919  static_cast<vtkPolyData *>(d->mesh->getPolyData())->GetCellData()->SetActiveScalars(d->array->GetName());
920  else if (d->field->kind() == axlAbstractFieldParametric::Vector)
921  static_cast<vtkPolyData *>(d->mesh->getPolyData())->GetCellData()->SetActiveVectors(d->array->GetName());
922  else if (d->field->kind() == axlAbstractFieldParametric::Tensor)
923  static_cast<vtkPolyData *>(d->mesh->getPolyData())->GetCellData()->SetActiveTensors(d->array->GetName());
924 
925 
926  }
927 
928 }
929 
931 {
932  if(d->mesh && d->field)
933  if(d->field->support() == axlAbstractFieldParametric::Point) {
934  if(d->field->kind() == axlAbstractFieldParametric::Scalar)
935  if(d->mesh->getUnstructuredGrid()){
936  static_cast<vtkUnstructuredGrid *>(d->mesh->getUnstructuredGrid())->GetPointData()->SetActiveScalars(qPrintable(d->field->objectName()));
937  }else{
938  static_cast<vtkPolyData *>(d->mesh->getPolyData())->GetPointData()->SetActiveScalars(qPrintable(d->field->objectName()));
939  }
940  else if(d->field->kind() == axlAbstractFieldParametric::Vector){
941  if(d->mesh->getUnstructuredGrid()){
942  static_cast<vtkUnstructuredGrid *>(d->mesh->getUnstructuredGrid())->GetPointData()->SetActiveVectors(qPrintable(d->field->objectName()));
943  }else{
944  static_cast<vtkPolyData *>(d->mesh->getPolyData())->GetPointData()->SetActiveVectors(qPrintable(d->field->objectName()));
945  }
946  }
947  else if(d->field->kind() == axlAbstractFieldParametric::Tensor){
948  if(d->mesh->getUnstructuredGrid()){
949  static_cast<vtkUnstructuredGrid *>(d->mesh->getUnstructuredGrid())->GetPointData()->SetActiveTensors(qPrintable(d->field->objectName()));
950  }else{
951  static_cast<vtkPolyData *>(d->mesh->getPolyData())->GetPointData()->SetActiveTensors(qPrintable(d->field->objectName()));
952  }
953  }
954  }
955 
956 
957  if(d->mesh && d->field)
958  if(d->field->support() == axlAbstractFieldParametric::Cell) {
959  if(d->field->kind() == axlAbstractFieldParametric::Scalar)
960  static_cast<vtkPolyData *>(d->mesh->getPolyData())->GetCellData()->SetActiveScalars(qPrintable(d->field->objectName()));
961  else if(d->field->kind() == axlAbstractFieldParametric::Vector)
962  static_cast<vtkPolyData *>(d->mesh->getPolyData())->GetCellData()->SetActiveVectors(qPrintable(d->field->objectName()));
963  else if(d->field->kind() == axlAbstractFieldParametric::Tensor)
964  static_cast<vtkPolyData *>(d->mesh->getPolyData())->GetCellData()->SetActiveTensors(qPrintable(d->field->objectName()));
965  }
966 
967 }
968 
970 {
971  return d->scalar_color_mapper;
972 }
973 
974 axlActorFieldParametric::axlActorFieldParametric(void) : axlAbstractActorField(), d(new axlActorFieldParametricPrivate)
975 {
976  d->field = NULL;
977  d->mesh = NULL;
978  d->isoRadius = 0.01;
979  d->array = NULL;
980 }
981 
983 {
984  delete d;
985 
986  d = NULL;
987 }
988 
990 {
991 
992  if(!d->mesh)
993  return;
994 
995  if(!d->field) {
996  qDebug() << DTK_PRETTY_FUNCTION << "No field.";
997  return;
998  }
999 
1000 
1001  if(!d->interactor)
1002  return;
1003 
1004 
1005  // -- Scalar field
1006 
1007 
1008  if(d->field->kind() == axlAbstractFieldParametric::Scalar) {
1009 
1010  if(d->scalar_color_mapper && d->scalar_color_actor && d->scalar_iso_color_actor)
1011  return;
1012 
1013  if(d->field->support() == axlAbstractFieldParametric::Point) {
1014  //remove first eventual array of the same name
1015  if(d->mesh->getPolyData()){
1016  static_cast<vtkPolyData *>(d->mesh->getPolyData())->GetPointData()->RemoveArray(d->array->GetName());
1017  static_cast<vtkPolyData *>(d->mesh->getPolyData())->GetPointData()->AddArray(d->array);
1018  static_cast<vtkPolyData *>(d->mesh->getPolyData())->GetPointData()->SetActiveScalars(d->array->GetName());
1019  }
1020  if(d->mesh->getUnstructuredGrid()){
1021  static_cast<vtkUnstructuredGrid *>(d->mesh->getUnstructuredGrid())->GetPointData()->RemoveArray(d->array->GetName());
1022  static_cast<vtkUnstructuredGrid *>(d->mesh->getUnstructuredGrid())->GetPointData()->AddArray(d->array);
1023  static_cast<vtkUnstructuredGrid *>(d->mesh->getUnstructuredGrid())->GetPointData()->SetActiveScalars(d->array->GetName());
1024  }
1025  }
1026 
1027  if(d->field->support() == axlAbstractFieldParametric::Cell) {
1028 
1029  static_cast<vtkPolyData *>(d->mesh->getPolyData())->GetCellData()->RemoveArray(d->array->GetName());
1030  static_cast<vtkPolyData *>(d->mesh->getPolyData())->GetCellData()->AddArray(d->array);
1031  static_cast<vtkPolyData *>(d->mesh->getPolyData())->GetPointData()->SetActiveScalars(d->array->GetName());
1032 
1033  }
1034 
1035  // -- iso contours
1036 
1037  d->scalar_display_as_iso = false;
1038  d->scalar_iso_count = 10;
1039  d->array->GetRange(d->scalar_iso_range);
1040 
1041  d->scalar_iso = vtkSmartPointer<vtkContourFilter>::New();
1042  if(d->mesh->getUnstructuredGrid()){
1043 #if (VTK_MAJOR_VERSION <= 5)
1044  d->scalar_iso->SetInput(static_cast<vtkUnstructuredGrid *>(d->mesh->getUnstructuredGrid()));
1045 #else
1046  d->scalar_iso->SetInputData(static_cast<vtkUnstructuredGrid *>(d->mesh->getUnstructuredGrid()));
1047 #endif
1048  }else{
1049 #if (VTK_MAJOR_VERSION <= 5)
1050  d->scalar_iso->SetInput(static_cast<vtkPolyData *>(d->mesh->getPolyData()));
1051 #else
1052  d->scalar_iso->SetInputData(static_cast<vtkPolyData *>(d->mesh->getPolyData()));
1053 #endif
1054  }
1055  d->scalar_iso->GenerateValues(d->scalar_iso_count, d->scalar_iso_range[0], d->scalar_iso_range[1]);
1056 
1057  d->scalar_iso_tube_filter = vtkSmartPointer<vtkTubeFilter>::New();
1058  d->scalar_iso_tube_filter->SetRadius(d->isoRadius);
1059  d->scalar_iso_tube_filter->SetNumberOfSides(8);
1060 #if (VTK_MAJOR_VERSION <= 5)
1061  d->scalar_iso_tube_filter->SetInput(d->scalar_iso->GetOutput());
1062 #else
1063  d->scalar_iso_tube_filter->SetInputData(d->scalar_iso->GetOutput());
1064 #endif
1065  d->scalar_iso_mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
1066 #if (VTK_MAJOR_VERSION <= 5)
1067  d->scalar_iso_mapper->SetInput(d->scalar_iso_tube_filter->GetOutput());
1068 #else
1069  d->scalar_iso_mapper->SetInputData(d->scalar_iso_tube_filter->GetOutput());
1070 #endif
1071 
1072  d->scalar_iso_actor = vtkSmartPointer<vtkActor>::New();
1073  d->scalar_iso_actor->SetOrientation(d->mesh->getActor()->GetOrientation());
1074  d->scalar_iso_actor->SetPosition(d->mesh->getActor()->GetPosition());
1075  d->scalar_iso_actor->SetMapper(d->scalar_iso_mapper);
1076  d->scalar_iso_actor->SetVisibility(0);
1077 
1078  this->AddPart(d->scalar_iso_actor);
1079 
1080  // -- iso color mapping
1081 
1082  d->scalar_iso_color_mapper = vtkPolyDataMapper::New();
1083 #if (VTK_MAJOR_VERSION <= 5)
1084  d->scalar_iso_color_mapper->SetInput(d->scalar_iso->GetOutput());
1085 #else
1086  d->scalar_iso_color_mapper->SetInputData(d->scalar_iso->GetOutput());
1087 #endif
1088  d->scalar_iso_color_mapper->SetColorModeToMapScalars();
1089 
1090  if(d->field->support() == axlAbstractFieldParametric::Point)
1091  d->scalar_iso_color_mapper->SetScalarModeToUsePointData();
1092 
1093  if(d->field->support() == axlAbstractFieldParametric::Cell)
1094  d->scalar_iso_color_mapper->SetScalarModeToUseCellData();
1095 
1096  d->scalar_iso_color_mapper->SelectColorArray(d->array->GetName());
1097  d->scalar_iso_color_mapper->SetScalarVisibility(true);
1098  d->scalar_iso_color_mapper->SetScalarRange(d->scalar_iso_range);
1099 
1100  d->scalar_iso_color_actor = vtkSmartPointer<vtkActor>::New();
1101  d->scalar_iso_color_actor->SetOrientation(d->mesh->getActor()->GetOrientation());
1102  d->scalar_iso_color_actor->SetPosition(d->mesh->getActor()->GetPosition());
1103  d->scalar_iso_color_actor->SetMapper(d->scalar_iso_color_mapper);
1104  d->scalar_iso_color_actor->SetVisibility(0);
1105 
1106  this->AddPart(d->scalar_iso_color_actor);
1107 
1108  // -- color mapping
1109 
1110  d->array->GetRange(d->scalar_color_range);
1111 
1112  d->scalar_color_mapper = vtkDataSetMapper::New();
1113 #if (VTK_MAJOR_VERSION <= 5)
1114  if(d->mesh->getUnstructuredGrid())
1115  d->scalar_color_mapper->SetInput(static_cast<vtkUnstructuredGrid *>(d->mesh->getUnstructuredGrid()));
1116  else
1117  d->scalar_color_mapper->SetInput(static_cast<vtkPolyData *>(d->mesh->getPolyData()));
1118 #else
1119  if(d->mesh->getUnstructuredGrid())
1120  d->scalar_color_mapper->SetInputData(static_cast<vtkUnstructuredGrid *>(d->mesh->getUnstructuredGrid()));
1121  else
1122  d->scalar_color_mapper->SetInputData(static_cast<vtkPolyData *>(d->mesh->getPolyData()));
1123 #endif
1124 
1125  d->scalar_color_mapper->SetColorModeToMapScalars();
1126 
1127  if(d->field->support() == axlAbstractFieldParametric::Point)
1128  d->scalar_color_mapper->SetScalarModeToUsePointData();
1129 
1130  if(d->field->support() == axlAbstractFieldParametric::Cell)
1131  d->scalar_color_mapper->SetScalarModeToUseCellData();
1132 
1133  d->scalar_color_mapper->SelectColorArray(d->array->GetName());
1134  d->scalar_color_mapper->SetScalarVisibility(true);
1135  d->scalar_color_mapper->SetScalarRange(d->scalar_color_range);
1136 
1137  d->scalar_color_actor = vtkSmartPointer<vtkActor>::New();
1138  d->scalar_color_actor->SetOrientation(d->mesh->getActor()->GetOrientation());
1139  d->scalar_color_actor->SetPosition(d->mesh->getActor()->GetPosition());
1140  d->scalar_color_actor->SetMapper(d->scalar_color_mapper);
1141  d->scalar_color_actor->SetVisibility(0);
1142 
1143  this->AddPart(d->scalar_color_actor);
1144 
1146  d->scalar_bar_actor = vtkSmartPointer<vtkScalarBarActor>::New();
1147  d->scalar_bar_actor ->SetLookupTable(d->scalar_color_mapper->GetLookupTable());
1148  d->scalar_bar_actor ->SetTitle(qPrintable(d->field->name()));
1149  d->scalar_bar_actor ->SetNumberOfLabels(4);
1150  d->scalar_bar_actor->SetVisibility(0);
1151 
1152  }
1153 
1154  // -- Vector field
1155 
1156 
1157 
1158  if(d->field->kind() == axlAbstractFieldParametric::Vector) {
1159 
1160  // -- Append field and its magnitude into vtkPolyData
1161 
1162  if(d->field->support() == axlAbstractFieldParametric::Point) {
1163 
1164 
1165  if(d->mesh->getPolyData()){
1166  static_cast<vtkPolyData *>(d->mesh->getPolyData())->GetPointData()->RemoveArray(d->array->GetName());
1167  static_cast<vtkPolyData *>(d->mesh->getPolyData())->GetPointData()->AddArray(d->array);
1168  static_cast<vtkPolyData *>(d->mesh->getPolyData())->GetPointData()->SetActiveVectors(d->array->GetName());
1169  }
1170  if(d->mesh->getUnstructuredGrid()){
1171  static_cast<vtkUnstructuredGrid *>(d->mesh->getUnstructuredGrid())->GetPointData()->RemoveArray(d->array->GetName());
1172  static_cast<vtkUnstructuredGrid *>(d->mesh->getUnstructuredGrid())->GetPointData()->AddArray(d->array);
1173  static_cast<vtkUnstructuredGrid *>(d->mesh->getUnstructuredGrid())->GetPointData()->SetActiveVectors(d->array->GetName());
1174  }
1175  }
1176 
1177  if(d->field->support() == axlAbstractFieldParametric::Cell) {
1178  static_cast<vtkPolyData *>(d->mesh->getPolyData())->GetPointData()->RemoveArray(d->array->GetName());
1179  static_cast<vtkPolyData *>(d->mesh->getPolyData())->GetCellData()->AddArray(d->array);
1180  static_cast<vtkPolyData *>(d->mesh->getPolyData())->GetCellData()->SetActiveVectors(d->array->GetName());
1181 
1182 
1183  }
1184 
1185  // -- hedgehog
1186 
1187  d->vector_hedgehog = vtkSmartPointer<vtkHedgeHog>::New();
1188 #if (VTK_MAJOR_VERSION <= 5)
1189  if(d->mesh->getPolyData())
1190  d->vector_hedgehog->SetInput(static_cast<vtkPolyData *>(d->mesh->getPolyData()));
1191  else
1192  d->vector_hedgehog->SetInput(static_cast<vtkUnstructuredGrid *>(d->mesh->getUnstructuredGrid()));
1193 #else
1194  if(d->mesh->getPolyData())
1195  d->vector_hedgehog->SetInputData(static_cast<vtkPolyData *>(d->mesh->getPolyData()));
1196  else
1197  d->vector_hedgehog->SetInputData(static_cast<vtkUnstructuredGrid *>(d->mesh->getUnstructuredGrid()));
1198 #endif
1199  d->vector_hedgehog->SetVectorModeToUseVector();
1200  //d->vector_hedgehog->SetScaleFactor(0.05);
1201 
1202  d->vector_hedgehog_mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
1203  d->vector_hedgehog_mapper->SetInputConnection(d->vector_hedgehog->GetOutputPort());
1204  d->vector_hedgehog_mapper->ScalarVisibilityOn();
1205 
1206  d->vector_hedgehog_actor = vtkSmartPointer<vtkActor>::New();
1207  d->vector_hedgehog_actor->SetOrientation(d->mesh->getActor()->GetOrientation());
1208  d->vector_hedgehog_actor->SetPosition(d->mesh->getActor()->GetPosition());
1209  d->vector_hedgehog_actor->SetMapper(d->vector_hedgehog_mapper);
1210  d->vector_hedgehog_actor->SetVisibility(0);
1211 
1212  this->AddPart(d->vector_hedgehog_actor);
1213 
1214  // -- glyphs
1215 
1216  d->vector_glyph_source = vtkArrowSource::New();
1217 
1218  d->vector_glyph = vtkSmartPointer<vtkGlyph3D>::New();
1219 #if (VTK_MAJOR_VERSION <= 5)
1220  if(d->mesh->getPolyData())
1221  d->vector_glyph->SetInput(static_cast<vtkPolyData *>(d->mesh->getPolyData()));
1222  else
1223  d->vector_glyph->SetInput(static_cast<vtkUnstructuredGrid *>(d->mesh->getUnstructuredGrid()));
1224  d->vector_glyph->SetSource(d->vector_glyph_source->GetOutput());
1225 #else
1226  if(d->mesh->getPolyData())
1227  d->vector_glyph->SetInputData(static_cast<vtkPolyData *>(d->mesh->getPolyData()));
1228  else
1229  d->vector_glyph->SetInputData(static_cast<vtkUnstructuredGrid *>(d->mesh->getUnstructuredGrid()));
1230  d->vector_glyph->SetSourceData(d->vector_glyph_source->GetOutput());
1231 #endif
1232 
1233  d->vector_glyph->SetColorModeToColorByVector();
1234  d->vector_glyph->SetVectorModeToUseVector();
1235  //d->vector_glyph->SetScaleModeToScaleByVector();
1236  d->vector_glyph->SetScaleModeToDataScalingOff();
1237  //d->vector_glyph->ScalingOff();
1238  this->setGlyphScale(0.1);
1239  d->vector_glyph->OrientOn();
1240  d->vector_glyph->Update();
1241 
1242  d->vector_glyph_mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
1243  d->vector_glyph_mapper->SetInputConnection(d->vector_glyph->GetOutputPort());
1244 
1245  // vtkSmartPointer<vtkExtractUnstructuredGrid> extractor = vtkSmartPointer<vtkExtractUnstructuredGrid>::New();
1246  // extractor->SetInput(static_cast<vtkPolyData *>(d->mesh->getPolyData()));
1247 
1248  // vtkSmartPointer<vtkGlyph3DMapper> gpuGlyphMapper = vtkSmartPointer<vtkGlyph3DMapper>::New();
1249  // gpuGlyphMapper->ScalingOn();
1250  // gpuGlyphMapper->SetScaleFactor(0.1);
1251  // gpuGlyphMapper->SetSourceConnection(d->vector_glyph_source->GetOutputPort());
1252  // gpuGlyphMapper->SetInputConnection(extractor->GetOutputPort());
1253 
1254  d->vector_glyph_actor = vtkSmartPointer<vtkActor>::New();
1255  d->vector_glyph_actor->SetOrientation(d->mesh->getActor()->GetOrientation());
1256  d->vector_glyph_actor->SetPosition(d->mesh->getActor()->GetPosition());
1257  d->vector_glyph_actor->SetMapper(d->vector_glyph_mapper);
1258  // d->vector_glyph_actor->SetMapper(gpuGlyphMapper);
1259  d->vector_glyph_actor->SetVisibility(0);
1260 
1261  this->AddPart(d->vector_glyph_actor);
1262 
1263 
1264  // -- streams
1265 
1266  d->vector_stream_widget = vtkSmartPointer<vtkSphereWidget2>::New();
1267  d->vector_stream_widget->SetInteractor(d->interactor);
1268  d->vector_stream_widget->CreateDefaultRepresentation();
1269  d->vector_stream_widget->SetTranslationEnabled(true);
1270  d->vector_stream_widget->SetScalingEnabled(true);
1271  d->vector_stream_widget->Off();
1272 
1273  d->vector_stream_widget_data = vtkPolyData::New();
1274 
1275  d->vector_stream_widget_representation = vtkSphereRepresentation::SafeDownCast(d->vector_stream_widget->GetRepresentation());
1276  d->vector_stream_widget_representation->HandleVisibilityOff();
1277  d->vector_stream_widget_representation->HandleTextOff();
1278  d->vector_stream_widget_representation->RadialLineOff();
1279  d->vector_stream_widget_representation->SetPhiResolution(64);
1280  d->vector_stream_widget_representation->SetThetaResolution(64);
1281  d->vector_stream_widget_representation->GetPolyData(d->vector_stream_widget_data);
1282 
1283  d->vector_stream_tracer = vtkStreamTracer::New();
1284 #if (VTK_MAJOR_VERSION <= 5)
1285  d->vector_stream_tracer->SetInput(static_cast<vtkPolyData *>(d->mesh->getPolyData()));
1286  d->vector_stream_tracer->SetSource(d->vector_stream_widget_data);
1287 #else
1288  d->vector_stream_tracer->SetInputData(static_cast<vtkPolyData *>(d->mesh->getPolyData()));
1289  d->vector_stream_tracer->SetSourceData(d->vector_stream_widget_data);
1290 #endif
1291  d->vector_stream_tracer->SetMaximumPropagation(100);
1292  d->vector_stream_tracer->SetMinimumIntegrationStep(1.0e-4);
1293  d->vector_stream_tracer->SetMaximumIntegrationStep(100.0);
1294  d->vector_stream_tracer->SetIntegrationDirectionToBoth();
1295 
1296  d->vector_stream_filter = vtkTubeFilter::New();
1297 #if (VTK_MAJOR_VERSION <= 5)
1298  d->vector_stream_filter->SetInput(d->vector_stream_tracer->GetOutput());
1299 #else
1300  d->vector_stream_filter->SetInputData(d->vector_stream_tracer->GetOutput());
1301 #endif
1302  d->vector_stream_filter->SetRadius(0.01);
1303  d->vector_stream_filter->SetNumberOfSides(8);
1304 
1305  d->vector_stream_mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
1306  d->vector_stream_mapper->SetInputConnection(d->vector_stream_filter->GetOutputPort());
1307  d->vector_stream_mapper->ScalarVisibilityOn();
1308 
1309  d->vector_stream_actor = vtkSmartPointer<vtkActor>::New();
1310  d->vector_stream_actor->SetOrientation(d->mesh->getActor()->GetOrientation());
1311  d->vector_stream_actor->SetPosition(d->mesh->getActor()->GetPosition());
1312  d->vector_stream_actor->SetMapper(d->vector_stream_mapper);
1313  d->vector_stream_actor->SetVisibility(0);
1314 
1315  d->vector_stream_observer = axlActorFieldParametricStreamObserver::New();
1316  d->vector_stream_observer->vector_stream_widget_representation = d->vector_stream_widget_representation;
1317  d->vector_stream_observer->vector_stream_widget_data = d->vector_stream_widget_data;
1318  d->vector_stream_observer->vector_stream_tracer = d->vector_stream_tracer;
1319  d->vector_stream_widget->AddObserver(vtkCommand::InteractionEvent, d->vector_stream_observer);
1320 
1321  this->AddPart(d->vector_stream_actor);
1322 
1323  }
1324 
1325 }
1326 
1328 {
1329  double field_range[2];d->array->GetRange(field_range);
1330  return field_range[0];
1331 }
1332 
1334 {
1335  double field_range[2];d->array->GetRange(field_range);
1336 
1337  return field_range[1];
1338 }
1339 
1341 {
1342  d->isoRadius = radius;
1343  d->scalar_iso_tube_filter->SetRadius(radius);
1344  d->scalar_iso_tube_filter->Update();
1345 }
Class axlAbstractFieldParametric defines an API for parametric field.
virtual double start_u(void)
Returns the first u-value parameter.
dtkAbstractData * data(void)
virtual double scalar(double u, double v=0, double w=0)
Returns the value of the parametric field at the parameters values in input.
vtkCxxRevisionMacro(axlActorFieldParametric,"$Revision: 0.0.1 $")
virtual double end_u(void)
Returns the last u-value parameter.
virtual double start_u(void)
Returns the first u-value parameter.
virtual double * tensor(double u, double v=0, double w=0)
Returns the value of the spatial field at the coordinates point entered.
virtual void Execute(vtkObject *caller, unsigned long event, void *)
virtual double * tensor(double u, double v, double w)
Returns the value of the spatial field at the coordinates point entered.
virtual double scalar(double u, double v, double w=0)
Returns the value of the parametric field at the parameters values in input.
virtual double numbersample_u(void)
Returns the number of u-parameters.
Class axlAbstractFieldParametricCurve defines an API for parametric field.
virtual double numbersample_v(void)
Returns the number of v-parameters.
virtual double start_v(void)
Returns the first v-value parameter.
virtual double end_w(void)
Returns the last w-value parameter.
virtual double start_v(void)
Returns the first v-value parameter.
vtkSmartPointer< vtkStreamTracer > vector_stream_tracer
virtual double numbersample_v(void)
Returns the number of v-parameters.
void setActorField(axlAbstractActor *actor)
virtual double * vector(double u, double v, double w)
Returns the value of the parametric field evaluated at the parameters in input.
virtual double numbersample_u(void)
Returns the number of u-parameters.
void setInteractor(void *interactor)
virtual double * tensor(double u, double v, double w=0)
Returns the value of the spatial field at the coordinates point entered.
axlAbstractActor * outputActor(void)
void onIsoRadiusChanged(double radius)
axlAbstractField * magnitude(void)
virtual double end_v(void)
Returns the last v-value parameter.
virtual double end_u(void)
Returns the last v-value parameter.
vtkSmartPointer< vtkSphereRepresentation > vector_stream_widget_representation
axlAbstractActor * actorField(void)
virtual double * vector(double u, double v, double w=0)
Returns the value of the parametric field evaluated at the parameters in input.
virtual double end_u(void)
Returns the last v-value parameter.
vtkScalarBarActor * scalarBar(void)
vtkSmartPointer< vtkPolyData > vector_stream_widget_data
Class axlAbstractField defines an API for arrays of numeric data.
virtual double end_v(void)
Returns the last v-value parameter.
void setStreamPropagation(double propagation)
Class axlFieldDiscrete defines an API for arrays of numeric data.
virtual double numbersample_w(void)
Returns the number of w-parameters.
Class axlAbstractFieldParametricVolume defines an API for parametric field.
virtual double start_u(void)
Returns the first u-value parameter.
void setStreamDirection(int direction)
static axlActorFieldParametricStreamObserver * New(void)
axlAbstractField * field(void)
Class axlAbstractFieldParametricSurface defines an API for parametric field.
virtual void setData(dtkAbstractData *field)
virtual double start_w(void)
Returns the first w-value parameter.
Class axlAbstractData defines an API for all type of axel data.
virtual double numbersample_u(void)
Returns the number of u-parameters.
virtual double scalar(double u, double v, double w)
Returns the value of the parametric field at the parameters values in input.
virtual double * vector(double u, double v=0, double w=0)
Returns the value of the parametric field evaluated at the parameters in input.
vtkStandardNewMacro(axlActorFieldParametric)