aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph Moench-Tegeder <cmt@FreeBSD.org>2022-03-03 21:08:54 +0000
committerChristoph Moench-Tegeder <cmt@FreeBSD.org>2022-03-03 21:08:54 +0000
commitd25a7563aaa6b357e7ee4fcea1a634bbc5fb40c9 (patch)
tree13b53f104d5c2ee6d9dab15b74cc436db4075b7e
parent03f7dd327e77ece810122edab088f1d778dbb2ef (diff)
downloadports-d25a7563aaa6b357e7ee4fcea1a634bbc5fb40c9.tar.gz
ports-d25a7563aaa6b357e7ee4fcea1a634bbc5fb40c9.zip
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
-rw-r--r--cad/freecad/Makefile4
-rw-r--r--cad/freecad/distinfo6
-rw-r--r--cad/freecad/files/patch-74639da997d5f2e53f001d9f256be86ceee901f5477
-rw-r--r--cad/freecad/files/patch-src_3rdParty_salomesmesh_src_SMESH_SMESH_Mesh.cpp10
-rw-r--r--cad/freecad/files/patch-src_Mod_Fem_App_FemConstraint.cpp22
-rw-r--r--cad/freecad/files/patch-src_Mod_Fem_App_FemConstraintFixed.cpp11
-rw-r--r--cad/freecad/files/patch-src_Mod_MeshPart_App_MeshFlattening.cpp52
-rw-r--r--cad/freecad/files/patch-src_Mod_PartDesign_Gui_ViewProviderAddSub.cpp21
-rw-r--r--cad/freecad/files/patch-src_Mod_PartDesign_Gui_ViewProviderTransformed.cpp19
-rw-r--r--cad/freecad/files/patch-src_Mod_Part_App_AppPartPy.cpp29
-rw-r--r--cad/freecad/files/patch-src_Mod_Part_App_Tools.cpp45
-rw-r--r--cad/freecad/files/patch-src_Mod_Part_App_TopoShape.cpp146
-rw-r--r--cad/freecad/files/patch-src_Mod_Part_Gui_ViewProviderExt.cpp81
-rw-r--r--cad/freecad/files/patch-src_Mod_Raytracing_App_PovTools.cpp23
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);
+ }
+
+ if(theFace.Orientation() == TopAbs_REVERSED)
+ {
+- for(Standard_Integer aNodeIter = aNodes.Lower(); aNodeIter <= aNodes.Upper(); ++aNodeIter)
++ for(Standard_Integer aNodeIter = 1; aNodeIter <= aPolyTri->NbNodes(); ++aNodeIter)
+ {
+ theNormals.ChangeValue(aNodeIter).Reverse();
+ }
+@@ -172,16 +163,13 @@
+ const Standard_Real aTol = Precision::Confusion();
+ Handle(TShort_HArray1OfShortReal) aNormals = new TShort_HArray1OfShortReal(1, aPolyTri->NbNodes() * 3);
+ const Poly_Array1OfTriangle& aTriangles = aPolyTri->Triangles();
+- const TColgp_Array1OfPnt2d* aNodesUV = aPolyTri->HasUVNodes() && !aSurf.IsNull()
+- ? &aPolyTri->UVNodes()
+- : NULL;
++ const Standard_Boolean hasUV = aPolyTri->HasUVNodes() && !aSurf.IsNull();
+ Standard_Integer aTri[3];
+
+- for(Standard_Integer aNodeIter = aNodes.Lower(); aNodeIter <= aNodes.Upper(); ++aNodeIter)
++ for(Standard_Integer aNodeIter = 1; aNodeIter <= aPolyTri->NbNodes(); ++aNodeIter)
+ {
+ // try to retrieve normal from real surface first, when UV coordinates are available
+- if(aNodesUV == NULL
+- || GeomLib::NormEstim(aSurf, aNodesUV->Value(aNodeIter), aTol, theNormals(aNodeIter)) > 1)
++ if(hasUV || GeomLib::NormEstim(aSurf, aPolyTri->UVNode(aNodeIter), aTol, theNormals(aNodeIter)) > 1)
+ {
+ // compute flat normals
+ gp_XYZ eqPlan(0.0, 0.0, 0.0);
+@@ -189,8 +177,8 @@
+ for(thePolyConnect.Initialize(aNodeIter); thePolyConnect.More(); thePolyConnect.Next())
+ {
+ aTriangles(thePolyConnect.Value()).Get(aTri[0], aTri[1], aTri[2]);
+- const gp_XYZ v1(aNodes(aTri[1]).Coord() - aNodes(aTri[0]).Coord());
+- const gp_XYZ v2(aNodes(aTri[2]).Coord() - aNodes(aTri[1]).Coord());
++ const gp_XYZ v1(aPolyTri->Node(aTri[1]).Coord() - aPolyTri->Node(aTri[0]).Coord());
++ const gp_XYZ v2(aPolyTri->Node(aTri[2]).Coord() - aPolyTri->Node(aTri[1]).Coord());
+ const gp_XYZ vv = v1 ^ v2;
+ const Standard_Real aMod = vv.Modulus();
+
+@@ -204,7 +192,7 @@
+ theNormals(aNodeIter) = (aModMax > aTol) ? gp_Dir(eqPlan) : gp::DZ();
+ }
+
+- const Standard_Integer anId = (aNodeIter - aNodes.Lower()) * 3;
++ const Standard_Integer anId = (aNodeIter - 1) * 3;
+ aNormals->SetValue(anId + 1, (Standard_ShortReal)theNormals(aNodeIter).X());
+ aNormals->SetValue(anId + 2, (Standard_ShortReal)theNormals(aNodeIter).Y());
+ aNormals->SetValue(anId + 3, (Standard_ShortReal)theNormals(aNodeIter).Z());
+@@ -214,7 +202,7 @@
+
+ if(theFace.Orientation() == TopAbs_REVERSED)
+ {
+- for(Standard_Integer aNodeIter = aNodes.Lower(); aNodeIter <= aNodes.Upper(); ++aNodeIter)
++ for(Standard_Integer aNodeIter = 1; aNodeIter <= aPolyTri->NbNodes(); ++aNodeIter)
+ {
+ theNormals.ChangeValue(aNodeIter).Reverse();
+ }
diff --git a/cad/freecad/files/patch-src_Mod_Raytracing_App_PovTools.cpp b/cad/freecad/files/patch-src_Mod_Raytracing_App_PovTools.cpp
new file mode 100644
index 000000000000..c96ce988fc2d
--- /dev/null
+++ b/cad/freecad/files/patch-src_Mod_Raytracing_App_PovTools.cpp
@@ -0,0 +1,23 @@
+--- src/Mod/Raytracing/App/PovTools.cpp.orig 2022-02-03 23:01:51.000000000 +0100
++++ src/Mod/Raytracing/App/PovTools.cpp 2022-02-03 23:03:51.000000000 +0100
+@@ -402,7 +402,6 @@
+
+ // cycling through the poly mesh
+ const Poly_Array1OfTriangle& Triangles = aPoly->Triangles();
+- const TColgp_Array1OfPnt& Nodes = aPoly->Nodes();
+ for (i=1; i<=nbTriInFace; i++) {
+ // Get the triangle
+ Standard_Integer N1,N2,N3;
+@@ -416,9 +415,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) {