From def22ad2349aaf69edd284a52d7d0789a4ebd282 Mon Sep 17 00:00:00 2001 From: marioalexis Date: Mon, 15 Sep 2025 11:22:44 -0300 Subject: [PATCH] Fem: Better VTK version check --- src/Mod/Fem/App/AppFemPy.cpp | 28 ++++++++++++++++++++++ src/Mod/Fem/femguiutils/data_extraction.py | 10 ++++++-- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/Mod/Fem/App/AppFemPy.cpp b/src/Mod/Fem/App/AppFemPy.cpp index e6e42f763c..a63ddc5797 100644 --- a/src/Mod/Fem/App/AppFemPy.cpp +++ b/src/Mod/Fem/App/AppFemPy.cpp @@ -41,6 +41,7 @@ #include "FemPostPipeline.h" #include "FemVTKTools.h" #include +#include #endif #ifdef FC_USE_VTK_PYTHON @@ -83,6 +84,12 @@ public: add_varargs_method("getVtkVersion", &Module::getVtkVersion, "Returns the VTK version FreeCAD is linked against"); + add_varargs_method("getVtkVersionNumber", + &Module::getVtkVersionNumber, + "Returns the VTK version FreeCAD is linked against as a number"); + add_varargs_method("vtkVersionCheck", + &Module::vtkVersionCheck, + "Returns VTK version number from `major`, `minor` and `build` values"); #ifdef FC_USE_VTK_PYTHON add_varargs_method( "isVtkCompatible", @@ -342,6 +349,27 @@ private: return Py::String(fcVtkVersion); } + Py::Object getVtkVersionNumber(const Py::Tuple& args) + { + if (!PyArg_ParseTuple(args.ptr(), "")) { + throw Py::Exception(); + } + + return Py::Long(VTK_VERSION_NUMBER); + } + + Py::Object vtkVersionCheck(const Py::Tuple& args) + { + int major; + int minor; + int build = 0; + if (!PyArg_ParseTuple(args.ptr(), "ii|i", &major, &minor, &build)) { + throw Py::Exception(); + } + + return Py::Long(VTK_VERSION_CHECK(major, minor, build)); + } + #ifdef FC_USE_VTK_PYTHON Py::Object isVtkCompatible(const Py::Tuple& args) { diff --git a/src/Mod/Fem/femguiutils/data_extraction.py b/src/Mod/Fem/femguiutils/data_extraction.py index a64595d3f1..fafb1449b7 100644 --- a/src/Mod/Fem/femguiutils/data_extraction.py +++ b/src/Mod/Fem/femguiutils/data_extraction.py @@ -37,7 +37,11 @@ from vtkmodules.vtkCommonCore import vtkVersion from vtkmodules.vtkCommonDataModel import vtkTable from vtkmodules.vtkFiltersGeneral import vtkSplitColumnComponents -if vtkVersion.GetVTKMajorVersion() >= 9 and vtkVersion.GetVTKMinorVersion() >= 3: +from Fem import vtkVersionCheck + +if vtkVersionCheck( + vtkVersion.GetVTKMajorVersion(), vtkVersion.GetVTKMinorVersion() +) >= vtkVersionCheck(9, 3): from vtkmodules.vtkFiltersCore import vtkAttributeDataToTableFilter else: from vtkmodules.vtkInfovisCore import vtkDataObjectToTable @@ -125,7 +129,9 @@ class DataExtraction(_BasePostTaskPanel): if not algo: self.data_model.setTable(vtkTable()) - if vtkVersion.GetVTKMajorVersion() >= 9 and vtkVersion.GetVTKMinorVersion() >= 3: + if vtkVersionCheck( + vtkVersion.GetVTKMajorVersion(), vtkVersion.GetVTKMinorVersion() + ) >= vtkVersionCheck(9, 3): filter = vtkAttributeDataToTableFilter() else: filter = vtkDataObjectToTable()