00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00023 #ifndef __vtkXMLReader_h
00024 #define __vtkXMLReader_h
00025
00026 #include "vtkAlgorithm.h"
00027
00028 class vtkAbstractArray;
00029 class vtkCallbackCommand;
00030 class vtkDataArraySelection;
00031 class vtkDataSet;
00032 class vtkDataSetAttributes;
00033 class vtkXMLDataElement;
00034 class vtkXMLDataParser;
00035 class vtkInformationVector;
00036
00037 class VTK_IO_EXPORT vtkXMLReader : public vtkAlgorithm
00038 {
00039 public:
00040 vtkTypeRevisionMacro(vtkXMLReader,vtkAlgorithm);
00041 void PrintSelf(ostream& os, vtkIndent indent);
00042
00044
00045 vtkSetStringMacro(FileName);
00046 vtkGetStringMacro(FileName);
00048
00050 virtual int CanReadFile(const char* name);
00051
00053
00054 vtkDataSet* GetOutputAsDataSet();
00055 vtkDataSet* GetOutputAsDataSet(int index);
00057
00059
00061 vtkGetObjectMacro(PointDataArraySelection, vtkDataArraySelection);
00062 vtkGetObjectMacro(CellDataArraySelection, vtkDataArraySelection);
00064
00066
00067 int GetNumberOfPointArrays();
00068 int GetNumberOfCellArrays();
00070
00072
00074 const char* GetPointArrayName(int index);
00075 const char* GetCellArrayName(int index);
00077
00079
00081 int GetPointArrayStatus(const char* name);
00082 int GetCellArrayStatus(const char* name);
00083 void SetPointArrayStatus(const char* name, int status);
00084 void SetCellArrayStatus(const char* name, int status);
00086
00087
00088
00089 virtual void CopyOutputInformation(vtkInformation *vtkNotUsed(outInfo),
00090 int vtkNotUsed(port)) {}
00091
00093
00094 vtkSetMacro(TimeStep, int);
00095 vtkGetMacro(TimeStep, int);
00097
00098 vtkGetMacro(NumberOfTimeSteps, int);
00100
00101 vtkGetVector2Macro(TimeStepRange, int);
00102 vtkSetVector2Macro(TimeStepRange, int);
00104
00105 protected:
00106 vtkXMLReader();
00107 ~vtkXMLReader();
00108
00109
00110
00111
00112 virtual int ReadXMLInformation();
00113 virtual void ReadXMLData();
00114
00115
00116 virtual const char* GetDataSetName()=0;
00117
00118
00119 virtual int CanReadFileVersion(int major, int minor);
00120
00121
00122 virtual void SetupEmptyOutput()=0;
00123
00124
00125 virtual void SetupOutputInformation(vtkInformation *vtkNotUsed(outInfo)) {}
00126
00127
00128 virtual void SetupUpdateExtentInformation
00129 (vtkInformation *vtkNotUsed(outInfo)) {}
00130
00131
00132 virtual void SetupOutputData();
00133
00134
00135
00136 virtual int ReadPrimaryElement(vtkXMLDataElement* ePrimary);
00137
00138
00139
00140 int ReadVTKFile(vtkXMLDataElement* eVTKFile);
00141
00142
00143
00144 vtkAbstractArray* CreateArray(vtkXMLDataElement* da);
00145
00146
00147 virtual int OpenVTKFile();
00148 virtual void CloseVTKFile();
00149 virtual void CreateXMLParser();
00150 virtual void DestroyXMLParser();
00151 void SetupCompressor(const char* type);
00152 int CanReadFileVersionString(const char* version);
00153
00154
00155 vtkGetMacro(FileMajorVersion, int);
00156
00157
00158 vtkGetMacro(FileMinorVersion, int);
00159
00160
00161 int IntersectExtents(int* extent1, int* extent2, int* result);
00162 int Min(int a, int b);
00163 int Max(int a, int b);
00164 void ComputePointDimensions(int* extent, int* dimensions);
00165 void ComputePointIncrements(int* extent, vtkIdType* increments);
00166 void ComputeCellDimensions(int* extent, int* dimensions);
00167 void ComputeCellIncrements(int* extent, vtkIdType* increments);
00168 vtkIdType GetStartTuple(int* extent, vtkIdType* increments,
00169 int i, int j, int k);
00170 void ReadAttributeIndices(vtkXMLDataElement* eDSA,
00171 vtkDataSetAttributes* dsa);
00172 char** CreateStringArray(int numStrings);
00173 void DestroyStringArray(int numStrings, char** strings);
00174
00175
00176 void SetDataArraySelections(vtkXMLDataElement* eDSA,
00177 vtkDataArraySelection* sel);
00178
00179
00180 int SetFieldDataInfo(vtkXMLDataElement *eDSA, int association,
00181 int numTuples, vtkInformationVector *(&infoVector));
00182
00183
00184
00185 int PointDataArrayIsEnabled(vtkXMLDataElement* ePDA);
00186 int CellDataArrayIsEnabled(vtkXMLDataElement* eCDA);
00187
00188
00189 static void SelectionModifiedCallback(vtkObject* caller, unsigned long eid,
00190 void* clientdata, void* calldata);
00191
00192
00193 vtkXMLDataParser* XMLParser;
00194
00195
00196 vtkXMLDataElement* FieldDataElement;
00197
00198
00199 char* FileName;
00200
00201
00202 istream* Stream;
00203
00204
00205 vtkDataArraySelection* PointDataArraySelection;
00206 vtkDataArraySelection* CellDataArraySelection;
00207
00208
00209
00210 vtkCallbackCommand* SelectionObserver;
00211
00212
00213 int InformationError;
00214
00215
00216 int DataError;
00217
00218
00219
00220 int CurrentOutput;
00221
00222
00223
00224 virtual void GetProgressRange(float* range);
00225 virtual void SetProgressRange(float* range, int curStep, int numSteps);
00226 virtual void SetProgressRange(float* range, int curStep, float* fractions);
00227 virtual void UpdateProgressDiscrete(float progress);
00228 float ProgressRange[2];
00229
00230 virtual int ProcessRequest(vtkInformation *request,
00231 vtkInformationVector **inputVector,
00232 vtkInformationVector *outputVector);
00233 virtual int RequestData(vtkInformation *request,
00234 vtkInformationVector **inputVector,
00235 vtkInformationVector *outputVector);
00236 virtual int RequestDataObject(vtkInformation *vtkNotUsed(request),
00237 vtkInformationVector **vtkNotUsed(inputVector),
00238 vtkInformationVector *vtkNotUsed(outputVector))
00239 { return 1; }
00240 virtual int RequestInformation(vtkInformation *request,
00241 vtkInformationVector **inputVector,
00242 vtkInformationVector *outputVector);
00243 virtual int RequestUpdateExtentInformation
00244 (vtkInformation *request,
00245 vtkInformationVector **inputVector,
00246 vtkInformationVector *outputVector);
00247
00248 vtkTimeStamp ReadMTime;
00249
00250
00251 int ReadError;
00252
00253
00254
00255
00256 int AxesEmpty[3];
00257
00258
00259 int TimeStep;
00260 int CurrentTimeStep;
00261 int NumberOfTimeSteps;
00262 void SetNumberOfTimeSteps(int num);
00263
00264
00265 int *TimeSteps;
00266
00267 int TimeStepRange[2];
00268
00269
00270
00271
00272
00273
00274
00275 static int IsTimeStepInArray(int timestep, int* timesteps, int length);
00276
00277 private:
00278
00279 ifstream* FileStream;
00280 int TimeStepWasReadOnce;
00281
00282 int FileMajorVersion;
00283 int FileMinorVersion;
00284 private:
00285 vtkXMLReader(const vtkXMLReader&);
00286 void operator=(const vtkXMLReader&);
00287 };
00288
00289 #endif