VTKFIG  0.20.20181114
Easy VTK based in situ visualization
vtkfigVectorView.cxx
Go to the documentation of this file.
1 #include <vtkActor.h>
2 #include <vtkPointData.h>
3 #include <vtkProperty.h>
4 #include <vtkTextProperty.h>
5 #include <vtkContourFilter.h>
6 #include <vtkOutlineFilter.h>
7 #include <vtkRectilinearGridGeometryFilter.h>
8 #include <vtkGeometryFilter.h>
9 #include <vtkGlyph3D.h>
10 #include <vtkRectilinearGrid.h>
11 #include <vtkGlyphSource2D.h>
12 #include <vtkAssignAttribute.h>
13 #include <vtkProbeFilter.h>
14 #include <vtkTransformPolyDataFilter.h>
15 #include <vtkTransformFilter.h>
16 #include <vtkStreamTracer.h>
17 #include <vtkRibbonFilter.h>
18 #include <vtkArrayCalculator.h>
19 
20 
21 #include "vtkfigVectorView.h"
22 #include "vtkfigTools.h"
23 #include "config.h"
24 
25 
26 namespace vtkfig
27 {
28 
29 
31 
32 
33  void VectorView::SetQuiverRGBTable(RGBTable & tab, int tabsize)
34  {
35  state.quiver_rgbtab_size=tabsize;
36  state.quiver_rgbtab_modified=true;
37  quiver_rgbtab=tab;
38  quiver_lut=BuildLookupTable(tab,tabsize);
39  }
40 
42  {
43  state.stream_rgbtab_size=tabsize;
44  state.stream_rgbtab_modified=true;
45  stream_rgbtab=tab;
46  stream_lut=BuildLookupTable(tab,tabsize);
47  }
48 
49 
50 
51  void VectorView::SetQuiverGrid(int nx, int ny)
52  {
53  assert(state.spacedim==2);
54  double bounds[6];
55  auto data=vtkDataSet::SafeDownCast(data_producer->GetOutputDataObject(0));
56 
57  data->GetBounds(bounds);
58 
59  auto probePoints = vtkSmartPointer<vtkPoints>::New();
60  double dx=(bounds[1]-bounds[0])/((double)nx);
61  double dy=(bounds[3]-bounds[2])/((double)ny);
62 
63  double x=bounds[0]+0.5*dx;
64  for (int ix=0; ix<nx;ix++,x+=dx )
65  {
66  double y=bounds[2]+0.5*dy;
67  for ( int iy=0;iy<ny;iy++,y+=dy )
68  probePoints->InsertNextPoint ( x, y, 0);
69  }
70 
71  probePolyData =vtkSmartPointer<vtkPolyData>::New();
72  probePolyData->SetPoints(probePoints);
73  }
74 
75  void VectorView::SetQuiverGrid(int nx, int ny, int nz)
76  {
77  assert(state.spacedim==3);
78 
79  double bounds[6];
80  auto data=vtkDataSet::SafeDownCast(data_producer->GetOutputDataObject(0));
81  data->GetBounds(bounds);
82 
83  auto probePoints = vtkSmartPointer<vtkPoints>::New();
84  double dx=(bounds[1]-bounds[0])/((double)nx);
85  double dy=(bounds[3]-bounds[2])/((double)ny);
86  double dz=(bounds[5]-bounds[4])/((double)nz);
87 
88  double x=bounds[0]+0.5*dx;
89  for (int ix=0; ix<nx;ix++,x+=dx )
90  {
91  double y=bounds[2]+0.5*dy;
92  for ( int iy=0;iy<ny;iy++,y+=dy )
93  {
94  double z=bounds[4]+0.5*dz;
95  for ( int iz=0;iz<nz;iz++,z+=dz )
96  probePoints->InsertNextPoint ( x, y, z);
97  }
98  }
99 
100  probePolyData =vtkSmartPointer<vtkPolyData>::New();
101  probePolyData->SetPoints(probePoints);
102  }
103 
104 
105  template <class DATA>
107  {
108  RTCalcTransform();
109 
110 
114  auto transgeometry=vtkSmartPointer<vtkTransformFilter>::New();
115  transgeometry->SetInputConnection(data_producer->GetOutputPort());
116  transgeometry->SetTransform(transform);
117 
118 
119  auto vector = vtkSmartPointer<vtkAssignAttribute>::New();
120  vector->Assign(dataname.c_str(),vtkDataSetAttributes::VECTORS,vtkAssignAttribute::POINT_DATA);
121  vector->SetInputConnection(transgeometry->GetOutputPort());
122 
123 
124 
125  if (state.show_quiver)
126  {
127 
128  if (!probePolyData)
129  {
130  throw std::runtime_error("Please dont't forget to set quiver points/grid");
131  }
132  auto transprobe=vtkSmartPointer<vtkTransformPolyDataFilter>::New();
133  transprobe->SetInputDataObject(probePolyData);
134  transprobe->SetTransform(transform);
135 
136 
137 
138  auto probeFilter = vtkSmartPointer<vtkProbeFilter>::New();
139  probeFilter->SetComputeTolerance(true);
140  probeFilter->SetSourceConnection(vector->GetOutputPort());
141  probeFilter->SetInputConnection(transprobe->GetOutputPort());
142  probeFilter->PassPointArraysOn();
143 
144 
145  auto glyph = vtkSmartPointer<vtkGlyph3D>::New();
146  glyph->SetInputConnection(probeFilter->GetOutputPort());
147  glyph->SetColorModeToColorByVector();
148  glyph->SetScaleModeToScaleByVector();
149 
150 
151  if (state.spacedim==2)
152  {
153  arrow3ds->SetTipResolution(8);
154  arrow3ds->SetTipLength(0.35);
155  arrow3ds->SetTipRadius(0.15);
156  arrow3ds->SetShaftRadius(0.075);
157 
158  glyph->SetSourceConnection(arrow3d->GetOutputPort());
159  }
160  else
161  {
162  arrow3ds->SetTipResolution(16);
163  arrow3ds->SetTipLength(0.3);
164  arrow3ds->SetTipRadius(0.1);
165  arrow3ds->SetShaftRadius(0.025);
166  glyph->SetSourceConnection(arrow3d->GetOutputPort());
167  }
168  // map gridfunction
169  auto mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
170  mapper->SetInputConnection(glyph->GetOutputPort());
171  mapper->SetLookupTable(quiver_lut);
172  mapper->UseLookupTableScalarRangeOn();
173 
174 
175  // create plot quiver actor
176  vtkSmartPointer<vtkActor> quiver_actor = vtkSmartPointer<vtkActor>::New();
177  quiver_actor->SetMapper(mapper);
178 
179 
180  if (state.show_quiver_colorbar)
182 
183  // add actors to renderer
184  Figure::RTAddActor(quiver_actor);
185  }
186 
187  if (state.show_stream)
188  {
192  auto calc= vtkSmartPointer<vtkArrayCalculator>::New();
193  calc->SetInputConnection(vector->GetOutputPort());
194  calc->AddVectorArrayName(dataname.c_str());
195 
196  std::string func="";
197  func+="mag(";
198  func+=dataname;
199  func+="*1.0)";
200 
201 
202  // std::string func="";
203  // func+="mag(";
204  // func+=dataname;
205  // func+=")";
206 
207  calc->SetFunction(func.c_str());
208  calc->SetResultArrayName((dataname+"magnitude").c_str());
209 
210 
211  auto vecmag = vtkSmartPointer<vtkAssignAttribute>::New();
212  vecmag->Assign((dataname+"magnitude").c_str(),vtkDataSetAttributes::SCALARS,vtkAssignAttribute::POINT_DATA);
213  vecmag->SetInputConnection(calc->GetOutputPort());
214 
215 
216  auto transseed=vtkSmartPointer<vtkTransformPolyDataFilter>::New();
217  transseed->SetInputDataObject(seedPolyData);
218  transseed->SetTransform(transform);
219 
220 
221 
222  auto stream=vtkSmartPointer<vtkStreamTracer>::New();
223  stream->SetInputConnection(vecmag->GetOutputPort());
224  stream->SetSourceConnection(transseed->GetOutputPort());
225  stream->SetIntegrationStepUnit(vtkStreamTracer::LENGTH_UNIT);
226  stream->SetInterpolatorType(vtkStreamTracer::INTERPOLATOR_WITH_CELL_LOCATOR);
227  stream->SetMaximumPropagation(state.stream_maximum_propagation);
228  stream->SetInitialIntegrationStep(state.stream_initial_integration_step);
229  stream->SetMaximumIntegrationStep(state.stream_maximum_integration_step);
230  stream->SetIntegrationDirectionToForward();
231  stream->SetIntegratorTypeToRungeKutta4();
232  stream->SetMaximumNumberOfSteps(state.stream_maximum_number_of_steps);
233 
234 
235  // https://github.com/vejmarie/vtk-7/blob/master/Examples/GUI/Python/StreamlinesWithLineWidget.py
236  // streamer = vtk.vtkStreamTracer()
237  // streamer.SetInputData(pl3d_output)
238  // streamer.SetSourceData(seeds)
239  // streamer.SetMaximumPropagation(100)
240  // streamer.SetInitialIntegrationStep(.2)
241  // streamer.SetIntegrationDirectionToForward()
242  // streamer.SetComputeVorticity(1)
243  // streamer.SetIntegrator(rk4)
244  // rf = vtk.vtkRibbonFilter()
245  // rf.SetInputConnection(streamer.GetOutputPort())
246  // rf.SetWidth(0.1)
247  // rf.SetWidthFactor(5)
248  // streamMapper = vtk.vtkPolyDataMapper()
249  // streamMapper.SetInputConnection(rf.GetOutputPort())
250  // streamMapper.SetScalarRange(pl3d_output.GetScalarRange())
251  // streamline = vtk.vtkActor()
252  // streamline.SetMapper(streamMapper)
253 
254 
255  if (state.spacedim==2)
256  {
257  //stream->SetSurfaceStreamlines(1);
258  // works only with point locator
259  stream->SetComputeVorticity(false);
260  }
261  else
262  {
263  stream->SetComputeVorticity(true);
264  }
265 
266 
267 
268 
269  auto ribbon=vtkSmartPointer<vtkRibbonFilter>::New();
270  ribbon->SetInputConnection(stream->GetOutputPort());
271  ribbon->SetWidth(state.stream_ribbonwidth);
272  //ribbon->SetVaryWidth(1);
273 
274  auto mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
275  mapper->SetInputConnection(ribbon->GetOutputPort());
276  mapper->ScalarVisibilityOn();
277  mapper->SetLookupTable(stream_lut);
278  mapper->UseLookupTableScalarRangeOn();
279 
280  // create plot quiver actor
281  vtkSmartPointer<vtkActor> stream_actor = vtkSmartPointer<vtkActor>::New();
282  stream_actor->SetMapper(mapper);
283 
284 
285 
286  // add actors to renderer
287  Figure::RTAddActor(stream_actor);
288  if (state.show_stream_colorbar)
290 
291  }
292 
293  }
294 
295 
296 
300  {
301 
303  {
304  this->RTBuildVTKPipeline0<vtkUnstructuredGrid>();
305  }
306  else if (state.datatype==DataSet::DataType::RectilinearGrid)
307  {
308  this->RTBuildVTKPipeline0<vtkRectilinearGrid>();
309  }
310  }
311 
314 
315  void VectorView::ServerRTSend(vtkSmartPointer<internals::Communicator> communicator)
316  {
317  communicator->Send(probePolyData,1,1);
318  communicator->Send(seedPolyData,1,1);
319  }
320 
321  void VectorView::ClientMTReceive(vtkSmartPointer<internals::Communicator> communicator)
322  {
323 
324  if (probePolyData==NULL)
325  probePolyData=vtkSmartPointer<vtkPolyData>::New();
326  communicator->Receive( probePolyData,1,1);
327 
328 
329  if (seedPolyData==NULL)
330  seedPolyData=vtkSmartPointer<vtkPolyData>::New();
331  communicator->Receive(seedPolyData,1,1);
332 
333 
334  }
335 
336 
337 }
338 
vtkSmartPointer< vtkLookupTable > quiver_lut
Definition: vtkfigFigure.h:268
std::string dataname
Name of data item in data set.
Definition: vtkfigFigure.h:256
RGBTable quiver_rgbtab
Definition: vtkfigFigure.h:269
void ServerRTSend(vtkSmartPointer< internals::Communicator > communicator) override final
Client-Server communication.
void RTAddActor2D(vtkSmartPointer< vtkActor2D > prop)
Add vtk Actor to renderer showing figure.
Base class for all figures.
Definition: vtkfigFigure.h:52
vtkSmartPointer< vtkLookupTable > stream_lut
Definition: vtkfigFigure.h:271
void RTBuildVTKPipeline() override final
Generic access to filter.
vtkSmartPointer< vtkPolyData > probePolyData
vtkSmartPointer< vtkPolyData > seedPolyData
vtkSmartPointer< vtkTrivialProducer > data_producer
Data producer for grid dataset.
Definition: vtkfigFigure.h:247
void ClientMTReceive(vtkSmartPointer< internals::Communicator > communicator) override final
Receive data from server.
vtkSmartPointer< vtkTransform > transform
Definition: vtkfigFigure.h:200
void RTCalcTransform()
Calculate transformation to unit cube This shall be applied to all data.
void SetStreamLineRGBTable(const V &tab, int lutsize)
Set streamline RGB table from vector.
RGBTable stream_rgbtab
Definition: vtkfigFigure.h:272
vtkSmartPointer< vtkLookupTable > BuildLookupTable(RGBTable &xrgb, size_t size)
struct vtkfig::Figure::@0 state
figure state
void SetQuiverRGBTable(const V &tab, int lutsize)
Set quiver RGB table from vector.
vtkSmartPointer< vtkTransformPolyDataFilter > arrow3d
Definition: vtkfigFigure.h:214
std::vector< RGBPoint > RGBTable
Definition: vtkfigTools.h:26
void RTAddActor(vtkSmartPointer< vtkActor > prop)
Add vtk Actor to renderer showing figure.
vtkSmartPointer< vtkScalarBarActor > BuildColorBar(vtkSmartPointer< vtkPolyDataMapper > mapper, int irank=0)
Definition: vtkfigTools.cxx:88
void SetQuiverGrid(int nx, int ny)
Set quiver points on grid in domain bounding box (2D)
vtkSmartPointer< vtkArrowSource > arrow3ds
Definition: vtkfigFigure.h:216