VTK
dox/IO/vtkGenericEnSightReader.h
Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   Visualization Toolkit
00004   Module:    vtkGenericEnSightReader.h
00005 
00006   Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
00007   All rights reserved.
00008   See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
00009 
00010      This software is distributed WITHOUT ANY WARRANTY; without even
00011      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
00012      PURPOSE.  See the above copyright notice for more information.
00013 
00014 =========================================================================*/
00025 #ifndef __vtkGenericEnSightReader_h
00026 #define __vtkGenericEnSightReader_h
00027 
00028 #include "vtkMultiBlockDataSetAlgorithm.h"
00029 
00030 class vtkCallbackCommand;
00031 class vtkDataArrayCollection;
00032 class vtkDataArraySelection;
00033 class vtkIdListCollection;
00034 
00035 //BTX
00036 class TranslationTableType;
00037 //ETX
00038 
00039 //BTX
00040 // Cell/Point Ids store mode:
00041 // Sparse Mode is supposed to be for a large number of distributed processes (Unstructured)
00042 // Non Sparse Mode is supposed to be for a small number of distributed processes (Unstructured)
00043 // Implicit Mode is for Structured Data
00044 enum EnsightReaderCellIdMode
00045     {
00046     SINGLE_PROCESS_MODE,
00047     SPARSE_MODE,
00048     NON_SPARSE_MODE,
00049     IMPLICIT_STRUCTURED_MODE
00050     };
00051 //ETX
00052 
00053 class VTK_IO_EXPORT vtkGenericEnSightReader : public vtkMultiBlockDataSetAlgorithm
00054 {
00055 public:
00056   static vtkGenericEnSightReader *New();
00057   vtkTypeMacro(vtkGenericEnSightReader, vtkMultiBlockDataSetAlgorithm);
00058   void PrintSelf(ostream& os, vtkIndent indent);
00059 
00061 
00062   void SetCaseFileName(const char* fileName);
00063   vtkGetStringMacro(CaseFileName);
00065 
00067 
00068   vtkSetStringMacro(FilePath);
00069   vtkGetStringMacro(FilePath);
00071 
00073 
00074   vtkGetMacro(EnSightVersion, int);
00076 
00078 
00079   vtkGetMacro(NumberOfVariables, int);
00080   vtkGetMacro(NumberOfComplexVariables, int);
00082 
00084 
00085   int GetNumberOfVariables(int type); // returns -1 if unknown type specified
00086   vtkGetMacro(NumberOfScalarsPerNode, int);
00087   vtkGetMacro(NumberOfVectorsPerNode, int);
00088   vtkGetMacro(NumberOfTensorsSymmPerNode, int);
00089   vtkGetMacro(NumberOfScalarsPerElement, int);
00090   vtkGetMacro(NumberOfVectorsPerElement, int);
00091   vtkGetMacro(NumberOfTensorsSymmPerElement, int);
00092   vtkGetMacro(NumberOfScalarsPerMeasuredNode, int);
00093   vtkGetMacro(NumberOfVectorsPerMeasuredNode, int);
00094   vtkGetMacro(NumberOfComplexScalarsPerNode, int);
00095   vtkGetMacro(NumberOfComplexVectorsPerNode, int);
00096   vtkGetMacro(NumberOfComplexScalarsPerElement, int);
00097   vtkGetMacro(NumberOfComplexVectorsPerElement, int);
00099 
00101   const char* GetDescription(int n);
00102 
00104   const char* GetComplexDescription(int n);
00105 
00114   const char* GetDescription(int n, int type);
00115 
00117 
00118   int GetVariableType(int n);
00119   int GetComplexVariableType(int n);
00121 
00123 
00124   virtual void SetTimeValue(float value);
00125   vtkGetMacro(TimeValue, float);
00127 
00129 
00130   vtkGetMacro(MinimumTimeValue, float);
00131   vtkGetMacro(MaximumTimeValue, float);
00133 
00135 
00136   vtkGetObjectMacro(TimeSets, vtkDataArrayCollection);
00138 
00143   int DetermineEnSightVersion(int quiet=0);
00144 
00146 
00147   vtkBooleanMacro(ReadAllVariables, int);
00148   vtkSetMacro(ReadAllVariables, int);
00149   vtkGetMacro(ReadAllVariables, int);
00151 
00153 
00155   vtkGetObjectMacro(PointDataArraySelection, vtkDataArraySelection);
00156   vtkGetObjectMacro(CellDataArraySelection, vtkDataArraySelection);
00158 
00160 
00161   int GetNumberOfPointArrays();
00162   int GetNumberOfCellArrays();
00164 
00166 
00168   const char* GetPointArrayName(int index);
00169   const char* GetCellArrayName(int index);
00171 
00173 
00175   int GetPointArrayStatus(const char* name);
00176   int GetCellArrayStatus(const char* name);
00177   void SetPointArrayStatus(const char* name, int status);
00178   void SetCellArrayStatus(const char* name, int status);
00180 
00181   //BTX
00182   enum FileTypes
00183   {
00184     ENSIGHT_6             = 0,
00185     ENSIGHT_6_BINARY      = 1,
00186     ENSIGHT_GOLD          = 2,
00187     ENSIGHT_GOLD_BINARY   = 3,
00188     ENSIGHT_MASTER_SERVER = 4
00189   };
00190   //ETX
00191 
00193 
00196   void SetByteOrderToBigEndian();
00197   void SetByteOrderToLittleEndian();
00198   vtkSetMacro(ByteOrder, int);
00199   vtkGetMacro(ByteOrder, int);
00200   const char *GetByteOrderAsString();
00202 
00203 //BTX
00204   enum
00205   {
00206     FILE_BIG_ENDIAN=0,
00207     FILE_LITTLE_ENDIAN=1,
00208     FILE_UNKNOWN_ENDIAN=2
00209   };
00210 //ETX
00211 
00213 
00215   vtkGetStringMacro(GeometryFileName);
00217 
00219 
00227   vtkSetMacro(ParticleCoordinatesByIndex, int);
00228   vtkGetMacro(ParticleCoordinatesByIndex, int);
00229   vtkBooleanMacro(ParticleCoordinatesByIndex, int);
00231 
00234   static int CanReadFile(const char *casefilename);
00235 
00236 //THIB
00237 vtkGenericEnSightReader* GetReader() { return this->Reader; }
00238 
00239 
00240 protected:
00241   vtkGenericEnSightReader();
00242   ~vtkGenericEnSightReader();
00243 
00244   virtual int FillOutputPortInformation(int port, vtkInformation* info);
00245   virtual int RequestInformation(vtkInformation*,
00246                                  vtkInformationVector**,
00247                                  vtkInformationVector*);
00248   virtual int RequestData(vtkInformation*,
00249                           vtkInformationVector**,
00250                           vtkInformationVector*);
00251 
00254   int ReadLine(char result[256]);
00255 
00258   int ReadBinaryLine(char result[80]);
00259 
00260   // Internal function that skips blank lines and reads the 1st
00261   // non-blank line it finds (up to 256 characters).
00262   // Returns 0 is there was an error.
00263   int ReadNextDataLine(char result[256]);
00264 
00266 
00267   vtkSetStringMacro(GeometryFileName);
00269 
00271 
00272   void AddVariableDescription(const char* description);
00273   void AddComplexVariableDescription(const char* description);
00275 
00277 
00278   void AddVariableType(int variableType);
00279   void AddComplexVariableType(int variableType);
00281 
00283 
00285   int  ReplaceWildcards(char* fileName, int timeSet, int fileSet);
00286   void ReplaceWildcardsHelper(char* fileName, int num);
00288 
00289   // Callback registered with the SelectionObserver.
00290   static void SelectionModifiedCallback(vtkObject* caller, unsigned long eid,
00291                                         void* clientdata, void* calldata);
00292   void SelectionModified();
00293 
00294   // Utility to create argument for vtkDataArraySelection::SetArrays.
00295   char** CreateStringArray(int numStrings);
00296   void DestroyStringArray(int numStrings, char** strings);
00297 
00298   // Fill the vtkDataArraySelection objects with the current set of
00299   // EnSight variables.
00300   void SetDataArraySelectionSetsFromVariables();
00301 
00302   // Fill the vtkDataArraySelection objects with the current set of
00303   // arrays in the internal EnSight reader.
00304   void SetDataArraySelectionSetsFromReader();
00305 
00306   // Fill the internal EnSight reader's vtkDataArraySelection objects
00307   // from those in this object.
00308   void SetReaderDataArraySelectionSetsFromSelf();
00309 
00310   istream* IS;
00311   FILE *IFile;
00312   vtkGenericEnSightReader *Reader;
00313 
00314   char* CaseFileName;
00315   char* GeometryFileName;
00316   char* FilePath;
00317 
00318   // array of types (one entry per instance of variable type in case file)
00319   int* VariableTypes;
00320   int* ComplexVariableTypes;
00321 
00322   // pointers to lists of descriptions
00323   char** VariableDescriptions;
00324   char** ComplexVariableDescriptions;
00325 
00326   int NumberOfVariables;
00327   int NumberOfComplexVariables;
00328 
00329   // number of file names / descriptions per type
00330   int NumberOfScalarsPerNode;
00331   int NumberOfVectorsPerNode;
00332   int NumberOfTensorsSymmPerNode;
00333   int NumberOfScalarsPerElement;
00334   int NumberOfVectorsPerElement;
00335   int NumberOfTensorsSymmPerElement;
00336   int NumberOfScalarsPerMeasuredNode;
00337   int NumberOfVectorsPerMeasuredNode;
00338   int NumberOfComplexScalarsPerNode;
00339   int NumberOfComplexVectorsPerNode;
00340   int NumberOfComplexScalarsPerElement;
00341   int NumberOfComplexVectorsPerElement;
00342 
00343   float TimeValue;
00344   float MinimumTimeValue;
00345   float MaximumTimeValue;
00346 
00347   // Flag for whether TimeValue has been set.
00348   int TimeValueInitialized;
00349 
00350   vtkDataArrayCollection *TimeSets;
00351   virtual void SetTimeSets(vtkDataArrayCollection*);
00352 
00353   int ReadAllVariables;
00354 
00355   int ByteOrder;
00356   int ParticleCoordinatesByIndex;
00357 
00358   // The EnSight file version being read.  Valid after
00359   // UpdateInformation.  Value is -1 for unknown version.
00360   int EnSightVersion;
00361 
00362   // The array selections.  These map over the variables and complex
00363   // variables to hide the details of EnSight behind VTK terminology.
00364   vtkDataArraySelection* PointDataArraySelection;
00365   vtkDataArraySelection* CellDataArraySelection;
00366 
00367   // The observer to modify this object when the array selections are
00368   // modified.
00369   vtkCallbackCommand* SelectionObserver;
00370 
00371   // Whether the SelectionModified callback should invoke Modified.
00372   // This is used when we are copying to/from the internal reader.
00373   int SelectionModifiedDoNotCallModified;
00374 
00375   // Insert a partId and return the 'realId' that should be used.
00376   int InsertNewPartId(int partId);
00377 
00378   // Wrapper around an stl map
00379   TranslationTableType *TranslationTable;
00380 
00381 private:
00382   vtkGenericEnSightReader(const vtkGenericEnSightReader&);  // Not implemented.
00383   void operator=(const vtkGenericEnSightReader&);  // Not implemented.
00384 };
00385 
00386 #endif