Index | Thread | Search

From:
Stuart Henderson <stu@spacehopper.org>
Subject:
Re: [update] cad/freecad 1.1.0 -> 1.1.4 (was 1.1.3)
To:
Johannes Thyssen Tishman <jtt@openbsd.org>, ports@openbsd.org, "Heppler, J. Scott" <shep971@spectrum.net>
Date:
Mon, 12 Oct 2026 16:19:46 +0100

Download raw body.

Thread
On 2026/10/11 18:22, Johannes Thyssen Tishman wrote:
> Please find below a update for cad/freecad to version 1.1.3.
> 
> This update includes two security fixes addressing file-handling
> vulnerabilities that can be triggered by opening a maliciously crafted
> FCStd file. Should/Can this be backported to -stable?

lgtm.

backporting to OPENBSD_8_0 makes sense.

> 
> Changelog(s):
> https://github.com/FreeCAD/FreeCAD/releases/tag/1.1.4
> https://github.com/FreeCAD/FreeCAD/releases/tag/1.1.3
> https://github.com/FreeCAD/FreeCAD/releases/tag/1.1.2
> https://github.com/FreeCAD/FreeCAD/releases/tag/1.1.1
> 
> Notes about this update:
> 1. Shared libraries not bumped due to 'No dynamic export changes'
> 2. Only patch removals, no additions :)
> 3. A systems' PyCXX can now be used. Keep using bundled version as no
>    port exists yet.
> 4. I found a bug when trying to import DWG files (using a WIP libredwg
>    port from Chris Billington) or starting tests in the Test Framework
>    workbench that causes FreeCAD to SEGFAULT (reproduced on versions
>    1.1.0, 1.1.3 and 1.1.4). I'm still working on a port that builds from
>    HEAD to check if it's been fixed upstream.
> 
> Feedback, tests, Ok?
> 
> Index: cad/freecad//Makefile
> ===================================================================
> RCS file: /cvs/ports/cad/freecad/Makefile,v
> diff -u -p -r1.17 Makefile
> --- cad/freecad//Makefile	17 Sep 2026 15:33:11 -0000	1.17
> +++ cad/freecad//Makefile	11 Oct 2026 18:08:11 -0000
> @@ -4,10 +4,9 @@ DPB_PROPERTIES =	parallel parallel2
>  
>  COMMENT =		general purpose parametric 3D CAD modeler
>  
> -V =			1.1.0
> +V =			1.1.4
>  DISTNAME =		freecad_source_${V}
>  PKGNAME =		freecad-${V}
> -REVISION =		1
>  
>  SHARED_LIBS +=		OndselSolver              2.0 # 0.0
>  SHARED_LIBS +=		E57Format                 0.0 # 0.0
> @@ -19,13 +18,13 @@ MAINTAINER =		Johannes Thyssen Tishman <
>  # LGPLv2+
>  PERMIT_PACKAGE =	Yes
>  
> -WANTLIB += ${COMPILER_LIBCXX} Coin GL GLU Qt6Concurrent Qt6Core
> -WANTLIB += Qt6Gui Qt6Network Qt6OpenGL Qt6OpenGLWidgets Qt6PrintSupport
> -WANTLIB += Qt6Svg Qt6SvgWidgets Qt6UiTools Qt6Widgets Qt6Xml TKBO
> -WANTLIB += TKBRep TKBin TKBinL TKBool TKCAF TKCDF TKDE TKDEGLTF
> -WANTLIB += TKDEIGES TKDESTEP TKDESTL TKExpress TKFeat TKFillet
> -WANTLIB += TKG2d TKG3d TKGeomAlgo TKGeomBase TKHLR TKLCAF TKMath
> -WANTLIB += TKMesh TKMeshVS TKOffset TKPrim TKRWMesh TKService
> +WANTLIB += ${COMPILER_LIBCXX} ${MODPY_WANTLIB} Coin GL GLU Qt6Concurrent
> +WANTLIB += Qt6Core Qt6Gui Qt6Network Qt6OpenGL Qt6OpenGLWidgets
> +WANTLIB += Qt6PrintSupport Qt6Svg Qt6SvgWidgets Qt6UiTools Qt6Widgets
> +WANTLIB += Qt6Xml TKBO TKBRep TKBin TKBinL TKBool TKCAF TKCDF
> +WANTLIB += TKDE TKDEGLTF TKDEIGES TKDESTEP TKDESTL TKExpress TKFeat
> +WANTLIB += TKFillet TKG2d TKG3d TKGeomAlgo TKGeomBase TKHLR TKLCAF
> +WANTLIB += TKMath TKMesh TKMeshVS TKOffset TKPrim TKRWMesh TKService
>  WANTLIB += TKShHealing TKTopAlgo TKV3d TKVCAF TKXCAF TKXSBase
>  WANTLIB += TKernel boost_atomic-mt boost_chrono-mt boost_container-mt
>  WANTLIB += boost_date_time-mt boost_filesystem-mt boost_iostreams-mt
> @@ -34,22 +33,20 @@ WANTLIB += boost_serialization-mt boost_
>  WANTLIB += freetype hdf5 hdf5_hl icui18n icuuc m med medC pcl_common
>  WANTLIB += pcl_features pcl_filters pcl_kdtree pcl_ml pcl_octree
>  WANTLIB += pcl_sample_consensus pcl_search pcl_segmentation pcl_surface
> -WANTLIB += pyside6.abi3 ${MODPY_WANTLIB} scn shiboken6.abi3 vtkCommonCore
> -WANTLIB += vtkCommonDataModel vtkCommonExecutionModel vtkCommonMath
> -WANTLIB += vtkCommonMisc vtkCommonTransforms vtkFiltersCellGrid
> -WANTLIB += vtkFiltersCore vtkFiltersExtraction vtkFiltersGeneral
> -WANTLIB += vtkFiltersGeometry vtkFiltersSources vtkFiltersVerdict
> -WANTLIB += vtkIOCellGrid vtkIOCore vtkIOImage vtkIOLegacy vtkIOXML
> -WANTLIB += vtkIOXMLParser vtkImagingCore vtkInteractionStyle vtkRenderingCore
> -WANTLIB += vtkRenderingFreeType vtkRenderingHyperTreeGrid vtkRenderingOpenGL2
> +WANTLIB += pyside6.abi3 scn shiboken6.abi3 vtkCommonCore vtkCommonDataModel
> +WANTLIB += vtkCommonExecutionModel vtkCommonMath vtkCommonMisc
> +WANTLIB += vtkCommonTransforms vtkFiltersCellGrid vtkFiltersCore
> +WANTLIB += vtkFiltersExtraction vtkFiltersGeneral vtkFiltersGeometry
> +WANTLIB += vtkFiltersSources vtkFiltersVerdict vtkIOCellGrid vtkIOCore
> +WANTLIB += vtkIOImage vtkIOLegacy vtkIOXML vtkIOXMLParser vtkImagingCore
> +WANTLIB += vtkInteractionStyle vtkRenderingCore vtkRenderingFreeType
> +WANTLIB += vtkRenderingHyperTreeGrid vtkRenderingLabel vtkRenderingOpenGL2
>  WANTLIB += vtkRenderingUI vtkglad vtkkissfft vtksys vtktoken vtkx11
>  WANTLIB += xerces-c yaml-cpp z
>  
>  SITES =			https://github.com/FreeCAD/FreeCAD/releases/download/${V}/
>  
> -FIX_CRLF_FILES =	src/Gui/View3DInventor.cpp \
> -			src/Gui/ViewProvider.h \
> -			src/Mod/Sketcher/App/GeoEnum.h
> +FIX_CRLF_FILES =	src/Mod/Sketcher/App/GeoEnum.h
>  
>  COMPILER =		base-clang ports-gcc
>  MODULES =		devel/cmake \
> @@ -109,12 +106,11 @@ LIB_DEPENDS =		${MODPY_LIB_DEPENDS} \
>  # SMESH: part of salome suite and difficult to package
>  #	https://forum.freecad.org/viewtopic.php?p=715795#p715795
>  # Onsdel: Constraints solver specifically made for FreeCAD
> -# PyCXX: modified by FreeCAD (no switch needed)
> -#	https://github.com/FreeCAD/FreeCAD/commit/a16eec8
>  # orocos-kdl: modified by FreeCAD
>  #	https://github.com/FreeCAD/FreeCAD/blob/main/src/Mod/Robot/App/CMakeLists.txt#L77
>  CONFIGURE_ARGS +=	-DFREECAD_USE_EXTERNAL_FMT=ON \
>  			-DFREECAD_USE_EXTERNAL_PIVY=ON \
> +			-DFREECAD_USE_EXTERNAL_PYCXX=OFF \
>  			-DFREECAD_USE_EXTERNAL_GTEST=ON \
>  			-DFREECAD_USE_EXTERNAL_KDL=OFF \
>  			-DFREECAD_USE_EXTERNAL_ZIPIOS=OFF \
> Index: cad/freecad//distinfo
> ===================================================================
> RCS file: /cvs/ports/cad/freecad/distinfo,v
> diff -u -p -r1.3 distinfo
> --- cad/freecad//distinfo	16 May 2026 15:13:20 -0000	1.3
> +++ cad/freecad//distinfo	11 Oct 2026 18:08:11 -0000
> @@ -1,2 +1,2 @@
> -SHA256 (freecad_source_1.1.0.tar.gz) = PQQVYaoSl1XupR38DhzfQ/JiOrBlOOCGCpHb7xrkM9c=
> -SIZE (freecad_source_1.1.0.tar.gz) = 98114570
> +SHA256 (freecad_source_1.1.4.tar.gz) = Z08sQtwGC3HIsFLHCwSpqZXd5suGj+VoYV0/8/Jxd0g=
> +SIZE (freecad_source_1.1.4.tar.gz) = 98203668
> Index: cad/freecad//files/Version.h
> ===================================================================
> RCS file: /cvs/ports/cad/freecad/files/Version.h,v
> diff -u -p -r1.3 Version.h
> --- cad/freecad//files/Version.h	16 May 2026 15:13:20 -0000	1.3
> +++ cad/freecad//files/Version.h	11 Oct 2026 18:08:11 -0000
> @@ -3,16 +3,16 @@
>  #define FCVersionMajor  "1"
>  #define FCVersionMinor  "1"
>  #define FCVersionName   ""
> -#define FCVersionPoint  "0"
> +#define FCVersionPoint  "4"
>  #define FCVersionSuffix ""
>  // Displayed Copyright Year (i.e. build year)
>  #define FCCopyrightYear 2026
>  // test: $Format:Hash (%H), Date: %ci$
> -#define FCRevision      "44795 (Git)"      //Highest committed revision number
> -#define FCRevisionDate  "2026/03/25 02:17:53"     //Date of highest committed revision
> +#define FCRevision      "45040 (Git)"      //Highest committed revision number
> +#define FCRevisionDate  "2026/09/28 13:46:34"     //Date of highest committed revision
>  #define FCRepositoryURL "Unknown"      //Repository URL of the working copy
>  
>  // Git relevant stuff
> -#define FCRepositoryHash   "34a9716668b1ddeb55b914f1c5be644826bdbbbf"
> -#define FCRepositoryBranch "tag: 1.1.0"
> +#define FCRepositoryHash   "4fd3bf320d9566a27e60069fc8387448aaa3a094"
> +#define FCRepositoryBranch "tag: 1.1.4"
>  
> Index: cad/freecad//patches/patch-cMake_FreeCAD_Helpers_SetupCoin3D_cmake
> ===================================================================
> RCS file: cad/freecad//patches/patch-cMake_FreeCAD_Helpers_SetupCoin3D_cmake
> diff -N cad/freecad//patches/patch-cMake_FreeCAD_Helpers_SetupCoin3D_cmake
> --- cad/freecad//patches/patch-cMake_FreeCAD_Helpers_SetupCoin3D_cmake	8 Jul 2026 10:46:06 -0000	1.1
> +++ /dev/null	1 Jan 1970 00:00:00 -0000
> @@ -1,15 +0,0 @@
> -This patch has been merged upstream. Drop next update.
> -Commit: e3e56059865849c6b1c85161f69183ad872414e3
> -
> -Index: cMake/FreeCAD_Helpers/SetupCoin3D.cmake
> ---- cMake/FreeCAD_Helpers/SetupCoin3D.cmake.orig
> -+++ cMake/FreeCAD_Helpers/SetupCoin3D.cmake
> -@@ -29,7 +29,7 @@ macro(SetupCoin3D)
> -         set(COIN3D_MAJOR_VERSION "${CMAKE_MATCH_1}")
> -         string(REGEX MATCH "define[ \t]+COIN_MINOR_VERSION[ \t]+([0-9?])" _coin3d_minor_version_match "${_coin3d_basic_h}")
> -         set(COIN3D_MINOR_VERSION "${CMAKE_MATCH_1}")
> --        string(REGEX MATCH "define[ \t]+COIN_MICRO_VERSION[ \t]+([0-9?])" _coin3d_micro_version_match "${_coin3d_basic_h}")
> -+        string(REGEX MATCH "define[ \t]+COIN_MICRO_VERSION[ \t]+([0-9?]+)" _coin3d_micro_version_match "${_coin3d_basic_h}")
> -         set(COIN3D_MICRO_VERSION "${CMAKE_MATCH_1}")
> -         set(COIN3D_VERSION "${COIN3D_MAJOR_VERSION}.${COIN3D_MINOR_VERSION}.${COIN3D_MICRO_VERSION}")
> -     ENDIF ()
> Index: cad/freecad//patches/patch-src_3rdParty_salomesmesh_inc_SMDS_MeshElement_hxx
> ===================================================================
> RCS file: cad/freecad//patches/patch-src_3rdParty_salomesmesh_inc_SMDS_MeshElement_hxx
> diff -N cad/freecad//patches/patch-src_3rdParty_salomesmesh_inc_SMDS_MeshElement_hxx
> --- cad/freecad//patches/patch-src_3rdParty_salomesmesh_inc_SMDS_MeshElement_hxx	16 May 2026 15:13:20 -0000	1.1
> +++ /dev/null	1 Jan 1970 00:00:00 -0000
> @@ -1,18 +0,0 @@
> -This patch has been merged upstream. Drop next update.
> -Commit: bd90728f886bbeb6d69aafd4f68f934109b96f91
> -
> -Index: src/3rdParty/salomesmesh/inc/SMDS_MeshElement.hxx
> ---- src/3rdParty/salomesmesh/inc/SMDS_MeshElement.hxx.orig
> -+++ 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;
> Index: cad/freecad//patches/patch-src_3rdParty_salomesmesh_inc_SMDS_UnstructuredGrid_hxx
> ===================================================================
> RCS file: cad/freecad//patches/patch-src_3rdParty_salomesmesh_inc_SMDS_UnstructuredGrid_hxx
> diff -N cad/freecad//patches/patch-src_3rdParty_salomesmesh_inc_SMDS_UnstructuredGrid_hxx
> --- cad/freecad//patches/patch-src_3rdParty_salomesmesh_inc_SMDS_UnstructuredGrid_hxx	16 May 2026 15:13:20 -0000	1.1
> +++ /dev/null	1 Jan 1970 00:00:00 -0000
> @@ -1,32 +0,0 @@
> -This patch has been merged upstream. Drop next update.
> -Commit: bd90728f886bbeb6d69aafd4f68f934109b96f91
> -Commit: c9acda2a659f9ac079fefd2c0b8d6ff9c8a8238e
> -
> -Index: src/3rdParty/salomesmesh/inc/SMDS_UnstructuredGrid.hxx
> ---- src/3rdParty/salomesmesh/inc/SMDS_UnstructuredGrid.hxx.orig
> -+++ 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 @@ class SMDS_EXPORT SMDS_UnstructuredGrid: public vtkUns
> -                                        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)
> Index: cad/freecad//patches/patch-src_3rdParty_salomesmesh_src_SMDS_SMDS_BallElement_cpp
> ===================================================================
> RCS file: cad/freecad//patches/patch-src_3rdParty_salomesmesh_src_SMDS_SMDS_BallElement_cpp
> diff -N cad/freecad//patches/patch-src_3rdParty_salomesmesh_src_SMDS_SMDS_BallElement_cpp
> --- cad/freecad//patches/patch-src_3rdParty_salomesmesh_src_SMDS_SMDS_BallElement_cpp	16 May 2026 15:13:20 -0000	1.1
> +++ /dev/null	1 Jan 1970 00:00:00 -0000
> @@ -1,23 +0,0 @@
> -This patch has been merged upstream. Drop next update.
> -Commit: bd90728f886bbeb6d69aafd4f68f934109b96f91
> -
> -Index: src/3rdParty/salomesmesh/src/SMDS/SMDS_BallElement.cpp
> ---- src/3rdParty/salomesmesh/src/SMDS/SMDS_BallElement.cpp.orig
> -+++ 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;
> - }
> Index: cad/freecad//patches/patch-src_3rdParty_salomesmesh_src_SMDS_SMDS_Mesh0DElement_cpp
> ===================================================================
> RCS file: cad/freecad//patches/patch-src_3rdParty_salomesmesh_src_SMDS_SMDS_Mesh0DElement_cpp
> diff -N cad/freecad//patches/patch-src_3rdParty_salomesmesh_src_SMDS_SMDS_Mesh0DElement_cpp
> --- cad/freecad//patches/patch-src_3rdParty_salomesmesh_src_SMDS_SMDS_Mesh0DElement_cpp	16 May 2026 15:13:20 -0000	1.1
> +++ /dev/null	1 Jan 1970 00:00:00 -0000
> @@ -1,33 +0,0 @@
> -This patch has been merged upstream. Drop next update.
> -Commit: bd90728f886bbeb6d69aafd4f68f934109b96f91
> -
> -Index: src/3rdParty/salomesmesh/src/SMDS/SMDS_Mesh0DElement.cpp
> ---- src/3rdParty/salomesmesh/src/SMDS/SMDS_Mesh0DElement.cpp.orig
> -+++ src/3rdParty/salomesmesh/src/SMDS/SMDS_Mesh0DElement.cpp
> -@@ -146,7 +146,6 @@ bool SMDS_Mesh0DElement::ChangeNodes(const SMDS_MeshNo
> -   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_MeshNo
> -     }
> -     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;
> Index: cad/freecad//patches/patch-src_3rdParty_salomesmesh_src_SMDS_SMDS_MeshNode_cpp
> ===================================================================
> RCS file: cad/freecad//patches/patch-src_3rdParty_salomesmesh_src_SMDS_SMDS_MeshNode_cpp
> diff -N cad/freecad//patches/patch-src_3rdParty_salomesmesh_src_SMDS_SMDS_MeshNode_cpp
> --- cad/freecad//patches/patch-src_3rdParty_salomesmesh_src_SMDS_SMDS_MeshNode_cpp	16 May 2026 15:13:20 -0000	1.1
> +++ /dev/null	1 Jan 1970 00:00:00 -0000
> @@ -1,68 +0,0 @@
> -This patch has been merged upstream. Drop next update.
> -Commit: c9acda2a659f9ac079fefd2c0b8d6ff9c8a8238e
> -
> -Index: src/3rdParty/salomesmesh/src/SMDS/SMDS_MeshNode.cpp
> ---- src/3rdParty/salomesmesh/src/SMDS/SMDS_MeshNode.cpp.orig
> -+++ 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 shape
> -   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 @@ class SMDS_MeshNode_MyInvIterator: public SMDS_ElemIte
> - 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_MeshE
> -   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);
> Index: cad/freecad//patches/patch-src_3rdParty_salomesmesh_src_SMDS_SMDS_Mesh_cpp
> ===================================================================
> RCS file: cad/freecad//patches/patch-src_3rdParty_salomesmesh_src_SMDS_SMDS_Mesh_cpp
> diff -N cad/freecad//patches/patch-src_3rdParty_salomesmesh_src_SMDS_SMDS_Mesh_cpp
> --- cad/freecad//patches/patch-src_3rdParty_salomesmesh_src_SMDS_SMDS_Mesh_cpp	16 May 2026 15:13:20 -0000	1.1
> +++ /dev/null	1 Jan 1970 00:00:00 -0000
> @@ -1,357 +0,0 @@
> -This patch has been merged upstream. Drop next update.
> -Commit: bd90728f886bbeb6d69aafd4f68f934109b96f91
> -Commit: c9acda2a659f9ac079fefd2c0b8d6ff9c8a8238e
> -Commit: 3a68d91ae306d88703d203d2ac8d41b2e5ce12dd
> -
> -Index: src/3rdParty/salomesmesh/src/SMDS/SMDS_Mesh.cpp
> ---- src/3rdParty/salomesmesh/src/SMDS/SMDS_Mesh.cpp.orig
> -+++ 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_
> -   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_Mes
> -   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
> -     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
> -     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
> -     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
> -     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
> -     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 
> -     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<co
> -     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<con
> -     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(
> -   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(cons
> -   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_M
> -     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
> -     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_
> -     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 *
> -       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_MeshEleme
> -     }
> -     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_Mes
> -   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_Mes
> -     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_Mes
> -     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_Mes
> -     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_Mes
> -     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
> -   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
> -   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
> -   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
> -   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
> -   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++)
> -   {
> Index: cad/freecad//patches/patch-src_3rdParty_salomesmesh_src_SMDS_SMDS_UnstructuredGrid_cpp
> ===================================================================
> RCS file: cad/freecad//patches/patch-src_3rdParty_salomesmesh_src_SMDS_SMDS_UnstructuredGrid_cpp
> diff -N cad/freecad//patches/patch-src_3rdParty_salomesmesh_src_SMDS_SMDS_UnstructuredGrid_cpp
> --- cad/freecad//patches/patch-src_3rdParty_salomesmesh_src_SMDS_SMDS_UnstructuredGrid_cpp	16 May 2026 15:13:20 -0000	1.1
> +++ /dev/null	1 Jan 1970 00:00:00 -0000
> @@ -1,230 +0,0 @@
> -This patch has been merged upstream. Drop next update.
> -Commit: bd90728f886bbeb6d69aafd4f68f934109b96f91
> -Commit: ff3e419d2ea4603ed8a28d3777f0d75b2a2af194
> -Commit: 3a68d91ae306d88703d203d2ac8d41b2e5ce12dd
> -Commit: 261ca3905b47b251b0751fd7af45ad5c3fd129e4
> -
> -Index: src/3rdParty/salomesmesh/src/SMDS/SMDS_UnstructuredGrid.cpp
> ---- src/3rdParty/salomesmesh/src/SMDS/SMDS_UnstructuredGrid.cpp.orig
> -+++ src/3rdParty/salomesmesh/src/SMDS/SMDS_UnstructuredGrid.cpp
> -@@ -193,8 +193,8 @@ void SMDS_UnstructuredGrid::compactGrid(std::vector<in
> - 
> -   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<in
> -   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<in
> -   {
> -     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<in
> -     }
> -   }
> - 
> -+#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<in
> -       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<in
> -   {
> -     this->SetCells(newTypes, newLocations, newConnectivity, thisFaceLocations, thisFaces);
> -   }
> -+#endif
> - 
> -   newPoints->Delete();
> -   newTypes->Delete();
> -@@ -333,7 +399,7 @@ void SMDS_UnstructuredGrid::copyBloc(vtkUnsignedCharAr
> -   //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(vtkUnsignedCharAr
> -       // (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(vtkUnsignedCharAr
> -           //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>& 
> -  */
> - 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 vtkVol
> -           //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();
> --#else
> --  this->Links = SMDS_CellLinks::New();
> --  this->Links->Allocate(this->GetNumberOfPoints());
> --  this->Links->Register(this);
> --  this->Links->BuildLinks(this, this->Connectivity);
> --  this->Links->Delete();
> - #endif
> -+  GetLinks()->Delete();
> - }
> - 
> - /*! Create a volume (prism or hexahedron) by duplication of a face.
> Index: cad/freecad//patches/patch-src_3rdParty_salomesmesh_src_SMDS_SMDS_VtkCellIterator_cpp
> ===================================================================
> RCS file: cad/freecad//patches/patch-src_3rdParty_salomesmesh_src_SMDS_SMDS_VtkCellIterator_cpp
> diff -N cad/freecad//patches/patch-src_3rdParty_salomesmesh_src_SMDS_SMDS_VtkCellIterator_cpp
> --- cad/freecad//patches/patch-src_3rdParty_salomesmesh_src_SMDS_SMDS_VtkCellIterator_cpp	16 May 2026 15:13:20 -0000	1.1
> +++ /dev/null	1 Jan 1970 00:00:00 -0000
> @@ -1,20 +0,0 @@
> -This patch has been merged upstream. Drop next update.
> -Commit: 6d4ce9e9b84963688e283adaf775ed40d5d775a1
> -
> -Index: src/3rdParty/salomesmesh/src/SMDS/SMDS_VtkCellIterator.cpp
> ---- src/3rdParty/salomesmesh/src/SMDS/SMDS_VtkCellIterator.cpp.orig
> -+++ src/3rdParty/salomesmesh/src/SMDS/SMDS_VtkCellIterator.cpp
> -@@ -182,9 +182,10 @@ SMDS_VtkCellIteratorPolyH::SMDS_VtkCellIteratorPolyH(S
> -   case SMDSEntity_Polyhedra:
> -   {
> -     //MESSAGE("SMDS_VtkCellIterator Polyhedra");
> --    vtkIdType nFaces = 0;
> --    vtkIdTypePtr ptIds = 0;
> --    grid->GetFaceStream(_cellId, nFaces, ptIds);
> -+    vtkNew<vtkIdList> faceStream;
> -+    grid->GetFaceStream( vtkCellId, faceStream);
> -+    vtkIdType nFaces = faceStream->GetId(0);
> -+    vtkIdType *ptIds = faceStream->GetPointer(1);
> -     int id = 0;
> -     _nbNodesInFaces = 0;
> -     for (int i = 0; i < nFaces; i++)
> Index: cad/freecad//patches/patch-src_3rdParty_salomesmesh_src_SMDS_SMDS_VtkEdge_cpp
> ===================================================================
> RCS file: cad/freecad//patches/patch-src_3rdParty_salomesmesh_src_SMDS_SMDS_VtkEdge_cpp
> diff -N cad/freecad//patches/patch-src_3rdParty_salomesmesh_src_SMDS_SMDS_VtkEdge_cpp
> --- cad/freecad//patches/patch-src_3rdParty_salomesmesh_src_SMDS_SMDS_VtkEdge_cpp	16 May 2026 15:13:20 -0000	1.1
> +++ /dev/null	1 Jan 1970 00:00:00 -0000
> @@ -1,35 +0,0 @@
> -This patch has been merged upstream. Drop next update.
> -Commit: bd90728f886bbeb6d69aafd4f68f934109b96f91
> -
> -Index: src/3rdParty/salomesmesh/src/SMDS/SMDS_VtkEdge.cpp
> ---- src/3rdParty/salomesmesh/src/SMDS/SMDS_VtkEdge.cpp.orig
> -+++ src/3rdParty/salomesmesh/src/SMDS/SMDS_VtkEdge.cpp
> -@@ -67,7 +67,6 @@ bool SMDS_VtkEdge::ChangeNodes(const SMDS_MeshNode * n
> - bool SMDS_VtkEdge::ChangeNodes(const SMDS_MeshNode* nodes[], const int nbNodes)
> - {
> -   vtkUnstructuredGrid* grid = SMDS_Mesh::_meshList[myMeshId]->getGrid();
> --#ifdef VTK_CELL_ARRAY_V2
> -   vtkNew<vtkIdList> cellPoints;
> -   grid->GetCellPoints(myVtkID, cellPoints.GetPointer());
> -   if (nbNodes != cellPoints->GetNumberOfIds())
> -@@ -79,20 +78,6 @@ bool SMDS_VtkEdge::ChangeNodes(const SMDS_MeshNode* no
> -     {
> -       cellPoints->SetId(i, nodes[i]->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;
> --    }
> --  for (int i = 0; i < nbNodes; i++)
> --    {
> --      pts[i] = nodes[i]->getVtkId();
> --    }
> --#endif
> -   SMDS_Mesh::_meshList[myMeshId]->setMyModified();
> -   return true;
> - }
> Index: cad/freecad//patches/patch-src_3rdParty_salomesmesh_src_SMDS_SMDS_VtkFace_cpp
> ===================================================================
> RCS file: cad/freecad//patches/patch-src_3rdParty_salomesmesh_src_SMDS_SMDS_VtkFace_cpp
> diff -N cad/freecad//patches/patch-src_3rdParty_salomesmesh_src_SMDS_SMDS_VtkFace_cpp
> --- cad/freecad//patches/patch-src_3rdParty_salomesmesh_src_SMDS_SMDS_VtkFace_cpp	16 May 2026 15:13:20 -0000	1.1
> +++ /dev/null	1 Jan 1970 00:00:00 -0000
> @@ -1,54 +0,0 @@
> -This patch has been merged upstream. Drop next update.
> -Commit: bd90728f886bbeb6d69aafd4f68f934109b96f91
> -
> -Index: src/3rdParty/salomesmesh/src/SMDS/SMDS_VtkFace.cpp
> ---- src/3rdParty/salomesmesh/src/SMDS/SMDS_VtkFace.cpp.orig
> -+++ src/3rdParty/salomesmesh/src/SMDS/SMDS_VtkFace.cpp
> -@@ -101,7 +101,6 @@ void SMDS_VtkFace::initQuadPoly(const std::vector<vtkI
> - bool SMDS_VtkFace::ChangeNodes(const SMDS_MeshNode* nodes[], const int nbNodes)
> - {
> -   vtkUnstructuredGrid* grid = SMDS_Mesh::_meshList[myMeshId]->getGrid();
> --#ifdef VTK_CELL_ARRAY_V2
> -   vtkNew<vtkIdList> cellPoints;
> -   grid->GetCellPoints(myVtkID, cellPoints.GetPointer());
> -   if (nbNodes != cellPoints->GetNumberOfIds())
> -@@ -113,20 +112,6 @@ bool SMDS_VtkFace::ChangeNodes(const SMDS_MeshNode* no
> -     {
> -       cellPoints->SetId(i, nodes[i]->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;
> --    }
> --  for (int i = 0; i < nbNodes; i++)
> --    {
> --      pts[i] = nodes[i]->getVtkId();
> --    }
> --#endif
> -   SMDS_Mesh::_meshList[myMeshId]->setMyModified();
> -   return true;
> - }
> -@@ -372,18 +357,10 @@ SMDS_NodeIteratorPtr SMDS_VtkFace::interlacedNodesIter
> - void SMDS_VtkFace::ChangeApex(SMDS_MeshNode* node)
> - {
> -   vtkUnstructuredGrid* grid = SMDS_Mesh::_meshList[myMeshId]->getGrid();
> --#ifdef VTK_CELL_ARRAY_V2
> -   vtkNew<vtkIdList> cellPoints;
> -   grid->GetCellPoints(myVtkID, cellPoints.GetPointer());
> -   grid->RemoveReferenceToCell(cellPoints->GetId(0), myVtkID);
> -   cellPoints->SetId(0, node->getVtkId());
> --#else
> --  vtkIdType npts = 0;
> --  vtkIdType* pts = 0;
> --  grid->GetCellPoints(myVtkID, npts, pts);
> --  grid->RemoveReferenceToCell(pts[0], myVtkID);
> --  pts[0] = node->getVtkId();
> --#endif
> -   node->AddInverseElement(this),
> -   SMDS_Mesh::_meshList[myMeshId]->setMyModified();
> - }
> Index: cad/freecad//patches/patch-src_3rdParty_salomesmesh_src_SMDS_SMDS_VtkVolume_cpp
> ===================================================================
> RCS file: cad/freecad//patches/patch-src_3rdParty_salomesmesh_src_SMDS_SMDS_VtkVolume_cpp
> diff -N cad/freecad//patches/patch-src_3rdParty_salomesmesh_src_SMDS_SMDS_VtkVolume_cpp
> --- cad/freecad//patches/patch-src_3rdParty_salomesmesh_src_SMDS_SMDS_VtkVolume_cpp	16 May 2026 15:13:20 -0000	1.1
> +++ /dev/null	1 Jan 1970 00:00:00 -0000
> @@ -1,148 +0,0 @@
> -This patch has been merged upstream. Drop next update.
> -Commit: bd90728f886bbeb6d69aafd4f68f934109b96f91
> -Commit: 6d4ce9e9b84963688e283adaf775ed40d5d775a1
> -
> -Index: src/3rdParty/salomesmesh/src/SMDS/SMDS_VtkVolume.cpp
> ---- src/3rdParty/salomesmesh/src/SMDS/SMDS_VtkVolume.cpp.orig
> -+++ src/3rdParty/salomesmesh/src/SMDS/SMDS_VtkVolume.cpp
> -@@ -133,7 +133,6 @@ void SMDS_VtkVolume::initPoly(const std::vector<vtkIdT
> - bool SMDS_VtkVolume::ChangeNodes(const SMDS_MeshNode* nodes[], const int nbNodes)
> - {
> -   vtkUnstructuredGrid* grid = SMDS_Mesh::_meshList[myMeshId]->getGrid();
> --#ifdef VTK_CELL_ARRAY_V2
> -   vtkNew<vtkIdList> cellPoints;
> -   grid->GetCellPoints(myVtkID, cellPoints.GetPointer());
> -   if (nbNodes != cellPoints->GetNumberOfIds())
> -@@ -145,20 +144,6 @@ bool SMDS_VtkVolume::ChangeNodes(const SMDS_MeshNode* 
> -     {
> -       cellPoints->SetId(i, nodes[i]->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;
> --    }
> --  for (int i = 0; i < nbNodes; i++)
> --    {
> --      pts[i] = nodes[i]->getVtkId();
> --    }
> --#endif
> -   SMDS_Mesh::_meshList[myMeshId]->setMyModified();
> -   return true;
> - }
> -@@ -220,9 +205,10 @@ int SMDS_VtkVolume::NbFaces() const
> -       break;
> -     case VTK_POLYHEDRON:
> -       {
> --        vtkIdType nFaces = 0;
> --        vtkIdTypePtr ptIds = 0;
> --        grid->GetFaceStream(this->myVtkID, nFaces, ptIds);
> -+        vtkNew<vtkIdList> faceStream;
> -+        grid->GetFaceStream( this->myVtkID, faceStream);
> -+        vtkIdType nFaces = faceStream->GetId(0);
> -+        vtkIdType *ptIds = faceStream->GetPointer(1);
> -         nbFaces = nFaces;
> -         break;
> -       }
> -@@ -249,9 +235,10 @@ int SMDS_VtkVolume::NbNodes() const
> -     }
> -   else
> -     {
> --      vtkIdType nFaces = 0;
> --      vtkIdTypePtr ptIds = 0;
> --      grid->GetFaceStream(this->myVtkID, nFaces, ptIds);
> -+      vtkNew<vtkIdList> faceStream;
> -+      grid->GetFaceStream( this->myVtkID, faceStream);
> -+      vtkIdType nFaces = faceStream->GetId(0);
> -+      vtkIdType *ptIds = faceStream->GetPointer(1);
> -       int id = 0;
> -       for (int i = 0; i < nFaces; i++)
> -         {
> -@@ -289,9 +276,10 @@ int SMDS_VtkVolume::NbEdges() const
> -       break;
> -     case VTK_POLYHEDRON:
> -       {
> --        vtkIdType nFaces = 0;
> --        vtkIdTypePtr ptIds = 0;
> --        grid->GetFaceStream(this->myVtkID, nFaces, ptIds);
> -+        vtkNew<vtkIdList> faceStream;
> -+        grid->GetFaceStream( this->myVtkID, faceStream);
> -+        vtkIdType nFaces = faceStream->GetId(0);
> -+        vtkIdType *ptIds = faceStream->GetPointer(1);
> -         nbEdges = 0;
> -         int id = 0;
> -         for (int i = 0; i < nFaces; i++)
> -@@ -325,9 +313,10 @@ int SMDS_VtkVolume::NbFaceNodes(const int face_ind) co
> -   int nbNodes = 0;
> -   if (aVtkType == VTK_POLYHEDRON)
> -     {
> --      vtkIdType nFaces = 0;
> --      vtkIdTypePtr ptIds = 0;
> --      grid->GetFaceStream(this->myVtkID, nFaces, ptIds);
> -+      vtkNew<vtkIdList> faceStream;
> -+      grid->GetFaceStream( this->myVtkID, faceStream);
> -+      vtkIdType nFaces = faceStream->GetId(0);
> -+      vtkIdType *ptIds = faceStream->GetPointer(1);
> -       int id = 0;
> -       for (int i = 0; i < nFaces; i++)
> -         {
> -@@ -355,9 +344,10 @@ const SMDS_MeshNode* SMDS_VtkVolume::GetFaceNode(const
> -   const SMDS_MeshNode* node = 0;
> -   if (aVtkType == VTK_POLYHEDRON)
> -     {
> --      vtkIdType nFaces = 0;
> --      vtkIdTypePtr ptIds = 0;
> --      grid->GetFaceStream(this->myVtkID, nFaces, ptIds);
> -+      vtkNew<vtkIdList> faceStream;
> -+      grid->GetFaceStream( this->myVtkID, faceStream);
> -+      vtkIdType nFaces = faceStream->GetId(0);
> -+      vtkIdType *ptIds = faceStream->GetPointer(1);
> -       int id = 0;
> -       for (int i = 0; i < nFaces; i++)
> -         {
> -@@ -385,9 +375,10 @@ std::vector<int> SMDS_VtkVolume::GetQuantities() const
> -   vtkIdType aVtkType = grid->GetCellType(this->myVtkID);
> -   if (aVtkType == VTK_POLYHEDRON)
> -     {
> --      vtkIdType nFaces = 0;
> --      vtkIdTypePtr ptIds = 0;
> --      grid->GetFaceStream(this->myVtkID, nFaces, ptIds);
> -+      vtkNew<vtkIdList> faceStream;
> -+      grid->GetFaceStream( this->myVtkID, faceStream);
> -+      vtkIdType nFaces = faceStream->GetId(0);
> -+      vtkIdType *ptIds = faceStream->GetPointer(1);
> -       int id = 0;
> -       for (int i = 0; i < nFaces; i++)
> -         {
> -@@ -443,9 +434,10 @@ const SMDS_MeshNode* SMDS_VtkVolume::GetNode(const int
> -   vtkIdType aVtkType = grid->GetCellType(this->myVtkID);
> -   if ( aVtkType == VTK_POLYHEDRON)
> -   {
> --    vtkIdType nFaces = 0;
> --    vtkIdTypePtr ptIds = 0;
> --    grid->GetFaceStream(this->myVtkID, nFaces, ptIds);
> -+    vtkNew<vtkIdList> faceStream;
> -+    grid->GetFaceStream( this->myVtkID, faceStream);
> -+    vtkIdType nFaces = faceStream->GetId(0);
> -+    vtkIdType *ptIds = faceStream->GetPointer(1);
> -     int id = 0, nbPoints = 0;
> -     for (int i = 0; i < nFaces; i++)
> -     {
> -@@ -474,9 +466,10 @@ int SMDS_VtkVolume::GetNodeIndex( const SMDS_MeshNode*
> -   const  vtkIdType aVtkType = grid->GetCellType(this->myVtkID);
> -   if ( aVtkType == VTK_POLYHEDRON)
> -   {
> --    vtkIdType nFaces = 0;
> --    vtkIdTypePtr ptIds = 0;
> --    grid->GetFaceStream(this->myVtkID, nFaces, ptIds);
> -+    vtkNew<vtkIdList> faceStream;
> -+    grid->GetFaceStream( this->myVtkID, faceStream);
> -+    vtkIdType nFaces = faceStream->GetId(0);
> -+    vtkIdType *ptIds = faceStream->GetPointer(1);
> -     int id = 0;
> -     for (int iF = 0; iF < nFaces; iF++)
> -     {
> Index: cad/freecad//patches/patch-src_3rdParty_salomesmesh_src_SMESH_SMESH_MeshEditor_cpp
> ===================================================================
> RCS file: cad/freecad//patches/patch-src_3rdParty_salomesmesh_src_SMESH_SMESH_MeshEditor_cpp
> diff -N cad/freecad//patches/patch-src_3rdParty_salomesmesh_src_SMESH_SMESH_MeshEditor_cpp
> --- cad/freecad//patches/patch-src_3rdParty_salomesmesh_src_SMESH_SMESH_MeshEditor_cpp	16 May 2026 15:13:20 -0000	1.1
> +++ /dev/null	1 Jan 1970 00:00:00 -0000
> @@ -1,32 +0,0 @@
> -This patch has been merged upstream. Drop next update.
> -Commit: c9acda2a659f9ac079fefd2c0b8d6ff9c8a8238e
> -
> -Index: src/3rdParty/salomesmesh/src/SMESH/SMESH_MeshEditor.cpp
> ---- src/3rdParty/salomesmesh/src/SMESH/SMESH_MeshEditor.cpp.orig
> -+++ src/3rdParty/salomesmesh/src/SMESH/SMESH_MeshEditor.cpp
> -@@ -57,6 +57,7 @@
> - #include "utilities.h"
> - #include "chrono.hxx"
> - 
> -+#include <vtkVersion.h>
> - #include <BRepAdaptor_Surface.hxx>
> - #include <BRepBuilderAPI_MakeEdge.hxx>
> - #include <BRepClass3d_SolidClassifier.hxx>
> -@@ -11348,7 +11349,7 @@ bool SMESH_MeshEditor::DoubleNodesOnGroupBoundaries( c
> -             {
> -               int oldId = *itn;
> -               //MESSAGE("     node " << oldId);
> --#if VTK_VERSION_NUMBER_QUICK >= 90300000000
> -+#if VTK_VERSION_NUMBER >= VTK_VERSION_CHECK(9, 2, 20221112)
> -               vtkCellLinks::Link l = static_cast<vtkCellLinks*>(grid->GetLinks())->GetLink(oldId);
> - #else
> -               vtkCellLinks::Link l = static_cast<vtkCellLinks*>(grid->GetCellLinks())->GetLink(oldId);
> -@@ -11712,7 +11713,7 @@ bool SMESH_MeshEditor::DoubleNodesOnGroupBoundaries( c
> -         {
> -           int oldId = itnod->first;
> -           //MESSAGE("     node " << oldId);
> --#if VTK_VERSION_NUMBER_QUICK >= 90300000000
> -+#if VTK_VERSION_NUMBER >= VTK_VERSION_CHECK(9, 2, 20221112)
> -           vtkCellLinks::Link l = static_cast<vtkCellLinks*>(grid->GetLinks())->GetLink(oldId);
> - #else
> -           vtkCellLinks::Link l = static_cast<vtkCellLinks*>(grid->GetCellLinks())->GetLink(oldId);
> Index: cad/freecad//patches/patch-src_Gui_View3DInventor_cpp
> ===================================================================
> RCS file: cad/freecad//patches/patch-src_Gui_View3DInventor_cpp
> diff -N cad/freecad//patches/patch-src_Gui_View3DInventor_cpp
> --- cad/freecad//patches/patch-src_Gui_View3DInventor_cpp	16 May 2026 15:13:20 -0000	1.1
> +++ /dev/null	1 Jan 1970 00:00:00 -0000
> @@ -1,15 +0,0 @@
> -This patch has been merged upstream. Drop next update.
> -Commit: ee09d4e696aa530e100b840428ab9c358032c744
> -
> -Index: src/Gui/View3DInventor.cpp
> ---- src/Gui/View3DInventor.cpp.orig
> -+++ src/Gui/View3DInventor.cpp
> -@@ -604,7 +604,7 @@ bool View3DInventor::setCamera(const char* pCamera)
> -     }
> - 
> -     // this is to make sure to reliably delete the node
> --    CoinPtr<SoNode> camPtr(Cam, true);
> -+    CoinPtr<SoNode> camPtr {Cam};
> - 
> -     // toggle between perspective and orthographic camera
> -     if (Cam->getTypeId() != CamViewer->getTypeId()) {
> Index: cad/freecad//patches/patch-src_Gui_ViewProviderLink_cpp
> ===================================================================
> RCS file: cad/freecad//patches/patch-src_Gui_ViewProviderLink_cpp
> diff -N cad/freecad//patches/patch-src_Gui_ViewProviderLink_cpp
> --- cad/freecad//patches/patch-src_Gui_ViewProviderLink_cpp	16 May 2026 15:13:20 -0000	1.1
> +++ /dev/null	1 Jan 1970 00:00:00 -0000
> @@ -1,15 +0,0 @@
> -This patch has been merged upstream. Drop next update.
> -Commit: ee09d4e696aa530e100b840428ab9c358032c744
> -
> -Index: src/Gui/ViewProviderLink.cpp
> ---- src/Gui/ViewProviderLink.cpp.orig
> -+++ src/Gui/ViewProviderLink.cpp
> -@@ -1624,7 +1624,7 @@ void LinkView::updateLink()
> - bool LinkView::linkGetElementPicked(const SoPickedPoint* pp, std::string& subname) const
> - {
> -     std::ostringstream ss;
> --    CoinPtr<SoPath> path = pp->getPath();
> -+    CoinPtr<SoPath> path {pp->getPath()};
> -     if (!nodeArray.empty()) {
> -         auto idx = path->findNode(pcLinkRoot);
> -         if (idx < 0 || idx + 2 >= path->getLength()) {
> Index: cad/freecad//patches/patch-src_Gui_ViewProvider_h
> ===================================================================
> RCS file: cad/freecad//patches/patch-src_Gui_ViewProvider_h
> diff -N cad/freecad//patches/patch-src_Gui_ViewProvider_h
> --- cad/freecad//patches/patch-src_Gui_ViewProvider_h	16 May 2026 15:13:20 -0000	1.1
> +++ /dev/null	1 Jan 1970 00:00:00 -0000
> @@ -1,123 +0,0 @@
> -This patch has been merged upstream. Drop next update.
> -Commit: ee09d4e696aa530e100b840428ab9c358032c744
> -
> -Index: src/Gui/ViewProvider.h
> ---- src/Gui/ViewProvider.h.orig
> -+++ src/Gui/ViewProvider.h
> -@@ -87,26 +87,102 @@ enum ViewStatus
> - };
> - 
> - 
> -+/** Convenience smart pointer to manage the lifetime of coin nodes.
> -+ *
> -+ * This class is copied from Inventor/misc/SoRefPtr.h and can be removed when the
> -+ * minimum supported coin version provides this header.
> -+ */
> -+template<typename T>
> -+class SoRefPtr
> -+{
> -+public:
> -+    SoRefPtr(void) noexcept
> -+        : ptr(NULL)
> -+    {}
> -+
> -+    explicit SoRefPtr(T* p)
> -+        : ptr(p)
> -+    {
> -+        if (this->ptr) {
> -+            this->ptr->ref();
> -+        }
> -+    }
> -+
> -+    SoRefPtr(const SoRefPtr& other)
> -+        : ptr(other.ptr)
> -+    {
> -+        if (this->ptr) {
> -+            this->ptr->ref();
> -+        }
> -+    }
> -+
> -+    SoRefPtr(SoRefPtr&& other) noexcept
> -+        : ptr(other.ptr)
> -+    {
> -+        other.ptr = NULL;
> -+    }
> -+
> -+    ~SoRefPtr(void)
> -+    {
> -+        if (this->ptr) {
> -+            this->ptr->unref();
> -+        }
> -+    }
> -+
> -+    SoRefPtr& operator=(SoRefPtr other) noexcept
> -+    {
> -+        this->swap(other);
> -+        return *this;
> -+    }
> -+
> -+    void reset(T* p = NULL)
> -+    {
> -+        SoRefPtr tmp(p);
> -+        this->swap(tmp);
> -+    }
> -+
> -+    T* get(void) const noexcept
> -+    {
> -+        return this->ptr;
> -+    }
> -+    T& operator*(void) const
> -+    {
> -+        return *this->ptr;
> -+    }
> -+    T* operator->(void) const noexcept
> -+    {
> -+        return this->ptr;
> -+    }
> -+    explicit operator bool(void) const noexcept
> -+    {
> -+        return this->ptr != NULL;
> -+    }
> -+
> -+    void swap(SoRefPtr& other) noexcept
> -+    {
> -+        using std::swap;
> -+        swap(this->ptr, other.ptr);
> -+    }
> -+
> -+private:
> -+    T* ptr;
> -+};
> -+
> - /** Convenience smart pointer to wrap coin node.
> -  *
> -- * It is basically boost::intrusive plus implicit pointer conversion to save the
> -- * trouble of typing get() all the time.
> -+ * This class isn't merged with SoRefPtr because it can be removed in the future
> -  */
> - template<class T>
> --class CoinPtr: public boost::intrusive_ptr<T>
> -+class CoinPtr: public SoRefPtr<T>
> - {
> - public:
> --    // Too bad, VC2013 does not support constructor inheritance
> --    // using boost::intrusive_ptr<T>::intrusive_ptr;
> --    using inherited = boost::intrusive_ptr<T>;
> --    CoinPtr() = default;
> --    CoinPtr(T* p, bool add_ref = true)
> --        : inherited(p, add_ref)
> --    {}
> --    template<class Y>
> --    CoinPtr(CoinPtr<Y> const& r)
> --        : inherited(r)
> --    {}
> -+    using SoRefPtr<T>::SoRefPtr;
> -+
> -+    CoinPtr& operator=(T* ptr)
> -+    {
> -+        SoRefPtr<T>::reset(ptr);
> -+        return *this;
> -+    }
> - 
> -     operator T*() const
> -     {
> Index: cad/freecad//patches/patch-src_Mod_Fem_App_FemPostPipeline_h
> ===================================================================
> RCS file: cad/freecad//patches/patch-src_Mod_Fem_App_FemPostPipeline_h
> diff -N cad/freecad//patches/patch-src_Mod_Fem_App_FemPostPipeline_h
> --- cad/freecad//patches/patch-src_Mod_Fem_App_FemPostPipeline_h	16 May 2026 15:13:20 -0000	1.1
> +++ /dev/null	1 Jan 1970 00:00:00 -0000
> @@ -1,15 +0,0 @@
> -This patch has been merged upstream. Drop next update.
> -Commit: c9acda2a659f9ac079fefd2c0b8d6ff9c8a8238e
> -
> -Index: src/Mod/Fem/App/FemPostPipeline.h
> ---- src/Mod/Fem/App/FemPostPipeline.h.orig
> -+++ src/Mod/Fem/App/FemPostPipeline.h
> -@@ -32,7 +32,7 @@
> - #include "FemResultObject.h"
> - #include "VTKExtensions/vtkFemFrameSourceAlgorithm.h"
> - 
> --#if VTK_VERSION_NUMBER < VTK_VERSION_CHECK(9, 3, 0)
> -+#if VTK_VERSION_NUMBER < VTK_VERSION_CHECK(9, 2, 20230125)
> - # include "VTKExtensions/vtkCleanUnstructuredGrid.h"
> - #else
> - # include <vtkCleanUnstructuredGrid.h>
> Index: cad/freecad//patches/patch-src_Mod_Fem_App_PreCompiled_h
> ===================================================================
> RCS file: cad/freecad//patches/patch-src_Mod_Fem_App_PreCompiled_h
> diff -N cad/freecad//patches/patch-src_Mod_Fem_App_PreCompiled_h
> --- cad/freecad//patches/patch-src_Mod_Fem_App_PreCompiled_h	16 May 2026 15:13:20 -0000	1.1
> +++ /dev/null	1 Jan 1970 00:00:00 -0000
> @@ -1,15 +0,0 @@
> -This patch has been merged upstream. Drop next update.
> -Commit: c9acda2a659f9ac079fefd2c0b8d6ff9c8a8238e
> -
> -Index: src/Mod/Fem/App/PreCompiled.h
> ---- src/Mod/Fem/App/PreCompiled.h.orig
> -+++ src/Mod/Fem/App/PreCompiled.h
> -@@ -151,7 +151,7 @@
> - #include <vtkAppendFilter.h>
> - #include <vtkArrayCalculator.h>
> - #include <vtkCellArray.h>
> --#if VTK_VERSION_NUMBER >= VTK_VERSION_CHECK(9, 3, 0)
> -+#if VTK_VERSION_NUMBER >= VTK_VERSION_CHECK(9, 2, 20230125)
> - # include <vtkCleanUnstructuredGrid.h>
> - #endif
> - #include <vtkCompositeDataSet.h>
> Index: cad/freecad//patches/patch-src_Mod_Fem_App_PropertyPostDataObject_cpp
> ===================================================================
> RCS file: cad/freecad//patches/patch-src_Mod_Fem_App_PropertyPostDataObject_cpp
> diff -N cad/freecad//patches/patch-src_Mod_Fem_App_PropertyPostDataObject_cpp
> --- cad/freecad//patches/patch-src_Mod_Fem_App_PropertyPostDataObject_cpp	16 May 2026 15:13:20 -0000	1.1
> +++ /dev/null	1 Jan 1970 00:00:00 -0000
> @@ -1,21 +0,0 @@
> -This patch has been merged upstream. Drop next update.
> -Commit: bd90728f886bbeb6d69aafd4f68f934109b96f91
> -
> -Index: src/Mod/Fem/App/PropertyPostDataObject.cpp
> ---- src/Mod/Fem/App/PropertyPostDataObject.cpp.orig
> -+++ src/Mod/Fem/App/PropertyPostDataObject.cpp
> -@@ -400,14 +400,12 @@ void PropertyPostDataObject::SaveDocFile(Base::Writer&
> -         xmlWriter->SetInputDataObject(m_dataObject);
> -         xmlWriter->SetFileName(fi.filePath().c_str());
> - 
> --#ifdef VTK_CELL_ARRAY_V2
> -         // Looks like an invalid data object that causes a crash with vtk9
> -         vtkUnstructuredGrid* dataGrid = vtkUnstructuredGrid::SafeDownCast(m_dataObject);
> -         if (dataGrid && (dataGrid->GetPiece() < 0 || dataGrid->GetNumberOfPoints() <= 0)) {
> -             std::cerr << "PropertyPostDataObject::SaveDocFile: ignore empty vtkUnstructuredGrid\n";
> -             return;
> -         }
> --#endif
> -     }
> -     xmlWriter->SetDataModeToBinary();
> - 
> Index: cad/freecad//patches/patch-src_Mod_Fem_Gui_ViewProviderFemPostObject_cpp
> ===================================================================
> RCS file: cad/freecad//patches/patch-src_Mod_Fem_Gui_ViewProviderFemPostObject_cpp
> diff -N cad/freecad//patches/patch-src_Mod_Fem_Gui_ViewProviderFemPostObject_cpp
> --- cad/freecad//patches/patch-src_Mod_Fem_Gui_ViewProviderFemPostObject_cpp	16 May 2026 15:13:20 -0000	1.1
> +++ /dev/null	1 Jan 1970 00:00:00 -0000
> @@ -1,18 +0,0 @@
> -This patch has been merged upstream. Drop next update.
> -Commit: bd90728f886bbeb6d69aafd4f68f934109b96f91
> -
> -Index: src/Mod/Fem/Gui/ViewProviderFemPostObject.cpp
> ---- src/Mod/Fem/Gui/ViewProviderFemPostObject.cpp.orig
> -+++ src/Mod/Fem/Gui/ViewProviderFemPostObject.cpp
> -@@ -75,11 +75,7 @@
> - using namespace FemGui;
> - namespace sp = std::placeholders;
> - 
> --#ifdef VTK_CELL_ARRAY_V2
> - using vtkIdTypePtr = const vtkIdType*;
> --#else
> --using vtkIdTypePtr = vtkIdType*;
> --#endif
> - 
> - // ----------------------------------------------------------------------------
> - 
> Index: cad/freecad//patches/patch-src_Mod_TechDraw_Gui_CommandCreateDims_cpp
> ===================================================================
> RCS file: /cvs/ports/cad/freecad/patches/patch-src_Mod_TechDraw_Gui_CommandCreateDims_cpp,v
> diff -u -p -r1.1 patch-src_Mod_TechDraw_Gui_CommandCreateDims_cpp
> --- cad/freecad//patches/patch-src_Mod_TechDraw_Gui_CommandCreateDims_cpp	24 Aug 2026 21:23:42 -0000	1.1
> +++ cad/freecad//patches/patch-src_Mod_TechDraw_Gui_CommandCreateDims_cpp	11 Oct 2026 18:08:11 -0000
> @@ -5,7 +5,7 @@ See https://github.com/FreeCAD/FreeCAD/p
>  Index: src/Mod/TechDraw/Gui/CommandCreateDims.cpp
>  --- src/Mod/TechDraw/Gui/CommandCreateDims.cpp.orig
>  +++ src/Mod/TechDraw/Gui/CommandCreateDims.cpp
> -@@ -1097,7 +1097,7 @@ class TDHandlerDimension : public TechDrawHandler, (pr
> +@@ -1103,7 +1103,7 @@ class TDHandlerDimension : public TechDrawHandler, (pr
>               TechDraw::pointPair pp = dim->getLinearPoints();
>               float dx = pp.first().x - pp.second().x;
>               float dy = pp.first().y - pp.second().y;
> Index: cad/freecad//patches/patch-tests_CMakeLists_txt
> ===================================================================
> RCS file: /cvs/ports/cad/freecad/patches/patch-tests_CMakeLists_txt,v
> diff -u -p -r1.2 patch-tests_CMakeLists_txt
> --- cad/freecad//patches/patch-tests_CMakeLists_txt	16 May 2026 15:13:20 -0000	1.2
> +++ cad/freecad//patches/patch-tests_CMakeLists_txt	11 Oct 2026 18:08:11 -0000
> @@ -1,7 +1,7 @@
>  Index: tests/CMakeLists.txt
>  --- tests/CMakeLists.txt.orig
>  +++ tests/CMakeLists.txt
> -@@ -157,6 +157,7 @@ foreach (exe ${TestExecutables})
> +@@ -160,6 +160,7 @@ foreach (exe ${TestExecutables})
>           endif()
>       else()
>           set_target_properties(${exe} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/tests)
> Index: cad/freecad//pkg/PLIST
> ===================================================================
> RCS file: /cvs/ports/cad/freecad/pkg/PLIST,v
> diff -u -p -r1.5 PLIST
> --- cad/freecad//pkg/PLIST	16 May 2026 15:13:20 -0000	1.5
> +++ cad/freecad//pkg/PLIST	11 Oct 2026 18:08:13 -0000
> @@ -803,6 +803,7 @@ lib/freecad/Mod/BIM/bimtests/TestArchStr
>  lib/freecad/Mod/BIM/bimtests/TestArchTruss.py
>  lib/freecad/Mod/BIM/bimtests/TestArchWall.py
>  lib/freecad/Mod/BIM/bimtests/TestArchWindow.py
> +lib/freecad/Mod/BIM/bimtests/TestArchWindowGui.py
>  lib/freecad/Mod/BIM/bimtests/TestWebGLExport.py
>  lib/freecad/Mod/BIM/bimtests/TestWebGLExportGui.py
>  lib/freecad/Mod/BIM/bimtests/${MODPY_PYCACHE}/
> @@ -864,12 +865,15 @@ lib/freecad/Mod/BIM/bimtests/${MODPY_PYC
>  lib/freecad/Mod/BIM/bimtests/${MODPY_PYCACHE}TestArchWall.${MODPY_PYC_MAGIC_TAG}pyc
>  lib/freecad/Mod/BIM/bimtests/${MODPY_PYCACHE}TestArchWindow.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
>  lib/freecad/Mod/BIM/bimtests/${MODPY_PYCACHE}TestArchWindow.${MODPY_PYC_MAGIC_TAG}pyc
> +lib/freecad/Mod/BIM/bimtests/${MODPY_PYCACHE}TestArchWindowGui.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
> +lib/freecad/Mod/BIM/bimtests/${MODPY_PYCACHE}TestArchWindowGui.${MODPY_PYC_MAGIC_TAG}pyc
>  lib/freecad/Mod/BIM/bimtests/${MODPY_PYCACHE}TestWebGLExport.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
>  lib/freecad/Mod/BIM/bimtests/${MODPY_PYCACHE}TestWebGLExport.${MODPY_PYC_MAGIC_TAG}pyc
>  lib/freecad/Mod/BIM/bimtests/${MODPY_PYCACHE}TestWebGLExportGui.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
>  lib/freecad/Mod/BIM/bimtests/${MODPY_PYCACHE}TestWebGLExportGui.${MODPY_PYC_MAGIC_TAG}pyc
>  lib/freecad/Mod/BIM/bimtests/fixtures/
>  lib/freecad/Mod/BIM/bimtests/fixtures/FC_site_simple-102.FCStd
> +lib/freecad/Mod/BIM/bimtests/test_roof_subtraction.brep
>  lib/freecad/Mod/BIM/importers/
>  lib/freecad/Mod/BIM/importers/Sample.sh3d
>  lib/freecad/Mod/BIM/importers/__init__.py
> @@ -3962,6 +3966,8 @@ lib/freecad/Mod/Fem/femtest/app/${MODPY_
>  lib/freecad/Mod/Fem/femtest/app/${MODPY_PYCACHE}test_open.${MODPY_PYC_MAGIC_TAG}pyc
>  lib/freecad/Mod/Fem/femtest/app/${MODPY_PYCACHE}test_result.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
>  lib/freecad/Mod/Fem/femtest/app/${MODPY_PYCACHE}test_result.${MODPY_PYC_MAGIC_TAG}pyc
> +lib/freecad/Mod/Fem/femtest/app/${MODPY_PYCACHE}test_security.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
> +lib/freecad/Mod/Fem/femtest/app/${MODPY_PYCACHE}test_security.${MODPY_PYC_MAGIC_TAG}pyc
>  lib/freecad/Mod/Fem/femtest/app/${MODPY_PYCACHE}test_solver_elmer.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
>  lib/freecad/Mod/Fem/femtest/app/${MODPY_PYCACHE}test_solver_elmer.${MODPY_PYC_MAGIC_TAG}pyc
>  lib/freecad/Mod/Fem/femtest/app/${MODPY_PYCACHE}test_solver_mystran.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
> @@ -3977,6 +3983,7 @@ lib/freecad/Mod/Fem/femtest/app/test_mes
>  lib/freecad/Mod/Fem/femtest/app/test_object.py
>  lib/freecad/Mod/Fem/femtest/app/test_open.py
>  lib/freecad/Mod/Fem/femtest/app/test_result.py
> +lib/freecad/Mod/Fem/femtest/app/test_security.py
>  lib/freecad/Mod/Fem/femtest/app/test_solver_elmer.py
>  lib/freecad/Mod/Fem/femtest/app/test_solver_mystran.py
>  lib/freecad/Mod/Fem/femtest/app/test_solver_z88.py
> @@ -4989,6 +4996,8 @@ lib/freecad/Mod/Sketcher/Profiles.py
>  lib/freecad/Mod/Sketcher/SketcherExample.py
>  lib/freecad/Mod/Sketcher/SketcherTests/
>  lib/freecad/Mod/Sketcher/SketcherTests/TestPlacementUpdate.py
> +lib/freecad/Mod/Sketcher/SketcherTests/TestSketchCarbonCopyReverseMapping.FCStd
> +lib/freecad/Mod/Sketcher/SketcherTests/TestSketchCarbonCopyReverseMapping.py
>  lib/freecad/Mod/Sketcher/SketcherTests/TestSketchExpression.py
>  lib/freecad/Mod/Sketcher/SketcherTests/TestSketchFillet.py
>  lib/freecad/Mod/Sketcher/SketcherTests/TestSketchValidateCoincidents.py
> @@ -4997,6 +5006,8 @@ lib/freecad/Mod/Sketcher/SketcherTests/_
>  lib/freecad/Mod/Sketcher/SketcherTests/${MODPY_PYCACHE}/
>  lib/freecad/Mod/Sketcher/SketcherTests/${MODPY_PYCACHE}TestPlacementUpdate.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
>  lib/freecad/Mod/Sketcher/SketcherTests/${MODPY_PYCACHE}TestPlacementUpdate.${MODPY_PYC_MAGIC_TAG}pyc
> +lib/freecad/Mod/Sketcher/SketcherTests/${MODPY_PYCACHE}TestSketchCarbonCopyReverseMapping.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
> +lib/freecad/Mod/Sketcher/SketcherTests/${MODPY_PYCACHE}TestSketchCarbonCopyReverseMapping.${MODPY_PYC_MAGIC_TAG}pyc
>  lib/freecad/Mod/Sketcher/SketcherTests/${MODPY_PYCACHE}TestSketchExpression.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
>  lib/freecad/Mod/Sketcher/SketcherTests/${MODPY_PYCACHE}TestSketchExpression.${MODPY_PYC_MAGIC_TAG}pyc
>  lib/freecad/Mod/Sketcher/SketcherTests/${MODPY_PYCACHE}TestSketchFillet.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
> @@ -5198,6 +5209,7 @@ lib/freecad/Mod/Test/TestData/content_it
>  lib/freecad/Mod/Test/TestGui.py
>  lib/freecad/Mod/Test/TestPerf.py
>  lib/freecad/Mod/Test/TestPythonSyntax.py
> +lib/freecad/Mod/Test/TestTreeSelection.py
>  lib/freecad/Mod/Test/UnicodeTests.py
>  lib/freecad/Mod/Test/UnitTests.py
>  lib/freecad/Mod/Test/Workbench.py
> @@ -5227,6 +5239,8 @@ lib/freecad/Mod/Test/${MODPY_PYCACHE}Tes
>  lib/freecad/Mod/Test/${MODPY_PYCACHE}TestPerf.${MODPY_PYC_MAGIC_TAG}pyc
>  lib/freecad/Mod/Test/${MODPY_PYCACHE}TestPythonSyntax.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
>  lib/freecad/Mod/Test/${MODPY_PYCACHE}TestPythonSyntax.${MODPY_PYC_MAGIC_TAG}pyc
> +lib/freecad/Mod/Test/${MODPY_PYCACHE}TestTreeSelection.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
> +lib/freecad/Mod/Test/${MODPY_PYCACHE}TestTreeSelection.${MODPY_PYC_MAGIC_TAG}pyc
>  lib/freecad/Mod/Test/${MODPY_PYCACHE}UnicodeTests.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
>  lib/freecad/Mod/Test/${MODPY_PYCACHE}UnicodeTests.${MODPY_PYC_MAGIC_TAG}pyc
>  lib/freecad/Mod/Test/${MODPY_PYCACHE}UnitTests.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
>