From Slicer Wiki
Jump to: navigation, search
Home < Documentation < Labs < ViewInfrastructureImprovements


  • Update Slicer code base to listen to interactor instead of interactor style
  • Add support for interactor style switch per view
  • Allow access to vtkRenderWindow from vtkMRMLViewNode


  • We would like to conveniently be able to change the interactor style without having to reset all observer for the displayable managers.
  • Accessing the vtkRenderWindow would allow us to do (for example) screenshots given a specific viewNode.

InteractorStyle management


Access 3D View

  • Created a new Action menu in qSlicerMouseModeToolBar following this method.
  • Accessed all qMRMLThreeDView through the layoutManager :
void qSlicerMouseModeToolBar::switchToTrackBallInteractorStyle()
  qMRMLLayoutManager *layoutManager = qSlicerApplication::application()->layoutManager();

  // loop through all existing threeDViews
  vtkNew<vtkThreeDViewInteractorStyle> interactorStyle;
  for (int i=0; i < layoutManager->threeDViewCount(); ++i)
    qMRMLThreeDView* view = layoutManager->threeDWidget(i)->threeDView();
    // Update Interactor style
    this->SetInteractorStyle(view, interactorStyle.GetPointer());
    // Reset focal point

  // Update icon
  • Issue : not setting the interactor per view but for all views
  • Possible solution : adding the switch in each 3D View Qt controller

Update InteractorStyle

  • Set the interactorStyle to the qMRMLThreeDView interactor :
void qSlicerMouseModeToolBar::SetInteractorStyle(qMRMLThreeDView* view,
                                                 vtkInteractorStyle* interactorStyle)
  // Set InteractorStyle on renderview

  // Get DMs
  vtkNew<vtkCollection> collection;
  int numManagers = collection->GetNumberOfItems();

  // Set and Observe InteractorStyle for cameraDM
  for (int i = 0; i < numManagers; ++i)
    vtkMRMLCameraDisplayableManager *cameraDM =
    if (cameraDM)

  • Issues :
    • Should need to update the observations for all the DM using SetAndObserveInteractorStyle(), but this crashes Slicer.
    • The camera was not set anymore after a change of interactor styles in the vtkMRMLCameraDisplayableManager, so we had to use SetCameraToInteractor() and define it as a public method.
  • Possible solution : updating Slicer core so that it listen only to the interactor instead of the interactorStyle.

Design & implementation


vtkRenderWindow mapping


  • Created a method that accessed the renderWindow through the layout manager MRMLViewFactory :
vtkRenderWindow* getMRMLViewRenderWindow(vtkMRMLViewNode* viewNode)
  qSlicerLayoutManager *layoutManager = qSlicerApplication::application()->layoutManager();
  qMRMLThreeDWidget* threeDWidget = qobject_cast<qMRMLThreeDWidget*>(layoutManager->mrmlViewFactory("vtkMRMLViewNode")->viewWidget(viewNode));
  vtkRenderWindow *renderWindow = threeDWidget->threeDView()->renderWindow();

  return renderWindow;
  • Issue : calls to qMRML while we would prefer to stay with vtkMRML only
  • Possible solution : map the vtkRenderWindow to the vtkMRMLViewNode in the view factory when creating the widget

Design & implementation