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.
 
 
 
 
 
 

290 lines
9.6 KiB

/*=========================================================================
Program: Visualization Toolkit
Module: $RCSfile: vtkXMLPPolyDataReader.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 "vtkXMLPPolyDataReader.h"
#include "vtkObjectFactory.h"
#include "vtkXMLDataElement.h"
#include "vtkXMLPolyDataReader.h"
#include "vtkPolyData.h"
#include "vtkUnsignedCharArray.h"
#include "vtkCellArray.h"
#include "vtkInformation.h"
#include "vtkStreamingDemandDrivenPipeline.h"
vtkCxxRevisionMacro(vtkXMLPPolyDataReader, "$Revision: 1.7 $");
vtkStandardNewMacro(vtkXMLPPolyDataReader);
//----------------------------------------------------------------------------
vtkXMLPPolyDataReader::vtkXMLPPolyDataReader()
{
// Copied from vtkPolyDataReader constructor:
vtkPolyData *output = vtkPolyData::New();
this->SetOutput(output);
// Releasing data for pipeline parallism.
// Filters will know it is empty.
output->ReleaseData();
output->Delete();
}
//----------------------------------------------------------------------------
vtkXMLPPolyDataReader::~vtkXMLPPolyDataReader()
{
}
//----------------------------------------------------------------------------
void vtkXMLPPolyDataReader::PrintSelf(ostream& os, vtkIndent indent)
{
this->Superclass::PrintSelf(os, indent);
}
//----------------------------------------------------------------------------
void vtkXMLPPolyDataReader::SetOutput(vtkPolyData *output)
{
this->GetExecutive()->SetOutputData(0, output);
}
//----------------------------------------------------------------------------
vtkPolyData* vtkXMLPPolyDataReader::GetOutput()
{
return this->GetOutput(0);
}
//----------------------------------------------------------------------------
vtkPolyData* vtkXMLPPolyDataReader::GetOutput(int idx)
{
return vtkPolyData::SafeDownCast( this->GetOutputDataObject(idx) );
}
//----------------------------------------------------------------------------
const char* vtkXMLPPolyDataReader::GetDataSetName()
{
return "PPolyData";
}
//----------------------------------------------------------------------------
void vtkXMLPPolyDataReader::GetOutputUpdateExtent(int& piece,
int& numberOfPieces,
int& ghostLevel)
{
this->GetOutput()->GetUpdateExtent(piece, numberOfPieces, ghostLevel);
}
//----------------------------------------------------------------------------
vtkIdType vtkXMLPPolyDataReader::GetNumberOfCellsInPiece(int piece)
{
if(this->PieceReaders[piece])
{
return this->PieceReaders[piece]->GetNumberOfCells();
}
return 0;
}
//----------------------------------------------------------------------------
vtkIdType vtkXMLPPolyDataReader::GetNumberOfVertsInPiece(int piece)
{
if(this->PieceReaders[piece])
{
vtkXMLPolyDataReader* pReader =
static_cast<vtkXMLPolyDataReader*>(this->PieceReaders[piece]);
return pReader->GetNumberOfVerts();
}
return 0;
}
//----------------------------------------------------------------------------
vtkIdType vtkXMLPPolyDataReader::GetNumberOfLinesInPiece(int piece)
{
if(this->PieceReaders[piece])
{
vtkXMLPolyDataReader* pReader =
static_cast<vtkXMLPolyDataReader*>(this->PieceReaders[piece]);
return pReader->GetNumberOfLines();
}
return 0;
}
//----------------------------------------------------------------------------
vtkIdType vtkXMLPPolyDataReader::GetNumberOfStripsInPiece(int piece)
{
if(this->PieceReaders[piece])
{
vtkXMLPolyDataReader* pReader =
static_cast<vtkXMLPolyDataReader*>(this->PieceReaders[piece]);
return pReader->GetNumberOfStrips();
}
return 0;
}
//----------------------------------------------------------------------------
vtkIdType vtkXMLPPolyDataReader::GetNumberOfPolysInPiece(int piece)
{
if(this->PieceReaders[piece])
{
vtkXMLPolyDataReader* pReader =
static_cast<vtkXMLPolyDataReader*>(this->PieceReaders[piece]);
return pReader->GetNumberOfPolys();
}
return 0;
}
//----------------------------------------------------------------------------
void vtkXMLPPolyDataReader::SetupOutputTotals()
{
this->Superclass::SetupOutputTotals();
// Find the total size of the output.
int i;
this->TotalNumberOfCells = 0;
this->TotalNumberOfVerts = 0;
this->TotalNumberOfLines = 0;
this->TotalNumberOfStrips = 0;
this->TotalNumberOfPolys = 0;
for(i=this->StartPiece; i < this->EndPiece; ++i)
{
this->TotalNumberOfCells += this->GetNumberOfCellsInPiece(i);
this->TotalNumberOfVerts += this->GetNumberOfVertsInPiece(i);
this->TotalNumberOfLines += this->GetNumberOfLinesInPiece(i);
this->TotalNumberOfStrips += this->GetNumberOfStripsInPiece(i);
this->TotalNumberOfPolys += this->GetNumberOfPolysInPiece(i);
}
// Data reading will start at the beginning of the output.
this->StartVert = 0;
this->StartLine = 0;
this->StartStrip = 0;
this->StartPoly = 0;
}
//----------------------------------------------------------------------------
void vtkXMLPPolyDataReader::SetupOutputData()
{
this->Superclass::SetupOutputData();
vtkPolyData* output = this->GetOutput();
// Setup the output's cell arrays.
vtkCellArray* outVerts = vtkCellArray::New();
vtkCellArray* outLines = vtkCellArray::New();
vtkCellArray* outStrips = vtkCellArray::New();
vtkCellArray* outPolys = vtkCellArray::New();
output->SetVerts(outVerts);
output->SetLines(outLines);
output->SetStrips(outStrips);
output->SetPolys(outPolys);
outPolys->Delete();
outStrips->Delete();
outLines->Delete();
outVerts->Delete();
}
//----------------------------------------------------------------------------
void vtkXMLPPolyDataReader::SetupNextPiece()
{
this->Superclass::SetupNextPiece();
this->StartVert += this->GetNumberOfVertsInPiece(this->Piece);
this->StartLine += this->GetNumberOfLinesInPiece(this->Piece);
this->StartStrip += this->GetNumberOfStripsInPiece(this->Piece);
this->StartPoly += this->GetNumberOfPolysInPiece(this->Piece);
}
//----------------------------------------------------------------------------
int vtkXMLPPolyDataReader::ReadPieceData()
{
if(!this->Superclass::ReadPieceData()) { return 0; }
vtkPointSet* ips = this->GetPieceInputAsPointSet(this->Piece);
vtkPolyData* input = static_cast<vtkPolyData*>(ips);
vtkPolyData* output = this->GetOutput();
// Copy the Verts.
this->CopyCellArray(this->TotalNumberOfVerts, input->GetVerts(),
output->GetVerts());
// Copy the Lines.
this->CopyCellArray(this->TotalNumberOfLines, input->GetLines(),
output->GetLines());
// Copy the Strips.
this->CopyCellArray(this->TotalNumberOfStrips, input->GetStrips(),
output->GetStrips());
// Copy the Polys.
this->CopyCellArray(this->TotalNumberOfPolys, input->GetPolys(),
output->GetPolys());
return 1;
}
//----------------------------------------------------------------------------
void vtkXMLPPolyDataReader::CopyArrayForCells(vtkDataArray* inArray,
vtkDataArray* outArray)
{
if(!this->PieceReaders[this->Piece])
{
return;
}
if (inArray == NULL || outArray == NULL)
{
return;
}
vtkIdType components = outArray->GetNumberOfComponents();
vtkIdType tupleSize = inArray->GetDataTypeSize()*components;
// Copy the cell data for the Verts in the piece.
vtkIdType inStartCell = 0;
vtkIdType outStartCell = this->StartVert;
vtkIdType numCells = this->GetNumberOfVertsInPiece(this->Piece);
memcpy(outArray->GetVoidPointer(outStartCell*components),
inArray->GetVoidPointer(inStartCell*components), numCells*tupleSize);
// Copy the cell data for the Lines in the piece.
inStartCell += numCells;
outStartCell = this->TotalNumberOfVerts + this->StartLine;
numCells = this->GetNumberOfLinesInPiece(this->Piece);
memcpy(outArray->GetVoidPointer(outStartCell*components),
inArray->GetVoidPointer(inStartCell*components), numCells*tupleSize);
// Copy the cell data for the Strips in the piece.
inStartCell += numCells;
outStartCell = (this->TotalNumberOfVerts + this->TotalNumberOfLines +
this->StartStrip);
numCells = this->GetNumberOfStripsInPiece(this->Piece);
memcpy(outArray->GetVoidPointer(outStartCell*components),
inArray->GetVoidPointer(inStartCell*components), numCells*tupleSize);
// Copy the cell data for the Polys in the piece.
inStartCell += numCells;
outStartCell = (this->TotalNumberOfVerts + this->TotalNumberOfLines +
this->TotalNumberOfStrips + this->StartPoly);
numCells = this->GetNumberOfPolysInPiece(this->Piece);
memcpy(outArray->GetVoidPointer(outStartCell*components),
inArray->GetVoidPointer(inStartCell*components), numCells*tupleSize);
}
//----------------------------------------------------------------------------
vtkXMLDataReader* vtkXMLPPolyDataReader::CreatePieceReader()
{
return vtkXMLPolyDataReader::New();
}
//----------------------------------------------------------------------------
int vtkXMLPPolyDataReader::FillOutputPortInformation(int,
vtkInformation* info)
{
info->Set(vtkDataObject::DATA_TYPE_NAME(), "vtkPolyData");
return 1;
}