00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00024 #ifndef __vtkXMLWriter_h
00025 #define __vtkXMLWriter_h
00026
00027 #include "vtkAlgorithm.h"
00028
00029 class vtkCellData;
00030 class vtkDataArray;
00031 class vtkDataCompressor;
00032 class vtkDataSet;
00033 class vtkDataSetAttributes;
00034 class vtkOutputStream;
00035 class vtkPointData;
00036 class vtkPoints;
00037 class vtkFieldData;
00038
00039 class OffsetsManager;
00040 class OffsetsManagerGroup;
00041 class OffsetsManagerArray;
00042
00043
00044 class VTK_IO_EXPORT vtkXMLWriter : public vtkAlgorithm
00045 {
00046 public:
00047 vtkTypeRevisionMacro(vtkXMLWriter,vtkAlgorithm);
00048 void PrintSelf(ostream& os, vtkIndent indent);
00049
00050
00052
00053 enum { BigEndian, LittleEndian };
00054
00056
00057
00059
00062 enum { Ascii, Binary, Appended };
00063
00065
00066
00068
00071 enum { Int32=32, Int64=64 };
00072
00074
00076
00078 vtkSetMacro(ByteOrder, int);
00079 vtkGetMacro(ByteOrder, int);
00080 void SetByteOrderToBigEndian();
00081 void SetByteOrderToLittleEndian();
00083
00085
00087 virtual void SetIdType(int);
00088 vtkGetMacro(IdType, int);
00089 void SetIdTypeToInt32();
00090 void SetIdTypeToInt64();
00092
00094
00095 vtkSetStringMacro(FileName);
00096 vtkGetStringMacro(FileName);
00098
00100
00102 virtual void SetCompressor(vtkDataCompressor*);
00103 vtkGetObjectMacro(Compressor, vtkDataCompressor);
00105
00107
00111 virtual void SetBlockSize(unsigned int blockSize);
00112 vtkGetMacro(BlockSize, unsigned int);
00114
00116
00119 vtkSetMacro(DataMode, int);
00120 vtkGetMacro(DataMode, int);
00121 void SetDataModeToAscii();
00122 void SetDataModeToBinary();
00123 void SetDataModeToAppended();
00125
00127
00132 vtkSetMacro(EncodeAppendedData, int);
00133 vtkGetMacro(EncodeAppendedData, int);
00134 vtkBooleanMacro(EncodeAppendedData, int);
00136
00138
00140 void SetInput(vtkDataObject *);
00141 void SetInput(int, vtkDataObject*);
00142 vtkDataObject *GetInput(int port);
00143 vtkDataObject *GetInput() { return this->GetInput(0); };
00145
00147 virtual const char* GetDefaultFileExtension()=0;
00148
00150 int Write();
00151
00152
00153 virtual int ProcessRequest(vtkInformation* request,
00154 vtkInformationVector** inputVector,
00155 vtkInformationVector* outputVector);
00156
00158
00159 vtkSetMacro(TimeStep, int);
00160 vtkGetMacro(TimeStep, int);
00162
00164
00165 vtkGetVector2Macro(TimeStepRange, int);
00166 vtkSetVector2Macro(TimeStepRange, int);
00168
00170
00171 vtkGetMacro(NumberOfTimeSteps,int);
00172 vtkSetMacro(NumberOfTimeSteps,int);
00174
00176
00177 void Start();
00178 void Stop();
00179 void WriteNextTime(double time);
00181
00182 protected:
00183 vtkXMLWriter();
00184 ~vtkXMLWriter();
00185
00186 virtual int RequestInformation(
00187 vtkInformation* request,
00188 vtkInformationVector** inputVector,
00189 vtkInformationVector* outputVector);
00190 virtual int RequestData(vtkInformation* request,
00191 vtkInformationVector** inputVector,
00192 vtkInformationVector* outputVector);
00193
00194
00195 char* FileName;
00196
00197
00198 ostream* Stream;
00199
00200
00201 int ByteOrder;
00202
00203
00204 int IdType;
00205
00206
00207
00208 int DataMode;
00209
00210
00211 int EncodeAppendedData;
00212
00213
00214 unsigned long AppendedDataPosition;
00215
00216
00217 OffsetsManagerGroup *FieldDataOM;
00218
00219
00220
00221
00222
00223 #if VTK_SIZEOF_SHORT == 4
00224 typedef unsigned short HeaderType;
00225 #elif VTK_SIZEOF_INT == 4
00226 typedef unsigned int HeaderType;
00227 #elif VTK_SIZEOF_LONG == 4
00228 typedef unsigned long HeaderType;
00229 #else
00230 # error "No native data type can represent an unsigned 32-bit integer."
00231 #endif
00232
00233
00234
00235
00236
00237
00238 # if VTK_SIZEOF_SHORT == 4
00239 typedef short Int32IdType;
00240 # elif VTK_SIZEOF_INT == 4
00241 typedef int Int32IdType;
00242 # elif VTK_SIZEOF_LONG == 4
00243 typedef long Int32IdType;
00244 # else
00245 # error "No native data type can represent a signed 32-bit integer."
00246 # endif
00247
00248
00249
00250 Int32IdType* Int32IdTypeBuffer;
00251
00252
00253 unsigned char* ByteSwapBuffer;
00254
00255
00256 vtkDataCompressor* Compressor;
00257 unsigned int BlockSize;
00258 unsigned long CompressionBlockNumber;
00259 HeaderType* CompressionHeader;
00260 unsigned int CompressionHeaderLength;
00261 unsigned long CompressionHeaderPosition;
00262
00263
00264
00265 vtkOutputStream* DataStream;
00266
00267
00268 virtual void SetDataStream(vtkOutputStream*);
00269 vtkGetObjectMacro(DataStream, vtkOutputStream);
00270
00271
00272 virtual int WriteInternal();
00273
00274
00275
00276 virtual int WriteData() {return 1;};
00277
00278
00279 virtual const char* GetDataSetName()=0;
00280
00281
00282 virtual int GetDataSetMajorVersion();
00283 virtual int GetDataSetMinorVersion();
00284
00285
00286 vtkDataSet* GetInputAsDataSet();
00287 int StartFile();
00288 virtual void WriteFileAttributes();
00289 int EndFile();
00290 void DeleteAFile();
00291 void DeleteAFile(const char* name);
00292
00293 virtual int WritePrimaryElement(ostream &os, vtkIndent indent);
00294 virtual void WritePrimaryElementAttributes(ostream &os, vtkIndent indent);
00295 void StartAppendedData();
00296 void EndAppendedData();
00297
00298
00299
00300
00301
00302
00303
00304
00305 unsigned long ReserveAttributeSpace(const char* attr, int length=20);
00306
00307 unsigned long GetAppendedDataOffset();
00308 unsigned long WriteAppendedDataOffset(unsigned long streamPos,
00309 unsigned long &lastoffset,
00310 const char* attr=0);
00311 unsigned long ForwardAppendedDataOffset(unsigned long streamPos,
00312 unsigned long offset,
00313 const char* attr=0);
00314 int WriteBinaryData(void* data, int numWords, int wordType);
00315
00316 int WriteBinaryData(char* data)
00317 { return this->WriteBinaryData(data, static_cast<int>(strlen(data)),
00318 VTK_CHAR); }
00319 int WriteBinaryData(char* data, int numWords)
00320 { return this->WriteBinaryData(data, numWords, VTK_CHAR); }
00321 int WriteBinaryData(unsigned char* data, int numWords)
00322 { return this->WriteBinaryData(data, numWords, VTK_UNSIGNED_CHAR); }
00323 int WriteBinaryData(short* data, int numWords)
00324 { return this->WriteBinaryData(data, numWords, VTK_SHORT); }
00325 int WriteBinaryData(unsigned short* data, int numWords)
00326 { return this->WriteBinaryData(data, numWords, VTK_UNSIGNED_SHORT); }
00327 int WriteBinaryData(int* data, int numWords)
00328 { return this->WriteBinaryData(data, numWords, VTK_INT); }
00329 int WriteBinaryData(unsigned int* data, int numWords)
00330 { return this->WriteBinaryData(data, numWords, VTK_UNSIGNED_INT); }
00331
00332 int WriteAsciiData(void* data, int numWords, int wordType, vtkIndent indent);
00333
00334 int WriteAsciiData(char* data, vtkIndent indent)
00335 { return this->WriteAsciiData(data, static_cast<int>(strlen(data)),
00336 VTK_CHAR, indent); }
00337 int WriteAsciiData(char* data, int numWords, vtkIndent indent)
00338 { return this->WriteAsciiData(data, numWords, VTK_CHAR, indent); }
00339 int WriteAsciiData(unsigned char* data, int numWords, vtkIndent indent)
00340 { return this->WriteAsciiData(data, numWords, VTK_UNSIGNED_CHAR, indent); }
00341 int WriteAsciiData(short* data, int numWords, vtkIndent indent)
00342 { return this->WriteAsciiData(data, numWords, VTK_SHORT, indent); }
00343 int WriteAsciiData(unsigned short* data, int numWords, vtkIndent indent)
00344 { return this->WriteAsciiData(data, numWords, VTK_UNSIGNED_SHORT, indent); }
00345 int WriteAsciiData(int* data, int numWords, vtkIndent indent)
00346 { return this->WriteAsciiData(data, numWords, VTK_INT, indent); }
00347 int WriteAsciiData(unsigned int* data, int numWords, vtkIndent indent)
00348 { return this->WriteAsciiData(data, numWords, VTK_UNSIGNED_INT, indent); }
00349
00350 int WriteScalarAttribute(const char* name, int data);
00351 int WriteScalarAttribute(const char* name, float data);
00352 #ifdef VTK_USE_64BIT_IDS
00353 int WriteScalarAttribute(const char* name, vtkIdType data);
00354 #endif
00355
00356 int WriteVectorAttribute(const char* name, int length, int* data);
00357 int WriteVectorAttribute(const char* name, int length, float* data);
00358 int WriteVectorAttribute(const char* name, int length, double* data);
00359 #ifdef VTK_USE_64BIT_IDS
00360 int WriteVectorAttribute(const char* name, int length, vtkIdType* data);
00361 #endif
00362
00363 int WriteDataModeAttribute(const char* name);
00364 int WriteWordTypeAttribute(const char* name, int dataType);
00365 int WriteStringAttribute(const char* name, const char* value);
00366
00367 unsigned long WriteDataArrayAppended(vtkDataArray* a, vtkIndent indent,
00368 const char* alternateName=0,
00369 int writeNumTuples=0, int timestep=-1);
00370 void WriteDataArrayAppendedData(vtkDataArray* a, unsigned long pos, unsigned long &lastoffset);
00371 void WriteDataArrayInline(vtkDataArray* a, vtkIndent indent,
00372 const char* alternateName=0, int writeNumTuples=0);
00373 void WriteInlineData(void* data, int numWords, int wordType,
00374 vtkIndent indent);
00375
00376 void WriteDataArrayHeader(vtkDataArray* a, vtkIndent indent,
00377 const char* alternateName, int writeNumTuples, int timestep);
00378 void WriteDataArrayFooter(ostream &os, vtkIndent indent);
00379
00380
00381 void WriteFieldData(vtkIndent indent);
00382 void WriteFieldDataInline(vtkFieldData* fd, vtkIndent indent);
00383 void WritePointDataInline(vtkPointData* pd, vtkIndent indent);
00384 void WriteCellDataInline(vtkCellData* cd, vtkIndent indent);
00385 void WriteFieldDataAppended(vtkFieldData* fd, vtkIndent indent,
00386 OffsetsManagerGroup *fdManager);
00387 void WriteFieldDataAppendedData(vtkFieldData* fd, int timestep,
00388 OffsetsManagerGroup *fdManager);
00389 void WritePointDataAppended(vtkPointData* pd, vtkIndent indent,
00390 OffsetsManagerGroup *pdManager);
00391 void WritePointDataAppendedData(vtkPointData* pd, int timestep,
00392 OffsetsManagerGroup *pdManager);
00393 void WriteCellDataAppended(vtkCellData* cd, vtkIndent indent,
00394 OffsetsManagerGroup *cdManager);
00395 void WriteCellDataAppendedData(vtkCellData* cd, int timestep,
00396 OffsetsManagerGroup *cdManager);
00397 void WriteAttributeIndices(vtkDataSetAttributes* dsa, char** names);
00398 void WritePointsAppended(vtkPoints* points, vtkIndent indent, OffsetsManager *manager);
00399 void WritePointsAppendedData(vtkPoints* points, int timestep, OffsetsManager *pdManager);
00400 void WritePointsInline(vtkPoints* points, vtkIndent indent);
00401 void WriteCoordinatesInline(vtkDataArray* xc, vtkDataArray* yc,
00402 vtkDataArray* zc, vtkIndent indent);
00403 void WriteCoordinatesAppended(vtkDataArray* xc, vtkDataArray* yc,
00404 vtkDataArray* zc, vtkIndent indent,
00405 OffsetsManagerGroup *coordManager);
00406 void WriteCoordinatesAppendedData(vtkDataArray* xc, vtkDataArray* yc,
00407 vtkDataArray* zc, int timestep,
00408 OffsetsManagerGroup *coordManager);
00409 virtual vtkDataArray* CreateArrayForPoints(vtkDataArray* inArray);
00410 virtual vtkDataArray* CreateArrayForCells(vtkDataArray* inArray);
00411 virtual vtkDataArray* CreateExactCoordinates(vtkDataArray* inArray, int xyz);
00412 void WritePPointData(vtkPointData* pd, vtkIndent indent);
00413 void WritePCellData(vtkCellData* cd, vtkIndent indent);
00414 void WritePPoints(vtkPoints* points, vtkIndent indent);
00415 void WritePDataArray(vtkDataArray* a, vtkIndent indent,
00416 const char* alternateName=0);
00417 void WritePCoordinates(vtkDataArray* xc, vtkDataArray* yc,
00418 vtkDataArray* zc, vtkIndent indent);
00419
00420
00421 int WriteBinaryDataInternal(void* data, int numWords, int wordType);
00422 int WriteBinaryDataBlock(unsigned char* in_data, int numWords, int wordType);
00423 void PerformByteSwap(void* data, int numWords, int wordSize);
00424 int CreateCompressionHeader(unsigned long size);
00425 int WriteCompressionBlock(unsigned char* data, unsigned long size);
00426 int WriteCompressionHeader();
00427 unsigned long GetWordTypeSize(int dataType);
00428 const char* GetWordTypeName(int dataType);
00429 unsigned long GetOutputWordTypeSize(int dataType);
00430
00431 char** CreateStringArray(int numStrings);
00432 void DestroyStringArray(int numStrings, char** strings);
00433
00434
00435
00436 virtual void GetProgressRange(float* range);
00437 virtual void SetProgressRange(float* range, int curStep, int numSteps);
00438 virtual void SetProgressRange(float* range, int curStep, float* fractions);
00439 virtual void SetProgressPartial(float fraction);
00440 virtual void UpdateProgressDiscrete(float progress);
00441 float ProgressRange[2];
00442
00443 ofstream* OutFile;
00444
00445 int OpenFile();
00446 void CloseFile();
00447
00448
00449 int TimeStep;
00450 int CurrentTimeIndex;
00451 int NumberOfTimeSteps;
00452
00453 int TimeStepRange[2];
00454
00455
00456
00457 int UserContinueExecuting;
00458
00459 unsigned long *NumberOfTimeValues;
00460
00461 private:
00462 vtkXMLWriter(const vtkXMLWriter&);
00463 void operator=(const vtkXMLWriter&);
00464 };
00465
00466 #endif