git: d25a7563aaa6 - main - cad/freecad: update to 0.19.4

From: Christoph Moench-Tegeder <cmt_at_FreeBSD.org>
Date: Thu, 03 Mar 2022 21:10:55 UTC
The branch main has been updated by cmt:

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

commit d25a7563aaa6b357e7ee4fcea1a634bbc5fb40c9
Author:     Christoph Moench-Tegeder <cmt@FreeBSD.org>
AuthorDate: 2022-03-03 21:08:54 +0000
Commit:     Christoph Moench-Tegeder <cmt@FreeBSD.org>
CommitDate: 2022-03-03 21:08:54 +0000

    cad/freecad: update to 0.19.4
    
    Notes:
      https://github.com/FreeCAD/FreeCAD/releases/tag/0.19.4
    
    Also switch back to current opencascade to make this port actually
    installable in the presence of other ports
---
 cad/freecad/Makefile                               |   4 +-
 cad/freecad/distinfo                               |   6 +-
 .../patch-74639da997d5f2e53f001d9f256be86ceee901f5 | 477 +++++++++++++++++++++
 ...c_3rdParty_salomesmesh_src_SMESH_SMESH_Mesh.cpp |  10 +
 .../files/patch-src_Mod_Fem_App_FemConstraint.cpp  |  22 +
 .../patch-src_Mod_Fem_App_FemConstraintFixed.cpp   |  11 +
 .../patch-src_Mod_MeshPart_App_MeshFlattening.cpp  |  52 +++
 ...h-src_Mod_PartDesign_Gui_ViewProviderAddSub.cpp |  21 +
 ..._Mod_PartDesign_Gui_ViewProviderTransformed.cpp |  19 +
 .../files/patch-src_Mod_Part_App_AppPartPy.cpp     |  29 ++
 cad/freecad/files/patch-src_Mod_Part_App_Tools.cpp |  45 ++
 .../files/patch-src_Mod_Part_App_TopoShape.cpp     | 146 +++++++
 .../patch-src_Mod_Part_Gui_ViewProviderExt.cpp     |  81 ++++
 .../patch-src_Mod_Raytracing_App_PovTools.cpp      |  23 +
 14 files changed, 941 insertions(+), 5 deletions(-)

diff --git a/cad/freecad/Makefile b/cad/freecad/Makefile
index 47bf2a05f54e..2c9833d244fa 100644
--- a/cad/freecad/Makefile
+++ b/cad/freecad/Makefile
@@ -1,5 +1,5 @@
 PORTNAME=	FreeCAD
-DISTVERSION=	0.19.3
+DISTVERSION=	0.19.4
 # use these for bugfixes/snapshots
 # DISTVERSION=	0.18-16093 # git rev-list --count
 # DISTVERSIONSUFFIX=	-g690774c0e
@@ -22,7 +22,7 @@ LIB_DEPENDS=	libexpat.so:textproc/expat2 \
 		libpng.so:graphics/png \
 		libtiff.so:graphics/tiff \
 		libvtksys-${VTK_VER}.so:math/vtk${VTK_VER:R} \
-		libTKernel.so:cad/opencascade740 \
+		libTKernel.so:cad/opencascade \
 		libxerces-c.so:textproc/xerces-c3 \
 		libboost_thread.so:devel/boost-libs \
 		libarea.so:devel/libarea \
diff --git a/cad/freecad/distinfo b/cad/freecad/distinfo
index ce81c476485f..4786748e1b59 100644
--- a/cad/freecad/distinfo
+++ b/cad/freecad/distinfo
@@ -1,3 +1,3 @@
-TIMESTAMP = 1646330977
-SHA256 (FreeCAD-FreeCAD-0.19.3_GH0.tar.gz) = 568fa32a9601693ff9273f3a5a2e825915f58b2455ffa173bc23f981edecd07d
-SIZE (FreeCAD-FreeCAD-0.19.3_GH0.tar.gz) = 296986058
+TIMESTAMP = 1646236843
+SHA256 (FreeCAD-FreeCAD-0.19.4_GH0.tar.gz) = e40a1c343956e13c56cc8578d025ae83d68d9d20acda1732953bc8a3883e9722
+SIZE (FreeCAD-FreeCAD-0.19.4_GH0.tar.gz) = 296990652
diff --git a/cad/freecad/files/patch-74639da997d5f2e53f001d9f256be86ceee901f5 b/cad/freecad/files/patch-74639da997d5f2e53f001d9f256be86ceee901f5
new file mode 100644
index 000000000000..dcd1a2d81116
--- /dev/null
+++ b/cad/freecad/files/patch-74639da997d5f2e53f001d9f256be86ceee901f5
@@ -0,0 +1,477 @@
+commit 74639da997d5f2e53f001d9f256be86ceee901f5
+Author: wmayer <wmayer@users.sourceforge.net>
+Date:   Sat Oct 9 13:49:02 2021 +0200
+
+    OCCT: port FreeCAD sources to version 7.6
+    SMESH is not yet ported
+    Although FreeCAD code compiles with OCCT 7.6 it doesn't work at the moment
+
+diff --git src/Mod/Drawing/App/DrawingExport.cpp src/Mod/Drawing/App/DrawingExport.cpp
+index b87891ed50..7572be417c 100644
+--- src/Mod/Drawing/App/DrawingExport.cpp
++++ src/Mod/Drawing/App/DrawingExport.cpp
+@@ -64,10 +64,7 @@
+ #include <BRep_Tool.hxx>
+ 
+ #include <BRepAdaptor_CompCurve.hxx>
+-#include <BRepAdaptor_HCompCurve.hxx>
+ #include <Approx_Curve3d.hxx>
+-#include <BRepAdaptor_HCurve.hxx>
+-#include <BRepAdaptor_HCurve.hxx>
+ #include <Geom_BSplineCurve.hxx>
+ #include <Geom_BezierCurve.hxx>
+ #include <GeomConvert_BSplineCurveToBezierCurve.hxx>
+@@ -75,11 +72,19 @@
+ #include <Geom2d_BSplineCurve.hxx>
+ #include <BRepLProp_CLProps.hxx>
+ #include <Standard_Failure.hxx>
++#include <Standard_Version.hxx>
++#if OCC_VERSION_HEX < 0x070600
++#include <BRepAdaptor_HCurve.hxx>
++#endif
+ 
+ #include "DrawingExport.h"
+ #include <Base/Tools.h>
+ #include <Base/Vector3D.h>
+ 
++#if OCC_VERSION_HEX >= 0x070600
++using BRepAdaptor_HCurve = BRepAdaptor_Curve;
++#endif
++
+ using namespace Drawing;
+ using namespace std;
+ 
+diff --git src/Mod/Drawing/App/ProjectionAlgos.cpp src/Mod/Drawing/App/ProjectionAlgos.cpp
+index 9afae7e9c0..da03d49057 100644
+--- src/Mod/Drawing/App/ProjectionAlgos.cpp
++++ src/Mod/Drawing/App/ProjectionAlgos.cpp
+@@ -61,10 +61,7 @@
+ #include <BRepMesh_IncrementalMesh.hxx>
+ #include <BRepLib.hxx>
+ #include <BRepAdaptor_CompCurve.hxx>
+-#include <BRepAdaptor_HCompCurve.hxx>
+ #include <Approx_Curve3d.hxx>
+-#include <BRepAdaptor_HCurve.hxx>
+-#include <BRepAdaptor_HCurve.hxx>
+ #include <Geom_BSplineCurve.hxx>
+ #include <Geom_BezierCurve.hxx>
+ #include <GeomConvert_BSplineCurveToBezierCurve.hxx>
+diff --git src/Mod/Import/App/ImpExpDxf.cpp src/Mod/Import/App/ImpExpDxf.cpp
+index 09827bd928..dcd88ef138 100644
+--- src/Mod/Import/App/ImpExpDxf.cpp
++++ src/Mod/Import/App/ImpExpDxf.cpp
+@@ -29,7 +29,6 @@
+ 
+ #include <Approx_Curve3d.hxx>
+ #include <BRepAdaptor_Curve.hxx>
+-#include <BRepAdaptor_HCurve.hxx>
+ #include <BRep_Builder.hxx>
+ #include <BRepBuilderAPI_MakeEdge.hxx>
+ #include <BRepBuilderAPI_MakeVertex.hxx>
+@@ -47,6 +46,7 @@
+ #include <gp_Pnt.hxx>
+ #include <gp_Dir.hxx>
+ #include <gp_Vec.hxx>
++#include <Standard_Version.hxx>
+ #include <TopoDS.hxx>
+ #include <TopoDS_Edge.hxx>
+ #include <TopoDS_Vertex.hxx>
+@@ -55,6 +55,9 @@
+ #include <TopExp_Explorer.hxx>
+ #include <TopoDS_Edge.hxx>
+ #include <TColgp_Array1OfPnt.hxx>
++#if OCC_VERSION_HEX < 0x070600
++#include <BRepAdaptor_HCurve.hxx>
++#endif
+ 
+ #include <Base/Console.h>
+ #include <Base/Parameter.h>
+@@ -68,6 +71,10 @@
+ 
+ using namespace Import;
+ 
++#if OCC_VERSION_HEX >= 0x070600
++using BRepAdaptor_HCurve = BRepAdaptor_Curve;
++#endif
++
+ 
+ //******************************************************************************
+ // reading
+diff --git src/Mod/Part/App/GeomPlate/CurveConstraintPyImp.cpp src/Mod/Part/App/GeomPlate/CurveConstraintPyImp.cpp
+index 3271f3651a..b63227d537 100644
+--- src/Mod/Part/App/GeomPlate/CurveConstraintPyImp.cpp
++++ src/Mod/Part/App/GeomPlate/CurveConstraintPyImp.cpp
+@@ -24,10 +24,13 @@
+ #include "PreCompiled.h"
+ #ifndef _PreComp_
+ # include <GeomAdaptor_Curve.hxx>
+-# include <GeomAdaptor_HCurve.hxx>
+ # include <Geom2dAdaptor_Curve.hxx>
+-# include <Geom2dAdaptor_HCurve.hxx>
+ # include <Standard_Failure.hxx>
++# include <Standard_Version.hxx>
++# if OCC_VERSION_HEX < 0x070600
++# include <GeomAdaptor_HCurve.hxx>
++# include <Geom2dAdaptor_HCurve.hxx>
++# endif
+ #endif
+ 
+ #include "GeomPlate/CurveConstraintPy.h"
+@@ -76,6 +79,16 @@ int CurveConstraintPy::PyInit(PyObject* args, PyObject* kwds)
+                 return -1;
+             }
+ 
++#if OCC_VERSION_HEX >= 0x070600
++            Handle(Adaptor3d_Curve) hCurve;
++            if (curve->getTypeId().isDerivedFrom(GeomTrimmedCurve::getClassTypeId())) {
++                GeomTrimmedCurve* trim = static_cast<GeomTrimmedCurve*>(curve);
++                hCurve = new GeomAdaptor_Curve(handle, trim->getFirstParameter(), trim->getLastParameter());
++            }
++            else {
++                hCurve = new GeomAdaptor_Curve(handle);
++            }
++#else
+             Handle(Adaptor3d_HCurve) hCurve;
+             if (curve->getTypeId().isDerivedFrom(GeomTrimmedCurve::getClassTypeId())) {
+                 GeomTrimmedCurve* trim = static_cast<GeomTrimmedCurve*>(curve);
+@@ -86,6 +99,7 @@ int CurveConstraintPy::PyInit(PyObject* args, PyObject* kwds)
+                 GeomAdaptor_Curve adapt(handle);
+                 hCurve = new GeomAdaptor_HCurve(adapt);
+             }
++#endif
+ 
+             ptr.reset(new GeomPlate_CurveConstraint(hCurve, order, nbPts, tolDist, tolAng, tolCurv));
+         }
+@@ -212,11 +226,15 @@ PyObject* CurveConstraintPy::curve3d(PyObject *args)
+         return nullptr;
+ 
+     try {
+-        Handle(Adaptor3d_HCurve) hAdapt = getGeomPlate_CurveConstraintPtr()->Curve3d();
++        auto hAdapt = getGeomPlate_CurveConstraintPtr()->Curve3d();
+         if (hAdapt.IsNull())
+             Py_Return;
+ 
++#if OCC_VERSION_HEX >= 0x070600
++        const Adaptor3d_Curve& a3d = *hAdapt;
++#else
+         const Adaptor3d_Curve& a3d = hAdapt->Curve();
++#endif
+         std::unique_ptr<GeomCurve> ptr(Part::makeFromCurveAdaptor(a3d));
+         return ptr->getPyObject();
+     }
+@@ -282,6 +300,16 @@ PyObject* CurveConstraintPy::setProjectedCurve(PyObject *args)
+             return nullptr;
+         }
+ 
++#if OCC_VERSION_HEX >= 0x070600
++        Handle(Adaptor2d_Curve2d) hCurve;
++        if (handle->IsKind(STANDARD_TYPE(Geom2d_TrimmedCurve))) {
++            Handle(Geom2d_TrimmedCurve) aTC (Handle(Geom2d_TrimmedCurve)::DownCast (handle));
++            hCurve = new Geom2dAdaptor_Curve(handle, aTC->FirstParameter(), aTC->LastParameter());
++        }
++        else {
++            hCurve = new Geom2dAdaptor_Curve(handle);
++        }
++#else
+         Handle(Adaptor2d_HCurve2d) hCurve;
+         if (handle->IsKind(STANDARD_TYPE(Geom2d_TrimmedCurve))) {
+             Handle(Geom2d_TrimmedCurve) aTC (Handle(Geom2d_TrimmedCurve)::DownCast (handle));
+@@ -292,6 +320,7 @@ PyObject* CurveConstraintPy::setProjectedCurve(PyObject *args)
+             Geom2dAdaptor_Curve adapt(handle);
+             hCurve = new Geom2dAdaptor_HCurve(adapt);
+         }
++#endif
+ 
+         getGeomPlate_CurveConstraintPtr()->SetProjectedCurve(hCurve, tolU, tolV);
+         Py_Return;
+@@ -308,11 +337,15 @@ PyObject* CurveConstraintPy::projectedCurve(PyObject *args)
+         return nullptr;
+ 
+     try {
+-        Handle(Adaptor2d_HCurve2d) hAdapt = getGeomPlate_CurveConstraintPtr()->ProjectedCurve();
++        auto hAdapt = getGeomPlate_CurveConstraintPtr()->ProjectedCurve();
+         if (hAdapt.IsNull())
+             Py_Return;
+ 
++#if OCC_VERSION_HEX >= 0x070600
++        const Adaptor2d_Curve2d& a2d = *hAdapt;
++#else
+         const Adaptor2d_Curve2d& a2d = hAdapt->Curve2d();
++#endif
+         std::unique_ptr<Geom2dCurve> ptr(Part::makeFromCurveAdaptor2d(a2d));
+         return ptr->getPyObject();
+     }
+diff --git src/Mod/Part/App/Geometry.cpp src/Mod/Part/App/Geometry.cpp
+index e6d6396ca9..1d1d67d4f0 100644
+--- src/Mod/Part/App/Geometry.cpp
++++ src/Mod/Part/App/Geometry.cpp
+@@ -51,7 +51,6 @@
+ # include <Geom_RectangularTrimmedSurface.hxx>
+ # include <Geom_SurfaceOfRevolution.hxx>
+ # include <Geom_SurfaceOfLinearExtrusion.hxx>
+-# include <GeomAdaptor_HCurve.hxx>
+ # include <GeomAPI_Interpolate.hxx>
+ # include <GeomConvert.hxx>
+ # include <GeomConvert_CompCurveToBSplineCurve.hxx>
+@@ -101,6 +100,9 @@
+ # include <GeomAPI_ExtremaCurveCurve.hxx>
+ # include <ShapeConstruct_Curve.hxx>
+ # include <LProp_NotDefined.hxx>
++# if OCC_VERSION_HEX < 0x070600
++# include <GeomAdaptor_HCurve.hxx>
++# endif
+ 
+ # include <ctime>
+ # include <cmath>
+@@ -144,6 +146,9 @@
+ 
+ #include "Geometry.h"
+ 
++#if OCC_VERSION_HEX >= 0x070600
++using GeomAdaptor_HCurve = GeomAdaptor_Curve;
++#endif
+ 
+ using namespace Part;
+ 
+diff --git src/Mod/Part/App/PartFeatures.cpp src/Mod/Part/App/PartFeatures.cpp
+index 2dc503bdf2..4d9e1fc0f9 100644
+--- src/Mod/Part/App/PartFeatures.cpp
++++ src/Mod/Part/App/PartFeatures.cpp
+@@ -25,9 +25,7 @@
+ #ifndef _PreComp_
+ # include <BRepFill.hxx>
+ # include <BRepAdaptor_Curve.hxx>
+-# include <BRepAdaptor_HCurve.hxx>
+ # include <BRepAdaptor_CompCurve.hxx>
+-# include <BRepAdaptor_HCompCurve.hxx>
+ # include <BRepLib_MakeWire.hxx>
+ # include <Geom_BSplineSurface.hxx>
+ # include <TopoDS.hxx>
+@@ -43,7 +41,7 @@
+ # include <TopExp_Explorer.hxx>
+ # include <TopoDS.hxx>
+ # include <Precision.hxx>
+-# include <Adaptor3d_HCurve.hxx>
++# include <memory>
+ #endif
+ 
+ 
+@@ -170,22 +168,18 @@ App::DocumentObjectExecReturn *RuledSurface::execute(void)
+ 
+         if (Orientation.getValue() == 0) {
+             // Automatic
+-            Handle(Adaptor3d_HCurve) a1;
+-            Handle(Adaptor3d_HCurve) a2;
++            std::unique_ptr<Adaptor3d_Curve> a1;
++            std::unique_ptr<Adaptor3d_Curve> a2;
+             if (!isWire) {
+-                BRepAdaptor_Curve adapt1(TopoDS::Edge(S1));
+-                BRepAdaptor_Curve adapt2(TopoDS::Edge(S2));
+-                a1 = new BRepAdaptor_HCurve(adapt1);
+-                a2 = new BRepAdaptor_HCurve(adapt2);
++                a1 = std::make_unique<BRepAdaptor_Curve>(TopoDS::Edge(S1));
++                a2 = std::make_unique<BRepAdaptor_Curve>(TopoDS::Edge(S2));
+             }
+             else {
+-                BRepAdaptor_CompCurve adapt1(TopoDS::Wire(S1));
+-                BRepAdaptor_CompCurve adapt2(TopoDS::Wire(S2));
+-                a1 = new BRepAdaptor_HCompCurve(adapt1);
+-                a2 = new BRepAdaptor_HCompCurve(adapt2);
++                a1 = std::make_unique<BRepAdaptor_CompCurve>(TopoDS::Wire(S1));
++                a2 = std::make_unique<BRepAdaptor_CompCurve>(TopoDS::Wire(S2));
+             }
+ 
+-            if (!a1.IsNull() && !a2.IsNull()) {
++            if (a1 && a2) {
+                 // get end points of 1st curve
+                 Standard_Real first, last;
+                 first = a1->FirstParameter();
+diff --git src/Mod/Part/App/TopoShapeFacePyImp.cpp src/Mod/Part/App/TopoShapeFacePyImp.cpp
+index ea6cd98bdf..63e8bead74 100644
+--- src/Mod/Part/App/TopoShapeFacePyImp.cpp
++++ src/Mod/Part/App/TopoShapeFacePyImp.cpp
+@@ -493,6 +493,15 @@ PyObject* TopoShapeFacePy::getUVNodes(PyObject *args)
+         return Py::new_reference_to(list);
+     }
+ 
++#if OCC_VERSION_HEX >= 0x070600
++    for (int i=1; i<=mesh->NbNodes(); i++) {
++        gp_Pnt2d pt2d = mesh->UVNode(i);
++        Py::Tuple uv(2);
++        uv.setItem(0, Py::Float(pt2d.X()));
++        uv.setItem(1, Py::Float(pt2d.Y()));
++        list.append(uv);
++    }
++#else
+     const TColgp_Array1OfPnt2d& aNodesUV = mesh->UVNodes();
+     for (int i=aNodesUV.Lower(); i<=aNodesUV.Upper(); i++) {
+         gp_Pnt2d pt2d = aNodesUV(i);
+@@ -501,6 +510,7 @@ PyObject* TopoShapeFacePy::getUVNodes(PyObject *args)
+         uv.setItem(1, Py::Float(pt2d.Y()));
+         list.append(uv);
+     }
++#endif
+ 
+     return Py::new_reference_to(list);
+ }
+diff --git src/Mod/Part/App/TopoShapeWirePyImp.cpp src/Mod/Part/App/TopoShapeWirePyImp.cpp
+index 95c1aff681..a1f32d6d03 100644
+--- src/Mod/Part/App/TopoShapeWirePyImp.cpp
++++ src/Mod/Part/App/TopoShapeWirePyImp.cpp
+@@ -344,9 +344,9 @@ PyObject* TopoShapeWirePy::approximate(PyObject *args, PyObject *kwds)
+         return 0;
+     try {
+         BRepAdaptor_CompCurve adapt(TopoDS::Wire(getTopoShapePtr()->getShape()));
+-        Handle(Adaptor3d_HCurve) hcurve = adapt.Trim(adapt.FirstParameter(),
+-                                                    adapt.LastParameter(),
+-                                                    tol2d);
++        auto hcurve = adapt.Trim(adapt.FirstParameter(),
++                                 adapt.LastParameter(),
++                                 tol2d);
+         Approx_Curve3d approx(hcurve, tol3d, GeomAbs_C0, maxseg, maxdeg);
+         if (approx.IsDone()) {
+             return new BSplineCurvePy(new GeomBSplineCurve(approx.Curve()));
+diff --git src/Mod/Part/Gui/TaskCheckGeometry.cpp src/Mod/Part/Gui/TaskCheckGeometry.cpp
+index 5de7c16920..aaef13d9d0 100644
+--- src/Mod/Part/Gui/TaskCheckGeometry.cpp
++++ src/Mod/Part/Gui/TaskCheckGeometry.cpp
+@@ -711,8 +711,10 @@ int TaskCheckGeometryResults::goBOPSingleCheck(const TopoDS_Shape& shapeIn, Resu
+ #if OCC_VERSION_HEX >= 0x060900
+ #if OCC_VERSION_HEX < 0x070500
+   BOPCheck.SetProgressIndicator(theProgress);
+-#else
++#elif OCC_VERSION_HEX < 0x070600
+   BOPCheck.SetProgressIndicator(theScope);
++#else
++  Q_UNUSED(theScope)
+ #endif // 0x070500
+ #else
+   Q_UNUSED(theProgress);
+@@ -740,7 +742,7 @@ int TaskCheckGeometryResults::goBOPSingleCheck(const TopoDS_Shape& shapeIn, Resu
+   Base::TimeInfo start_time;
+ #endif
+ 
+-BOPCheck.Perform();
++  BOPCheck.Perform();
+ 
+ #ifdef FC_DEBUG
+   float bopAlgoTime = Base::TimeInfo::diffTimeF(start_time,Base::TimeInfo());
+diff --git src/Mod/Part/Gui/ViewProviderExt.cpp src/Mod/Part/Gui/ViewProviderExt.cpp
+index 77cefbe3e0..8a52f1701b 100644
+--- src/Mod/Part/Gui/ViewProviderExt.cpp
++++ src/Mod/Part/Gui/ViewProviderExt.cpp
+@@ -1150,16 +1150,25 @@
+ 
+ 
+             // cycling through the poly mesh
++#if OCC_VERSION_HEX < 0x070600
+             const Poly_Array1OfTriangle& Triangles = mesh->Triangles();
+             const TColgp_Array1OfPnt& Nodes = mesh->Nodes();
+             TColgp_Array1OfDir Normals (Nodes.Lower(), Nodes.Upper());
++#else
++            int numNodes =  mesh->NbNodes();
++            TColgp_Array1OfDir Normals (1, numNodes);
++#endif
+             if (NormalsFromUV)
+                 getNormals(actFace, mesh, Normals);
+             
+             for (int g=1;g<=nbTriInFace;g++) {
+                 // Get the triangle
+                 Standard_Integer N1,N2,N3;
++#if OCC_VERSION_HEX < 0x070600
+                 Triangles(g).Get(N1,N2,N3);
++#else
++                mesh->Triangle(g).Get(N1,N2,N3);
++#endif
+ 
+                 // change orientation of the triangle if the face is reversed
+                 if ( orient != TopAbs_FORWARD ) {
+@@ -1169,7 +1178,11 @@
+                 }
+ 
+                 // get the 3 points of this triangle
++#if OCC_VERSION_HEX < 0x070600
+                 gp_Pnt V1(Nodes(N1)), V2(Nodes(N2)), V3(Nodes(N3));
++#else
++                gp_Pnt V1(mesh->Node(N1)), V2(mesh->Node(N2)), V3(mesh->Node(N3));
++#endif
+ 
+                 // get the 3 normals of this triangle
+                 gp_Vec NV1, NV2, NV3;
+@@ -1246,7 +1259,11 @@
+                         // rare cases where some points are only referenced by the polygon
+                         // but not by any triangle. Thus, we must apply the coordinates to
+                         // make sure that everything is properly set.
++#if OCC_VERSION_HEX < 0x070600
+                         gp_Pnt p(Nodes(nodeIndex));
++#else
++                        gp_Pnt p(mesh->Node(nodeIndex));
++#endif
+                         if (!identity)
+                             p.Transform(myTransf);
+                         verts[index].setValue((float)(p.X()),(float)(p.Y()),(float)(p.Z()));
+diff --git src/Mod/Path/App/AppPathPy.cpp src/Mod/Path/App/AppPathPy.cpp
+index 6e0c72d2f5..ce912b4474 100644
+--- src/Mod/Path/App/AppPathPy.cpp
++++ src/Mod/Path/App/AppPathPy.cpp
+@@ -49,10 +49,7 @@
+ #include <TopExp_Explorer.hxx>
+ #include <gp_Lin.hxx>
+ #include <BRep_Tool.hxx>
+-#include <BRepAdaptor_CompCurve.hxx>
+-#include <BRepAdaptor_HCompCurve.hxx>
+-#include <Approx_Curve3d.hxx>
+-#include <BRepAdaptor_HCurve.hxx>
++#include <BRepAdaptor_Curve.hxx>
+ 
+ #include "CommandPy.h"
+ #include "PathPy.h"
+diff --git src/Mod/TechDraw/App/Geometry.cpp src/Mod/TechDraw/App/Geometry.cpp
+index b6c3637137..59a92d7e51 100644
+--- src/Mod/TechDraw/App/Geometry.cpp
++++ src/Mod/TechDraw/App/Geometry.cpp
+@@ -28,13 +28,13 @@
+ #include <BRepAdaptor_Curve.hxx>
+ #include <BRep_Tool.hxx>
+ #include <BRepTools.hxx>
+-#include <BRepAdaptor_HCurve.hxx>
+ #include <BRepLib.hxx>
+ #include <BRepBuilderAPI_MakeVertex.hxx>
+ #include <BRepBuilderAPI_MakeEdge.hxx>
+ #include <BRepBuilderAPI_MakeWire.hxx>
+ #include <BRepBuilderAPI_MakeFace.hxx>
+ #include <BRepExtrema_DistShapeShape.hxx>
++#include <BRepLProp_CLProps.hxx>
+ #include <Precision.hxx>
+ #include <GCPnts_AbscissaPoint.hxx>
+ #include <gce_MakeCirc.hxx>
+@@ -58,14 +58,16 @@
+ #include <GeomLProp_CLProps.hxx>
+ #include <GeomAPI_ProjectPointOnCurve.hxx>
+ #include <Poly_Polygon3D.hxx>
++#include <Standard_Version.hxx>
+ #include <TopoDS.hxx>
+ #include <TopoDS_Edge.hxx>
+ #include <TopExp.hxx>
+ #include <TopExp_Explorer.hxx>
+ #include <TColgp_Array1OfPnt2d.hxx>
+ #include <TColgp_Array1OfPnt.hxx>
+-#include <BRepLProp_CLProps.hxx>
+-
++#if OCC_VERSION_HEX < 0x070600
++#include <BRepAdaptor_HCurve.hxx>
++#endif
+ #include <cmath>
+ #endif  // #ifndef _PreComp_
+ 
+@@ -86,6 +88,10 @@
+ using namespace TechDraw;
+ using namespace std;
+ 
++#if OCC_VERSION_HEX >= 0x070600
++using BRepAdaptor_HCurve = BRepAdaptor_Curve;
++#endif
++
+ #define GEOMETRYEDGE 0
+ #define COSMETICEDGE 1
+ #define CENTERLINE   2
diff --git a/cad/freecad/files/patch-src_3rdParty_salomesmesh_src_SMESH_SMESH_Mesh.cpp b/cad/freecad/files/patch-src_3rdParty_salomesmesh_src_SMESH_SMESH_Mesh.cpp
new file mode 100644
index 000000000000..f88315cbaeb4
--- /dev/null
+++ b/cad/freecad/files/patch-src_3rdParty_salomesmesh_src_SMESH_SMESH_Mesh.cpp
@@ -0,0 +1,10 @@
+--- src/3rdParty/salomesmesh/src/SMESH/SMESH_Mesh.cpp.orig	2022-01-30 21:22:20.383703000 +0100
++++ src/3rdParty/salomesmesh/src/SMESH/SMESH_Mesh.cpp	2022-01-30 21:22:56.240456000 +0100
+@@ -64,7 +64,6 @@
+ 
+ #include <GEOMUtils.hxx>
+ 
+-#undef _Precision_HeaderFile
+ #include <BRepBndLib.hxx>
+ #include <BRepPrimAPI_MakeBox.hxx>
+ #include <Bnd_Box.hxx>
diff --git a/cad/freecad/files/patch-src_Mod_Fem_App_FemConstraint.cpp b/cad/freecad/files/patch-src_Mod_Fem_App_FemConstraint.cpp
new file mode 100644
index 000000000000..88d9de1b36e6
--- /dev/null
+++ b/cad/freecad/files/patch-src_Mod_Fem_App_FemConstraint.cpp
@@ -0,0 +1,22 @@
+--- src/Mod/Fem/App/FemConstraint.cpp.orig	2022-02-04 00:04:15.767125000 +0100
++++ src/Mod/Fem/App/FemConstraint.cpp	2022-02-04 00:04:38.270409000 +0100
+@@ -36,8 +36,6 @@
+ # include <BRepAdaptor_Curve.hxx>
+ # include <GCPnts_AbscissaPoint.hxx>
+ # include <Adaptor3d_IsoCurve.hxx>
+-# include <Adaptor3d_HSurface.hxx>
+-# include <BRepAdaptor_HSurface.hxx>
+ # include <BRepAdaptor_Surface.hxx>
+ # include <GProp_GProps.hxx>
+ # include <BRepGProp.hxx>
+@@ -248,8 +246,8 @@
+             gp_Pnt center;
+ 
+             // Get an estimate for the number of arrows by finding the average length of curves
+-            Handle(Adaptor3d_HSurface) hsurf;
+-            hsurf = new BRepAdaptor_HSurface(surface);
++            Handle(Adaptor3d_Surface) hsurf;
++            hsurf = new BRepAdaptor_Surface(surface);
+ 
+             Adaptor3d_IsoCurve isoc(hsurf);
+             try {
diff --git a/cad/freecad/files/patch-src_Mod_Fem_App_FemConstraintFixed.cpp b/cad/freecad/files/patch-src_Mod_Fem_App_FemConstraintFixed.cpp
new file mode 100644
index 000000000000..319300cae57e
--- /dev/null
+++ b/cad/freecad/files/patch-src_Mod_Fem_App_FemConstraintFixed.cpp
@@ -0,0 +1,11 @@
+--- src/Mod/Fem/App/FemConstraintFixed.cpp.orig	2022-02-03 23:52:01.569143000 +0100
++++ src/Mod/Fem/App/FemConstraintFixed.cpp	2022-02-03 23:52:36.672029000 +0100
+@@ -32,8 +32,6 @@
+ #include <BRepAdaptor_Surface.hxx>
+ #include <GCPnts_AbscissaPoint.hxx>
+ #include <Adaptor3d_IsoCurve.hxx>
+-#include <Adaptor3d_HSurface.hxx>
+-#include <BRepAdaptor_HSurface.hxx>
+ #include <GProp_GProps.hxx>
+ #include <BRepGProp.hxx>
+ #include <TopoDS_Vertex.hxx>
diff --git a/cad/freecad/files/patch-src_Mod_MeshPart_App_MeshFlattening.cpp b/cad/freecad/files/patch-src_Mod_MeshPart_App_MeshFlattening.cpp
new file mode 100644
index 000000000000..b68142a11254
--- /dev/null
+++ b/cad/freecad/files/patch-src_Mod_MeshPart_App_MeshFlattening.cpp
@@ -0,0 +1,52 @@
+--- src/Mod/MeshPart/App/MeshFlattening.cpp.orig	2022-02-03 23:13:33.919226000 +0100
++++ src/Mod/MeshPart/App/MeshFlattening.cpp	2022-02-03 23:30:59.747315000 +0100
+@@ -141,37 +141,37 @@
+     if (triangulation.IsNull())
+         throw std::runtime_error("null triangulation in face construction");
+ 
++    Standard_Integer numNodes = triangulation->NbNodes();
++    Standard_Integer numTriangles = triangulation->NbTriangles();
++
+ //  compute uv coordinates
+     if (triangulation->HasUVNodes())
+     {
+-        const TColgp_Array1OfPnt2d &_uv_nodes = triangulation->UVNodes();
+-        this->uv_nodes.resize(triangulation->NbNodes(), 2);
++        this->uv_nodes.resize(numNodes, 2);
+         i = 0;
+-        for (Standard_Integer index = _uv_nodes.Lower(); index <= _uv_nodes.Upper(); ++index)
++        for (Standard_Integer index = 1; index <= numNodes; ++index)
+         {
+-            const gp_Pnt2d& _uv_node = _uv_nodes.Value(index);
++            const gp_Pnt2d& _uv_node = triangulation->UVNode(index);
+             this->uv_nodes.row(i) << _uv_node.X(), _uv_node.Y();
+             i++;
+         }
+     }
+ // 
+-    const TColgp_Array1OfPnt &_nodes = triangulation->Nodes();
+-    this->xyz_nodes.resize(triangulation->NbNodes(), 3);
++    this->xyz_nodes.resize(numNodes, 3);
+     i = 0;
+-    for (Standard_Integer index = _nodes.Lower(); index <= _nodes.Upper(); ++index)
++    for (Standard_Integer index = 1; index <= numNodes; ++index)
+     {
+-        gp_Pnt _node = _nodes.Value(index);
++        gp_Pnt _node = triangulation->Node(index);
+         this->xyz_nodes.row(i) << _node.X(), _node.Y(), _node.Z();
+         i++;
+     }
+     
+-    const Poly_Array1OfTriangle &_tris = triangulation->Triangles();
+-    this->tris.resize(triangulation->NbTriangles(), 3);
++    this->tris.resize(numTriangles, 3);
+     i = 0;
+-    for (Standard_Integer index = _tris.Lower(); index <= _tris.Upper(); ++index)
++    for (Standard_Integer index = 1; index <= numTriangles; ++index)
+     {
+         int n1, n2, n3;
+-        Poly_Triangle _tri = _tris.Value(index);
++        Poly_Triangle _tri = triangulation->Triangle(index);
+         _tri.Get(n1, n2, n3);
+         this->tris.row(i) << n1-1, n2-1, n3-1;
+         i++;
diff --git a/cad/freecad/files/patch-src_Mod_PartDesign_Gui_ViewProviderAddSub.cpp b/cad/freecad/files/patch-src_Mod_PartDesign_Gui_ViewProviderAddSub.cpp
new file mode 100644
index 000000000000..7c7c3c09accd
--- /dev/null
+++ b/cad/freecad/files/patch-src_Mod_PartDesign_Gui_ViewProviderAddSub.cpp
@@ -0,0 +1,21 @@
+--- src/Mod/PartDesign/Gui/ViewProviderAddSub.cpp.orig	2022-03-03 20:43:05.599798000 +0100
++++ src/Mod/PartDesign/Gui/ViewProviderAddSub.cpp	2022-03-03 21:06:11.466643000 +0100
+@@ -194,8 +194,7 @@
+ 
+             // cycling through the poly mesh
+             const Poly_Array1OfTriangle& Triangles = mesh->Triangles();
+-            const TColgp_Array1OfPnt& Nodes = mesh->Nodes();
+-            TColgp_Array1OfDir Normals (Nodes.Lower(), Nodes.Upper());
++            TColgp_Array1OfDir Normals (1, nbNodesInFace);
+             getNormals(actFace, mesh, Normals);
+ 
+             for (int g=1;g<=nbTriInFace;g++) {
+@@ -211,7 +210,7 @@
+                 }
+ 
+                 // get the 3 points of this triangle
+-                gp_Pnt V1(Nodes(N1)), V2(Nodes(N2)), V3(Nodes(N3));
++                gp_Pnt V1(mesh->Node(N1)), V2(mesh->Node(N2)), V3(mesh->Node(N3));
+ 
+                 // get the 3 previewNormals of this triangle
+                 gp_Dir NV1(Normals(N1)), NV2(Normals(N2)), NV3(Normals(N3));
diff --git a/cad/freecad/files/patch-src_Mod_PartDesign_Gui_ViewProviderTransformed.cpp b/cad/freecad/files/patch-src_Mod_PartDesign_Gui_ViewProviderTransformed.cpp
new file mode 100644
index 000000000000..2e2c02a95065
--- /dev/null
+++ b/cad/freecad/files/patch-src_Mod_PartDesign_Gui_ViewProviderTransformed.cpp
@@ -0,0 +1,19 @@
+--- src/Mod/PartDesign/Gui/ViewProviderTransformed.cpp.orig	2022-03-03 21:21:36.816245000 +0100
++++ src/Mod/PartDesign/Gui/ViewProviderTransformed.cpp	2022-03-03 21:22:41.559121000 +0100
+@@ -285,7 +285,6 @@
+ 
+                 // cycling through the poly mesh
+                 const Poly_Array1OfTriangle& Triangles = mesh->Triangles();
+-                const TColgp_Array1OfPnt& Nodes = mesh->Nodes();
+                 for (int g=1; g <= nbTriInFace; g++) {
+                     // Get the triangle
+                     Standard_Integer N1,N2,N3;
+@@ -299,7 +298,7 @@
+                     }
+ 
+                     // get the 3 points of this triangle
+-                    gp_Pnt V1(Nodes(N1)), V2(Nodes(N2)), V3(Nodes(N3));
++                    gp_Pnt V1(mesh->Node(N1)), V2(mesh->Node(N2)), V3(mesh->Node(N3));
+ 
+                     // transform the vertices to the place of the face
+                     if (!identity) {
diff --git a/cad/freecad/files/patch-src_Mod_Part_App_AppPartPy.cpp b/cad/freecad/files/patch-src_Mod_Part_App_AppPartPy.cpp
new file mode 100644
index 000000000000..dc95388b984e
--- /dev/null
+++ b/cad/freecad/files/patch-src_Mod_Part_App_AppPartPy.cpp
@@ -0,0 +1,29 @@
+--- src/Mod/Part/App/AppPartPy.cpp.orig	2022-01-30 22:29:02.026790000 +0100
++++ src/Mod/Part/App/AppPartPy.cpp	2022-01-30 22:50:54.044159000 +0100
+@@ -804,14 +804,26 @@
+             const TopAbs_Orientation anOrientation = currentFace.Orientation();
+             bool flip = (anOrientation == TopAbs_REVERSED);
+             if (!facets.IsNull()) {
++#if OCC_VERSION_HEX < 0x070600
+                 const TColgp_Array1OfPnt& nodes = facets->Nodes();
+                 const Poly_Array1OfTriangle& triangles = facets->Triangles();
+                 for (int i = 1; i <= triangles.Length(); i++) {
++#else
++                int nbtri = facets->NbTriangles();
++                for (int i = 1; i <= nbtri; i++) {
++#endif
+                     Standard_Integer n1,n2,n3;
++#if OCC_VERSION_HEX < 0x070600
+                     triangles(i).Get(n1, n2, n3);
+                     gp_Pnt p1 = nodes(n1);
+                     gp_Pnt p2 = nodes(n2);
+                     gp_Pnt p3 = nodes(n3);
++#else
++                    facets->Triangle(i).Get(n1, n2, n3);
++                    gp_Pnt p1 = facets->Node(n1);
++                    gp_Pnt p2 = facets->Node(n2);
++                    gp_Pnt p3 = facets->Node(n3);
++#endif
+                     p1.Transform(loc.Transformation());
+                     p2.Transform(loc.Transformation());
+                     p3.Transform(loc.Transformation());
diff --git a/cad/freecad/files/patch-src_Mod_Part_App_Tools.cpp b/cad/freecad/files/patch-src_Mod_Part_App_Tools.cpp
new file mode 100644
index 000000000000..191d1c081f35
--- /dev/null
+++ b/cad/freecad/files/patch-src_Mod_Part_App_Tools.cpp
@@ -0,0 +1,45 @@
+--- src/Mod/Part/App/Tools.cpp.orig	2022-02-03 20:59:16.862252000 +0100
++++ src/Mod/Part/App/Tools.cpp	2022-02-03 21:43:13.008464000 +0100
+@@ -25,10 +25,9 @@
+ # include <cassert>
+ # include <gp_Pln.hxx>
+ # include <gp_Lin.hxx>
+-# include <Adaptor3d_HCurveOnSurface.hxx>
+ # include <Geom_BSplineSurface.hxx>
+ # include <Geom_Plane.hxx>
+-# include <GeomAdaptor_HCurve.hxx>
++# include <GeomAdaptor_Curve.hxx>
+ # include <GeomAPI_IntSS.hxx>
+ # include <Geom_Line.hxx>
+ # include <Geom_Point.hxx>
+@@ -98,8 +97,8 @@
+     return found;
+ }
+ 
+-/*! The objects in \a theBoundaries must be of the type Adaptor3d_HCurveOnSurface or
+-GeomAdaptor_HCurve or Geom_Point indicating type of a constraint. Otherwise an exception
++/*! The objects in \a theBoundaries must be of the type Adaptor3d_CurveOnSurface or
++GeomAdaptor_Curve or Geom_Point indicating type of a constraint. Otherwise an exception
+ Standard_TypeMismatch is thrown.
+ 
+ If the \a theBoundaries list is empty then Standard_ConstructionError is thrown.
+@@ -138,15 +137,15 @@
+                 assert (0);
+                 Standard_ConstructionError::Raise ("Tools::makeSurface()");
+             }
+-            else if (aCur->IsKind (STANDARD_TYPE (Adaptor3d_HCurveOnSurface))) {
++            else if (aCur->IsKind (STANDARD_TYPE (Adaptor3d_CurveOnSurface))) {
+                 //G1 constraint
+-                Handle(Adaptor3d_HCurveOnSurface) aHCOS (Handle(Adaptor3d_HCurveOnSurface)::DownCast (aCur));
++                Handle(Adaptor3d_CurveOnSurface) aHCOS (Handle(Adaptor3d_CurveOnSurface)::DownCast (aCur));
+                 Handle (GeomPlate_CurveConstraint) aConst = new GeomPlate_CurveConstraint (aHCOS, 1 /*GeomAbs_G1*/,aNbPnts, aTol3d, anAngTol, aCurvTol);
+                 aPlateBuilder.Add (aConst);
+             }
+-            else if (aCur->IsKind (STANDARD_TYPE (GeomAdaptor_HCurve))) {
++            else if (aCur->IsKind (STANDARD_TYPE (GeomAdaptor_Curve))) {
+                 //G0 constraint
+-                Handle(GeomAdaptor_HCurve) aHC (Handle(GeomAdaptor_HCurve)::DownCast (aCur));
++                Handle(GeomAdaptor_Curve) aHC (Handle(GeomAdaptor_Curve)::DownCast (aCur));
+                 Handle (GeomPlate_CurveConstraint) aConst = new GeomPlate_CurveConstraint (aHC, 0 /*GeomAbs_G0*/, aNbPnts, aTol3d);
+                 aPlateBuilder.Add (aConst);
+             }
diff --git a/cad/freecad/files/patch-src_Mod_Part_App_TopoShape.cpp b/cad/freecad/files/patch-src_Mod_Part_App_TopoShape.cpp
new file mode 100644
index 000000000000..51285e1c05f4
--- /dev/null
+++ b/cad/freecad/files/patch-src_Mod_Part_App_TopoShape.cpp
@@ -0,0 +1,146 @@
+--- src/Mod/Part/App/TopoShape.cpp.orig	2022-02-03 21:51:04.000000000 +0100
++++ src/Mod/Part/App/TopoShape.cpp	2022-02-03 22:55:05.882488000 +0100
+@@ -38,8 +38,6 @@
+ # include <BRep_Tool.hxx>
+ # include <BRepAdaptor_Curve.hxx>
+ # include <BRepAdaptor_CompCurve.hxx>
+-# include <BRepAdaptor_HCurve.hxx>
+-# include <BRepAdaptor_HCompCurve.hxx>
+ # include <BRepAdaptor_Surface.hxx>
+ # include <BRepAlgoAPI_Common.hxx>
+ # include <BRepAlgoAPI_Cut.hxx>
+@@ -1122,10 +1120,10 @@
+         // check orientation
+         TopAbs_Orientation orient = aFace.Orientation();
+ 
++        nbTriInFace = aPoly->NbTriangles();
+         // cycling through the poly mesh
+         const Poly_Array1OfTriangle& Triangles = aPoly->Triangles();
+-        const TColgp_Array1OfPnt& Nodes = aPoly->Nodes();
+-        for (int i=1;i<=nbTriInFace;i++) {
++        for (int i=1; i<=nbTriInFace; i++) {
+             // Get the triangle
+             Standard_Integer N1,N2,N3;
+             Triangles(i).Get(N1,N2,N3);
+@@ -1137,9 +1135,9 @@
+                 N2 = tmp;
+             }
+ 
+-            gp_Pnt V1 = Nodes(N1);
+-            gp_Pnt V2 = Nodes(N2);
+-            gp_Pnt V3 = Nodes(N3);
++            gp_Pnt V1 = aPoly->Node(N1);
++            gp_Pnt V2 = aPoly->Node(N2);
++            gp_Pnt V3 = aPoly->Node(N3);
+ 
+             // transform the vertices to the place of the face
+             if (!identity) {
+@@ -1193,6 +1191,7 @@
+ 
+         std::vector<Base::Vector3f> vertices;
+         Standard_Integer nbNodesInFace;
++        Standard_Integer nbNodesInTria;
+ 
+         // triangulation succeeded?
+         if (!aPoly.IsNull()) {
+@@ -1233,16 +1232,14 @@
+ 
+             // getting size and create the array
+             nbNodesInFace = aPoly->NbNodes();
++            nbNodesInTria = aPolyTria->NbNodes();
+             vertices.resize(nbNodesInFace);
+ 
+-            const TColStd_Array1OfInteger& indices = aPoly->Nodes();
+-            const TColgp_Array1OfPnt& Nodes = aPolyTria->Nodes();
+-
+             gp_Pnt V;
+             int pos = 0;
+             // go through the index array
+-            for (Standard_Integer i=indices.Lower();i <= indices.Upper();i++) {
+-                V = Nodes(indices(i));
++            for (Standard_Integer i=1; i<=nbNodesInTria; i++) {
++                V = aPolyTria->Node(i);
+                 V.Transform(myTransf);
+                 vertices[pos++].Set((float)(V.X()),(float)(V.Y()),(float)(V.Z()));
+             }
+@@ -2215,12 +2212,20 @@
+     if (this->_Shape.IsNull())
+         Standard_Failure::Raise("Cannot sweep along empty spine");
+ 
++#if OCC_VERSION_HEX >= 0x070600
++    Handle(Adaptor3d_Curve) myPath;
++    if (this->_Shape.ShapeType() == TopAbs_EDGE) {
++        const TopoDS_Edge& path_edge = TopoDS::Edge(this->_Shape);
++        myPath = new BRepAdaptor_Curve(path_edge);
++    }
++#else
+     Handle(Adaptor3d_HCurve) myPath;
+     if (this->_Shape.ShapeType() == TopAbs_EDGE) {
+         const TopoDS_Edge& path_edge = TopoDS::Edge(this->_Shape);
+         BRepAdaptor_Curve path_adapt(path_edge);
+         myPath = new BRepAdaptor_HCurve(path_adapt);
+     }
++#endif
+     //else if (this->_Shape.ShapeType() == TopAbs_WIRE) {
+     //    const TopoDS_Wire& path_wire = TopoDS::Wire(this->_Shape);
+     //    BRepAdaptor_CompCurve path_adapt(path_wire);
+@@ -3401,10 +3406,10 @@
+ 
+         Domain domain;
+         // copy the points
+-        const TColgp_Array1OfPnt& points = theTriangulation->Nodes();
+-        domain.points.reserve(points.Length());
+-        for (int i = 1; i <= points.Length(); i++) {
+-            gp_Pnt p = points(i);
++        int nbptintria = theTriangulation->NbNodes();
++        domain.points.reserve(nbptintria);
++        for (int i = 1; i <= nbptintria; i++) {
++            gp_Pnt p = theTriangulation->Node(i);
+             p.Transform(loc.Transformation());
+             Standard_Real X, Y, Z;
+             p.Coord (X, Y, Z);
+@@ -3414,11 +3419,11 @@
+         // copy the triangles
+         const TopAbs_Orientation anOrientation = face.Orientation();
+         bool flip = (anOrientation == TopAbs_REVERSED);
+-        const Poly_Array1OfTriangle& faces = theTriangulation->Triangles();
+-        domain.facets.reserve(faces.Length());
+-        for (int i = 1; i <= faces.Length(); i++) {
++        int nbtri = theTriangulation->NbTriangles();
++        domain.facets.reserve(nbtri);
++        for (int i = 1; i <= nbtri; i++) {
+             Standard_Integer N1, N2, N3;
+-            faces(i).Get(N1, N2, N3);
++            theTriangulation->Triangle(i).Get(N1, N2, N3);
+ 
+             Facet tria;
+             tria.I1 = N1-1; tria.I2 = N2-1; tria.I3 = N3-1;
+@@ -3774,8 +3779,8 @@
+                 const TColgp_Array1OfPnt& Nodes = aPoly->Nodes();
+ 
+                 gp_Pnt V;
+-                for (Standard_Integer i=0;i < nbNodesInFace;i++) {
+-                    V = Nodes(i+1);
++                for (Standard_Integer i=1; i <= nbNodesInFace; i++) {
++                    V = Nodes(i);
+                     V.Transform(myTransf);
+                     vertices.emplace_back(V.X(),V.Y(),V.Z());
+                 }
+@@ -3808,14 +3813,12 @@
+ 
+                 // getting size and create the array
+                 nbNodesInFace = aPoly->NbNodes();
++                int nbNodesInTria = aPolyTria->NbNodes();
+ 
+-                const TColStd_Array1OfInteger& indices = aPoly->Nodes();
+-                const TColgp_Array1OfPnt& Nodes = aPolyTria->Nodes();
+-
+                 gp_Pnt V;
+                 // go through the index array
+-                for (Standard_Integer i=indices.Lower();i <= indices.Upper();i++) {
+-                    V = Nodes(indices(i));
++                for (Standard_Integer i=1 ;i <= nbNodesInTria; i++) {
++                    V = aPolyTria->Node(i);
+                     V.Transform(myTransf);
+                     vertices.emplace_back(V.X(),V.Y(),V.Z());
+                 }
diff --git a/cad/freecad/files/patch-src_Mod_Part_Gui_ViewProviderExt.cpp b/cad/freecad/files/patch-src_Mod_Part_Gui_ViewProviderExt.cpp
new file mode 100644
index 000000000000..197253155500
--- /dev/null
+++ b/cad/freecad/files/patch-src_Mod_Part_Gui_ViewProviderExt.cpp
@@ -0,0 +1,81 @@
+--- src/Mod/Part/Gui/ViewProviderExt.cpp.orig	2022-03-02 17:15:16.283319000 +0100
++++ src/Mod/Part/Gui/ViewProviderExt.cpp	2022-03-02 23:49:04.036080000 +0100
+@@ -137,26 +137,17 @@
+                                      const Handle(Poly_Triangulation)& aPolyTri,
+                                      TColgp_Array1OfDir& theNormals)
+ {
+-    const TColgp_Array1OfPnt& aNodes = aPolyTri->Nodes();
+-
+     if(aPolyTri->HasNormals())
+     {
+         // normals pre-computed in triangulation structure
+-        const TShort_Array1OfShortReal& aNormals = aPolyTri->Normals();
+-        const Standard_ShortReal*       aNormArr = &(aNormals.Value(aNormals.Lower()));
+-
+-        for(Standard_Integer aNodeIter = aNodes.Lower(); aNodeIter <= aNodes.Upper(); ++aNodeIter)
++        for(Standard_Integer aNodeIter = 1; aNodeIter <= aPolyTri->NbNodes(); ++aNodeIter)
+         {
+-            const Standard_Integer anId = 3 * (aNodeIter - aNodes.Lower());
+-            const gp_Dir aNorm(aNormArr[anId + 0],
+-                               aNormArr[anId + 1],
+-                               aNormArr[anId + 2]);
+-            theNormals(aNodeIter) = aNorm;
++            theNormals(aNodeIter) = aPolyTri->Normal(aNodeIter);
+         }
*** 86 LINES SKIPPED ***