From 05af64ae9e8f97fc29dce1897286c40eb2dbcb79 Mon Sep 17 00:00:00 2001 From: Uwe Date: Wed, 15 Feb 2023 00:34:56 +0100 Subject: [PATCH] [FEM] improve checks for datasets - check if datasets exists before we access them - speed up the check for the datatype by testing after the downcast --- src/Mod/Fem/App/FemPostFilter.cpp | 34 ++++++++++--------- src/Mod/Fem/App/FemPostObject.cpp | 5 +-- src/Mod/Fem/Gui/ViewProviderFemPostObject.cpp | 2 ++ .../Fem/Gui/ViewProviderFemPostPipeline.cpp | 5 ++- 4 files changed, 25 insertions(+), 21 deletions(-) diff --git a/src/Mod/Fem/App/FemPostFilter.cpp b/src/Mod/Fem/App/FemPostFilter.cpp index 3cce6ff056..19b5a6abe1 100644 --- a/src/Mod/Fem/App/FemPostFilter.cpp +++ b/src/Mod/Fem/App/FemPostFilter.cpp @@ -239,6 +239,8 @@ void FemPostDataAlongLineFilter::GetAxisData() vtkSmartPointer data = m_probe->GetOutputDataObject(0); vtkDataSet* dset = vtkDataSet::SafeDownCast(data); + if (!dset) + return; vtkDataArray* pdata = dset->GetPointData()->GetArray(PlotData.getValue()); // VTK cannot deliver data when the filer relies e.g. on a scalar clip filter // whose value is set so that all data are clipped @@ -357,6 +359,8 @@ void FemPostDataAtPointFilter::GetPointData() vtkSmartPointer data = m_probe->GetOutputDataObject(0); vtkDataSet* dset = vtkDataSet::SafeDownCast(data); + if (!dset) + return; vtkDataArray* pdata = dset->GetPointData()->GetArray(FieldName.getValue()); // VTK cannot deliver data when the filer relies e.g. on a scalar clip filter // whose value is set so that all data are clipped @@ -511,6 +515,8 @@ DocumentObjectExecReturn* FemPostContoursFilter::execute() // delete contour field vtkSmartPointer data = getInputData(); vtkDataSet* dset = vtkDataSet::SafeDownCast(data); + if (!dset) + return returnObject; dset->GetPointData()->RemoveArray(contourFieldName.c_str()); // refresh fields to reflect the deletion if (!m_blockPropertyChanges) @@ -536,11 +542,10 @@ void FemPostContoursFilter::onChanged(const Property* prop) // get the field and its data vtkSmartPointer data = getInputData(); - if (!data || !data->IsA("vtkDataSet")) - return; vtkDataSet* dset = vtkDataSet::SafeDownCast(data); + if (!dset) + return; vtkDataArray* pdata = dset->GetPointData()->GetArray(Field.getValueAsString()); - if (!pdata) return; if (pdata->GetNumberOfComponents() == 1) { @@ -637,11 +642,11 @@ void FemPostContoursFilter::refreshFields() std::vector FieldsArray; vtkSmartPointer data = getInputData(); - if (!data || !data->IsA("vtkDataSet")) { + vtkDataSet* dset = vtkDataSet::SafeDownCast(data); + if (!dset) { m_blockPropertyChanges = false; return; } - vtkDataSet* dset = vtkDataSet::SafeDownCast(data); vtkPointData* pd = dset->GetPointData(); // get all fields @@ -676,11 +681,11 @@ void FemPostContoursFilter::refreshVectors() m_blockPropertyChanges = true; vtkSmartPointer data = getInputData(); - if (!data || !data->IsA("vtkDataSet")) { + vtkDataSet* dset = vtkDataSet::SafeDownCast(data); + if (!dset) { m_blockPropertyChanges = false; return; } - vtkDataSet* dset = vtkDataSet::SafeDownCast(data); vtkDataArray* fieldArray = dset->GetPointData()->GetArray(Field.getValueAsString()); if (!fieldArray) { m_blockPropertyChanges = false; @@ -807,10 +812,9 @@ DocumentObjectExecReturn* FemPostScalarClipFilter::execute() std::vector ScalarsArray; vtkSmartPointer data = getInputData(); - if (!data || !data->IsA("vtkDataSet")) - return StdReturn; - vtkDataSet* dset = vtkDataSet::SafeDownCast(data); + if (!dset) + return StdReturn; vtkPointData* pd = dset->GetPointData(); // get all scalar fields @@ -864,10 +868,9 @@ short int FemPostScalarClipFilter::mustExecute() const void FemPostScalarClipFilter::setConstraintForField() { vtkSmartPointer data = getInputData(); - if (!data || !data->IsA("vtkDataSet")) - return; - vtkDataSet* dset = vtkDataSet::SafeDownCast(data); + if (!dset) + return; vtkDataArray* pdata = dset->GetPointData()->GetArray(Scalars.getValueAsString()); // VTK cannot deliver data when the filer relies e.g. on a cut clip filter @@ -916,10 +919,9 @@ DocumentObjectExecReturn* FemPostWarpVectorFilter::execute() std::vector VectorArray; vtkSmartPointer data = getInputData(); - if (!data || !data->IsA("vtkDataSet")) - return StdReturn; - vtkDataSet* dset = vtkDataSet::SafeDownCast(data); + if (!dset) + return StdReturn; vtkPointData* pd = dset->GetPointData(); // get all vector fields diff --git a/src/Mod/Fem/App/FemPostObject.cpp b/src/Mod/Fem/App/FemPostObject.cpp index 17d40d48db..3ad500a685 100644 --- a/src/Mod/Fem/App/FemPostObject.cpp +++ b/src/Mod/Fem/App/FemPostObject.cpp @@ -48,8 +48,9 @@ vtkBoundingBox FemPostObject::getBoundingBox() { vtkBoundingBox box; - if (Data.getValue() && Data.getValue()->IsA("vtkDataSet")) - box.AddBounds(vtkDataSet::SafeDownCast(Data.getValue())->GetBounds()); + vtkDataSet* dset = vtkDataSet::SafeDownCast(Data.getValue()); + if (dset) + box.AddBounds(dset->GetBounds()); // TODO: add calculation of multiblock and Multipiece datasets diff --git a/src/Mod/Fem/Gui/ViewProviderFemPostObject.cpp b/src/Mod/Fem/Gui/ViewProviderFemPostObject.cpp index 9b9ebfdc1b..9e9a164974 100644 --- a/src/Mod/Fem/Gui/ViewProviderFemPostObject.cpp +++ b/src/Mod/Fem/Gui/ViewProviderFemPostObject.cpp @@ -634,6 +634,8 @@ bool ViewProviderFemPostObject::setupPipeline() // add a field with an absolute value vtkSmartPointer SPdata = data; vtkDataSet* dset = vtkDataSet::SafeDownCast(SPdata); + if (!dset) + return false; std::string FieldName; auto numFields = dset->GetPointData()->GetNumberOfArrays(); for (int i = 0; i < numFields; ++i) { diff --git a/src/Mod/Fem/Gui/ViewProviderFemPostPipeline.cpp b/src/Mod/Fem/Gui/ViewProviderFemPostPipeline.cpp index b59aa56c42..a3e3c0d9e6 100644 --- a/src/Mod/Fem/Gui/ViewProviderFemPostPipeline.cpp +++ b/src/Mod/Fem/Gui/ViewProviderFemPostPipeline.cpp @@ -155,10 +155,9 @@ void ViewProviderFemPostPipeline::transformField(char *FieldName, double FieldFa Fem::FemPostPipeline *obj = static_cast(getObject()); vtkSmartPointer data = obj->Data.getValue(); - if (!data || !data->IsA("vtkDataSet")) - return; - vtkDataSet *dset = vtkDataSet::SafeDownCast(data); + if (!dset) + return; vtkDataArray *pdata = dset->GetPointData()->GetArray(FieldName); if (!pdata) return;