git: 56823f691a68 - main - cad/freecad: update to 1.1 (rc3)

From: Christoph Moench-Tegeder <cmt_at_FreeBSD.org>
Date: Sat, 21 Mar 2026 11:08:45 UTC
The branch main has been updated by cmt:

URL: https://cgit.FreeBSD.org/ports/commit/?id=56823f691a68838ec9924aaafb6f96a7c8d7447b

commit 56823f691a68838ec9924aaafb6f96a7c8d7447b
Author:     Christoph Moench-Tegeder <cmt@FreeBSD.org>
AuthorDate: 2026-03-21 11:05:15 +0000
Commit:     Christoph Moench-Tegeder <cmt@FreeBSD.org>
CommitDate: 2026-03-21 11:05:15 +0000

    cad/freecad: update to 1.1 (rc3)
    
    Announcement: https://github.com/FreeCAD/FreeCAD/releases/tag/1.1rc3
    
    This allows for "easy" unbreaking of the port against VTK 9.6, and at
    this point I belive the risk of using this RC is less than the risk
    of adapting the vtk-9.6-compat patches.
---
 cad/freecad/Makefile                               |   33 +-
 cad/freecad/distinfo                               |   12 +-
 .../files/patch-src_CXX_Python3_Objects.hxx        |   20 -
 ...atch-src_Gui_GuiApplicationNativeEventAware.cpp |   18 -
 cad/freecad/files/patch-src_Gui_Selection.h        |   10 -
 cad/freecad/files/patch-src_Gui_SoFCSelection.h    |   11 -
 .../files/patch-src_Gui_SoFCUnifiedSelection.h     |   10 -
 cad/freecad/files/patch-vtk96-compat               | 1088 ++++++++++++++++++++
 cad/freecad/pkg-plist                              | 1083 +++++++++++++------
 9 files changed, 1890 insertions(+), 395 deletions(-)

diff --git a/cad/freecad/Makefile b/cad/freecad/Makefile
index 447f2ac4ca89..1a907d45ffc0 100644
--- a/cad/freecad/Makefile
+++ b/cad/freecad/Makefile
@@ -1,6 +1,5 @@
 PORTNAME=	FreeCAD
-DISTVERSION=	1.0.2
-PORTREVISION=	8
+DISTVERSION=	1.1rc3
 CATEGORIES=	cad
 
 MAINTAINER=	cmt@FreeBSD.org
@@ -10,8 +9,6 @@ WWW=		https://www.freecadweb.org/
 LICENSE=	LGPL20+
 LICENSE_FILE=	${WRKSRC}/LICENSE
 
-BROKEN=		incompatible with VTK 9.6.0
-
 CONFLICTS_INSTALL=	freecad-devel # bin/FreeCAD
 
 BUILD_DEPENDS=	doxygen:devel/doxygen \
@@ -19,7 +16,6 @@ BUILD_DEPENDS=	doxygen:devel/doxygen \
 		${PYTHON_PKGNAMEPREFIX}pyside6-tools>0:devel/pyside6-tools@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}pivy>0:graphics/py-pivy@${PY_FLAVOR} \
 		${PYTHON_SITELIBDIR}/matplotlib/__init__.py:math/py-matplotlib@${PY_FLAVOR} \
-		${PYTHON_INCLUDEDIR}/CXX/Config.hxx:devel/py-cxx \
 		microsoft-gsl>0:devel/microsoft-gsl \
 		googletest>0:devel/googletest \
 		swig:devel/swig
@@ -50,23 +46,29 @@ LIB_DEPENDS=	libexpat.so:textproc/expat2 \
 RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}pivy>0:graphics/py-pivy@${PY_FLAVOR} \
 		${PYTHON_SITELIBDIR}/matplotlib/__init__.py:math/py-matplotlib@${PY_FLAVOR}
 
-USES=		dos2unix compiler:c++17-lang cmake cpe gl eigen:3 fortran gmake jpeg \
+PORTSCOUT=	limit:^[0-9\.]*$$
+
+USES=		dos2unix compiler:c++20-lang cmake cpe gl eigen:3 fortran gmake jpeg \
 		localbase:ldflags mpi:openmpi pkgconfig python localbase qt:6 xorg \
 		desktop-file-utils shared-mime-info shebangfix
 USE_GITHUB=	yes
-GH_ACCOUNT=	Ondsel-Development:ondselsolver
-GH_PROJECT=	OndselSolver:ondselsolver
-GH_TAGNAME=	91f70382beeb58b32432b5a82da3802e4c19199c:ondselsolver
-GH_SUBDIR=	src/3rdParty/OndselSolver:ondselsolver
+GH_ACCOUNT=	FreeCAD:ondselsolver \
+		FreeCAD:addonmgr
+GH_PROJECT=	OndselSolver:ondselsolver \
+		AddonManager:addonmgr
+GH_TAGNAME=	30e9b64e8bf881d438d4b88834f9ba3674865418:ondselsolver \
+		937b6877239dc78ef59eeefe8099e5f14243eda1:addonmgr
+GH_SUBDIR=	src/3rdParty/OndselSolver:ondselsolver \
+		src/Mod/AddonManager:addonmgr
 USE_XORG=	ice sm x11 xext xt
 USE_GL=		gl glu
-USE_QT=		base declarative location svg tools webchannel
+USE_QT=		base declarative svg tools
 USE_LDCONFIG=	yes
 
 CPE_VENDOR=	freecad_project
 
 DOS2UNIX_GLOB=	*.txt *.h *.cpp *.py *.qss *.csv *.pov *.stp *.ui *.wrl *.WRL
-SHEBANG_FILES=	src/Tools/freecad-thumbnailer
+SHEBANG_FILES=	src/Tools/freecad-thumbnailer.in
 
 # our HDF5/CMake integration is messy, so workarounds are required below
 CMAKE_ARGS+=	-DOCC_INCLUDE_DIR="${LOCALBASE}/include/OpenCASCADE" \
@@ -76,7 +78,6 @@ CMAKE_ARGS+=	-DOCC_INCLUDE_DIR="${LOCALBASE}/include/OpenCASCADE" \
 		-DPYTHON_INCLUDE_DIR="${PYTHON_INCLUDEDIR}" \
 		-DPYTHON_PACKAGES_PATH="${PYTHON_SITELIBDIR}" \
 		-DPYTHON_EXECUTABLE="${PYTHON_CMD}" \
-		-DPYCXX_INCLUDE_DIR="${PYTHON_INCLUDEDIR}" \
 		-DBUILD_ASSEMBLY="ON" \
 		-DBUILD_DESIGNER_PLUGIN="ON" \
 		-DBUILD_FLAT_MESH="ON" \
@@ -100,13 +101,11 @@ CMAKE_ARGS+=	-DOCC_INCLUDE_DIR="${LOCALBASE}/include/OpenCASCADE" \
 		-DHDF5_INCLUDE_DIRS="${LOCALBASE}/include/hdf5" \
 		-DHDF5_LIBRARIES="-L${LOCALBASE}/lib -lhdf5" \
 		-DHDF5_LIBRARY_DIRS="${LOCALBASE}/lib" \
-		-DBUILD_ENABLE_CXX_STD=C++17 \
+		-DBUILD_ENABLE_CXX_STD=C++20 \
 		-DXDG_DATADIR="${PREFIX}/share"
 
 CMAKE_INSTALL_PREFIX=	${PREFIX}/${PORTNAME}
 
-CXXFLAGS+=	-DGetCellLinks=GetLinks # fix for vtk-9.5.0: equivalent of this patch: https://github.com/FreeCAD/FreeCAD/issues/21731#issuecomment-2934487147
-
 OPTIONS_DEFINE=	COLLADA
 
 COLLADA_DESC=		Install pycollada for Collada files import
@@ -133,8 +132,6 @@ pre-configure:
 post-install:
 	${LN} -s ../${PORTNAME}/bin/FreeCAD ${STAGEDIR}${LOCALBASE}/bin/FreeCAD
 	${LN} -s ../${PORTNAME}/bin/FreeCADCmd ${STAGEDIR}${LOCALBASE}/bin/FreeCADCmd
-	${INSTALL_SCRIPT} ${WRKSRC}/src/Tools/freecad-thumbnailer \
-		${STAGEDIR}${PREFIX}/bin/freecad-thumbnailer
 
 .include <../../math/vtk9/Makefile.version>
 .include <bsd.port.mk>
diff --git a/cad/freecad/distinfo b/cad/freecad/distinfo
index 2cb103f96243..3a6d0bf5700f 100644
--- a/cad/freecad/distinfo
+++ b/cad/freecad/distinfo
@@ -1,5 +1,7 @@
-TIMESTAMP = 1754430856
-SHA256 (FreeCAD-FreeCAD-1.0.2_GH0.tar.gz) = 228ee52f00627c7d8fa61998179deb01865ece69390829feb1300228d24f7e9e
-SIZE (FreeCAD-FreeCAD-1.0.2_GH0.tar.gz) = 91635756
-SHA256 (Ondsel-Development-OndselSolver-91f70382beeb58b32432b5a82da3802e4c19199c_GH0.tar.gz) = 061f651f503f1ec5a9814e174cdb8a9ba84d511a3b8be3d94852e84976c6b158
-SIZE (Ondsel-Development-OndselSolver-91f70382beeb58b32432b5a82da3802e4c19199c_GH0.tar.gz) = 4667938
+TIMESTAMP = 1774088438
+SHA256 (FreeCAD-FreeCAD-1.1rc3_GH0.tar.gz) = acbb1abc5891b1b8551df894976f2716809f5896213880054086fa74edfced67
+SIZE (FreeCAD-FreeCAD-1.1rc3_GH0.tar.gz) = 90152538
+SHA256 (FreeCAD-OndselSolver-30e9b64e8bf881d438d4b88834f9ba3674865418_GH0.tar.gz) = 77646ca7d8cbc6dc4e8304439be2ff2b9aecf397e6349e63b3b06e65dfed79c3
+SIZE (FreeCAD-OndselSolver-30e9b64e8bf881d438d4b88834f9ba3674865418_GH0.tar.gz) = 4667790
+SHA256 (FreeCAD-AddonManager-937b6877239dc78ef59eeefe8099e5f14243eda1_GH0.tar.gz) = 70b2fa7f3c58c0ea5be830de90d33369670ee6658f13aeb7684f1ea478528178
+SIZE (FreeCAD-AddonManager-937b6877239dc78ef59eeefe8099e5f14243eda1_GH0.tar.gz) = 849951
diff --git a/cad/freecad/files/patch-src_CXX_Python3_Objects.hxx b/cad/freecad/files/patch-src_CXX_Python3_Objects.hxx
deleted file mode 100644
index 1bca4004ca3c..000000000000
--- a/cad/freecad/files/patch-src_CXX_Python3_Objects.hxx
+++ /dev/null
@@ -1,20 +0,0 @@
---- src/CXX/Python3/Objects.hxx.orig	2024-11-18 16:48:00 UTC
-+++ src/CXX/Python3/Objects.hxx
-@@ -1787,7 +1787,7 @@ namespace Py
-     typedef std::basic_string<Py_UNICODE> unicodestring;
-     extern Py_UNICODE unicode_null_string[1];
- #endif
--    typedef std::basic_string<Py_UCS4> ucs4string;
-+    typedef std::basic_string<char32_t> ucs4string;
-     extern Py_UCS4 ucs4_null_string[1];
- 
-     class PYCXX_EXPORT Byte: public Object
-@@ -2237,7 +2237,7 @@ namespace Py
-             {
-                 ifPyErrorThrowCxxException();
-             }
--            ucs4string ucs4( buf, size() );
-+            ucs4string ucs4( reinterpret_cast<const char32_t*>(buf), size() );
-             delete[] buf;
- 
-             return ucs4;
diff --git a/cad/freecad/files/patch-src_Gui_GuiApplicationNativeEventAware.cpp b/cad/freecad/files/patch-src_Gui_GuiApplicationNativeEventAware.cpp
deleted file mode 100644
index a46ce349429f..000000000000
--- a/cad/freecad/files/patch-src_Gui_GuiApplicationNativeEventAware.cpp
+++ /dev/null
@@ -1,18 +0,0 @@
-commit 8ae0abfd1d044c295c939c032790a7c4e3e960c0
-Author: Christoph Moench-Tegeder <cmt@FreeBSD.org>
-
-    enable spnav on FreeBSD, too
-
-diff --git src/Gui/GuiApplicationNativeEventAware.cpp src/Gui/GuiApplicationNativeEventAware.cpp
-index 622f38ea47..9e02558875 100644
---- src/Gui/GuiApplicationNativeEventAware.cpp
-+++ src/Gui/GuiApplicationNativeEventAware.cpp
-@@ -33,7 +33,7 @@
- 
- 
- #if defined(_USE_3DCONNEXION_SDK) || defined(SPNAV_FOUND)
--#if defined(Q_OS_LINUX)
-+#if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD)
-   #if defined(SPNAV_USE_X11)
-     #include "3Dconnexion/GuiNativeEventLinuxX11.h"
-   #else
diff --git a/cad/freecad/files/patch-src_Gui_Selection.h b/cad/freecad/files/patch-src_Gui_Selection.h
deleted file mode 100644
index ad1415c0ba03..000000000000
--- a/cad/freecad/files/patch-src_Gui_Selection.h
+++ /dev/null
@@ -1,10 +0,0 @@
---- src/Gui/Selection.h.orig	2024-03-20 18:17:17 UTC
-+++ src/Gui/Selection.h
-@@ -25,6 +25,7 @@
- #define GUI_SELECTION_H
- 
- #include <deque>
-+#include <array>
- #include <list>
- #include <string>
- #include <vector>
diff --git a/cad/freecad/files/patch-src_Gui_SoFCSelection.h b/cad/freecad/files/patch-src_Gui_SoFCSelection.h
deleted file mode 100644
index 0d09d72c281f..000000000000
--- a/cad/freecad/files/patch-src_Gui_SoFCSelection.h
+++ /dev/null
@@ -1,11 +0,0 @@
---- ./src/Gui/SoFCSelection.h.orig	2023-01-21 22:41:40.507560000 +0100
-+++ ./src/Gui/SoFCSelection.h	2023-01-21 22:42:27.657720000 +0100
-@@ -35,6 +35,8 @@
- # include <GL/gl.h>
- # endif
- 
-+#include <array>
-+
- #include <Inventor/elements/SoLazyElement.h>
- #include <Inventor/fields/SoSFBool.h>
- #include <Inventor/fields/SoSFColor.h>
diff --git a/cad/freecad/files/patch-src_Gui_SoFCUnifiedSelection.h b/cad/freecad/files/patch-src_Gui_SoFCUnifiedSelection.h
deleted file mode 100644
index d4ac79b033a9..000000000000
--- a/cad/freecad/files/patch-src_Gui_SoFCUnifiedSelection.h
+++ /dev/null
@@ -1,10 +0,0 @@
---- src/Gui/SoFCUnifiedSelection.h.orig	2023-01-21 23:07:09.710205000 +0100
-+++ src/Gui/SoFCUnifiedSelection.h	2023-01-21 23:07:38.508972000 +0100
-@@ -23,6 +23,7 @@
- #ifndef GUI_SOFCUNIFIEDSELECTION_H
- #define GUI_SOFCUNIFIEDSELECTION_H
- 
-+#include <array>
- #include <list>
- #include <unordered_map>
- #include <unordered_set>
diff --git a/cad/freecad/files/patch-vtk96-compat b/cad/freecad/files/patch-vtk96-compat
new file mode 100644
index 000000000000..32693854ed9c
--- /dev/null
+++ b/cad/freecad/files/patch-vtk96-compat
@@ -0,0 +1,1088 @@
+# git diff --no-prefix c25a8fe..a141f8a
+Author: Max Wilfinger <6246609+maxwxyz@users.noreply.github.com>
+Date:   Thu Jan 15 10:01:38 2026 +0100
+
+    Merge pull request #25825 from Lgt2x/vtk-compatibility
+
+    SMESH: Patch for VTK 9.6 compatibility
+
+diff --git src/3rdParty/salomesmesh/inc/SMDS_MeshElement.hxx src/3rdParty/salomesmesh/inc/SMDS_MeshElement.hxx
+index d97a37bc51..184e10d9c1 100644
+--- src/3rdParty/salomesmesh/inc/SMDS_MeshElement.hxx
++++ src/3rdParty/salomesmesh/inc/SMDS_MeshElement.hxx
+@@ -45,11 +45,7 @@
+ //typedef unsigned short UShortType;
+ typedef short ShortType;
+ typedef int   LongType;
+-#ifdef VTK_CELL_ARRAY_V2
+ typedef const vtkIdType* vtkIdTypePtr;
+-#else
+-typedef vtkIdType* vtkIdTypePtr;
+-#endif
+ class SMDS_MeshNode;
+ class SMDS_MeshEdge;
+ class SMDS_MeshFace;
+diff --git src/3rdParty/salomesmesh/inc/SMDS_UnstructuredGrid.hxx src/3rdParty/salomesmesh/inc/SMDS_UnstructuredGrid.hxx
+index f02337cf52..e8bfa90f4e 100644
+--- src/3rdParty/salomesmesh/inc/SMDS_UnstructuredGrid.hxx
++++ src/3rdParty/salomesmesh/inc/SMDS_UnstructuredGrid.hxx
+@@ -28,6 +28,7 @@
+ 
+ #include <vtkUnstructuredGrid.h>
+ #include <vtkCellLinks.h>
++#include <vtkVersion.h>
+ 
+ #include <vector>
+ #include <set>
+@@ -95,14 +96,10 @@ public:
+                                        std::map<int, std::map<long,int> >& nodeQuadDomains);
+   vtkCellLinks* GetLinks()
+   {
+-#ifdef VTK_CELL_ARRAY_V2
+-  #if VTK_VERSION_NUMBER_QUICK >= 90300000000
++#if VTK_VERSION_NUMBER >= VTK_VERSION_CHECK(9, 2, 20221112)
+     return static_cast<vtkCellLinks*>(vtkUnstructuredGrid::GetLinks());
+-  #else
+-    return static_cast<vtkCellLinks*>(GetCellLinks());
+-  #endif
+ #else
+-    return Links;
++    return static_cast<vtkCellLinks*>(GetCellLinks());
+ #endif
+   }
+   SMDS_Downward* getDownArray(unsigned char vtkType)
+diff --git src/3rdParty/salomesmesh/src/SMDS/SMDS_BallElement.cpp src/3rdParty/salomesmesh/src/SMDS/SMDS_BallElement.cpp
+index c5fd8c91cd..e257960ac6 100644
+--- src/3rdParty/salomesmesh/src/SMDS/SMDS_BallElement.cpp
++++ src/3rdParty/salomesmesh/src/SMDS/SMDS_BallElement.cpp
+@@ -67,16 +67,9 @@ void SMDS_BallElement::SetDiameter(double diameter)
+ bool SMDS_BallElement::ChangeNode (const SMDS_MeshNode * node)
+ {
+   vtkUnstructuredGrid* grid = SMDS_Mesh::_meshList[myMeshId]->getGrid();
+-#ifdef VTK_CELL_ARRAY_V2
+   vtkNew<vtkIdList> cellPoints;
+   grid->GetCellPoints(myVtkID, cellPoints.GetPointer());
+   cellPoints->SetId(0, node->getVtkId());
+-#else
+-  vtkIdType npts = 0;
+-  vtkIdType* pts = 0;
+-  grid->GetCellPoints(myVtkID, npts, pts);
+-  pts[0] = node->getVtkId();
+-#endif
+   SMDS_Mesh::_meshList[myMeshId]->setMyModified();
+   return true;
+ }
+diff --git src/3rdParty/salomesmesh/src/SMDS/SMDS_Mesh.cpp src/3rdParty/salomesmesh/src/SMDS/SMDS_Mesh.cpp
+index baa6eadc93..a076d2fb6f 100644
+--- src/3rdParty/salomesmesh/src/SMDS/SMDS_Mesh.cpp
++++ src/3rdParty/salomesmesh/src/SMDS/SMDS_Mesh.cpp
+@@ -53,6 +53,7 @@
+ #include <vtkCell.h>
+ #include <vtkCellLinks.h>
+ #include <vtkIdList.h>
++#include <vtkVersion.h>
+ 
+ #include <algorithm>
+ #include <map>
+@@ -283,7 +284,11 @@ SMDS_BallElement* SMDS_Mesh::AddBallWithID(const SMDS_MeshNode * n, double diame
+   ball->init(n->getVtkId(), diameter, this);
+   if (!this->registerElement(ID,ball))
+   {
++#if VTK_VERSION_NUMBER >= VTK_VERSION_CHECK(9, 5, 20251004)
++    this->myGrid->GetCellTypes()->SetTuple1(ball->getVtkId(), VTK_EMPTY_CELL);
++#else
+     this->myGrid->GetCellTypesArray()->SetValue(ball->getVtkId(), VTK_EMPTY_CELL);
++#endif
+     myBallPool->destroy(ball);
+     return 0;
+   }
+@@ -343,7 +348,11 @@ SMDS_MeshEdge* SMDS_Mesh::AddEdgeWithID(const SMDS_MeshNode * n1,
+   edgevtk->init(nodeIds, this);
+   if (!this->registerElement(ID,edgevtk))
+     {
++#if VTK_VERSION_NUMBER >= VTK_VERSION_CHECK(9, 5, 20251004)
++      this->myGrid->GetCellTypes()->SetTuple1(edgevtk->getVtkId(), VTK_EMPTY_CELL);
++#else
+       this->myGrid->GetCellTypesArray()->SetValue(edgevtk->getVtkId(), VTK_EMPTY_CELL);
++#endif
+       myEdgePool->destroy(edgevtk);
+       return 0;
+     }
+@@ -627,7 +636,11 @@ SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
+     volvtk->init(myNodeIds, this);
+     if (!this->registerElement(ID,volvtk))
+     {
++#if VTK_VERSION_NUMBER >= VTK_VERSION_CHECK(9, 5, 20251004)
++    this->myGrid->GetCellTypes()->SetTuple1(volvtk->getVtkId(), VTK_EMPTY_CELL);
++#else
+       this->myGrid->GetCellTypesArray()->SetValue(volvtk->getVtkId(), VTK_EMPTY_CELL);
++#endif
+       myVolumePool->destroy(volvtk);
+       return 0;
+     }
+@@ -734,7 +747,11 @@ SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
+     volvtk->init(myNodeIds, this);
+     if (!this->registerElement(ID,volvtk))
+     {
++#if VTK_VERSION_NUMBER >= VTK_VERSION_CHECK(9, 5, 20251004)
++      this->myGrid->GetCellTypes()->SetTuple1(volvtk->getVtkId(), VTK_EMPTY_CELL);
++#else
+       this->myGrid->GetCellTypesArray()->SetValue(volvtk->getVtkId(), VTK_EMPTY_CELL);
++#endif
+       myVolumePool->destroy(volvtk);
+       return 0;
+     }
+@@ -847,7 +864,11 @@ SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
+     volvtk->init(myNodeIds, this);
+     if (!this->registerElement(ID,volvtk))
+     {
++#if VTK_VERSION_NUMBER >= VTK_VERSION_CHECK(9, 5, 20251004)
++      this->myGrid->GetCellTypes()->SetTuple1(volvtk->getVtkId(), VTK_EMPTY_CELL);
++#else
+       this->myGrid->GetCellTypesArray()->SetValue(volvtk->getVtkId(), VTK_EMPTY_CELL);
++#endif
+       myVolumePool->destroy(volvtk);
+       return 0;
+     }
+@@ -982,7 +1003,11 @@ SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
+     volvtk->init(myNodeIds, this);
+     if (!this->registerElement(ID,volvtk))
+     {
++#if VTK_VERSION_NUMBER >= VTK_VERSION_CHECK(9, 5, 20251004)
++      this->myGrid->GetCellTypes()->SetTuple1(volvtk->getVtkId(), VTK_EMPTY_CELL);
++#else
+       this->myGrid->GetCellTypesArray()->SetValue(volvtk->getVtkId(), VTK_EMPTY_CELL);
++#endif
+       myVolumePool->destroy(volvtk);
+       return 0;
+     }
+@@ -1104,7 +1129,11 @@ SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
+     volvtk->init(myNodeIds, this);
+     if (!this->registerElement(ID,volvtk))
+     {
++#if VTK_VERSION_NUMBER >= VTK_VERSION_CHECK(9, 5, 20251004)
++      this->myGrid->GetCellTypes()->SetTuple1(volvtk->getVtkId(), VTK_EMPTY_CELL);
++#else
+       this->myGrid->GetCellTypesArray()->SetValue(volvtk->getVtkId(), VTK_EMPTY_CELL);
++#endif
+       myVolumePool->destroy(volvtk);
+       return 0;
+     }
+@@ -1307,7 +1336,11 @@ SMDS_Mesh::AddPolygonalFaceWithID (const vector<const SMDS_MeshNode*> & nodes,
+     facevtk->initPoly(myNodeIds, this);
+     if (!this->registerElement(ID,facevtk))
+     {
++#if VTK_VERSION_NUMBER >= VTK_VERSION_CHECK(9, 5, 20251004)
++      this->myGrid->GetCellTypes()->SetTuple1(facevtk->getVtkId(), VTK_EMPTY_CELL);
++#else
+       this->myGrid->GetCellTypesArray()->SetValue(facevtk->getVtkId(), VTK_EMPTY_CELL);
++#endif
+       myFacePool->destroy(facevtk);
+       return 0;
+     }
+@@ -1372,7 +1405,11 @@ SMDS_Mesh::AddQuadPolygonalFaceWithID (const vector<const SMDS_MeshNode*> & node
+     facevtk->initQuadPoly(myNodeIds, this);
+     if (!this->registerElement(ID,facevtk))
+     {
++#if VTK_VERSION_NUMBER >= VTK_VERSION_CHECK(9, 5, 20251004)
++      this->myGrid->GetCellTypes()->SetTuple1(facevtk->getVtkId(), VTK_EMPTY_CELL);
++#else
+       this->myGrid->GetCellTypesArray()->SetValue(facevtk->getVtkId(), VTK_EMPTY_CELL);
++#endif
+       myFacePool->destroy(facevtk);
+       return 0;
+     }
+@@ -1452,7 +1489,11 @@ SMDS_Mesh::AddPolyhedralVolumeWithID (const vector<const SMDS_MeshNode*>& nodes,
+     volvtk->initPoly(myNodeIds, quantities, this);
+     if (!this->registerElement(ID, volvtk))
+     {
++#if VTK_VERSION_NUMBER >= VTK_VERSION_CHECK(9, 5, 20251004)
++      this->myGrid->GetCellTypes()->SetTuple1(volvtk->getVtkId(), VTK_EMPTY_CELL);
++#else
+       this->myGrid->GetCellTypesArray()->SetValue(volvtk->getVtkId(), VTK_EMPTY_CELL);
++#endif
+       myVolumePool->destroy(volvtk);
+       return 0;
+     }
+@@ -1508,7 +1549,11 @@ SMDS_MeshVolume* SMDS_Mesh::AddVolumeFromVtkIdsWithID(const std::vector<vtkIdTyp
+   volvtk->init(vtkNodeIds, this);
+   if (!this->registerElement(ID,volvtk))
+     {
++#if VTK_VERSION_NUMBER >= VTK_VERSION_CHECK(9, 5, 20251004)
++      this->myGrid->GetCellTypes()->SetTuple1(volvtk->getVtkId(), VTK_EMPTY_CELL);
++#else
+       this->myGrid->GetCellTypesArray()->SetValue(volvtk->getVtkId(), VTK_EMPTY_CELL);
++#endif
+       myVolumePool->destroy(volvtk);
+       return 0;
+     }
+@@ -1567,7 +1612,11 @@ SMDS_MeshFace* SMDS_Mesh::AddFaceFromVtkIdsWithID(const std::vector<vtkIdType>&
+   facevtk->init(vtkNodeIds, this);
+   if (!this->registerElement(ID,facevtk))
+     {
++#if VTK_VERSION_NUMBER >= VTK_VERSION_CHECK(9, 5, 20251004)
++      this->myGrid->GetCellTypes()->SetTuple1(facevtk->getVtkId(), VTK_EMPTY_CELL);
++#else
+       this->myGrid->GetCellTypesArray()->SetValue(facevtk->getVtkId(), VTK_EMPTY_CELL);
++#endif
+       myFacePool->destroy(facevtk);
+       return 0;
+     }
+@@ -1715,7 +1764,11 @@ SMDS_MeshFace * SMDS_Mesh::createTriangle(const SMDS_MeshNode * node1,
+     facevtk->init(myNodeIds, this); // put in vtkUnstructuredGrid
+     if (!this->registerElement(ID,facevtk))
+     {
++#if VTK_VERSION_NUMBER >= VTK_VERSION_CHECK(9, 5, 20251004)
++      this->myGrid->GetCellTypes()->SetTuple1(facevtk->getVtkId(), VTK_EMPTY_CELL);
++#else
+       this->myGrid->GetCellTypesArray()->SetValue(facevtk->getVtkId(), VTK_EMPTY_CELL);
++#endif
+       myFacePool->destroy(facevtk);
+       return 0;
+     }
+@@ -1769,7 +1822,11 @@ SMDS_MeshFace * SMDS_Mesh::createQuadrangle(const SMDS_MeshNode * node1,
+     facevtk->init(myNodeIds, this);
+     if (!this->registerElement(ID,facevtk))
+     {
++#if VTK_VERSION_NUMBER >= VTK_VERSION_CHECK(9, 5, 20251004)
++      this->myGrid->GetCellTypes()->SetTuple1(facevtk->getVtkId(), VTK_EMPTY_CELL);
++#else
+       this->myGrid->GetCellTypesArray()->SetValue(facevtk->getVtkId(), VTK_EMPTY_CELL);
++#endif
+       myFacePool->destroy(facevtk);
+       return 0;
+     }
+@@ -2100,7 +2157,11 @@ SMDS_MeshEdge* SMDS_Mesh::FindEdgeOrCreate(const SMDS_MeshNode * node1,
+     edgevtk->init(myNodeIds, this);
+     if (!this->registerElement(ID,edgevtk))
+     {
++#if VTK_VERSION_NUMBER >= VTK_VERSION_CHECK(9, 5, 20251004)
++      this->myGrid->GetCellTypes()->SetTuple1(edgevtk->getVtkId(), VTK_EMPTY_CELL);
++#else
+       this->myGrid->GetCellTypesArray()->SetValue(edgevtk->getVtkId(), VTK_EMPTY_CELL);
++#endif
+       myEdgePool->destroy(edgevtk);
+       return 0;
+     }
+@@ -3311,7 +3372,11 @@ void SMDS_Mesh::RemoveElement(const SMDS_MeshElement *        elem,
+       if (vtkid >= 0)
+         {
+           //MESSAGE("VTK_EMPTY_CELL in " << vtkid);
++#if VTK_VERSION_NUMBER >= VTK_VERSION_CHECK(9, 5, 20251004)
++          this->myGrid->GetCellTypes()->SetTuple1(vtkid, VTK_EMPTY_CELL);
++#else
+           this->myGrid->GetCellTypesArray()->SetValue(vtkid, VTK_EMPTY_CELL);
++#endif
+         }
+       it++;
+     }
+@@ -3416,7 +3481,11 @@ void SMDS_Mesh::RemoveFreeElement(const SMDS_MeshElement * elem)
+     }
+     myElementIDFactory->ReleaseID(elemId, vtkId);
+ 
++#if VTK_VERSION_NUMBER >= VTK_VERSION_CHECK(9, 5, 20251004)
++    this->myGrid->GetCellTypes()->SetTuple1(vtkId, VTK_EMPTY_CELL);
++#else
+     this->myGrid->GetCellTypesArray()->SetValue(vtkId, VTK_EMPTY_CELL);
++#endif
+     // --- to do: keep vtkid in a list of reusable cells
+   }
+ }
+@@ -3598,7 +3667,11 @@ SMDS_MeshEdge* SMDS_Mesh::AddEdgeWithID(const SMDS_MeshNode * n1,
+   edgevtk->init(myNodeIds, this);
+   if (!this->registerElement(ID,edgevtk))
+   {
++#if VTK_VERSION_NUMBER >= VTK_VERSION_CHECK(9, 5, 20251004)
++    this->myGrid->GetCellTypes()->SetTuple1(edgevtk->getVtkId(), VTK_EMPTY_CELL);
++#else
+     this->myGrid->GetCellTypesArray()->SetValue(edgevtk->getVtkId(), VTK_EMPTY_CELL);
++#endif
+     myEdgePool->destroy(edgevtk);
+     return 0;
+   }
+@@ -3681,7 +3754,11 @@ SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
+     facevtk->init(myNodeIds, this);
+     if (!this->registerElement(ID,facevtk))
+     {
++#if VTK_VERSION_NUMBER >= VTK_VERSION_CHECK(9, 5, 20251004)
++      this->myGrid->GetCellTypes()->SetTuple1(facevtk->getVtkId(), VTK_EMPTY_CELL);
++#else
+       this->myGrid->GetCellTypesArray()->SetValue(facevtk->getVtkId(), VTK_EMPTY_CELL);
++#endif
+       myFacePool->destroy(facevtk);
+       return 0;
+     }
+@@ -3768,7 +3845,11 @@ SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
+     facevtk->init(myNodeIds, this);
+     if (!this->registerElement(ID,facevtk))
+     {
++#if VTK_VERSION_NUMBER >= VTK_VERSION_CHECK(9, 5, 20251004)
++      this->myGrid->GetCellTypes()->SetTuple1(facevtk->getVtkId(), VTK_EMPTY_CELL);
++#else
+       this->myGrid->GetCellTypesArray()->SetValue(facevtk->getVtkId(), VTK_EMPTY_CELL);
++#endif
+       myFacePool->destroy(facevtk);
+       return 0;
+     }
+@@ -3859,7 +3940,11 @@ SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
+     facevtk->init(myNodeIds, this);
+     if (!this->registerElement(ID,facevtk))
+     {
++#if VTK_VERSION_NUMBER >= VTK_VERSION_CHECK(9, 5, 20251004)
++      this->myGrid->GetCellTypes()->SetTuple1(facevtk->getVtkId(), VTK_EMPTY_CELL);
++#else
+       this->myGrid->GetCellTypesArray()->SetValue(facevtk->getVtkId(), VTK_EMPTY_CELL);
++#endif
+       myFacePool->destroy(facevtk);
+       return 0;
+     }
+@@ -3953,7 +4038,11 @@ SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
+     facevtk->init(myNodeIds, this);
+     if (!this->registerElement(ID,facevtk))
+     {
++#if VTK_VERSION_NUMBER >= VTK_VERSION_CHECK(9, 5, 20251004)
++      this->myGrid->GetCellTypes()->SetTuple1(facevtk->getVtkId(), VTK_EMPTY_CELL);
++#else
+       this->myGrid->GetCellTypesArray()->SetValue(facevtk->getVtkId(), VTK_EMPTY_CELL);
++#endif
+       myFacePool->destroy(facevtk);
+       return 0;
+     }
+@@ -4056,7 +4145,11 @@ SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
+   volvtk->init(myNodeIds, this);
+   if (!this->registerElement(ID,volvtk))
+   {
++#if VTK_VERSION_NUMBER >= VTK_VERSION_CHECK(9, 5, 20251004)
++    this->myGrid->GetCellTypes()->SetTuple1(volvtk->getVtkId(), VTK_EMPTY_CELL);
++#else
+     this->myGrid->GetCellTypesArray()->SetValue(volvtk->getVtkId(), VTK_EMPTY_CELL);
++#endif
+     myVolumePool->destroy(volvtk);
+     return 0;
+   }
+@@ -4171,7 +4264,11 @@ SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
+   volvtk->init(myNodeIds, this);
+   if (!this->registerElement(ID,volvtk))
+   {
++#if VTK_VERSION_NUMBER >= VTK_VERSION_CHECK(9, 5, 20251004)
++    this->myGrid->GetCellTypes()->SetTuple1(volvtk->getVtkId(), VTK_EMPTY_CELL);
++#else
+     this->myGrid->GetCellTypesArray()->SetValue(volvtk->getVtkId(), VTK_EMPTY_CELL);
++#endif
+     myVolumePool->destroy(volvtk);
+     return 0;
+   }
+@@ -4298,7 +4395,11 @@ SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
+   volvtk->init(myNodeIds, this);
+   if (!this->registerElement(ID,volvtk))
+   {
++#if VTK_VERSION_NUMBER >= VTK_VERSION_CHECK(9, 5, 20251004)
++    this->myGrid->GetCellTypes()->SetTuple1(volvtk->getVtkId(), VTK_EMPTY_CELL);
++#else
+     this->myGrid->GetCellTypesArray()->SetValue(volvtk->getVtkId(), VTK_EMPTY_CELL);
++#endif
+     myVolumePool->destroy(volvtk);
+     return 0;
+   }
+@@ -4445,7 +4546,11 @@ SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
+   volvtk->init(myNodeIds, this);
+   if (!this->registerElement(ID,volvtk))
+   {
++#if VTK_VERSION_NUMBER >= VTK_VERSION_CHECK(9, 5, 20251004)
++    this->myGrid->GetCellTypes()->SetTuple1(volvtk->getVtkId(), VTK_EMPTY_CELL);
++#else
+     this->myGrid->GetCellTypesArray()->SetValue(volvtk->getVtkId(), VTK_EMPTY_CELL);
++#endif
+     myVolumePool->destroy(volvtk);
+     return 0;
+   }
+@@ -4625,7 +4730,11 @@ SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
+   volvtk->init(myNodeIds, this);
+   if (!this->registerElement(ID,volvtk))
+   {
++#if VTK_VERSION_NUMBER >= VTK_VERSION_CHECK(9, 5, 20251004)
++    this->myGrid->GetCellTypes()->SetTuple1(volvtk->getVtkId(), VTK_EMPTY_CELL);
++#else
+     this->myGrid->GetCellTypesArray()->SetValue(volvtk->getVtkId(), VTK_EMPTY_CELL);
++#endif
+     myVolumePool->destroy(volvtk);
+     return 0;
+   }
+@@ -4712,14 +4821,10 @@ void SMDS_Mesh::dumpGrid(string ficdump)
+         ficcon << endl;
+   }
+   ficcon << "-------------------------------- connectivity " <<  nbPoints << endl;
+-#ifdef VTK_CELL_ARRAY_V2
+-  #if VTK_VERSION_NUMBER_QUICK >= 90300000000
++#if VTK_VERSION_NUMBER >= VTK_VERSION_CHECK(9, 2, 20221112)
+   vtkCellLinks *links = static_cast<vtkCellLinks*>(myGrid->GetLinks());
+-  #else
+-  vtkCellLinks *links = static_cast<vtkCellLinks*>(myGrid->GetCellLinks());
+-  #endif
+ #else
+-  vtkCellLinks *links = myGrid->GetCellLinks();
++  vtkCellLinks *links = static_cast<vtkCellLinks*>(myGrid->GetCellLinks());
+ #endif
+   for (int i=0; i<nbPoints; i++)
+   {
+diff --git src/3rdParty/salomesmesh/src/SMDS/SMDS_Mesh0DElement.cpp src/3rdParty/salomesmesh/src/SMDS/SMDS_Mesh0DElement.cpp
+index ea5cf53b0f..d66f794b4a 100644
+--- src/3rdParty/salomesmesh/src/SMDS/SMDS_Mesh0DElement.cpp
++++ src/3rdParty/salomesmesh/src/SMDS/SMDS_Mesh0DElement.cpp
+@@ -146,7 +146,6 @@ bool SMDS_Mesh0DElement::ChangeNodes(const SMDS_MeshNode* nodes[], const int nbN
+   if ( nbNodes == 1 )
+   {
+     vtkUnstructuredGrid* grid = SMDS_Mesh::_meshList[myMeshId]->getGrid();
+-#ifdef VTK_CELL_ARRAY_V2
+     vtkNew<vtkIdList> cellPoints;
+     grid->GetCellPoints(myVtkID, cellPoints.GetPointer());
+     if (nbNodes != cellPoints->GetNumberOfIds())
+@@ -156,18 +155,6 @@ bool SMDS_Mesh0DElement::ChangeNodes(const SMDS_MeshNode* nodes[], const int nbN
+     }
+     myNode = nodes[0];
+     cellPoints->SetId(0, myNode->getVtkId());
+-#else
+-    vtkIdType npts = 0;
+-    vtkIdType* pts = 0;
+-    grid->GetCellPoints(myVtkID, npts, pts);
+-    if (nbNodes != npts)
+-    {
+-      MESSAGE("ChangeNodes problem: not the same number of nodes " << npts << " -> " << nbNodes);
+-      return false;
+-    }
+-    myNode = nodes[0];
+-    pts[0] = myNode->getVtkId();
+-#endif
+ 
+     SMDS_Mesh::_meshList[myMeshId]->setMyModified();
+     return true;
+diff --git src/3rdParty/salomesmesh/src/SMDS/SMDS_MeshNode.cpp src/3rdParty/salomesmesh/src/SMDS/SMDS_MeshNode.cpp
+index f5fc373f5d..420c3a9baf 100644
+--- src/3rdParty/salomesmesh/src/SMDS/SMDS_MeshNode.cpp
++++ src/3rdParty/salomesmesh/src/SMDS/SMDS_MeshNode.cpp
+@@ -31,6 +31,7 @@
+ #include "SMDS_IteratorOfElements.hxx"
+ #include "SMDS_Mesh.hxx"
+ #include <vtkUnstructuredGrid.h>
++#include <vtkVersion.h>
+ 
+ #include "utilities.h"
+ #include "Utils_SALOME_Exception.hxx"
+@@ -69,7 +70,7 @@ void SMDS_MeshNode::init(int id, int meshId, int shapeId, double x, double y, do
+   SMDS_UnstructuredGrid * grid = mesh->getGrid();
+   vtkPoints *points = grid->GetPoints();
+   points->InsertPoint(myVtkID, x, y, z);
+-#if VTK_VERSION_NUMBER_QUICK >= 90300000000
++#if VTK_VERSION_NUMBER >= VTK_VERSION_CHECK(9, 2, 20221112)
+   SMDS_CellLinks *cellLinks = dynamic_cast<SMDS_CellLinks*>(grid->GetLinks());
+ #else
+   SMDS_CellLinks *cellLinks = dynamic_cast<SMDS_CellLinks*>(grid->GetCellLinks());
+@@ -195,7 +196,7 @@ public:
+ SMDS_ElemIteratorPtr SMDS_MeshNode::
+ GetInverseElementIterator(SMDSAbs_ElementType type) const
+ {
+-#if VTK_VERSION_NUMBER_QUICK >= 90300000000
++#if VTK_VERSION_NUMBER >= VTK_VERSION_CHECK(9, 2, 20221112)
+   vtkCellLinks::Link l = static_cast<vtkCellLinks*>(SMDS_Mesh::_meshList[myMeshId]->getGrid()->GetLinks())->GetLink(myVtkID);
+ #else
+   vtkCellLinks::Link l = static_cast<vtkCellLinks*>(SMDS_Mesh::_meshList[myMeshId]->getGrid()->GetCellLinks())->GetLink(myVtkID);
+@@ -259,7 +260,7 @@ elementsIterator(SMDSAbs_ElementType type) const
+     return SMDS_MeshElement::elementsIterator(SMDSAbs_Node);
+   else
+   {
+-#if VTK_VERSION_NUMBER_QUICK >= 90300000000
++#if VTK_VERSION_NUMBER >= VTK_VERSION_CHECK(9, 2, 20221112)
+     vtkCellLinks::Link l = static_cast<vtkCellLinks*>(SMDS_Mesh::_meshList[myMeshId]->getGrid()->GetLinks())->GetLink(myVtkID);
+ #else
+     vtkCellLinks::Link l = static_cast<vtkCellLinks*>(SMDS_Mesh::_meshList[myMeshId]->getGrid()->GetCellLinks())->GetLink(myVtkID);
+@@ -362,7 +363,7 @@ void SMDS_MeshNode::AddInverseElement(const SMDS_MeshElement* ME)
+   const SMDS_MeshCell *cell = dynamic_cast<const SMDS_MeshCell*> (ME);
+   assert(cell);
+   SMDS_UnstructuredGrid* grid = SMDS_Mesh::_meshList[myMeshId]->getGrid();
+-#if VTK_VERSION_NUMBER_QUICK >= 90300000000
++#if VTK_VERSION_NUMBER >= VTK_VERSION_CHECK(9, 2, 20221112)
+   vtkCellLinks *Links = static_cast<vtkCellLinks*>(grid->GetLinks());
+ #else
+   vtkCellLinks *Links = static_cast<vtkCellLinks*>(grid->GetCellLinks());
+@@ -382,7 +383,7 @@ void SMDS_MeshNode::ClearInverseElements()
+ 
+ bool SMDS_MeshNode::emptyInverseElements()
+ {
+-#if VTK_VERSION_NUMBER_QUICK >= 90300000000
++#if VTK_VERSION_NUMBER >= VTK_VERSION_CHECK(9, 2, 20221112)
+   vtkCellLinks::Link l = static_cast<vtkCellLinks*>(SMDS_Mesh::_meshList[myMeshId]->getGrid()->GetLinks())->GetLink(myVtkID);
+ #else
+   vtkCellLinks::Link l = static_cast<vtkCellLinks*>(SMDS_Mesh::_meshList[myMeshId]->getGrid()->GetCellLinks())->GetLink(myVtkID);
+@@ -398,7 +399,7 @@ bool SMDS_MeshNode::emptyInverseElements()
+ 
+ int SMDS_MeshNode::NbInverseElements(SMDSAbs_ElementType type) const
+ {
+-#if VTK_VERSION_NUMBER_QUICK >= 90300000000
++#if VTK_VERSION_NUMBER >= VTK_VERSION_CHECK(9, 2, 20221112)
+   vtkCellLinks::Link l = static_cast<vtkCellLinks*>(SMDS_Mesh::_meshList[myMeshId]->getGrid()->GetLinks())->GetLink(myVtkID);
+ #else
+   vtkCellLinks::Link l = static_cast<vtkCellLinks*>(SMDS_Mesh::_meshList[myMeshId]->getGrid()->GetCellLinks())->GetLink(myVtkID);
+diff --git src/3rdParty/salomesmesh/src/SMDS/SMDS_UnstructuredGrid.cpp src/3rdParty/salomesmesh/src/SMDS/SMDS_UnstructuredGrid.cpp
+index 4e9d6dc057..f5b91ff800 100644
+--- src/3rdParty/salomesmesh/src/SMDS/SMDS_UnstructuredGrid.cpp
++++ src/3rdParty/salomesmesh/src/SMDS/SMDS_UnstructuredGrid.cpp
+@@ -193,8 +193,8 @@ void SMDS_UnstructuredGrid::compactGrid(std::vector<int>& idNodesOldToNew, int n
+ 
+   vtkCellArray *newConnectivity = vtkCellArray::New();
+   newConnectivity->Initialize();
+-  int oldCellDataSize = this->Connectivity->GetData()->GetSize();
+-  newConnectivity->Allocate(oldCellDataSize);
++  int oldCellDataSize = this->GetCells()->GetConnectivityArray()->GetSize();
++  newConnectivity->AllocateExact(oldCellDataSize, oldCellDataSize);
+   MESSAGE("oldCellSize="<< oldCellSize << " oldCellDataSize=" << oldCellDataSize);
+ 
+   vtkUnsignedCharArray *newTypes = vtkUnsignedCharArray::New();
+@@ -214,11 +214,11 @@ void SMDS_UnstructuredGrid::compactGrid(std::vector<int>& idNodesOldToNew, int n
+   while ( i < oldCellSize )
+   {
+     // skip a hole if any
+-    while ( i < oldCellSize && this->Types->GetValue(i) == VTK_EMPTY_CELL )
++    while ( i < oldCellSize && this->GetCellType(i) == VTK_EMPTY_CELL )
+       ++i;
+     int startBloc = i;
+     // look for a block end
+-    while ( i < oldCellSize && this->Types->GetValue(i) != VTK_EMPTY_CELL )
++    while ( i < oldCellSize && this->GetCellType(i) != VTK_EMPTY_CELL )
+       ++i;
+     int endBloc = i;
+     if ( endBloc > startBloc )
+@@ -242,7 +242,7 @@ void SMDS_UnstructuredGrid::compactGrid(std::vector<int>& idNodesOldToNew, int n
+   {
+     for (int oldCellID = 0; oldCellID < oldCellSize; oldCellID++)
+     {
+-      if (this->Types->GetValue(oldCellID) == VTK_EMPTY_CELL)
++      if (this->GetCellType(oldCellID) == VTK_EMPTY_CELL)
+         continue;
+       int newCellId = idCellsOldToNew[ oldCellID ];
+       if (newTypes->GetValue(newCellId) == VTK_POLY_VERTEX)
+@@ -250,6 +250,71 @@ void SMDS_UnstructuredGrid::compactGrid(std::vector<int>& idNodesOldToNew, int n
+     }
+   }
+ 
++#if VTK_VERSION_NUMBER >= VTK_VERSION_CHECK(9, 3, 20240112)
++  if ( this->FaceLocations )
++  {
++    vtkIdTypeArray *iniFaceLocO = (vtkIdTypeArray *)this->FaceLocations->GetOffsetsArray();
++    vtkIdTypeArray *iniFaceLocC = (vtkIdTypeArray *)this->FaceLocations->GetConnectivityArray();
++    vtkIdTypeArray *iniFaceO = (vtkIdTypeArray *)this->Faces->GetOffsetsArray();
++    vtkIdTypeArray *iniFaceC = (vtkIdTypeArray *)this->Faces->GetConnectivityArray();
++    //
++    vtkNew<vtkIdTypeArray> facesLoc_o; facesLoc_o->Initialize(); facesLoc_o->InsertNextValue(0);
++    vtkNew<vtkIdTypeArray> facesLoc_c; facesLoc_c->Initialize();
++    vtkNew<vtkIdTypeArray> faces_o; faces_o->Initialize(); faces_o->InsertNextValue(0);
++    vtkNew<vtkIdTypeArray> faces_c; faces_c->Initialize();
++    int newFaceId( 0 );
++    vtkIdType facesLoc_o_cur(0),faces_o_cur(0);
++    // for ( vtkIdType newCellID = 0; newCellID < newCellSize; newCellID++ )
++    for (int oldCellId = 0; oldCellId < oldCellSize; oldCellId++)
++    {
++      int newCellId = idCellsOldToNew[oldCellId];
++      if ( this->GetCellType(newCellId) == VTK_POLYHEDRON )
++      {
++        vtkIdType oldStartFaceLocOff = iniFaceLocO->GetValue( oldCellId );
++        vtkIdType nCellFaces = iniFaceLocO->GetValue( oldCellId + 1 ) - oldStartFaceLocOff;
++        facesLoc_o_cur += nCellFaces;
++        facesLoc_o->InsertNextValue( facesLoc_o_cur );
++        for ( int n = 0; n < nCellFaces; n++ )
++        {
++          facesLoc_c->InsertNextValue( newFaceId++ );
++          int curFaceId = iniFaceLocC->GetValue( oldStartFaceLocOff + n );
++          int oldStartPtOfFaceOff = iniFaceO->GetValue( curFaceId );
++          int nbOfPts = iniFaceO->GetValue( curFaceId + 1 ) - oldStartPtOfFaceOff;
++          faces_o_cur += nbOfPts;
++          faces_o->InsertNextValue( faces_o_cur );
++          for( int m = 0 ; m < nbOfPts ; m++ )
++          {
++            vtkIdType oldpt = iniFaceC->GetValue( oldStartPtOfFaceOff + m );
++            int curPt = idNodesOldToNew[ oldpt ];
++            faces_c->InsertNextValue( curPt );
++          }
++        }
++      }
++      else
++      {
++        facesLoc_o->InsertNextValue(facesLoc_o_cur);
++      }
++    }
++    {
++      faces_o->Squeeze(); faces_c->Squeeze();
++      facesLoc_o->Squeeze(); facesLoc_c->Squeeze();
++      //
++      vtkNew<vtkCellArray> outFaces;
++      outFaces->SetData( faces_o, faces_c );
++      vtkNew<vtkCellArray> outFaceLocations;
++      outFaceLocations->SetData( facesLoc_o, facesLoc_c );
++      //
++      this->SetPolyhedralCells(newTypes, newConnectivity, outFaceLocations, outFaces);
++    }
++  }
++  else
++  {
++    {
++      this->SetCells(newTypes,newConnectivity);
++    }
++    //this->CellLocations = newLocations;
++  }
++#else
+   vtkIdTypeArray* thisFaceLocations = GetFaceLocations();
+   vtkIdTypeArray* thisFaces = GetFaces();
+   if (thisFaceLocations)
+@@ -262,7 +327,7 @@ void SMDS_UnstructuredGrid::compactGrid(std::vector<int>& idNodesOldToNew, int n
+       newFaces->Allocate(thisFaces->GetSize());
+       for (int i = 0; i < oldCellSize; i++)
+         {
+-          if (this->Types->GetValue(i) == VTK_EMPTY_CELL)
++          if (this->GetCellType(i) == VTK_EMPTY_CELL)
+             continue;
+           int newCellId = idCellsOldToNew[i];
+           if (newTypes->GetValue(newCellId) == VTK_POLYHEDRON)
+@@ -297,6 +362,7 @@ void SMDS_UnstructuredGrid::compactGrid(std::vector<int>& idNodesOldToNew, int n
+   {
+     this->SetCells(newTypes, newLocations, newConnectivity, thisFaceLocations, thisFaces);
+   }
++#endif
+ 
+   newPoints->Delete();
+   newTypes->Delete();
+@@ -333,7 +399,7 @@ void SMDS_UnstructuredGrid::copyBloc(vtkUnsignedCharArray *newTypes,
+   //MESSAGE("copyBloc " << alreadyCopied << " " << start << " " << end << " size: " << end - start << " total: " << alreadyCopied + end - start);
+   for (int j = start; j < end; j++)
+     {
+-      newTypes->SetValue(alreadyCopied, this->Types->GetValue(j));
++      newTypes->SetValue(alreadyCopied, this->GetCellType(j));
+       idCellsOldToNew[j] = alreadyCopied; // old vtkId --> new vtkId
+       // The difference is mainly the internal representation of vtkCellArray between vtk 7.x and vtk 9.x
+       // In the old version a single array of the form (n1,id1,id2,...,idn1, n2,id1,id2,...,idn2, ...) is used
+@@ -341,16 +407,12 @@ void SMDS_UnstructuredGrid::copyBloc(vtkUnsignedCharArray *newTypes,
+       // (n1,n2,n3) and (id1,id2,...,idn1,id1,id2,...,idn2, ...)
+       // The Locations array in vtk 7.x kept the positions of the n's of the above array: (0, idn1 + 1, idn2 + 2).
+       // In vtk 9.x this array doesn't exist any more but its values can be determined with idni + i
+-#ifdef VTK_CELL_ARRAY_V2
+       vtkIdType oldLoc = ((vtkIdTypeArray *)(this->Connectivity->GetOffsetsArray()))->GetValue( j ) + j;
+-#else
+-      vtkIdType oldLoc = this->Locations->GetValue(j);
+-#endif
+       vtkIdType nbpts;
+       vtkIdTypePtr oldPtsCell = 0;
+       this->Connectivity->GetCell(oldLoc, nbpts, oldPtsCell);
+       assert(nbpts < NBMAXNODESINCELL);
+-      //MESSAGE(j << " " << alreadyCopied << " " << (int)this->Types->GetValue(j) << " " << oldLoc << " " << nbpts );
++      //MESSAGE(j << " " << alreadyCopied << " " << (int)this->GetCellType(j) << " " << oldLoc << " " << nbpts );
+       for (int l = 0; l < nbpts; l++)
+         {
+           int oldval = oldPtsCell[l];
+@@ -358,7 +420,8 @@ void SMDS_UnstructuredGrid::copyBloc(vtkUnsignedCharArray *newTypes,
+           //MESSAGE("   " << oldval << " " << pointsCell[l]);
+         }
+       /*int newcnt = */newConnectivity->InsertNextCell(nbpts, pointsCell);
+-      int newLoc = newConnectivity->GetInsertLocation(nbpts);
++      int newLoc = this->GetCells()->GetOffsetsArray()->GetNumberOfValues() - 1
++        + this->GetCells()->GetConnectivityArray()->GetNumberOfValues() - nbpts - 1;
+       //MESSAGE(newcnt << " " << newLoc);
+       newLocations->SetValue(alreadyCopied, newLoc);
+       alreadyCopied++;
+@@ -965,7 +1028,6 @@ void SMDS_UnstructuredGrid::GetNodeIds(std::set<int>& nodeSet, int downId, unsig
+  */
+ void SMDS_UnstructuredGrid::ModifyCellNodes(int vtkVolId, std::map<int, int> localClonedNodeIds)
+ {
+-#ifdef VTK_CELL_ARRAY_V2
+   vtkNew<vtkIdList> cellPoints;
+   this->GetCellPoints(vtkVolId, cellPoints.GetPointer());
+   for (vtkIdType i = 0; i < cellPoints->GetNumberOfIds(); i++)
+@@ -979,22 +1041,6 @@ void SMDS_UnstructuredGrid::ModifyCellNodes(int vtkVolId, std::map<int, int> loc
+           //this->AddReferenceToCell(pts[i], vtkVolId);
+         }
+     }
+-#else
+-  vtkIdType npts = 0;
+-  vtkIdType *pts; // will refer to the point id's of the face
+-  this->GetCellPoints(vtkVolId, npts, pts);
+-  for (int i = 0; i < npts; i++)
+-    {
+-      if (localClonedNodeIds.count(pts[i]))
+-        {
+-          vtkIdType oldpt = pts[i];
+-          pts[i] = localClonedNodeIds[oldpt];
+-          //MESSAGE(oldpt << " --> " << pts[i]);
+-          //this->RemoveReferenceToCell(oldpt, vtkVolId);
+-          //this->AddReferenceToCell(pts[i], vtkVolId);
+-        }
+-    }
+-#endif
+ }
+ 
+ /*! reorder the nodes of a face
+@@ -1024,25 +1070,17 @@ void SMDS_UnstructuredGrid::BuildLinks()
+     this->Links->UnRegister(this);
+     }
+ 
+-#ifdef VTK_CELL_ARRAY_V2
+   this->Links = SMDS_CellLinks::New();
+   GetLinks()->Allocate(this->GetNumberOfPoints());
+   GetLinks()->Register(this);
+-//FIXME: vtk9
+-  #if VTK_VERSION_NUMBER < VTK_VERSION_CHECK(9,3,0)
++#if VTK_VERSION_NUMBER < VTK_VERSION_CHECK(9, 2, 20221112)
+   GetLinks()->BuildLinks(this);
+-  #else
++#else
+   GetLinks()->SetDataSet(this);
++  std::cout << this->GetNumberOfPoints() << std::endl;
+   GetLinks()->BuildLinks();
+-  #endif
+-  GetLinks()->Delete();
*** 2142 LINES SKIPPED ***