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