1 #include "vtkFileSeriesGroupReader.h"
3 #include <vtkInformation.h>
4 #include <vtkInformationVector.h>
5 #include <vtkMultiBlockDataSet.h>
6 #include <vtkObjectFactory.h>
7 #include <vtkSmartPointer.h>
8 #include <vtkStreamingDemandDrivenPipeline.h>
10 #include "vtkMEDReader.h"
15 vtkStandardNewMacro(vtkFileSeriesGroupReader);
17 //=============================================================================
18 struct vtkFileSeriesGroupReaderInternals
20 std::vector<std::string> FileNames;
23 //=============================================================================
24 vtkFileSeriesGroupReader::vtkFileSeriesGroupReader()
25 : Internals(new vtkFileSeriesGroupReaderInternals())
27 this->SetNumberOfInputPorts(0);
28 this->SetNumberOfOutputPorts(1);
31 //-----------------------------------------------------------------------------
32 vtkFileSeriesGroupReader::~vtkFileSeriesGroupReader() = default;
34 //----------------------------------------------------------------------------
35 void vtkFileSeriesGroupReader::AddFileName(const char* name)
37 // Make sure the reader always has a filename set
38 this->ReaderSetFileName(name);
40 this->AddFileNameInternal(name);
44 //----------------------------------------------------------------------------
45 void vtkFileSeriesGroupReader::RemoveAllFileNames()
47 this->RemoveAllFileNamesInternal();
51 //----------------------------------------------------------------------------
52 void vtkFileSeriesGroupReader::RemoveAllFileNamesInternal()
54 this->Internals->FileNames.clear();
57 //----------------------------------------------------------------------------
58 void vtkFileSeriesGroupReader::AddFileNameInternal(const char* name)
60 this->Internals->FileNames.emplace_back(name);
63 //----------------------------------------------------------------------------
64 unsigned int vtkFileSeriesGroupReader::GetNumberOfFileNames()
66 return static_cast<unsigned int>(this->Internals->FileNames.size());
69 //----------------------------------------------------------------------------
70 const char* vtkFileSeriesGroupReader::GetFileName(unsigned int idx)
72 if (idx >= this->Internals->FileNames.size())
76 return this->Internals->FileNames[idx].c_str();
79 //----------------------------------------------------------------------------
80 int vtkFileSeriesGroupReader::CanReadFile(const char* filename)
87 return this->ReaderCanReadFile(filename);
90 //----------------------------------------------------------------------------
91 int vtkFileSeriesGroupReader::RequestInformation(
92 vtkInformation* request, vtkInformationVector** inputVector, vtkInformationVector* outputVector)
94 return this->Reader->ProcessRequest(request, inputVector, outputVector);
97 //----------------------------------------------------------------------------
98 int vtkFileSeriesGroupReader::RequestData(vtkInformation* vtkNotUsed(request),
99 vtkInformationVector** vtkNotUsed(inputVector), vtkInformationVector* outputVector)
101 auto output = vtkMultiBlockDataSet::GetData(outputVector, 0);
102 output->SetNumberOfBlocks(this->GetNumberOfFileNames());
104 vtkInformation* info = outputVector->GetInformationObject(0);
105 double time = info->Get(vtkStreamingDemandDrivenPipeline::UPDATE_TIME_STEP());
107 for (unsigned int i = 0; i < this->GetNumberOfFileNames(); i++)
109 this->ReaderSetFileName(this->GetFileName(i));
110 vtkMEDReader::SafeDownCast(this->Reader)->Reload();
111 this->Reader->UpdateTimeStep(time);
112 vtkDataObject* outputReader = this->Reader->GetOutputDataObject(0);
113 vtkSmartPointer<vtkDataObject> outputLeaf = vtkSmartPointer<vtkDataObject>::Take(outputReader->NewInstance());
114 outputLeaf->DeepCopy(outputReader);
115 output->SetBlock(i, outputLeaf);
121 //------------------------------------------------------------------------------
122 int vtkFileSeriesGroupReader::FillOutputPortInformation(
123 int vtkNotUsed(port), vtkInformation* info)
125 info->Set(vtkDataObject::DATA_TYPE_NAME(), "vtkMultiBlockDataSet");
129 //-----------------------------------------------------------------------------
130 void vtkFileSeriesGroupReader::PrintSelf(ostream& os, vtkIndent indent)
132 this->Superclass::PrintSelf(os, indent);
134 os << indent << "MetaFileName: " << (this->_MetaFileName ? this->_MetaFileName : "(none)")