/*========================================================================= 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; }