diff --git a/src/Mod/Fem/App/FemPostFilter.cpp b/src/Mod/Fem/App/FemPostFilter.cpp index 79da85c5a1..932a3d01fe 100644 --- a/src/Mod/Fem/App/FemPostFilter.cpp +++ b/src/Mod/Fem/App/FemPostFilter.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #endif #include @@ -218,6 +219,17 @@ DocumentObjectExecReturn* FemPostFilter::execute() return StdReturn; } +bool FemPostFilter::dataIsAvailable() +{ + auto algo = getFilterOutput(); + if (!algo) { + return false; + } + + vtkInformation* info = algo->GetInputInformation(0, 0); + return bool(info->Has(vtkDataObject::DATA_OBJECT())); +} + vtkSmartPointer FemPostFilter::getInputData() { auto active = m_pipelines[m_activePipeline]; @@ -233,12 +245,21 @@ vtkSmartPointer FemPostFilter::getInputData() if (!algo) { return nullptr; } + + // make sure the data processing is up to date if (Frame.getValue() > 0) { algo->UpdateTimeStep(Frame.getValue()); } else { algo->Update(); } + + // check if the algorithm has data available + vtkInformation* info = algo->GetInputInformation(0, 0); + if (!bool(info->Has(vtkDataObject::DATA_OBJECT()))) { + return nullptr; + } + return vtkDataSet::SafeDownCast(algo->GetOutputDataObject(0)); } @@ -472,6 +493,10 @@ void FemPostDataAlongLineFilter::GetAxisData() std::vector coords; std::vector values; + if (!dataIsAvailable()) { + return; + } + vtkSmartPointer data = m_probe->GetOutputDataObject(0); vtkDataSet* dset = vtkDataSet::SafeDownCast(data); if (!dset) { @@ -597,6 +622,10 @@ short int FemPostDataAtPointFilter::mustExecute() const void FemPostDataAtPointFilter::GetPointData() { + if (!dataIsAvailable()) { + return; + } + std::vector values; vtkSmartPointer data = m_probe->GetOutputDataObject(0); diff --git a/src/Mod/Fem/App/FemPostFilter.h b/src/Mod/Fem/App/FemPostFilter.h index 38499d01d3..9487ba54ba 100644 --- a/src/Mod/Fem/App/FemPostFilter.h +++ b/src/Mod/Fem/App/FemPostFilter.h @@ -62,6 +62,7 @@ class FemExport FemPostFilter: public Fem::FemPostObject PROPERTY_HEADER_WITH_OVERRIDE(Fem::FemPostFilter); protected: + bool dataIsAvailable(); vtkSmartPointer getInputData(); std::vector getInputVectorFields(); std::vector getInputScalarFields();