Main Page | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Class Members | File Members | Related Pages

vtkXMLWriter.h

Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   Visualization Toolkit
00004   Module:    $RCSfile: vtkXMLWriter.h,v $
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 =========================================================================*/
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 //BTX
00039 class OffsetsManager;      // one per piece/per time
00040 class OffsetsManagerGroup; // array of OffsetsManager
00041 class OffsetsManagerArray; // array of OffsetsManagerGroup
00042 //ETX
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   //BTX
00052 
00053   enum { BigEndian, LittleEndian };
00054   //ETX
00056   
00057   //BTX
00059 
00062   enum { Ascii, Binary, Appended };
00063   //ETX
00065   
00066   //BTX
00068 
00071   enum { Int32=32, Int64=64 };
00072   //ETX
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   // See the vtkAlgorithm for a description of what these do
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   // The name of the output file.
00195   char* FileName;
00196   
00197   // The output stream to which the XML is written.
00198   ostream* Stream;  
00199   
00200   // The output byte order.
00201   int ByteOrder;
00202   
00203   // The output vtkIdType.
00204   int IdType;
00205   
00206   // The form of binary data to write.  Used by subclasses to choose
00207   // how to write data.
00208   int DataMode;
00209   
00210   // Whether to base64-encode the appended data section.
00211   int EncodeAppendedData;
00212   
00213   // The stream position at which appended data starts.
00214   unsigned long AppendedDataPosition;
00215 
00216   // appended data offsets for field data
00217   OffsetsManagerGroup *FieldDataOM;  //one per array
00218 
00219   //BTX
00220   // We need a 32 bit unsigned integer type for platform-independent
00221   // binary headers.  Note that this is duplicated in
00222   // vtkXMLDataParser.h.
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   //ETX
00233 
00234   //BTX
00235   // We need a 32 bit signed integer type to which vtkIdType will be
00236   // converted if Int32 is specified for the IdType parameter to this
00237   // writer.
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   //ETX
00248   
00249   // Buffer for vtkIdType conversion.
00250   Int32IdType* Int32IdTypeBuffer;
00251   
00252   // The byte swapping buffer.
00253   unsigned char* ByteSwapBuffer;
00254   
00255   // Compression information.
00256   vtkDataCompressor* Compressor;
00257   unsigned int   BlockSize;  
00258   unsigned long  CompressionBlockNumber;
00259   HeaderType*    CompressionHeader;
00260   unsigned int   CompressionHeaderLength;
00261   unsigned long  CompressionHeaderPosition;
00262   
00263   // The output stream used to write binary and appended data.  May
00264   // transparently encode the data.
00265   vtkOutputStream* DataStream;
00266   
00267   // Allow subclasses to set the data stream.
00268   virtual void SetDataStream(vtkOutputStream*);
00269   vtkGetObjectMacro(DataStream, vtkOutputStream);  
00270   
00271   // Method to drive most of actual writing.
00272   virtual int WriteInternal();
00273   
00274   // Method defined by subclasses to write data.  Return 1 for
00275   // success, 0 for failure.
00276   virtual int WriteData() {return 1;};
00277   
00278   // Method defined by subclasses to specify the data set's type name.
00279   virtual const char* GetDataSetName()=0;
00280   
00281   // Methods to define the file's major and minor version numbers.
00282   virtual int GetDataSetMajorVersion();
00283   virtual int GetDataSetMinorVersion();
00284   
00285   // Utility methods for subclasses.
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   // Write enough space to go back and write the given attribute with
00299   // at most "length" characters in the value.  Returns the stream
00300   // position at which attribute should be later written.  The default
00301   // length of 20 is enough for a 64-bit integer written in decimal or
00302   // a double-precision floating point value written to 13 digits of
00303   // precision (the other 7 come from a minus sign, decimal place, and
00304   // a big exponent like "e+300").
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   // Methods for writing points, point data, and cell data.
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   // Internal utility methods.
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   // The current range over which progress is moving.  This allows for
00435   // incrementally fine-tuned progress updates.
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   // The timestep currently being written
00449   int TimeStep;
00450   int CurrentTimeIndex;
00451   int NumberOfTimeSteps;
00452   // Store the range of time steps
00453   int TimeStepRange[2];
00454 
00455   // Dummy boolean var to start/stop the continue executing:
00456   // when using the Start/Stop/WriteNextTime API
00457   int UserContinueExecuting; //can only be -1 = invalid, 0 = stop, 1 = start
00458 
00459   unsigned long *NumberOfTimeValues; //one per piece / per timestep
00460 
00461 private:
00462   vtkXMLWriter(const vtkXMLWriter&);  // Not implemented.
00463   void operator=(const vtkXMLWriter&);  // Not implemented.
00464 };
00465 
00466 #endif

Generated on Mon Jan 21 23:07:33 2008 for VTK by  doxygen 1.4.3-20050530