VTKFIG  0.20.20181114
Easy VTK based in situ visualization
virtual void vtkfig::internals::MyTimerCallback::Execute ( vtkObject *  vtkNotUsedcaller,
unsigned long  eventId,
void *  vtkNotUsedcallData 
)
inlinevirtual

Definition at line 613 of file vtkfigMainThread.cxx.

618  {
619 
620 
621  // Not clear why it was like that...
622  // if (this->mainthread->communication_blocked && mainthread->cmd != Communicator::Command::MainThreadShow) return;
623 
624  if (this->mainthread->communication_blocked) return;
625 
626  if (
627  vtkCommand::TimerEvent == eventId // Check if timer event
628  && this->mainthread->cmd!=Communicator::Command::Empty // Check if command has been given
629  )
630  {
631 
632 
633  // Lock mutex
635  std::unique_lock<std::mutex> lock(this->mainthread->mutex);
636 
637  // Command dispatch
638  switch(mainthread->cmd)
639  {
640 
641  // Add frame to main thread
643  {
645  }
646  break;
647 
648  // Remove frame from mainthread
650  {
651 
652  auto frame=mainthread->framemap[mainthread->iframe];
653  for (auto & subframe: frame->subframes)
654  subframe.renderer->RemoveAllViewProps();
655 
656  frame->window->Finalize();
657 
658  mainthread->framemap.erase(frame->number_in_frame_list);
659 
660  }
661  break;
662 
663 
664 
666  {
667  // Add actors from figures to renderer
668  for (auto & framepair: mainthread->framemap)
669  framepair.second->RTAddFigures();
670 
671 
672 
673  for (auto & framepair: mainthread->framemap)
674  {
675  auto frame=framepair.second;
676 
677  if(frame->mainthread->communication_blocked)
678  frame->title_actor->SetText(6,"-|-");
679  else
680  frame->title_actor->SetText(6,"---");
681 
682  frame->title_actor->Modified();
683 
684  // for (auto & figure: framepair.second->figures)
685  // figure->RTUpdateActors();
686  frame->window->Render();
687  if (frame->videowriter && ! frame->mainthread->communication_blocked)
688  {
689  this->Interactor->Render();
690  auto imgfilter = vtkSmartPointer<vtkWindowToImageFilter>::New();
691  imgfilter->SetInput(frame->window);
692  imgfilter->Update();
693  frame->videowriter->SetInputConnection(imgfilter->GetOutputPort());
694  this->Interactor->Render();
695  frame->videowriter->Write();
696  }
697  }
698  //this->Interactor->Render();
699  }
700  break;
701 
702  // Write picture to file
704  {
705  auto frame=mainthread->framemap[mainthread->iframe];
706  auto imgfilter = vtkSmartPointer<vtkWindowToImageFilter>::New();
707  auto pngwriter = vtkSmartPointer<vtkPNGWriter>::New();
708 
709  pngwriter->SetInputConnection(imgfilter->GetOutputPort());
710  pngwriter->SetFileName(frame->parameter.filename.c_str());
711 
712  imgfilter->SetInput(frame->window);
713  imgfilter->Update();
714 
715  this->Interactor->Render();
716  pngwriter->Write();
717  }
718  break;
719 
720  // Start video
722  {
723  auto frame=mainthread->framemap[mainthread->iframe];
724 
725  frame->videowriter = vtkSmartPointer<vtkOggTheoraWriter>::New();
726  frame->videowriter->SetFileName(frame->parameter.filename.c_str());
727  frame->videowriter->Start();
728  }
729  break;
730 
732  {
733  auto frame=mainthread->framemap[mainthread->iframe];
734  frame->videowriter->End();
735  frame->videowriter=0;
736  }
737  break;
738 
740  {
741  auto frame=mainthread->framemap[mainthread->iframe];
742  frame->RTRemoveFigure(frame->parameter.current_figure);
743  }
744  break;
745 
746 
748  {
749  auto frame=mainthread->framemap[mainthread->iframe];
750  frame->RTSetLayout(frame->parameter.nvpx,frame->parameter.nvpy);
751  frame->RTResetRenderers(false);
752  }
753 
754  // Set frame size
756  {
757  auto frame=mainthread->framemap[mainthread->iframe];
758  frame->window->SetSize(frame->parameter.winsize_x, frame->parameter.winsize_y);
759  }
760  break;
761 
762  // Set active subframe
764  {
765  auto frame=mainthread->framemap[mainthread->iframe];
766  frame->RTSetActiveSubFrame(frame->parameter.active_subframe,false);
767  }
768  break;
769 
770  // Set active subframe
772  {
773  auto frame=mainthread->framemap[mainthread->iframe];
774  auto& subframe=frame->subframes[frame->parameter.active_subframe];
775  frame->RTSetActiveSubFrameCameraViewAngle(subframe,frame->parameter.camera_view_angle);
776  }
777  break;
778 
779  // Set active subframe
781  {
782  auto frame=mainthread->framemap[mainthread->iframe];
783  auto& subframe=frame->subframes[frame->parameter.active_subframe];
784  frame->RTSetActiveSubFrameCameraPosition(subframe,frame->parameter.camera_position);
785  }
786  break;
787 
788  // Set active subframe
790  {
791  auto frame=mainthread->framemap[mainthread->iframe];
792  auto& subframe=frame->subframes[frame->parameter.active_subframe];
793  frame->RTSetActiveSubFrameCameraFocalPoint(subframe,frame->parameter.camera_focal_point);
794  }
795  break;
796 
798  {
799  auto frame=mainthread->framemap[mainthread->iframe];
800  frame->RTSetSingleView(frame->parameter.single_subframe_view);
801  }
802  break;
803 
804 
805 
806  // Set frame position
808  {
809  auto frame=mainthread->framemap[mainthread->iframe];
810  frame->window->SetPosition(frame->parameter.winposition_x, frame->parameter.winposition_y);
811  }
812  break;
813 
814  // Set frame title
816  {
817  auto frame=mainthread->framemap[mainthread->iframe];
818  frame->RTInit();
819  frame->title_actor->SetText(7,frame->parameter.frametitle.c_str());
820  frame->title_actor->Modified();
821 
822  }
823  break;
824 
825  // Set window title
827  {
828  auto frame=mainthread->framemap[mainthread->iframe];
829  frame->window->SetWindowName(frame->parameter.wintitle.c_str());
830  }
831  break;
832 
833  // Link camera to other
835  {
836  auto frame=mainthread->framemap[mainthread->iframe];
837  auto renderer=mainthread->framemap[mainthread->iframe]->subframes[frame->parameter.camlinkthisframepos].renderer;
838  auto lrenderer=mainthread->framemap[frame->parameter.camlinkframenum]->subframes[frame->parameter.camlinkframepos].renderer;
839  renderer->SetActiveCamera(lrenderer->GetActiveCamera());
840  }
841  break;
842 
843  // Terminate
845  {
846 
847  for (auto & framepair: mainthread->framemap)
848  framepair.second->window->Finalize();
849 
850  mainthread->framemap.clear();
851 
852  this->Interactor->TerminateApp();
853 
855 
856  mainthread->condition_variable.notify_all();
857 
858  return;
859  }
860  break;
861 
862  default:;
863  }
864 
865  // Clear command
867 
868  // Notify that command was exeuted
870  //
871  mainthread->condition_variable.notify_all();
872  else
873  // dirty trick to unblock event loop.
874  // hopefully works if multitreading does not
875  mainthread->interactor->TerminateApp();
876 
877  }
878  }
bool communication_blocked
space down state ?
vtkSmartPointer< vtkRenderWindowInteractor > interactor
Communicator::Command cmd
Communication command.
std::condition_variable condition_variable
Condition variable signalizing finished command.
std::mutex mutex
Mutex to organize communication.
vtkSmartPointer< vtkRenderWindowInteractor > Interactor
std::map< int, Frame * > framemap
Map of all frames handeled by thread.
bool running_multithreaded
Thread state.
int iframe
Frame number as parameter during communication.
static void RTAddFrame(MainThread *mt, int iframe)
Add frame, to be called from render thread.

+ Here is the call graph for this function: