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

IO/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 "vtkProcessObject.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 
00038 class VTK_IO_EXPORT vtkXMLWriter : public vtkProcessObject
00039 {
00040 public:
00041   vtkTypeRevisionMacro(vtkXMLWriter,vtkProcessObject);
00042   void PrintSelf(ostream& os, vtkIndent indent);
00043   
00044   //BTX
00046 
00047   enum { BigEndian, LittleEndian };
00048   //ETX
00050   
00051   //BTX
00053 
00056   enum { Ascii, Binary, Appended };
00057   //ETX
00059   
00060   //BTX
00062 
00065   enum { Int32=32, Int64=64 };
00066   //ETX
00068   
00070 
00072   vtkSetMacro(ByteOrder, int);
00073   vtkGetMacro(ByteOrder, int);
00074   void SetByteOrderToBigEndian();
00075   void SetByteOrderToLittleEndian();
00077   
00079 
00081   virtual void SetIdType(int);
00082   vtkGetMacro(IdType, int);
00083   void SetIdTypeToInt32();
00084   void SetIdTypeToInt64();
00086   
00088 
00089   vtkSetStringMacro(FileName);
00090   vtkGetStringMacro(FileName);
00092   
00094 
00096   virtual void SetCompressor(vtkDataCompressor*);
00097   vtkGetObjectMacro(Compressor, vtkDataCompressor);
00099   
00101 
00105   virtual void SetBlockSize(unsigned int blockSize);
00106   vtkGetMacro(BlockSize, unsigned int);
00108   
00110 
00113   vtkSetMacro(DataMode, int);
00114   vtkGetMacro(DataMode, int);
00115   void SetDataModeToAscii();
00116   void SetDataModeToBinary();
00117   void SetDataModeToAppended();
00119   
00121 
00126   vtkSetMacro(EncodeAppendedData, int);
00127   vtkGetMacro(EncodeAppendedData, int);
00128   vtkBooleanMacro(EncodeAppendedData, int);
00130   
00132   virtual const char* GetDefaultFileExtension()=0;
00133   
00135   int Write();
00136   
00137 protected:
00138   vtkXMLWriter();
00139   ~vtkXMLWriter();
00140   
00141   // The name of the output file.
00142   char* FileName;
00143   
00144   // The output stream to which the XML is written.
00145   ostream* Stream;  
00146   
00147   // The output byte order.
00148   int ByteOrder;
00149   
00150   // The output vtkIdType.
00151   int IdType;
00152   
00153   // The form of binary data to write.  Used by subclasses to choose
00154   // how to write data.
00155   int DataMode;
00156   
00157   // Whether to base64-encode the appended data section.
00158   int EncodeAppendedData;
00159   
00160   // The stream position at which appended data starts.
00161   unsigned long AppendedDataPosition;
00162 
00163   //BTX
00164   // We need a 32 bit unsigned integer type for platform-independent
00165   // binary headers.  Note that this is duplicated in
00166   // vtkXMLDataParser.h.
00167 #if VTK_SIZEOF_SHORT == 4
00168   typedef unsigned short HeaderType;
00169 #elif VTK_SIZEOF_INT == 4
00170   typedef unsigned int HeaderType;
00171 #elif VTK_SIZEOF_LONG == 4
00172   typedef unsigned long HeaderType;
00173 #else
00174 # error "No native data type can represent an unsigned 32-bit integer."
00175 #endif
00176   //ETX
00177 
00178   //BTX
00179   // We need a 32 bit signed integer type to which vtkIdType will be
00180   // converted if Int32 is specified for the IdType parameter to this
00181   // writer.
00182 # if VTK_SIZEOF_SHORT == 4
00183   typedef short Int32IdType;
00184 # elif VTK_SIZEOF_INT == 4
00185   typedef int Int32IdType;
00186 # elif VTK_SIZEOF_LONG == 4
00187   typedef long Int32IdType;
00188 # else
00189 #  error "No native data type can represent a signed 32-bit integer."
00190 # endif  
00191   //ETX
00192   
00193   // Buffer for vtkIdType conversion.
00194   Int32IdType* Int32IdTypeBuffer;
00195   
00196   // The byte swapping buffer.
00197   unsigned char* ByteSwapBuffer;
00198   
00199   // Compression information.
00200   vtkDataCompressor* Compressor;
00201   unsigned int   BlockSize;  
00202   unsigned long  CompressionBlockNumber;
00203   HeaderType*    CompressionHeader;
00204   unsigned int   CompressionHeaderLength;
00205   unsigned long  CompressionHeaderPosition;
00206   
00207   // The output stream used to write binary and appended data.  May
00208   // transparently encode the data.
00209   vtkOutputStream* DataStream;
00210   
00211   // Allow subclasses to set the data stream.
00212   virtual void SetDataStream(vtkOutputStream*);
00213   vtkGetObjectMacro(DataStream, vtkOutputStream);  
00214   
00215   // Method to drive most of actual writing.
00216   virtual int WriteInternal();
00217   
00218   // Method defined by subclasses to write data.  Return 1 for
00219   // success, 0 for failure.
00220   virtual int WriteData()=0;
00221   
00222   // Method defined by subclasses to specify the data set's type name.
00223   virtual const char* GetDataSetName()=0;
00224   
00225   // Methods to define the file's major and minor version numbers.
00226   virtual int GetDataSetMajorVersion();
00227   virtual int GetDataSetMinorVersion();
00228   
00229   // Utility methods for subclasses.
00230   vtkDataSet* GetInputAsDataSet();  
00231   int StartFile();
00232   virtual void WriteFileAttributes();
00233   int EndFile();
00234   void DeleteFile();
00235   void DeleteFile(const char* name);
00236 
00237   void StartAppendedData();
00238   void EndAppendedData();
00239   unsigned long ReserveAttributeSpace(const char* attr=0);
00240   unsigned long GetAppendedDataOffset();
00241   unsigned long WriteAppendedDataOffset(unsigned long streamPos,
00242                                         const char* attr=0);
00243   int WriteBinaryData(void* data, int numWords, int wordType);
00244   
00245   int WriteBinaryData(char* data)
00246     { return this->WriteBinaryData(data, static_cast<int>(strlen(data)),
00247                                    VTK_CHAR); }
00248   int WriteBinaryData(char* data, int numWords)
00249     { return this->WriteBinaryData(data, numWords, VTK_CHAR); }
00250   int WriteBinaryData(unsigned char* data, int numWords)
00251     { return this->WriteBinaryData(data, numWords, VTK_UNSIGNED_CHAR); }
00252   int WriteBinaryData(short* data, int numWords)
00253     { return this->WriteBinaryData(data, numWords, VTK_SHORT); }
00254   int WriteBinaryData(unsigned short* data, int numWords)
00255     { return this->WriteBinaryData(data, numWords, VTK_UNSIGNED_SHORT); }
00256   int WriteBinaryData(int* data, int numWords)
00257     { return this->WriteBinaryData(data, numWords, VTK_INT); }
00258   int WriteBinaryData(unsigned int* data, int numWords)
00259     { return this->WriteBinaryData(data, numWords, VTK_UNSIGNED_INT); }
00260   
00261   int WriteAsciiData(void* data, int numWords, int wordType, vtkIndent indent);
00262   
00263   int WriteAsciiData(char* data, vtkIndent indent)
00264     { return this->WriteAsciiData(data, static_cast<int>(strlen(data)),
00265                                   VTK_CHAR, indent); }
00266   int WriteAsciiData(char* data, int numWords, vtkIndent indent)
00267     { return this->WriteAsciiData(data, numWords, VTK_CHAR, indent); }
00268   int WriteAsciiData(unsigned char* data, int numWords, vtkIndent indent)
00269     { return this->WriteAsciiData(data, numWords, VTK_UNSIGNED_CHAR, indent); }
00270   int WriteAsciiData(short* data, int numWords, vtkIndent indent)
00271     { return this->WriteAsciiData(data, numWords, VTK_SHORT, indent); }
00272   int WriteAsciiData(unsigned short* data, int numWords, vtkIndent indent)
00273     { return this->WriteAsciiData(data, numWords, VTK_UNSIGNED_SHORT, indent); }
00274   int WriteAsciiData(int* data, int numWords, vtkIndent indent)
00275     { return this->WriteAsciiData(data, numWords, VTK_INT, indent); }
00276   int WriteAsciiData(unsigned int* data, int numWords, vtkIndent indent)
00277     { return this->WriteAsciiData(data, numWords, VTK_UNSIGNED_INT, indent); }
00278   
00279   int WriteScalarAttribute(const char* name, int data);
00280   int WriteScalarAttribute(const char* name, float data);
00281 #ifdef VTK_ID_TYPE_IS_NOT_BASIC_TYPE
00282   int WriteScalarAttribute(const char* name, vtkIdType data);
00283 #endif
00284   
00285   int WriteVectorAttribute(const char* name, int length, int* data);
00286   int WriteVectorAttribute(const char* name, int length, float* data);
00287   int WriteVectorAttribute(const char* name, int length, double* data);
00288 #ifdef VTK_ID_TYPE_IS_NOT_BASIC_TYPE
00289   int WriteVectorAttribute(const char* name, int length, vtkIdType* data);
00290 #endif
00291   
00292   int WriteDataModeAttribute(const char* name);
00293   int WriteWordTypeAttribute(const char* name, int dataType);
00294   int WriteStringAttribute(const char* name, const char* value);
00295   
00296   unsigned long WriteDataArrayAppended(vtkDataArray* a, vtkIndent indent,
00297                                        const char* alternateName=0);
00298   void WriteDataArrayAppendedData(vtkDataArray* a, unsigned long pos);
00299   void WriteDataArrayInline(vtkDataArray* a, vtkIndent indent,
00300                             const char* alternateName=0);
00301   void WriteInlineData(void* data, int numWords, int wordType,
00302                        vtkIndent indent);
00303   
00304   // Methods for writing points, point data, and cell data.
00305   void WritePointDataInline(vtkPointData* pd, vtkIndent indent);
00306   void WriteCellDataInline(vtkCellData* cd, vtkIndent indent);
00307   unsigned long* WritePointDataAppended(vtkPointData* pd, vtkIndent indent);
00308   void WritePointDataAppendedData(vtkPointData* pd, unsigned long* pdPositions);
00309   unsigned long* WriteCellDataAppended(vtkCellData* cd, vtkIndent indent);
00310   void WriteCellDataAppendedData(vtkCellData* cd, unsigned long* cdPositions);
00311   void WriteAttributeIndices(vtkDataSetAttributes* dsa, char** names);
00312   unsigned long WritePointsAppended(vtkPoints* points, vtkIndent indent);
00313   void WritePointsAppendedData(vtkPoints* points, unsigned long pointsPosition);
00314   void WritePointsInline(vtkPoints* points, vtkIndent indent);
00315   void WriteCoordinatesInline(vtkDataArray* xc, vtkDataArray* yc,
00316                               vtkDataArray* zc, vtkIndent indent);
00317   unsigned long* WriteCoordinatesAppended(vtkDataArray* xc, vtkDataArray* yc,
00318                                           vtkDataArray* zc, vtkIndent indent);
00319   void WriteCoordinatesAppendedData(vtkDataArray* xc, vtkDataArray* yc,
00320                                     vtkDataArray* zc,
00321                                     unsigned long* cPositions);
00322   virtual vtkDataArray* CreateArrayForPoints(vtkDataArray* inArray);
00323   virtual vtkDataArray* CreateArrayForCells(vtkDataArray* inArray);
00324   virtual vtkDataArray* CreateExactCoordinates(vtkDataArray* inArray, int xyz);
00325   void WritePPointData(vtkPointData* pd, vtkIndent indent);
00326   void WritePCellData(vtkCellData* cd, vtkIndent indent);
00327   void WritePPoints(vtkPoints* points, vtkIndent indent);
00328   void WritePDataArray(vtkDataArray* a, vtkIndent indent,
00329                        const char* alternateName=0);
00330   void WritePCoordinates(vtkDataArray* xc, vtkDataArray* yc,
00331                          vtkDataArray* zc, vtkIndent indent);
00332   
00333   // Internal utility methods.
00334   int WriteBinaryDataInternal(void* data, int numWords, int wordType);
00335   int WriteBinaryDataBlock(unsigned char* in_data, int numWords, int wordType);
00336   void PerformByteSwap(void* data, int numWords, int wordSize);
00337   int CreateCompressionHeader(unsigned long size);
00338   int WriteCompressionBlock(unsigned char* data, unsigned long size);
00339   int WriteCompressionHeader();
00340   unsigned long GetWordTypeSize(int dataType);
00341   const char* GetWordTypeName(int dataType);
00342   unsigned long GetOutputWordTypeSize(int dataType);
00343   
00344   char** CreateStringArray(int numStrings);
00345   void DestroyStringArray(int numStrings, char** strings);
00346   
00347   // The current range over which progress is moving.  This allows for
00348   // incrementally fine-tuned progress updates.
00349   virtual void GetProgressRange(float* range);
00350   virtual void SetProgressRange(float* range, int curStep, int numSteps);
00351   virtual void SetProgressRange(float* range, int curStep, float* fractions);
00352   virtual void SetProgressPartial(float fraction);
00353   virtual void UpdateProgressDiscrete(float progress);
00354   float ProgressRange[2];
00355   
00356 private:
00357   vtkXMLWriter(const vtkXMLWriter&);  // Not implemented.
00358   void operator=(const vtkXMLWriter&);  // Not implemented.
00359 };
00360 
00361 #endif