Cloned library of VTK-5.0.0 with extra build files for internal package management.
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.
 
 
 
 
 
 

225 lines
6.9 KiB

/*=========================================================================
Program: Visualization Toolkit
Module: $RCSfile: vtkXMLStructuredGridReader.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.
=========================================================================*/
#include "vtkXMLStructuredGridReader.h"
#include "vtkObjectFactory.h"
#include "vtkStructuredGrid.h"
#include "vtkXMLDataElement.h"
#include "vtkXMLDataParser.h"
#include "vtkInformation.h"
#include "vtkStreamingDemandDrivenPipeline.h"
vtkCxxRevisionMacro(vtkXMLStructuredGridReader, "$Revision: 1.11 $");
vtkStandardNewMacro(vtkXMLStructuredGridReader);
//----------------------------------------------------------------------------
vtkXMLStructuredGridReader::vtkXMLStructuredGridReader()
{
// Copied from vtkStructuredGridReader constructor:
vtkStructuredGrid *output = vtkStructuredGrid::New();
this->SetOutput(output);
// Releasing data for pipeline parallism.
// Filters will know it is empty.
output->ReleaseData();
output->Delete();
this->PointElements = 0;
}
//----------------------------------------------------------------------------
vtkXMLStructuredGridReader::~vtkXMLStructuredGridReader()
{
if(this->NumberOfPieces) { this->DestroyPieces(); }
}
//----------------------------------------------------------------------------
void vtkXMLStructuredGridReader::PrintSelf(ostream& os, vtkIndent indent)
{
this->Superclass::PrintSelf(os, indent);
}
//----------------------------------------------------------------------------
void vtkXMLStructuredGridReader::SetOutput(vtkStructuredGrid *output)
{
this->GetExecutive()->SetOutputData(0, output);
}
//----------------------------------------------------------------------------
vtkStructuredGrid* vtkXMLStructuredGridReader::GetOutput()
{
return this->GetOutput(0);
}
//----------------------------------------------------------------------------
vtkStructuredGrid* vtkXMLStructuredGridReader::GetOutput(int idx)
{
return vtkStructuredGrid::SafeDownCast( this->GetOutputDataObject(idx) );
}
//----------------------------------------------------------------------------
const char* vtkXMLStructuredGridReader::GetDataSetName()
{
return "StructuredGrid";
}
//----------------------------------------------------------------------------
void vtkXMLStructuredGridReader::SetOutputExtent(int* extent)
{
this->GetOutput()->SetExtent(extent);
}
//----------------------------------------------------------------------------
void vtkXMLStructuredGridReader::SetupPieces(int numPieces)
{
this->Superclass::SetupPieces(numPieces);
this->PointElements = new vtkXMLDataElement*[numPieces];
int i;
for(i=0;i < numPieces; ++i)
{
this->PointElements[i] = 0;
}
}
//----------------------------------------------------------------------------
void vtkXMLStructuredGridReader::DestroyPieces()
{
delete [] this->PointElements;
this->Superclass::DestroyPieces();
}
//----------------------------------------------------------------------------
int vtkXMLStructuredGridReader::ReadPiece(vtkXMLDataElement* ePiece)
{
if(!this->Superclass::ReadPiece(ePiece)) { return 0; }
// Find the Points element in the piece.
int i;
this->PointElements[this->Piece] = 0;
for(i=0; i < ePiece->GetNumberOfNestedElements(); ++i)
{
vtkXMLDataElement* eNested = ePiece->GetNestedElement(i);
if((strcmp(eNested->GetName(), "Points") == 0)
&& (eNested->GetNumberOfNestedElements() == 1))
{
this->PointElements[this->Piece] = eNested;
}
}
// If there is any volume, we require a Points element.
int* piecePointDimensions = this->PiecePointDimensions + this->Piece*3;
if(!this->PointElements[this->Piece] &&
(piecePointDimensions[0] > 0) &&
(piecePointDimensions[1] > 0) &&
(piecePointDimensions[2] > 0))
{
vtkErrorMacro("A piece is missing its Points element "
"or element does not have exactly 1 array.");
return 0;
}
return 1;
}
//----------------------------------------------------------------------------
void vtkXMLStructuredGridReader::SetupOutputData()
{
this->Superclass::SetupOutputData();
// Create the points array.
vtkPoints* points = vtkPoints::New();
// Use the configuration of the first piece since all are the same.
vtkXMLDataElement* ePoints = this->PointElements[0];
if (ePoints)
{
// Non-zero volume.
vtkDataArray* a = this->CreateDataArray(ePoints->GetNestedElement(0));
if (a)
{
// Allocate the points array.
a->SetNumberOfTuples( this->GetNumberOfPoints() );
points->SetData(a);
a->Delete();
}
else
{
this->DataError = 1;
}
}
this->GetOutput()->SetPoints(points);
points->Delete();
}
//----------------------------------------------------------------------------
int vtkXMLStructuredGridReader::ReadPieceData()
{
// The amount of data read by the superclass's ReadPieceData comes
// from point/cell data (we read point specifications here).
int dims[3] = {0,0,0};
this->ComputePointDimensions(this->SubExtent, dims);
vtkIdType superclassPieceSize =
(this->NumberOfPointArrays*dims[0]*dims[1]*dims[2]+
this->NumberOfCellArrays*(dims[0]-1)*(dims[1]-1)*(dims[2]-1));
// Total amount of data in this piece comes from point/cell data
// arrays and the point specifications themselves.
vtkIdType totalPieceSize =
superclassPieceSize + dims[0]*dims[1]*dims[2];
if(totalPieceSize == 0)
{
totalPieceSize = 1;
}
// Split the progress range based on the approximate fraction of
// data that will be read by each step in this method.
float progressRange[2] = {0,0};
this->GetProgressRange(progressRange);
float fractions[3] =
{
0,
float(superclassPieceSize) / totalPieceSize,
1
};
// Set the range of progress for the superclass.
this->SetProgressRange(progressRange, 0, fractions);
// Let the superclass read its data.
if(!this->Superclass::ReadPieceData()) { return 0; }
if(!this->PointElements[this->Piece])
{
// Empty volume.
return 1;
}
// Set the range of progress for the points array.
this->SetProgressRange(progressRange, 1, fractions);
// Read the points array.
vtkStructuredGrid* output = this->GetOutput();
vtkXMLDataElement* ePoints = this->PointElements[this->Piece];
return this->ReadArrayForPoints(ePoints->GetNestedElement(0),
output->GetPoints()->GetData());
}
int vtkXMLStructuredGridReader::FillOutputPortInformation(int, vtkInformation *info)
{
info->Set(vtkDataObject::DATA_TYPE_NAME(), "vtkStructuredGrid");
return 1;
}