1 /*=========================================================================
2 
3   Program:   Visualization Toolkit
4   Module:    vtkMultiBlockFromTimeSeriesFilter.cxx
5 
6   Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7   All rights reserved.
8   See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9 
10      This software is distributed WITHOUT ANY WARRANTY; without even
11      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12      PURPOSE.  See the above copyright notice for more information.
13 
14 =========================================================================*/
15 
16 // Hide VTK_DEPRECATED_IN_9_1_0() warnings for this class.
17 #define VTK_DEPRECATION_LEVEL 0
18 
19 #include "vtkMultiBlockFromTimeSeriesFilter.h"
20 
21 #include "vtkInformation.h"
22 #include "vtkInformationVector.h"
23 #include "vtkMultiBlockDataSet.h"
24 #include "vtkObjectFactory.h"
25 #include "vtkStreamingDemandDrivenPipeline.h"
26 
27 vtkStandardNewMacro(vtkMultiBlockFromTimeSeriesFilter);
28 
vtkMultiBlockFromTimeSeriesFilter()29 vtkMultiBlockFromTimeSeriesFilter::vtkMultiBlockFromTimeSeriesFilter()
30 {
31   this->UpdateTimeIndex = 0;
32 }
33 
34 vtkMultiBlockFromTimeSeriesFilter::~vtkMultiBlockFromTimeSeriesFilter() = default;
35 
FillInputPortInformation(int,vtkInformation * info)36 int vtkMultiBlockFromTimeSeriesFilter::FillInputPortInformation(int, vtkInformation* info)
37 {
38   info->Set(vtkAlgorithm::INPUT_REQUIRED_DATA_TYPE(), "vtkDataObject");
39   return 1;
40 }
41 
RequestInformation(vtkInformation * vtkNotUsed (request),vtkInformationVector ** inInfo,vtkInformationVector * outInfoVec)42 int vtkMultiBlockFromTimeSeriesFilter::RequestInformation(vtkInformation* vtkNotUsed(request),
43   vtkInformationVector** inInfo, vtkInformationVector* outInfoVec)
44 {
45   this->UpdateTimeIndex = 0;
46   vtkInformation* info = inInfo[0]->GetInformationObject(0);
47   int len = info->Length(vtkStreamingDemandDrivenPipeline::TIME_STEPS());
48   double* timeSteps = info->Get(vtkStreamingDemandDrivenPipeline::TIME_STEPS());
49   this->TimeSteps.resize(len);
50   std::copy(timeSteps, timeSteps + len, this->TimeSteps.begin());
51   this->TempDataset = vtkSmartPointer<vtkMultiBlockDataSet>::New();
52   this->TempDataset->SetNumberOfBlocks(len);
53 
54   vtkInformation* outInfo = outInfoVec->GetInformationObject(0);
55   outInfo->Remove(vtkStreamingDemandDrivenPipeline::TIME_STEPS());
56   outInfo->Remove(vtkStreamingDemandDrivenPipeline::TIME_RANGE());
57 
58   return 1;
59 }
60 
RequestUpdateExtent(vtkInformation * vtkNotUsed (request),vtkInformationVector ** inInfo,vtkInformationVector * vtkNotUsed (outInfo))61 int vtkMultiBlockFromTimeSeriesFilter::RequestUpdateExtent(vtkInformation* vtkNotUsed(request),
62   vtkInformationVector** inInfo, vtkInformationVector* vtkNotUsed(outInfo))
63 {
64   if (this->TimeSteps.size() > static_cast<size_t>(this->UpdateTimeIndex))
65   {
66     vtkInformation* info = inInfo[0]->GetInformationObject(0);
67     info->Set(
68       vtkStreamingDemandDrivenPipeline::UPDATE_TIME_STEP(), this->TimeSteps[this->UpdateTimeIndex]);
69   }
70   return 1;
71 }
72 
RequestData(vtkInformation * request,vtkInformationVector ** inInfo,vtkInformationVector * outInfo)73 int vtkMultiBlockFromTimeSeriesFilter::RequestData(
74   vtkInformation* request, vtkInformationVector** inInfo, vtkInformationVector* outInfo)
75 {
76   vtkInformation* info = inInfo[0]->GetInformationObject(0);
77   vtkDataObject* data = vtkDataObject::GetData(info);
78   vtkSmartPointer<vtkDataObject> clone = vtkSmartPointer<vtkDataObject>::Take(data->NewInstance());
79   clone->ShallowCopy(data);
80   this->TempDataset->SetBlock(this->UpdateTimeIndex, clone);
81   if (this->UpdateTimeIndex < static_cast<vtkTypeInt64>(this->TimeSteps.size()) - 1)
82   {
83     this->UpdateTimeIndex++;
84     request->Set(vtkStreamingDemandDrivenPipeline::CONTINUE_EXECUTING(), 1);
85   }
86   else
87   {
88     vtkMultiBlockDataSet* output = vtkMultiBlockDataSet::GetData(outInfo);
89     output->ShallowCopy(this->TempDataset);
90     for (unsigned i = 0; i < this->TempDataset->GetNumberOfBlocks(); ++i)
91     {
92       this->TempDataset->SetBlock(i, nullptr);
93     }
94     request->Remove(vtkStreamingDemandDrivenPipeline::CONTINUE_EXECUTING());
95   }
96   return 1;
97 }
98 
PrintSelf(ostream & os,vtkIndent indent)99 void vtkMultiBlockFromTimeSeriesFilter::PrintSelf(ostream& os, vtkIndent indent)
100 {
101   this->Superclass::PrintSelf(os, indent);
102 }
103