VTKFIG  0.20.20181114
Easy VTK based in situ visualization
vtkfigFrame.cxx
Go to the documentation of this file.
1 #include <cassert>
2 
3 #include <vtkTextProperty.h>
4 #include <vtkPropCollection.h>
5 #include <vtkCamera.h>
6 #include <vtkRenderWindow.h>
7 
8 #include "vtkfigFrame.h"
9 #include "vtkfigFigure.h"
10 #include "vtkfigMainThread.h"
11 #include "config.h"
12 
13 namespace vtkfig
14 {
15 
18 
20  {
22  this->nvpx=1;
23  this->nvpy=1;
24  figures.clear();
25  subframes.resize(nvpx*nvpy);
27 
29  title_subframe.viewport[1]=0.925;
30  title_subframe.viewport[2]=1.0;
31  title_subframe.viewport[3]=1.0;
32  mainthread->AddFrame(this);
34  }
35 
36 
38 
40 
41  void Frame::SetAutoLayout(int nfig)
42  {
43  int nrow=0;
44  int ncol=0;
45  switch(nfig)
46  {
47  case 1: ncol=1; nrow=1; break;
48  case 2: ncol=2; nrow=1; break;
49  case 3: ncol=3; nrow=1; break;
50  case 4: ncol=2; nrow=2; break;
51  case 5: ncol=3; nrow=2; break;
52  case 6: ncol=3; nrow=2; break;
53  case 7: ncol=3; nrow=3; break;
54  case 8: ncol=3; nrow=3; break;
55  case 9: ncol=3; nrow=3; break;
56  case 10: ncol=4; nrow=3; break;
57  case 11: ncol=4; nrow=3; break;
58  case 12: ncol=4; nrow=3; break;
59  case 13: ncol=4; nrow=4; break;
60  case 14: ncol=4; nrow=4; break;
61  case 15: ncol=4; nrow=4; break;
62  case 16: ncol=4; nrow=4; break;
63  default:
64  throw std::runtime_error("Currently not more than 16 subframes in frame");
65  }
66  assert(nfig<=ncol*nrow);
67  SetLayout(ncol,nrow);
68  }
69 
70 
71  void Frame::AddFigure(Figure* fig, int ipos)
72  {
73  if (ipos>=nvpx*nvpy)
74  SetAutoLayout(ipos+1);
75 
76  this->figures.insert(fig);
77  fig->framepos=ipos;
78  parameter.current_figure=fig;
80  }
81 
83  {
84  this->figures.erase(fig);
85  parameter.current_figure=fig;
87  }
88 
89 
90  void Frame::SetActiveSubFrame(int ipos)
91  {
92  if (ipos>=nvpx*nvpy)
93  SetAutoLayout(ipos+1);
94 
95  parameter.active_subframe=ipos;
97  }
98 
100  {
101  parameter.camera_view_angle=a+this->default_camera_view_angle;
103  }
104 
108  void Frame::SetActiveSubFrameCameraFocalPoint(double x, double y, double z)
109  {
110  parameter.camera_focal_point[0]=x+this->default_camera_focal_point[0];
111  parameter.camera_focal_point[1]=y+this->default_camera_focal_point[1];
112  parameter.camera_focal_point[2]=z+this->default_camera_focal_point[2];
114  }
115 
119  void Frame::SetActiveSubFrameCameraPosition(double x, double y, double z)
120  {
121  parameter.camera_position[0]=x+this->default_camera_position[0];
122  parameter.camera_position[1]=y+this->default_camera_position[1];
123  parameter.camera_position[2]=z+this->default_camera_position[2];
125  }
126 
127 
128 
129  void Frame::LinkCamera(int ivp, Frame& frame, int livp)
130  {
131  parameter.camlinkthisframepos=ivp;
132  parameter.camlinkframepos=livp;
133  parameter.camlinkframenum=frame.number_in_frame_list;
135  }
136 
137 
138  void Frame::WritePNG(std::string fname)
139  {
140  parameter.filename=fname;
142  }
143 
144  void Frame::StartVideo(std::string fname)
145  {
146  parameter.filename=fname;
148  }
149 
151  {
153  }
154 
155 
156 
157  void Frame::SetSize(int x, int y)
158  {
159  parameter.winsize_x=x;
160  parameter.winsize_y=y;
162  }
163 
164 
165  void Frame::SetPosition(int x, int y)
166  {
167  parameter.winposition_x=x;
168  parameter.winposition_y=y;
170  }
171 
172  void Frame::SetWindowTitle(const std::string title)
173  {
174  parameter.wintitle=title;
176  }
177 
178  void Frame::SetFrameTitle(const std::string title)
179  {
180  parameter.frametitle=title;
182  }
183 
184 
185  void Frame::SetLayout(int xnvpx, int xnvpy)
186  {
187  parameter.nvpx=xnvpx;
188  parameter.nvpy=xnvpy;
190  }
191 
192 
194  {
195  parameter.single_subframe_view=view;
197  }
198 
199 
200 
202  {
204  }
205 
207  {
208  mainthread->RemoveFrame(this);
209  }
210 
211 
212  // void Frame::Clear(void)
213  // {
214  // this->figures.clear();
215  // SendCommand(Communicator::Command::Clear;
216  // std::unique_lock<std::mutex> lock(this->mtx);
217  // this->cv.wait(lock);
218  // }
219 
220 
223  {
224  if (!this->title_actor)
225  {
226  this->title_actor= vtkSmartPointer<vtkCornerAnnotation>::New();
227  auto textprop=this->title_actor->GetTextProperty();
228  textprop->ItalicOff();
229  textprop->BoldOn();
230  textprop->SetFontSize(10);
231  textprop->SetFontFamilyToCourier();
232  textprop->SetColor(0,0,0);
233  }
234 
235 
236  }
237 
239  void Frame::RTSetLayout(int xnvpx, int xnvpy)
240  {
241  this->nvpx=xnvpx;
242  this->nvpy=xnvpy;
243  subframes.resize(this->nvpx*this->nvpy);
246  else
247  RTCalculateViewports(nvpx, nvpy);
248 
249  }
250 
251 
254  {
255  subframe.hidden=true;
256  }
257 
260  {
261  subframe.hidden=false;
262  }
263 
265  void Frame::RTSetActiveSubFrame(int isub, bool hide_old)
266  {
267  if (!single_subframe_view) return;
268  if (hide_old) this->RTHideSubframe(this->subframes[this->active_subframe]);
269  this->active_subframe=(isub+this->subframes.size())%(this->subframes.size());
270  this->RTUnHideSubframe(this->subframes[this->active_subframe]);
271  this->RTResetRenderers(false);
272  }
273 
275  void Frame::RTCalculateViewports(int xnvpx, int xnvpy)
276  {
277  double dy= 0.925/(double)xnvpy;
278  double dx= 1.0/(double)xnvpx;
279  double y=0.0;
280  for (int ivpy=0;ivpy<xnvpy;ivpy++, y+=dy)
281  {
282  double x=0.0;
283  for (int ivpx=0 ;ivpx<xnvpx;ivpx++, x+=dx)
284  {
285  int ipos=pos(ivpx,ivpy);
286 
287  assert(this->ivpx(ipos)==ivpx);
288  assert(this->ivpy(ipos)==ivpy);
289 
290  auto & subframe=subframes[ipos];
291  subframe.viewport[0]=x;
292  subframe.viewport[1]=y;
293  subframe.viewport[2]=x+dx;
294  subframe.viewport[3]=y+dy;
295  }
296  }
297  }
298 
300  void Frame::RTSetSingleViewport(int xnvpx, int xnvpy)
301  {
302  for (int ivpy=0;ivpy<xnvpy;ivpy++)
303  for (int ivpx=0 ;ivpx<xnvpx;ivpx++)
304  {
305  int ipos=pos(ivpx,ivpy);
306  auto & subframe=subframes[ipos];
307  subframe.viewport[0]=0;
308  subframe.viewport[1]=0;
309  subframe.viewport[2]=1;
310  subframe.viewport[3]=0.925;
311  if (ipos==this->active_subframe)
312  subframe.hidden=false;
313  else
314  subframe.hidden=true;
315 
316  }
317 
318  }
319 
320 
323  {
324  subframe.renderer->GetActiveCamera()->SetPosition(this->default_camera_position);
325  subframe.renderer->GetActiveCamera()->SetFocalPoint(this->default_camera_focal_point);
326  subframe.renderer->GetActiveCamera()->OrthogonalizeViewUp();
327  subframe.renderer->GetActiveCamera()->SetRoll(0);
328 // subframe.renderer->GetActiveCamera()->SetObliqueAngles(45,90);
329 // subframe.renderer->GetActiveCamera()->Zoom(subframe.default_camera_zoom);
330  subframe.renderer->GetActiveCamera()->SetViewAngle(this->default_camera_view_angle);
331  }
332 
334  {
335  subframe.renderer->GetActiveCamera()->SetViewAngle(a);
336  }
337 
339  {
340  subframe.renderer->GetActiveCamera()->SetFocalPoint(a);
341  }
342 
344  {
345  subframe.renderer->GetActiveCamera()->SetPosition(a);
346  }
347 
349  void Frame::RTResetRenderers(bool from_scratch)
350  {
351  if (from_scratch)
352  {
353  title_subframe.renderer = vtkSmartPointer<vtkRenderer>::New();
354  title_subframe.renderer->SetBackground(1., 1., 1.);
357  this->window->AddRenderer(title_subframe.renderer);
358  }
359 
360  for (auto & subframe : this->subframes)
361  {
362  if (subframe.renderer)
363  {
364  subframe.renderer->Clear();
365  if (!subframe.hidden)
366  this->window->RemoveRenderer(subframe.renderer);
367  }
368  else
369  {
370  subframe.renderer = vtkSmartPointer<vtkRenderer>::New();
371  subframe.renderer->SetBackground(1., 1., 1.);
372  RTResetCamera(subframe);
373  }
374  subframe.renderer->SetViewport(subframe.viewport);
375  this->window->AddRenderer(subframe.renderer);
376  if (subframe.hidden)
377  this->window->RemoveRenderer(subframe.renderer);
378 
379  }
380  }
381 
382  void Frame::RTSetSingleView(bool single_view)
383  {
384  single_subframe_view=single_view;
385  if (single_view)
386  {
387  this->RTSetSingleViewport(this->nvpx, this->nvpy);
388  for (int i=0;i<this->subframes.size();i++)
389  if (i!=this->active_subframe)
390  this->RTHideSubframe(this->subframes[i]);
391  }
392  else
393  {
394  this->RTCalculateViewports(this->nvpx, this->nvpy);
395  for (int i=0;i<this->subframes.size();i++)
396  this->RTUnHideSubframe(this->subframes[i]);
397  }
398  this->RTResetRenderers(false);
399  RTAddFigures();
400  }
401 
403  {
404 
405  auto &subframe=this->subframes[figure->framepos];
406  auto &renderer=subframe.renderer;
407 
408  if (
409  !figure->IsEmpty()
410  && renderer->GetActors()->GetNumberOfItems()>0
411  )
412 
413 
414  for (auto & actor: figure->actors)
415  renderer->RemoveActor(actor);
416 
417  for (auto & actor: figure->ctxactors)
418  renderer->RemoveActor(actor);
419 
420  for (auto & actor: figure->actors2d)
421  renderer->RemoveActor(actor);
422 
423  RTResetCamera(subframe);
424 
425  }
426 
427 
429  {
430  for (auto & figure: this->figures)
431  {
432  if (!this->subframes[figure->framepos].hidden)
433  {
434  auto &renderer=this->subframes[figure->framepos].renderer;
435 
436  if (
437  figure->IsEmpty()
438  || renderer->GetActors()->GetNumberOfItems()==0
439  )
440  {
441  figure->RTBuildAllVTKPipelines(renderer);
442 
443  for (auto & actor: figure->actors)
444  renderer->AddActor(actor);
445 
446  for (auto & actor: figure->ctxactors)
447  renderer->AddActor(actor);
448 
449  for (auto & actor: figure->actors2d)
450  renderer->AddActor(actor);
451 
452  }
453 
454  figure->RTPreRender();
455  figure->RTUpdateActors();
456 
457  renderer->SetBackground(figure->bgcolor[0],
458  figure->bgcolor[1],
459  figure->bgcolor[2]);
460 
461  }
462  }
463  }
464 
465 
466 
467  vtkSmartPointer<vtkRenderer> Frame::GetRenderer(Figure & fig)
468  {
469 
470  return this->subframes[fig.framepos].renderer;
471  }
472 
473 
474 }
void RTSetSingleView(bool single_viewport)
void WritePNG(std::string fname)
Write png image of frame content.
void SetActiveSubFrameCameraFocalPoint(double x, double y, double z)
Set focal point for camera in active frame relative to default.
void RTSetLayout(int nvpx, int nvpy)
Set subframe layout.
int nvpx
Number of viewports in x direction.
Definition: vtkfigFrame.h:313
void RTAddFigures()
static MainThread * CreateMainThread()
Start thread.
const double default_camera_focal_point[3]
Default camera data.
Definition: vtkfigFrame.h:371
internals::MainThread * mainthread
The spinning main thread.
Definition: vtkfigFrame.h:408
void RTSetActiveSubFrame(int isub, bool hide_old)
Set visible subframe.
Base class for all figures.
Definition: vtkfigFigure.h:52
void SetWindowTitle(const std::string title)
Set window title.
void Show()
Show all frames aka nonblocking event loop.
void StopVideo()
Stop video recording.
Frame()
Create frame.
Definition: vtkfigFrame.cxx:19
vtkSmartPointer< vtkRenderWindow > window
Window vontaining frame.
Definition: vtkfigFrame.h:414
std::vector< vtkSmartPointer< vtkActor > > actors
Definition: vtkfigFigure.h:539
Data structure decribing subframe Each subframe can hold several figures.
Definition: vtkfigFrame.h:342
vtkSmartPointer< vtkRenderer > renderer
vtkRenderer
Definition: vtkfigFrame.h:346
void SetLayout(int nvpx, int nvpy)
Set layout of subframes.
const double default_camera_view_angle
Definition: vtkfigFrame.h:373
void RTSetActiveSubFrameCameraPosition(SubFrame &sf, double a[3])
int pos(const int ivpx, const int ivpy)
Subframe position algebra.
Definition: vtkfigFrame.h:365
void SetAutoLayout(int nfig)
Definition: vtkfigFrame.cxx:41
int nvpy
Number of viewports in y direction.
Definition: vtkfigFrame.h:316
struct vtkfig::Frame::@2 parameter
Parameters to be passed between threads.
void RTResetRenderers(bool from_scratch)
reset all renderers
bool IsEmpty()
Check if figure is empty (== no actors added)
void SetActiveSubFrameCameraViewAngle(double angle)
Set view angle for camera in active frame relative to default.
Definition: vtkfigFrame.cxx:99
void RTCalculateViewports(int nx, int ny)
Calculate viewports for multi subframe view.
int number_in_frame_list
Number of this frame in global frame list.
Definition: vtkfigFrame.h:307
void Interact()
Show frame content and wait for interaction.
Definition: vtkfigFrame.cxx:39
void Interact()
Blocking event loop demanding user interaction unblocked by space key.
void RemoveFigure(Figure *figure)
Remove figure.
Definition: vtkfigFrame.cxx:82
void RTSetActiveSubFrameCameraFocalPoint(SubFrame &sf, double a[3])
void LinkCamera(int ivp, Frame &frame, int livp)
Link camera to other camera.
void AddFrame(Frame *frame)
Add frame to be handeled by thread.
void SetPosition(int x, int y)
Set frame position on screen.
void RTHideSubframe(SubFrame &subframe)
Hide subframe.
void RTRemoveFigure(Figure *figure)
std::vector< vtkSmartPointer< vtkContextActor > > ctxactors
The different actor lists.
Definition: vtkfigFigure.h:538
void RemoveFrame(Frame *frame)
Remove frame from thread.
Provide a framework wrapping window+interactor+renderers from vtk.
Definition: vtkfigFrame.h:38
vtkSmartPointer< vtkRenderer > GetRenderer(Figure &fig)
int framepos
position in its respective frame
Definition: vtkfigFigure.h:548
void RTResetCamera(SubFrame &sf)
reset camera to default position
void SendCommand(int iframe, const std::string from, Communicator::Command cmd)
Communication with render thread.
int ivpx(const int pos)
Definition: vtkfigFrame.h:366
void AddFigure(Figure *figure)
Add figure at position (0)
Definition: vtkfigFrame.h:88
std::set< Figure * > figures
List of all figures in frame.
Definition: vtkfigFrame.h:310
std::vector< SubFrame > subframes
List of subframes.
Definition: vtkfigFrame.h:361
int ivpy(const int pos)
Definition: vtkfigFrame.h:367
vtkSmartPointer< vtkCornerAnnotation > title_actor
Actor for frame title annotation.
Definition: vtkfigFrame.h:417
void RTSetSingleViewport(int nx, int ny)
Calculate viewports for single subframe view.
std::vector< vtkSmartPointer< vtkActor2D > > actors2d
Definition: vtkfigFigure.h:540
void SendCommand(std::string source, internals::Communicator::Command cmd)
Blocking send of commands to main thread.
void SetActiveSubFrame(int iframe)
Set active subframe number for editing, single/multiview etc.
Definition: vtkfigFrame.cxx:90
SubFrame title_subframe
Definition: vtkfigFrame.h:362
void SetSingleSubFrameView(bool b)
Toggle single/multi view for frame with mutiple figures.
void RTInit()
Init title actor.
Define Frame class providing a window for rendering.
void StartVideo(std::string fname)
Start video recording.
double viewport[4]
Viewport within frame.
Definition: vtkfigFrame.h:353
void Show()
Show frame content and continue.
Definition: vtkfigFrame.cxx:37
void RTUnHideSubframe(SubFrame &subframe)
Unhide subframe.
const double default_camera_position[3]
Definition: vtkfigFrame.h:372
void SetFrameTitle(const std::string title)
Set Frame title.
void SetActiveSubFrameCameraPosition(double x, double y, double z)
Set view position for camera in active frame relative to default.
void SetSize(int x, int y)
Set frame size in pixels.
void RTSetActiveSubFrameCameraViewAngle(SubFrame &sf, double a)
bool single_subframe_view
Definition: vtkfigFrame.h:357