VTK  9.4.20250130
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 "vtkDeprecation.h" // For VTK_DEPRECATED_IN_9_5_0
25#include "vtkIOXMLModule.h" // For export macro
26#include "vtkXMLWriterBase.h"
27
28#include <sstream> // For ostringstream ivar
29
30VTK_ABI_NAMESPACE_BEGIN
33
34template <class T>
36
37class vtkCellData;
38class vtkDataArray;
40class vtkDataSet;
42class vtkFieldData;
43class vtkOutputStream;
44class vtkPointData;
45class vtkPoints;
46class vtkFieldData;
48
49class vtkStdString;
50class OffsetsManager; // one per piece/per time
51class OffsetsManagerGroup; // array of OffsetsManager
52class OffsetsManagerArray; // array of OffsetsManagerGroup
53
54class VTKIOXML_EXPORT vtkXMLWriter : public vtkXMLWriterBase
55{
56public:
58 void PrintSelf(ostream& os, vtkIndent indent) override;
59
61
69 vtkDataObject* GetInput() { return this->GetInput(0); }
71
72 // See the vtkAlgorithm for a description of what these do
74 vtkInformationVector* outputVector) override;
75
77
80 vtkGetMacro(NumberOfTimeSteps, int);
81 vtkSetMacro(NumberOfTimeSteps, int);
83
85
88 void Start();
89 void Stop();
90 void WriteNextTime(double time);
92
93protected:
95 ~vtkXMLWriter() override;
96
97 virtual int RequestInformation(vtkInformation* request, vtkInformationVector** inputVector,
98 vtkInformationVector* outputVector);
99 virtual int RequestData(vtkInformation* request, vtkInformationVector** inputVector,
100 vtkInformationVector* outputVector);
101
102 // The output stream to which the XML is written.
103 ostream* Stream;
104
105 // The stream position at which appended data starts.
107
108 // appended data offsets for field data
110
111 // We need a 32 bit signed integer type to which vtkIdType will be
112 // converted if Int32 is specified for the IdType parameter to this
113 // writer.
114#if VTK_SIZEOF_SHORT == 4
115 typedef short Int32IdType;
116#elif VTK_SIZEOF_INT == 4
117 typedef int Int32IdType;
118#elif VTK_SIZEOF_LONG == 4
119 typedef long Int32IdType;
120#else
121#error "No native data type can represent a signed 32-bit integer."
122#endif
123
124 // Buffer for vtkIdType conversion.
125 Int32IdType* Int32IdTypeBuffer;
126
127 // The byte swapping buffer.
128 unsigned char* ByteSwapBuffer;
129
130 // Compression information.
134
135 // The output stream used to write binary and appended data. May
136 // transparently encode the data.
138
139 // Allow subclasses to set the data stream.
141 vtkGetObjectMacro(DataStream, vtkOutputStream);
142
143 // Method to drive most of actual writing.
144 virtual int WriteInternal();
145
146 // Method defined by subclasses to write data. Return 1 for
147 // success, 0 for failure.
148 virtual int WriteData() { return 1; }
149
150 // Method defined by subclasses to specify the data set's type name.
151 virtual const char* GetDataSetName() = 0;
152
153 // Utility methods for subclasses.
155 VTK_DEPRECATED_IN_9_5_0("Use GetDataSetInput() instead.")
156 vtkDataSet* GetInputAsDataSet() { return this->GetDataSetInput(); }
157 virtual int StartFile();
158 virtual void WriteFileAttributes();
159 virtual int EndFile();
161 void DeleteAFile(const char* name);
162
163 virtual int WritePrimaryElement(ostream& os, vtkIndent indent);
164 virtual void WritePrimaryElementAttributes(ostream& os, vtkIndent indent);
167
168 // Write enough space to go back and write the given attribute with
169 // at most "length" characters in the value. Returns the stream
170 // position at which attribute should be later written. The default
171 // length of 20 is enough for a 64-bit integer written in decimal or
172 // a double-precision floating point value written to 13 digits of
173 // precision (the other 7 come from a minus sign, decimal place, and
174 // a big exponent like "e+300").
175 vtkTypeInt64 ReserveAttributeSpace(const char* attr, size_t length = 20);
176
177 vtkTypeInt64 GetAppendedDataOffset();
179 vtkTypeInt64 streamPos, vtkTypeInt64& lastoffset, const char* attr = nullptr);
181 vtkTypeInt64 streamPos, vtkTypeInt64 offset, const char* attr = nullptr);
182 void ForwardAppendedDataDouble(vtkTypeInt64 streamPos, double value, const char* attr);
183
184 int WriteScalarAttribute(const char* name, int data);
185 int WriteScalarAttribute(const char* name, float data);
186 int WriteScalarAttribute(const char* name, double data);
187#ifdef VTK_USE_64BIT_IDS
188 int WriteScalarAttribute(const char* name, vtkIdType data);
189#endif
190
191 int WriteVectorAttribute(const char* name, int length, int* data);
192 int WriteVectorAttribute(const char* name, int length, float* data);
193 int WriteVectorAttribute(const char* name, int length, double* data);
194#ifdef VTK_USE_64BIT_IDS
195 int WriteVectorAttribute(const char* name, int length, vtkIdType* data);
196#endif
197
198 int WriteDataModeAttribute(const char* name);
199 int WriteWordTypeAttribute(const char* name, int dataType);
200 int WriteStringAttribute(const char* name, const char* value);
201
202 // Returns true if any keys were written.
204
205 void WriteArrayHeader(vtkAbstractArray* a, vtkIndent indent, const char* alternateName,
206 int writeNumTuples, int timestep);
207 virtual void WriteArrayFooter(
208 ostream& os, vtkIndent indent, vtkAbstractArray* a, int shortFormat);
210 const char* alternateName = nullptr, int writeNumTuples = 0);
212
214 const char* alternateName = nullptr, int writeNumTuples = 0, int timestep = 0);
218 void WriteArrayAppendedData(vtkAbstractArray* a, vtkTypeInt64 pos, vtkTypeInt64& lastoffset);
219
220 // Methods for writing points, point data, and cell data.
230 void WriteCellDataAppendedData(vtkCellData* cd, int timestep, OffsetsManagerGroup* cdManager);
232 void WritePointsAppended(vtkPoints* points, vtkIndent indent, OffsetsManager* manager);
233 void WritePointsAppendedData(vtkPoints* points, int timestep, OffsetsManager* pdManager);
234 void WritePointsInline(vtkPoints* points, vtkIndent indent);
236 vtkDataArray* xc, vtkDataArray* yc, vtkDataArray* zc, vtkIndent indent);
238 vtkIndent indent, OffsetsManagerGroup* coordManager);
240 int timestep, OffsetsManagerGroup* coordManager);
243 void WritePPoints(vtkPoints* points, vtkIndent indent);
244 void WritePArray(vtkAbstractArray* a, vtkIndent indent, const char* alternateName = nullptr);
246
247 // Internal utility methods.
248 int WriteBinaryDataBlock(unsigned char* in_data, size_t numWords, int wordType);
249 void PerformByteSwap(void* data, size_t numWords, size_t wordSize);
250 int CreateCompressionHeader(size_t size);
251 int WriteCompressionBlock(unsigned char* data, size_t size);
253 size_t GetWordTypeSize(int dataType);
254 const char* GetWordTypeName(int dataType);
255 size_t GetOutputWordTypeSize(int dataType);
256
257 char** CreateStringArray(int numStrings);
258 void DestroyStringArray(int numStrings, char** strings);
259
260 // The current range over which progress is moving. This allows for
261 // incrementally fine-tuned progress updates.
262 virtual void GetProgressRange(float range[2]);
263 virtual void SetProgressRange(const float range[2], int curStep, int numSteps);
264 virtual void SetProgressRange(const float range[2], int curStep, const float* fractions);
265 virtual void SetProgressPartial(float fraction);
266 virtual void UpdateProgressDiscrete(float progress);
267 float ProgressRange[2];
268
269 // This shallows copy input field data to the passed field data and
270 // then adds any additional field arrays. For example, TimeValue.
272
273 ostream* OutFile;
274 std::ostringstream* OutStringStream;
275
277 int OpenFile();
280 void CloseFile();
282
283 // The timestep currently being written
286
287 // Dummy boolean var to start/stop the continue executing:
288 // when using the Start/Stop/WriteNextTime API
289 int UserContinueExecuting; // can only be -1 = invalid, 0 = stop, 1 = start
290
291 vtkTypeInt64* NumberOfTimeValues; // one per piece / per timestep
292
293 friend class vtkXMLWriterHelper;
294
295private:
296 vtkXMLWriter(const vtkXMLWriter&) = delete;
297 void operator=(const vtkXMLWriter&) = delete;
298};
299
300VTK_ABI_NAMESPACE_END
301#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
abstract superclass for arrays of numeric data
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
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
represent and manipulate 3D points
Definition vtkPoints.h:139
Wrapper around std::string to keep symbols short.
Abstract base class for VTK-XML writers.
Superclass for VTK's XML file writers.
void EndAppendedData()
int WriteBinaryDataInternal(vtkAbstractArray *a)
int WriteBinaryDataBlock(unsigned char *in_data, size_t numWords, int wordType)
void WriteFieldData(vtkIndent indent)
void SetInputData(vtkDataObject *)
Assign a data object as input.
virtual const char * GetDataSetName()=0
void Stop()
API to interface an outside the VTK pipeline control.
ostream * OutFile
int WriteBinaryData(vtkAbstractArray *a)
unsigned char * ByteSwapBuffer
void WritePCellData(vtkCellData *cd, vtkIndent indent)
int UserContinueExecuting
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
void ForwardAppendedDataDouble(vtkTypeInt64 streamPos, double value, const char *attr)
void WritePointDataAppended(vtkPointData *pd, vtkIndent indent, OffsetsManagerGroup *pdManager)
void DeleteAFile()
void WritePPointData(vtkPointData *pd, vtkIndent indent)
void WritePPoints(vtkPoints *points, vtkIndent indent)
vtkDataObject * GetInput()
Assign a data object as input.
vtkTypeInt64 AppendedDataPosition
void WriteFieldDataAppended(vtkFieldData *fd, vtkIndent indent, OffsetsManagerGroup *fdManager)
int WriteStringAttribute(const char *name, const char *value)
bool WriteInformation(vtkInformation *info, vtkIndent indent)
~vtkXMLWriter() override
char ** CreateStringArray(int numStrings)
virtual int WriteData()
int WriteCompressionBlock(unsigned char *data, size_t size)
size_t GetOutputWordTypeSize(int dataType)
void UpdateFieldData(vtkFieldData *)
std::ostringstream * OutStringStream
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
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()
void WritePCoordinates(vtkDataArray *xc, vtkDataArray *yc, vtkDataArray *zc, vtkIndent indent)
void WriteCoordinatesInline(vtkDataArray *xc, vtkDataArray *yc, vtkDataArray *zc, vtkIndent indent)
vtkTypeInt64 * NumberOfTimeValues
void WriteCoordinatesAppended(vtkDataArray *xc, vtkDataArray *yc, vtkDataArray *zc, vtkIndent indent, OffsetsManagerGroup *coordManager)
size_t CompressionBlockNumber
vtkOutputStream * DataStream
void WriteFieldDataInline(vtkFieldData *fd, vtkIndent indent)
void CloseFile()
void WritePointDataInline(vtkPointData *pd, vtkIndent indent)
int OpenStream()
vtkDataSet * GetDataSetInput()
void WriteArrayAppended(vtkAbstractArray *a, vtkIndent indent, OffsetsManager &offs, const char *alternateName=nullptr, int writeNumTuples=0, int timestep=0)
ostream * Stream
OffsetsManagerGroup * FieldDataOM
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 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)
const char * GetWordTypeName(int dataType)
void WritePointDataAppendedData(vtkPointData *pd, int timestep, OffsetsManagerGroup *pdManager)
void StartAppendedData()
void CloseString()
vtkTypeInt64 CompressionHeaderPosition
void WriteAppendedDataOffset(vtkTypeInt64 streamPos, vtkTypeInt64 &lastoffset, const char *attr=nullptr)
vtkDataObject * GetInput(int port)
Assign a data object as input.
void WriteAttributeIndices(vtkDataSetAttributes *dsa, char **names)
int WriteAsciiData(vtkAbstractArray *a, vtkIndent indent)
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)
int vtkTypeBool
Definition vtkABI.h:64
#define VTK_DEPRECATED_IN_9_5_0(reason)
int vtkIdType
Definition vtkType.h:315