VTK  9.3.20240423
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
29VTK_ABI_NAMESPACE_BEGIN
32
33template <class T>
35
36class vtkCellData;
37class vtkDataArray;
39class vtkDataSet;
41class vtkFieldData;
42class vtkOutputStream;
43class vtkPointData;
44class vtkPoints;
45class vtkFieldData;
47
48class vtkStdString;
49class OffsetsManager; // one per piece/per time
50class OffsetsManagerGroup; // array of OffsetsManager
51class OffsetsManagerArray; // array of OffsetsManagerGroup
52
53class VTKIOXML_EXPORT vtkXMLWriter : public vtkXMLWriterBase
54{
55public:
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
92protected:
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.
106
107 // appended data offsets for field data
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();
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);
207 const char* alternateName = nullptr, int writeNumTuples = 0);
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.
227 void WriteCellDataAppendedData(vtkCellData* cd, int timestep, OffsetsManagerGroup* cdManager);
229 void WritePointsAppended(vtkPoints* points, vtkIndent indent, OffsetsManager* manager);
230 void WritePointsAppendedData(vtkPoints* points, int timestep, OffsetsManager* pdManager);
231 void WritePointsInline(vtkPoints* points, vtkIndent indent);
233 vtkDataArray* xc, vtkDataArray* yc, vtkDataArray* zc, vtkIndent indent);
235 vtkIndent indent, OffsetsManagerGroup* coordManager);
237 int timestep, OffsetsManagerGroup* coordManager);
240 void WritePPoints(vtkPoints* points, vtkIndent indent);
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);
247 int CreateCompressionHeader(size_t size);
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
274 int OpenFile();
277 void CloseFile();
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
292private:
293 vtkXMLWriter(const vtkXMLWriter&) = delete;
294 void operator=(const vtkXMLWriter&) = delete;
295};
296
297VTK_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
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:166
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)
vtkDataSet * GetInputAsDataSet()
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()
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
int vtkIdType
Definition vtkType.h:315