VTK  9.7.20261008
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
20
21#ifndef vtkXMLWriter_h
22#define vtkXMLWriter_h
23
24#include "vtkIOXMLModule.h" // For export macro
25#include "vtkWrappingHints.h" // For VTK_MARSHALAUTO
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 VTK_MARSHALAUTO 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
94
103 vtkSetClampMacro(Precision, int, 0, 17);
104 vtkGetMacro(Precision, int);
106
107protected:
109 ~vtkXMLWriter() override;
110
111 virtual int RequestInformation(vtkInformation* request, vtkInformationVector** inputVector,
112 vtkInformationVector* outputVector);
113 virtual int RequestData(vtkInformation* request, vtkInformationVector** inputVector,
114 vtkInformationVector* outputVector);
115
116 // The output stream to which the XML is written.
117 ostream* Stream;
118
119 // The stream position at which appended data starts.
121
122 // appended data offsets for field data
124
125 // We need a 32 bit signed integer type to which vtkIdType will be
126 // converted if Int32 is specified for the IdType parameter to this
127 // writer.
128#if VTK_SIZEOF_SHORT == 4
129 typedef short Int32IdType;
130#elif VTK_SIZEOF_INT == 4
131 typedef int Int32IdType;
132#elif VTK_SIZEOF_LONG == 4
133 typedef long Int32IdType;
134#else
135#error "No native data type can represent a signed 32-bit integer."
136#endif
137
138 // Buffer for vtkIdType conversion.
139 Int32IdType* Int32IdTypeBuffer;
140
141 // The byte swapping buffer.
142 unsigned char* ByteSwapBuffer;
143
144 // Compression information.
148
149 // The output stream used to write binary and appended data. May
150 // transparently encode the data.
152
153 // Allow subclasses to set the data stream.
155 vtkGetObjectMacro(DataStream, vtkOutputStream);
156
157 // Method to drive most of actual writing.
158 virtual int WriteInternal();
159
160 // Method defined by subclasses to write data. Return 1 for
161 // success, 0 for failure.
162 virtual int WriteData() { return 1; }
163
164 // Method defined by subclasses to specify the data set's type name.
165 virtual const char* GetDataSetName() = 0;
166
167 // Utility methods for subclasses.
169 virtual int StartFile();
170 virtual void WriteFileAttributes();
171 virtual int EndFile();
173 void DeleteAFile(const char* name);
174
175 virtual int WritePrimaryElement(ostream& os, vtkIndent indent);
176 virtual void WritePrimaryElementAttributes(ostream& os, vtkIndent indent);
179
180 // Write enough space to go back and write the given attribute with
181 // at most "length" characters in the value. Returns the stream
182 // position at which attribute should be later written. The default
183 // length of 20 is enough for a 64-bit integer written in decimal or
184 // a double-precision floating point value written to 13 digits of
185 // precision (the other 7 come from a minus sign, decimal place, and
186 // a big exponent like "e+300").
187 vtkTypeInt64 ReserveAttributeSpace(const char* attr, size_t length = 20);
188
189 vtkTypeInt64 GetAppendedDataOffset();
191 vtkTypeInt64 streamPos, vtkTypeInt64& lastoffset, const char* attr = nullptr);
193 vtkTypeInt64 streamPos, vtkTypeInt64 offset, const char* attr = nullptr);
194 void ForwardAppendedDataDouble(vtkTypeInt64 streamPos, double value, const char* attr);
195
196 int WriteScalarAttribute(const char* name, int data);
197 int WriteScalarAttribute(const char* name, float data);
198 int WriteScalarAttribute(const char* name, double data);
199#ifdef VTK_USE_64BIT_IDS
200 int WriteScalarAttribute(const char* name, vtkIdType data);
201#endif
202
203 int WriteVectorAttribute(const char* name, int length, VTK_FUTURE_CONST int* data);
204 int WriteVectorAttribute(const char* name, int length, VTK_FUTURE_CONST float* data);
205 int WriteVectorAttribute(const char* name, int length, VTK_FUTURE_CONST double* data);
206#ifdef VTK_USE_64BIT_IDS
207 int WriteVectorAttribute(const char* name, int length, vtkIdType* data);
208#endif
209
210 int WriteDataModeAttribute(const char* name);
211 int WriteWordTypeAttribute(const char* name, int dataType);
212 int WriteStringAttribute(const char* name, const char* value);
213
214 // Returns true if any keys were written.
216
217 void WriteArrayHeader(vtkAbstractArray* a, vtkIndent indent, const char* alternateName,
218 int writeNumTuples, int timestep);
219 virtual void WriteArrayFooter(
220 ostream& os, vtkIndent indent, vtkAbstractArray* a, int shortFormat);
222 const char* alternateName = nullptr, int writeNumTuples = 0);
224
226 const char* alternateName = nullptr, int writeNumTuples = 0, int timestep = 0);
230 void WriteArrayAppendedData(vtkAbstractArray* a, vtkTypeInt64 pos, vtkTypeInt64& lastoffset);
231
232 // Methods for writing points, point data, and cell data.
242 void WriteCellDataAppendedData(vtkCellData* cd, int timestep, OffsetsManagerGroup* cdManager);
244 void WritePointsAppended(vtkPoints* points, vtkIndent indent, OffsetsManager* manager);
245 void WritePointsAppendedData(vtkPoints* points, int timestep, OffsetsManager* pdManager);
246 void WritePointsInline(vtkPoints* points, vtkIndent indent);
248 vtkDataArray* xc, vtkDataArray* yc, vtkDataArray* zc, vtkIndent indent);
250 vtkIndent indent, OffsetsManagerGroup* coordManager);
252 int timestep, OffsetsManagerGroup* coordManager);
255 void WritePPoints(vtkPoints* points, vtkIndent indent);
256 void WritePArray(vtkAbstractArray* a, vtkIndent indent, const char* alternateName = nullptr);
258
259 // Internal utility methods.
260 int WriteBinaryDataBlock(unsigned char* in_data, size_t numWords, int wordType);
261 void PerformByteSwap(void* data, size_t numWords, size_t wordSize);
262 int CreateCompressionHeader(size_t size);
263 int WriteCompressionBlock(unsigned char* data, size_t size);
265 size_t GetWordTypeSize(int dataType);
266 const char* GetWordTypeName(int dataType);
267 size_t GetOutputWordTypeSize(int dataType);
268
269 char** CreateStringArray(int numStrings);
270 void DestroyStringArray(int numStrings, char** strings);
271
272 // The current range over which progress is moving. This allows for
273 // incrementally fine-tuned progress updates.
274 virtual void GetProgressRange(float range[2]);
275 virtual void SetProgressRange(const float range[2], int curStep, int numSteps);
276 virtual void SetProgressRange(const float range[2], int curStep, const float* fractions);
277 virtual void SetProgressPartial(float fraction);
278 virtual void UpdateProgressDiscrete(float progress);
280
281 // This shallows copy input field data to the passed field data and
282 // then adds any additional field arrays. For example, TimeValue.
284
285 ostream* OutFile;
286 std::ostringstream* OutStringStream;
287
289 int OpenFile();
292 void CloseFile();
294
295 // The timestep currently being written
298
299 // Dummy boolean var to start/stop the continue executing:
300 // when using the Start/Stop/WriteNextTime API
301 int UserContinueExecuting; // can only be -1 = invalid, 0 = stop, 1 = start
302
303 vtkTypeInt64* NumberOfTimeValues; // one per piece / per timestep
305
306 friend class vtkXMLWriterHelper;
307
308private:
309 vtkXMLWriter(const vtkXMLWriter&) = delete;
310 void operator=(const vtkXMLWriter&) = delete;
311};
312
313VTK_ABI_NAMESPACE_END
314#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 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
Represents and manipulates a collection of data arrays.
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:140
Wrapper around std::string to keep symbols short.
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
friend class vtkXMLWriterHelper
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 WriteVectorAttribute(const char *name, int length, VTK_FUTURE_CONST float *data)
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
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 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 *)
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()
int WriteVectorAttribute(const char *name, int length, VTK_FUTURE_CONST double *data)
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)
int WriteVectorAttribute(const char *name, int length, VTK_FUTURE_CONST int *data)
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()
float ProgressRange[2]
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 vtkDataArray
int vtkIdType
Definition vtkType.h:363
#define VTK_MARSHALAUTO