/*========================================================================= 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 to the data (VTKData); the data should be in /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; }