You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
158 lines
5.2 KiB
158 lines
5.2 KiB
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: $RCSfile: MultiBlock.cxx,v $
|
|
|
|
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 demonstrates how multi-block datasets can be processed
|
|
// using the new vtkHierarchicalDataSet class.
|
|
//
|
|
// The command line arguments are:
|
|
// -D <path> => path to the data (VTKData); the data should be in <path>/Data/
|
|
|
|
#include "vtkActor.h"
|
|
#include "vtkCellDataToPointData.h"
|
|
#include "vtkContourFilter.h"
|
|
#include "vtkDebugLeaks.h"
|
|
#include "vtkHierarchicalDataSet.h"
|
|
#include "vtkHierarchicalDataSetGeometryFilter.h"
|
|
#include "vtkOutlineCornerFilter.h"
|
|
#include "vtkPolyData.h"
|
|
#include "vtkPolyDataMapper.h"
|
|
#include "vtkProperty.h"
|
|
#include "vtkRenderer.h"
|
|
#include "vtkRenderWindow.h"
|
|
#include "vtkRenderWindowInteractor.h"
|
|
#include "vtkShrinkPolyData.h"
|
|
#include "vtkStructuredGrid.h"
|
|
#include "vtkStructuredGridOutlineFilter.h"
|
|
#include "vtkTestUtilities.h"
|
|
#include "vtkXMLStructuredGridReader.h"
|
|
|
|
int main(int argc, char* argv[])
|
|
{
|
|
// Standard rendering classes
|
|
vtkRenderer *ren = vtkRenderer::New();
|
|
vtkRenderWindow *renWin = vtkRenderWindow::New();
|
|
renWin->AddRenderer(ren);
|
|
vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
|
|
iren->SetRenderWindow(renWin);
|
|
|
|
// We will read three files and collect them together in one
|
|
// multi-block dataset. I broke the combustor dataset into
|
|
// three pieces and wrote them out separately.
|
|
int i;
|
|
vtkXMLStructuredGridReader* reader = vtkXMLStructuredGridReader::New();
|
|
|
|
// vtkMultiBlockDataSet respresents multi-block datasets. See
|
|
// the class documentation for more information.
|
|
vtkHierarchicalDataSet* mb = vtkHierarchicalDataSet::New();
|
|
|
|
for (i=0; i<3; i++)
|
|
{
|
|
// Here we load the three separate files (each containing
|
|
// a structured grid dataset)
|
|
ostrstream fname;
|
|
fname << "Data/multicomb_" << i << ".vts" << ends;
|
|
char* fstr = fname.str();
|
|
char* cfname =
|
|
vtkTestUtilities::ExpandDataFileName(argc, argv, fstr);
|
|
reader->SetFileName(cfname);
|
|
// We have to update since we are working without a VTK pipeline.
|
|
// This will read the file and the output of the reader will be
|
|
// a valid structured grid data.
|
|
reader->Update();
|
|
delete[] fstr;
|
|
delete[] cfname;
|
|
|
|
// We create a copy to avoid adding the same data three
|
|
// times (the output object of the reader does not change
|
|
// when the filename changes)
|
|
vtkStructuredGrid* sg = vtkStructuredGrid::New();
|
|
sg->ShallowCopy(reader->GetOutput());
|
|
|
|
// Add the structured grid to the multi-block dataset
|
|
mb->SetDataSet(0, i, sg);
|
|
sg->Delete();
|
|
}
|
|
reader->Delete();
|
|
|
|
// Multi-block can be processed with regular VTK filters in two ways:
|
|
// 1. Pass through a multi-block aware consumer. Since a multi-block
|
|
// aware mapper is not yet available, vtkHierarchicalDataSetGeometryFilter
|
|
// can be used
|
|
// 2. Assign the composite executive (vtkCompositeDataPipeline) to
|
|
// all "simple" (that work only on simple, non-composite datasets) filters
|
|
|
|
// outline
|
|
vtkStructuredGridOutlineFilter* of = vtkStructuredGridOutlineFilter::New();
|
|
of->SetInput(mb);
|
|
|
|
// geometry filter
|
|
// This filter is multi-block aware and will request blocks from the
|
|
// input. These blocks will be processed by simple processes as if they
|
|
// are the whole dataset
|
|
vtkHierarchicalDataSetGeometryFilter* geom1 =
|
|
vtkHierarchicalDataSetGeometryFilter::New();
|
|
geom1->SetInputConnection(0, of->GetOutputPort(0));
|
|
|
|
// Rendering objects
|
|
vtkPolyDataMapper* geoMapper = vtkPolyDataMapper::New();
|
|
geoMapper->SetInputConnection(0, geom1->GetOutputPort(0));
|
|
|
|
vtkActor* geoActor = vtkActor::New();
|
|
geoActor->SetMapper(geoMapper);
|
|
geoActor->GetProperty()->SetColor(0, 0, 0);
|
|
ren->AddActor(geoActor);
|
|
|
|
// cell 2 point and contour
|
|
vtkCellDataToPointData* c2p = vtkCellDataToPointData::New();
|
|
c2p->SetInput(mb);
|
|
|
|
vtkContourFilter* contour = vtkContourFilter::New();
|
|
contour->SetInputConnection(0, c2p->GetOutputPort(0));
|
|
contour->SetValue(0, 0.45);
|
|
|
|
// geometry filter
|
|
vtkHierarchicalDataSetGeometryFilter* geom2 =
|
|
vtkHierarchicalDataSetGeometryFilter::New();
|
|
geom2->SetInputConnection(0, contour->GetOutputPort(0));
|
|
|
|
// Rendering objects
|
|
vtkPolyDataMapper* contMapper = vtkPolyDataMapper::New();
|
|
contMapper->SetInputConnection(0, geom2->GetOutputPort(0));
|
|
|
|
vtkActor* contActor = vtkActor::New();
|
|
contActor->SetMapper(contMapper);
|
|
contActor->GetProperty()->SetColor(1, 0, 0);
|
|
ren->AddActor(contActor);
|
|
|
|
ren->SetBackground(1,1,1);
|
|
renWin->SetSize(300,300);
|
|
iren->Start();
|
|
|
|
// Cleanup
|
|
of->Delete();
|
|
geom1->Delete();
|
|
geoMapper->Delete();
|
|
geoActor->Delete();
|
|
c2p->Delete();
|
|
contour->Delete();
|
|
geom2->Delete();
|
|
contMapper->Delete();
|
|
contActor->Delete();
|
|
ren->Delete();
|
|
renWin->Delete();
|
|
iren->Delete();
|
|
mb->Delete();
|
|
|
|
return 0;
|
|
}
|
|
|