You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

444 lines
12 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkGenericEnSightReader.h
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.
=========================================================================*/
/**
* @class vtkGenericEnSightReader
* @brief class to read any type of EnSight files
*
* The class vtkGenericEnSightReader allows the user to read an EnSight data
* set without a priori knowledge of what type of EnSight data set it is.
*/
#ifndef vtkGenericEnSightReader_h
#define vtkGenericEnSightReader_h
#include "vtkIOEnSightModule.h" // For export macro
#include "vtkMultiBlockDataSetAlgorithm.h"
class vtkCallbackCommand;
class vtkDataArrayCollection;
class vtkDataArraySelection;
class vtkIdListCollection;
class TranslationTableType;
// Cell/Point Ids store mode:
// Sparse Mode is supposed to be for a large number of distributed processes (Unstructured)
// Non Sparse Mode is supposed to be for a small number of distributed processes (Unstructured)
// Implicit Mode is for Structured Data
enum EnsightReaderCellIdMode
{
SINGLE_PROCESS_MODE,
SPARSE_MODE,
NON_SPARSE_MODE,
IMPLICIT_STRUCTURED_MODE
};
class VTKIOENSIGHT_EXPORT vtkGenericEnSightReader : public vtkMultiBlockDataSetAlgorithm
{
public:
static vtkGenericEnSightReader* New();
vtkTypeMacro(vtkGenericEnSightReader, vtkMultiBlockDataSetAlgorithm);
void PrintSelf(ostream& os, vtkIndent indent) override;
//@{
/**
* Set/Get the Case file name.
*/
void SetCaseFileName(const char* fileName);
vtkGetStringMacro(CaseFileName);
//@}
//@{
/**
* Set/Get the file path.
*/
vtkSetStringMacro(FilePath);
vtkGetStringMacro(FilePath);
//@}
//@{
/**
* Get the EnSight file version being read.
*/
vtkGetMacro(EnSightVersion, int);
//@}
//@{
/**
* Get the number of variables listed in the case file.
*/
vtkGetMacro(NumberOfVariables, int);
vtkGetMacro(NumberOfComplexVariables, int);
//@}
//@{
/**
* Get the number of variables of a particular type.
*/
int GetNumberOfVariables(int type); // returns -1 if unknown type specified
vtkGetMacro(NumberOfScalarsPerNode, int);
vtkGetMacro(NumberOfVectorsPerNode, int);
vtkGetMacro(NumberOfTensorsSymmPerNode, int);
vtkGetMacro(NumberOfScalarsPerElement, int);
vtkGetMacro(NumberOfVectorsPerElement, int);
vtkGetMacro(NumberOfTensorsSymmPerElement, int);
vtkGetMacro(NumberOfScalarsPerMeasuredNode, int);
vtkGetMacro(NumberOfVectorsPerMeasuredNode, int);
vtkGetMacro(NumberOfComplexScalarsPerNode, int);
vtkGetMacro(NumberOfComplexVectorsPerNode, int);
vtkGetMacro(NumberOfComplexScalarsPerElement, int);
vtkGetMacro(NumberOfComplexVectorsPerElement, int);
//@}
/**
* Get the nth description for a non-complex variable.
*/
const char* GetDescription(int n);
/**
* Get the nth description for a complex variable.
*/
const char* GetComplexDescription(int n);
/**
* Get the nth description of a particular variable type. Returns nullptr if no
* variable of this type exists in this data set.
* SCALAR_PER_NODE = 0; VECTOR_PER_NODE = 1;
* TENSOR_SYMM_PER_NODE = 2; SCALAR_PER_ELEMENT = 3;
* VECTOR_PER_ELEMENT = 4; TENSOR_SYMM_PER_ELEMENT = 5;
* SCALAR_PER_MEASURED_NODE = 6; VECTOR_PER_MEASURED_NODE = 7;
* COMPLEX_SCALAR_PER_NODE = 8; COMPLEX_VECTOR_PER_NODE 9;
* COMPLEX_SCALAR_PER_ELEMENT = 10; COMPLEX_VECTOR_PER_ELEMENT = 11
*/
const char* GetDescription(int n, int type);
//@{
/**
* Get the variable type of variable n.
*/
int GetVariableType(int n);
int GetComplexVariableType(int n);
//@}
//@{
/**
* Set/Get the time value at which to get the value.
*/
virtual void SetTimeValue(float value);
vtkGetMacro(TimeValue, float);
//@}
//@{
/**
* Get the minimum or maximum time value for this data set.
*/
vtkGetMacro(MinimumTimeValue, float);
vtkGetMacro(MaximumTimeValue, float);
//@}
//@{
/**
* Get the time values per time set
*/
vtkGetObjectMacro(TimeSets, vtkDataArrayCollection);
//@}
/**
* Reads the FORMAT part of the case file to determine whether this is an
* EnSight6 or EnSightGold data set. Returns an identifier listed in
* the FileTypes enum or -1 if an error occurred or the file could not
* be identified as any EnSight type.
*/
int DetermineEnSightVersion(int quiet = 0);
//@{
/**
* Set/get the flag for whether to read all the variables
*/
vtkBooleanMacro(ReadAllVariables, vtkTypeBool);
vtkSetMacro(ReadAllVariables, vtkTypeBool);
vtkGetMacro(ReadAllVariables, vtkTypeBool);
//@}
//@{
/**
* Get the data array selection tables used to configure which data
* arrays are loaded by the reader.
*/
vtkGetObjectMacro(PointDataArraySelection, vtkDataArraySelection);
vtkGetObjectMacro(CellDataArraySelection, vtkDataArraySelection);
//@}
//@{
/**
* Get the number of point or cell arrays available in the input.
*/
int GetNumberOfPointArrays();
int GetNumberOfCellArrays();
//@}
//@{
/**
* 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);
//@}
//@{
/**
* 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);
//@}
enum FileTypes
{
ENSIGHT_6 = 0,
ENSIGHT_6_BINARY = 1,
ENSIGHT_GOLD = 2,
ENSIGHT_GOLD_BINARY = 3,
ENSIGHT_MASTER_SERVER = 4
};
//@{
/**
* Set the byte order of the file (remember, more Unix workstations
* write big endian whereas PCs write little endian). Default is
* big endian (since most older PLOT3D files were written by
* workstations).
*/
void SetByteOrderToBigEndian();
void SetByteOrderToLittleEndian();
vtkSetMacro(ByteOrder, int);
vtkGetMacro(ByteOrder, int);
const char* GetByteOrderAsString();
//@}
enum
{
FILE_BIG_ENDIAN = 0,
FILE_LITTLE_ENDIAN = 1,
FILE_UNKNOWN_ENDIAN = 2
};
//@{
/**
* Get the Geometry file name. Made public to allow access from
* apps requiring detailed info about the Data contents
*/
vtkGetStringMacro(GeometryFileName);
//@}
//@{
/**
* The MeasuredGeometryFile should list particle coordinates
* from 0->N-1.
* If a file is loaded where point Ids are listed from 1-N
* the Id to points reference will be wrong and the data
* will be generated incorrectly.
* Setting ParticleCoordinatesByIndex to true will force
* all Id's to increment from 0->N-1 (relative to their order
* in the file) and regardless of the actual Id of the point.
* Warning, if the Points are listed in non sequential order
* then setting this flag will reorder them.
*/
vtkSetMacro(ParticleCoordinatesByIndex, vtkTypeBool);
vtkGetMacro(ParticleCoordinatesByIndex, vtkTypeBool);
vtkBooleanMacro(ParticleCoordinatesByIndex, vtkTypeBool);
//@}
/**
* Returns true if the file pointed to by casefilename appears to be a
* valid EnSight case file.
*/
static bool IsEnSightFile(const char* casefilename);
/**
* Returns IsEnSightFile() by default, but can be overridden
*/
virtual int CanReadFile(const char* casefilename);
// THIB
vtkGenericEnSightReader* GetReader() { return this->Reader; }
protected:
vtkGenericEnSightReader();
~vtkGenericEnSightReader() override;
int FillOutputPortInformation(int port, vtkInformation* info) override;
int RequestInformation(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
int RequestData(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
/**
* Clear data structures such that setting a new case file name works.
* WARNING: Derived classes should call the base version after they clear
* their own structures.
*/
virtual void ClearForNewCaseFileName();
/**
* Internal function to read in a line up to 256 characters.
* Returns zero if there was an error.
*/
int ReadLine(char result[256]);
/**
* Internal function to read up to 80 characters from a binary file.
* Returns zero if there was an error.
*/
int ReadBinaryLine(char result[80]);
// Internal function that skips blank lines and reads the 1st
// non-blank line it finds (up to 256 characters).
// Returns 0 is there was an error.
int ReadNextDataLine(char result[256]);
//@{
/**
* Set the geometry file name.
*/
vtkSetStringMacro(GeometryFileName);
//@}
//@{
/**
* Add a variable description to the appropriate array.
*/
void AddVariableDescription(const char* description);
void AddComplexVariableDescription(const char* description);
//@}
//@{
/**
* Add a variable type to the appropriate array.
*/
void AddVariableType(int variableType);
void AddComplexVariableType(int variableType);
//@}
//@{
/**
* Replace the wildcards in the geometry file name with appropriate filename
* numbers as specified in the time set or file set.
*/
int ReplaceWildcards(char* fileName, int timeSet, int fileSet);
void ReplaceWildcardsHelper(char* fileName, int num);
//@}
// Callback registered with the SelectionObserver.
static void SelectionModifiedCallback(
vtkObject* caller, unsigned long eid, void* clientdata, void* calldata);
void SelectionModified();
// Utility to create argument for vtkDataArraySelection::SetArrays.
char** CreateStringArray(int numStrings);
void DestroyStringArray(int numStrings, char** strings);
// Fill the vtkDataArraySelection objects with the current set of
// EnSight variables.
void SetDataArraySelectionSetsFromVariables();
// Fill the vtkDataArraySelection objects with the current set of
// arrays in the internal EnSight reader.
void SetDataArraySelectionSetsFromReader();
// Fill the internal EnSight reader's vtkDataArraySelection objects
// from those in this object.
void SetReaderDataArraySelectionSetsFromSelf();
istream* IS;
FILE* IFile;
vtkGenericEnSightReader* Reader;
char* CaseFileName;
char* GeometryFileName;
char* FilePath;
// array of types (one entry per instance of variable type in case file)
int* VariableTypes;
int* ComplexVariableTypes;
// pointers to lists of descriptions
char** VariableDescriptions;
char** ComplexVariableDescriptions;
int NumberOfVariables;
int NumberOfComplexVariables;
// number of file names / descriptions per type
int NumberOfScalarsPerNode;
int NumberOfVectorsPerNode;
int NumberOfTensorsSymmPerNode;
int NumberOfScalarsPerElement;
int NumberOfVectorsPerElement;
int NumberOfTensorsSymmPerElement;
int NumberOfScalarsPerMeasuredNode;
int NumberOfVectorsPerMeasuredNode;
int NumberOfComplexScalarsPerNode;
int NumberOfComplexVectorsPerNode;
int NumberOfComplexScalarsPerElement;
int NumberOfComplexVectorsPerElement;
float TimeValue;
float MinimumTimeValue;
float MaximumTimeValue;
// Flag for whether TimeValue has been set.
int TimeValueInitialized;
vtkDataArrayCollection* TimeSets;
virtual void SetTimeSets(vtkDataArrayCollection*);
vtkTypeBool ReadAllVariables;
int ByteOrder;
vtkTypeBool ParticleCoordinatesByIndex;
// The EnSight file version being read. Valid after
// UpdateInformation. Value is -1 for unknown version.
int EnSightVersion;
// The array selections. These map over the variables and complex
// variables to hide the details of EnSight behind VTK terminology.
vtkDataArraySelection* PointDataArraySelection;
vtkDataArraySelection* CellDataArraySelection;
// The observer to modify this object when the array selections are
// modified.
vtkCallbackCommand* SelectionObserver;
// Whether the SelectionModified callback should invoke Modified.
// This is used when we are copying to/from the internal reader.
int SelectionModifiedDoNotCallModified;
// Insert a partId and return the 'realId' that should be used.
int InsertNewPartId(int partId);
// Wrapper around an stl map
TranslationTableType* TranslationTable;
private:
vtkGenericEnSightReader(const vtkGenericEnSightReader&) = delete;
void operator=(const vtkGenericEnSightReader&) = delete;
};
#endif