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;
 | |
| }
 | |
| 
 |