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

dox/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