VTK  9.3.20240328
vtkXMLWriter.h
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
2 // SPDX-License-Identifier: BSD-3-Clause
21 #ifndef vtkXMLWriter_h
22 #define vtkXMLWriter_h
23 
24 #include "vtkIOXMLModule.h" // For export macro
25 #include "vtkXMLWriterBase.h"
26 
27 #include <sstream> // For ostringstream ivar
28 
29 VTK_ABI_NAMESPACE_BEGIN
30 class vtkAbstractArray;
31 class vtkArrayIterator;
32 
33 template <class T>
35 
36 class vtkCellData;
37 class vtkDataArray;
38 class vtkDataCompressor;
39 class vtkDataSet;
41 class vtkFieldData;
42 class vtkOutputStream;
43 class vtkPointData;
44 class vtkPoints;
45 class vtkFieldData;
46 class vtkXMLDataHeader;
47 
48 class vtkStdString;
49 class OffsetsManager; // one per piece/per time
50 class OffsetsManagerGroup; // array of OffsetsManager
51 class OffsetsManagerArray; // array of OffsetsManagerGroup
52 
53 class VTKIOXML_EXPORT vtkXMLWriter : public vtkXMLWriterBase
54 {
55 public:
57  void PrintSelf(ostream& os, vtkIndent indent) override;
58 
60 
68  vtkDataObject* GetInput() { return this->GetInput(0); }
70 
71  // See the vtkAlgorithm for a description of what these do
73  vtkInformationVector* outputVector) override;
74 
76 
79  vtkGetMacro(NumberOfTimeSteps, int);
80  vtkSetMacro(NumberOfTimeSteps, int);
82 
84 
87  void Start();
88  void Stop();
89  void WriteNextTime(double time);
91 
92 protected:
94  ~vtkXMLWriter() override;
95 
96  virtual int RequestInformation(vtkInformation* request, vtkInformationVector** inputVector,
97  vtkInformationVector* outputVector);
98  virtual int RequestData(vtkInformation* request, vtkInformationVector** inputVector,
99  vtkInformationVector* outputVector);
100 
101  // The output stream to which the XML is written.
102  ostream* Stream;
103 
104  // The stream position at which appended data starts.
105  vtkTypeInt64 AppendedDataPosition;
106 
107  // appended data offsets for field data
108  OffsetsManagerGroup* FieldDataOM; // one per array
109 
110  // We need a 32 bit signed integer type to which vtkIdType will be
111  // converted if Int32 is specified for the IdType parameter to this
112  // writer.
113 #if VTK_SIZEOF_SHORT == 4
114  typedef short Int32IdType;
115 #elif VTK_SIZEOF_INT == 4
116  typedef int Int32IdType;
117 #elif VTK_SIZEOF_LONG == 4
118  typedef long Int32IdType;
119 #else
120 #error "No native data type can represent a signed 32-bit integer."
121 #endif
122 
123  // Buffer for vtkIdType conversion.
124  Int32IdType* Int32IdTypeBuffer;
125 
126  // The byte swapping buffer.
127  unsigned char* ByteSwapBuffer;
128 
129  // Compression information.
133 
134  // The output stream used to write binary and appended data. May
135  // transparently encode the data.
137 
138  // Allow subclasses to set the data stream.
140  vtkGetObjectMacro(DataStream, vtkOutputStream);
141 
142  // Method to drive most of actual writing.
143  virtual int WriteInternal();
144 
145  // Method defined by subclasses to write data. Return 1 for
146  // success, 0 for failure.
147  virtual int WriteData() { return 1; }
148 
149  // Method defined by subclasses to specify the data set's type name.
150  virtual const char* GetDataSetName() = 0;
151 
152  // Utility methods for subclasses.
154  virtual int StartFile();
155  virtual void WriteFileAttributes();
156  virtual int EndFile();
157  void DeleteAFile();
158  void DeleteAFile(const char* name);
159 
160  virtual int WritePrimaryElement(ostream& os, vtkIndent indent);
161  virtual void WritePrimaryElementAttributes(ostream& os, vtkIndent indent);
164 
165  // Write enough space to go back and write the given attribute with
166  // at most "length" characters in the value. Returns the stream
167  // position at which attribute should be later written. The default
168  // length of 20 is enough for a 64-bit integer written in decimal or
169  // a double-precision floating point value written to 13 digits of
170  // precision (the other 7 come from a minus sign, decimal place, and
171  // a big exponent like "e+300").
172  vtkTypeInt64 ReserveAttributeSpace(const char* attr, size_t length = 20);
173 
174  vtkTypeInt64 GetAppendedDataOffset();
176  vtkTypeInt64 streamPos, vtkTypeInt64& lastoffset, const char* attr = nullptr);
178  vtkTypeInt64 streamPos, vtkTypeInt64 offset, const char* attr = nullptr);
179  void ForwardAppendedDataDouble(vtkTypeInt64 streamPos, double value, const char* attr);
180 
181  int WriteScalarAttribute(const char* name, int data);
182  int WriteScalarAttribute(const char* name, float data);
183  int WriteScalarAttribute(const char* name, double data);
184 #ifdef VTK_USE_64BIT_IDS
185  int WriteScalarAttribute(const char* name, vtkIdType data);
186 #endif
187 
188  int WriteVectorAttribute(const char* name, int length, int* data);
189  int WriteVectorAttribute(const char* name, int length, float* data);
190  int WriteVectorAttribute(const char* name, int length, double* data);
191 #ifdef VTK_USE_64BIT_IDS
192  int WriteVectorAttribute(const char* name, int length, vtkIdType* data);
193 #endif
194 
195  int WriteDataModeAttribute(const char* name);
196  int WriteWordTypeAttribute(const char* name, int dataType);
197  int WriteStringAttribute(const char* name, const char* value);
198 
199  // Returns true if any keys were written.
201 
202  void WriteArrayHeader(vtkAbstractArray* a, vtkIndent indent, const char* alternateName,
203  int writeNumTuples, int timestep);
204  virtual void WriteArrayFooter(
205  ostream& os, vtkIndent indent, vtkAbstractArray* a, int shortFormat);
206  virtual void WriteArrayInline(vtkAbstractArray* a, vtkIndent indent,
207  const char* alternateName = nullptr, int writeNumTuples = 0);
208  virtual void WriteInlineData(vtkAbstractArray* a, vtkIndent indent);
209 
211  const char* alternateName = nullptr, int writeNumTuples = 0, int timestep = 0);
215  void WriteArrayAppendedData(vtkAbstractArray* a, vtkTypeInt64 pos, vtkTypeInt64& lastoffset);
216 
217  // Methods for writing points, point data, and cell data.
218  void WriteFieldData(vtkIndent indent);
223  void WriteFieldDataAppendedData(vtkFieldData* fd, int timestep, OffsetsManagerGroup* fdManager);
225  void WritePointDataAppendedData(vtkPointData* pd, int timestep, OffsetsManagerGroup* pdManager);
227  void WriteCellDataAppendedData(vtkCellData* cd, int timestep, OffsetsManagerGroup* cdManager);
228  void WriteAttributeIndices(vtkDataSetAttributes* dsa, char** names);
230  void WritePointsAppendedData(vtkPoints* points, int timestep, OffsetsManager* pdManager);
233  vtkDataArray* xc, vtkDataArray* yc, vtkDataArray* zc, vtkIndent indent);
235  vtkIndent indent, OffsetsManagerGroup* coordManager);
237  int timestep, OffsetsManagerGroup* coordManager);
241  void WritePArray(vtkAbstractArray* a, vtkIndent indent, const char* alternateName = nullptr);
243 
244  // Internal utility methods.
245  int WriteBinaryDataBlock(unsigned char* in_data, size_t numWords, int wordType);
246  void PerformByteSwap(void* data, size_t numWords, size_t wordSize);
248  int WriteCompressionBlock(unsigned char* data, size_t size);
250  size_t GetWordTypeSize(int dataType);
251  const char* GetWordTypeName(int dataType);
252  size_t GetOutputWordTypeSize(int dataType);
253 
254  char** CreateStringArray(int numStrings);
255  void DestroyStringArray(int numStrings, char** strings);
256 
257  // The current range over which progress is moving. This allows for
258  // incrementally fine-tuned progress updates.
259  virtual void GetProgressRange(float range[2]);
260  virtual void SetProgressRange(const float range[2], int curStep, int numSteps);
261  virtual void SetProgressRange(const float range[2], int curStep, const float* fractions);
262  virtual void SetProgressPartial(float fraction);
263  virtual void UpdateProgressDiscrete(float progress);
264  float ProgressRange[2];
265 
266  // This shallows copy input field data to the passed field data and
267  // then adds any additional field arrays. For example, TimeValue.
269 
270  ostream* OutFile;
271  std::ostringstream* OutStringStream;
272 
273  int OpenStream();
274  int OpenFile();
275  int OpenString();
276  void CloseStream();
277  void CloseFile();
278  void CloseString();
279 
280  // The timestep currently being written
283 
284  // Dummy boolean var to start/stop the continue executing:
285  // when using the Start/Stop/WriteNextTime API
286  int UserContinueExecuting; // can only be -1 = invalid, 0 = stop, 1 = start
287 
288  vtkTypeInt64* NumberOfTimeValues; // one per piece / per timestep
289 
290  friend class vtkXMLWriterHelper;
291 
292 private:
293  vtkXMLWriter(const vtkXMLWriter&) = delete;
294  void operator=(const vtkXMLWriter&) = delete;
295 };
296 
297 VTK_ABI_NAMESPACE_END
298 #endif
Helper class due to PIMPL excess.
Abstract superclass for all arrays.
Implementation template for a array iterator.
Abstract superclass to iterate over elements in an vtkAbstractArray.
represent and manipulate cell attribute data
Definition: vtkCellData.h:140
abstract superclass for arrays of numeric data
Definition: vtkDataArray.h:154
Abstract interface for data compression classes.
general representation of visualization data
represent and manipulate attribute data in a dataset
abstract class to specify dataset behavior
Definition: vtkDataSet.h:165
represent and manipulate fields of data
Definition: vtkFieldData.h:161
a simple class to control print indentation
Definition: vtkIndent.h:108
Store zero or more vtkInformation instances.
Store vtkAlgorithm input/output information.
Wraps a binary output stream with a VTK interface.
represent and manipulate point attribute data
Definition: vtkPointData.h:139
represent and manipulate 3D points
Definition: vtkPoints.h:138
Wrapper around std::string to keep symbols short.
Definition: vtkStdString.h:78
Abstract base class for VTK-XML writers.
Superclass for VTK's XML file writers.
Definition: vtkXMLWriter.h:54
void EndAppendedData()
int WriteBinaryDataInternal(vtkAbstractArray *a)
int CurrentTimeIndex
Definition: vtkXMLWriter.h:281
int WriteBinaryDataBlock(unsigned char *in_data, size_t numWords, int wordType)
void WriteFieldData(vtkIndent indent)
void SetInputData(vtkDataObject *)
Assign a data object as input.
void Stop()
API to interface an outside the VTK pipeline control.
ostream * OutFile
Definition: vtkXMLWriter.h:270
int WriteBinaryData(vtkAbstractArray *a)
unsigned char * ByteSwapBuffer
Definition: vtkXMLWriter.h:127
void WritePCellData(vtkCellData *cd, vtkIndent indent)
vtkDataObject * GetInput(int port)
Assign a data object as input.
int UserContinueExecuting
Definition: vtkXMLWriter.h:286
vtkDataObject * GetInput()
Assign a data object as input.
Definition: vtkXMLWriter.h:68
void WriteArrayAppendedData(vtkAbstractArray *a, vtkTypeInt64 pos, vtkTypeInt64 &lastoffset)
int WriteCompressionHeader()
void WriteFieldDataAppendedData(vtkFieldData *fd, int timestep, OffsetsManagerGroup *fdManager)
int WriteScalarAttribute(const char *name, int data)
void DestroyStringArray(int numStrings, char **strings)
vtkXMLDataHeader * CompressionHeader
Definition: vtkXMLWriter.h:131
void ForwardAppendedDataDouble(vtkTypeInt64 streamPos, double value, const char *attr)
void WritePointDataAppended(vtkPointData *pd, vtkIndent indent, OffsetsManagerGroup *pdManager)
int NumberOfTimeSteps
Definition: vtkXMLWriter.h:282
void DeleteAFile()
void WritePPointData(vtkPointData *pd, vtkIndent indent)
void WritePPoints(vtkPoints *points, vtkIndent indent)
vtkTypeInt64 AppendedDataPosition
Definition: vtkXMLWriter.h:105
void WriteFieldDataAppended(vtkFieldData *fd, vtkIndent indent, OffsetsManagerGroup *fdManager)
int WriteStringAttribute(const char *name, const char *value)
bool WriteInformation(vtkInformation *info, vtkIndent indent)
~vtkXMLWriter() override
virtual int WriteData()
Definition: vtkXMLWriter.h:147
int WriteCompressionBlock(unsigned char *data, size_t size)
size_t GetOutputWordTypeSize(int dataType)
void UpdateFieldData(vtkFieldData *)
std::ostringstream * OutStringStream
Definition: vtkXMLWriter.h:271
int WriteVectorAttribute(const char *name, int length, int *data)
void SetInputData(int, vtkDataObject *)
Assign a data object as input.
virtual void UpdateProgressDiscrete(float progress)
virtual int EndFile()
void ForwardAppendedDataOffset(vtkTypeInt64 streamPos, vtkTypeInt64 offset, const char *attr=nullptr)
void WritePointsAppended(vtkPoints *points, vtkIndent indent, OffsetsManager *manager)
int WriteVectorAttribute(const char *name, int length, float *data)
int WriteDataModeAttribute(const char *name)
void WritePArray(vtkAbstractArray *a, vtkIndent indent, const char *alternateName=nullptr)
void Start()
API to interface an outside the VTK pipeline control.
void WritePointsAppendedData(vtkPoints *points, int timestep, OffsetsManager *pdManager)
void WriteCoordinatesAppendedData(vtkDataArray *xc, vtkDataArray *yc, vtkDataArray *zc, int timestep, OffsetsManagerGroup *coordManager)
Int32IdType * Int32IdTypeBuffer
Definition: vtkXMLWriter.h:124
void WriteArrayHeader(vtkAbstractArray *a, vtkIndent indent, const char *alternateName, int writeNumTuples, int timestep)
virtual void WriteArrayInline(vtkAbstractArray *a, vtkIndent indent, const char *alternateName=nullptr, int writeNumTuples=0)
void WritePointsInline(vtkPoints *points, vtkIndent indent)
virtual void SetProgressRange(const float range[2], int curStep, const float *fractions)
vtkTypeInt64 GetAppendedDataOffset()
void WriteCellDataAppendedData(vtkCellData *cd, int timestep, OffsetsManagerGroup *cdManager)
virtual void SetDataStream(vtkOutputStream *)
int WriteVectorAttribute(const char *name, int length, double *data)
vtkTypeBool ProcessRequest(vtkInformation *request, vtkInformationVector **inputVector, vtkInformationVector *outputVector) override
Upstream/Downstream requests form the generalized interface through which executives invoke a algorit...
int WriteScalarAttribute(const char *name, double data)
void WriteCellDataAppended(vtkCellData *cd, vtkIndent indent, OffsetsManagerGroup *cdManager)
virtual void WriteFileAttributes()
void CloseStream()
vtkDataSet * GetInputAsDataSet()
void WritePCoordinates(vtkDataArray *xc, vtkDataArray *yc, vtkDataArray *zc, vtkIndent indent)
void WriteCoordinatesInline(vtkDataArray *xc, vtkDataArray *yc, vtkDataArray *zc, vtkIndent indent)
vtkTypeInt64 * NumberOfTimeValues
Definition: vtkXMLWriter.h:288
void WriteCoordinatesAppended(vtkDataArray *xc, vtkDataArray *yc, vtkDataArray *zc, vtkIndent indent, OffsetsManagerGroup *coordManager)
size_t CompressionBlockNumber
Definition: vtkXMLWriter.h:130
vtkOutputStream * DataStream
Definition: vtkXMLWriter.h:136
void WriteFieldDataInline(vtkFieldData *fd, vtkIndent indent)
void CloseFile()
void WritePointDataInline(vtkPointData *pd, vtkIndent indent)
int OpenStream()
void WriteArrayAppended(vtkAbstractArray *a, vtkIndent indent, OffsetsManager &offs, const char *alternateName=nullptr, int writeNumTuples=0, int timestep=0)
ostream * Stream
Definition: vtkXMLWriter.h:102
OffsetsManagerGroup * FieldDataOM
Definition: vtkXMLWriter.h:108
const char * GetWordTypeName(int dataType)
int OpenString()
virtual void GetProgressRange(float range[2])
vtkTypeInt64 ReserveAttributeSpace(const char *attr, size_t length=20)
virtual void SetProgressRange(const float range[2], int curStep, int numSteps)
virtual void WriteInlineData(vtkAbstractArray *a, vtkIndent indent)
int CreateCompressionHeader(size_t size)
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
virtual const char * GetDataSetName()=0
virtual int WritePrimaryElement(ostream &os, vtkIndent indent)
virtual void SetProgressPartial(float fraction)
virtual int StartFile()
int WriteScalarAttribute(const char *name, float data)
void WriteNextTime(double time)
API to interface an outside the VTK pipeline control.
void DeleteAFile(const char *name)
void WritePointDataAppendedData(vtkPointData *pd, int timestep, OffsetsManagerGroup *pdManager)
void StartAppendedData()
void CloseString()
vtkTypeInt64 CompressionHeaderPosition
Definition: vtkXMLWriter.h:132
void WriteAppendedDataOffset(vtkTypeInt64 streamPos, vtkTypeInt64 &lastoffset, const char *attr=nullptr)
void WriteAttributeIndices(vtkDataSetAttributes *dsa, char **names)
int WriteAsciiData(vtkAbstractArray *a, vtkIndent indent)
char ** CreateStringArray(int numStrings)
virtual void WriteArrayFooter(ostream &os, vtkIndent indent, vtkAbstractArray *a, int shortFormat)
size_t GetWordTypeSize(int dataType)
virtual int RequestInformation(vtkInformation *request, vtkInformationVector **inputVector, vtkInformationVector *outputVector)
virtual void WritePrimaryElementAttributes(ostream &os, vtkIndent indent)
virtual int WriteInternal()
void WriteCellDataInline(vtkCellData *cd, vtkIndent indent)
int WriteWordTypeAttribute(const char *name, int dataType)
virtual int RequestData(vtkInformation *request, vtkInformationVector **inputVector, vtkInformationVector *outputVector)
void PerformByteSwap(void *data, size_t numWords, size_t wordSize)
@ points
Definition: vtkX3D.h:446
@ info
Definition: vtkX3D.h:376
@ length
Definition: vtkX3D.h:393
@ value
Definition: vtkX3D.h:220
@ port
Definition: vtkX3D.h:447
@ range
Definition: vtkX3D.h:238
@ time
Definition: vtkX3D.h:497
@ name
Definition: vtkX3D.h:219
@ size
Definition: vtkX3D.h:253
@ offset
Definition: vtkX3D.h:438
@ progress
Definition: vtkX3D.h:452
@ data
Definition: vtkX3D.h:315
int vtkTypeBool
Definition: vtkABI.h:64
int vtkIdType
Definition: vtkType.h:315