00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
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
00061
00062 enum { BigEndian, LittleEndian };
00063
00065
00066
00068
00071 enum { Ascii, Binary, Appended };
00072
00074
00075
00077
00080 enum { Int32=32, Int64=64 };
00081
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
00157 char* FileName;
00158
00159
00160 ostream* Stream;
00161
00162
00163 int ByteOrder;
00164
00165
00166 int IdType;
00167
00168
00169
00170 int DataMode;
00171
00172
00173 int EncodeAppendedData;
00174
00175
00176 unsigned long AppendedDataPosition;
00177
00178
00179
00180
00181
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
00192
00193
00194
00195
00196
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
00207
00208
00209 Int32IdType* Int32IdTypeBuffer;
00210
00211
00212 unsigned char* ByteSwapBuffer;
00213
00214
00215 vtkDataCompressor* Compressor;
00216 unsigned int BlockSize;
00217 unsigned long CompressionBlockNumber;
00218 HeaderType* CompressionHeader;
00219 unsigned int CompressionHeaderLength;
00220 unsigned long CompressionHeaderPosition;
00221
00222
00223
00224 vtkOutputStream* DataStream;
00225
00226
00227 virtual void SetDataStream(vtkOutputStream*);
00228 vtkGetObjectMacro(DataStream, vtkOutputStream);
00229
00230
00231
00232 virtual int WriteData()=0;
00233
00234
00235 virtual const char* GetDataSetName()=0;
00236
00237
00238 virtual int GetDataSetMajorVersion();
00239 virtual int GetDataSetMinorVersion();
00240
00241
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
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
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&);
00358 void operator=(const vtkXMLWriter&);
00359 };
00360
00361 #endif