[vtkusers] Looking for zoom sample

Dean Inglis dean.inglis at camris.ca
Wed Jun 16 12:55:17 EDT 2004


Hi Ingo,

Here is some C++ sample code wherein one can
place a smaller renderer in a main renderwindow.
An outline of this renderer is created and its
visbility is controlled depending on program state.

m_segmentActor is a vtkActor used to show
a copy of a traced outline from an image and
a vtkSplineWidget (m_spline) in the main renderer.

m_renderer is the small lower right corner
vtkRenderer.

m_renderWindow is the main vtkRenderWindow.

m_outline is a vtkPolyData.

m_outlineActor is a vtkActor2D.


<snip>
// intialize some vtk objects

  vtkPolyDataMapper* segmentMapper = vtkPolyDataMapper::New();
  segmentMapper->SetInput(m_tempPoly);
  m_segmentActor->SetMapper(segmentMapper);
  m_segmentActor->VisibilityOff();
  segmentMapper->Delete();

  vtkProperty* aprop = m_segmentActor->GetProperty();
  aprop->SetRepresentationToWireframe();
  aprop->SetColor(1,1,0);
  aprop->SetLineWidth(2);

  m_renderer->SetLayer(1);
  m_renderer->InteractiveOff();
  m_renderer->SetViewport(.8,0,1,.2);

  m_renderWindow->AddRenderer(m_renderer);
  m_renderWindow->SetNumberOfLayers(2);

  m_renderer->AddProp(m_segmentActor);

  double vp[4];
  m_renderer->GetViewport( vp );

  m_renderer->NormalizedDisplayToDisplay( vp[0], vp[1] );
  m_renderer->NormalizedDisplayToDisplay( vp[2], vp[3] );

  m_outline->Allocate();
  vtkPoints *points = vtkPoints::New();
  vtkIdType ptIds[5];
  ptIds[4] = ptIds[0] = points->InsertNextPoint( 1, 1, 0 );
  ptIds[1] = points->InsertNextPoint( 2, 1, 0 );
  ptIds[2] = points->InsertNextPoint( 2, 2, 0 );
  ptIds[3] = points->InsertNextPoint( 1, 2, 0 );

  points->SetPoint( 0, vp[0]+1, vp[1]+1, 0 );
  points->SetPoint( 1, vp[2]-1, vp[1]+1, 0 );
  points->SetPoint( 2, vp[2]-1, vp[3]-1, 0 );
  points->SetPoint( 3, vp[0]+1, vp[3]-1, 0 );

  m_outline->SetPoints( points );
  m_outline->InsertNextCell( VTK_POLY_LINE, 5, ptIds );

  vtkCoordinate *tcoord = vtkCoordinate::New();
  tcoord->SetCoordinateSystemToDisplay();

  vtkPolyDataMapper2D *mapper = vtkPolyDataMapper2D::New();
  mapper->SetInput( m_outline );
  mapper->SetTransformCoordinate( tcoord );
  mapper->ScalarVisibilityOff();

  m_outlineActor->SetMapper( mapper );
  m_outlineActor->SetPosition( 0, 0 );
  m_outlineActor->SetPosition2( 1, 1 );

  vtkProperty2D* prop = m_outlineActor->GetProperty();
  prop->SetColor(1,0,0);
  prop->SetLineWidth(2);

  m_renderer->AddProp(m_outlineActor);
  m_outlineActor->VisibilityOff();
<snip>

Now, when we have some polydata to display, turn on the
actors in the renderer...

<snip>
// add a copy of a spline's polydata to the small renderer

  if(!m_spline->GetEnabled()){ return;}

  vtkPolyData* poly = vtkPolyData::New();
  m_spline->GetPolyData(poly);

  if(poly->GetNumberOfPoints()<2)
    {
    poly->Delete();
    return;
    }


(vtkPolyDataMapper::SafeDownCast(m_segmentActor->GetMapper()))->SetInput(pol
y);

  m_outlineActor->VisibilityOn();
  m_segmentActor->VisibilityOn();

  m_renderer->ResetCameraClippingRange();
  m_renderer->ResetCamera();
  m_renderer->Render();

  poly->Delete();
<snip>


Dean





More information about the vtkusers mailing list