VTK  9.6.20260111
vtkXMLReader.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
34
35#ifndef vtkXMLReader_h
36#define vtkXMLReader_h
37
38#include "vtkAlgorithm.h"
39#include "vtkDeprecation.h" // For VTK_DEPRECATED_IN_9_5_0
40#include "vtkIOXMLModule.h" // For export macro
41#include "vtkSmartPointer.h" // for vtkSmartPointer.
42
43#include <istream> // for IStream
44#include <memory> // for std::unique_ptr
45#include <streambuf> // for Streambuf
46#include <string> // for std::string
47
48VTK_ABI_NAMESPACE_BEGIN
51class vtkCharArray;
52class vtkCommand;
53class vtkDataArray;
55class vtkDataSet;
57class vtkInformation;
60class vtkStringArray;
63
64class VTKIOXML_EXPORT vtkXMLReader : public vtkAlgorithm
65{
66public:
67 vtkTypeMacro(vtkXMLReader, vtkAlgorithm);
68 void PrintSelf(ostream& os, vtkIndent indent) override;
69
76
78
84
86
94
101 void SetInputString(const char* in);
102 void SetInputString(const char* in, int len);
103 void SetBinaryInputString(const char*, int len);
104 void SetInputString(const std::string& input)
105 {
106 this->SetBinaryInputString(input.c_str(), static_cast<int>(input.length()));
107 }
108
109
111
121
123
128 vtkSetMacro(ReadFromInputStream, bool);
129 vtkGetMacro(ReadFromInputStream, bool);
130 vtkBooleanMacro(ReadFromInputStream, bool);
132
134
143
151 virtual int CanReadFile(VTK_FILEPATH const char* name);
152
154
160
162
170
172
179
181
185 const char* GetTimeDataArray(int idx) const;
188
190
196 vtkGetStringMacro(ActiveTimeDataArrayName);
197 vtkSetStringMacro(ActiveTimeDataArrayName);
199
201
205 const char* GetPointArrayName(int index);
206 const char* GetCellArrayName(int index);
207 const char* GetColumnArrayName(int index);
209
211
215 int GetPointArrayStatus(const char* name);
216 int GetCellArrayStatus(const char* name);
217 void SetPointArrayStatus(const char* name, int status);
218 void SetCellArrayStatus(const char* name, int status);
219 int GetColumnArrayStatus(const char* name);
220 void SetColumnArrayStatus(const char* name, int status);
222
223 // For the specified port, copy the information this reader sets up in
224 // SetupOutputInformation to outInfo
225 virtual void CopyOutputInformation(vtkInformation* vtkNotUsed(outInfo), int vtkNotUsed(port)) {}
226
228
231 vtkSetMacro(TimeStep, int);
232 vtkGetMacro(TimeStep, int);
234
235 vtkGetMacro(NumberOfTimeSteps, int);
237
240 vtkGetVector2Macro(TimeStepRange, int);
241 vtkSetVector2Macro(TimeStepRange, int);
243
249
251 vtkInformationVector* outputVector) override;
252
254
259 vtkGetObjectMacro(ReaderErrorObserver, vtkCommand);
261
263
268 vtkGetObjectMacro(ParserErrorObserver, vtkCommand);
270
275
276protected:
278 ~vtkXMLReader() override;
279
281
286 virtual int ReadXMLInformation();
287 virtual void ReadXMLData();
289
293 virtual const char* GetDataSetName() = 0;
294
298 virtual int CanReadFileVersion(int major, int minor);
299
303 virtual void SetupEmptyOutput() = 0;
304
308 virtual void SetupOutputInformation(vtkInformation* vtkNotUsed(outInfo)) {}
309
313 virtual void SetupOutputData();
314
319 virtual int ReadPrimaryElement(vtkXMLDataElement* ePrimary);
320
325 virtual int ReadVTKFile(vtkXMLDataElement* eVTKFile);
326
332 int GetLocalDataType(vtkXMLDataElement* da, int datatype);
333
339
345
351
353
356 virtual int OpenStream();
357 virtual void CloseStream();
358 virtual int OpenVTKFile();
359 virtual void CloseVTKFile();
360 virtual int OpenVTKString();
361 virtual void CloseVTKString();
362 virtual void CreateXMLParser();
363 virtual void DestroyXMLParser();
364 void SetupCompressor(const char* type);
365 int CanReadFileVersionString(const char* version);
367
373 virtual int CanReadFileWithDataType(const char* dsname);
374
378 vtkGetMacro(FileMajorVersion, int);
379
383 vtkGetMacro(FileMinorVersion, int);
384
386
389 int IntersectExtents(int* extent1, int* extent2, int* result);
390 VTK_DEPRECATED_IN_9_5_0("Use std::min instead")
391 int Min(int a, int b);
392 VTK_DEPRECATED_IN_9_5_0("Use std::max instead")
393 int Max(int a, int b);
394 void ComputePointDimensions(int* extent, int* dimensions);
395 void ComputePointIncrements(int* extent, vtkIdType* increments);
396 void ComputeCellDimensions(int* extent, int* dimensions);
397 void ComputeCellIncrements(int* extent, vtkIdType* increments);
398 vtkIdType GetStartTuple(int* extent, vtkIdType* increments, int i, int j, int k);
400 char** CreateStringArray(int numStrings);
401 void DestroyStringArray(int numStrings, char** strings);
403
410 virtual int ReadArrayValues(vtkXMLDataElement* da, vtkIdType arrayIndex, vtkAbstractArray* array,
411 vtkIdType startIndex, vtkIdType numValues, FieldType type = OTHER);
412
421 virtual int ReadArrayTuples(vtkXMLDataElement* da, vtkIdType arrayTupleIndex,
422 vtkAbstractArray* array, vtkIdType startTupleIndex, vtkIdType numTuples,
423 FieldType type = OTHER);
424
429
430 int SetFieldDataInfo(vtkXMLDataElement* eDSA, int association, vtkIdType numTuples,
431 vtkInformationVector*(&infoVector));
432
434
440
445 vtkObject* caller, unsigned long eid, void* clientdata, void* calldata);
446
452
463
464 // The vtkXMLDataParser instance used to hide XML reading details.
466
467 // The FieldData element representation.
469
470 // The input file's name.
471 char* FileName;
472
473 // The stream used to read the input.
474 std::istream* Stream;
475
476 // Whether this object is reading from a string or a file.
477 // Default is 0: read from file.
479
480 // The input string.
481 std::string InputString;
482
483 // The input array. Keeps a low memory footprint by sourcing StringStream from contents of this
484 // array
486
487 // The array selections.
492
498
504
505 // The observer to modify this object when the array selections are
506 // modified.
508
509 // Whether there was an error reading the file in RequestInformation.
511
512 // Whether there was an error reading the file in RequestData.
514
515 // incrementally fine-tuned progress updates.
516 virtual void GetProgressRange(float* range);
517 virtual void SetProgressRange(const float range[2], int curStep, int numSteps);
518 virtual void SetProgressRange(const float range[2], int curStep, const float* fractions);
519 virtual void UpdateProgressDiscrete(float progress);
521
522 virtual int RequestData(vtkInformation* request, vtkInformationVector** inputVector,
523 vtkInformationVector* outputVector);
524 virtual int RequestDataObject(vtkInformation* vtkNotUsed(request),
525 vtkInformationVector** vtkNotUsed(inputVector), vtkInformationVector* vtkNotUsed(outputVector))
526 {
527 return 1;
528 }
529 virtual int RequestInformation(vtkInformation* request, vtkInformationVector** inputVector,
530 vtkInformationVector* outputVector);
532
533 // Whether there was an error reading the XML.
535
536 // For structured data keep track of dimensions empty of cells. For
537 // unstructured data these are always zero. This is used to support
538 // 1-D and 2-D cell data.
539 int AxesEmpty[3];
540
541 // The timestep currently being read.
545 void SetNumberOfTimeSteps(int num);
546 // buffer for reading timestep from the XML file the length is of
547 // NumberOfTimeSteps and therefore is always long enough
549 // Store the range of time steps
551
552 // Now we need to save what was the last time read for each kind of
553 // data to avoid rereading it that is to say we need a var for
554 // e.g. PointData/CellData/Points/Cells...
555 // See SubClass for details with member vars like PointsTimeStep/PointsOffset
556
557 // Helper function useful to know if a timestep is found in an array of timestep
558 static int IsTimeStepInArray(int timestep, int* timesteps, int length);
559
562
563 // Flag for whether DataProgressCallback should actually update
564 // progress.
566
568
569 /*
570 * Populate the output's FieldData with the file's FieldData tags content
571 */
573
574private:
575 int OpenVTKStream();
576
577 // The stream used to read the input if it is in a resource stream
579
580 bool ReadFromInputStream = false;
581
582 // The stream used to read the input if it is in a file.
583 istream* FileStream;
584 // The stream used to read the input if it is in a string.
585 std::istringstream* StringStream;
586
587 // Used when converting vtkResourceStream into istream
588 std::unique_ptr<std::streambuf> Streambuf;
589 std::unique_ptr<std::istream> StreamBuffer;
590
591 int TimeStepWasReadOnce;
592
593 int FileMajorVersion;
594 int FileMinorVersion;
595
596 vtkDataObject* CurrentOutput;
597 vtkInformation* CurrentOutputInformation;
598
599 vtkXMLReader(const vtkXMLReader&) = delete;
600 void operator=(const vtkXMLReader&) = delete;
601
602 vtkCommand* ReaderErrorObserver;
603 vtkCommand* ParserErrorObserver;
604};
605
606VTK_ABI_NAMESPACE_END
607#endif
Abstract superclass for all arrays.
supports function callbacks
dynamic, self-adjusting array of char
superclass for callback/observer methods
Definition vtkCommand.h:384
Store on/off settings for data arrays, etc.
general representation of visualization data
represent and manipulate attribute data in a dataset
abstract class to specify dataset behavior
Definition vtkDataSet.h:166
a simple class to control print indentation
Definition vtkIndent.h:108
Store zero or more vtkInformation instances.
Store vtkAlgorithm input/output information.
Abstract class used for custom streams.
Hold a reference to a vtkObjectBase instance.
a vtkAbstractArray subclass for strings
record modification and/or execution time
Represents an XML element and those nested inside.
Used by vtkXMLReader to parse VTK XML files.
vtkCharArray * InputArray
virtual int ReadArrayTuples(vtkXMLDataElement *da, vtkIdType arrayTupleIndex, vtkAbstractArray *array, vtkIdType startTupleIndex, vtkIdType numTuples, FieldType type=OTHER)
Read an Array values starting at the given tuple index and up to numTuples taking into account the nu...
vtkXMLDataElement * FieldDataElement
vtkCallbackCommand * SelectionObserver
char ** CreateStringArray(int numStrings)
Utility methods for subclasses.
virtual void SetProgressRange(const float range[2], int curStep, int numSteps)
virtual void ConvertGhostLevelsToGhostType(FieldType, vtkAbstractArray *, vtkIdType, vtkIdType)
int GetColumnArrayStatus(const char *name)
Get/Set whether the point, cell, column or time array with the given name is to be read.
virtual int CanReadFileVersion(int major, int minor)
Test if the reader can read a file with the given version number.
void SetInputString(const std::string &input)
Enable reading from an InputString instead of the default, a file.
virtual void GetProgressRange(float *range)
virtual void DestroyXMLParser()
Internal utility methods.
int CellDataArrayIsEnabled(vtkXMLDataElement *eCDA)
Check whether the given array element is an enabled array.
void SetColumnArrayStatus(const char *name, int status)
Get/Set whether the point, cell, column or time array with the given name is to be read.
virtual int ReadArrayValues(vtkXMLDataElement *da, vtkIdType arrayIndex, vtkAbstractArray *array, vtkIdType startIndex, vtkIdType numValues, FieldType type=OTHER)
Read an Array values starting at the given index and up to numValues.
void SetReaderErrorObserver(vtkCommand *)
Set/get the ErrorObserver for the internal reader This is useful for applications that want to catch ...
virtual void SetupOutputInformation(vtkInformation *outInfo)
Setup the output's information.
const char * GetCellArrayName(int index)
Get the name of the point, cell, column or time array with the given index in the input.
vtkDataArraySelection * CellDataArraySelection
virtual void SetupOutputData()
Setup the output's data with allocation.
void ComputeCellIncrements(int *extent, vtkIdType *increments)
Utility methods for subclasses.
int CreateInformationKey(vtkXMLDataElement *eInfoKey, vtkInformation *info)
Create a vtkInformationKey from its corresponding XML representation.
vtkMTimeType GetMTime() override
Overridden to take into account mtime from the internal vtkResourceStream.
void SetDataArraySelections(vtkXMLDataElement *eDSA, vtkDataArraySelection *sel)
Setup the data array selections for the input's set of arrays.
void SetParserErrorObserver(vtkCommand *)
Set/get the ErrorObserver for the internal xml parser This is useful for applications that want to ca...
virtual void SetupEmptyOutput()=0
Setup the output with no data available.
int GetNumberOfTimeDataArrays() const
Getters for time data array candidates.
virtual void SqueezeOutputArrays(vtkDataObject *)
Give concrete classes an option to squeeze any output arrays at the end of RequestData.
virtual void CopyOutputInformation(vtkInformation *outInfo, int port)
int GetNumberOfPointArrays()
Get the number of point, cell or column arrays available in the input.
int Max(int a, int b)
Utility methods for subclasses.
virtual void CreateXMLParser()
Internal utility methods.
vtkSmartPointer< vtkDataArray > TimeDataArray
Populated in ReadXMLInformation from the field data for the array chosen using ActiveTimeDataArrayNam...
vtkResourceStream * GetStream()
Specify resource stream to read from When both Stream and Filename or InputString are set,...
virtual void CloseStream()
Internal utility methods.
int CanReadFileVersionString(const char *version)
Internal utility methods.
void ReadFieldData()
float ProgressRange[2]
vtkIdType GetStartTuple(int *extent, vtkIdType *increments, int i, int j, int k)
Utility methods for subclasses.
const char * GetColumnArrayName(int index)
Get the name of the point, cell, column or time array with the given index in the input.
vtkTypeBool ReadFromInputString
void SetupCompressor(const char *type)
Internal utility methods.
vtkInformation * GetCurrentOutputInformation()
vtkDataArraySelection * ColumnArraySelection
std::istream * Stream
vtkXMLDataParser * XMLParser
virtual const char * GetDataSetName()=0
Get the name of the data set being read.
vtkXMLDataParser * GetXMLParser()
Returns the internal XML parser.
virtual void SetInputArray(vtkCharArray *)
Specify the vtkCharArray to be used when reading from a string.
const char * GetPointArrayName(int index)
Get the name of the point, cell, column or time array with the given index in the input.
void ComputePointIncrements(int *extent, vtkIdType *increments)
Utility methods for subclasses.
virtual int ReadXMLInformation()
Pipeline execution methods to be defined by subclass.
vtkAbstractArray * CreateArray(vtkXMLDataElement *da)
Create a vtkAbstractArray from its corresponding XML representation.
int GetNumberOfColumnArrays()
Get the number of point, cell or column arrays available in the input.
void SetInputString(const char *in, int len)
Enable reading from an InputString instead of the default, a file.
void ReadAttributeIndices(vtkXMLDataElement *eDSA, vtkDataSetAttributes *dsa)
Utility methods for subclasses.
virtual int CanReadFile(const char *name)
Test whether the file (type) with the given name can be read by this reader.
int PointDataArrayIsEnabled(vtkXMLDataElement *ePDA)
Check whether the given array element is an enabled array.
vtkDataSet * GetOutputAsDataSet()
Get the output as a vtkDataSet pointer.
virtual void CloseVTKFile()
Internal utility methods.
virtual int OpenVTKFile()
Internal utility methods.
void SetInputString(const char *in)
Specify the InputString for use when reading from a character array.
vtkTimeStamp ReadMTime
void ComputeCellDimensions(int *extent, int *dimensions)
Utility methods for subclasses.
void SetNumberOfTimeSteps(int num)
virtual int RequestInformation(vtkInformation *request, vtkInformationVector **inputVector, vtkInformationVector *outputVector)
static void SelectionModifiedCallback(vtkObject *caller, unsigned long eid, void *clientdata, void *calldata)
Callback registered with the SelectionObserver.
static int IsTimeStepInArray(int timestep, int *timesteps, int length)
void ComputePointDimensions(int *extent, int *dimensions)
Utility methods for subclasses.
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
int GetNumberOfCellArrays()
Get the number of point, cell or column arrays available in the input.
void MarkIdTypeArrays(vtkXMLDataElement *da)
XML files have not consistently saved out adequate meta-data in past to correctly create vtkIdTypeArr...
~vtkXMLReader() override
virtual int CanReadFileWithDataType(const char *dsname)
This method is used by CanReadFile() to check if the reader can read an XML with the primary element ...
int IntersectExtents(int *extent1, int *extent2, int *result)
Utility methods for subclasses.
char * ActiveTimeDataArrayName
Name of the field-data array used to determine the time for the dataset being read.
virtual int ReadVTKFile(vtkXMLDataElement *eVTKFile)
Read the top-level element from the file.
virtual int OpenVTKString()
Internal utility methods.
virtual int ReadPrimaryElement(vtkXMLDataElement *ePrimary)
Read the primary element from the file.
void SetBinaryInputString(const char *, int len)
Enable reading from an InputString instead of the default, a file.
vtkGetFilePathMacro(FileName)
Get/Set the name of the input file.
int TimeStepRange[2]
int GetLocalDataType(vtkXMLDataElement *da, int datatype)
If the IdType argument is present in the provided XMLDataElement and the provided dataType has the sa...
void SetStream(vtkResourceStream *stream)
Specify resource stream to read from When both Stream and Filename or InputString are set,...
bool ReadInformation(vtkXMLDataElement *infoRoot, vtkInformation *info)
Populates the info object with the InformationKey children in infoRoot.
vtkTypeBool ProcessRequest(vtkInformation *request, vtkInformationVector **inputVector, vtkInformationVector *outputVector) override
Upstream/Downstream requests form the generalized interface through which executives invoke a algorit...
int GetCellArrayStatus(const char *name)
Get/Set whether the point, cell, column or time array with the given name is to be read.
vtkSetFilePathMacro(FileName)
Get/Set the name of the input file.
vtkDataObject * GetCurrentOutput()
int GetPointArrayStatus(const char *name)
Get/Set whether the point, cell, column or time array with the given name is to be read.
const char * GetTimeDataArray(int idx) const
Getters for time data array candidates.
virtual void UpdateProgressDiscrete(float progress)
virtual void ReadXMLData()
Pipeline execution methods to be defined by subclass.
virtual int OpenStream()
Internal utility methods.
vtkStringArray * TimeDataStringArray
virtual int RequestData(vtkInformation *request, vtkInformationVector **inputVector, vtkInformationVector *outputVector)
virtual void SetProgressRange(const float range[2], int curStep, const float *fractions)
void DestroyStringArray(int numStrings, char **strings)
Utility methods for subclasses.
void SetCellArrayStatus(const char *name, int status)
Get/Set whether the point, cell, column or time array with the given name is to be read.
virtual void CloseVTKString()
Internal utility methods.
void SetPointArrayStatus(const char *name, int status)
Get/Set whether the point, cell, column or time array with the given name is to be read.
std::string InputString
vtkDataArraySelection * PointDataArraySelection
vtkDataSet * GetOutputAsDataSet(int index)
Get the output as a vtkDataSet pointer.
int SetFieldDataInfo(vtkXMLDataElement *eDSA, int association, vtkIdType numTuples, vtkInformationVector *(&infoVector))
virtual int RequestDataObject(vtkInformation *request, vtkInformationVector **inputVector, vtkInformationVector *outputVector)
int Min(int a, int b)
Utility methods for subclasses.
int vtkTypeBool
Definition vtkABI.h:64
#define vtkDataArray
#define VTK_DEPRECATED_IN_9_5_0(reason)
int vtkIdType
Definition vtkType.h:368
vtkTypeUInt32 vtkMTimeType
Definition vtkType.h:323
#define VTK_FILEPATH