[packages/FreeCAD] - update for netgen-mesher 6.2.2607

qboosh qboosh at pld-linux.org
Fri Sep 25 22:02:45 CEST 2026


commit c9ccf2e433d1a61671f66ee35f8cf4db30c059d7
Author: Jakub Bogusz <qboosh at pld-linux.org>
Date:   Fri Sep 25 22:03:05 2026 +0200

    - update for netgen-mesher 6.2.2607

 FreeCAD-netgen.patch | 299 +++++++++++++++++++++++++++++++++++++++++++++++++++
 FreeCAD.spec         |  10 +-
 2 files changed, 307 insertions(+), 2 deletions(-)
---
diff --git a/FreeCAD.spec b/FreeCAD.spec
index 46a5582..f66c0a9 100644
--- a/FreeCAD.spec
+++ b/FreeCAD.spec
@@ -1,7 +1,7 @@
 #
 # Conditional build:
-%bcond_with	system_smesh	# use system version of Salome's Mesh
-%bcond_with	system_zipios	# use system version of zipios++
+%bcond_with	system_smesh	# system version of Salome's Mesh
+%bcond_with	system_zipios	# system version of zipios++
 
 Summary:	A general purpose 3D CAD modeler
 Name:		FreeCAD
@@ -13,6 +13,7 @@ Source0:	https://github.com/FreeCAD/FreeCAD/releases/download/%{version}/freecad
 # Source0-md5:	355c28ccdabc1afedc9adbc247c490bf
 Patch0:		apphome.patch
 Patch1:		external-E57Format.patch
+Patch2:		FreeCAD-netgen.patch
 URL:		https://freecad.org/
 # Utilities
 BuildRequires:	boost-python-devel-common
@@ -66,6 +67,7 @@ BuildRequires:	python3-devel
 BuildRequires:	python3-matplotlib
 BuildRequires:	python3-pivy
 BuildRequires:	python3-pivy-gui
+BuildRequires:	qt6-linguist
 BuildRequires:	shiboken6
 BuildRequires:	vtk-devel
 BuildRequires:	vtk-python3-devel
@@ -115,6 +117,10 @@ be included in GUI designs just like any other Qt widget.
 %setup -q -c
 %patch -P0 -p1
 %patch -P1 -p1
+%patch -P2 -p1
+
+# don't force color diagnostics if output is not terminal
+%{__sed} -i -e 's/-fdiagnostics-color //' cMake/FreeCAD_Helpers/CompilerChecksAndSetups.cmake
 
 %build
 #	-DFREECAD_USE_EXTERNAL_PIVY=TRUE \
diff --git a/FreeCAD-netgen.patch b/FreeCAD-netgen.patch
new file mode 100644
index 0000000..4f5af81
--- /dev/null
+++ b/FreeCAD-netgen.patch
@@ -0,0 +1,299 @@
+--- FreeCAD-1.1.3/src/3rdParty/salomesmesh/src/NETGENPlugin/NETGENPlugin_Mesher.cpp.orig	2026-07-25 06:56:12.000000000 +0200
++++ FreeCAD-1.1.3/src/3rdParty/salomesmesh/src/NETGENPlugin/NETGENPlugin_Mesher.cpp	2026-09-25 20:09:55.515741854 +0200
+@@ -917,54 +917,54 @@ bool NETGENPlugin_Mesher::FillNgMesh(net
+           seg[0] = prevNgId;
+           seg[1] = prevNgId = ngNodeId( p2.node, ngMesh, nodeNgIdMap );
+           // node param on curve
+-          seg.epgeominfo[ 0 ].dist = p1.param;
+-          seg.epgeominfo[ 1 ].dist = p2.param;
++          seg.EPGeomInfo(0).dist = p1.param;
++          seg.EPGeomInfo(1).dist = p2.param;
+           // uv on face
+-          seg.epgeominfo[ 0 ].u = p1.u;
+-          seg.epgeominfo[ 0 ].v = p1.v;
+-          seg.epgeominfo[ 1 ].u = p2.u;
+-          seg.epgeominfo[ 1 ].v = p2.v;
++          seg.GeomInfo(0).u = p1.u;
++          seg.GeomInfo(0).v = p1.v;
++          seg.GeomInfo(1).u = p2.u;
++          seg.GeomInfo(1).v = p2.v;
+ 
+           //geomEdge = fSide.Edge( fSide.EdgeIndex( 0.5 * ( p1.normParam + p2.normParam )));
+-          //seg.epgeominfo[ 0 ].edgenr = seg.epgeominfo[ 1 ].edgenr = occgeom.emap.FindIndex( geomEdge );
++          //seg.GeomInfo(0).trignum = seg.GeomInfo(1).trignum = occgeom.emap.FindIndex( geomEdge );
+ 
+-          //seg.epgeominfo[ iEnd ].edgenr = edgeID; //  = geom.emap.FindIndex(edge);
+-          seg.si = faceNgID;                   // = geom.fmap.FindIndex (face);
+-          seg.edgenr = ngMesh.GetNSeg() + 1; // segment id
++          //seg.GeomInfo(iEnd).trignum = edgeID; //  = geom.emap.FindIndex(edge);
++          seg.SetIndex(faceNgID);                   // = geom.fmap.FindIndex (face);
++          seg.SetHpElnr(ngMesh.GetNSeg() + 1); // segment id
+           ngMesh.AddSegment (seg);
+ 
+           SMESH_TNodeXYZ np1( p1.node ), np2( p2.node );
+           RestrictLocalSize( ngMesh, 0.5*(np1+np2), (np1-np2).Modulus() );
+ 
+ #ifdef DUMP_SEGMENTS
+-          cout << "Segment: " << seg.edgenr << " on SMESH face " << helper.GetMeshDS()->ShapeToIndex( face ) << std::endl
+-               << "\tface index: " << seg.si << std::endl
++          cout << "Segment: " << seg.GetHpElnr() << " on SMESH face " << helper.GetMeshDS()->ShapeToIndex( face ) << std::endl
++               << "\tface index: " << seg.GetIndex() << std::endl
+                << "\tp1: " << seg[0] << std::endl
+                << "\tp2: " << seg[1] << std::endl
+-               << "\tp0 param: " << seg.epgeominfo[ 0 ].dist << std::endl
+-               << "\tp0 uv: " << seg.epgeominfo[ 0 ].u <<", "<< seg.epgeominfo[ 0 ].v << std::endl
+-            //<< "\tp0 edge: " << seg.epgeominfo[ 0 ].edgenr << std::endl
+-               << "\tp1 param: " << seg.epgeominfo[ 1 ].dist << std::endl
+-               << "\tp1 uv: " << seg.epgeominfo[ 1 ].u <<", "<< seg.epgeominfo[ 1 ].v << std::endl;
+-            //<< "\tp1 edge: " << seg.epgeominfo[ 1 ].edgenr << std::endl;
++               << "\tp0 param: " << seg.EPGeomInfo(0).dist << std::endl
++               << "\tp0 uv: " << seg.GeomInfo(0).u <<", "<< seg.GeomInfo(0).v << std::endl
++            //<< "\tp0 edge: " << seg.GeomInfo(0).trignum << std::endl
++               << "\tp1 param: " << seg.EPGeomInfo(1).dist << std::endl
++               << "\tp1 uv: " << seg.GeomInfo(1).u <<", "<< seg.GeomInfo(1).v << std::endl;
++            //<< "\tp1 edge: " << seg.GeomInfo(1).trignum << std::endl;
+ #endif
+           if ( isSeam )
+           {
+             if ( helper.GetPeriodicIndex() & 1 ) {
+-              seg.epgeominfo[ 0 ].u = otherSeamParam;
+-              seg.epgeominfo[ 1 ].u = otherSeamParam;
+-              swap (seg.epgeominfo[0].v, seg.epgeominfo[1].v);
++              seg.GeomInfo(0).u = otherSeamParam;
++              seg.GeomInfo(1).u = otherSeamParam;
++              swap (seg.GeomInfo(0).v, seg.GeomInfo(1).v);
+             } else {
+-              seg.epgeominfo[ 0 ].v = otherSeamParam;
+-              seg.epgeominfo[ 1 ].v = otherSeamParam;
+-              swap (seg.epgeominfo[0].u, seg.epgeominfo[1].u);
++              seg.GeomInfo(0).v = otherSeamParam;
++              seg.GeomInfo(1).v = otherSeamParam;
++              swap (seg.GeomInfo(0).u, seg.GeomInfo(1).u);
+             }
+             swap (seg[0], seg[1]);
+-            swap (seg.epgeominfo[0].dist, seg.epgeominfo[1].dist);
+-            seg.edgenr = ngMesh.GetNSeg() + 1; // segment id
++            swap (seg.EPGeomInfo(0).dist, seg.EPGeomInfo(1).dist);
++            seg.SetHpElnr(ngMesh.GetNSeg() + 1); // segment id
+             ngMesh.AddSegment (seg);
+ #ifdef DUMP_SEGMENTS
+-            cout << "Segment: " << seg.edgenr << std::endl
++            cout << "Segment: " << seg.GetHpElnr() << std::endl
+                  << "\t is SEAM (reverse) of the previous. "
+                  << " Other " << (helper.GetPeriodicIndex() & 1 ? "U" : "V")
+                  << " = " << otherSeamParam << std::endl;
+@@ -973,11 +973,11 @@ bool NETGENPlugin_Mesher::FillNgMesh(net
+           else if ( fOri == TopAbs_INTERNAL )
+           {
+             swap (seg[0], seg[1]);
+-            swap( seg.epgeominfo[0], seg.epgeominfo[1] );
+-            seg.edgenr = ngMesh.GetNSeg() + 1; // segment id
++            swap( seg.EPGeomInfo(0), seg.EPGeomInfo(1) );
++            seg.SetHpElnr(ngMesh.GetNSeg() + 1); // segment id
+             ngMesh.AddSegment (seg);
+ #ifdef DUMP_SEGMENTS
+-            cout << "Segment: " << seg.edgenr << std::endl << "\t is REVERSE of the previous" << std::endl;
++            cout << "Segment: " << seg.GetHpElnr() << std::endl << "\t is REVERSE of the previous" << std::endl;
+ #endif
+           }
+         }
+@@ -1254,7 +1254,7 @@ bool NETGENPlugin_Mesher::FixFaceMesh(co
+   for ( int iSeg = 1; iSeg <= ngMesh.GetNSeg(); ++iSeg )
+   {
+     const netgen::Segment& seg = ngMesh.LineSegment( iSeg );
+-    if ( seg.si != faceID ) // !edgeIDs.Contains( seg.edgenr ))
++    if ( seg.GetIndex() != faceID ) // !edgeIDs.Contains( seg.GetHpElnr() ))
+       continue;
+     Link link( seg[1], seg[0] ); // reverse!!!
+     if ( !linkMap.Add( link ))
+@@ -1459,11 +1459,11 @@ void NETGENPlugin_Mesher::AddIntVertices
+       for (i = 1; i <= ngMesh.GetNSeg(); ++i)
+       {
+         netgen::Segment & seg = ngMesh.LineSegment(i);
+-        if ( seg.si != faceNgID ) continue;
++        if ( seg.GetIndex() != faceNgID ) continue;
+         gp_XY uv[2];
+         for ( int iEnd = 0; iEnd < 2; ++iEnd)
+         {
+-          uv[iEnd].SetCoord( seg.epgeominfo[iEnd].u, seg.epgeominfo[iEnd].v );
++          uv[iEnd].SetCoord( seg.GeomInfo(iEnd).u, seg.GeomInfo(iEnd).v );
+           if ( ngIdLast == seg[ iEnd ] ) continue;
+           dist2 = helper.ApplyIn2D(surf, uv[iEnd], vData.uv, gp_XY_Subtracted,0).SquareModulus();
+           if ( dist2 < closeDist2 )
+@@ -1494,11 +1494,11 @@ void NETGENPlugin_Mesher::AddIntVertices
+       for (i = nbSegInit+1; i <= ngMesh.GetNSeg(); ++i)
+       {
+         netgen::Segment & seg = ngMesh.LineSegment(i);
+-        if ( seg.si != faceNgID ) continue;
++        if ( seg.GetIndex() != faceNgID ) continue;
+         gp_XY uv[2];
+         for ( int iEnd = 0; iEnd < 2; ++iEnd)
+         {
+-          uv[iEnd].SetCoord( seg.epgeominfo[iEnd].u, seg.epgeominfo[iEnd].v );
++          uv[iEnd].SetCoord( seg.GeomInfo(iEnd).u, seg.GeomInfo(iEnd).v );
+           dist2 = helper.ApplyIn2D(surf, uv[iEnd], vData.uv, gp_XY_Subtracted,0).SquareModulus();
+           if ( dist2 < closeDist2 )
+             vData.ngIdClose = seg[ iEnd ], vData.uvClose = uv[iEnd], closeDist2 = dist2;
+@@ -1542,25 +1542,25 @@ void NETGENPlugin_Mesher::AddIntVertices
+       if ( segEnd1 > segEnd2 ) swap( segEnd1, segEnd2 ), swap( uvV, uvP );
+       seg[0] = segEnd1;  // ng node id
+       seg[1] = segEnd2;  // ng node id
+-      seg.edgenr = ngMesh.GetNSeg() + 1;// segment id
+-      seg.si = faceNgID;
++      seg.SetHpElnr(ngMesh.GetNSeg() + 1);// segment id
++      seg.SetIndex(faceNgID);
+ 
+-      seg.epgeominfo[ 0 ].dist = 0; // param on curve
+-      seg.epgeominfo[ 0 ].u    = uvV.X();
+-      seg.epgeominfo[ 0 ].v    = uvV.Y();
+-      seg.epgeominfo[ 1 ].dist = 1; // param on curve
+-      seg.epgeominfo[ 1 ].u    = uvP.X();
+-      seg.epgeominfo[ 1 ].v    = uvP.Y();
++      seg.EPGeomInfo(0).dist = 0; // param on curve
++      seg.GeomInfo(0).u    = uvV.X();
++      seg.GeomInfo(0).v    = uvV.Y();
++      seg.EPGeomInfo(1).dist = 1; // param on curve
++      seg.GeomInfo(1).u    = uvP.X();
++      seg.GeomInfo(1).v    = uvP.Y();
+ 
+-//       seg.epgeominfo[ 0 ].edgenr = 10; //  = geom.emap.FindIndex(edge);
+-//       seg.epgeominfo[ 1 ].edgenr = 10; //  = geom.emap.FindIndex(edge);
++//       seg.GeomInfo(0).trignum = 10; //  = geom.emap.FindIndex(edge);
++//       seg.GeomInfo(1).trignum = 10; //  = geom.emap.FindIndex(edge);
+ 
+       ngMesh.AddSegment (seg);
+ 
+       // add reverse segment
+       swap (seg[0], seg[1]);
+-      swap( seg.epgeominfo[0], seg.epgeominfo[1] );
+-      seg.edgenr = ngMesh.GetNSeg() + 1; // segment id
++      swap( seg.EPGeomInfo(0), seg.EPGeomInfo(1) );
++      seg.SetHpElnr(ngMesh.GetNSeg() + 1); // segment id
+       ngMesh.AddSegment (seg);
+     }
+ 
+@@ -1930,16 +1930,16 @@ NETGENPlugin_Mesher::AddSegmentsToMesh(n
+ 
+       seg[0]     = ngID1;                // ng node id
+       seg[1]     = ngID2;                // ng node id
+-      seg.edgenr = ngMesh.GetNSeg() + 1; // ng segment id
+-      seg.si     = faceID;               // = geom.fmap.FindIndex (face);
++      seg.SetHpElnr(ngMesh.GetNSeg() + 1); // ng segment id
++      seg.SetIndex(faceID);              // = geom.fmap.FindIndex (face);
+ 
+       for ( int iEnd = 0; iEnd < 2; ++iEnd)
+       {
+         const UVPtStruct& pnt = uvPtVec[ i + iEnd ];
+ 
+-        seg.epgeominfo[ iEnd ].dist = pnt.param; // param on curve
+-        seg.epgeominfo[ iEnd ].u    = pnt.u;
+-        seg.epgeominfo[ iEnd ].v    = pnt.v;
++        seg.EPGeomInfo(iEnd).dist = pnt.param; // param on curve
++        seg.GeomInfo(iEnd).u    = pnt.u;
++        seg.GeomInfo(iEnd).v    = pnt.v;
+ 
+         // find out edge id and node parameter on edge
+         onVertex = ( pnt.normParam + 1e-10 > vertexNormPar );
+@@ -1956,9 +1956,9 @@ NETGENPlugin_Mesher::AddSegmentsToMesh(n
+           posID  = posShapeID;
+           isInternalWire = ( edge.Orientation() == TopAbs_INTERNAL );
+           // if ( onVertex ) // param on curve is different on each of two edges
+-          //   seg.epgeominfo[ iEnd ].dist = helper.GetNodeU( edge, pnt.node );
++          //   seg.EPGeomInfo(iEnd).dist = helper.GetNodeU( edge, pnt.node );
+         }
+-        seg.epgeominfo[ iEnd ].edgenr = edgeID; //  = geom.emap.FindIndex(edge);
++        seg.GeomInfo(iEnd).trignum = edgeID; //  = geom.emap.FindIndex(edge);
+       }
+ 
+       ngMesh.AddSegment (seg);
+@@ -1979,8 +1979,8 @@ NETGENPlugin_Mesher::AddSegmentsToMesh(n
+       if ( isInternalWire )
+       {
+         swap (seg[0], seg[1]);
+-        swap( seg.epgeominfo[0], seg.epgeominfo[1] );
+-        seg.edgenr = ngMesh.GetNSeg() + 1; // segment id
++        swap( seg.EPGeomInfo(0), seg.EPGeomInfo(1) );
++        seg.SetHpElnr(ngMesh.GetNSeg() + 1); // segment id
+         ngMesh.AddSegment (seg);
+       }
+     } // loop on segments on a wire
+@@ -2013,19 +2013,19 @@ NETGENPlugin_Mesher::AddSegmentsToMesh(n
+         netgen::Segment& prevSeg = ngMesh.LineSegment( i-1 );
+         if ( seg[0] == prevSeg[1] && seg[1] == prevSeg[0] )
+         {
+-          cout << "Segment: " << seg.edgenr << std::endl << "\tis REVERSE of the previous one" << std::endl;
++          cout << "Segment: " << seg.GetHpElnr() << std::endl << "\tis REVERSE of the previous one" << std::endl;
+           continue;
+         }
+       }
+-      cout << "Segment: " << seg.edgenr << std::endl
++      cout << "Segment: " << seg.GetHpElnr() << std::endl
+            << "\tp1: " << seg[0] << "   n" << nodeVec[ seg[0]]->GetID() << std::endl
+            << "\tp2: " << seg[1] << "   n" << nodeVec[ seg[1]]->GetID() <<  std::endl
+-           << "\tp0 param: " << seg.epgeominfo[ 0 ].dist << std::endl
+-           << "\tp0 uv: " << seg.epgeominfo[ 0 ].u <<", "<< seg.epgeominfo[ 0 ].v << std::endl
+-           << "\tp0 edge: " << seg.epgeominfo[ 0 ].edgenr << std::endl
+-           << "\tp1 param: " << seg.epgeominfo[ 1 ].dist << std::endl
+-           << "\tp1 uv: " << seg.epgeominfo[ 1 ].u <<", "<< seg.epgeominfo[ 1 ].v << std::endl
+-           << "\tp1 edge: " << seg.epgeominfo[ 1 ].edgenr << std::endl;
++           << "\tp0 param: " << seg.EPGeomInfo(0).dist << std::endl
++           << "\tp0 uv: " << seg.GeomInfo(0).u <<", "<< seg.GeomInfo(0).v << std::endl
++           << "\tp0 edge: " << seg.GeomInfo(0).trignum << std::endl
++           << "\tp1 param: " << seg.EPGeomInfo(1).dist << std::endl
++           << "\tp1 uv: " << seg.GeomInfo(1).u <<", "<< seg.GeomInfo(1).v << std::endl
++           << "\tp1 edge: " << seg.GeomInfo(1).trignum << std::endl;
+     }
+     cout << "--END WIRE " << iW << std::endl;
+ #endif
+@@ -2124,7 +2124,7 @@ int NETGENPlugin_Mesher::FillSMesh(const
+   {
+     const netgen::Segment& seg = ngMesh.LineSegment(i);
+     TopoDS_Edge aEdge;
+-    int pinds[3] = { seg.pnums[0], seg.pnums[1], seg.pnums[2] };
++    int pinds[3] = { seg[0], seg[1], seg[2] };
+     int nbp = 0;
+     double param2 = 0;
+     for (int j=0; j < 3; ++j)
+@@ -2138,11 +2138,11 @@ int NETGENPlugin_Mesher::FillSMesh(const
+       {
+         if (aEdge.IsNull())
+         {
+-          int aGeomEdgeInd = seg.epgeominfo[j].edgenr;
++          int aGeomEdgeInd = seg.GeomInfo(j).trignum;
+           if (aGeomEdgeInd > 0 && aGeomEdgeInd <= occgeo.emap.Extent())
+             aEdge = TopoDS::Edge(occgeo.emap(aGeomEdgeInd));
+         }
+-        param = seg.epgeominfo[j].dist;
++        param = seg.EPGeomInfo(j).dist;
+         param2 += param;
+       }
+       else // middle point
+@@ -2848,8 +2848,8 @@ bool NETGENPlugin_Mesher::Compute()
+           for (int i = 1; i <= _ngMesh->GetNSeg(); i++)
+           {
+             netgen::Segment & seg = _ngMesh->LineSegment(i);
+-            if (seg.si == faceID)
+-              seg.si = 0;
++            if (seg.GetIndex() == faceID)
++              seg.SetIndex(0);
+           }
+           // add new segments to _ngMesh instead of excluded ones
+           helper.SetSubShape( F );
+@@ -3069,7 +3069,7 @@ bool NETGENPlugin_Mesher::Compute()
+           for (int i = 1; i <= _ngMesh->GetNSeg(); ++i)
+           {
+             const netgen::Segment & seg = _ngMesh->LineSegment (i);
+-            if ( seg.epgeominfo[ 0 ].edgenr == 0 )
++            if ( seg.GeomInfo(0).trignum == 0 )
+               _ngMesh->DeleteSegment( i );
+           }
+           _ngMesh->Compress();
+@@ -3358,7 +3358,7 @@ bool NETGENPlugin_Mesher::Evaluate(MapSh
+     const netgen::Segment& seg = ngMesh->LineSegment(i);
+     Link link(seg[0], seg[1]);
+     if ( !linkMap.Add( link )) continue;
+-    int aGeomEdgeInd = seg.epgeominfo[0].edgenr;
++    int aGeomEdgeInd = seg.GeomInfo(0).trignum;
+     if (aGeomEdgeInd > 0 && aGeomEdgeInd <= occgeo.emap.Extent())
+     {
+       vector<int>& aVec = aResMap[_mesh->GetSubMesh(occgeo.emap(aGeomEdgeInd))];
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/packages/FreeCAD.git/commitdiff/c9ccf2e433d1a61671f66ee35f8cf4db30c059d7



More information about the pld-cvs-commit mailing list