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.
265 lines
9.3 KiB
265 lines
9.3 KiB
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: $RCSfile: vtkXMLReader.h,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.
|
|
|
|
=========================================================================*/
|
|
// .NAME vtkXMLReader - Superclass for VTK's XML format readers.
|
|
// .SECTION Description
|
|
// vtkXMLReader uses vtkXMLDataParser to parse a VTK XML input file.
|
|
// Concrete subclasses then traverse the parsed file structure and
|
|
// extract data.
|
|
|
|
#ifndef __vtkXMLReader_h
|
|
#define __vtkXMLReader_h
|
|
|
|
#include "vtkAlgorithm.h"
|
|
|
|
class vtkCallbackCommand;
|
|
class vtkDataArray;
|
|
class vtkDataArraySelection;
|
|
class vtkDataSet;
|
|
class vtkDataSetAttributes;
|
|
class vtkXMLDataElement;
|
|
class vtkXMLDataParser;
|
|
class vtkInformationVector;
|
|
|
|
class VTK_IO_EXPORT vtkXMLReader : public vtkAlgorithm
|
|
{
|
|
public:
|
|
vtkTypeRevisionMacro(vtkXMLReader,vtkAlgorithm);
|
|
void PrintSelf(ostream& os, vtkIndent indent);
|
|
|
|
// Description:
|
|
// Get/Set the name of the input file.
|
|
vtkSetStringMacro(FileName);
|
|
vtkGetStringMacro(FileName);
|
|
|
|
// Description:
|
|
// Test whether the file with the given name can be read by this
|
|
// reader.
|
|
virtual int CanReadFile(const char* name);
|
|
|
|
// Description:
|
|
// Get the output as a vtkDataSet pointer.
|
|
vtkDataSet* GetOutputAsDataSet();
|
|
vtkDataSet* GetOutputAsDataSet(int index);
|
|
|
|
// Description:
|
|
// Get the data array selection tables used to configure which data
|
|
// arrays are loaded by the reader.
|
|
vtkGetObjectMacro(PointDataArraySelection, vtkDataArraySelection);
|
|
vtkGetObjectMacro(CellDataArraySelection, vtkDataArraySelection);
|
|
|
|
// Description:
|
|
// Get the number of point or cell arrays available in the input.
|
|
int GetNumberOfPointArrays();
|
|
int GetNumberOfCellArrays();
|
|
|
|
// Description:
|
|
// Get the name of the point or cell array with the given index in
|
|
// the input.
|
|
const char* GetPointArrayName(int index);
|
|
const char* GetCellArrayName(int index);
|
|
|
|
// Description:
|
|
// Get/Set whether the point or cell array with the given name is to
|
|
// be read.
|
|
int GetPointArrayStatus(const char* name);
|
|
int GetCellArrayStatus(const char* name);
|
|
void SetPointArrayStatus(const char* name, int status);
|
|
void SetCellArrayStatus(const char* name, int status);
|
|
|
|
// For the specified port, copy the information this reader sets up in
|
|
// SetupOutputInformation to outInfo
|
|
virtual void CopyOutputInformation(vtkInformation *vtkNotUsed(outInfo),
|
|
int vtkNotUsed(port)) {}
|
|
|
|
// Description:
|
|
// Which TimeStep to read.
|
|
vtkSetMacro(TimeStep, int);
|
|
vtkGetMacro(TimeStep, int);
|
|
|
|
vtkGetMacro(NumberOfTimeSteps, int);
|
|
// Description:
|
|
// Which TimeStepRange to read
|
|
vtkGetVector2Macro(TimeStepRange, int);
|
|
vtkSetVector2Macro(TimeStepRange, int);
|
|
|
|
protected:
|
|
vtkXMLReader();
|
|
~vtkXMLReader();
|
|
|
|
// Pipeline execution methods to be defined by subclass. Called by
|
|
// corresponding RequestData methods after appropriate setup has been
|
|
// done.
|
|
virtual int ReadXMLInformation();
|
|
virtual void ReadXMLData();
|
|
|
|
// Get the name of the data set being read.
|
|
virtual const char* GetDataSetName()=0;
|
|
|
|
// Test if the reader can read a file with the given version number.
|
|
virtual int CanReadFileVersion(int major, int minor);
|
|
|
|
// Setup the output with no data available. Used in error cases.
|
|
virtual void SetupEmptyOutput()=0;
|
|
|
|
// Setup the output's information.
|
|
virtual void SetupOutputInformation(vtkInformation *vtkNotUsed(outInfo)) {}
|
|
|
|
// Setup the output's data with allocation.
|
|
virtual void SetupOutputData();
|
|
|
|
// Read the primary element from the file. This is the element
|
|
// whose name is the value returned by GetDataSetName().
|
|
virtual int ReadPrimaryElement(vtkXMLDataElement* ePrimary);
|
|
|
|
// Read the top-level element from the file. This is always the
|
|
// VTKFile element.
|
|
int ReadVTKFile(vtkXMLDataElement* eVTKFile);
|
|
|
|
// Create a vtkDataArray from its cooresponding XML representation.
|
|
// Does not allocate.
|
|
vtkDataArray* CreateDataArray(vtkXMLDataElement* da);
|
|
|
|
// Internal utility methods.
|
|
int OpenVTKFile();
|
|
void CloseVTKFile();
|
|
virtual void CreateXMLParser();
|
|
virtual void DestroyXMLParser();
|
|
void SetupCompressor(const char* type);
|
|
int CanReadFileVersionString(const char* version);
|
|
|
|
// Utility methods for subclasses.
|
|
int IntersectExtents(int* extent1, int* extent2, int* result);
|
|
int Min(int a, int b);
|
|
int Max(int a, int b);
|
|
void ComputePointDimensions(int* extent, int* dimensions);
|
|
void ComputePointIncrements(int* extent, vtkIdType* increments);
|
|
void ComputeCellDimensions(int* extent, int* dimensions);
|
|
void ComputeCellIncrements(int* extent, vtkIdType* increments);
|
|
vtkIdType GetStartTuple(int* extent, vtkIdType* increments,
|
|
int i, int j, int k);
|
|
void ReadAttributeIndices(vtkXMLDataElement* eDSA,
|
|
vtkDataSetAttributes* dsa);
|
|
char** CreateStringArray(int numStrings);
|
|
void DestroyStringArray(int numStrings, char** strings);
|
|
|
|
// Setup the data array selections for the input's set of arrays.
|
|
void SetDataArraySelections(vtkXMLDataElement* eDSA,
|
|
vtkDataArraySelection* sel);
|
|
|
|
//BTX
|
|
int SetFieldDataInfo(vtkXMLDataElement *eDSA, int association,
|
|
int numTuples, vtkInformationVector *(&infoVector));
|
|
//ETX
|
|
|
|
// Check whether the given array element is an enabled array.
|
|
int PointDataArrayIsEnabled(vtkXMLDataElement* ePDA);
|
|
int CellDataArrayIsEnabled(vtkXMLDataElement* eCDA);
|
|
|
|
// Callback registered with the SelectionObserver.
|
|
static void SelectionModifiedCallback(vtkObject* caller, unsigned long eid,
|
|
void* clientdata, void* calldata);
|
|
|
|
// The vtkXMLDataParser instance used to hide XML reading details.
|
|
vtkXMLDataParser* XMLParser;
|
|
|
|
// The FieldData element representation.
|
|
vtkXMLDataElement* FieldDataElement;
|
|
|
|
// The input file's name.
|
|
char* FileName;
|
|
|
|
// The stream used to read the input.
|
|
istream* Stream;
|
|
|
|
// The array selections.
|
|
vtkDataArraySelection* PointDataArraySelection;
|
|
vtkDataArraySelection* CellDataArraySelection;
|
|
|
|
// The observer to modify this object when the array selections are
|
|
// modified.
|
|
vtkCallbackCommand* SelectionObserver;
|
|
|
|
// Whether there was an error reading the file in RequestInformation.
|
|
int InformationError;
|
|
|
|
// Whether there was an error reading the file in RequestData.
|
|
int DataError;
|
|
|
|
// The index of the output on which ExecuteData is currently
|
|
// running.
|
|
int CurrentOutput;
|
|
|
|
// The current range over which progress is moving. This allows for
|
|
// incrementally fine-tuned progress updates.
|
|
virtual void GetProgressRange(float* range);
|
|
virtual void SetProgressRange(float* range, int curStep, int numSteps);
|
|
virtual void SetProgressRange(float* range, int curStep, float* fractions);
|
|
virtual void UpdateProgressDiscrete(float progress);
|
|
float ProgressRange[2];
|
|
|
|
virtual int ProcessRequest(vtkInformation *request,
|
|
vtkInformationVector **inputVector,
|
|
vtkInformationVector *outputVector);
|
|
virtual int RequestData(vtkInformation *request,
|
|
vtkInformationVector **inputVector,
|
|
vtkInformationVector *outputVector);
|
|
virtual int RequestDataObject(vtkInformation *vtkNotUsed(request),
|
|
vtkInformationVector **vtkNotUsed(inputVector),
|
|
vtkInformationVector *vtkNotUsed(outputVector))
|
|
{ return 1; }
|
|
virtual int RequestInformation(vtkInformation *request,
|
|
vtkInformationVector **inputVector,
|
|
vtkInformationVector *outputVector);
|
|
|
|
vtkTimeStamp ReadMTime;
|
|
|
|
// Whether there was an error reading the XML.
|
|
int ReadError;
|
|
|
|
// For structured data keep track of dimensions empty of cells. For
|
|
// unstructured data these are always zero. This is used to support
|
|
// 1-D and 2-D cell data.
|
|
int AxesEmpty[3];
|
|
|
|
// The timestep currently being read.
|
|
int TimeStep;
|
|
int CurrentTimeStep;
|
|
int NumberOfTimeSteps;
|
|
void SetNumberOfTimeSteps(int num);
|
|
// buffer for reading timestep from the XML file the lenght is of
|
|
// NumberOfTimeSteps and therefore is always long enough
|
|
int *TimeSteps;
|
|
// Store the range of time steps
|
|
int TimeStepRange[2];
|
|
|
|
// Now we need to save what was the last time read for each kind of
|
|
// data to avoid rereading it that is to say we need a var for
|
|
// e.g. PointData/CellData/Points/Cells...
|
|
// See SubClass for details with member vars like PointsTimeStep/PointsOffset
|
|
|
|
// Helper function usefull to know if a timestep is found in an array of timestep
|
|
static int IsTimeStepInArray(int timestep, int* timesteps, int length);
|
|
|
|
private:
|
|
// The stream used to read the input if it is in a file.
|
|
ifstream* FileStream;
|
|
int TimeStepWasReadOnce;
|
|
|
|
private:
|
|
vtkXMLReader(const vtkXMLReader&); // Not implemented.
|
|
void operator=(const vtkXMLReader&); // Not implemented.
|
|
};
|
|
|
|
#endif
|
|
|