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.
188 lines
7.1 KiB
188 lines
7.1 KiB
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: $RCSfile: vtkParticleReader.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 vtkParticleReader - Read ASCII or binary particle
|
|
// data and (optionally) one scalar
|
|
// value associated with each particle.
|
|
// .SECTION Description
|
|
// vtkParticleReader reads either a binary or a text file of
|
|
// particles. Each particle can have associated with it an optional
|
|
// scalar value. So the format is: x, y, z, scalar
|
|
// (all floats or doubles). The text file can consist of a comma
|
|
// delimited set of values. In most cases vtkParticleReader can
|
|
// automatically determine whether the file is text or binary.
|
|
// The data can be either float or double.
|
|
// Progress updates are provided.
|
|
// With respect to binary files, random access into the file to read
|
|
// pieces is supported.
|
|
//
|
|
|
|
#ifndef __vtkParticleReader_h
|
|
#define __vtkParticleReader_h
|
|
|
|
#include "vtkPolyDataAlgorithm.h"
|
|
|
|
#define VTK_FILE_BYTE_ORDER_BIG_ENDIAN 0
|
|
#define VTK_FILE_BYTE_ORDER_LITTLE_ENDIAN 1
|
|
|
|
|
|
class VTK_IO_EXPORT vtkParticleReader : public vtkPolyDataAlgorithm
|
|
{
|
|
public:
|
|
static vtkParticleReader *New();
|
|
vtkTypeRevisionMacro(vtkParticleReader,vtkPolyDataAlgorithm);
|
|
void PrintSelf(ostream& os, vtkIndent indent);
|
|
|
|
// Description:
|
|
// Specify file name.
|
|
vtkSetStringMacro(FileName);
|
|
vtkGetStringMacro(FileName);
|
|
|
|
// Description:
|
|
// These methods should be used instead of the SwapBytes methods.
|
|
// They indicate the byte ordering of the file you are trying
|
|
// to read in. These methods will then either swap or not swap
|
|
// the bytes depending on the byte ordering of the machine it is
|
|
// being run on. For example, reading in a BigEndian file on a
|
|
// BigEndian machine will result in no swapping. Trying to read
|
|
// the same file on a LittleEndian machine will result in swapping.
|
|
// As a quick note most UNIX machines are BigEndian while PC's
|
|
// and VAX tend to be LittleEndian. So if the file you are reading
|
|
// in was generated on a VAX or PC, SetDataByteOrderToLittleEndian
|
|
// otherwise SetDataByteOrderToBigEndian. Not used when reading
|
|
// text files.
|
|
void SetDataByteOrderToBigEndian();
|
|
void SetDataByteOrderToLittleEndian();
|
|
int GetDataByteOrder();
|
|
void SetDataByteOrder(int);
|
|
const char *GetDataByteOrderAsString();
|
|
|
|
// Description:
|
|
// Set/Get the byte swapping to explicitly swap the bytes of a file.
|
|
// Not used when reading text files.
|
|
vtkSetMacro(SwapBytes,int);
|
|
int GetSwapBytes() {return this->SwapBytes;}
|
|
vtkBooleanMacro(SwapBytes,int);
|
|
|
|
// Description:
|
|
// Default: 1. If 1 then each particle has a value associated with it.
|
|
vtkSetMacro(HasScalar,int);
|
|
vtkGetMacro(HasScalar,int);
|
|
vtkBooleanMacro(HasScalar,int);
|
|
|
|
// Description:
|
|
// Get/Set the file type. The options are:
|
|
// - FILE_TYPE_IS_UNKNOWN (default) the class
|
|
// will attempt to determine the file type.
|
|
// If this fails then you should set the file type
|
|
// yourself.
|
|
// - FILE_TYPE_IS_TEXT the file type is text.
|
|
// - FILE_TYPE_IS_BINARY the file type is binary.
|
|
vtkSetClampMacro(FileType, int, FILE_TYPE_IS_UNKNOWN, FILE_TYPE_IS_BINARY);
|
|
vtkGetMacro(FileType, int);
|
|
void SetFileTypeToUnknown() {this->SetFileType(FILE_TYPE_IS_UNKNOWN);}
|
|
void SetFileTypeToText() {this->SetFileType(FILE_TYPE_IS_TEXT);}
|
|
void SetFileTypeToBinary() {this->SetFileType(FILE_TYPE_IS_BINARY);}
|
|
|
|
// Description:
|
|
// Get/Set the data type. The options are:
|
|
// - VTK_FLOAT (default) single precision floating point.
|
|
// - VTK_DOUBLE double precision floating point.
|
|
vtkSetClampMacro(DataType, int, VTK_FLOAT, VTK_DOUBLE);
|
|
vtkGetMacro(DataType, int);
|
|
void SetDataTypeToFloat() {this->SetDataType(VTK_FLOAT);}
|
|
void SetDataTypeToDouble() {this->SetDataType(VTK_DOUBLE);}
|
|
|
|
|
|
protected:
|
|
vtkParticleReader();
|
|
~vtkParticleReader();
|
|
|
|
void OpenFile();
|
|
|
|
char *FileName;
|
|
ifstream *File;
|
|
|
|
int RequestInformation(vtkInformation *, vtkInformationVector **, vtkInformationVector *);
|
|
int RequestData(vtkInformation *, vtkInformationVector **, vtkInformationVector *);
|
|
|
|
// Description:
|
|
// The format that will be read if the file is a text file is:
|
|
// x, y, z, s (where s is some scalar value associated with the particle).
|
|
// Each line corresponding to a particle is terminated with a line feed.
|
|
// If y, z, or s is missing, zero is substituted for them.
|
|
// Comment lines in the file are handled as follows:
|
|
// 1) Any line containing "\/\/" "\#" "\%" anywhere in the line is discarded.
|
|
// 2) Lines containing "\/\*" are discarded until a "\*\/" is found. The line
|
|
// following the "\*\/" will be read.
|
|
int ProduceOutputFromTextFileDouble(vtkInformationVector *outputVector);
|
|
int ProduceOutputFromTextFileFloat(vtkInformationVector *outputVector);
|
|
|
|
// Description:
|
|
// This reader assumes that the file is binary and consists of floating
|
|
// point values by default.
|
|
int ProduceOutputFromBinaryFileDouble(vtkInformationVector *outputVector);
|
|
int ProduceOutputFromBinaryFileFloat(vtkInformationVector *outputVector);
|
|
|
|
// Description:
|
|
// Determine the type of file based on an analysis of its contents.
|
|
// Up to 5000 bytes of the file are read and classified. The classification
|
|
// of a file as either binary or text is based on the proportions of bytes in
|
|
// various classifications. The classification of the file is not infallible
|
|
// but should work correctly most of the time. If it fails, use SetFileTypeToText()
|
|
// or SetFileTypeToBinary() to set the file type.
|
|
// This algorithm probably only identifies ASCII text correctly and will not
|
|
// work for UTF-8 UCS-2 (or UTF-16) or UCS-4 or EBCIDIC.
|
|
int DetermineFileType();
|
|
|
|
// Description:
|
|
// Update of the progress.
|
|
void DoProgressUpdate( size_t & bytesRead, size_t & fileLength );
|
|
|
|
//BTX
|
|
// Description:
|
|
// Enumerate the supported file types.
|
|
// <pre>
|
|
// - FILE_TYPE_IS_UNKNOWN, (default) the class will attempt to determine the file type.
|
|
// - FILE_TYPE_IS_TEXT, the file type is text.
|
|
// - FILE_TYPE_IS_BINARY, the file type is binary.
|
|
// </pre>
|
|
enum FILE_TYPE { FILE_TYPE_IS_UNKNOWN = 0,
|
|
FILE_TYPE_IS_TEXT, FILE_TYPE_IS_BINARY };
|
|
//ETX
|
|
|
|
int HasScalar;
|
|
// Description:
|
|
// Used to decide which reader should be used.
|
|
int FileType;
|
|
// Description:
|
|
// Used to specify the data type.
|
|
int DataType;
|
|
|
|
// Description:
|
|
// Set an alliquot of bytes.
|
|
size_t Alliquot;
|
|
// Description:
|
|
// Count of the number of alliquots processed.
|
|
size_t Count;
|
|
|
|
int SwapBytes;
|
|
size_t NumberOfPoints;
|
|
|
|
private:
|
|
vtkParticleReader(const vtkParticleReader&); // Not implemented.
|
|
void operator=(const vtkParticleReader&); // Not implemented.
|
|
};
|
|
|
|
#endif
|
|
|