Files
ThirdParty-6/ParaView-5.0.1/VTK/Examples/Annotation/Cxx/LabeledMesh/LabeledMesh.cxx

219 lines
7.0 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: LabeledMesh.cxx
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
// This example was translated into C++ from its TCL counterpart
// (VTK/Examples/Annotation/Tcl/labeledMesh.tcl) by Jake Nickel from
// the University of Iowa. It demonstrates the use of vtkLabeledDataMapper.
// This class is used for displaying numerical data from an underlying data
// set. In the case of this example, the underlying data are the point and
// cell ids.
// First we include the necessary header files.
#include "vtkSmartPointer.h"
#include "vtkPoints.h"
#include "vtkCellArray.h"
#include "vtkPolyData.h"
#include "vtkPolyDataMapper2D.h"
#include "vtkActor2D.h"
#include "vtkSphereSource.h"
#include "vtkPolyDataMapper.h"
#include "vtkActor.h"
#include "vtkIdFilter.h"
#include "vtkRenderer.h"
#include "vtkSelectVisiblePoints.h"
#include "vtkLabeledDataMapper.h"
#include "vtkCellCenters.h"
#include "vtkLabeledDataMapper.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkTextProperty.h"
static int xLength;
static int yLength;
static vtkSmartPointer<vtkSelectVisiblePoints> visPts;
static vtkSmartPointer<vtkSelectVisiblePoints> visCells;
static vtkSmartPointer<vtkPoints> pts;
static vtkSmartPointer<vtkRenderWindow> renWin;
// Create a procedure to draw the selection window at each location it
// is moved to.
void PlaceWindow( int xmin, int ymin )
{
int xmax = xmin + xLength;
int ymax = ymin + yLength;
visPts->SetSelection( xmin, xmax, ymin, ymax );
visCells->SetSelection( xmin, xmax, ymin, ymax );
pts->InsertPoint( 0, xmin, ymin, 0 );
pts->InsertPoint( 1, xmin, ymin, 0 );
pts->InsertPoint( 2, xmin, ymin, 0 );
pts->InsertPoint( 3, xmin, ymin, 0 );
// Call Modified because InsertPoints does not modify vtkPoints
// (for performance reasons).
pts->Modified();
renWin->Render();
}
// Create a procedure to move the selection window across the data set.
void MoveWindow()
{
for( int y = 100; y < 300; y += 25 )
{
for( int x = 100; x < 300; x += 25 )
{
PlaceWindow( x, y );
}
}
}
int main( int , char *[] )
{
// Create a selection window. We will display the point and cell ids that
// lie within this window.
int xmin = 200;
xLength = 100;
int xmax = xmin + xLength;
int ymin = 200;
yLength = 100;
int ymax = ymin + yLength;
pts = vtkSmartPointer<vtkPoints>::New();
pts->InsertPoint( 0, xmin, ymin, 0 );
pts->InsertPoint( 1, xmax, ymin, 0 );
pts->InsertPoint( 2, xmax, ymax, 0 );
pts->InsertPoint( 3, xmin, ymax, 0 );
vtkSmartPointer<vtkCellArray> rect =
vtkSmartPointer<vtkCellArray>::New();
rect->InsertNextCell( 5 );
rect->InsertCellPoint( 0 );
rect->InsertCellPoint( 1 );
rect->InsertCellPoint( 2 );
rect->InsertCellPoint( 3 );
rect->InsertCellPoint( 0 );
vtkSmartPointer<vtkPolyData> selectRect =
vtkSmartPointer<vtkPolyData>::New();
selectRect->SetPoints( pts );
selectRect->SetLines( rect );
vtkSmartPointer<vtkPolyDataMapper2D> rectMapper =
vtkSmartPointer<vtkPolyDataMapper2D>::New();
rectMapper->SetInputData(selectRect);
vtkSmartPointer<vtkActor2D> rectActor =
vtkSmartPointer<vtkActor2D>::New();
rectActor->SetMapper( rectMapper );
// Create a sphere and its associated mapper and actor.
vtkSmartPointer<vtkSphereSource> sphere =
vtkSmartPointer<vtkSphereSource>::New();
vtkSmartPointer<vtkPolyDataMapper> sphereMapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
sphereMapper->SetInputConnection(sphere->GetOutputPort());
sphereMapper->GlobalImmediateModeRenderingOn();
vtkSmartPointer<vtkActor> sphereActor =
vtkSmartPointer<vtkActor>::New();
sphereActor->SetMapper( sphereMapper );
// Generate data arrays containing point and cell ids
vtkSmartPointer<vtkIdFilter> ids =
vtkSmartPointer<vtkIdFilter>::New();
ids->SetInputConnection( sphere->GetOutputPort() );
ids->PointIdsOn();
ids->CellIdsOn();
ids->FieldDataOn();
// Create the renderer here because vtkSelectVisiblePoints needs it.
vtkSmartPointer<vtkRenderer> ren1 =
vtkSmartPointer<vtkRenderer>::New();
// Create labels for points
visPts = vtkSmartPointer<vtkSelectVisiblePoints>::New();
visPts->SetInputConnection( ids->GetOutputPort() );
visPts->SetRenderer( ren1 );
visPts->SelectionWindowOn();
visPts->SetSelection( xmin, xmin + xLength, ymin, ymin + yLength );
// Create the mapper to display the point ids. Specify the
// format to use for the labels. Also create the associated actor.
vtkSmartPointer<vtkLabeledDataMapper> ldm =
vtkSmartPointer<vtkLabeledDataMapper>::New();
ldm->SetInputConnection( visPts->GetOutputPort() );
ldm->SetLabelModeToLabelFieldData();
vtkSmartPointer<vtkActor2D> pointLabels =
vtkSmartPointer<vtkActor2D>::New();
pointLabels->SetMapper( ldm );
// Create labels for cells
vtkSmartPointer<vtkCellCenters> cc =
vtkSmartPointer<vtkCellCenters>::New();
cc->SetInputConnection( ids->GetOutputPort() );
visCells = vtkSmartPointer<vtkSelectVisiblePoints>::New();
visCells->SetInputConnection( cc->GetOutputPort() );
visCells->SetRenderer( ren1 );
visCells->SelectionWindowOn();
visCells->SetSelection( xmin, xmin + xLength, ymin, ymin + yLength );
// Create the mapper to display the cell ids. Specify the
// format to use for the labels. Also create the associated actor.
vtkSmartPointer<vtkLabeledDataMapper> cellMapper =
vtkSmartPointer<vtkLabeledDataMapper>::New();
cellMapper->SetInputConnection( visCells->GetOutputPort() );
cellMapper->SetLabelModeToLabelFieldData();
cellMapper->GetLabelTextProperty()->SetColor( 0, 1, 0 );
vtkSmartPointer<vtkActor2D> cellLabels =
vtkSmartPointer<vtkActor2D>::New();
cellLabels->SetMapper( cellMapper );
// Create the RenderWindow and RenderWindowInteractor
renWin = vtkSmartPointer<vtkRenderWindow>::New();
renWin->AddRenderer( ren1 );
vtkSmartPointer<vtkRenderWindowInteractor> iren =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
iren->SetRenderWindow( renWin );
// Add the actors to the renderer; set the background and size; render
ren1->AddActor( sphereActor );
ren1->AddActor2D( rectActor );
ren1->AddActor2D( pointLabels );
ren1->AddActor2D( cellLabels );
ren1->SetBackground( 1, 1, 1 );
renWin->SetSize( 500, 500 );
renWin->Render();
// Move the selection window across the data set.
MoveWindow();
// Put the selection window in the center of the render window.
// This works because the xmin = ymin = 200, xLength = yLength = 100, and
// the render window size is 500 x 500.
PlaceWindow( xmin, ymin );
iren->Initialize();
iren->Start();
return 0;
}