00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
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
00046
00047 enum { BigEndian, LittleEndian };
00048
00050
00051
00053
00056 enum { Ascii, Binary, Appended };
00057
00059
00060
00062
00065 enum { Int32=32, Int64=64 };
00066
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
00142 char* FileName;
00143
00144
00145 ostream* Stream;
00146
00147
00148 int ByteOrder;
00149
00150
00151 int IdType;
00152
00153
00154
00155 int DataMode;
00156
00157
00158 int EncodeAppendedData;
00159
00160
00161 unsigned long AppendedDataPosition;
00162
00163
00164
00165
00166
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
00177
00178
00179
00180
00181
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
00192
00193
00194 Int32IdType* Int32IdTypeBuffer;
00195
00196
00197 unsigned char* ByteSwapBuffer;
00198
00199
00200 vtkDataCompressor* Compressor;
00201 unsigned int BlockSize;
00202 unsigned long CompressionBlockNumber;
00203 HeaderType* CompressionHeader;
00204 unsigned int CompressionHeaderLength;
00205 unsigned long CompressionHeaderPosition;
00206
00207
00208
00209 vtkOutputStream* DataStream;
00210
00211
00212 virtual void SetDataStream(vtkOutputStream*);
00213 vtkGetObjectMacro(DataStream, vtkOutputStream);
00214
00215
00216 virtual int WriteInternal();
00217
00218
00219
00220 virtual int WriteData()=0;
00221
00222
00223 virtual const char* GetDataSetName()=0;
00224
00225
00226 virtual int GetDataSetMajorVersion();
00227 virtual int GetDataSetMinorVersion();
00228
00229
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
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
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
00348
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&);
00358 void operator=(const vtkXMLWriter&);
00359 };
00360
00361 #endif